Python Ctypes перечисляет SessionId's - PullRequest
0 голосов
/ 09 мая 2020

У меня есть следующий код для получения имени пользователя, связанного с идентификатором сеанса:

ppBuffer = ctypes.c_wchar_p()
pBytesReturned = ctypes.c_ulong()
ctypes.windll.wtsapi32.WTSQuerySessionInformationW(0, SessionId, 5, ctypes.byref(ppBuffer), ctypes.byref(pBytesReturned))
logging.info(f'Username: {ppBuffer.value}')

У меня возникают проблемы с попыткой перечислить через "WTSEnumerateSessionsW", чтобы получить массив идентификаторов сеанса и состояния

Я дошел до:

class WTS_SESSION_INFOW(ctypes.Structure):
    _fields_ = [("SessionId", ctypes.c_ulong),
                ("pWinStationName", ctypes.c_wchar_p),
                ("State", ctypes.c_int)]

ppSessionInfo = WTS_SESSION_INFOW()
pCount = ctypes.c_ulong()
ctypes.windll.wtsapi32.WTSEnumerateSessionsW(0, 0, 1, ctypes.byref(ppSessionInfo), ctypes.byref(pCount))

pCount.value возвращает правильное количество запущенных экземпляров, однако ppSessionInfo.SessionId возвращает одно большое целое число, которое не соответствует ни одному текущему идентификатору сеанса.

В документации MS говорится, что ppSessionInfo должен быть массивом структур WTS_SESSION_INFOW, однако я не уверен, как это сделать sh это?

Я могу выполнить sh вышеуказанное, используя win32ts .WTSEnumerateSessions () и win32ts.WTSQuerySessionInformation (), однако я ограничен тем, какой импорт мне доступен.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 09 мая 2020

С помощью этого сообщения: python ctypes, передайте двойной указатель по ссылке Мне удалось решить свою проблему.

Вот решение:

ppSessionInfo = ctypes.POINTER(WTS_SESSION_INFOW)()
pCount = ctypes.c_ulong()
ctypes.windll.wtsapi32.WTSEnumerateSessionsW(0, 0, 1, ctypes.byref(ppSessionInfo), ctypes.byref(pCount))

for index in range(pCount.value):
    ppSessionInfo[index].SessionId
    ppSessionInfo[index].State
    ppSessionInfo[index].pWinStationName

Описание проблемы помогло мне придумать лучшие способы поиска того, что мне нужно было выполнить sh.

...