2017-10-05 5 views
1

En utilisant dessous requête WMI Je suis en mesure d'obtenir tous les noms de services,Comment obtenir tous les noms des services qui fonctionne sous processus « svchost.exe »

ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Service ") 

Aussi, quand je suis en dessous de commande dans l'invite de commande , il donnera tout l'identifiant du processus (PID) et nom du service,

tasklist /svc /fi "imagename eq svchost.exe" 

Je veux WMI/C# façon de trouver tous les services qui fonctionne sous processus « svchost.exe »?

Et existe-t-il un autre moyen que WMI?

+0

Je pense que vous êtes à la recherche d'une solution plutôt laide, fondamentalement, vous finirez par appeler DLL (non gérés) à l'aide Pinvoke. Je pense que la référence ABI que vous voulez est à https://msdn.microsoft.com/en-us/library/aa394418(v=vs.85).aspx. Il sera * probablement * moins de tracas pour appeler un script PowerShell ou quelque chose en arrière-plan. – BurnsBA

+1

Une meilleure question: que faites-vous avec cette information? En fonction de cela, il peut y avoir des moyens plus simples/meilleurs que d'obtenir ce que vous obtenez maintenant. –

Répondre

1

Vous pouvez lister tous les services en utilisant le même code que vous l'avez fait, puis passez simplement en revue et vérifiez si leur PathName est quelque chose comme "C:\WINDOWS\system32\svchost.exe ... ". Ce serait le moyen le plus facile.

Une autre option serait de réécrire votre requête dans quelque chose comme ceci:

string q = "select * from Win32_Service where PathName LIKE \"%svchost.exe%\""; 
ManagementObjectSearcher mos = new ManagementObjectSearcher(q); 
1

Je voudrais créer un fichier batch que je trigger avec C# et relevez la valeur de retour de la liste.

La solution pourrait ressembler à ceci:

myBatch.bat:

tasklist /svc /fi "IMAGENAME eq svchost.exe" 

programme C#:

Process p = new Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.FileName = "myBatch.bat"; 
p.Start(); 
string output = p.StandardOutput.ReadToEnd(); 
Console.Write(output); 
p.WaitForExit(); 
1

Que diriez-vous de la méthode de ServiceController.getServices?

Normalement, vous obtiendrez les processus via la méthode Process.GetProcesses. La documentation indique cependant:

Plusieurs services Windows peuvent être chargés dans la même instance du processus Service Host (svchost.exe). GetProcesses n'identifie pas ces services individuels; pour cela, voir GetServices.

Si vous avez besoin de plus d'informations sur les serices, vous devez vous appuyer sur le WMI, mais pas pour les itérer.

Je vous suggère de l'utiliser pour examiner les processus

foreach (ServiceController scTemp in scServices) 
{ 
    if (scTemp.Status == ServiceControllerStatus.Running) 
    { 
     Console.WriteLine(" Service :  {0}", scTemp.ServiceName); 
     Console.WriteLine(" Display name: {0}", scTemp.DisplayName); 

    // if needed: additional information about this service. 
    ManagementObject wmiService; 
    wmiService = new ManagementObject("Win32_Service.Name='" + 
    scTemp.ServiceName + "'"); 
    wmiService.Get(); 
    Console.WriteLine(" Start name:  {0}", wmiService["StartName"]); 
    Console.WriteLine(" Description:  {0}", wmiService["Description"]); 
    } 
} 

Source