我有一个问题,那就是......我用右键单击启动一个程序 - >以管理员身份运行。这意味着程序正在管理上下文中运行。
WindowsIdentity.GetCurrent().Name;
如果我尝试以这种方式获取用户名,我将获得以管理员身份启动程序的用户。例如“管理员”,但我需要的是当前登录用户的名称,例如:bob
有人可以帮帮我吗?:)
我有一个问题,那就是......我用右键单击启动一个程序 - >以管理员身份运行。这意味着程序正在管理上下文中运行。
WindowsIdentity.GetCurrent().Name;
如果我尝试以这种方式获取用户名,我将获得以管理员身份启动程序的用户。例如“管理员”,但我需要的是当前登录用户的名称,例如:bob
有人可以帮帮我吗?:)
您可以尝试使用 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;
}
这依赖于资源管理器进程是单实例这一事实,因此您最终不会遇到使用不同用户凭据运行多个资源管理器进程的可能性。
您可能需要为此使用 win32 API。在此处阅读有关 Window Station 和 Desktop 功能的信息:http: //msdn.microsoft.com/en-us/library/ms687107%28v=vs.85%29.aspx
另请参阅此问题: 获取与桌面关联的登录 Windows 用户名
也许您可以以普通用户身份开始,保存用户名,然后以编程方式请求提升:
所有 .NET 库都会为您提供当前上下文中的用户(在您的情况下为“管理员”)。
如果您正在尝试保护您的代码,您可以考虑阅读以下内容:.NET 框架中的安全性
1) Cassia应该能够为您提供当前登录用户的列表,包括 RDC。
foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions())
{
// sess.SessionId
// sess.UserName
}
2)WMI(所以回答)
Select * from Win32_LogonSession
3) PInvoke 到WTSEnumerateSessions
4) 枚举“explorer.exe”的所有实例并使用 PInvoke ( OpenProcessHandle ) 获取所有者。
Process[] processes = Process.GetProcessesByName("explorer");
这有点骇人听闻。WMI也可以用于此。
如果您决定使用使用 WMI 的解决方案,将winmgmt设置为您的服务的依赖项可能是个好主意。