Есть проблема: в сервисе получаю список логон сессий и хочу вызвать некую функцию под этими сессиями. Каким образом можно это сделать? Для ImpersonateLoggedOnUser нужен токен этой самой сессии, но как его получить не делая новый логин (т.к. нужны пароли пользователей).
Здравствуйте, Anatoli_Nikitin, Вы писали:
A_N>Есть проблема: в сервисе получаю список логон сессий и хочу вызвать некую функцию под этими сессиями. Каким образом можно это сделать? Для ImpersonateLoggedOnUser нужен токен этой самой сессии, но как его получить не делая новый логин (т.к. нужны пароли пользователей).
Открыть токен процесса/потока из этой сесии и использовать его. Перебираем все потоки и процессы, открываем токены, если в сессии, представленной токеном, функция ещё не выполнялась — выполняем. Только есть вероятность нарваться на ограниченные токены и на токены с включёнными/выключенными привилегиями.
Здравствуйте, SergH, Вы писали:
SH>Открыть токен процесса/потока из этой сесии и использовать его. Перебираем все потоки и процессы, открываем токены, если в сессии, представленной токеном, функция ещё не выполнялась — выполняем. Только есть вероятность нарваться на ограниченные токены и на токены с включёнными/выключенными привилегиями.
Что-то я не совсем понял. Как мне из сессии открыть токен, если у меня там процессов нет? Мне, грубо говоря, нужно в сервисе получить токены всех текущих логон сессий.
Здравствуйте, Anatoli_Nikitin, Вы писали:
A_N>Что-то я не совсем понял. Как мне из сессии открыть токен, если у меня там процессов нет? Мне, грубо говоря, нужно в сервисе получить токены всех текущих логон сессий.
Для начала, что вы понимаете под logon session? Я имел ввиду LsaEnumerateLogonSessions и LsaGetLogonSessionData. Дальше про них.
Имхо, если в логон сесии не выполняется ни один поток и ни один процесс в системе, не существует документированного способа получить токен этой сессии. Тупой способ, приходящий в голову — перебор всех открытых хендлов, определение их типа, поиск среди них токенов и т.п. Без открытых токенов логон сессия существовать не должна. Но это нельзя назвать документированным способом, хотя и вполне реально.
Дальше, если в сессии всё же кто-то выполняется, можно перебрать все потоки-процессы (ToolHelp API в помощь), вызвать каждому OpenThreadToken/OpenProcessToken и таким образом получить все токены которые нужны. Далее выбрать наиболее подходящий, имперсонализоваться и выполнить нужную функцию. Это я имел ввиду в прошлом посте.
Кстати, даже если вы узнаете пароль, или используете флажёк KERB_S4U_LOGON функции LsaLogonUser, она не вернёт токен существующей сессии, а создаст новую, с тем же пользователем. Если это не важно, можно использовать KERB_S4U_LOGON, но тут Win2003 как минимальное требование.