ImpersonateLoggedOnUser и запуск нового процесса, использующего ocx, завершается неудачно - PullRequest
1 голос
/ 01 сентября 2009

Я пишу Windows-приложение на C ++ (A), которое использует LogonUser, LoadUserProfile и ImpersonateLoggedOnUser для получения прав другого пользователя (Y). Значение A начинает использовать пользователя, вошедшего в систему на рабочей станции (X). Если пользователь хочет повысить свои права, он может просто нажать кнопку и войти в систему как другой пользователь без необходимости выходить из окна и снова входить в систему.

Ситуация теперь (согласно возвращаемым значениям функций): LogonUser работает, LoadUserProfile работает и ImpersonateLoggedOnUser также работает.

После подражания я начинаю другой процесс. Этот процесс представляет собой приложение (B), которому требуется элемент управления OCX. Это не удается, и приложение сообщает мне, что файл .oxc установлен неправильно.

Дело в том, что, если я запускаю B напрямую как пользователь, вошедший в систему на компьютере (X), это работает. Если я запускаю B напрямую как пользователь (Y), которому я хочу повысить свои права, используя A., это работает.

Если я вошел в систему как (X) и в проводнике выбрал «запустить как» (Y), это работает!

Знаете ли вы, какие шаги мне нужно сделать, чтобы сделать то же самое, что и диалог "запустить как" из окон?

Ответы [ 2 ]

1 голос
/ 01 сентября 2009

Я не уверен, но похоже, что олицетворения недостаточно - олицетворение относится только к процессу (A), вместо этого попробуйте CreateProcess с ProcessAttributes / ThreadAttributes, явно установленными для олицетворенного пользователя из ACL

Windows.
0 голосов
/ 02 сентября 2009

Спасибо всем за помощь. Следующее удалось решить проблему для меня:
Я запускаю нужный процесс, используя CreateProcessWithLogonW () . Чтобы заставить эту функцию работать должным образом, мне нужно RevertToSelf () , прежде чем я вызову ее, а затем снова выполнить олицетворение.

Итак, последовательность теперь:

LogonUser()
LoadUserProfile()
ImpersonateLoggedOnUser()
// work with the app
RevertToSelf()
CreateProcessWithLogonW()
// do the impersonation stuff again
...