如何让PowerShell脚本在所有域中运行以查询用户管理的组
跨域查询AD用户管理的所有组脚本修改方案
原脚本仅能在当前域内查询,要实现跨所有域查询,核心思路是遍历当前AD林中的所有域,逐个查询目标用户及该用户管理的组。以下是修改后的完整脚本:
param ( [Parameter(Mandatory=$true)] [string]$Username ) # 获取当前AD林内的所有域 try { $allDomains = (Get-ADForest).Domains } catch { Write-Host "无法获取AD林信息,请确认AD模块可用且有权限访问林信息" exit 1 } $userDN = $null $allManagedGroups = @() # 先遍历所有域查找目标用户,获取其DistinguishedName foreach ($domain in $allDomains) { try { $user = Get-ADUser -Identity $Username -Server $domain -ErrorAction Stop $userDN = $user.DistinguishedName Write-Host "在域 $domain 中找到用户 $Username" break # 找到用户后停止遍历 } catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] { # 用户不在当前域,继续下一个 continue } catch { Write-Host "连接域 $domain 失败: $_" continue } } if (-not $userDN) { Write-Host "用户 '$Username' 在当前AD林的所有域中均未找到" exit 0 } # 遍历所有域,查询该用户管理的组 foreach ($domain in $allDomains) { try { $managedGroupsInDomain = Get-ADGroup -LDAPFilter "(managedBy=$userDN)" -Server $domain -ErrorAction Stop | Select-Object Name, DistinguishedName if ($managedGroupsInDomain) { $allManagedGroups += $managedGroupsInDomain Write-Host "从域 $domain 找到 $($managedGroupsInDomain.Count) 个由 $Username 管理的组" } } catch { Write-Host "查询域 $domain 时出错: $_" continue } } # 输出整理后的结果 if ($allManagedGroups) { Write-Host "`n用户 '$Username' 在所有域中管理的组(按域分组):" $allManagedGroups | Group-Object -Property { $_.DistinguishedName.Split(',')[1].Split('=')[1] } | ForEach-Object { Write-Host "`n域: $($_.Name)" $_.Group | Sort-Object Name | ForEach-Object { Write-Host " - $($_.Name)" } } } else { Write-Host "用户 '$Username' 在所有域中均未管理任何组" }
关键修改点说明
- 获取所有域:通过
Get-ADForest获取当前AD林内的所有域列表,确保遍历覆盖所有域 - 跨域查找用户:逐个域查询目标用户,找到后记录其
DistinguishedName(AD中用户的唯一标识) - 跨域查询管理组:使用用户的DN作为LDAP筛选条件,在每个域中查询
managedBy属性匹配的组 - 错误处理:添加了连接失败、用户不存在等异常处理,避免脚本直接崩溃
- 结果整理:将结果按域分组输出,更清晰展示不同域的管理组
注意事项
- 运行脚本的账号需要拥有所有目标域的AD读取权限
- 确保已安装RSAT的AD PowerShell模块(
ActiveDirectory模块) - 如果部分域不可达,脚本会跳过该域并继续处理其他域
内容的提问来源于stack exchange,提问作者Mr.RamGoat
相关产品推荐
相关产品推荐

