Как определить, требуется ли для исполняемого файла повышение прав UAC (префикс C #)

2

Как я могу определить, требует ли исполняемый файл UAC? До сих пор я пришел к двум идеям: распознавание значка исполняемого файла для проверки наличия на нем значка экрана UAC и информация из Википедии: http://en.wikipedia.org/wiki/User_Account_Control

можно программно определить, будет ли исполняемый файл требовать возвышения с помощью CreateProcess() и установки параметра dwCreationFlags в CREATE_SUSPENDED. Если требуется возвышение, то возвращается ERROR_ELEVATION_REQUIRED. [16] Если возвышение не требуется, будет возвращен код возврата успеха, с которого вы можете использовать TerminateProcess() для вновь созданного приостановленного процесса. Это не позволит вам обнаружить, что исполняемый файл требует повышения, если вы уже выполняете повышенный процесс.

Спасибо

  • 4
    Обратите внимание, что значок щита накладывается поверх собственного значка исполняемого файла в проводнике Windows, поэтому фактически извлечение значка из исполняемого файла и проверка его не будут работать. (Кроме того, это, вероятно, не очень хороший подход в любом случае ...)
  • 0
    Зачем тебе это нужно? Можете ли вы дать больше контекста? Обычно вам не нужно заботиться о том, требует ли прогресс повышения, потому что ОС позаботится об этом за вас. Также почти невозможно поймать все случаи. (Например, сам процесс может запускаться без UAC, а затем, в зависимости от командной строки, вручную повышать COM-объект во время запуска. Вы не можете сказать, будет ли он делать это заранее без написания процессора и эмулятора Windows :).)
Теги:
file
uac

3 ответа

3
Лучший ответ

Попробуйте использовать функцию CheckElevation, экспортированную kernel32.dll. Это полностью недокументированная функция, но вот то, что мне удалось перепроектировать:

ULONG CheckElevation(
    __in PWSTR FileName,
    __inout PULONG Flags, // Have a ULONG set to 0, and pass a pointer to it
    __in_opt HANDLE TokenHandle, // Use NULL
    __out_opt PULONG Output1, // On output, is 2 or less.
    __out_opt PULONG Output2
    );

Вам нужно будет провести некоторое экспериментирование, чтобы узнать, как правильно вызвать функцию. До сих пор мне удалось разобраться, что если Output1 не равен 0, требуется возвышение.

  • 0
    Бесполезно предлагать недокументированные функции, которые могут быть недоступны в будущей версии Win, могут изменить подпись или изменить поведение. Я бы назвал это развитие удачей, а не знанием.
3

Почему вы хотите использовать распознавание изображений, если его можно проверить программно? Вы можете использовать P/invoke для вызова CreateProcess с нужными параметрами.

0

Лучший способ - проанализировать его формат PE, а затем узнать, требует ли его файл манифеста UAC.

http://weblogs.asp.net/kennykerr/archive/2007/07/10/manifest-view-1-0.aspx?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+KennyKerr+(Kenny+Kerr)

Не знаю, как Кенни написал код, но он показывает возможность.

  • 0
    Это не охватывает все случаи. Windows автоматически требует повышения прав для установщиков без манифеста тоже.
  • 0
    Нет общедоступной информации, чтобы вы знали, как UAC проверяет установщики. technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx Я полагаю, вы прочитали раздел «Технология обнаружения установщика». Это все, что предлагает Microsoft.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню