CreateProcessAsUser не работает при «смене пользователя»

Во-первых, я хочу поблагодарить всех людей, которые работают на этом сайте, очень полезно для разработчика. Это первый случай, когда я заблокирован в разработке за 3 дня. Я искал решения в Inte rnet, но я не нашел ничего, что решило бы эту проблему.

Итак, я разрабатываю службу, которая должна выполнять внешнюю программу на Vista / seven / xp, когда пользователь входит в систему. Некоторые характеристики этого сервиса:

  • автоматический
  • нет интерактивный.
  • определить идентификатор сеанса пользователя, вошедшего в систему.

Чтобы запустить внешнее приложение с графическим интерфейсом пользователя в качестве интерактивного пользователя:

  1. Чтобы убедиться, что сеанс пользователя открыт, я перечисляю ВСЕ "проводник".exe "извлеките их Pid и SessionID с помощью функции msdn ProcessIdToSessionId
  2. , если SessionID зарегистрированного пользователя совпадает с идентификатором сеанса этого процесса" explorer.exe ", я уверен, что" хороший "рабочий стол запущен так что теперь я могу выполнить внешнюю программу (я говорю «хороший» рабочий стол, потому что, как вы знаете, в системе может быть открыто более одного сеанса пользователя)
  3. после этого я запускаю приложение с этой функцией:

     function RunInteractive (prog_filename: String; sessionID: Cardinal): boolean; 
    var hToken: THandle; 
    si: _STARTUPINFOA; 
    pi: _PROCESS_INFORMATION; 
    begin { {1}} ZeroMemory (@si, SizeOf (si)); 
    si.cb: = SizeOf (si); 
    SI.lpDesktop: = nil; 
    если WTSQueryUserToken ( sessionID, hToken) 
    затем начинайте 
    , если 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):

  1. Чтобы быть чистым, я устанавливаю службу и перезагружаю систему
  2. Я открываю сеанс с user1: внешняя программа выполняется, и я могу см. его форму
  3. Я закрываю сеанс и открываю сеанс с пользователем2: выполняется внешняя программа, и я вижу ее форму.

Если я сделаю это X раз, результат всегда будет один и тот же, очень хороший ...но если я сделаю это:

  1. Я переустановлю службу и перезагружу систему
  2. Я открываю сеанс с пользователем user1: внешняя программа выполняется, и я вижу ее форму
  3. на этот раз, я не закрывать сеанс , но изменить пользователя на user2: внешняя программа выполняется, но я не вижу форму, и возникает ошибка: Код системной ошибки 5: Доступ запрещен.

Что-то не так, но я не нахожу решения. Спасибо за ответы ...

14
задан user1039768 11 November 2011 в 20:18
поделиться