CreateProcessAsUser не рисует графический интерфейс - PullRequest
2 голосов
/ 06 апреля 2010

У меня есть служба Windows, работающая под учетной записью «SYSTEM», которая проверяет, работает ли определенное приложение для каждого вошедшего в систему пользователя. Если приложение не запущено, служба запускает его (под соответствующим именем пользователя).
Я пытаюсь достичь своей цели с помощью CreateProcessAsUser (). Служба запускает приложение под соответствующим именем пользователя, но графический интерфейс не отображается. (Да, я проверяю, установлен ли флажок «Разрешить сервису взаимодействовать с рабочим столом»).

Система: XP SP3, язык: C #

Вот код, который может быть интересен:

PROCESS_INFORMATION processInfo = new PROCESS_INFORMATION();  
startInfo.cb = Marshal.SizeOf(startInfo);  
startInfo.lpDesktop = "winsta0\\default";  
bResult = Win32.CreateProcessAsUser(hToken, null, strCommand, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref startInfo, out processInfo);  

Насколько я понимаю, установка startInfo.lpDesktop = "winsta0 \ default"; должен был использовать рабочий стол соответствующего пользователя.
Даже вопреки тому, что указано здесь: http://support.microsoft.com/kb/165194, Я попытался установить для lpDesktop значение null или не задавать его вообще, оба результата дали один и тот же: процесс был запущен от имени ожидаемого пользователя, и я мог видеть часть строка заголовка окна. «Невидимое» окно перехватывает события щелчка мыши и обрабатывает их, как и ожидалось. Это просто не тянет себя.

Кто-нибудь знаком с такой проблемой и знает, что я делаю не так?

1 Ответ

1 голос
/ 06 апреля 2010

В MSDN есть пример того, как создать процесс в качестве другого пользователя, устанавливающего явные разрешения для оконной станции и объектов рабочего стола:

CreateProcessAsUser () Windows Station и рабочие столы

Вы можете перенести код на C # с помощью P / Invoke или использовать сборку C ++ / CLI.

Тем не менее, имейте в виду, что ваш сценарий не поддерживается и может сломаться вместе с Vista (и Windows 7) Изоляция Session-0 (скачать документ справа). 1017 *

...