如何检索运行Windows服务的用户名?

给定一个服务名称,我想检索它运行的用户名(即服务属性窗口的“登录”选项卡中显示的用户名)。 ServiceController类中似乎没有任何内容可以检索此基本信息。 System.ServiceProcess任何其他内容看起来都不会公开此信息。 有没有一个托管解决方案,或者我将不得不下降到更低级别的东西?

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

然后,您可以使用您的服务名称替换已注释的代码,它应该只返回正在运行的服务进程的实例。

WMI是你的朋友。 查看Win32_Service ,特别是StartName属性。 您可以通过System.Management.ManagementClass从C#访问WMI。

如果您之前没有使用过WMI,那么本文似乎是一个非常好的教程。

试试这个:

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

但最明显的是你会获得LOCAL SYSTEM或NETWORK。 您无法显示此用户的原因 – 该服务可以管理多个用户(由桌面共享,附加到当前Windows会话,使用共享资源…)系统启动服务,但任何用户都可以使用它。

这个解决方案适合我:

  ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + this.ServiceName + "'"); wmiService.Get(); string user = wmiService["startname"].ToString(); 
  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; }