如何在C#中从Windows服务获取当前登录用户和计算机名称?

4

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


1
这是由SYSTEM用户运行您的服务,这就是为什么您会得到NT AUTHORITY\SYSTEM。要获取机器名称,您可以使用System.Security.Principal.WindowsIdentity.GetCurrent().Name或Environment.MachineName。 - Retired_User
可能是重复的问题:如何从Windows服务中获取已登录用户的用户名 - slugster
顺便提一下,如果您需要检查当前登录系统的所有其他用户,请查看此论坛:http://www.eggheadcafe.com/software/aspnet/31897783/there-can-be-0-or-more-current-logged-in-users.aspx - Retired_User
3个回答

2
该服务在SYSTEM帐户下执行,因此您在Environment类中看到的内容不应该是问题(请参见Gmoliv的评论)。服务独立于任何已登录的用户执行:这是拥有它们的主要原因之一。
如果您想查找可能登录到计算机的用户(是的,可能不止一个),则必须使用原始的Windows API。如果您真的想这样做,一种方法是遍历桌面打开指定的桌面,获取每个桌面的用户,并查找用户的帐户名(返回本地计算机上的帐户名)。如果您只想要能够看到屏幕内容的用户,请使用OpenInputDesktop获取句柄,而不是遍历所有桌面。
请注意,这需要您的服务具有比通常更高的访问权限。我自己会对这样的服务有些怀疑。

1

最简单的方法(至少,使用 Visual Studio 2017 Community Edition.Net Framework 4.7)--

命名空间:System.Security.Principal

代码:

Console.WriteLine(WindowsIdentity.GetCurrent().Name);

上述内容将给你带来:
COMPUTERNAME\username 更新
另一种方法是使用Environment,例如-
Console.WriteLine(Environment.UserName);
这将产生已登录用户的用户名

Console.WriteLine(Environment.MachineName);
这将产生计算机或机器的名称

1
尝试这段代码片段。
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());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接