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).