注册表中的 RUNASADMIN 似乎在 Windows 7 中不起作用

Posted

技术标签:

【中文标题】注册表中的 RUNASADMIN 似乎在 Windows 7 中不起作用【英文标题】:RUNASADMIN in Registry doesnt seem to work in Windows 7 【发布时间】:2010-12-16 02:40:53 【问题描述】:

一段时间以来,我的程序的安装程序使用以下代码使我的应用程序以管理员权限运行。但它似乎在 Windows 7 下没有效果。在 Vista 中它工作得很好。如果我右键单击快捷方式并告诉它以管理员身份运行,程序将正常启动。但是通过使用下面的代码,它应该一直以这种方式运行程序。现在没有了。有谁知道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/

【讨论】:

感谢 lextm。我不知道可以为我没有创建的 exe 文件制作清单文件。或者它们也不必嵌入。感谢您的链接。 @JimDel:所有这些链接似乎都与嵌入清单有关。你在哪里看到我是如何“为我没有创建的 exe 文件”做的?【参考方案2】:

在 win7 中,RUNASADMIN 放置在密钥中: 当 HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers 使用 install shield 5.1 时,这些值将被复制到 appcpmctflgsin wow6432nodeexe 实际上以管理员身份运行。

【讨论】:

【参考方案3】:

This answer by RobeN 为“我没有创建的 exe 文件”工作,您表示对Lex Li's answer 的评论感兴趣。它使用了您最初的注册表想法。

两个可能相关的差异:

    使用 32 位操作系统,我不必担心 Wow6432Node (a concern mentioned by "uss") 通过使用HKLM 而不是HKCU,我不必担心哪个用户正在执行应用程序 (a concern mentioned by Leo)。

【讨论】:

【参考方案4】:

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

首先,我不同意(恭敬地)使用 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 脚本

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

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

【讨论】:

【参考方案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! 上创建条目 经过一番研究(感谢我的朋友 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 64Bit)中一切正常。

【讨论】:

以上是关于注册表中的 RUNASADMIN 似乎在 Windows 7 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio默认以管理员权限打开

2017-2018-2 20179226 《网络攻防》第7周作业

WinApi:无法读取注册表

在Win7 x64环境中将World Wind Java SDK 2.1.0嵌入到Eclipse中的方法

CareerBuddy开展Wind讲座帮助大学生掌握求职技能

64位系统下注册32位dll文件