如何用PowerShell批量禁用指定GPO的所有链接?
批量禁用指定GPO的所有链接
方法一:直接用Get-GPLink获取所有链接(推荐)
不用解析XML报告绕弯子,Get-GPLink可以直接返回目标GPO的所有链接信息,其中Target属性刚好是Set-GPLink需要的LDAP识别名格式。直接遍历执行禁用操作即可:
$gpoName = 'Test-Do-Not-Use' # 获取该GPO的所有链接记录 $gpoLinks = Get-GPLink -Name $gpoName foreach ($link in $gpoLinks) { # 禁用对应路径的GPO链接 Set-GPLink -Name $gpoName -Target $link.Target -LinkEnabled No -Confirm:$false Write-Host "已禁用GPO '$gpoName' 在路径: $($link.Target) 的链接" }
方法二:转换SOMPath为LDAP识别名
如果坚持用GPOReport的XML输出,需要把contoso.com/MyOU格式转换成ou=MyOU,dc=contoso,dc=com,可以通过字符串拆分重组实现:
$gpoName = 'Test-Do-Not-Use' [xml]$gpoReport = Get-GPOReport -Name $gpoName -ReportType Xml $links = $gpoReport.GPO.LinksTo foreach ($link in $links) { $somPath = $link.SOMPath # 拆分域名和OU路径两部分 $domainPart, $ouPart = $somPath -split '/', 2 # 把域名转换成dc=xxx格式 $dcSegments = $domainPart -split '\.' | ForEach-Object { "dc=$_" } $domainDn = $dcSegments -join ',' # 处理OU路径:从右到左拆分,转成ou=xxx格式后拼接 if (-not [string]::IsNullOrEmpty($ouPart)) { $ouSegments = $ouPart -split '/' | Reverse | ForEach-Object { "ou=$_" } $ouDn = $ouSegments -join ',' $targetPath = "$ouDn,$domainDn" } else { # 若SOMPath只有域名,说明链接在域根节点 $targetPath = $domainDn } # 执行禁用操作 Set-GPLink -Name $gpoName -Target $targetPath -LinkEnabled No -Confirm:$false Write-Host "已禁用GPO '$gpoName' 在路径: $targetPath 的链接" }
补充说明
- 方法一更简洁可靠,
Get-GPLink直接返回合规的Target值,避免了字符串转换可能遇到的特殊字符异常问题。 - 方法二的转换逻辑支持多层OU(比如
contoso.com/部门/技术部会转为ou=技术部,ou=部门,dc=contoso,dc=com)和域根链接场景。
内容的提问来源于stack exchange,提问作者NuckinFutz
相关产品推荐
相关产品推荐

