Ситуация следующая:
Есть сервис, стартующий до логона, работающий от имени какого-либо юзера (но не от 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);
Прога стартует нормально, работает. Но когда юзер логонится, он не видит окна проги. Точнее видит, просто ее окно не перерисовывается. как будтооно игнорит сообщения перерисовки, но сообщения мыши обрабатываются (порой проскакивают изображения различных контролов и по ним можно кликнуть).
В чем может быть трабл?
3 августа 2009 в 19:05
На счет интерактивности я в курсе, вот хотелось бы обойти это ограничение)
3 августа 2009 в 12:02
А на сколько я знаю, если сервис не интерактивный, то не может ничего выводить и не может запускать интерактивные программы, а если он интерактивный, то всё равно не может просто так выводить своих окон на рабочем столе залогиневшегося пользователя.. для этого обычно проверяют залогинился ли какой-нибудь пользователь и пытаются породить процесс уже от его имени и его привилегий.. с помощью той же функции CreateProcessAsUser..
1 августа 2009 в 19:01
Запускаемая программа принадлежит интерактивному десктопу
Во-первых я непосредственно в структуре STARTUPINFO задаю si.lpDesktop=L"WinSta0\\Default"
Во-вторых я писал мелкую тестовую программу, которая записывала в файл название десктопа которому она принадлежит и запускал ее из-под сервиса. В итоговом файле было "WinSta0\\Default", т.е проблема вероятно не в этом.
После логона программы запускаются и ведут себя так же как и до логона.
1 августа 2009 в 18:04
Полагаю рисует не на том десктопе или чтото подобное. Попробуйте в процессе вручную назначить десктоп до создания какихлибо окон (SetThreadDesktop & OpenDesktop) и посмотреть что они вернут. Или подождать до логона и выполнить вышеописанное.
1 августа 2009 в 12:03
Сервис может стартовать от любого юзера, в менеджере сервисов задается имя и пароль юзера.
функция WTSQueryUserToken работает только из-под учетки SYSTEM, я пробовал ее. Привилегию SE_ASSIGNPRIMARYTOKEN_NAME тоже может назначить толькоSYSTEM. С правами я все перепробовал, от безнадеги наделял процесс практичаски всеми возможными привилегиями – не помогло
1 августа 2009 в 12:00
Гы. гы… наскольно я помню сервис какраз стартует под правами SYSTEM, а не какого либо юзера.
Вообще была подобная задача, но там процесс нужно было запустить из сервиса в опреленной RDP сессии на Терминальном сервере.
Использовалась функция CreateProcessAsUser() и перед этим разрешались привелегии SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME + Токен на сессию получали с помощью WTSQueryUserToken
1 августа 2009 в 11:02
Я с разными пробовал – одна фигня
1 августа 2009 в 9:04
любая прога так себя ведет или только одна та?