#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/… >: . В конце этой страницы есть раздел с заголовком: Защищенные процессы. Кажется, я получаю исключение для этих защищенных процессов.