2014-01-20 1 views
0

Мне нужно экспортировать некоторые атрибуты из учетных записей активных учетных записей в xml containg Отображаемое имя, адрес электронной почты, офис, мобильный, офис и отдел. Я получил этот код powershellПолучить данные учетной записи и экспортировать в 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 
    } 
    $obj = New-Object -TypeName PSObject -Property $Prop 

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

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

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

ответ

0

Проблемой с оригинальным сценарием является то, что у вас есть Экспортно-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 ($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 
+0

Спасибо за объяснение, скрипт отлично работает, и я также узнал что-то новое. Еще раз спасибо! – Niklas

0

Вы конвейером результатов в течение цикла, это следует сделать это:

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