Конференция "WinAPI" » запуск процесса из-под сервиса... [D7]
 
  • istok20 © (30.06.09 14:30) [0]
    Данный код используется для запуска exe из-под сервиса в сессиях пользователей. Exe запустится под учеткой SYSTEM. А как сделать так, чтобы он запустился под юзером данной сессии? Я б например взял токен окна program manager, но не могу его найти в другой сессии...


    function RunProcessInSession(FileName: String; SessionId: DWord): Boolean;
    var
     hToken, hNewToken: Cardinal;
     si: TStartupInfo;
     pi: TProcessInformation;
     error: integer;
    begin

     Result := False;

     if (SessionId = 0) and IsVistaOrLonghorn then
     begin
       Exit;
     end;

     if not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY or TOKEN_DUPLICATE, hToken) then
     begin
       WriteLog8('not OpenProcessToken');
       Exit;
     end;

     if not DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, nil, SecurityIdentification,
       TokenPrimary, hNewToken) then
     begin
       WriteLog8('not DuplicateTokenEx');
       Exit;
     end;

     //in Windows 2000 Professional and Windows NT SessionId value in this function is not supported
     //TTokenInformationClass(12) - value from MSDN
     if not SetTokenInformation(hNewToken,
       TTokenInformationClass(12), @SessionId, SizeOf(Cardinal)) then
       Exit;

     try
       FillChar(si,SizeOf(si),0);
       with Si do begin
         cb := SizeOf(Si);
         dwFlags := startf_UseShowWindow;
         wShowWindow := SW_NORMAL;
         lpDesktop := PChar('winsta0\default');
       end;

       Result := CreateProcessAsUser(hNewToken, PChar(FileName), nil, nil, nil,
         false, CREATE_DEFAULT_ERROR_MODE, nil, nil, si, pi);

     finally
       CloseHandle(hToken);
       CloseHandle(hNewToken);
     end;
    end;

  • clickmaker © (30.06.09 14:36) [1]
    > для запуска exe из-под сервиса в сессиях пользователей

    то есть как? сервис работает в своей сессии, пользователи - в своих. Какой именно пользователь интересует? Консольный, терминальный?
  • istok20 © (30.06.09 15:55) [2]

    > Какой именно пользователь интересует? Консольный, терминальный?


    тот под кем в данной сессии запущен рабочий стол,
    я так понимаю, что он может быть и консольным и терминальным и это значения не имеет, т.к. в рамках сессии он один.  сорри если не так термины понял..
  • istok20 © (01.07.09 14:59) [3]
    пока только есть идея запустить в сессии свой exe под system, который уже в свою очередь увидит рабочий стол, возьмет его токен и запустит программу под user.  а попрямее есть варианты?
  • Leonid Troyanovsky © (01.07.09 15:28) [4]

    > istok20 ©   (01.07.09 14:59) [3]

    > варианты?

    Включить требуемую программу в автозагрузку, планировщик и т.п.
    Ну, или юзера попросить.

    --
    Regards, LVT.
 
Конференция "WinAPI" » запуск процесса из-под сервиса... [D7]
Есть новые Нет новых   [134434   +27][b:0][p:0.001]