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

如何通过MS Graph获取Intune设备的BitLocker恢复密钥?

获取Intune设备BitLocker恢复密钥的权限问题

我需要获取Intune中所有设备及其关联的BitLocker恢复密钥(若存在),目前能正常获取设备列表,但始终无法通过权限验证获取BitLocker密钥。我用了两种PowerShell方法,均使用同一服务主体身份验证:

方法1:使用Graph Cmdlet

C:\> Get-MgInformationProtectionBitlockerRecoveryKey
Get-MgInformationProtectionBitlockerRecoveryKey_List1: Failed to authorize, token doesn't have the required permissions.

方法2:直接调用Graph API

C:\> $Params = @{
>>     Uri = "https://graph.microsoft.com/beta/informationProtection/bitlocker/recoveryKeys"
>>     Headers = @{
>>         Authorization = "Bearer $Token"
>>         ConsistencyLevel = "eventual"
>>     }
>>     ErrorAction = 'Stop'
>> }
C:\> (Invoke-RestMethod @Params)
Invoke-RestMethod: {"error":{"code":"authorization_error","message":"Failed to authorize, token doesn't have the required permissions.","innerError":{"date":"2023-11-10T19:18:31","request-id":"xxxxxxxxxxxxxxxx","client-request-id":"xxxxxxxxxxxxxxxxxxxx"}}}

权限配置情况

该服务主体此前运行正常,已被授予Global Reader和Intune Administrator角色,同时配置了BitlockerKey.Read.All权限。注意BitlockerKey.Read.All仅支持委托权限,无应用权限选项,我已按照微软文档设置委托权限并授予相关角色,但授权仍失败。

身份验证代码

方法1:Connect-MgGraph

$Params = @{
    ClientId = $ClientId
    ClientSecret = $ClientSecret
    TenantId = $TenantId
    ForceRefresh = $true
    ErrorAction = 'Stop'
}
$AccessToken = (Get-MsalToken @Params).AccessToken
Connect-MgGraph -AccessToken $AccessToken -ErrorAction Stop |Out-Null

方法2:Invoke-RestMethod获取令牌

$Params = @{
    Uri = "https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token"
    Body = @{
        'client_id' = $Credential.UserName
        'scope' = 'https://graph.microsoft.com/.default'
        'client_secret' = $Credential.GetNetworkCredential().password
        'grant_type' = 'client_credentials'
    }
    Method = 'Post'
    ContentType = 'application/x-www-form-urlencoded'
    ErrorAction = 'Stop'
}
$GraphAccessToken = Invoke-RestMethod @Params |Select-Object -ExpandProperty access_token
[pscustomobject]@{
    GraphAccessToken = $GraphAccessToken
}

后续尝试

我试过在Entra身份验证页面添加额外Uri,也用Get-MsalToken替代Invoke-RestMethod获取令牌,但都没用,还是报相同错误。


解决方案

问题核心在于权限类型与身份验证流不匹配:BitlockerKey.Read.All是委托权限,而你使用的客户端凭据(client_credentials)流仅支持应用权限,两种权限体系无法兼容。

具体解决路径:

  1. 切换至支持委托权限的身份验证流
    委托权限需要模拟用户身份的交互型登录流(如授权码流、设备码流),示例代码:

    # 交互式登录,申请所需权限
    Connect-MgGraph -Scopes "BitlockerKey.Read.All", "DeviceManagementManagedDevices.Read.All"
    # 调用获取密钥的命令
    Get-MgInformationProtectionBitlockerRecoveryKey
    

    注意:需先在Entra管理中心的应用注册→API权限页面,点击「授予管理员同意」确认BitlockerKey.Read.All权限生效。

  2. 使用支持应用权限的替代API
    若必须使用客户端凭据流(无用户交互),可通过Intune设备API间接获取单设备的BitLocker密钥,该端点支持DeviceManagementManagedDevices.Read.All应用权限:

    # 确保服务主体已配置DeviceManagementManagedDevices.Read.All应用权限并完成管理员同意
    $devices = Get-MgDeviceManagementManagedDevice
    foreach ($device in $devices) {
        Get-MgDeviceManagementManagedDeviceBitlockerRecoveryKey -ManagedDeviceId $device.Id
    }
    
  3. 验证令牌权限
    用https://jwt.ms解析你的访问令牌:

    • 客户端凭据流的令牌只会包含roles字段(应用权限),不会有scp字段(委托权限),所以BitlockerKey.Read.All不会生效;
    • 交互流的令牌会包含scp字段,可确认是否包含目标权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:14:56