我想知道特定用户所属的网站集。 不幸的是,我的PowerShell知识仍然非常有限。
这是我到目前为止所提出的,但它极其缓慢,并且不会返回我想要的结果。
Get-SPOSite | ForEach-Object {Get-SPOUser -Site https://contoso.sharepoint.com/ -Limit All | Where-Object {$_.LoginName -eq "user@contoso.com"}}
不幸的是,输出显示了用户(显示名称,登录名,组),而不是相关用户所属的不同网站集。
我觉得cmdlet必须互换,即
Get-SPOUser -site https://contoso.sharepoint.com/ | ForEach-Object {Get-SPOSite -Limit All | Where-Object {$_.LoginName -eq "usern@contoso.com"}}
但是,此命令会运行,但不会结束或给出错误消息。
提前感谢您的帮助。
答案 0 :(得分:0)
使用-Limit All
呼叫Get-SPOUser
将返回网站上的每个用户。而不是获得那个(可能是大量的)用户集合,然后过滤它以获得您想要的一个用户,为什么不首先通过提供-LoginName
参数手术检索您想要的一个用户?
Get-SPOUser -Site https://contoso.sharepoint.com -LoginName "user@contoso.com"
这应该明显加快。
要在所有网站集中执行该检查,而不是手动为其提供-Site
参数,您可以将结果从Get-SPOSite
传送到for-each循环,并通过{{访问每个网站1}}令牌。
$_
(请注意,get-sposite | %{ $user = get-spouser -site $_ -loginName "user@contoso.com"; if($user.Groups.Count -gt 0){write-output $_.url ":" $user.Groups} }
是%{ }
的简写别名。)
上述代码的输出格式不是最精美的。例如,如果用户是多个组的成员(让他们称之为第一组和第二组),他们将显示在同一行上,它们之间没有空格,
e.g。 ForEach-Object{ }
作为更清洁的替代方案,请考虑将结果存储到PowerShell对象数组中,如下所示:
https://contoso.sharepoint.com/site : Group OneGroupTwo
那会给你这样的结果:
$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