如何通过MS Graph获取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)流仅支持应用权限,两种权限体系无法兼容。
具体解决路径:
切换至支持委托权限的身份验证流
委托权限需要模拟用户身份的交互型登录流(如授权码流、设备码流),示例代码:# 交互式登录,申请所需权限 Connect-MgGraph -Scopes "BitlockerKey.Read.All", "DeviceManagementManagedDevices.Read.All" # 调用获取密钥的命令 Get-MgInformationProtectionBitlockerRecoveryKey注意:需先在Entra管理中心的应用注册→API权限页面,点击「授予管理员同意」确认
BitlockerKey.Read.All权限生效。使用支持应用权限的替代API
若必须使用客户端凭据流(无用户交互),可通过Intune设备API间接获取单设备的BitLocker密钥,该端点支持DeviceManagementManagedDevices.Read.All应用权限:# 确保服务主体已配置DeviceManagementManagedDevices.Read.All应用权限并完成管理员同意 $devices = Get-MgDeviceManagementManagedDevice foreach ($device in $devices) { Get-MgDeviceManagementManagedDeviceBitlockerRecoveryKey -ManagedDeviceId $device.Id }验证令牌权限
用https://jwt.ms解析你的访问令牌:- 客户端凭据流的令牌只会包含
roles字段(应用权限),不会有scp字段(委托权限),所以BitlockerKey.Read.All不会生效; - 交互流的令牌会包含
scp字段,可确认是否包含目标权限。
- 客户端凭据流的令牌只会包含
内容的提问来源于stack exchange,提问作者Andrew Draper

