В чем разница между WTS_SESSIONSTATE_UNKNOWN и WTS_SESSIONSTATE_LOCK? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь определить текущее состояние сеанса с помощью Win32 API ::WTSQuerySessionInformation, запросив SessionFlags из WTSINFOEX_LEVEL1 структура в соответствии с ответами на C ++: проверить, не заблокирован ли компьютер .

На моем компьютере (Windows 10 1703) SesssionFlags может достигать только двух (из трех задокументированных) значений: WTS_SESSIONSTATE_UNLOCK и WTS_SESSIONSTATE_UNKNOWN . Последнее, кажется, означает то же самое, что и ожидаемый WTS_SESSIONSTATE_LOCK , которого я не могу достичь, ни через <WinKey>+<L>, ни посредством программной блокировки сеанса через ::LockWorkStation.

Итак, мои вопросы:

  1. WTS_SESSIONSTATE_LOCK существует?
  2. Если да, то как я могу достичь этого состояния?
  3. Если да, в чем разница между обоими состояниями (LOCK и UNKNOWN)?

Согласно SessionChangeReason Enumeration .NET Framework различает (правильно?) Только между двумя соответствующими состояниями SessionUnlock и SessionUnlock. То есть состояние сеанса тройное или двоичное?

1 Ответ

0 голосов
/ 10 мая 2018

Можно подумать, что WTS_SESSIONSTATE_UNKNOWN означает, что состояние неизвестно, и вы не должны интерпретировать его как заблокированный или разблокированный. Похоже, у этого участника есть печальная история, MSDN говорит

Windows Server 2008 R2 и Windows 7: Из-за дефекта кода использование флагов WTS_SESSIONSTATE_LOCK и WTS_SESSIONSTATE_UNLOCK изменяется на противоположное. То есть WTS_SESSIONSTATE_LOCK указывает, что сеанс разблокирован, а WTS_SESSIONSTATE_UNLOCK указывает, что сеанс заблокирован.

Поскольку член называется Session Flags , а MSDN говорит: «Это может быть одно или несколько из следующих значений», можно предположить, что со временем может быть добавлено больше флагов, и вы должны это делать:

isUnlocked = SessionFlags & WTS_SESSIONSTATE_UNLOCK;

(и логика полностью изменилась в Windows 7). Я не думаю, что кто-то делает это, поэтому я сомневаюсь, что Microsoft когда-либо добавит больше флагов, но вы никогда не знаете.

На моих машинах с Windows 8 и 10.0.17134 он возвращает WTS_SESSIONSTATE_UNLOCK нормально и WTS_SESSIONSTATE_LOCK, когда я нажимаю Win + L , поэтому возможно, что вы делаете что-то не так?

Я не знаю, что случится, если машина с Windows 7+ попытается запросить машину с Vista, может быть, вы получите WTS_SESSIONSTATE_UNKNOWN или, возможно, весь вызов не будет выполнен, потому что Vista не поддерживает WTSSessionInfoEx.

Принятый ответ на вопрос, с которым вы связались, говорит вам использовать WTSRegisterSessionNotification, и он предоставит вам те же значения, что и SessionChangeReason, и вам не нужно тянуть, чтобы обнаружить изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...