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

时间:2009-11-12 23:10:15

标签: c# windows-7 uac

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

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

感谢。

5 个答案:

答案 0 :(得分:9)

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

首先,我不同意(尊重地)使用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"

当我以这种方式使用GUI将.exe设置为以管理员身份运行时,它始终有效。

但是,每当我尝试直接更改注册表而不通过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部分。

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

答案 1 :(得分:6)

我正在使用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 :(得分:1)

在win7中

RUNASADMIN放在关键位置: 当HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers使用安装盾5.1时,值会被复制到appcpmctflgsin wow6432nodeexe实际的falis以管理员身份运行。

答案 3 :(得分:1)

This answer by RobeN适用于“我没有创建的exe文件”,您表示对Lex Li's answer的评论感兴趣。它使用您原来的注册表构思。

两个可能相关的差异:

  1. 使用32位操作系统,我无需担心Wow6432Nodea concern mentioned by "uss"
  2. 使用HKLM代替HKCU,我无需担心哪个用户正在执行该应用程序(a concern mentioned by Leo)。

答案 4 :(得分:1)

我使用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上创建条目! 经过一番研究(感谢我的朋友H.Toosi先生),我们找到了正确的解决方案 只需在这样的早期命令结束时加/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位)中一切正常。