На компьютере может быть открыто несколько сеансов пользователей. Я хочу получить этот список и увидеть кто из них отключен, а кто активен.
В идеале я должен оставлять только активного, а остальным закрывать сеанс.
В древней ветке нашел скрипт, но он совсем не работает, а судя по обсуждению, это обычному смертному не сразу и понять.
Функция Список Пользователей На Сервере()
Сам отвечу на свой вопрос. Будем использовать cmd query user (говорят на версии Win Home и Basic может не работать):
В идеале я должен оставлять только активного, а остальным закрывать сеанс.
В древней ветке нашел скрипт, но он совсем не работает, а судя по обсуждению, это обычному смертному не сразу и понять.
Функция Список Пользователей На Сервере()
Код:
Global $sBufer, $iS = 0
Global Const $WTSUserName = 5;*
Global Const $WTS_CURRENT_SERVER_HANDLE = 0
While 1
$aDllFunc = DllCall('Wtsapi32.dll', 'Bool', 'WTSQuerySessionInformation', 'HANDLE', $WTS_CURRENT_SERVER_HANDLE, 'Dword', $iS, 'Dword', $WTSUserName, 'str*', $sBufer, 'Dword*', 1024)
If @error Or Not $aDllFunc[0] Then ExitLoop
$iS += 1
ConsoleWrite($aDllFunc[4] & @CR)
WEnd
Сообщение автоматически объединено:
Сам отвечу на свой вопрос. Будем использовать cmd query user (говорят на версии Win Home и Basic может не работать):
Код:
#include <WinAPIFiles.au3>
_WinAPI_Wow64EnableWow64FsRedirection(FALSE) ; для запуска query на любой разрядности ОС (х64 или х32)
Local $query_user_cmd = Run(@ComSpec & " /c query user" , @SystemDir, @SW_HIDE, $STDERR_MERGED + $STDIN_CHILD)
ProcessWaitClose($query_user_cmd)
$query_user_cmd = _OEM2ANSI(StdoutRead($query_user_cmd))
; далее парсим активную учетку - она в строке между ">" и " console"
$start = '>'
$end = ' console'
$sPattern = '(?s).*?\Q' & $start & '\E(.*?)\Q' & $end & '\E.*'
$username = StringRegExpReplace($query_user_cmd, $sPattern, '\1')
; убираем пробелы
$username = StringStripWS($username,8)
ConsoleWrite($query_user_cmd & @LF) ; вернет весь запрос с перечисленными пользователями (парсить надо)
ConsoleWrite($username & @LF) ; вернет учетку активного пользователя на ПК
Func _OEM2ANSI($Entrada)
Local $Retorno = DllCall("user32.dll", "Int", "OemToChar", "str", $Entrada, "str", "")
Return $Retorno[2]
EndFunc ;==>_OEM2ANSI
Последнее редактирование: