You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用注册下PnP PowerShell脚本获SharePoint权限时Role列为空求助

SharePoint站点权限报表脚本修复(Role列空值问题)

原脚本核心问题分析

  1. 组权限获取逻辑错误
    原脚本使用$group.Roles获取组权限,但PnP PowerShell的Get-PnPGroup返回的对象默认未加载权限相关属性,直接访问会返回空值。
  2. 直接权限循环未执行
    代码中注释了$roleAssignments = Get-PnPRoleAssignment,且使用了未定义的$Object变量,导致直接权限的用户数据完全未被收集。
  3. 直接用户处理逻辑错误
    当角色分配主体是单个用户时,用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

关键修复说明

  1. 组权限获取:改用Get-PnPGroupPermissions直接拉取组的权限定义,确保Role列能正确填充权限级别名称。
  2. 直接权限处理:启用Get-PnPRoleAssignment遍历站点所有权限分配,覆盖直接赋权的用户和特殊权限组。
  3. 主体类型适配:通过PrincipalType区分用户、SharePoint组,分别调用Get-PnPUser/Get-PnPGroup获取信息,避免报错。
  4. 数据去重:跳过已在站点组循环中处理过的组,防止重复数据。
  5. 无效权限过滤:排除仅含Limited Access的权限条目,减少无效报表内容。

内容的提问来源于stack exchange,提问作者Supriya Kadiyala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:27:43