RUNASADMIN в реестре, похоже, не работает в Windows 7

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

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

Спасибо.

Ответ 1

Я использую 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/

Ответ 2

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

Во-первых, я не согласен (с уважением) с комментарием, что использование AppCompatFlags не является "правильным способом настройки вашего приложения и установщика". Изменение этого раздела реестра просто зеркалирует с помощью графического интерфейса Windows, чтобы изменить уровень привилегий исполняемого файла. Я считаю, что этот метод проще реализовать, чем добавление файла манифеста. Если пользователь хочет или должен изменить уровень привилегий, чтобы он не выполнялся в качестве администратора, они могут легко это сделать с помощью графического интерфейса.

Во всяком случае, у меня была такая же проблема с попыткой установить уровень привилегий исполняемого файла "Запуск от имени администратора". Мы знаем, что мы можем установить его с помощью GUI:

  • Щелкните правой кнопкой мыши ярлык или .EXE файл и выберите "Свойства"
  • Нажмите вкладку "Совместимость"
  • (На этом этапе вы можете установить уровень привилегий только для вас или для всех пользователей, я предпочитаю делать это для всех пользователей)
  • Нажмите кнопку "Изменить настройки для всех пользователей"
  • Открывается новое окно свойств с вкладкой под названием "Совместимость для всех пользователей".
  • В разделе "Уровень привилегий" установите флажок "Запустить эту программу в качестве администратора", нажмите "ОК" пару раз, чтобы сохранить изменения.

Когда изменения сохранены, вы найдете настройки в реестре:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\Program Files (x86)\\My Program\\My Program.exe"="RUNASADMIN"

Когда я устанавливаю .exe для запуска в качестве администратора с помощью GUI таким образом, он всегда работает.

Однако всякий раз, когда я пытался напрямую изменить реестр, не пропуская GUI, программа просто не будет запускаться как администратор. В реестре показано, что я внес изменения, и когда я смотрю на уровень привилегий для исполняемого файла, запустите, поскольку администратор проверен как включен.

Я попробовал несколько разных способов сделать запуск .exe администратором, просто изменив реестр:

  • Вручную отредактировал реестр с помощью regedit
  • Импортировано изменений из файла .reg
  • Используется инструмент командной строки reg.exe для изменения реестра
  • Используется теперь несуществующий мудрый Script инструмент
  • Используемые сценарии AutoIT

Все эти методы сделали то же самое. Реестр был изменен, и графический интерфейс показал, что программа должна запускаться как администратор, но программа никогда не запускается как администратор.

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

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

Ответ 3

в win7, RUNASADMIN РАЗМЕЩАЕТСЯ В КЛЮЧЕ: когда HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers, используя экран установки 5.1, значения копируются в appcpmctflgsin wow6432node и exe actualy falis для запуска как admin.

Ответ 4

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

Два возможных существенных различия:

Ответ 5

Я использовал 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, но не работает в версии 64Bit!
Я обнаружил, что выполнение этой команды в 64-битной Win (выполняется через 32-разрядный установщик в качестве этапа окончательной установки) приводит к созданию записи на HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers!
После некоторых исследований (спасибо моему другу г-ну Х. Тоси) мы нашли правильное решение.
JUST ADD /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 32Bit, Win 8 32Bit, Win 8.1 64Bit).