2010-06-29 28 views
13

給定服務名稱,我想檢索它運行的用戶名(即服務屬性窗口的「登錄」選項卡中顯示的用戶名)。在ServiceController類中似乎沒有任何東西來檢索這些基本信息。 System.ServiceProcess中沒有其他東西看起來像它公開這些信息。有沒有一個管理的解決方案,或者我將不得不下降到更低層次?如何檢索Windows服務正在運行的用戶名?

回答

20

使用WMI,與System.Management你可以試試下面的代碼:

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(); 
     } 
    } 
} 

您可以日後再使用你的服務名稱來替代註釋代碼,它應該只返回你的服務過程的情況下,正在運行。

+0

還沒有嘗試過,但這看起來像贏家!謝謝! – Pwninstein 2010-07-01 02:57:09

2

試試這個:

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

但最明顯的你將得到本地系統或網絡。您無法顯示此用戶的原因 - 該服務可以管理多個用戶(由桌面共享,連接到當前的Windows會話,使用共享資源...) 系統啓動服務,但任何用戶都可以使用它。

+0

然後你可以從上面的命令返回WindowsIdentity對象的名稱屬性。 – ewall 2010-06-29 14:26:15

+3

-1這將返回當前用戶的'WindowsIdentity',而不是指定的服務。 – Pwninstein 2010-06-29 14:31:50

+0

@Pwninstein照常服務從SYSTEM或NETWORK憑證啓動 - 而不是從「登錄」用戶啓動。查看我對此的編輯。因此,澄清你想獲得啓動服務的系統帳戶(我的回答對此是正確的)還是當前登錄的用戶列表,可以使用此服務? – Dewfy 2010-06-29 14:37:05

0

該解決方案爲我工作得很好:

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

添加一些解釋和答案,這個答案如何幫助OP在修復當前問題 – 2016-01-14 10:46:36

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

應該給你的代碼一些上下文。 – Milo 2017-12-05 12:50:40

相關問題