Exchange Online - Get-UserPhoto - как отловить нескончаемую ошибку? - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь экспортировать список всех пользователей без фотографий из нашей учетной записи Exchange Online с помощью powershell. Я не могу заставить его работать и пробовал различные методы.

Get-UserPhoto возвращает это исключение, когда профиль отсутствует.

Microsoft.Exchange.Data.Storage.UserPhotoNotFoundException: There is no photo stored here.

Прежде всего я попытался использовать Errorvariable против команды, но получил:

A variable that cannot be referenced in restricted language mode or a Data section is being referenced. Variables that can be referenced include the following: $PSCulture, $PSUICulture, $true, $false, and  $null.
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : VariableReferenceNotSupportedInDataSection
+ PSComputerName        : outlook.office365.com

Далее я попытался попробовать, поймать , но не прекращающаяся ошибка никогда не вызывает catch , несмотря на то, что в первую очередь следуют различные методы о настройке $ ErrorActionPreference .

Есть идеи? Вот сценарий:

 $UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session 

$timestamp = $timestamp = get-date -Format "dd/M/yy-hh-mm"
$outfile = "c:\temp\" + $timestamp + "UserswithoutPhotos.txt"




$resultslist=@()
$userlist = get-user -ResultSize unlimited -RecipientTypeDetails usermailbox | where {$_.accountdisabled -ne $True}


Foreach($user in $userlist)
{
    try
    {

        $user | get-userphoto -erroraction stop 
    }
    catch
    {
        Write-Host "ERROR: $_"
        $email= $user.userprincipalname
        $name = $user.DisplayName
        $office = $user.office
        write-host "User photo not found...adding to list : $name , $email, $office" 
        $resultslist += $user

    }
}
$resultslist | add-content $outfile 
$resultslist

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Обработка ошибок PowerShell общеизвестно сложна, особенно это касается командлетов, использующих неявное удаленное взаимодействие через локально сгенерированный прокси-скрипт-модуль.

В следующем идиоме предлагается обходной путь, основанный на временной установке $ErrorActionPreference в Stop глобально (конечно, вы можете переместить код для восстановления предыдущего значения за пределы цикла foreach), что гарантирует, что четные функции из разных модулей увидят его:

try {

  # Temporarily set $ErrorActionPreference to 'Stop' *globally*
  $prevErrorActionPreference = $global:ErrorActionPreference
  $global:ErrorActionPreference = 'Stop'

  $user | get-userphoto

} catch {

    Write-Host "ERROR: $_"
    $email= $user.userprincipalname
    $name = $user.DisplayName
    $office = $user.office
    write-host "User photo not found...adding to list : $name, $email, $office" 
    $resultslist += $user

} finally {  

  # Restore the previous global $ErrorActionPreference value
  $global:ErrorActionPreference = $prevErrorActionPreference

}

Относительно того, почему это необходимо:

  • Функции , определенные в модулях, не видят переменные предпочтения вызывающего абонента - в отличие от cmdlets , которые выполняют.

  • Единственная внешняя область действия, которую видят функции в модулях, это global scope.

Для получения дополнительной информации об этой фундаментальной проблеме см. эту проблему GitHub .

0 голосов
/ 11 мая 2018

Вы можете выдать свою ошибку, например, так:

try {
    $error.Clear()
    $user | Get-UserPhoto 
    if ($error[0].CategoryInfo.Reason -eq "UserPhotoNotFoundException") {throw "UserPhotoNotFoundException" }
} catch {
    #code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...