给定服务名称,我想要获取运行该服务的用户名(即服务属性窗口的“登录”选项卡中显示的用户名)。
ServiceController
类似乎没有检索此基本信息的任何内容。在System.ServiceProcess
中也没有其他看起来公开此信息的东西。
是否有托管解决方案可用,或者我需要降至更低级别的东西?
给定服务名称,我想要获取运行该服务的用户名(即服务属性窗口的“登录”选项卡中显示的用户名)。
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,this文章似乎是一个很好的教程。
您可以通过查找Windows注册表并读取以下字符串值来找到这个,将[SERVICE_NAME]
替换为Windows服务的名称:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[SERVICE_NAME]\ObjectName
ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + this.ServiceName + "'");
wmiService.Get();
string user = wmiService["startname"].ToString();
试试这个:
System.Security.Principal.WindowsIdentity.GetCurrent();
但最明显的是你会得到LOCAL SYSTEM或NETWORK。之所以不能显示此用户 - 是因为服务可以管理多个用户(共享桌面,附加到当前Windows会话,使用共享资源…)系统启动服务,但任何用户都可以使用它。
WindowsIdentity
,而不是指定服务的身份。 - Mark CarpenterGetCurrent()
将无法工作,因为根据MSDN,它“返回表示当前Windows用户的WindowsIdentity对象。”在这种情况下,它将是运行CLIENT应用程序的当前Windows用户的WindowsIdentity,而不是SERVICE的WindowsIdentity。 - Mark Carpenter 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;
}