使用Windows服务获取计算机用户名的C#.NET方法

3

我在使用Windows服务时遇到了一个问题,无法获取正在登录该机器的用户名称。

当使用System.Environment.UserName或WindowsIdentity.GetCurrent().UserName时,我得到的是NTAUTHORITY\SYSTEM,但是当这个应用程序被推送后,我需要能够映射到登录到系统中的人的UserID。将在此使用的操作系统为Windows XP。

非常感谢您的任何帮助。


2
你想要哪个用户?一台机器上可能有几个人登录会话(通过XP上的快速用户切换或服务器上的远程桌面)。每个会话可以在不同的登录下运行进程(通过“Run As”命令)。 - Tim Robinson
当前登录的用户。幸运的是,这些机器一次只能允许一个客户端登录。 - Andrew Sehr
Tim,你应该重新表述一下并将其发布为答案 - 我怀疑OP正在询问不可能的事情,而你的回答是他能得到的最好的答案! - Dan Puzey
@Andrew,了解你需要这些信息的原因会很有帮助。可能有另一种更合理的方法。 - Tim Robinson
一个服务中运行了什么,交互会话中又运行了什么? - Tim Robinson
显示剩余2条评论
3个回答

4

试试这个:

var connectionOptions = new ConnectionOptions();
var scope = new System.Management.ManagementScope("\\\\localhost", connectionOptions);
var query = new System.Management.ObjectQuery("select * from Win32_ComputerSystem");
var searcher = new ManagementObjectSearcher(scope, query);
foreach (var row in searcher.Get()) 
{
    Console.WriteLine(row["UserName"].ToString().ToLower());
}

1
+1 这段代码正是我想要的,只是我希望我不需要它。 - Jodrell
我也遇到了同样的问题,@jgauffin你的代码也适用于64位操作系统吗? - Wilz
@jgauffin 谢谢,还有一个问题,我们是否会在任何情况下获得多个用户名? - Wilz
不,你会得到所有进程及其正在运行的用户名。 - jgauffin
但是对于一些系统,我得到的是domain/domain/username而不是domain/username,我该怎么办? - Wilz
显示剩余3条评论

1

仅适用于XP,应该遵循以下建议:获取非交互式用户的窗口站点,每个进程、用户或会话?

  • 调用OpenWindowStation以获取对“winsta0”的句柄
  • 调用GetUserObjectInformation查找谁拥有winsta0

然而,当您将应用程序升级到Vista、Windows 7或更高版本时,此方法将失效,因为服务在与交互式登录不同的会话中运行。您需要调用终端服务API以获取已登录用户列表,并选择您的“交互式”用户。


-2

Windows服务始终在服务属性/登录选项卡中提供的凭据下运行。这与当前在其自己的会话中登录到Windows的人员的凭据无关。

NTAUTHORITY\SYSTEM的值是正确的,因为您的服务正在使用“本地系统帐户”凭据运行。

您不能在“当前登录的”用户帐户下运行Windows服务-这不是Windows服务的用途。


1
他正在询问如何从服务中获取已登录的用户名,而不是如何在“当前登录的”用户帐户下运行服务。 - iedoc

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