调用Microsoft Graph SetDeviceName批量重命名设备返回Bad Request问题
问题原因与修复方案
以下按触发概率从高到低列出代码存在的问题:
- 请求头格式错误
代码中直接将$appauthToken传入-Headers参数的写法不符合Invoke-RestMethod的参数要求。该参数必须接收哈希表结构的键值对,不能直接传入token字符串,正确的请求头构造方式如下:
直接传入字符串会导致HTTP请求头格式不符合规范,被服务端判定为无效请求返回400。$requestHeaders = @{ Authorization = "Bearer $appauthToken" } - 新设备名长度超限
Windows设备的主机名最大支持15个字符,在原有设备名前拼接Test-前缀后,如果原设备名长度超过10位,总长度就会超出系统限制,接口会直接返回400拒绝请求。建议执行接口调用前先打印生成的新名称做长度校验,超长名称做截断处理。 - PowerShell 5.1默认编码不匹配
PowerShell 5.1自带的Invoke-RestMethod发送JSON请求时默认使用ISO-8859-1编码,而非接口要求的UTF-8。如果设备名包含非ASCII字符(比如中文、特殊符号),会导致服务端解析请求体失败。解决方法是将ContentType参数显式设置为application/json; charset=utf-8。 - 过期设备状态不支持修改
筛选条件匹配的是316天未同步的失活设备,这类设备在Intune服务端大多被标记为过期状态,不支持触发setDeviceName这类主动设备操作,调用这类设备的接口也会返回400错误。另外需要提前校验$deviceID是否为空,空ID会导致请求URI格式错误触发400。
调试时可以先取一个近期同步过、设备名较短的测试设备ID单独调用接口,先打印
$Body变量确认生成的JSON结构为{"deviceName":"xxx"}的标准格式,再逐步排查其他问题。
内容的提问来源于stack exchange,提问作者Niklas Christensen
相关产品推荐
相关产品推荐

