簡體   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