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

标签 c# windows-7 uac

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

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

谢谢。

最佳答案

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

首先,我不同意(恭敬地)使用 AppCompatFlags 不是“配置应用程序和安装程序的正确方法”的评论。修改注册表的这一部分只是使用 Windows GUI 进行镜像以更改可执行文件的特权级别。我发现这种方法比添加 list 文件更容易实现。如果用户想要或需要将权限级别更改为不以管理员身份运行,他们可以使用 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 部分的注册表更改。

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

关于c# - 注册表中的 RUNASADMIN 似乎在 Windows 7 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1726048/

相关文章:

.net - 适用于 .NET 4.5 的 Windows 7 SDK?

uac - 了解 Windows Vista/7 上的 UAC

c# - 只有当应用程序以管理员身份运行时,才能在 Windows 7 中正确读取对应用程序配置所做的更新

c# - 仅在父元素可见时启用 RequiredFieldValidator?

c# - 如何在 Reactive Extensions 中实现并行 Fan-out 处理?

git - 如何从命令窗口打开 Git GUI?

c++ - 使用 RasDial 建立 VPN 连接后,是否要防止网络定位向导弹出?

vba - 在 Windows 7 中保存 Excel 加载项

c# - 如何修改框架的默认 Web API 路由?

C# 3.0 隐式转换错误与泛型类和接口(interface)