近期做一个项目,需要获取电脑当前的登录用户,网上查找资料,发现可以直接使用以下两种方式:
- System.Environment.UserName(),
- WindowsIdentity.GetCurrent().Name
实际使用后发现这两种方法都无法或者到当前登录的用户名,因为我的软件是运行在网络service上的,这种情况下拿到的值如下:
- WindowsIdentity.GetCurrent().Name: NT AUTHORITY\NETWORK SERVICE
- System.Environment.UserName: MS12520(电脑的名字)
继续查找相关资料,后来发现,有前辈用用查询任务管理器里面explorer.exe的方式来获取用户户名:
string username = string.Empty;
var query = new ObjectQuery("SELECT * FROM Win32_Process WHERE Name = 'explorer.exe'");
var explorerProcesses = new ManagementObjectSearcher(query).Get();
foreach (ManagementObject mo in explorerProcesses)
{
string[] ownerInfo = new string[2];
mo.InvokeMethod("GetOwner", ownerInfo);
username = string.Concat(ownerInfo[1], @"\", ownerInfo[0]);
}
但是这种方式有个问题,如果有用户远程连接到此电脑,将会有多个explorer.exe进程,这种方式只是按照顺序拿了第一个用户,并不是当前登录的用户。
继续查询,发现可以调用cmd.exe,使用 query user/quser 获取用户列表,获取到状态为active的用户。