singlepost

Вопрос по сервисам, точнее по способам запуска прог из под них << На главную или назад  

Ситуация следующая:
Есть сервис, стартующий до логона, работающий от имени какого-либо юзера (но не от localsystem). Этот сервис при своем запуске должен запустить стороннюю прогу. Вот выдержка:

STARTUPINFOW si = {sizeof(STARTUPINFOW)};
si.cb=sizeof(si);
si.lpDesktop=L"WinSta0\\Default";//указываю интерактивный десктоп
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_SHOW;
si.lpReserved=NULL;
si.lpTitle=L"";
si.cbReserved2=0;
si.lpReserved2=NULL;

PROCESS_INFORMATION pi;

CreateProcess(NULL,MyProgramm, NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi);

Прога стартует нормально, работает. Но когда юзер логонится, он не видит окна проги. Точнее видит, просто ее окно не перерисовывается. как будтооно игнорит сообщения перерисовки, но сообщения мыши обрабатываются (порой проскакивают изображения различных контролов и по ним можно кликнуть).

В чем может быть трабл?

8 ответов в теме “Вопрос по сервисам, точнее по способам запуска прог из под них”

  1. 8
    Мопедий Дрынов ответил:

    На счет интерактивности я в курсе, вот хотелось бы обойти это ограничение)

  2. 7
    Алексей Коньшин ответил:

    А на сколько я знаю, если сервис не интерактивный, то не может ничего выводить и не может запускать интерактивные программы, а если он интерактивный, то всё равно не может просто так выводить своих окон на рабочем столе залогиневшегося пользователя.. для этого обычно проверяют залогинился ли какой-нибудь пользователь и пытаются породить процесс уже от его имени и его привилегий.. с помощью той же функции CreateProcessAsUser..

  3. 6
    Мопедий Дрынов ответил:

    Запускаемая программа принадлежит интерактивному десктопу
    Во-первых я непосредственно в структуре STARTUPINFO задаю si.lpDesktop=L"WinSta0\\Default"
    Во-вторых я писал мелкую тестовую программу, которая записывала в файл название десктопа которому она принадлежит и запускал ее из-под сервиса. В итоговом файле было "WinSta0\\Default", т.е проблема вероятно не в этом.
    После логона программы запускаются и ведут себя так же как и до логона.

  4. 5
    Vitaly Martynovich ответил:

    Полагаю рисует не на том десктопе или чтото подобное. Попробуйте в процессе вручную назначить десктоп до создания какихлибо окон (SetThreadDesktop & OpenDesktop) и посмотреть что они вернут. Или подождать до логона и выполнить вышеописанное.

  5. 4
    Мопедий Дрынов ответил:

    Сервис может стартовать от любого юзера, в менеджере сервисов задается имя и пароль юзера.
    функция WTSQueryUserToken работает только из-под учетки SYSTEM, я пробовал ее. Привилегию SE_ASSIGNPRIMARYTOKEN_NAME тоже может назначить толькоSYSTEM. С правами я все перепробовал, от безнадеги наделял процесс практичаски всеми возможными привилегиями :) – не помогло

  6. 3
    Cyber Max ответил:

    Гы. гы… наскольно я помню сервис какраз стартует под правами SYSTEM, а не какого либо юзера.
    Вообще была подобная задача, но там процесс нужно было запустить из сервиса в опреленной RDP сессии на Терминальном сервере.
    Использовалась функция CreateProcessAsUser() и перед этим разрешались привелегии SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME + Токен на сессию получали с помощью WTSQueryUserToken

  7. 2
    Мопедий Дрынов ответил:

    Я с разными пробовал – одна фигня

  8. 1
    Влад Темный ответил:

    любая прога так себя ведет или только одна та?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.