Получить данные учетной записи и экспортировать в 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