首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从.NET中的Windows服务获取当前登录的用户名?

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

Stack Overflow用户
提问于 2011-03-07 18:54:01
回答 8查看 145.4K关注 0票数 61

我有一个需要当前登录用户名的Windows服务。我尝试了System.Environment.UserName、Windows identity和Windows form身份验证,但都以用户身份返回" system “,因为我的服务是在系统特权下运行的。有没有办法在不更改我的服务帐户类型的情况下获得当前登录的用户名?

EN

回答 8

Stack Overflow用户

发布于 2011-08-25 15:44:21

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

代码语言:javascript
复制
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
ManagementObjectCollection collection = searcher.Get();
string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];

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

票数 88
EN

Stack Overflow用户

发布于 2013-10-22 00:47:13

如果您在用户网络中,则用户名将不同:

代码语言:javascript
复制
Environment.UserName

将显示格式:'Username',而不是

代码语言:javascript
复制
System.Security.Principal.WindowsIdentity.GetCurrent().Name

将显示格式:'NetworkName\Username‘

选择所需的格式。

票数 34
EN

Stack Overflow用户

发布于 2013-06-12 15:58:08

ManagementObjectSearcher(“从Win32_ComputerSystem选择UserName”)解决方案对我来说工作得很好。但如果服务是通过远程桌面连接启动的,则不起作用。要解决此问题,我们可以询问始终在PC上运行的交互进程的所有者的用户名: explorer.exe。这样,我们始终可以从Windows服务中获得当前Windows登录的用户名:

代码语言:javascript
复制
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;
    }
}
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5218778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档