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?
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.