应用注册下PnP PowerShell脚本获SharePoint权限时Role列为空求助
原脚本核心问题分析
- 组权限获取逻辑错误
原脚本使用$group.Roles获取组权限,但PnP PowerShell的Get-PnPGroup返回的对象默认未加载权限相关属性,直接访问会返回空值。 - 直接权限循环未执行
代码中注释了$roleAssignments = Get-PnPRoleAssignment,且使用了未定义的$Object变量,导致直接权限的用户数据完全未被收集。 - 直接用户处理逻辑错误
当角色分配主体是单个用户时,用Get-PnPGroupMember会报错(用户不属于任何组),需区分用户和组类型处理。
修正后的完整脚本
Connect-PnPOnline -Interactive -ClientId "#clinetID" -Url "#SiteURl" # 初始化结果数组 $result = @() # 处理站点组及组内用户权限 $groups = Get-PnPGroup foreach ($group in $groups) { # 获取组的有效权限级别(排除Limited Access) $groupPermissions = Get-PnPGroupPermissions -Identity $group $roleNames = ($groupPermissions.RoleDefinitions | Where-Object { $_.Name -ne "Limited Access" }).Name -join ", " # 获取组成员 $members = Get-PnPGroupMember -Identity $group foreach ($member in $members) { $result += [PSCustomObject]@{ GroupName = $group.Title UserName = $member.Title LoginName = $member.LoginName PrincipalType = $member.PrincipalType Role = $roleNames } } } # 处理直接分配权限的用户/未纳入站点组的权限组 $roleAssignments = Get-PnPRoleAssignment -IncludeSecurityGroups foreach ($roleAssignment in $roleAssignments) { # 加载角色绑定和主体对象的属性 Get-PnPProperty -ClientObject $roleAssignment -Property RoleDefinitionBindings, Member # 提取有效权限级别 $permissionLevels = ($roleAssignment.RoleDefinitionBindings | Where-Object { $_.Name -ne "Limited Access" }).Name -join ", " if ([string]::IsNullOrEmpty($permissionLevels)) { continue } # 根据主体类型获取对应信息 $principal = $null $groupName = "" switch ($roleAssignment.Member.PrincipalType) { "User" { $principal = Get-PnPUser -Identity $roleAssignment.Member.LoginName $groupName = "Direct Assignment" } "SharePointGroup" { $principal = Get-PnPGroup -Identity $roleAssignment.Member.LoginName # 跳过已处理的站点组,避免重复数据 if ($groups.Id -contains $principal.Id) { continue } $groupName = $principal.Title } default { $principal = $roleAssignment.Member $groupName = "Direct Assignment" } } $result += [PSCustomObject]@{ GroupName = $groupName UserName = $principal.Title LoginName = $principal.LoginName PrincipalType = $roleAssignment.Member.PrincipalType Role = $permissionLevels } } # 导出报表到CSV(-NoTypeInformation避免添加冗余类型头) $result | Export-Csv -Path "C:\Temp\SharePointUserAccessReport3133.csv" -NoTypeInformation
关键修复说明
- 组权限获取:改用
Get-PnPGroupPermissions直接拉取组的权限定义,确保Role列能正确填充权限级别名称。 - 直接权限处理:启用
Get-PnPRoleAssignment遍历站点所有权限分配,覆盖直接赋权的用户和特殊权限组。 - 主体类型适配:通过
PrincipalType区分用户、SharePoint组,分别调用Get-PnPUser/Get-PnPGroup获取信息,避免报错。 - 数据去重:跳过已在站点组循环中处理过的组,防止重复数据。
- 无效权限过滤:排除仅含
Limited Access的权限条目,减少无效报表内容。
内容的提问来源于stack exchange,提问作者Supriya Kadiyala
相关产品推荐
相关产品推荐

