Un modo più efficiente per recuperare i dati di Office365 tramite Powershell

Sto cercando di get le statistiche della cassetta postale da Office 365. Questo è lo script corrente:

# Get credentials $O365Creds = New-Object -Typename System.Management.Automation.PSCredential -ArgumentList "reports@o365.example.com",$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 

Guardando l'utilizzo della memory, sembra che Get-Mailbox -ResultSize Unlimited sia caricato nella memory prima di prenderlo; oltre 1 GB di utilizzo della memory. La maggior parte del tempo è solo tempi. Questo è terribilmente inefficiente poiché sono interessato solo a due colonne.

Qualcuno ha suggerimenti su come completare questa attività in modo più efficiente?

  • Avviare lo script ELEVATO dall'interno dello script
  • Script di Powershell per eliminare le sottocartelle e i file se la data di creazione è> 7 giorni ma mantiene le cartelle principali di sottocartelle e file <7 giorni
  • Perché i cmdlet di Exchange 2010 ignorano ErrorVariable?
  • Come get da un nodo Hyper-V 2008 R2 con Powershell l'indirizzo IP e l'ID VLAN
  • Esportre la cartella pubblica di Exchange a PST da PowerShell
  • I comandi di WinRM Powershell non funzionano
  • Spostamento di un sito web da un server all'altro usando powershell
  • Guarda tutti i desktop del server per i file eccezionali prima di eliminare i profili
  • 2 Solutions collect form web for “Un modo più efficiente per recuperare i dati di Office365 tramite Powershell”

    Per TheCleaner e MichelZ, ho modificato lo script per eseguire la richiesta di query per intervalli di lettere:

     # Create credentials $O365Creds = New-Object -Typename System.Management.Automation.PSCredential -ArgumentList "reports@o365.example.com",$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 } } } 

    Farà una prova di prova durante la notte.

    Se qualcuno ha qualche raccomandazione su come rendere più efficiente o elegante, per favore commenta.

    Quello che vorrei fare è questo:

     # Get credentials $O365Creds = New-Object -Typename System.Management.Automation.PSCredential -ArgumentList "reports@o365.example.com",$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 } 

    Il codice originale prende un stream di oggetti e per ognuno di essi lo striscia contemporaneamente da un object, prende una o due properties;, tira un altro object per una properties;, unisce tutto in un object, quindi lo invia immediatamente in formato- table, che lo lascia partire da essere un object. Quindi usa l'out-file per submit a un CSV.

    Invece, questo codice prende l'arrays degli oggetti della cassetta postale in un arrays. Poi, looping attraverso di essi tira l'object Mailboxstats per ognuno di essi, aggiunge la properties; dalla cassetta postale (UserID) all'object statistiche e dissipa l'intera cosa in un CSV utilizzando Export-CSV.

    Anche se non si utilizza l'object di tutti gli stati della cassetta postale, è necessario alless utilizzare il loop di Foreach-Object, creare un object personalizzato con i dati desiderati e quindi esportre in CSV utilizzando Export-CSV.

    Il loop foreach, come usato qui, invia un object allo scriptblock alla volta, riducendo così la quantità di dati in pipeline.

    Creare un object personalizzato per raccogliere i dati desiderati da più fonti, inclusi altri oggetti, è uno strumento potente.

    Export-CSV è lo strumento giusto per esportre un csv. Out-File sembra intorpidito e pieno di pericoli.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.