Получение идентификатора пользователя

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

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

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

так же как:

UserPrincipal.Current.Sid

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

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


person FLAdmin    schedule 15.04.2015    source источник


Ответы (2)


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

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

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

    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 содержит свойство SessionId, которое должно работать по мере необходимости. Но имейте в виду, что есть предостережения, связанные с состоянием сеанса - я не гарантирую, что моего условия достаточно, вам может потребоваться адаптировать условие на ConnectionState по мере необходимости.

person Community    schedule 15.04.2015
comment
Я настроил службу, используя скрытую форму и насос сообщений, чтобы я мог фиксировать зарегистрированную активность пользователя. Он делает это успешно в том, что касается блокировки, разблокировки, входа в систему и т. д. Я предположил, что, поскольку это работает, он также будет тянуть их сид. Есть ли способ сделать это? - person FLAdmin; 15.04.2015
comment
@FLAdmin, пожалуйста, посмотрите мое редактирование - я добавил демонстрацию использования cassia для запроса сеансов. - person ; 15.04.2015

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

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

Вам нужно уточнить свои требования: зачем вам знать вошедшего в систему пользователя?

person Richard    schedule 15.04.2015