【问题标题】:What does '__COMPAT_LAYER' actually do?'__COMPAT_LAYER' 实际上是做什么的?
【发布时间】:2016-10-19 02:12:31
【问题描述】:

最近,我试图授予我的应用程序管理员权限,而系统不询问“您想授予管理员权限吗?”,我找到了一种完美的方法。

我找到的解决方案

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

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

如果我们在上面拖动任何 exe,它会给他们管理员权限(之前它不允许我在没有它的情况下访问环境变量,但在 bat 上拖动文件之后它确实有效)。

问题

现在我的问题是:-

  1. “__COMPAT_LAYER”实际上是什么意思,它有什么作用?
  2. 如何删除这样的东西,让它再次要求管理员权限?
  3. 这会降低系统安全性吗?

【问题讨论】:

  • 它照说的做。设置兼容性选项。您的示例仅适用于管理员。非管理员会出错。
  • @Noodles 你能详细解释一下这三个问题的答案吗?
  • 大概应该是cmd /min /c ...?
  • 请@Agent_Spock,在cmd 中始终将"" 放在start 之后,因为如果引用了%1,那么start 会将其解释为窗口标题。试试start "C:\Program Files\whatever"start "" "C:\Program Files\whatever"

标签: windows batch-file compatibility administrator admin-rights


【解决方案1】:

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

除了你知道的还有several options to choose from

  • 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 弹出窗口,然后出现 runs the program as whatever user called it。因此,使用它是安全的,因为您不会神奇地获得管理员权限。

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

【讨论】:

  • 感谢朋友的详细解释,但我需要知道两件事。 1)我读过它是一个环境变量,但是每当我在环境变量中搜索它时,那里没有提到这样的东西。 2)正如你所说的取消它我需要写“set __COMPAT_LAYER =”或“set __COMPAT_LAYER = NULL”但是当我执行这些命令时,UAC提示不会重新出现。我应该怎么做才能让它们重新出现?
  • 我无法复制您的问题,但正如我在最后一句话中所说,您应该可以说set __COMPAT_LAYER=RunAsAdmin
  • @Agent_Spock:有些环境变量默认存在,有些只有你设置了才存在;这是后者之一。此外,如果双击有问题的可执行文件不再显示 UAC 提示,则可能表明它不包含告诉 Windows 是否需要提升的清单。发生这种情况时,Windows 会做出猜测。因此,也许 Windows 已经注意到您以非管理员身份成功运行它,并决定效仿。无论如何,除非您在注册表中或通过控制面板永久设置环境变量,否则这不是原因。
  • 如果它实际上是一种仅在您设置它时才存在的变量,它应该在设置它的命令提示符(以及所有应用程序)时停止存在由该提示拥有)已关闭。除非他们出于某种原因使用setx
  • 在应用代码之前,我无法获取环境变量,因为它说您需要管理员权限。然后我将我的 exe 文件拖到“nonadmin.bat”上,然后我能够获取环境变量的值。但是现在当我“__COMPAT_LAYER”为空白或空时,UAC 提示将不会出现。我该怎么办?
猜你喜欢
  • 2011-03-11
  • 2010-11-26
  • 2015-06-23
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多