Process.GetProcesses() ГДЕ process.IsElevated?

Я хотел бы отслеживать процессы с повышенными правами, запущенные на машине, когда пользователь без прав администратора вошел в систему.

По сути, я хочу запустить следующий искусственный код из С#:

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 из порожденных процессов или их дочерних потоков и как-то посмотреть, поднято ли окно?

Любая помощь будет оценена по достоинству.


person epicTurk    schedule 10.09.2015    source источник
comment
Открытие окна Проводника от имени администратора вызовет второй процесс explorer.exe.   -  person SLaks    schedule 10.09.2015
comment
Интересно, есть ли способ узнать, какой процесс проводника был повышен, и получить дескрипторы окон любых окон проводника, созданных из проводника с повышенными правами, а не из окна без повышенных прав?   -  person epicTurk    schedule 10.09.2015


Ответы (1)


Не уверен, что понимаю, что вы подразумеваете под «повышенным окном». Повышен процесс, а не его окна. Запуск нового представления Проводника порождает новый процесс.

Тем не менее, вы можете использовать Interop, чтобы определить, является ли процесс повышенным или нет:

  • Чтобы получить дескриптор процесса
  • Позвоните OpenProcessToken, чтобы открыть токен доступа, связанный с вашим процессом
  • Затем используйте что-то вроде следующего с GetTokenInformation

Код :

public enum ElevationType
{
    Default = 1,
    Full = 2,
    Limited = 3
}

// Do add some exception handling...etc.
public static ElevationType GetProcessElevationTypeByTokenHandle(IntPtr hTok)
{
    if (hTok.IsNotNull)
    {
        // Get token information struct length
        // See https://msdn.microsoft.com/en-us/library/windows/desktop/aa379626(v=vs.85).aspx for constants
        int ret = 0;
        GetTokenInformation(hTok, TokenInformationClass.TokenElevationType, IntPtr.Zero, 0, ret);
        IntPtr tokenInformation = Marshal.AllocHGlobal(ret);

        // Get token information struct
        // With then TokenElevationType constant, it will returns a TOKEN_ELEVATION_TYPE value
        // See https://msdn.microsoft.com/en-us/library/windows/desktop/bb530718(v=vs.85).aspx
        GetTokenInformation(hTok, TokenInformationClass.TokenElevationType, tokenInformation, ret, null);

        // Get a valid structure
        var value = Marshal.ReadInt32(tokenInformation, 0);
        Marshal.FreeHGlobal(tokenInformation);
        return (ElevationType)value;
    }
    else
    {
        return ElevationType.Default;
    }
}
person ken2k    schedule 11.09.2015
comment
Спасибо за сообщение и пример кода, ken2k - у меня не было возможности реализовать или протестировать его, но я с нетерпением жду возможности отметить это как ответ, если он сработает :-) - person epicTurk; 16.09.2015
comment
Работает! Любая идея, если ElevationType.Default где-то имеет явное определение или оно связано с контекстом вошедшего в систему пользователя? - person epicTurk; 29.09.2015