2010-06-29 2 views
13

Bei einem Dienstnamen möchte ich den Benutzernamen abrufen, unter dem er ausgeführt wird (d. H. Der Benutzername, der auf der Registerkarte "Anmelden" im Eigenschaftenfenster eines Dienstes angezeigt wird). Es scheint nichts in der Klasse ServiceController zu sein, um diese grundlegenden Informationen abzurufen. Nichts anderes in System.ServiceProcess sieht so aus, als würde es diese Information auch bloßstellen. Gibt es dafür eine verwaltete Lösung, oder muss ich mich in eine niedrigere Ebene begeben?Wie kann ich den Benutzernamen abrufen, unter dem ein Windows-Dienst ausgeführt wird?

Antwort

20

WMI verwenden, mit dem System.Management Sie den folgenden Code versuchen:

using System; 
namespace WindowsServiceTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      System.Management.SelectQuery sQuery = new System.Management.SelectQuery(string.Format("select name, startname from Win32_Service")); // where name = '{0}'", "MCShield.exe")); 
      using (System.Management.ManagementObjectSearcher mgmtSearcher = new System.Management.ManagementObjectSearcher(sQuery)) 
      { 
       foreach (System.Management.ManagementObject service in mgmtSearcher.Get()) 
       { 
        string servicelogondetails = 
         string.Format("Name: {0} , Logon : {1} ", service["Name"].ToString(), service["startname"]).ToString(); 
        Console.WriteLine(servicelogondetails); 
       } 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

Sie können dann später ersetzen Sie den kommentierten Code mit Ihrem Service-Namen, und es sollte nur die Instanzen des Service-Prozess zurückkehren das läuft.

+0

Habe es noch nicht probiert, aber das sieht nach einem Gewinner aus! Vielen Dank! – Pwninstein

2

Versuchen Sie folgendes:

System.Security.Principal.WindowsIdentity.GetCurrent(); 

aber die naheliegendste werden Sie lokale System oder Netzwerk. Der Grund, warum Sie diesen Benutzer nicht anzeigen können - dieser Dienst kann mehrere Benutzer verwalten (vom Desktop freigegeben, an die aktuelle Windows-Sitzung angehängt, mit freigegebener Ressource ...) Das System startet den Dienst, aber jeder Benutzer kann ihn verwenden.

+0

Dann Sie die Eigenschaft Name des Windows Objekt erhalten aus dem obigen Befehl zurückgegeben. – ewall

+3

-1 Dies gibt die 'WindowsIdentity' des aktuellen Benutzers zurück, nicht eines angegebenen Dienstes. – Pwninstein

+0

@Pwninstein wie üblich Dienst wird von SYSTEM oder NETWORK Anmeldeinformationen gestartet - nicht von "angemeldeten" Benutzern. Siehe meine Änderungen dazu. Also klar, Sie wollen System-Account bekommen, der Dienst startet (meine Antwort ist korrekt darüber) oder aktuelle angemeldete Benutzerliste, die diesen Service nutzen könnte? – Dewfy

6

WMI ist dein Freund. Schauen Sie sich Win32_Service, speziell die StartName Eigenschaft. Sie können auf WMI von C# aus über die System.Management.ManagementClass zugreifen.

Wenn Sie WMI nicht zuvor verwendet haben, this Artikel scheint ein ziemlich gutes Tutorial zu sein.

+0

Danke! 15chars – Pwninstein

0

Diese Lösung funktioniert gut für mich:

ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + this.ServiceName + "'"); 
    wmiService.Get(); 
    string user = wmiService["startname"].ToString(); 
+0

Fügen Sie einige Erklärung mit der Antwort für diese Antwort Hilfe OP bei der aktuellen Problem beheben –

0
public String getUsername() { 
    string username = null; 
    try { 
     ManagementScope ms = new ManagementScope("\\\\.\\root\\cimv2"); 
     ms.Connect(); 
     ObjectQuery query = new ObjectQuery 
       ("SELECT * FROM Win32_ComputerSystem"); 
     ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher(ms, query); 
     foreach (ManagementObject mo in searcher.Get()) { 
     username = mo["UserName"].ToString(); 
     } 
     string[] usernameParts = username.Split('\\'); 
     username = usernameParts[usernameParts.Length - 1]; 
    } catch (Exception) { 
     username = "SYSTEM"; 
    } 
    return username; 
    } 
+1

Sollte geben Sie einen Kontext zu Ihrem Code. – Milo

Verwandte Themen