С предоставленной информацией не будет различий в разрешениях между двумя процессами.
Если вы запрашиваете уровень выполнения «requireAdministrator» через манифест приложения, ваше приложение будет запускаться либо с маркером полного доступа администратора, либо не запускаться вообще, если пользователь отказывает в согласии (см. Создание и встраивание манифеста приложения (UAC) для получения дополнительной информации).
То же самое произойдет, когда пользователь выберет Запуск от имени администратора .
Единственное отличие - это способ запуска процесса.Когда вы запускаете исполняемый файл из оболочки, например, дважды щелкнув в проводнике или выбрав Запуск от имени администратора из контекстного меню, оболочка вызовет ShellExecute
, чтобы фактически запустить выполнение процесса.Весь процесс возвышения скрыт внутри этой функции.Кенни Керр более подробно описывает этот процесс в Windows Vista для разработчиков. Часть 4. Контроль учетных записей пользователей :
ShellExecute сначала вызывает CreateProcess, чтобы попытаться создатьновый процесс.CreateProcess выполняет всю работу по проверке параметров совместимости приложений, манифестов приложений, загрузчиков среды выполнения и т. Д. Если он определяет, что приложение требует повышения прав, но вызывающий процесс не повышен, то CreateProcess завершается ошибкой с ошибкой ERROR_ELEVATION_REQUIRED.Затем ShellExecute вызывает службу Application Information для обработки запроса на повышение прав и создания процесса с повышенными правами, поскольку вызывающий процесс, очевидно, не имеет необходимых разрешений для выполнения такой задачи.Служба Application Information в конечном счете вызывает CreateProcessAsUser с токеном администратора без ограничений.
Если, с другой стороны, вы хотите создать процесс с повышенными правами независимо от того, какая информация о приложении доступна, вы можете указать малоизвестный глагол «runas»с ShellExecute.В результате запрашивается повышение прав независимо от того, что может предписывать манифест приложения и информация о совместимости.Глагол runas на самом деле не нов в Windows Vista.Он был доступен в Windows XP и Windows 2003 и часто использовался для создания ограниченного токена непосредственно из оболочки.Это поведение, однако, изменилось.Вот простой пример:
::ShellExecute(0, // owner window
L"runas",
L"C:\\Windows\\Notepad.exe",
0, // params
0, // directory
SW_SHOWNORMAL);
Таким образом, по сути, запуск исполняемого файла с использованием опции Запуск от имени администратора означает, что ShellExecute
обходит проверки настроек совместимости, манифестов приложения и т. Д.и напрямую запрашивает повышение прав.
Статья Кенни Керра также содержит пример кода для запроса токена текущего процесса на предмет его разрешения с помощью функции OpenProcessToken
.Возможно, вы сможете использовать пример, чтобы определить, что нет различий в том, как ваш процесс повышен.
Мне определенно любопытно узнать, какие различия вы наблюдаете, так как я сильно сомневаюсь, что они связаны с повышением.
И последнее: можете ли вы дважды проверить, действительно ли вы запрашиваете уровень requireAdministrator , а не по ошибке только уровень самый высокийAvailable ?