Получить зарегистрированное имя пользователя в C # - PullRequest
9 голосов
/ 28 октября 2010

Как получить текущее зарегистрированное имя пользователя в Windows 7 (т. Е. Пользователя, который физически вошел в консоль, на которой запущена запускаемая мной программа).

Например, если я вошел в систему как «MainUser» и запустил мое консольное приложение (которое будет отображать имя пользователя, вошедшего в систему) как «SubUser», тогда программа вернет только «SubUser» в качестве текущего пользователя. 1003 *

Я использовал следующие 2 метода, чтобы получить имя пользователя. Оба не дают мне то, что я хочу.

System.Environment.GetEnvironmentVariable("USERNAME")
System.Security.Principal.WindowsIdentity.GetCurrent().User;

Обратите внимание, что, однако, этот код VBScript возвращает имя пользователя, вошедшего в систему, независимо от учетной записи пользователя, из которой запускается этот сценарий:

strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set compsys_arr = objWMIService.ExecQuery _ 
    ("Select * from Win32_ComputerSystem") 
For Each sys in compsys_arr
    Wscript.Echo "username: " & sys.UserName
Next

В любом случае это возможно в C #?

Ответы [ 4 ]

6 голосов
/ 02 ноября 2010

Я думаю, что просто преобразование вызовов WMI в c # прекрасно работает для меня.

            ConnectionOptions oConn = new ConnectionOptions();
            System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\\\localhost", oConn);


            System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select * from Win32_ComputerSystem");
            ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery);
            ManagementObjectCollection oReturnCollection = oSearcher.Get();

            foreach (ManagementObject oReturn in oReturnCollection) {
                Console.WriteLine(oReturn["UserName"].ToString().ToLower());
            }
5 голосов
/ 28 октября 2010

Я думаю, вам нужно идти по маршруту P / Invoke.Вам необходимо выяснить, на какой WindowStation работает ваш процесс, а затем определить владельца этой WindowStation.Я не думаю, что .NET API для определения этих вещей.

Win32 API, которые вам нужно посмотреть, вероятно, GetProcessWindowStation и GetUserObjectSecurity найти владельца.

2 голосов
/ 28 октября 2010

Хотя я не понимаю, хотите ли вы получить имя пользователя, который вошел в систему или имя пользователя, под которым работает консоль - возможно, вы могли бы попробовать использовать System.Environment.UserName - MSDN утверждает, что онопоказывает зарегистрированное имя пользователя.

1 голос
/ 28 октября 2010

Вы хотите, чтобы имя пользователя вашего сеанса. Вы можете узнать свой идентификатор сессии, позвонив ProcessIdToSessionId . Затем используйте WTSQuerySessionInformation , чтобы узнать имя пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...