2015-02-17 3 views
2

Я пытаюсь проверить, запущен ли процесс, запущенный из службы.Проверьте (как обычный пользователь), если выполняется процесс администрирования (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 , Но всегда доступ запрещен ..

Любая идея будет полезна.

ответ

1

Проблема не в изоляции сеанса 0 (которая не влияет на объекты процесса), а на UAC. В Windows XP пользовательский процесс, вероятно, имел административную привилегию и поэтому мог делать то, что ему нравилось. В Windows 7 вам нужно будет использовать «run as admin», чтобы получить тот же уровень привилегий.

Вы не должны путаться с разрешениями процесса, это слишком опасно. Вместо этого, поскольку у вас уже есть механизм IPC (разделяемая память), вы можете получить услугу, чтобы проверить, что процессы запущены, и отчитываться перед пользовательским процессом.

Один из способов запуска службы для выполнения проверки заключается в использовании QueryServiceStatusEx() для запроса статуса услуги. Вы можете получить подпрограмму обработчика сервиса, чтобы проверить, что процессы запущены и отчитываются через блок разделяемой памяти.

+0

Вы можете вызвать ['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

+0

@eryksun: правда, я об этом не думал. Хотя это потребует изменения разрешений на услугу. –

+0

@HarryJohnston - Знаете ли вы, насколько опасно это (изменение разрешений на процесс)? Я бы хотел только сделать эту операцию 'PROCESS_QUERY_INFORMATION'. Я думаю, что 'QueryServiceStatusEx()' не будет работать. Моя служба запускает другие процессы, и мне нужно проверить статус одного из этих процессов. – michalp

Смежные вопросы