PowerShell для получения списка UPN на основе определенного поиска по шаблону - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно изменить приведенный ниже скрипт, который частично работает.

В основном он запрашивает пользователей, контакты, группы и удаленных пользователей Office 365, а затем сопоставляет его с пользовательским вводом, затем отображает его наOut-GridView при обнаружении.

Try { 
    Install-Module MSOnline -ErrorAction Stop
    Import-Module MSOnline -ErrorAction Stop 

    $UserCredential = Get-Credential
    Connect-MsolService -Credential $UserCredential
}
Catch { Write-Warning "Unable to load Microsoft Office 365 module because $($Error[0])"; Exit }

$UPN = Read-Host -Prompt "Please enter the User Principal Name to search (wildcard accepted)"
If ($UPN) {
    $UPN = $search
    $MSOLActiveUsers = Get-MsolUser -All
    $MSOLDeletedUsers = Get-MsolUser -All -ReturnDeletedUsers
    $MSOLGroups = Get-MsolGroup -All
    $MSOLContacts = Get-MsolContact -All
    $MSOLRecipients = Get-Recipient -ResultSize Unlimited​

    $MSOLCombinedResults = $MSOLActiveUsers + $MSOLDeletedUsers + $MSOLGroups + $MSOLContacts + $MSOLRecipients
    ​
    $MSOLCombinedResults | Where-Object { $_.emailaddresses -match $search -or $_.emailaddress -match $search -or $_.userprincipalname -eq $search -or $_.proxyaddresses -match $search }

    Switch ($MSOLCombinedResults.Count) {
        0 { Write-Warning "No user account with a SamAccountName matching '$($UPN)' found!" }
        1 { $MSOLCombinedResults }
        default { $MSOLCombinedResults | Out-GridView -Title "Please select a user" -OutputMode Single }
    }
}

Проблема с приведенным выше сценарием в том, что результат всегда бессмысленный длинный Gridview?

enter image description here

1 Ответ

1 голос
/ 24 октября 2019

ПРИМЕЧАНИЕ : в вашем сценарии отсутствует подключение к Exchange Online, что требуется для Get-Recipient, но я предполагаю, что вы это сделали, но просто забыли добавить к своему вопросу.


Прежде всего, вы фильтруете $MSOLCombinedResults в этой строке:

 $MSOLCombinedResults | Where-Object (...)

Но затем вы перенаправляете в Out-GridView нефильтрованный массив:

$MSOLCombinedResults | Out-GridView (...)

То, что вы забыли, это сохранитьотфильтровать массив и затем оперировать им. PowerShell не делает этого автоматически, поэтому вы должны использовать что-то вроде:

$filteredResults = $MSOLCombinedResults | Where-Object { $_.emailaddresses -match $search -or $_.emailaddress -match $search -or $_.userprincipalname -eq $search -or $_.proxyaddresses -match $search }

Switch ($filteredResults .Count) {
  # do something
}

Другое дело, что $MSOLCombinedResults содержит несколько типов объектов, поэтому вы должны выбрать нужные свойства перед выводом (для производительностипричин, по которым было бы неплохо выбрать их еще раньше).

Интересующие вас данные выглядят следующим образом:

  • From Get-MsolUser: UserPrincipalName (string),ProxyAddresses (массив)
  • С Get-MsolGroup: EmailAddress (строка), ProxyAddresses (массив)
  • С Get-MsolContact: EmailAddress (строка), ProxyAddresses (массив, необязательно, как я необычно видеть это значение)
  • С Get-Recipient: EmailAddress es (массив, уведомление во множественном числе), ExternalEmailAddress (строка в формате SMTP:xxx), PrimarySmtpAddress (строка)

Вы должны соответствующим образом изменить свой фильтр и затем вывести желаемые результаты, используя Select-Object до Out-GridView. Взгляните на вычисленные свойства , так как вы можете переименовать / преобразовать некоторые свойства для упрощения фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...