Получить данные учетной записи и экспортировать в XML

Мне нужно экспортировать некоторые атрибуты из учетных записей пользователей активного каталога в xml с отображаемым именем, электронной почтой, офисным телефоном, мобильным телефоном, офисом и отделом. Я получил этот код PowerShell

foreach ($User in (get-AdUser -filter * -SearchBase "OU=Path,DC=Domain,DC=Local" -Property *)){
    $DisplayName = $User.DisplayName
    $EmailAddress = $User.EmailAddress
    $OfficePhone = $User.OfficePhone
    $MobilePhone = $User.MobilePhone
    $Office = $User.Office
    $Department = $User.Department

    $Prop=[ordered]@{
        "DisplayName" = $DisplayName
        'EmailAddress' = $EmailAddress
        'OfficePhone' = $OfficePhone
        'MobilePhone' = $MobilePhone
        'Office' = $Office
        'Department' = $Department
    }
    $obj = New-Object -TypeName PSObject -Property $Prop

    $xml += $obj | Export-Clixml W:\skripts\OutFile.xml
}

Но результат в xml-файле содержит только одного пользователя - последнего. Я не могу понять, где я делаю неправильно.

С уважением Никлас}

2 ответа

Решение

Проблема с вашим оригинальным сценарием в том, что у вас есть свой Export-Clixml внутри цикла foreach. Кроме того, вы не должны делать это:

$xml += New-Object -TypeName PSObject -Property $Prop

Если вы хотите, чтобы эти объекты, хранящиеся в массиве, использовались позже, это намного быстрее:

$xml = 
foreach ($User in (get-AdUser -filter * -SearchBase "OU=Path,DC=Domain,DC=Local" -Property *)){
    $DisplayName = $User.DisplayName
    $EmailAddress = $User.EmailAddress
    $OfficePhone = $User.OfficePhone
    $MobilePhone = $User.MobilePhone
    $Office = $User.Office
    $Department = $User.Department

    $Prop=[ordered]@{
        "DisplayName" = $DisplayName
        'EmailAddress' = $EmailAddress
        'OfficePhone' = $OfficePhone
        'MobilePhone' = $MobilePhone
        'Office' = $Office
        'Department' = $Department
    }
    New-Object -TypeName PSObject -Property $Prop
}

$xml | Export-Clixml W:\skripts\OutFile.xml

Если все, что вам нужно, это файл экспорта, вам вообще не нужна переменная $ xml. Просто оберните весь цикл foreach в под-выражение и передайте его непосредственно в командлет экспорта:

$(foreach ($User in (get-AdUser -filter * -SearchBase "OU=Path,DC=Domain,DC=Local" -Property *)){
    $DisplayName = $User.DisplayName
    $EmailAddress = $User.EmailAddress
    $OfficePhone = $User.OfficePhone
    $MobilePhone = $User.MobilePhone
    $Office = $User.Office
    $Department = $User.Department

    $Prop=[ordered]@{
        "DisplayName" = $DisplayName
        'EmailAddress' = $EmailAddress
        'OfficePhone' = $OfficePhone
        'MobilePhone' = $MobilePhone
        'Office' = $Office
        'Department' = $Department
    }
    New-Object -TypeName PSObject -Property $Prop
}) | Export-Clixml W:\skripts\OutFile.xml

И если вы не меняете ни одно из имен свойств, все это можно заменить следующим:

$props = 'DisplayName','EmailAddress','OfficePhone','MobilePhone','Office','Department'

get-AdUser -filter * -SearchBase "OU=Path,DC=Domain,DC=Local" -Property $props |
 select $props | Export-Clixml W:\skripts\OutFile.xml

Вы передаете результаты в цикл for, это должно сделать это:

foreach ($User in (get-AdUser -filter * -SearchBase "OU=Path,DC=Domain,DC=Local" -Property *)){
    $DisplayName = $User.DisplayName
    $EmailAddress = $User.EmailAddress
    $OfficePhone = $User.OfficePhone
    $MobilePhone = $User.MobilePhone
    $Office = $User.Office
    $Department = $User.Department

    $Prop=[ordered]@{
        "DisplayName" = $DisplayName
        'EmailAddress' = $EmailAddress
        'OfficePhone' = $OfficePhone
        'MobilePhone' = $MobilePhone
        'Office' = $Office
        'Department' = $Department
    }
    $xml += New-Object -TypeName PSObject -Property $Prop
}

$xml | Export-Clixml W:\skripts\OutFile.xml
Другие вопросы по тегам