通过 GPO 在所有计算机上以管理员身份运行一次 PowerShell 脚本,而无需更改执行策略

通过 GPO 在所有计算机上以管理员身份运行一次 PowerShell 脚本,而无需更改执行策略

我有一个需要运行的 PowerShell 脚本一次在我的 Active Directory 域中的所有计算机上。大量计算机在任何给定时间都处于关闭状态,因此 GPO 允许我们确保它适用于所有受影响的计算机。但是,由于注册表值被修改,脚本需要以管理员身份运行。此外,根据我们的安全部门的规定,我们无法更改这些设备上的 ExecutionPolicy。

有什么方法可以运行这个脚本吗?

New-PSDrive -PSProvider registry -Root HKEY_CLASSES_ROOT -Name HKCR
$regKey = 'ms-msdt'
$saveFolder = 'C:\Temp\'
$savePath = $saveFolder + 'CVE-2022-30190.reg'
$PSRegPath = 'HKCR:\' + $regkey
$CMDRegPath = 'HKCR\' + $regkey
if(Test-Path $PSRegPath)
{
    if(!(Test-Path $saveFolder))
    {
        New-Item -Path $folder -ItemType Directory
    }
    Invoke-Command {reg export $CMDRegPath $savePath -Y}
    Remove-Item -Path $PSRegPath -Recurse -Force
}

该脚本会在删除注册表项之前对其进行备份,这是 Microsoft 针对 CVE-2022-30190 的缓解措施所建议的。

答案1

创建 GPO 并在系统上下文中执行脚本在启动或关机期间(参见“计算机设置 > Windows 设置 > 脚本(启动/关机)”)。启动/关机脚本已获得所需的权限。

可执行文件Powershell提供了一个-ExecutionPolicy允许bypass全局执行策略的参数。这可以与-Command

  1. 作为脚本调用Powershell以在 GPO 中运行
  2. 将其他所有内容放入参数字段:-ExecutionPolicy "bypass" -NoProfile -Command "...."以绕过常规 PSH 执行策略。

"..."部分可能是内联的{ Script Block }或指向.ps1网络上的文件(通常的方式)。您还可以将所需的参数传递给.ps1脚本(如果有)。

例子(您可以在 GPO 中使用之前尝试整个命令 - 通过简单地使用cmd.exePowershell使用管理员权限):

Powershell -ExecutionPolicy "bypass" -NoProfile -Command "\\contoso.com\dfs\script\foo.ps1"
Powershell -ExecutionPolicy "bypass" -NoProfile -Command "\\contoso.com\dfs\script\foo.ps1 -SwitchOne:$True -Langs @('de-de', 'en-us') -Verbose"

检查是否需要执行某项操作(=运行一次)应该在脚本逻辑中实现,如果无需执行任何操作,则只需退出即可。确保所有客户端都启动/应用更改后,几周或几个月内删除 GPO。

答案2

您可以将脚本部署为电脑设置使用Windows Settings > Scripts (Startup/Shutdown

这些脚本将在系统上下文中运行,而不是在用户上下文中运行。要将其限制为仅运行一次,您可以在脚本中添加一些逻辑来检查注册表数据是否存在。 打开组策略编辑器的屏幕截图,查看启动脚本设置。

相关内容