:?: Люди, подскажте, как программе запустить саму себя от имени другого пользователя?
У каждого процесса есть токен, если его заменить, то процесс пойдет под другим юзером. Так частенько делают сервера, заменяя токены своих процессов на токены юзеров, которые им послали задание, чтобы не дать бесправнеому юзеру что-то сделать через сервис.
Есть такие ф-ции-
ImpersonateLoggedOnUser - приписывает токен вызвавшему потоку(не процессу!)
RevertToSelf- отменяет имперсонификацию. сделанную ф-цией ImpersonateLoggedOnUser
SetThreadToken- устанавливает токен потока
LogonUser - используется для получения токена другого юзера
Также есть вот такие ф-ции:
OpenProcessToken
OpenThreadToken
GetTokenInformation
DuplicateTokenEx
CreateProcessAsUser- не очень подходит если процесс уже запущен.
Таким образом тебе надо имперсонифицировать каждый поток своего приложения, единственное, что точно не знаю- сохраняется ли имперсонификации при запуске одного потока из другого, то есть имеет ли запущенный поток имперсонифицированный токен запустившего, но это легко проверить, и если наследования нет, то надо каждый поток имперсонифицировать, если есть- достаточно только первый поток приложения.
Или запустить приложение и из него сразу вызвать CreateProcessAsUser, запустив себя второй раз но под другим юзером, а первоначальный процесс завершить, только надо как-то сообщить, что он уже сам себя перезапустил, а то цикл выйдет, но имперсонификация даст тот-же эффект.