CreateProcessWithLogonw из службы

Тема в разделе "WASM.WIN32", создана пользователем DaDe, 8 июл 2010.

  1. DaDe

    DaDe New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2008
    Сообщения:
    3
    Добрый день.
    Имеется сервис запущенный от имени пользователя входящего в группу пользователей.
    Нужно чтобы этот сервис запускал определенные консольные программы от имени администратора.

    Имеется код, с помощью которого производится запуск приложения:

    ZeroMemory (@si, sizeof (si));
    si.cb := sizeof (si);
    si.lpDesktop := PChar ('winsta0\default');
    CreateProcessWithLogonw('User',nil,'123',LOGON_WITH_PROFILE,nil,
    PWideChar(WideString(CmdLine)),CREATE_NEW_CONSOLE,nil,nil,si,pi);

    Проблема заключается в том, что оконные приложения запускаются нормально, а вот консольные не запускаются.
    Проверял на 2-х операционках.
    Win7:Все как описано выше.
    Win2k3:Консольное приложение в списке процессов появляется, но видимо не до конца инициализируется. Висит в списке задач.

    Может кто подскажет чего-нибудь.
    Буду очень признателен.
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    1. CreateEnvironmentBlock
    2. CREATE_UNICODE_ENVIRONMENT
    3. Заполнить STARTUPINFO
     
  3. DaDe

    DaDe New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2008
    Сообщения:
    3
    Пробовал выше написанное:

    Код (Text):
    1.   ZeroMemory(@PI,SizeOf(PI));
    2.   ZeroMemory(@SI,SizeOf(SI));
    3.   SI.cb:=SizeOf(SI);
    4.   SI.lpDesktop:=PChar('WinSta0'+'\'+'default');
    5.   SI.dwFlags := STARTF_USESHOWWINDOW;
    6.   SI.wShowWindow := SW_SHOW;
    7.   if not LogonUser(PChar(Username),nil,PChar(Password),LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,h) then
    8.     Log('Could not log user in');
    9.  
    10.   if not CreateEnvironmentBlock(p,h,True) then
    11.     Log('Could not access user environment');
    12.   if WorkingDirectory='' then
    13.     wCurrentDirectory:=GetCurrentDir
    14.   else
    15.     wCurrentDirectory:=WorkingDirectory;
    16.   if not CreateProcessWithLogon(PWideChar(wUser),PWideChar(wDomain),PWideChar(wPassword),LOGON_WITH_PROFILE,nil,PWideChar(wCommandLine),CREATE_UNICODE_ENVIRONMENT,p,PWideChar(wCurrentDirectory),SI,PI) then
    17.     log('Could not create process');
    18.   CloseHandle(PI.hProcess);
    19.   CloseHandle(PI.hThread);
    К сожалению результат тот же. Может что-то делаю не так. Много в инете рылся и на английских сайтах.
    Очень хочется довершить свою идею.
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Первое, что бросается в глаза - куда делось CREATE_NEW_CONSOLE ?
     
  5. DaDe

    DaDe New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2008
    Сообщения:
    3
    При dwCreationFlags = CREATE_NEW_CONSOLE, CREATE_UNICODE_ENVIRONMENT, CREATE_UNICODE_ENVIRONMENT or CREATE_NEW_CONSOLE.
    Результат один и тот же, т.е. его отсутствие.

    Самое что противное, ни каких ошибок и не понятно в какую сторону копать.