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}