获取当前登录用户(FullToken上下文)

时间:2010-12-20 16:04:16

标签: c# token windows-identity

我有一个问题,就是......我用右键单击启动程序 - >以管理员身份运行。 这意味着程序正在管理环境中运行。

WindowsIdentity.GetCurrent().Name;

如果我试图以这种方式获取用户名,我将获得以管理员身份启动程序的用户...例如“administrator”,但我需要的是当前登录用户的名称,例如:鲍勃

有人可以帮帮我吗? :)

5 个答案:

答案 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设置为服务的依赖项可能是个好主意。