Я хотел бы отслеживать процессы с повышенными правами, запущенные на машине, когда пользователь без прав администратора вошел в систему.
По сути, я хочу запустить следующий искусственный код из С#:
var elevatedWindows = Process.GetProcesses().Where(p => p.IsElevated || p.ChildWindows.Any(cw => cw.IsElevated));
До сих пор единственное, что я нашел, чтобы дать мне информацию, которую я хочу, похоже, это ОШИБКА в классе .NET System.Diagnostics.Process, как описано здесь:
http://www.codeproject.com/Articles/302856/Bugs-in-System-Diagnostics-Process-Class
Если я правильно понимаю, в статье говорится, что если моя программа не работает с повышенными правами, она сгенерирует исключение WIN32 с NativeErrorCode
, равным 5, если вы попытаетесь получить свойства StartTime
или HasExited
процесса с повышенными правами. Я чувствую, что это может быть простым обходным путем для моей проблемы — попробуйте получить StartTime
или HasExited
из программы без повышенных прав, и если она выдает эту ошибку, это процесс с повышенными правами.
Проблема в том, что я не могу заставить это работать надежно, HasExited
ошибки ненадежны, когда я вручную щелкнул правой кнопкой мыши блокнот и выбрал «Запуск от имени администратора» и использовал GetProcessesByName("notepad")
Еще более неприятным является то, что я не могу изолировать отдельные Windows Explorer. Explorer.exe всегда запущен и может быть повышенным, но даже если он работает БЕЗ повышения, вы все равно можете вручную запустить процесс с повышенными правами несколькими различными способами, ни один из которых не влияет на родительский проводник. экзешный процесс.
Итак, я думаю, мне нужно найти WindowHandles из порожденных процессов или их дочерних потоков и как-то посмотреть, поднято ли окно?
Любая помощь будет оценена по достоинству.
explorer.exe
. - person SLaks   schedule 10.09.2015