Powershell: передача коллекции Get-ADGroup в фоновое задание, пропуская различные значения свойств - PullRequest
0 голосов
/ 10 октября 2019

Если ответ получен, просьба указать мне решение, однако в настоящее время я не могу найти ответ на этот вопрос в существующих сообщениях.

В настоящее время я работаю с фоновыми заданиями в powershell. как разбить тяжелый процесс на параллельные процессы, чтобы сократить продолжительность. Общая концепция работает, однако я сталкиваюсь с проблемой передачи родительской коллекции объектов ADgroup, которые возвращаются из Get-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()

Опять же,значения свойств перед входом в блок сценария равны , но только значения остаются пустыми внутри блока сценария.

1 Ответ

0 голосов
/ 11 октября 2019

Ух ты, я пытался сделать это с заданиями, но не могу передать весь массив. Он печатает только одну запись. Но & $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:

РЕДАКТИРОВАТЬ: я передал массив в задание с использованием "using:" scope:

$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
...