С#.NET Получение имени пользователя с помощью службы Windows

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

При использовании как System.Environment.UserName, так и WindowsIdentity.GetCurrent(). UserName Я получаю NTAUTHORITY\SYSTEM, но когда это приложение нажимается, мне нужно иметь возможность сопоставлять идентификатор пользователя пользователя, входящего в систему. Операционная система, на которой будет использоваться эта система, будет Windows XP.

Любая помощь будет очень оценена.

Ответ 1

Только для XP этот совет должен применяться: Получить Window Station для неинтерактивного пользователя для каждого процесса, пользователя или сеанса?

  • Вызовите OpenWindowStation, чтобы получить дескриптор "winsta0"
  • Вызовите GetUserObjectInformation, чтобы узнать, кто владеет winsta0

Однако этот подход будет нарушен при обновлении вашего приложения до Vista, Windows 7 или выше, где службы запускаются в другом сеансе из интерактивных входов. Вам нужно будет вызвать API служб терминалов, чтобы получить список зарегистрированных пользователей и выбрать свой "интерактивный".

Ответ 2

Попробуйте следующее:

var connectionOptions = new ConnectionOptions();
var scope = new System.Management.ManagementScope("\\\\localhost", connectionOptions);
var query = new System.Management.ObjectQuery("select * from Win32_ComputerSystem");
var searcher = new ManagementObjectSearcher(scope, query);
foreach (var row in searcher.Get()) 
{
    Console.WriteLine(row["UserName"].ToString().ToLower());
}

Ответ 3

Служба Windows всегда запускается под учетными данными, указанными на вкладке Свойства/Вход в службу. Это не имеет никакого отношения к учетным данным человека/людей, которые в настоящее время вошли в Windows в свои собственные сеансы.

Значение NTAUTHORITY\SYSTEM корректно, потому что ваша служба работает под учетными данными "Локальная учетная запись системы".

Вы не можете запускать службу Windows из-за учетной записи пользователя "в настоящее время вошел в систему" ​​- это не то, для чего предназначена служба Windows.