Я пытаюсь проверить, запущен ли процесс, запущенный из службы.Проверьте (как обычный пользователь), если выполняется процесс администрирования (C, Windows)
Проблема в том, что мы переносим наше приложение из Windows XP в Windows 7. Одной частью этого приложения является служба, которая запускает некоторые процессы. Другая часть - диалоговое приложение. Это диалоговое приложение пытается узнать, запущены ли процессы из службы. Pids процессов хранятся в общей памяти, поэтому я могу обработать дескриптор с помощью OpenProcess()
от WinApi, и это работает на Windows XP. Если я попытаюсь сделать это в Windows 7, функция даст мне ошибку - доступ запрещен.
Я думаю, что я знаю, почему так (новая изоляция уровня 0 в Windows7), но мне нужно найти некоторое обходное решение.
Мой вопрос в том, есть ли возможность установить права доступа для созданного процесса и как (пожалуйста, дайте мне пример с объяснением)?
Я нашел, что есть параметр в CreateProcess()
и есть функция SetSecurityInfo()
, но я использую эти функции, вероятно, плохо, потому что не работает.
Чтобы проверить, если процесс запущен я
running = (WaitForSingleObject(handle, 0) == WAIT_TIMEOUT);
или
BOOL result = GetExitCodeProcess(handle, (LPDWORD) &code);
if(result) {
if(code == STILL_ACTIVE) {
running = true;
}
}
где handle
берется из функции OpenProcess()
- OpenProcess(PROCESS_ALL_ACCESS , FALSE, pid);
Я также попытался с SYNCHRONIZE
, PROCESS_QUERY_INFORMATION
и PROCESS_QUERY_LIMITED_INFORMATION
, Но всегда доступ запрещен ..
Любая идея будет полезна.
Вы можете вызвать ['ControlService'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682108%28v=vs.85%29.aspx) с помощью пользовательского элемента управления код, который обрабатывается в службе ['HandlerEx'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683241%28v=vs.85%29.aspx). – eryksun
@eryksun: правда, я об этом не думал. Хотя это потребует изменения разрешений на услугу. –
@HarryJohnston - Знаете ли вы, насколько опасно это (изменение разрешений на процесс)? Я бы хотел только сделать эту операцию 'PROCESS_QUERY_INFORMATION'. Я думаю, что 'QueryServiceStatusEx()' не будет работать. Моя служба запускает другие процессы, и мне нужно проверить статус одного из этих процессов. – michalp