RUNASADMIN в реестре, похоже, не работает в Windows 7
некоторое время установщик моей программы использовал приведенный ниже код для запуска моего приложения с правами администратора. Но это видимо не действует под Windows 7. В Vista он работал красиво. Если я щелкну Правой Кнопкой Мыши ярлык и скажу, чтобы он запускался как администрирование, программа запустится нормально. Но, используя приведенный ниже код, его следует заставить запускать программу таким образом все время. Теперь уже нет. Кто-нибудь знает, использует ли Win 7 Этот ключ? ОАК тоже по путь.
Registry.SetValue(@"HKEY_CURRENT_USERSoftwareMicrosoftWindows NT
CurrentVersionAppCompatFlagsLayers", "C:Appapp.exe", "RUNASADMIN");
спасибо.
5 ответов
Я использую Windows 7, и я вижу такие ключи. Однако я не думаю, что это правильный способ настройки вашего приложения и установщика.
моя рекомендация заключается в том, что вы распространяете файл манифеста вместе с вашим приложением (app.исполняемый.) Файл манифеста может быть даже встроен в исполняемый файл легко, если вы используете Visual Studio 2008 с. Затем в файле манифеста вам может потребоваться администратор права.
http://msdn.microsoft.com/en-us/library/bb756929.aspx
http://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx
у меня есть ответ/решение для этого вопроса.
во-первых, я не согласен (с уважением) с комментарием, что использование AppCompatFlags не является "правильным способом настройки вашего приложения и установщика."Изменение этого раздела реестра-это просто зеркальное отображение с помощью графического интерфейса Windows для изменения уровня привилегий исполняемого файла. Я считаю, что этот метод проще реализовать, чем добавить файл манифеста. Если пользователь хочет изменить уровень привилегий, чтобы не работать Администратор, они могут сделать это легко с GUI.
во всяком случае, у меня была такая же проблема с попыткой установить уровень привилегий исполняемого файла для запуска от имени администратора. Мы знаем, что мы можем установить его с помощью GUI:
- щелкните правой кнопкой мыши на ярлык или .EXE-файл и выберите Свойства
- перейдите на вкладку Совместимость
- (в этот момент Вы можете установить уровень привилегий только для вас или для всех пользователей, я предпочитаю делать это для всех пользователи)
- Нажмите кнопку, измените настройки для всех пользователей
- откроется новое окно свойств с вкладкой "совместимость для всех пользователей"
- в разделе Проверка уровня привилегий на "запуск этой программы от имени администратора" нажмите OK несколько раз, чтобы сохранить изменения.
когда изменения будут сохранены, вы найдете параметр в реестре:
[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.exe для изменения реестра
- используется ныне несуществующий Wise Script tool
- Используется В AutoIt Скриптов
все эти методы сделали то же самое. Реестр был изменен, и GUI показал, что программа должна работать от имени администратора, но программа никогда не работает от имени администратора.
исправление, для эта проблема, на которую я наткнулся, - это пойти вперед и изменить оба 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 для последующего пользователя.
Я не знаю, что здесь происходит, но это работает.
в win7,RUNASADMIN
ПОМЕЩАЕТСЯ В КЛАВИШУ :
когда HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
используя install shield 5.1, значения копируются в appcpmctflgsin wow6432node
и exe
actualy falis для запуска от имени администратора.
этот ответ Робен работает "для exe-файла, который я не создавал", который вы выразили как интерес к вашему комментарию ответ Лекса ли. Он использует вашу оригинальную идею реестра.
два, возможно, существенных изменений:
- С 32-битной ОС мне не нужно беспокоиться о
Wow6432Node
(озабоченность, упомянутая "uss") - С помощью
HKLM
вместоHKCU
, мне не нужно беспокоиться о том, что пользователь выполняет приложение (озабоченность, упомянутая Лео).
Я использовал 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-битной победе (проходит через 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 32Bit, Win 8 32Bit, Win 8.1 64Bit).