如何从.NET中的Windows服务获取当前logging的用户名?

我有一个Windows服务需要当前login的用户名。 我尝试了System.Environment.UserName ,Windows身份validation和Windows窗体身份validation,但所有正在返回“ 系统 ”作为我的服务在系统特权中运行的用户。 有没有办法获得当前login的用户名而不改变我的服务帐户types?

这是一个WMI查询来获取用户名称:

 ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem"); ManagementObjectCollection collection = searcher.Get(); string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"]; 

您将需要在手动引用下添加System.Management

如果你在一个用户的networking,那么用户名将是不同的:

 Environment.UserName 

– 将显示格式:“用户名”,而不是

 System.Security.Principal.WindowsIdentity.GetCurrent().Name 

– 将显示格式:'networking名称\用户名'select你想要的格式。

ManagementObjectSearcher(“select用户名从Win32_ComputerSystem”)解决scheme为我工作得很好。 但是,如果通过远程桌面连接启动服务,则不起作用。 要解决这个问题,我们可以要求一个总是在PC上运行的交互式进程的所有者的用户名:explorer.exe。 这样,我们总是从我们的Windows服务中获取当前的Windowslogin用户名:

 foreach (System.Management.ManagementObject Process in Processes.Get()) { if (Process["ExecutablePath"] != null && System.IO.Path.GetFileName(Process["ExecutablePath"].ToString()).ToLower() == "explorer.exe" ) { string[] OwnerInfo = new string[2]; Process.InvokeMethod("GetOwner", (object[])OwnerInfo); Console.WriteLine(string.Format("Windows Logged-in Interactive UserName={0}", OwnerInfo[0])); break; } } 

修改了Tapas的答案 :

 Dim searcher As New ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem") Dim collection As ManagementObjectCollection = searcher.[Get]() Dim username As String For Each oReturn As ManagementObject In collection username = oReturn("UserName") Next 

尝试WindowsIdentity.GetCurrent() 。 您需要添加对System.Security.Principal引用

您也可以尝试System.Environment.GetEnvironmentVariable(“UserName”)

我用一个WMI查询来获得这个(另请参阅塔帕斯的答案 )。 其他一切都返回服务的用户名。