2015-09-10 2 views
0

Я хотел бы, чтобы следить за повышенных процессов, запущенных на компьютере, а не административно-пользователь вошел в системуProcess.GetProcesses() WHERE process.IsElevated?

В принципе, я хочу, чтобы запустить следующий выдуманный код из C#:.

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")

Еще более трудным является Я не могу изолировать отдельные окна Explorer. Explorer.exe всегда работает, и может быть добавлен, но даже если он работает БЕЗ повышения, вы все равно можете вручную запустить процесс как повышенный ряд различных способов, ни один из которых не влияет на процесс parent explorer.exe.

Так что, я думаю, мне нужно найти WindowHandles из порожденных процессов или их дочерних потоков и как-нибудь посмотреть, поднято ли окно?

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

+0

Открытие окна проводника в качестве администратора вызовет процесс _second_ 'explorer.exe'. – SLaks

+0

Интересно, есть ли способ определить, какой процесс проводника был повышен, и получить окна с любыми окнами fileexplorer, порожденными из повышенного explorer.exe, а не без приподнятого? – TaterJuice

ответ

1

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

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

  • вызова OpenProcess, чтобы получить дескриптор процесса
  • вызова 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; 
    } 
} 
+0

Спасибо за сообщение и пример кода, ken2k - у меня не было возможности реализовать или протестировать его, но я с нетерпением жду, чтобы отметить это как ответ, если он работает :-) – TaterJuice

+0

Работает! Любая идея, если ElevationType.Default имеет явное определение где-то, или это относительно входного контекста пользователя? – TaterJuice

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