Переменная Powershell не содержит все объекты - PullRequest
0 голосов
/ 08 апреля 2020

Я получил следующую переменную $ listofusers , которая возвращает указанные ниже объекты в двух столбцах:

SourceUser                         DestinationUser
----------                         ---------------
username1@legacy.company.corp username1@modern.company.corp
username2@legacy.company.corp username2@modern.company.corp
username3@legacy.company.corp username3@modern.company.corp
username4@legacy.company.corp username4@modern.company.corp

Теперь мне нужно обработать этот список пользователей в foreach l oop , До сих пор я пробовал следующее, но безуспешно:

$Results = ForEach ($User in $listofusers) {
    Write-Host "Processing SourceUser $($User.SourceUser)"
    Write-Host "Processing DestinationUser $($User.DestinationUser)"

    #Assign the content to variables
    $SourceUsers = $User.SourceUser
    $DestinationUsers = $User.DestinationUser

}

Возвращает только последнюю строку объектов:

$SourceUsers
RETURN ONLY: username4@legacy.company.corp

$DestinationUsers
RETURN ONLY: username4@modern.company.corp

Как добавить все объекты в переменная $ listofusers для дальнейшей обработки?

ОБНОВЛЕНИЕ:

Я пытаюсь добиться следующего, поэтому я нарушил ассоциацию в listofusers

$SourceUser = @()
$DestinationUser = @()
$Results = ForEach ($User in $listofusers)
{
    Write-Host "Processing SourceUser $($User.SourceUser)"
    Write-Host "Processing DestinationUser $($User.DestinationUser)"

    #Assign the content to variables
    $SourceUser += $User.SourceUser
    $DestinationUser += $User.DestinationUser

    #Cannot get that variables working yet
    $sourceusername, $sourcedomain = $SourceUser -split ("@")
    $DestinationUsername, $destinationDomain = $DestinationUser -split ("@")
    $SourceAccount = Get-ADUser $sourceusername -server $sourcedomain -Properties objectSid
    $TargetAccount = Get-ADUser $DestinationUsername -Server $destinationDomain   
} 

Есть ли лучший способ добиться этого и получить эти переменные до этой точки?

НОВОЕ ОБНОВЛЕНИЕ:

Цель сценария было бы добиться следующих командлетов для обработки рекламных объектов:

    #get the objectSid of the source account
    $objectSid = $SourceAccount.objectSid

    #copy source account objectSid to target account msExchMasterAccountSid
    $TargetAccount | Set-ADUser -Replace @{"msExchMasterAccountSid"=$objectSid}
    #enable targetaccount
    $TargetAccount | Enable-ADAccount

    #disable the source account
    $SourceAccount | Disable-ADAccount
    #move the migrated user into prod OU
    $TargetAccount | Move-ADObject -TargetPath "ou=test,dc=contoso,dc=com"

Спасибо

Ответы [ 3 ]

0 голосов
/ 08 апреля 2020
$SourceUsers = @()
$DestinationUsers = @()
$Results = ForEach ($User in $listofusers) {
    Write-Host "Processing SourceUser $($User.SourceUser)"
    Write-Host "Processing DestinationUser $($User.DestinationUser)"

    #Assign the content to variables
    $SourceUsers += $User.SourceUser
    $DestinationUsers += $User.DestinationUser
}
  • $SourceUsers = @() и $DestinationUsers = @() создает два пустых массива, которые мы будем использовать в l oop
  • += - операторе присваивания, который позволяет нам назначать более одно значение для переменной. Согласно документации: Увеличивает значение переменной на указанное значение или добавляет указанное значение к существующему значению.
0 голосов
/ 08 апреля 2020

вот демонстрация концепции, которую я пытался донести. [ ухмылка ] хранит ассоциацию объектов в вашем CSV в исходном объекте как можно дольше. код не был проверен, так как у меня нет доступа AD.

что он делает ...

  • фальсифицирует чтение в файле CSV
    , когда вы будете готовы использовать реальные данные, замените весь «регион» вызовом Import-CSV.
  • перебирает список
  • создает список параметров для вызовов AD
    см. Get-Help about_Splatting для получения дополнительной информации об этой удивительно полезной идее.
  • вызывает Get-AdUser с каждым набором пользовательских данных Source / Target
  • сохраняет вышеуказанное
  • использует сохраненную информацию учетной записи для ...
    == замены .objectSid целевой учетной записи
    == включить целевую учетную запись
    == отключить исходную учетную запись
    == переместить целевую учетную запись в нужную организационную единицу
    для жестко заданной организационной единицы можно задать переменная, чтобы сделать это немного более гибким. однако, это, кажется, одноразовая операция - так что, скорее всего, нет никакой выгоды.

, если вы хотите добавить ведение журнала, сделайте то же самое в l oop.

также нет обработки ошибок. это, вероятно, должно быть добавлено с try/catch вокруг каждого вызова AD и регистрации как успеха, так и неудачи.

код ...

#region >>> fake reading in a CSV file
#    in real life, use Import-CSV
$UserList = @'
SourceUser, DestUser
ABravo@Old.com, ABravo@NewDomain.com
BCharlie@Old.com, BCharlie@NewDomain.com
CDelta@Old.com, CDelta@NewDomain.com
DEcho@Old.com, DEcho@NewDomain.com
EFoxtrot@Old.com, EFoxtrot@NewDomain.com
'@ | ConvertFrom-Csv
#endregion >>> fake reading in a CSV file

ForEach ($UL_Item in $UserList)
    {
    Write-Host 'Processing ...'
    Write-Host ('    SourceUser {0}' -f $UL_Item.SourceUser)
    Write-Host ('    DestinationUser {0}' -f $UL_Item.DestUser)

    Write-Host '__ Source Account __'
    $GADU_Params_1 = [ordered]@{
        Identity = $UL_Item.SourceUser.Split('@')[0]
        Server = $UL_Item.SourceUser.Split('@')[1]
        Properties = 'objectSid'
        }
    $SourceAccount = Get-ADUser @GADU_Params_1

    Write-Host '__ Target Account __'
    $GADU_Params_2 = [ordered]@{
        Identity = $UL_Item.DestUser.Split('@')[0]
        Server = $UL_Item.DestUser.Split('@')[1]
        }
    $TargetAccount = Get-ADUser @GADU_Params_2

    Write-Host 'Making changes ...'
    # all these piped objects are slower than making _direct_ calls
    #    however, i don't have any way to test the code, so i can't use what likely is faster
    #    something like >>> 
    #    Set-AdUser -Identity $TargetAccount -Replace @{
    #        'msExchMasterAccountSid' = $objectSid
    #        }
    # note that i also replaced the unneeded _double_ quotes with the safer _single_ quotes
    $TargetAccount |
        Set-AdUser -Replace @{
        'msExchMasterAccountSid' = $SourceAccount.objectSid
        }
    $TargetAccount |
        Enable-AdAccount
    $SourceAccount |
        Disable-AdAccount
    $TargetAccount |
        Move-AdObject -TargetPath 'ou=test,dc=contoso,dc=com'

    Write-Host '=' * 30
    Write-Host ''
    }

вывод не показан, так как я не могу запустить этот материал AD. [ ухмылка ]

0 голосов
/ 08 апреля 2020

$SourceUsers и $DestinationUsers содержат только последние, потому что вы заменяете значение на каждой итерации foreach.

, если хотите разделить свойства, попробуйте следующее:

$SourceUsers = $User | select SourceUser -ExpandProperty SourceUser
$DestinationUsers = $User | select DestinationUser -ExpandProperty DestinationUser 

Это создаст коллекцию только из этих строк. вы больше не сможете получить доступ к этим значениям по свойству, то есть это простая строка [] после -ExpandProperty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...