2009-05-15 2 views
1

Wenn ich mit der rechten Maustaste klicke und im Dialogfeld Dienste Eigenschaften für einen Dienst auswähle (z. B. Plug & Play), erhalte ich mehrere Informationen, einschließlich "Pfad zu ausführbar". Für Plug and Play (in Vista) ist dies:Position eines Windows-Dienstes * nicht * in meinem Projekt

C: \ Windows \ system32 \ svchost.exe -k DCOMLAUNCH

Gibt es irgendeine Weise, die ich das gleiche Stück von Informationen bekommen kann .NET-Code, wenn ich mit kennen Sie den Servicenamen (und/oder den Anzeigenamen)?

(I nicht GetExecutingAssembly() verwenden kann, weil ich nicht den Dienst von meinem Projekt laufen bin.)

Antwort

1

Diese Information ist in QUERY_SERVICE_CONFIG Struktur ist. Sie müssen P/Invoke verwenden, um es zu erhalten.

Der grundlegende Prozess ist:

Anruf OpenSCManager einen Griff auf die Dienste verwaltet zu bekommen.

Rufen Sie OpenService auf, um ein Handle für den Dienst zu erhalten.

Rufen Sie QueryServiceConfig auf, um die Struktur QUERY_SERVICE_CONFIG abzurufen.

3

Eine andere Option, ohne Interop, wäre ein WMI-Lookup (oder Registry - Bit-Hacky!).

Hier ist ein kurzes Beispiel, basierend auf this code:

private static string GetServiceImagePathWMI(string serviceDisplayName) 
{ 
    string query = string.Format("SELECT PathName FROM Win32_Service WHERE DisplayName = '{0}'", serviceDisplayName); 
    using (ManagementObjectSearcher search = new ManagementObjectSearcher(query)) 
    { 
     foreach(ManagementObject service in search.Get()) 
     { 
      return service["PathName"].ToString(); 
     } 
    } 
    return string.Empty; 
} 
1

Es gibt immer die WMI-Klasse Win32_Service als here beschrieben, insbesondere die PathName.

Dies funktioniert:

ManagementClass mc = new ManagementClass("Win32_Service"); 
foreach(ManagementObject mo in mc.GetInstances()) 
{ 
    if(mo.GetPropertyValue("Name").ToString() == "<Short name of your service>") 
    { 
     return mo.GetPropertyValue("PathName").ToString().Trim('"'); 
    } 
} 

Wenn Sie ein Problem haben Referenz im Zusammenhang dann eine Referenz von System.Management in Ihrem Projekt hinzufügen.

Verwandte Themen