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