Экспорт информации из сценария PS в CSV - PullRequest
1 голос
/ 18 марта 2010

Это вопрос powershell / AD / Exchange ....

Я запускаю сценарий для нескольких пользователей, чтобы проверить некоторые их атрибуты, однако у меня возникают проблемы с передачей этого в CSV. Скрипт работает хорошо и делает именно то, что мне нужно, вывод на экран в порядке, у меня просто проблемы с его прямым экспортом в csv.

Входные данные представляют собой текстовый файл с разделенными запятыми именами пользователей (например, «username1, username2, username3»)

Я экспериментировал с созданием пользовательских объектов ps, добавляя к ним и затем экспортируя их, но это не работает ....

Любые предложения с благодарностью получены ..

Спасибо

George

$array = Get-Content $InputPath

#split the comma delimited string into an array
$arrayb = $array.Split(",");

foreach ($User in $arrayb)
{
    #find group memebership
    Write-Host "AD group membership for $User"
    Get-QADMemberOf $User

    #Get Mailbox Info
    Write-Host "Mailbox info for $User"
    Get-Mailbox $User | select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress

    #get profile details
    Write-Host "Home drive info for $User"
    Get-QADUser $User| select HomeDirectory,HomeDrive

    #add space between users
    Write-Host ""
    Write-Host "******************************************************"


}

Write-Host "End Script"

EDITED .... Методы, которые я пробовал для изучения (показ только для цикла for / export code) Method1

$AllData = @()  

foreach ($User in $arrayb)
{
    #set title for this user
    #Write-host "Details for $User"

    #find out their group memebership
    Write-Host "AD group membership for $User"
    $AdMemberOf = Get-QADMemberOf $User 
    Write-Host "ad completed"
    Write-Host ""
    Write-Host ""


    #Get Mailbox Info
    Write-Host "Mailbox info for $User"
    $ExInfo = Get-Mailbox $User | select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress
    Write-Host "ex completed"
    Write-Host ""
    Write-Host ""


    #get profile details
    Write-Host "Home drive info for $User"
    $HomeInfo = Get-QADUser $User| select HomeDirectory,HomeDrive
    Write-Host "home drive completed"

    #add space between users
    Write-Host ""
    Write-Host "******************************************************"


    $ReturnedObj = New-Object PSObject
    $ReturnedObj | Add-Member NoteProperty -Name "AD Group Membership for $User" -Value $AdMemberOf
    $ReturnedObj | Add-Member NoteProperty -Name "Exchange details for $User" -Value $ExInfo
    $ReturnedObj | Add-Member NoteProperty -Name "Home drive info for $User" -Value $HomeInfo


    Write-Host $ReturnedObj

    $AllData += $ReturnedObj


}
Write-Host "starting csv export"
Write-Output $AllData |export-csv -Path $OutputPath -notype -force
Write-Host "End Script"

Method2

$ExportInfo = @()


foreach ($User in $arrayb)
{
    $UserInfo = New-Object System.Object

    #set title for this user
    $ExportInfo += "Details for $User"

    #Get Mailbox Info
    $ExportInfo += Get-Mailbox $User

    #find out their group memebership
    $ExportInfo += Get-QADMemberOf $User 

    #get profile details
    $ExportInfo += Get-QADUser $User| select HomeDirectory,HomeDrive

    #add space between users
    $ExportInfo += ""
    $ExportInfo += ""   


}

$ExportInfo | Export-Csv -Path $OutputPath ;

РЕДАКТИРОВАНИЕ:

Благодаря предложению Stej у меня теперь есть код ниже ... Все еще не работает правильно. Я добавил проверку, чтобы подтвердить, что пользователь также существует в AD. Первая проблема заключается в получении членства в группе пользователей AD - если я поставлю точку останова и посмотрю на значение членства в AD определенного пользователя, значение в varialbe равно error «Невозможно обработать аргумент, поскольку значение аргумента« obj »равно null. Измените значение аргумента "obj" на ненулевое значение. " Понятия не имею, что является причиной этого, поэтому я просто пока проигнорировал это и прокомментировал эти строки для членства в AD, чтобы сконцентрироваться на том, чтобы заставить остальных работать.

С закомментированными строками скрипт работает нормально и снова, с точкой останова внизу, я могу посмотреть на значение $ ExportInfo, и все они выглядят нормально, т.е. все они были правильно сохранены в переменной. Тем не менее, он не будет выводить. Как вы можете видеть, я поместил команду для вывода $ ExportInfo на экран, но это ничего не показывает. Когда он пытается выполнить строку экспорта (то есть «Export-Csv $ ExportInfo -Path $ OutputPath»), он выдает ошибку: "Невозможно преобразовать System.Object [] в тип System.Char, требуемый параметром Delimiter. Указанный метод не поддерживается. В: строка: 80 символов: 10 + Export-Csv <<<< $ ExportInfo -Path $ OutputPath "</p>

Я поменял строку на "$ ExportInfo | Export-Csv -Path $ OutputPath", и теперь она экспортируется в CSV ... Не знаю, почему ??? Хотя есть две проблемы ... как отмечалось выше, группы AD не работают и поле Адреса электронной почты (которое должно возвращать что-то вроде {SMTP: j.smith@domain.com, smtp: j.smith@domain.com.au, smtp: smithj@exchange.domain.com.au и SIP: j.smith@domain.com.au}) просто отображаются в CSV как «Microsoft.Exchange.Data.ProxyAddressCollection». Опять же, проверяя в $ ExportInfo, адреса есть ...

Спасибо

$ExportInfo = @()

foreach ($User in $arrayb)
{
    $CheckUser = Get-QADUser -Name $User

    if (!$CheckUser)
    {
        $CountUser++
        Write-Warning "############################################"
        Write-Warning "$user not found in AD"
        Write-Warning "############################################"
    }
    else
    {
        $CountUser++

        $UserInfo = New-Object System.Object



        #find out their group memebership
        Write-Host "AD group membership for $User"
        #$Temp = Get-QADMemberOf $User 
        #$UserInfo | Add-Member NoteProperty -Name "AD Group Membership" -Value $Temp.Name

        #set title for this user
        #Write-host "Details for $User"

        #Get Mailbox Info
        Write-Host "Mailbox info for $User"
        $Temp = Get-Mailbox $User #| select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress
        $UserInfo | Add-Member NoteProperty -Name "ServerName" -Value $Temp.ServerName
        $UserInfo | Add-Member NoteProperty -Name "Database" -Value $Temp.Database
        $UserInfo | Add-Member NoteProperty -Name "Email Addresses" -Value $Temp.EmailAddresses
        $UserInfo | Add-Member NoteProperty -Name "Primary SMTP" -Value $Temp.PrimarySmtpAddress
        $UserInfo | Add-Member NoteProperty -Name "Windows Email Address" -Value $Temp.WindowsEmailAddress
        #$ReturnedObj | Add-Member NoteProperty -Name





        #get profile details
        Write-Host "Home drive info for $User"
        $Temp = Get-QADUser $User #| select HomeDirectory,HomeDrive
        $UserInfo | Add-Member NoteProperty -Name "Home Directory Location" -Value $Temp.HomeDirectory
        $UserInfo | Add-Member NoteProperty -Name "Home Drive Mapped To" -Value $Temp.HomeDrive

        #add space between users
        Write-Host ""
        Write-Host "******************************************************"

        $ExportInfo += $UserInfo
    }#end else

}
Write-Host "blah"
Write-Host $ExportInfo
Export-Csv $ExportInfo -Path - $OutputPath

Write-Host "Number of Users processed: $CountUser"

Ответы [ 2 ]

1 голос
/ 13 мая 2010

Оказалось, что мне нужно было использовать несколько циклов foreach для получения необходимой мне информации .... Итак:

foreach($user in $array)
{
$temp = Get-QADUser -Name $User

if (!$temp)
{
    $log += "????????????????" + "`n"
    $log += "$user not found in AD" + "`n"
    $log += "????????????????" + "`n"
}
else
{
    #find out their group memebership
    $log += "AD group membership for $User" + "`n"
    $temp = Get-QADMemberOf $User 

    foreach ($drive in $temp)
    {
        $temp2 = $drive
        $temp2 = $temp2.Substring(6)
        $log += "`t" + $drive + "`n"
}#end foreach for drive loop

$temp = Get-Mailbox $User

if ($temp.RecipientType -like "UserMailbox")
{
    $log += "Mailbox info for $User" + "`n"
    #$log += Get-Mailbox $User | select ServerName, Database, EmailAddresses, PrimarySmtpAddress, WindowsEmailAddress
    $log += "Email Server: " + $temp.ServerName + "`n"
    $log += "Email Database: " + $temp.Database + "`n"
    $log += "Primary SMTP: " + $temp.PrimarySmtpAddress + "`n"
    $log += "Windows Email Address: "+ $temp.WindowsEmailAddress + "`n"
    #$log += "`n"

    foreach ($e in $temp.EmailAddresses)
    {
        $log += "`t" + "Email Addresses: " + $e + "`n"
    }

}
else
{
    $log += "########" + "`n"
    $log += "$User is not a MailboxUser, IE no Exchange Mailbox" + "`n"
    $log += "########" + "`n"
}


$log += "Home drive info for $User" + "`n"
$temp = Get-QADUser $User| select HomeDirectory,HomeDrive
$log += "Home Directory: " + $temp.HomeDirectory + "`n"
$log += "Home Drive Letter: " + $temp.HomeDrive + "`n"

$tempvar = [string] $temp.HomeDirectory

if ($tempvar -eq "")
{
    $noHomedirectory += $User + "`n"
    $countNoHOmeDirectory ++
}
}#end of the main if/else to determine if the AD account exists

$OutputPath = "C:\SomeFolder\"+"User_Report_"+([datetime]::Now).tostring("yyyyMMddhhmmss")+".txt"

$log | Out-File -FilePath $OutputPath

Затем я вывожу все указанные журналы (например, $ noHomeDirectory и т. Д.) В телеэлектронное письмо, приложите полный журнал, как экспортировано выше, и отправьте его себе.

Спасибо за все вышеизложенные предложения и извините за задержку отправки ответа ...

1 голос
/ 19 марта 2010

Есть ли сообщение об ошибке? Что-то есть в $error[0]? Что это значит, что не работает ?


Отредактировано: В вашем втором методе вы создаете $UserInfo объект, но вы его не используете. Я предполагаю, что это было предназначено, чтобы быть добавленным к $ExportInfo. Вместо этого вы добавляете голые строки в $ExportInfo, и именно поэтому вы выдавали такое странное содержимое вашего CSV-файла.

Как это сделать правильно:

$UserInfo = New-Object System.Object

$ReturnedObj | Add-Member NoteProperty -Name "User Name" -Value $user.Name
$ReturnedObj | Add-Member NoteProperty -Name "User otherValue" -Value $user.othValue

#Get Mailbox Info
$mailBox = Get-Mailbox $User
$ReturnedObj | Add-Member NoteProperty -Name "User Mail box size" -Value $mailBox.Size
$ReturnedObj | Add-Member NoteProperty -Name "User Mail box -count of messages" -Value $user.countOfMessages

... # and so on
$ExportInfo  += $ReturnedObj

Обратите внимание, что объекты, которые вы хотите экспортировать в csv , должны иметь свойства строк типа, целых чисел, bools и т. Д. Не составленные объекты, такие как $User или объекты, возвращаемые Get-Mailbox $User. Значения в csv должны быть примитивными . Вот причина.

Это применимо для вашего первого примера, где вы добавляете NoteProperty со значением $AdMemberOf. Это сам объект, который не может быть экспортирован в CSV. Вы должны создать набор свойств для каждого интересного свойства $AdMemberOf.

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