Что нового

Процессы Список авторизованных пользователей

Geqsogen

Новичок
Сообщения
24
Репутация
1
На компьютере может быть открыто несколько сеансов пользователей. Я хочу получить этот список и увидеть кто из них отключен, а кто активен.
В идеале я должен оставлять только активного, а остальным закрывать сеанс.
В древней ветке нашел скрипт, но он совсем не работает, а судя по обсуждению, это обычному смертному не сразу и понять.
Функция Список Пользователей На Сервере()
Код:
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
 
Последнее редактирование:

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Сам отвечу на свой вопрос. Будем использовать cmd query user
Можно использовать WMI
Код:
$oWMI = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\' & @ComputerName & '\root\cimv2')

$colSessions = $oWMI.ExecQuery("Select * from Win32_LogonSession")

For $colSession In $colSessions
    $colList = $oWMI.ExecQuery("Associators of " _
         & "{Win32_LogonSession.LogonId=" & $colSession.LogonId & "} " _
         & "Where AssocClass=Win32_LoggedOnUser Role=Dependent" )

     For $objItem in $colList
       ConsoleWrite("Сaption: " & $objItem.Caption & @CRLF)
       ConsoleWrite("Description: " & $objItem.Description & @CRLF)
       ConsoleWrite("Name: " & $objItem.Name & @CRLF)
       ConsoleWrite("Domain: " & $objItem.Domain & @CRLF)
       ConsoleWrite("Status: " & $objItem.Status & @CRLF)
     Next
Next
 
Последнее редактирование:
Верх