2026-08-16

Bir süreci başlatan süreç ve hizmetler ilişkileri

Daha önce kısmen bu konuyla ilgilenmiştim ama yeterli olmamıştı.

Komut satırından bir süreci başlatan süreci bulmak istiyourm. Örneğin bir notepad süreci var. Bunu başlatan süreci Get-Process ile bulmak mümkün değil. Bir WMI/CIM sorgusu lazım. Bunu da hem PID, hem de süreç ismi ile çalışacak şekilde yapmam gerek. Ben şöyle bir parent.ps1 dosyası oluşturarak yaptım:

param(
    [Parameter(Position=0,Mandatory=$true,ParameterSetName="ProcessName")]
    [string]$ProcessName,
    [Parameter(Position=0,Mandatory=$true,ParameterSetName="ProcessId")]
    [int]$ProcessId
)

switch ($PSCmdlet.ParameterSetName) {
    "ProcessName" {
        Get-CimInstance Win32_Process |
            Where-Object Name -match ${ProcessName}  |
                Format-Table -Property ProcessId, ParentProcessId, Name, CommandLine -AutoSize -Wrap
    }
    "ProcessId" {
        Get-CimInstance Win32_Process -Filter "ProcessId='$ProcessId'"  |
            Format-Table -Property ProcessId, ParentProcessId, Name, CommandLine -AutoSize -Wrap
    }
}

bunuda

.\parent.ps1 -ProcessName notepad

şeklinde çalıştırınca şöyle bir çıktı verdi:

ProcessId ParentProcessId Name        CommandLine
--------- --------------- ----        -----------
    12216            3708 Notepad.exe "C:\Windows\System32\notepad.exe" 

Buradan 3708'i sorguladığımda bana svchost döndü.

ps -id 3708
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    450      21     7576      51272              3708   0 svchost 

Bu noktada da win32_service sınıfını sogrulamak gerek, 3708'in içinde hangi hizmetler çalışıyor diye:

param(
    [Parameter(Mandatory,ParameterSetName="SearchID")][int]$Id,
    [Parameter(Mandatory,ParameterSetName="SearchName")][string]$Name,
    [Parameter(Mandatory,ParameterSetName="SearchDisplayName")][string]$DisplayName
)

if ($PSCmdlet.ParameterSetName -eq "SearchID") {
    gcim win32_service | where {$_.ProcessId -eq $Id}
}
elseif ($PSCmdlet.ParameterSetName -eq "SearchName") {
    gcim win32_service | where {$_.Name -like "*${Name}*"}
}
elseif ($PSCmdlet.ParameterSetName -eq "SearchDisplayName") {
    gcim win32_service | where {$_.Name -like "*${DisplayName}*"}
}

Bunu da serv.ps1 diye kaydedip

.\serv1.ps1 -Id 3708

şeklinde çalıştırınca

ProcessId Name     StartMode State   Status ExitCode
--------- ----     --------- -----   ------ --------
3708      Schedule Auto      Running OK     0

Notepad'i çalıştıran hizmetin görev zamanlayıcısı olduğunu buldum. 

Hiç yorum yok: