2013-06-20 1 views
0

Привет, я создал сценарий ниже для проверки локальных групп администраторов на удаленных хостах. Он работает нормально, но поскольку он выводит данные только после того, как он прошел через все хосты, я боюсь, что у массива закончится буферное пространство, прежде чем он сможет экспортировать в csv, поэтому я пытался создать его и добавлять выходные данные от каждого хоста, поскольку он проходит через список, за исключением того, что я не могу получить заголовки для отображения в первой строке и добавить дополнительные строки под ним. Ниже представлен вывод, который я получаю, когда я пытаюсь выполнить append. Курсивные слова должны быть заголовками, а другая информация должна быть указана в следующей строке. Что я делаю не так?Ошибка в выпуске вывода CSV

@ {Сервер = pc1; Участники = Администратор; DistinguishedName = DC = Domain, DC = com

Вот как это должно выглядеть. Это выглядит так, если я не добавлять и я пусть это создать CSV-файл после того, как он закончил идти по списку хостов

Server   Members   DistinguishedName 
host1 Administrator;Admin2 DC=DOMAIN,DC=COM 





$servers= get-content "C:\Scripts\AD Audits\Local Admin\workstations.txt" 
$output = "c:\temp\local admin audit $CurrentDate.csv" 
$results = @() 
$disconnected = "Did not respond" 
foreach($server in $servers) 
{ 
$connected = Test-Connection $server -count 1 -quiet 
    if ($connected) { 
     "$server responded" | Out-File -append "c:\temp\LocalAdmin goodhosts $CurrentDate.txt"} 

    else { 
     "$server did not respond" | Out-File -append "c:\temp\LocalAdmin badhosts $CurrentDate.txt"} 

$group =[ADSI]"WinNT://$server/Administrators" 
$members = $group.Members() | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) } 
$results += New-Object PsObject -Property @{ 
    DistinguishedName = (get-adcomputer ($server) -properties * | select distinguishedname).distinguishedname 
    Server = $server 
    Members = $members -join ";" 

    } 

$results | Export-Csv $Output -NoTypeInformation 

}` 

if($connected -eq $True) { New-Object PSObject -Property @{ DistinguishedName = (Get-ADComputer $_).DistinguishedName Server = $_ Members = $members -join ";" }} else {write-host ""}

ответ

0

Мое предложение заключается в использовании трубопровода, а не Еогеасп заявление, поэтому каждый объект записывается в файл сразу после его обработки.

$servers | ForEach-Object{ 

    $connected = Test-Connection $_ -Count 1 -Quiet -ErrorAction SilentlyContinue 
    $state = if($connected) {"$_ responded"} else {"$_ did not respond"} 
    $state | Out-File -Append "c:\temp\LocalAdmin goodhosts $CurrentDate.txt" 

    $group =[ADSI]"WinNT://$_/Administrators,group" 
    $members = $group.Members() | ForEach-Object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) } 

    if($connected) 
    { 
     New-Object PSObject -Property @{ 
      DistinguishedName = (Get-ADComputer $_).DistinguishedName 
      Server = $_ 
      Members = $members -join ";" 
     } 
    } 

} | Export-Csv $Output -NoTypeInformation 
+0

что швы на работу, за исключением того, что компьютеры, к которым не подключен сценарий, все еще записываются в csv с ложной информацией от предыдущего хоста, который отвечал. Трубопровод имеет смысл. Я действительно начинаю понимать некоторые из этих вещей. Вместо использования ($ server in $ servers) вы используете одну запись ($ _) для каждой строки. – user2402045

+0

Вы можете поместить новое создание psobject внутри оператора IF, который проверяет, может ли связанный компьютер быть подключен. –

+0

Это сработало отлично! Я добавил модификацию if в нижнюю часть моего исходного вопроса. Вероятно, это был не самый чистый способ добавить его, но он отлично поработал. Был бы лучший способ для меня сделать это? – user2402045

 Смежные вопросы

  • Нет связанных вопросов^_^