Uma maneira mais eficiente de recuperar dados do Office365 via Powershell

3

Estou tentando obter estatísticas de caixa de correio do Office 365. Este é o script atual:

# Get credentials
$O365Creds = New-Object -Typename System.Management.Automation.PSCredential -ArgumentList "[email protected]",$SecurePassword

# Create session
$O365Session = New-PSSession –ConfigurationName Microsoft.Exchange -ConnectionURI https://ps.outlook.com/powershell -Credential $O365Creds -Authentication Basic -AllowRedirection
Import-PSSession $O365Session -AllowClobber

# Create report
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | FT @{n="UserID";e={(Get-Mailbox $_.LegacyDN).Name}},LastLogonTime | Out-File -FilePath o365_logons.csv -Encoding utf8 -append

Olhando para o uso da memória, parece que Get-Mailbox -ResultSize Unlimited está carregado na memória antes de colocá-lo; mais de 1 GB de uso de memória. Na maioria das vezes, apenas expira. Isso é terrivelmente ineficiente, já que estou interessado apenas em duas colunas.

Alguém tem alguma sugestão sobre como concluir essa tarefa de maneira mais eficiente?

    
por Belmin Fernandez 24.06.2014 / 15:02

2 respostas

2

Por TheCleaner e MichelZ, modifiquei o script para paginar a consulta por intervalos de letras:

# Create credentials
$O365Creds = New-Object -Typename System.Management.Automation.PSCredential -ArgumentList "[email protected]",$SecurePassword

# Create session
$O365Session = New-PSSession –ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $O365Creds -Authentication Basic -AllowRedirection
Import-PSSession $O365Session -AllowClobber

# Initiate file
$CSVExport = "o365_logons.csv"
If (Test-Path $CSVExport){
    Remove-Item $CSVExport
}
"UserID,LastLogonTime" | Out-File -FilePath $CSVExport

# Loop through alphabet
foreach ($letter1 in [char]'a'..[char]'z') {
    foreach ($letter2 in [char]'a'..[char]'z') {
        $AccountNames = Get-Mailbox -Filter "{SamAccountName -like '$([char]$letter1)$([char]$letter2)*'}" -ResultSize Unlimited | Select -Expand Name

        # Skip if no accounts
        if (!$AccountNames) {
            Continue
        }

        foreach ($account in $AccountNames) {

            ## Some last logon could be null, using ForEach as workaround
            $last_logon = Get-MailboxStatistics -Identity $account | ForEach { $_.LastLogonTime }

            ## Print to CSV file
            $account,$last_logon -Join ','| Out-File -Append -FilePath $CSVExport
        }
    }
}

Vai fazer um teste durante a noite.

Se alguém tiver alguma recomendação sobre como tornar isso mais eficiente ou elegante, comente.

    
por 24.06.2014 / 18:52
1

O que eu faria é isso:

# Get credentials
$O365Creds = New-Object -Typename System.Management.Automation.PSCredential -ArgumentList "[email protected]",$SecurePassword

# Create session
$O365Session = New-PSSession –ConfigurationName Microsoft.Exchange -ConnectionURI https://ps.outlook.com/powershell -Credential $O365Creds -Authentication Basic -AllowRedirection
Import-PSSession $O365Session -AllowClobber

# Create report

$Mailboxes = Get-Mailbox -Resultsize Unlimited

foreach ($mailbox in $Mailboxes) {
    $mailboxstats = Get-MailboxStatistics
    $mailboxstats | Add-Member -MemberType NoteProperty UserID -Value $mailbox.Name
    $mailboxstats | Export-CSV o365_logons.csv -NoTypeInformation -Append
    }

O código original pega um fluxo de objetos, e para cada um tira o mesmo de um objeto, pega uma ou duas propriedades, puxa outro objeto para uma propriedade, combina tudo isso em um objeto, então envia-o imediatamente para formatar a tabela, o que a impede de ser um objeto. Em seguida, usa o arquivo fora para enviar para um CSV.

Em vez disso, esse código leva a matriz de objetos de caixa de correio em uma matriz. Em seguida, fazer um loop através deles puxa o objeto Mailboxstats para cada um, adiciona a propriedade da caixa de correio (UserID) ao objeto stats e despeja tudo em um CSV usando Export-CSV.

Mesmo que você não use todo o objeto de estatísticas da caixa de correio, deve usar pelo menos o loop Foreach-Object, criar um objeto personalizado com os dados desejados e exportar para CSV usando Export-CSV.

O loop foreach, como usado aqui, envia um objeto para o scriptblock de cada vez, reduzindo assim a quantidade de dados no pipeline.

A criação de um objeto personalizado para reunir os dados que você deseja de várias origens, incluindo outros objetos, é uma ferramenta poderosa.

Export-CSV é a ferramenta certa para exportar um csv. Out-File parece desajeitado e repleto de perigos.

    
por 15.09.2016 / 02:12