'__COMPAT_LAYER' 实际上是用来做什么的?

32

最近,我试图在系统不弹出"您是否想要授予管理员权限?"的情况下给我的应用程序管理员权限,并且我找到了一个完美运行的方法。

我发现的解决方案

我创建了一个名为nonadmin.bat的批处理文件,并在其中编写了以下代码:

cmd min C set __COMPAT_LAYER=RunAsInvoker && start "" %1

如果我们将任何.exe文件拖到它上面,它会赋予它们管理员权限(在没有这个批处理文件的情况下,我无法访问环境变量,但是在将文件拖到批处理文件之后,它可以工作)。

问题:

现在我的问题是:

  1. '__COMPAT_LAYER' 实际上是什么意思?它是做什么的?
  2. 如何删除这种东西以便再次要求管理员权限?
  3. 这是否会减少系统安全性?

它做了它所说的。设置兼容选项。你的示例只能在管理员账户下运行。非管理员将会出错。 - user6017774
@Noodles,你能否详细解释一下这三个问题的答案? - Agent_Spock
7
可能应该写成cmd /min /c ...才对? - TripeHound
1
请@Agent_Spock,在cmd中的start后面始终加上"",因为如果%1被引用,则start将把它解释为窗口标题。尝试使用start "C:\Program Files\whatever"start "" "C:\Program Files\whatever"进行比较。 - Benoit
1个回答

57

__COMPAT_LAYER,以及如何使用它
__COMPAT_LAYER是一个系统环境变量,允许您设置兼容性层,这些设置可以在右键单击可执行文件,选择属性,然后转到兼容性选项卡时进行调整。

Imgur

除了你已知的选项外,还有几个选项可供选择:

  • 256Color - 以256种颜色运行
  • 640x480 - 在640x480屏幕分辨率下运行
  • DisableThemes - 禁用视觉主题
  • Win95 - 以兼容Windows 95的模式运行程序
  • Win98 - 以兼容Windows 98/ME的模式运行程序
  • Win2000 - 以兼容Windows 2000的模式运行程序
  • NT4SP5 - 以兼容Windows NT 4.0 SP5的模式运行程序

您可以通过用空格分隔它们来使用多个选项:set "__COMPAT_LAYER=Win98 640x480"

取消__COMPAT_LAYER变量的设置
只要该变量存在,这些设置就会持续存在。当设置该变量的命令提示符关闭或使用命令set __COMPAT_LAYER=手动取消该变量时,该变量将停止存在。

由于您是通过批处理脚本设置变量的,因此一旦您拖放到批处理脚本上的可执行文件完成并关闭脚本,该变量就会自动取消设置。需要注意的是,变量设置会持续到由您选择的可执行文件产生的任何子进程。

使用__COMPAT_LAYER的安全性
将__COMPAT_LAYER设置为RunAsInvoker实际上不会给您管理员权限,如果您没有管理员权限;它只是防止UAC弹出窗口出现,然后以调用它的用户身份运行程序。因此,使用它是安全的,因为您不会神奇地获得管理员权限。

你可以将变量设置为RunAsHighest(仅在具有管理员权限时触发UAC,但如果您没有这些权限,则不会授予管理员权限)或RunAsAdmin(始终触发UAC)。

1
我无法复制您的问题,但正如我在上一句中所说,您应该能够说set __COMPAT_LAYER=RunAsAdmin - SomethingDark
如果它确实是一种只在设置时存在的变量,那么当设置它的命令提示符(以及所有由该提示符拥有的应用程序)关闭时,它应该停止存在。除非他们出于某种原因使用了 setx 或其他东西。 - SomethingDark
在应用代码之前,我无法获取环境变量,因为它提示需要管理员权限。然后我将我的exe文件拖到“nonadmin.bat”上,然后就能够获取环境变量的值了。但是现在当我将“__COMPAT_LAYER”设置为空时,UAC提示框不会出现。我该怎么办? - Agent_Spock
@SomethingDark,我已经将__COMPAT_LAYER设置为RunAsAdmin,但现在我想要我的UAC提示框回来。你能帮我吗? - Agent_Spock
最近我在.NET Core 3.1 WPF应用程序中看到了__COMPAT_LAYER=DetectorsMessageBoxErrors。我从未为该应用程序设置任何兼容性设置。DetectorsMessageBoxErrors是什么意思,它来自哪里? - bitbonk
显示剩余4条评论

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