PowerShell并行循环无法识别AD组Members属性问题咨询
问题原因与解决方案
问题原因
ADPropertyValueCollection是Active Directory模块返回的延迟加载属性集合,它依赖于获取AD组时的原始会话上下文才能解析内容。而ForEach-Object -Parallel会将每个脚本块放在独立的子进程中执行,这些子进程无法继承父进程的AD会话上下文,导致延迟加载的Members属性无法被解析,因此没有输出。
解决方案
要解决这个问题,需要提前将延迟加载的Members属性转换为可序列化的普通数据类型(比如字符串数组),这样在并行子进程中就能正常访问:
修改获取AD组的代码
$Groups = Get-ADGroup -Filter * -Properties Created,Modified,Description,Members | Select-Object -First 50, Created, Modified, Description, @{Name='Members'; Expression={[string[]]$_.Members}}
这里通过计算属性将Members转换为字符串数组,存储每个成员的DistinguishedName,这样后续并行循环中访问$psitem.Members就能正常拿到成员列表。
并行循环处理成员
修改后,你的并行循环可以正常工作,接下来就可以对每个成员的DN调用Get-ADUser:
$Groups | ForEach-Object -Parallel { foreach ($memberDN in $psitem.Members) { Get-ADUser -Identity $memberDN -Properties <需要的属性> } }
额外说明
PowerShell 7的并行循环基于子进程实现,任何依赖父进程上下文的.NET对象(比如AD模块的延迟加载属性)都无法跨进程正常工作,必须将数据转换为字符串、数组、普通自定义对象等可序列化类型,才能在并行块中使用。
内容的提问来源于stack exchange,提问作者Andrew Draper
相关产品推荐
相关产品推荐

