首页 > 解决方案 > Powershell:将 Get-ADGroup 集合传递给后台作业,缺少各种属性值

问题描述

如果已回答此问题,请指出解决方案,但是,目前我无法在现有帖子中找到此问题的答案。

我目前正在处理 powershell 中的后台作业,以将繁重的进程分解为并行进程,以减少持续时间。总体概念是有效的,但是,我遇到了一个问题,即将从 Get-ADGroup 返回的 ADgroup 对象的父集合传递到作业的脚本块中。

集合传递得很好,但是,问题是一些属性,即描述和成员,在对象上有属性条目,但是一旦在脚本块中,值就丢失了。我在进入脚本块之前验证了这些值。我还验证了 scriptb 锁正在解释在脚本块内正确传递的对象类型,但这些值一旦进入就为空。

奇怪的是,如果我使用 ConvertTo-Json 序列化对象,则值是这种格式的,而不是 .NET 对象形式的。我想知道它是否与传递给脚本块时对象的序列化有关?

最后一点,如果我创建一个自定义对象并使用 ADGroup 对象中的属性和值填充它,然后将其交给脚本块,一切都很好。我尝试通过“$Using:var”构造传递对象,以及通过参数列表显式传递它并在脚本块中定义类型特定的参数。

希望对底层架构有更好理解的人可以对此有所了解。下面是我正在做的事情的简化版本,将值输出到文件只是为了看看我在脚本块中得到了什么,我可以获得 SAM,但没有描述或成员

$adgroups = Get-ADGroup -Server $domain -Properties Description, member -SearchBase $ou -LDAPFilter "(samaccountname=*)"

$ps = [powershell]::create()
[void]$ps.AddScript({
  Param([ADGroup[]]$groups)

  foreach ($group in $groups) {
    "SAM: $($group.samAccountName)" | Out-File output.txt
    "Description: $($group.description)" | Out-File output.txt -append
    "Members: $($group.member)" | Out-File output.txt -append
  }

}).AddParameter('groups', $adgroups)

$ps.Invoke()
$ps.Dispose()

同样,属性值在进入脚本块之前就已经存在,但只有在脚本块内的是空的。

标签: powershelljobsscriptblock

解决方案


哇,我试图用作业来做到这一点,但我无法让整个数组传入。它只打印一条记录。但& $block $adgroups工作正常。

$adgroups = Get-ADGroup -Properties Description, member -LDAPFilter "(samaccountname=*)" -resultsetsize 5

$block = {
  Param([object[]]$groups)
  $groups.count 
  foreach ($group in $groups) {
    "SAM: $($group.samAccountName)" 
    "Description: $($group.description)" 
    "Members: $($group.member)" 
  }

}

start-job $block -args @($adgroups) | wait-job | receive-job


# output
1
SAM: Remote Desktop Users
Description: Members in this group are granted the right to logon remotely
Members:

编辑:我将数组传递给具有“使用:”范围的作业:

$groups = Get-ADGroup -Properties Description, member -LDAPFilter "(samaccountname=*)" -resultsetsize 5

$block = {
  foreach ($group in $using:groups) {
    "SAM: $($group.samAccountName)" 
    "Description: $($group.description)" 
    "Members: $($group.member)" 
  }

}

start-job $block | wait-job | receive-job

推荐阅读