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

PowerShell执行角色资格调度请求报错SubjectNotFound求助

排查New-MgRoleManagementDirectoryRoleEligibilityScheduleRequest报SubjectNotFound错误的步骤

核心排查方向

报错SubjectNotFound通常意味着请求中的某个核心对象(主体、角色定义、范围)无法被Graph API识别,按以下顺序逐一验证:

1. 验证PrincipalId(组ID)的有效性

  • 确认$Id是组的Object ID(不是显示名称、邮件别名或其他非标准ID)
  • 执行以下命令检查组是否存在且当前上下文有权访问:
    Get-MgGroup -GroupId $Id
    
    如果返回空或报错,说明组ID错误或权限不足。

2. 检查DirectoryScopeId(管理单元范围)的格式

对比你成功的角色分配代码,两处格式存在差异:

  • 角色分配中使用带引号的格式:'/administrativeUnits/"{0}"' -f $AdminUnit
  • 资格请求中使用不带引号的格式:'/administrativeUnits/{0}' -f $AdminUnit

Graph API对管理单元范围的格式要求可能因操作类型不同,尝试两种格式测试:

  • 格式1(不带引号):"/administrativeUnits/$AdminUnit"
  • 格式2(带引号,需转义PowerShell引号):"/administrativeUnits/"$AdminUnit""

同时验证管理单元ID的有效性:

Get-MgDirectoryAdministrativeUnit -AdministrativeUnitId $AdminUnit

3. 确认RoleDefinitionId的合法性

虽然角色分配成功,但需验证该角色是否支持资格分配:

Get-MgRoleManagementDirectoryRoleDefinition -Filter "id eq 'c4e39bd9-1100-46d3-8c65-fb160da0071f'" | Select-Object Id, DisplayName, IsEligibleForAssignment

确保IsEligibleForAssignment属性为True,否则该角色无法设置资格。

4. 修正ScheduleInfo的日期格式

Graph API要求日期时间为UTC的ISO 8601格式,直接使用Get-Date可能导致格式不兼容,替换为:

StartDateTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")

5. 检查API权限

确认当前Connect-MgGraph的上下文拥有足够权限:

  • 必须具备RoleManagement.ReadWrite.Directory权限(或更细粒度的RoleEligibilitySchedule.ReadWrite.Directory)
  • 对比角色分配时的权限,资格分配可能需要额外的权限范围

修正后的示例代码

# 先验证核心对象是否存在
if (-not (Get-MgGroup -GroupId $Id -ErrorAction SilentlyContinue)) {
    Write-Error "指定的组ID不存在或无法访问"
    exit
}
if (-not (Get-MgDirectoryAdministrativeUnit -AdministrativeUnitId $AdminUnit -ErrorAction SilentlyContinue)) {
    Write-Error "指定的管理单元ID不存在或无法访问"
    exit
}

$params = @{
    Action = "adminAssign"
    Justification = "Assign Auth Admin eligibility to group"
    RoleDefinitionId = "c4e39bd9-1100-46d3-8c65-fb160da0071f"
    DirectoryScopeId = "/administrativeUnits/$AdminUnit" # 尝试不带引号的格式
    PrincipalId = $Id
    ScheduleInfo = @{
        StartDateTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
        Expiration = @{
            Type = "noExpiration"
         }
    }
}

New-MgRoleManagementDirectoryRoleEligibilityScheduleRequest -BodyParameter $params

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:01:13