繁体   English   中英

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

[英]Getting the current logged in user (FullToken Context)

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

WindowsIdentity.GetCurrent().Name;

如果我尝试以这种方式获取用户名,则将以管理员身份启动启动程序的用户。例如“ administrator”,但我需要的是当前已登录用户的名称,例如: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;
}

这依赖于一个事实,即资源管理器进程是单个实例,因此您最终不会让多个资源管理器进程以不同的用户凭据运行。

1) Cassia应该能够为您提供当前登录用户的列表,包括RDC。

foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions())
{
    // sess.SessionId
    // sess.UserName
}

2)WMI(SO 回答

Select * from Win32_LogonSession

3) P调用WTSEnumerateSessions

4)枚举“ explorer.exe”的所有实例,并使用PInvoke( OpenProcessHandle )获取所有者。

Process[] processes = Process.GetProcessesByName("explorer");

这有点hacky。 WMI也可以用于此目的。

如果您决定使用使用WMI的解决方案,则最好将winmgmt设置为服务的依赖项。

您可能需要为此使用win32 API。 在此处阅读有关Window Station和桌面功能的信息: http : //msdn.microsoft.com/zh-cn/library/ms687107%28v=vs.85%29.aspx

另请参阅以下问题: 获取与桌面关联的登录的Windows用户名

也许您可以以普通用户身份开始,保存用户名,然后以编程方式请求提升权限:

Windows 7和Vista UAC-以编程方式在C#中请求提升

所有.NET库都会为您提供当前上下文中的用户(在您的情况下为“管理员”)。

如果您尝试保护代码安全,则可以考虑阅读以下内容: .NET框架中的安全性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM