RUNASADMIN в реестре не работает в Windows 7 - PullRequest
10 голосов
/ 13 ноября 2009

В течение некоторого времени установщик для моей программы использовал приведенный ниже код, чтобы мое приложение работало с правами администратора. Но, похоже, не работает под Windows 7. В Vista это работало прекрасно. Если я щелкну правой кнопкой мыши по ярлыку и скажу, что он запускается от имени администратора, программа запустится нормально. Но, используя приведенный ниже код, необходимо сделать так, чтобы программа работала таким образом все время. Это больше не Кто-нибудь знает, если Win 7 все еще использует этот ключ? UAC, кстати, тоже включен.

Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\
CurrentVersion\AppCompatFlags\Layers", "C:\App\app.exe", "RUNASADMIN");

Спасибо.

Ответы [ 5 ]

9 голосов
/ 24 января 2015

У меня есть ответ / обходной путь для этого вопроса.

Прежде всего, я не согласен (с уважением) с комментарием о том, что использование 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 для следующего пользователя не было внесено изменение в реестр.

Я не знаю, что здесь происходит, но это работает.

6 голосов
/ 13 ноября 2009

Я использую Windows 7 и вижу такие ключи. Однако я не думаю, что это правильный способ настройки вашего приложения и установщика.

Я рекомендую вам распространять файл манифеста вместе с вашим приложением (app.exe). Файл манифеста может быть даже легко встроен в исполняемый файл, если вы используете Visual Studio 2008. Тогда в файле манифеста вам могут потребоваться права администратора.

http://msdn.microsoft.com/en-us/library/bb756929.aspx

http://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx

http://channel9.msdn.com/posts/jmazner/How-To-Tell-Vistas-UAC-What-Privelege-Level-Your-App-Requires/

1 голос
/ 25 ноября 2015

Я использовал CMD для добавления этой записи в реестр, используя следующую команду:

reg ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /t REG_SZ /f /v "C:\Program Files (x86)\MyApp\myapp.exe" /d RUNASADMIN

Это хорошо работает в Win8Pro-32Bit, но не работает в 64-битной версии!
Я обнаружил, что выполнение этой команды на 64-битной Win (запускается через 32-битный установщик в качестве финальной стадии установки) приводит к созданию записи на HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers!
После некоторых исследований (спасибо моему другу мистеру Х. Тоози) мы нашли правильное решение.
ПРОСТО ДОБАВЬТЕ /reg:64 В КОНЦЕ РАННЕЙ КОМАНДЫ, как это:

reg ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /t REG_SZ /f /v "C:\Program Files (x86)\MyApp\myapp.exe" /d RUNASADMIN /reg:64

и все нормально в 32- и 64-битных ОС (Win 7 32-битная, Win 8 32-битная, Win 8.1 64-битная).

1 голос
/ 08 февраля 2014

Этот ответ РобаN работает "для exe-файла, который я не создал", который вы выразили в качестве интереса в своем комментарии к ответ Лекса Ли . Он использует вашу оригинальную идею реестра.

Два возможных значимых различия:

  1. С 32-битной ОС мне не нужно беспокоиться о Wow6432Node ( о проблеме, упомянутой "uss" )
  2. Используя HKLM вместо HKCU, мне не нужно беспокоиться о том, какой пользователь выполняет приложение ( беспокойство, упомянутое Лео ).
1 голос
/ 10 мая 2012

в win7, RUNASADMIN РАЗМЕЩЕН В КЛЮЧЕ: когда HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers с использованием Install Shield 5.1, значения копируются в appcpmctflgsin wow6432node и exe фактически, чтобы работать от имени администратора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...