我有一个需要运行的 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
:
- 作为脚本调用
Powershell
以在 GPO 中运行 - 将其他所有内容放入参数字段:
-ExecutionPolicy "bypass" -NoProfile -Command "...."
以绕过常规 PSH 执行策略。
该"..."
部分可能是内联的{ Script Block }
或指向.ps1
网络上的文件(通常的方式)。您还可以将所需的参数传递给.ps1
脚本(如果有)。
例子(您可以在 GPO 中使用之前尝试整个命令 - 通过简单地使用cmd.exe
或Powershell
使用管理员权限):
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。