В настоящее время я использую доморощенный метод для запуска процесса от имени другого пользователя в 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 кажется, что он по-прежнему запускает процессы с использованием моего текущего имени входа, а не того, которое я предоставил, хотя я активировал олицетворение с использованием предоставленных учетных данных.