为所有用户将 Win32 应用程序设置为 RUNASINVOKER

为所有用户将 Win32 应用程序设置为 RUNASINVOKER

我正在准备一个 PowerShell 脚本,用于在某些 Windows 10 主机上执行初始配置。其中一个配置步骤涉及一个较旧的软件请求管理提升的问题,而它并不需要。该软件不是由脚本本身调用的,但用户会根据需要使用。解决方案要求我设置一个兼容性标志,强制程序作为所有用户的调用者运行 - 我正在尝试找出在配置脚本中实现此解决方案的方法。

为此,我可以向注册表项添加一个字符串值HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers。字符串值的名称是相关可执行文件的绝对路径,其数据值为~ RUNASINVOKER。将其放入 Powershell 脚本中没有问题。

问题是,即使重新启动机器,仅此操作也不起作用。为了使其生效,我需要在资源管理器中右键单击可执行文件并选择属性,在兼容性选项卡下选择“更改所有用户的设置”,然后在新对话框中单击“确定”,而无需更改任何设置。

这个过程似乎会刷新或初始化我的兼容性设置,但我不清楚发生了什么,更不用说如何在 PowerShell 脚本中实现。

我应该补充一点,这个过程也可以反向进行。我可以在执行“更改所有用户的设置”修复后添加注册表值,它将立即生效。

是否有人了解发生了什么事情才能使我的注册表添加生效,以及如何在 PowerShell 脚本中实现这一点?

谢谢。

答案1

我猜软件运行是调用启动 .exe 文件?你能试试在运行应用程序的行上方执行这一行吗?

set __COMPAT_LAYER=RunAsInvoker

答案2

当您将设置更改为适用于所有用户时,它会将条目从

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

然后把它们放进

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

或者

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

如果两者都有密钥,我相信当前用户的密钥会覆盖本地机器的密钥,如果它们不同,它可能无法按预期工作。

相关内容