Во-первых, я хочу поблагодарить всех, кто работает на этом сайте, очень полезный для разработчика. Это первый я заблокирован в своем развитии с 3 дней. Я искал решения в Интернете, но ничего не нашел, что решает эту проблему.
Итак, я разрабатываю службу, которая должна выполнять внешнюю программу на vista/seven/xp, когда пользователь регистрируется. Некоторые характеристики этой услуги:
- автоматический
- нет интерактивных.
- определить идентификатор сеанса зарегистрированного пользователя
Чтобы запустить внешнее GUI-приложение в качестве интерактивного пользователя:
- Чтобы убедиться, что сеанс пользователя открыт, я перечисляю ВСЕ процесс "explorer.exe", извлекаю их Pid и SessionID с помощью функции msdn ProcessIdToSessionId
- если SessionID зарегистрированного пользователя равен идентификатору сеанса этого процесса "explorer.exe", я уверен, что рабочий стол "хороший" работает, поэтому теперь я могу выполнить внешнюю программу. (Я говорю "хороший" рабочий стол, потому что, как вы знаете, в системе может быть открыто несколько сеансов пользователя)
-
после этого я запускаю приложение с помощью этой функции:
function RunInteractive(prog_filename: String; sessionID: Cardinal): boolean; var hToken: THandle; si: _STARTUPINFOA; pi: _PROCESS_INFORMATION; begin ZeroMemory(@si, SizeOf(si)); si.cb := SizeOf(si); SI.lpDesktop := nil; if WTSQueryUserToken(sessionID, hToken) then begin if CreateProcessAsUser(hToken, nil, PChar(prog_filename), nil, nil, False, 0, nil, PChar(ExtractFilePath(prog_filename)), si, pi) then result := true else result := false; end else Begin result := false; End; CloseHandle(hToken); end;
Этот код подходит для большинства случаев, кроме одного: при изменении пользователя. Позвольте мне объяснить это двумя простыми пользователями (Domain\user1 и Domain\user2):
- Чтобы быть чистым, я устанавливаю службу и перезагружаю систему.
- Я открываю сеанс с user1: выполняется внешняя программа, и я могу видеть ее форму
- я закрыть сеанс и открыть с помощью user2: выполняется внешняя программа, и я вижу ее форму.
Если я делаю это X раз, результат всегда один и тот же, очень хороший... но если я это сделаю:
- Я переустанавливаю службу и перезагружаю систему.
- Я открываю сеанс с user1: выполняется внешняя программа, и я могу видеть ее форму
- на этот раз я не закрываю сеанс, но меняет пользователя с user2: выполняется внешняя программа, но я не вижу формы и возникает ошибка: System код ошибки 5: Доступ запрещен.
Что-то не так, но я не нашел решения. Спасибо за ваши ответы...