更有效的方式来通过Powershell检索Office365数据

我正在尝试从Office 365获取邮箱统计信息。这是当前的脚本:

# 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 

看看内存使用情况,好像Get-Mailbox -ResultSize Unlimited在加载之前加载到内存中; 超过1GB的内存使用量。 大多数时候它只是超时。 这是非常低效的,因为我只对两列感兴趣。

任何人有任何build议,如何以更有效的方式完成这项任务?

每TheCleaner和MichelZ,我已经修改脚本页面查询字母范围:

 # 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 } } } 

将做一个testing运行过夜。

如果任何人有任何build议,如何使这个更高效或优雅,请评论。

我会做的是这样的:

 # 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 } 

原始代码需要一个对象stream,并且每个对象同时将其从一个对象中剥离出来,获取一个或两个属性,为另一个对象提取一个属性,将所有对象合并到一个对象中,然后立即将其发送到格式化对象,表,它从一个对象剥离。 然后使用out-file发送到CSV。

相反,这段代码将邮箱对象的数组放入一个数组中。 然后循环遍历它们为每个对象提取Mailboxstats对象,将邮箱(UserID)的属性添加到stats对象,然后使用Export-CSV将整个事件转储为CSV。

即使您不使用整个邮箱统计信息对象,也应至less使用Foreach-Object循环,使用所需的数据构build自定义对象,然后使用Export-CSV导出为CSV。

这里使用的foreach循环每次向脚本块发送一个对象,从而减lesspipe道中的数据量。

构build自定义对象以从多个来源(包括其他对象)中收集所需的数据是一个强大的工具。

Export-CSV是导出csv的正确工具。 Out-File看起来笨重,充满危险。