Получение текущего зарегистрированного пользователя (контекст FullToken) - PullRequest
1 голос
/ 20 декабря 2010

У меня проблема, которая заключается в том, что ... я запускаю программу, щелкнув правой кнопкой мыши -> запустить от имени администратора. Это означает, что программа работает в административном контексте.

WindowsIdentity.GetCurrent().Name;

если я попытаюсь получить имя пользователя таким образом, я получу пользователя, запустившего программу от имени администратора .. например, "администратор", но мне нужно имя текущего вошедшего в систему пользователя, например: боб

Кто-нибудь может мне помочь? :)

Ответы [ 5 ]

5 голосов
/ 20 декабря 2010

Вы можете попробовать использовать 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;
}

Это зависит от того факта, что процесс проводника является единичным экземпляром, поэтому у вас не будет возможности запустить несколько процессов проводника с разными учетными данными пользователя.

0 голосов
/ 26 апреля 2012

1) Cassia должна предоставить вам список зарегистрированных пользователей, включая RDC.

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

2) WMI (SO ответ )

Select * from Win32_LogonSession

3) Вызвать WTSEnumerateSessions

4) Перечислите все экземпляры "explorer.exe" и получите владельца, используя PInvoke ( OpenProcessHandle ).

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

Это немного глупо. WMI также может использоваться для этого.

Возможно, было бы неплохо установить winmgmt в качестве зависимости для вашей службы, если вы решили использовать решение, использующее WMI.

0 голосов
/ 20 декабря 2010

Может быть, вы могли бы начать как обычный пользователь, сохранить имя пользователя, а затем программно запросить повышение прав:

Windows 7 и Vista UAC - программно запрашиваем повышение уровня в C #

0 голосов
/ 20 декабря 2010

Все библиотеки .NET предоставят вам пользователя из текущего контекста («Администратор» в вашем случае).

Если вы пытаетесь защитить свой код, вы можете прочитать о: Безопасность в .NET Framework

0 голосов
/ 20 декабря 2010

Для этого вам, вероятно, потребуется использовать win32 API. Читайте о функциях Window Station и Desktop здесь: http://msdn.microsoft.com/en-us/library/ms687107%28v=vs.85%29.aspx

Также смотрите этот вопрос: Получить имя пользователя Windows, связанного с рабочим столом

...