Как я могу использовать Процесс.Класс приоритета для некоторых процессов, которые выполняются под системной учетной записью и которые выдают исключение «Доступ запрещен»?

#c# #.net #vb.net

Вопрос:

У меня есть требование отображать категорию приоритета всех процессов, запущенных на компьютере, через приложение WinForms. Мое приложение Winforms запускается от имени администратора, указанного в манифесте приложения. В настоящее время я использую Process.PriorityClass для получения категории приоритета, и она отлично работает для большинства процессов; но для некоторых процессов, таких как csrss, smss, Реестр, система, Wininit и т. Д., При их использовании Process.PriorityClass возникает исключение: «Доступ запрещен», которое происходит по адресу System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited) . Я замечаю, что эти процессы выполняются под СИСТЕМНОЙ учетной записью. Я также видел, что это исключение не возникает во всех процессах, запущенных под СИСТЕМНОЙ учетной записью.

В настоящее время, когда это исключение возникает при доступе Process.PriorityClass к любому процессу, я обхожу его, чтобы получить PriorityClass для них вызов P/INVOKE GetPriorityClass() kernel32.dll , который работает достаточно хорошо, но мне не нравится переключение на неуправляемый код.

Мой вопрос заключается в следующем: Есть ли способ, который я могу использовать Process.PriorityClass для получения категории приоритета для этих процессов, которые выполняются под СИСТЕМНОЙ учетной записью и которые в настоящее время создают исключение?

Комментарии:

1. Process.PriorityClass уже вызывает GetPriorityClass() и получает доступ к вызывающему процессу OpenProcess() , устанавливая PROCESS_QUERY_INFORMATION в качестве права доступа единственное доступное для вызова GetPriorityClass() . Прямое ПИнвокинг должно дать вам такое же исключение отказа в доступе-В любом случае, можете ли вы показать свой код? Более конкретно, как заставить дескриптор процесса вызывать GetPriorityClass() без исключений, пытаясь открыть, например, Системный процесс?

2. Дело в том, что для этих процессов, которые создают исключение, при использовании P/Invoke я должен передать PROCESS_QUERY_LIMITED_ИНФОРМАЦИЮ в качестве прав доступа при использовании OpenProcess(). Использование PROCESS_QUERY_INFORMATION вызывает исключение.

3. Тогда нет никаких проблем. Вы в любом случае вызываете P/, напрямую или с помощью Process.PriorityClass : тот же вызов GetPriorityClass() (если вы используете .Net Framework).

4. Я имею в виду, это вопрос переносимости ? Вот почему вы пытаетесь избежать вызова функции Win32? Вы тестировали .Net 5 или .Net Core 3.1?

5. Я думаю, что знаю, в чем причина проблемы. См. <a href=» this docs.microsoft.com/en-us/windows/win32/procthread/… >: . В конце этой страницы есть раздел с заголовком: Защищенные процессы. Кажется, я получаю исключение для этих защищенных процессов.