注册表中的RUNASADMIN似乎无法在Windows 7中运行

一段时间以来,我的程序的安装程序使用以下代码使我的应用程序以管理员权限运行。 但它似乎在Windows 7下没有任何效果。在Vista中它运行得很漂亮。 如果我右键单击快捷方式并告诉它以管理员身份运行,程序将正常启动。 但是通过使用下面的代码,它应该一直以这种方式运行程序。 它不再了。 有谁知道Win 7是否仍然使用此密钥? UAC也是顺便提一下。

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

谢谢。

我使用的是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/

我有这个问题的答案/解决方法。

首先,我不同意(尊重地)使用AppCompatFlags不是“配置应用程序和安装程序的正确方法”的评论。 修改注册表的这一部分只是使用Windows GUI镜像来更改可执行文件的权限级别。 我发现这个方法比添加清单文件更容易实现。 如果用户想要或需要将权限级别更改为不以管理员身份运行,则可以使用GUI轻松完成。

无论如何,我有同样的问题,试图将可执行文件的权限级别设置为以管理员身份运行。 我们知道我们可以使用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更改注册表
  • 使用现已解散的Wise Script工具
  • 使用AutoIT Scripting

所有这些方法都做了同样的事情。 注册表已更改,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将以管理员身份运行。 更重要的是,如果其他用户登录到PC,程序将以管理员身份运行。 尽管注册表更改没有为后续用户制作HKCU部分。

我不知道这里发生了什么,但它正在发挥作用。

在win7中, RUNASADMIN放置在KEY中:当HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers使用安装盾5.1时,将值复制到appcpmctflgsin wow6432nodeexe actualy falis以运行为管理员。

RobeN的这个答案 “用于我没有创建的exe文件”,你表达了对Lex Li答案的评论。 它使用您原来的注册表构思。

两个可能相关的差异:

  1. 使用32位操作系统,我不必担心Wow6432Node ( “uss”提到的一个问题 )
  2. 通过使用HKLM而不是HKCU ,我不必担心哪个用户正在执行该应用程序( Leo提到的一个问题 )。

我使用CMD使用以下命令将此条目添加到Registry中:

 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上创建条目!
经过一番研究(感谢我的朋友H.Toosi先生),我们找到了正确的解决方案。
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 64位)中一切正常。