Имя пользователя не доступно в SessionLogoff и даже когда-нибудь в SessionUnlock - PullRequest
0 голосов
/ 02 мая 2019

Я пишу службу Windows (с использованием C #, WCF), которая предназначена для записи события сеанса пользователя Windows и публикации его в какой-либо другой службе WCF.

Ниже приведенный код иногда работает, как ожидается, но не всегда.Он возвращает пустой в основном в событиях SessionUnlock, SessionLogoff.

var usernmae = Machine.getInstance().getUsername();

Приведенная выше строка кода используется внутри служебной функции, которая вызывается из события OnSessionChange службы Windows, как показано ниже: -

protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
  var sessionDetails = sessionLogger.BuildSessionDetails(changeDescription);

  ....
}

и эта функция BuildSessionDetails имеет вид: -

public class SessionLogger : ISessionLogger
    {
        private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public SessionDetails BuildSessionDetails(SessionChangeDescription changeDescription)
        {
            SessionDetails sd = new SessionDetails();
            sd.ChangeTime = DateTime.Now.ToUniversalTime();
            sd.SessionId = changeDescription.SessionId.ToString();
            sd.ChangeType = changeDescription.Reason.ToString();

            //This is where I am EXTRACTING USERNAME
            sd.Username = Machine.getInstance().getUsername();
            ...
            ...
      }
   }

Ожидаемый результат - имя пользователя все время, когда происходит событие сеанса.

Любая идея о том, что происходит или вызывает здесь, не возвращаетсяимя пользователя всегда?

1 Ответ

0 голосов
/ 06 мая 2019

Ваш код получает свойство UserName из класса Win32_ComputerSystem. Документация по этой переменной гласит:

Имя пользователя, который в данный момент вошел в систему. Это свойство должно иметь значение. В сеансе службы терминалов UserName возвращает имя пользователя, вошедшего в консоль , а не пользователя, вошедшего в систему во время сеанса службы терминалов.

Это ваше намерение?

Вы, кажется, считаете этот код подходящей альтернативой:

userName = System.Security.Principal.WindowsIdentity.GetCurrent (). Name;

Но это всегда будет возвращать имя пользователя, указанное на вкладке "Вход в систему" вашей службы & mdash; вероятно, не то, что вы хотите.

Точно какого "пользователя" вы пытаетесь получить?


Редактировать на основе комментариев:

Чтобы получить имя пользователя, связанное с сеансом, который был изменен:

  1. В OnSessionChange () получите значение sessionID из параметра SessionChangeDescription .
  2. Используйте sessionID при вызове функции WTSQuerySessionInformation со значением WTSUserName, чтобы получить имя пользователя, связанное с сеансом.

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

  1. Представление карты sessionID-to-username в вашем приложении
  2. Заполнение карты путем перечисления всех активных сеансов при запуске службы
  3. Добавление на карту всякий раз, когда вы получаете событие входа в систему
  4. Удаление с карты (по sessionID) всякий раз, когда происходит событие выхода из системы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...