Windows services 如何从c#中的窗口服务中登录用户名和计算机名?
如何从c#中的窗口服务获取登录用户(交互式用户)和计算机名。当我尝试使用Environment和其他类登录用户名时,它只是从窗口服务返回NT AUTHORITY\SYSTEM。该服务在系统帐户下执行,因此您在Windows services 如何从c#中的窗口服务中登录用户名和计算机名?,windows-services,wcf,Windows Services,Wcf,如何从c#中的窗口服务获取登录用户(交互式用户)和计算机名。当我尝试使用Environment和其他类登录用户名时,它只是从窗口服务返回NT AUTHORITY\SYSTEM。该服务在系统帐户下执行,因此您在环境中看到的是类。机器名不应该是问题(请参阅Gmoliv的评论)。服务独立于任何可能登录的人执行:这是拥有服务的主要原因之一 如果您想知道哪些用户(是的,可能不止一个)可能登录到您的计算机,您必须使用原始Windows API的AFAIK。如果您真的想这样做,一种方法是获取关联的and(它返
环境中看到的是类。机器名不应该是问题(请参阅Gmoliv的评论)。服务独立于任何可能登录的人执行:这是拥有服务的主要原因之一
如果您想知道哪些用户(是的,可能不止一个)可能登录到您的计算机,您必须使用原始Windows API的AFAIK。如果您真的想这样做,一种方法是获取关联的and(它返回本地计算机上的帐户名)。如果您只想让用户在屏幕上看到一些东西,请使用获取句柄,而不是遍历所有句柄
请注意,这要求您的服务具有比通常更高的访问权限。我自己也会有点怀疑这种服务 试试这个代码片段
ManagementScope ms = new ManagementScope(@"\\.\root\cimv2");
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_ComputerSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(ms, query);
foreach(ManagementObject mo in searcher.Get())
{
Console.WriteLine(mo["UserName"].ToString());
}
最简单的方法(至少使用Visual Studio 2017社区版
和.Net Framework 4.7
)--
命名空间:System.Security.Principal
代码:
以上内容将为您提供:
COMPUTERNAME\username
更新
另一种方法是使用环境
,如中所示--
Console.WriteLine(Environment.UserName)代码>
这将产生登录用户的用户名
及
Console.WriteLine(Environment.MachineName)代码>
这将产生计算机或机器的名称
运行您的服务的是系统用户,这就是您获得NT AUTHORITY\SYSTEM的原因。要获取计算机名,您可以使用System.Security.Principal.WindowsIdentity.GetCurrent().name或Environment.MachineName中的任何一个。顺便说一句,如果您需要检查当前登录系统的所有其他用户,请签出此论坛:
Console.WriteLine(WindowsIdentity.GetCurrent().Name);