如何检索Windows服务正在运行的用户名?
给定服务名称,我想检索它运行的用户名(即服务属性窗口的“登录”选项卡中显示的用户名)。在ServiceController
类中似乎没有任何东西来检索这些基本信息。 System.ServiceProcess
中没有其他东西看起来像它公开这些信息。有没有一个管理的解决方案,或者我将不得不下降到更低层次?如何检索Windows服务正在运行的用户名?
使用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();
}
}
}
您可以日后再使用你的服务名称来替代注释代码,它应该只返回你的服务过程的情况下,正在运行。
试试这个:
System.Security.Principal.WindowsIdentity.GetCurrent();
但最明显的你将得到本地系统或网络。您无法显示此用户的原因 - 该服务可以管理多个用户(由桌面共享,连接到当前的Windows会话,使用共享资源...) 系统启动服务,但任何用户都可以使用它。
然后你可以从上面的命令返回WindowsIdentity对象的名称属性。 – ewall 2010-06-29 14:26:15
-1这将返回当前用户的'WindowsIdentity',而不是指定的服务。 – Pwninstein 2010-06-29 14:31:50
@Pwninstein照常服务从SYSTEM或NETWORK凭证启动 - 而不是从“登录”用户启动。查看我对此的编辑。因此,澄清你想获得启动服务的系统帐户(我的回答对此是正确的)还是当前登录的用户列表,可以使用此服务? – Dewfy 2010-06-29 14:37:05
WMI是你的朋友。看看Win32_Service,特别是StartName
属性。您可以通过System.Management.ManagementClass从C#访问WMI。
如果您之前没有使用过WMI,this的文章似乎是一个相当不错的教程。
谢谢! 15chars – Pwninstein 2010-07-01 02:56:41
该解决方案为我工作得很好:
ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + this.ServiceName + "'");
wmiService.Get();
string user = wmiService["startname"].ToString();
添加一些解释和答案,这个答案如何帮助OP在修复当前问题 – 2016-01-14 10:46:36
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;
}
应该给你的代码一些上下文。 – Milo 2017-12-05 12:50:40
还没有尝试过,但这看起来像赢家!谢谢! – Pwninstein 2010-07-01 02:57:09