我在使用Windows服务时遇到了一个问题,无法获取正在登录该机器的用户名称。
当使用System.Environment.UserName或WindowsIdentity.GetCurrent().UserName时,我得到的是NTAUTHORITY\SYSTEM,但是当这个应用程序被推送后,我需要能够映射到登录到系统中的人的UserID。将在此使用的操作系统为Windows XP。
非常感谢您的任何帮助。
我在使用Windows服务时遇到了一个问题,无法获取正在登录该机器的用户名称。
当使用System.Environment.UserName或WindowsIdentity.GetCurrent().UserName时,我得到的是NTAUTHORITY\SYSTEM,但是当这个应用程序被推送后,我需要能够映射到登录到系统中的人的UserID。将在此使用的操作系统为Windows XP。
非常感谢您的任何帮助。
试试这个:
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());
}
仅适用于XP,应该遵循以下建议:获取非交互式用户的窗口站点,每个进程、用户或会话?
OpenWindowStation
以获取对“winsta0”的句柄GetUserObjectInformation
查找谁拥有winsta0然而,当您将应用程序升级到Vista、Windows 7或更高版本时,此方法将失效,因为服务在与交互式登录不同的会话中运行。您需要调用终端服务API以获取已登录用户列表,并选择您的“交互式”用户。
Windows服务始终在服务属性/登录选项卡中提供的凭据下运行。这与当前在其自己的会话中登录到Windows的人员的凭据无关。
NTAUTHORITY\SYSTEM的值是正确的,因为您的服务正在使用“本地系统帐户”凭据运行。
您不能在“当前登录的”用户帐户下运行Windows服务-这不是Windows服务的用途。