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

时间:2010-06-29 13:50:53

标签: c# windows-services username

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

6 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

试试这个:

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

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

答案 3 :(得分:0)

这个解决方案适用于我:

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

答案 4 :(得分: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;
  }

答案 5 :(得分:0)

您可以使用Windows注册表找到此内容,读取以下字符串值,将[SERVICE_NAME]替换为Windows服务的名称:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[SERVICE_NAME]\ObjectName