2015-04-15 6 views
0

Я пишу службу, и я пытаюсь получить зарегистрированный файл пользователя и по какой-то причине он не работает. Он возвращает только {S-1-5-18}. Тем не менее, если я создаю быстрое консольное приложение, оно работает отлично.Получение пользователя Sid

Я пробовал 2 метода:

WindowsIdentity usr = WindowsIdentity.GetCurrent(); 
return usr.User 

, а также:

UserPrincipal.Current.Sid 

Они оба имеют тот же эффект в моей службе. Они оба возвращают {S-1-5-18}. Однако в консольном приложении оба они возвращают полный пользовательский sid.

Что может быть причиной этого?

ответ

4

Предполагается, что вы используете сервисный процесс как NT AUTHORITY\SYSTEM или .\LOCALSYSTEM. Пожалуйста, см KB 243330 подробнее:

SID: S-1-5-18
Имя: Локальная система
Описание: Учетная запись службы, используемая операционной системой.

Если вы хотите, чтобы получить SID с рабочего стола-сессии, вы можете, например, пойти на (с использованием cassia - nuget-package available):

ITerminalServicesSession GetActiveSession() 
    { 
     var terminalServicesSession = default(ITerminalServicesSession); 
     var terminalServicesManager = new TerminalServicesManager(); 
     using (var server = terminalServicesManager.GetLocalServer()) 
     { 
      foreach (var session in server.GetSessions()) 
      { 
       if (session.ConnectionState == ConnectionState.Active) 
       { 
        // yep, I know ... LINQ ... but this is from a plain .NET 2.0 source ... 
        terminalServicesSession = session; 
        break; 
       } 
      } 
     } 
     return terminalServicesSession; 
    } 

ITerminalServiceSession -instance действительно содержит свойство SessionId, который должен работайте по мере необходимости. Но, пожалуйста, имейте в виду, что есть оговорки, связанные с состоянием сеанса - я не гарантирую, что мое условие достаточно, вам может потребоваться адаптировать условие на ConnectionState по мере необходимости.

+0

Я установил сервис, используя скрытую форму и насос сообщений, чтобы я мог записывать активность зарегистрированного пользователя. Он делает это успешно, поскольку компьютер блокирует, разблокирует, вводит в систему и т. Д. Я предполагал, что, поскольку это работает, оно также будет тянуть их сид. Есть ли способ сделать это? – FLAdmin

+0

@FLAdmin, пожалуйста, см. Мое редактирование. Я добавил демо для использования cassia для запроса сеансов. –

0

Эти API возвратят SID пользователя, выполняющего текущий процесс, в вашем случае ваш сервис. S-1-5-18 является NT AUTHORITY\SYSTEM.

В системе Windows может быть что угодно: от нуля до многих пользователей, подключенных к системе Windows (для интерактивного использования: локально или удаленно): нет уникального «зарегистрированного пользователя».

Необходимо усовершенствовать ваши требования: почему вы хотите знать, что вошедший в систему пользователь?

Смежные вопросы