Привет всем,
Этот вопрос уже поднимался здесь, но к сожалению не все понятео мне. Я не из C++, я из xBase++
Я написал (пишу) в xBase++ сервис по типу Windows Scheduler, но с другими возможностями адоптированными для запуска приложений использующихся в нашей системе. Все наши прилодения xBase GUI и к тому же не все умеют работать с UNC — это как пережитки прошлого.
Сервис мы собираемся запускать из под административного аккаунта или имеющего эти полномочия. Юзера имя и пароль мы тоже знаем. И вот надо запустить приложение. Единственное условие чтобы видеть его на десктопе (а то залипнет или чет там еще) и никто ничего не узнает. Да и если залипло, я буду хотеть его убить, т.е. TerminateProcess после какого-то определяемого для каждого приложения времени ожидания завершения.
Я пытался для этих целей использовать Windows Scheduler. Я знаю что у Scheduler есть COM API, но COM в xBase++ кривой и имеет существенные ограничения в используемых нами версиях. Я подумал о schtasks.exe, но к сожалению он только под XP, а мне без Win2K никуды. По сему мне нужна C++ DLL функия, куда я могу послать параметры с типом DWORD и Char* и все
Народ, мож кто уже имеет готовые куски, или знает где они лежат- pls, пиво гарантируется только в часовой зоне ET GMT-5.00
Заранее благодарен,
Владимир
P.S. Компилировать и строить dll на с++ я уже научился
Re: Запуск GUI приложения из под сервиса
От:
Аноним
Дата:
16.10.05 11:16
Оценка:
Здравствуйте, Яхненко, Вы писали:
Я>Привет всем, Я>Этот вопрос уже поднимался здесь, но к сожалению не все понятео мне. Я не из C++, я из xBase++ Я>Я написал (пишу) в xBase++ сервис по типу Windows Scheduler, но с другими возможностями адоптированными для запуска приложений использующихся в нашей системе. Все наши прилодения xBase GUI и к тому же не все умеют работать с UNC — это как пережитки прошлого. Я>Сервис мы собираемся запускать из под административного аккаунта или имеющего эти полномочия. Юзера имя и пароль мы тоже знаем. И вот надо запустить приложение. Единственное условие чтобы видеть его на десктопе (а то залипнет или чет там еще) и никто ничего не узнает. Да и если залипло, я буду хотеть его убить, т.е. TerminateProcess после какого-то определяемого для каждого приложения времени ожидания завершения. Я>Я пытался для этих целей использовать Windows Scheduler. Я знаю что у Scheduler есть COM API, но COM в xBase++ кривой и имеет существенные ограничения в используемых нами версиях. Я подумал о schtasks.exe, но к сожалению он только под XP, а мне без Win2K никуды. По сему мне нужна C++ DLL функия, куда я могу послать параметры с типом DWORD и Char* и все Я>Народ, мож кто уже имеет готовые куски, или знает где они лежат- pls, пиво гарантируется только в часовой зоне ET GMT-5.00
Я>Заранее благодарен,
Я>Владимир
Я>P.S. Компилировать и строить dll на с++ я уже научился
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Яхненко, Вы писали:
Я>>Привет всем, Я>>Этот вопрос уже поднимался здесь, но к сожалению не все понятео мне. Я не из C++, я из xBase++ Я>>Я написал (пишу) в xBase++ сервис по типу Windows Scheduler, но с другими возможностями адоптированными для запуска приложений использующихся в нашей системе. Все наши прилодения xBase GUI и к тому же не все умеют работать с UNC — это как пережитки прошлого. Я>>Сервис мы собираемся запускать из под административного аккаунта или имеющего эти полномочия. Юзера имя и пароль мы тоже знаем. И вот надо запустить приложение. Единственное условие чтобы видеть его на десктопе (а то залипнет или чет там еще) и никто ничего не узнает. Да и если залипло, я буду хотеть его убить, т.е. TerminateProcess после какого-то определяемого для каждого приложения времени ожидания завершения. Я>>Я пытался для этих целей использовать Windows Scheduler. Я знаю что у Scheduler есть COM API, но COM в xBase++ кривой и имеет существенные ограничения в используемых нами версиях. Я подумал о schtasks.exe, но к сожалению он только под XP, а мне без Win2K никуды. По сему мне нужна C++ DLL функия, куда я могу послать параметры с типом DWORD и Char* и все Я>>Народ, мож кто уже имеет готовые куски, или знает где они лежат- pls, пиво гарантируется только в часовой зоне ET GMT-5.00
Я>>Заранее благодарен,
Я>>Владимир
Я>>P.S. Компилировать и строить dll на с++ я уже научился
А>Allow service to interact with desktop
Да, но при этом мой сервис будет использовать LocalSystem account, что не есть приемлимо и при этом мой сервис создает пустое консольное окно, что не есть perfect
Что нужно ли в моем случае использовать CreateProcess или CreateProcessAsUser?
Можно ли использовать runas.exe для этих целей с какими то параметрами?
Allow Interact with desktop можно делать только для LocalSystem. Кстати она не имеет права лезть в сеть.
Используй имперсонацию.
Т.е. запускаешь сервис под LocalSystem , из него порождаешь процесс с необходимыми тебе Credentials.
если система win2k/winxp можешь посмотреть runas сервис.
RST>Allow Interact with desktop можно делать только для LocalSystem.
Это не так. Примеры разрешения доступа к интерактивному десктопу для сервиса, запущенного не из под SYSTEM, тут уже приводились не раз. Используйте поиск.
На машинке может быть запущено несколько сессий (ВинХП или сервер с терминалами)
Если интерактивно работают несколько пользователей, то кому отображать диалог?
Если использовать флаг интерактивность, то диалог появится на рабочем столе того, кто на нулевой сесии
(админ на первой сесии запустил сервис, а морда отобразилась у гося на нулевой сесии. Вот так..)
Советею запускать второе приложение на нужной сесии для интерактивного взаимодействия с пользователем
Здравствуйте, acronim, Вы писали:
A>На машинке может быть запущено несколько сессий (ВинХП или сервер с терминалами) A>Если интерактивно работают несколько пользователей, то кому отображать диалог? A>Если использовать флаг интерактивность, то диалог появится на рабочем столе того, кто на нулевой сесии A>(админ на первой сесии запустил сервис, а морда отобразилась у гося на нулевой сесии. Вот так..) A>Советею запускать второе приложение на нужной сесии для интерактивного взаимодействия с пользователем
Но если я Админ, запустил сервис из своего аккаунта, у меня есть все права. Мне нужен только десктоп. Как мне запускать через CreateProcess() или CreateProcessAsUser() ??
Я пробовал MSDN'овский пример, где сперва логинится юзер затем вешаются его права на "winsta0\default"desktop в параметрах STARTUPINFO. Получил ошибку 1314 — ERROR_PRIVILEGE_NOT_HELD на ХР.
Можно ли как то поменять поставить lpDesktop так чтобы использовать уже существующий админовский десктоп или уж ладно NULL когда этот десктоп недоступен?