В настоящее время я использую доморощенный метод для запуска процесса от имени другого пользователя в Vista, и я не могу отделаться от ощущения, что это хакерский и далеко не идеальный (в дополнение к тому факту, что он выводит из строя UAC, приводя к сбою моего приложение с исключением безопасности и вынуждает меня полностью отключить UAC). Мой процесс состоит из двух проектов (то есть двух EXE-файлов) — «интерфейса» и «заглушки запуска» — и вот процесс:
- У пользователя есть ярлык, который запускает «Interface.exe notepad.exe».
- Interface.exe имеет форму, которая запрашивает учетные данные, которые они хотели бы использовать.
- Interace.exe использует ProcessStartInfo для создания экземпляра LaunchStub.exe (LS) в качестве нового пользователя.
- LS использует ProcessStartInfo (с ShellExecute, установленным в true) для запуска запрошенного файла, и, поскольку он уже запущен от имени запрошенного пользователя, то же самое и с новым процессом.
Причина, по которой у меня есть двухэтапный процесс, заключается в том, что я хочу, чтобы пользователи могли щелкнуть правой кнопкой мыши любой файл, для которого ОС имеет действие по умолчанию (.EXE, .SQL, .MSC и т. д.), и запустить его, и только ProcessStartInfo поддерживает это с включенным «UseShellExecute», но этот переключатель не позволяет мне использовать новые учетные данные, поэтому я могу делать только по одному за раз.
Это вызывает несколько проблем: во-первых, пользователь уже должен существовать на компьютере, то есть он должен был предварительно войти в систему локально. Если для этого пользователя нет локального профиля, запрошенное приложение иногда запускается, но я получаю исключения из реестра и профиля, потому что приложение ожидает, что существуют вещи, которых еще нет (например, куст HKCU в реестре, который пользователь не есть, потому что они никогда не входили в систему).
Я знаю, что должен иметь возможность просто «повысить» права моего приложения до пользователя, которого они запрашивают, запустить мой новый процесс, а затем отменить повышение, но я не могу найти хороший пример кода для этого, и Я не уверен, что это позволит работать под совершенно другим пользователем. Имеет ли все это смысл? Я просто не могу отделаться от ощущения, что есть лучший способ сделать это.
ОБНОВЛЕНИЕ: я только что попробовал код олицетворения Я нашел в Интернете, но безрезультатно. При использовании вместе с ProcessStartInfo кажется, что он по-прежнему запускает процессы, используя мой текущий логин, а не тот, который я предоставил, даже несмотря на то, что я активировал олицетворение, используя предоставленные учетные данные.