在Windows 7中,注册表中的RUNASADMIN似乎无法正常工作

10

我的程序安装器一直使用下面的代码来使我的应用以管理员权限运行。但似乎在Windows 7下没有效果,在Vista中却非常有效。如果我右键单击快捷方式并告诉它以管理员身份运行,程序将会正常启动。但是通过以下方式,代码应该始终以此方式运行程序,但现在不再起作用了。有人知道Win 7是否仍在使用此密钥吗?UAC也开启了。

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

12

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

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

无论如何,我遇到了同样的问题,试图将可执行文件的权限级别设置为以管理员身份运行。我们知道我们可以使用GUI设置它:

  • 右键单击快捷方式或.EXE文件,选择 属性
  • 单击 兼容性 选项卡
  • (此时,您可以为自己或所有用户设置特权级别;我更喜欢为所有用户进行设置)
  • 单击按钮,更改所有用户的设置
  • 一个新的属性窗口打开,标题为“所有用户的兼容性”
  • 在特权级别下,勾选“以管理员身份运行此程序”,点击几次 OK 以保存更改。

当更改保存后,您会在注册表中找到该设置:

[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脚本编写

所有这些方法都做了同样的事情。注册表已更改,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部分进行注册表更改。

我不知道发生了什么,但它正在运行。


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/


谢谢lextm。我不知道可以为我没有创建的exe文件制作清单文件。或者它们也不必被嵌入。感谢提供链接。 - JimDel
@JimDel:所有这些链接似乎都与嵌入清单有关。你在哪里看到我如何“为我没有创建的exe文件”执行它? - Pete

1

在Win7中,RUNASADMIN被放置在键中: 当使用Install Shield 5.1时,在HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers中的值会被复制到appcpmctflgsin wow6432nodeexe实际上无法以管理员身份运行。


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-32位上效果很好,但在64位版本上无法正常工作!我发现在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 32位,Win 8 32位,Win 8.1 64位)。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接