У меня есть ответ / обходной путь для этого вопроса.
Прежде всего, я не согласен (с уважением) с комментарием о том, что использование AppCompatFlags не является «правильным способом настройки приложения и установщика». Модификация этого раздела реестра - это просто зеркалирование с использованием графического интерфейса Windows для изменения уровня привилегий исполняемого файла. Я считаю, что этот метод проще реализовать, чем добавить файл манифеста. Если пользователь хочет или должен изменить уровень привилегий, чтобы он не запускался от имени администратора, он может легко сделать это с помощью графического интерфейса.
В любом случае, у меня возникла та же проблема: попытаться установить уровень привилегий исполняемого файла на Запуск от имени администратора. Мы знаем, что мы можем установить его с помощью графического интерфейса:
- Щелкните правой кнопкой мыши по ярлыку или .EXE-файлу и выберите Свойства
- Перейдите на вкладку «Совместимость»
- (На данный момент вы можете установить уровень привилегий только для вас или для всех пользователей; я предпочитаю делать это для всех пользователей)
- Нажмите кнопку, Изменить настройки для всех пользователей
- Открывается новое окно свойств с вкладкой «Совместимость для всех пользователей»
- В разделе «Уровень привилегий» «Запускать программу от имени администратора» пару раз нажмите кнопку ОК, чтобы сохранить изменения.
Когда изменения будут сохранены, вы найдете настройки в реестре:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN"
Когда я настраиваю .exe
для запуска в качестве администратора с использованием графического интерфейса таким образом, он всегда работает.
Однако всякий раз, когда я пытался изменить реестр напрямую, не обращаясь к графическому интерфейсу, программа просто не запускалась от имени администратора. Реестр показывает, что я внес изменение, и когда я смотрю на Уровень привилегий для исполняемого файла, Запуск от имени администратора проверяется как на.
Я пробовал несколько разных способов заставить .exe
работать от имени администратора, просто изменив реестр:
- Вручную отредактировал реестр с помощью regedit
- Импортированы изменения из файла
.reg
- Использовал инструмент командной строки reg.exe для изменения реестра
- Использовал теперь уже не существующий инструмент Wise Script
- Используется AutoIT Scripting
Все эти методы делали одно и то же. Реестр был изменен, и графический интерфейс пользователя показал, что программа должна работать от имени администратора, но программа никогда не запускается от имени администратора.
Устранение этой проблемы, с которой я столкнулся, заключается в том, чтобы пойти дальше и изменить как клавишу HKCU
, так и клавишу HKLM
с настройкой.
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN"
Если вы измените оба этих раздела реестра, .exe
будет работать от имени администратора. Что еще более важно, если другой пользователь входит в систему на ПК, программа будет запускаться от имени администратора. Это несмотря на то, что в разделе HKCU для следующего пользователя не было внесено изменение в реестр.
Я не знаю, что здесь происходит, но это работает.