我有一个问题,就是......我用右键单击启动程序 - >以管理员身份运行。 这意味着程序正在管理环境中运行。
WindowsIdentity.GetCurrent().Name;
如果我试图以这种方式获取用户名,我将获得以管理员身份启动程序的用户...例如“administrator”,但我需要的是当前登录用户的名称,例如:鲍勃
有人可以帮帮我吗? :)
答案 0 :(得分:5)
您可以尝试使用WMI(System.Management.dll)来获取explorer.exe
进程的所有者。
string GetExplorerUser()
{
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", (object[])ownerInfo);
return String.Concat(ownerInfo[1], @"\", ownerInfo[0]);
}
return string.Empty;
}
这依赖于资源管理器进程是单个实例的事实,因此您最终无法使用不同的用户凭据运行多个资源管理器进程。
答案 1 :(得分:0)
您可能需要使用win32 API。在此处阅读有关Window Station和桌面功能的信息:http://msdn.microsoft.com/en-us/library/ms687107%28v=vs.85%29.aspx
另见这个问题: Get the logged in Windows user name associated with a desktop
答案 2 :(得分:0)
也许您可以以普通用户身份启动,保存用户名,然后以编程方式请求提升:
Windows 7 and Vista UAC - Programmatically requesting elevation in C#
答案 3 :(得分:0)
所有.NET库都会从当前上下文中为您提供用户(在您的情况下为“Administrator”)。
如果您尝试保护代码,可以考虑阅读:Security in the .NET framework
答案 4 :(得分:0)
1)Cassia应该能够为您提供当前登录用户的列表,包括RDC。
foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions())
{
// sess.SessionId
// sess.UserName
}
2)WMI(SO answer)
Select * from Win32_LogonSession
3)PInvoke to WTSEnumerateSessions
4)枚举“explorer.exe”的所有实例,并使用PInvoke(OpenProcessHandle)获取所有者。
Process[] processes = Process.GetProcessesByName("explorer");
这有点黑客。 WMI也可用于此目的。
如果您决定使用使用WMI的解决方案,那么将winmgmt设置为服务的依赖项可能是个好主意。