Windows services 如何从c#中的窗口服务中登录用户名和计算机名?

Windows services 如何从c#中的窗口服务中登录用户名和计算机名?,windows-services,wcf,Windows Services,Wcf,如何从c#中的窗口服务获取登录用户(交互式用户)和计算机名。当我尝试使用Environment和其他类登录用户名时,它只是从窗口服务返回NT AUTHORITY\SYSTEM。该服务在系统帐户下执行,因此您在环境中看到的是类。机器名不应该是问题(请参阅Gmoliv的评论)。服务独立于任何可能登录的人执行:这是拥有服务的主要原因之一 如果您想知道哪些用户(是的,可能不止一个)可能登录到您的计算机,您必须使用原始Windows API的AFAIK。如果您真的想这样做,一种方法是获取关联的and(它返

如何从c#中的窗口服务获取登录用户(交互式用户)和计算机名。当我尝试使用Environment和其他类登录用户名时,它只是从窗口服务返回NT AUTHORITY\SYSTEM。

该服务在系统帐户下执行,因此您在
环境中看到的是
类。机器名不应该是问题(请参阅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);