Более эффективный способ получить данные Office365 через Powershell

Я пытаюсь получить статистику почтового ящика из Office 365. Это - текущий сценарий:

# 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

При рассмотрении использования памяти, походит Get-Mailbox -ResultSize Unlimited загружается в память прежде, чем победить его; более чем 1 ГБ использования памяти. Большую часть времени это просто испытывает таймаут. Это ужасно неэффективно, так как я только интересуюсь двумя столбцами.

У кого-либо есть какие-либо предложения о том, как выполнить эту задачу более эффективным способом?

3
задан 24 June 2014 в 16:02
2 ответа

Per TheCleaner и MichelZ, я модифицировал скрипт, чтобы страница запроса была по буквам диапазона:

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

Выполнит тестовый прогон за ночь.

Если у кого-нибудь есть рекомендации, как сделать этот прогон более эффективным или элегантным, пожалуйста, прокомментируйте.

.
2
ответ дан 3 December 2019 в 06:34

Я бы сделал следующее:

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

Исходный код принимает поток объектов , и для каждого из них одновременно удаляет его из объекта, принимает одно или два свойства, извлекает другой объект для одного свойства, объединяет все это в объект, а затем немедленно отправляет его в таблицу форматирования, которая удаляет его из объект. Затем использует исходящий файл для отправки в CSV.

Вместо этого этот код переносит массив объектов почтового ящика в массив. Затем при их просмотре извлекается объект Mailboxstats для каждого из них, добавляется свойство из почтового ящика (UserID) к объекту статистики и выгружается все это в CSV с помощью Export-CSV.

Даже если вы не используете всего объекта статистики почтового ящика, вы должны по крайней мере использовать цикл Foreach-Object, создать собственный объект с нужными данными, а затем экспортировать в CSV с помощью Export-CSV.

Цикл foreach, используемый здесь, отправляет один объект к блоку сценария за раз, тем самым уменьшая объем данных в конвейере.

Создание настраиваемого объекта для сбора данных, которые вы хотите, из нескольких источников, включая другие объекты, является мощным инструментом.

Export-CSV - это правильный инструмент для экспорта CSV. Out-File кажется неуклюжим и чреватым опасностями.

1
ответ дан 3 December 2019 в 06:34

Теги

Похожие вопросы