SharePoint Online: поиск всех семейств сайтов, членом которых является пользователь

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

Вот то, что я придумала до сих пор, но это очень медленно и не возвращает результаты, которые я хочу получить.

Get-SPOSite | ForEach-Object {Get-SPOUser -Site https://contoso.sharepoint.com/ -Limit All | Where-Object {$_.LoginName -eq "user@contoso.com"}}

К сожалению, в выходных данных отображается пользователь (отображаемое имя, имя для входа, группы), а не разные семейства сайтов, членом которых является данный пользователь.

У меня такое ощущение, что нужно менять местами командлеты, т.е.

Get-SPOUser -site https://contoso.sharepoint.com/ | ForEach-Object {Get-SPOSite    -Limit All | Where-Object {$_.LoginName -eq "usern@contoso.com"}}

Однако эта команда выполняется, но не заканчивается или выдает сообщение об ошибке.

Спасибо заранее за вашу помощь.

1 ответ

Призвание Get-SPOUser с -Limit All вернет каждого пользователя на сайте. Вместо того, чтобы собирать эту (потенциально огромную) коллекцию пользователей и затем фильтровать ее, чтобы получить того пользователя, которого вы хотите, почему бы не получить хирургическое извлечение того пользователя, которого вы хотите, в первую очередь, предоставив -LoginName параметр?

Get-SPOUser -Site https://contoso.sharepoint.com -LoginName "user@contoso.com"

Это должно быть значительно быстрее.

Чтобы выполнить эту проверку во всех семействах сайтов, вместо -Site Параметр вручную, вы можете передать результаты из Get-SPOSite для каждого цикла и доступ к каждому сайту через $_ маркер.

get-sposite | %{ $user = get-spouser -site $_ -loginName "user@contoso.com"; if($user.Groups.Count -gt 0){write-output $_.url ":" $user.Groups} } 

(Обратите внимание, что %{ } это сокращенный псевдоним для ForEach-Object{ } .)

Вывод из приведенного выше кода не самый красиво отформатированный. Например, если пользователь является членом нескольких групп (назовем их Группой Один и Группой Два), они будут отображаться в одной строке без пробелов между ними,

например https://contoso.sharepoint.com/site : Group OneGroupTwo

В качестве более чистой альтернативы рассмотрите возможность сохранения результатов в массив объектов PowerShell, например:

$arr = @(); get-sposite | %{ $user = get-spouser -site $_ -loginName "user@contoso.com"; if($user.Groups.Count -gt 0){ $arr += new-object psobject -property @{site=$_.url; groups=$user.Groups} } }; $arr

Это должно дать вам такие результаты:

site                      groups
----                      ------
https://contoso.com       {Site Members}
https://contoso.com/site  {Group One, Group Two}
Другие вопросы по тегам