Есть ли способ обнаружить события сеанса удаленного рабочего стола в NPLogonNotify

Подключение удаленного рабочего стола к существующим сеансам запускает NPLogonNotify в сетевом поставщике. Но есть ли способ, которым я могу выяснить, является ли это событием входа в систему или событием подключения к существующему сеансу?

1 ответ

LsaGetLogonSessionData возвращает идентификатор сеанса служб терминалов из идентификатора сеанса входа. Таким образом, вы можете попробовать вызвать WTSQuerySessionInformation с WTSConnectState. Если повезет, результат будет отличать два случая, которые вас интересуют.

Если нет, и если вам не нужно знать ответ перед возвратом из NPLogonSession, вы можете наблюдать за тем, что происходит с сеансом служб терминалов, связанным с вызовом NPLogonSession, возможно, используя WTSRegisterSessionNotification.

Я полагаю, что если пользователь подключен к существующему сеансу, сеанс служб терминалов из NPLogonNotify вернется в состояние ожидания или прослушивания. Кроме того, сеанс входа в систему при вызове NPLogonNotify будет закрыт. Вы можете перечислить сеансы входа в систему, вызвав LsaEnumerateLogonSessions.

Если пользователь получает новый сеанс, я полагаю, что будет использоваться тот же сеанс служб терминалов в вызове от NPLogonNotify, поэтому он перейдет в активное состояние. Обычно также запускается один или несколько процессов, связанных с идентификатором сеанса входа в систему из вызова NPLogonNotify. Вы можете определить сеанс входа в систему, связанный с процессом, используя GetTokenInformation с классом запросов TokenStatistics, как описано в разделе "Идентификатор входа" в глоссарии MSDN.

Еще одна сложность, о которой следует знать: если пользователь является администратором и UAC включен, будет два вызова NPLogonNotify, один из которых связан с токеном ограниченного пользователя, а другой - с маркером повышенного уровня. Это верно как для локального, так и для удаленного входа.

Другие вопросы по тегам