企業でモバイル端末を管理する際、Intune 上に登録しているデバイスをスクリプトで一括制御したいと考えるシーンは多いものです。しかし、Microsoft Graph PowerShell のコマンドレットを用いた退役操作が意図した通りに動作しない場合、業務効率を大きく損なう原因となるでしょう。本記事では「Invoke-MgRetireDeviceManagementManagedDevice コマンドレット」が正常に機能しない理由や、具体的な対処法を詳しく解説します。
Intune 退役操作が失敗する背景と対策の全体像
Intune に登録したデバイスを退役(リタイア)することで、そのデバイスの企業データやポリシーの適用を解除し、セキュリティ面でのリスクを軽減することが可能です。しかし PowerShell スクリプトを用いて同じ操作を実行しようとすると、場合によってはエラーが発生してしまうことがあります。多くの場合、以下のような要因が絡み合っています。
- コマンドレットのバージョン問題(プレビュー版・ベータ版に起因する不具合)
- Azure AD ロールや Intune 側の権限不足、設定ミス
- 実際のエラーメッセージに基づくトラブルシューティング不足
- 他のポリシーや制限によって退役操作がブロックされている可能性
トラブルシュートを行う際には、まず「必要な前提条件を満たしているか」を一つひとつ確認していくことが重要です。次のセクションからは、具体的にどこをチェックしていくべきかを順を追って解説します。
Invoke-MgRetireDeviceManagementManagedDevice コマンドレットの概要
Invoke-MgRetireDeviceManagementManagedDevice コマンドレットは、Microsoft Graph PowerShell SDK の一部として提供されるデバイス管理用のコマンドレットです。従来の Azure AD Graph や Intune PowerShell モジュールからの移行が進む中、Microsoft Graph PowerShell SDK を利用することは主流になりつつあります。
ただし、Microsoft Graph PowerShell SDK には「beta」モジュールや「preview」バージョンが存在し、機能が安定していないことがあります。これにより、同じ操作を実行しても状況によって挙動が変わってしまう場合があるのです。
プレビュー版コマンドレットのリスク
プレビュー版やベータ版のコマンドレットを利用すると、最新の機能や変更点をいち早く試せる一方で、以下のようなリスクが伴います。
- 予期せぬエラーが発生する
- ドキュメントが十分に整備されていない場合がある
- 次回の更新でパラメーターや戻り値の仕様が突然変わる可能性がある
実運用で安定性を重視する場合は、極力一般提供(GA: General Availability)版のモジュールやコマンドレットを利用するのが望ましいでしょう。
実行前に確認すべき権限設定
権限不足が原因でデバイス退役がブロックされているケースは意外と多いです。見落としがちなロール設定や Graph API へのアクセス許可を再度洗い出すことで、問題解決への近道になることがあります。
Azure AD ロールと Intune ロールを再確認する
Azure AD 管理ロールや Intune の管理ロールは、それぞれに細やかな権限設定が存在します。たとえば、全体管理者(Global Administrator)であればほとんどの操作が可能ですが、それ以外のロールでは操作範囲に制限がある場合があります。
具体的には、下記のようなロールの確認が必要です。
- Intune Service Administrator
- Help Desk Operator
- Device Enrollment Manager
- Global Administrator (Azure AD)
また、管理者ロールとしては十分に権限があるように見えても、Microsoft Graph の API パーミッション(DeviceManagementManagedDevices.ReadWrite.All など)が割り当てられていないと操作できないことがあります。Azure Portal 上の「アプリ登録」や「API のアクセス許可」で適切なパーミッションが付与されているか確認しましょう。
PowerShell コマンドによる権限テスト例
インタラクティブな Azure Portal で権限を確認するだけでなく、PowerShell からも以下のようなコマンドを実行し、実際にロールが正しいかどうかを確かめる手段があります。
# Azure AD モジュールを使用する例
Connect-AzureAD
# 現在サインインしているユーザーのロールを一覧表示
Get-AzureADDirectoryRole | ForEach-Object {
Get-AzureADDirectoryRoleMember -ObjectId $_.ObjectId | Where-Object {$_.ObjectId -eq (Get-AzureADUser -ObjectId (Get-AzureADCurrentSessionInfo).Account.Id).ObjectId} | ForEach-Object {
$_.ObjectId | Out-Null
Write-Host "Role Name:" $_.DisplayName
}
}
このようなスクリプトで、自分が想定しているロールが正しくアサインされているかを確認してみるとよいでしょう。同様に、Microsoft Graph PowerShell SDK を使った場合でも、Get-MgRoleDefinition
や Get-MgRoleAssignment
などで必要権限がついているかチェックすることが可能です。
Intune ポータルや Graph API の直接呼び出しでの検証
PowerShell からの呼び出しで問題が起きている際、真っ先に試してほしいのが Intune ポータルでの操作確認です。もしポータルから問題なくデバイスを退役できるなら、PowerShell コマンドレット固有の不具合またはスクリプト側の問題が疑われます。
Intune ポータルからの退役操作
Intune (Microsoft Endpoint Manager) 管理センターからデバイスを退役する手順は比較的シンプルです。下記の手順を改めて確認してみてください。
- Microsoft Endpoint Manager 管理センター にアクセスし、管理者アカウントでサインイン
- 左側のメニューから「デバイス」を選択
- リタイアしたい対象デバイスをクリック
- 「…(その他)」メニューなどから「リタイア」を選択
もしここでリタイア操作が成功すれば、ポータル上の権限や Intune の構成は問題ないと考えられます。となると、PowerShell や Graph API 側の問題にフォーカスして対処を進める必要があります。
ポータル操作の具体的手順例
管理画面の各項目がわかりづらいという場合は、下記のような画面遷移を参考にしてください。
手順 | 画面・ボタン | 補足説明 |
---|---|---|
1 | 左メニュー「デバイス」 | 「デバイスの一覧」が表示される |
2 | 退役対象のデバイスをクリック | 詳細情報画面が開く |
3 | 上部バーの「…」(アクション)ボタンをクリック | ドロップダウンが表示される |
4 | メニューから「リタイア」を選択 | ポップアップで確認画面が出る |
5 | 確認画面で「はい」を選択 | リタイア処理が開始される |
Graph API (REST) 直接呼び出しテスト
Microsoft Graph は REST API としても提供されており、/deviceManagement/managedDevices/{id}/retire
のようなエンドポイントに対して直接リクエストを送ることが可能です。PowerShell コマンドレットに限定せず、REST API の呼び出しに挑戦することで、問題を切り分けることができます。
- PowerShell から Invoke-RestMethod を使用
- Postman や VS Code の REST Client 拡張機能を使用
- Azure Cloud Shell の curl コマンドなどを利用
これらの方法でリクエストを送信してみて成功するのであれば、Microsoft Graph PowerShell モジュール自体の問題か、もしくはモジュール特有の認証フロー・トークンスコープに問題があると推定できます。
HTTP メソッドによる実行例
以下に簡単な PowerShell スクリプト例を示します。ベアラートークンが取得済みであることを前提とします。
$token = "Bearer <アクセストークン>"
$deviceId = "<Intune上のManagedDeviceId>"
$graphEndpoint = "https://graph.microsoft.com/v1.0/deviceManagement/managedDevices/$deviceId/retire"
Invoke-RestMethod -Method Post -Uri $graphEndpoint -Headers @{ Authorization = $token }
上記スクリプトが正常に機能してデバイスが退役される場合は、Invoke-MgRetireDeviceManagementManagedDevice コマンドレット固有の不具合やパラメーター設定のミスが疑われます。
トラブルシューティングを加速する追加アプローチ
コマンドレットを最新にしても、権限を確認しても、ポータルでは成功するのに PowerShell では失敗する――このような状況に陥った場合は、さらに深掘りして調査する必要があります。
コードやスクリプトの検証
自作の PowerShell スクリプトに原因が潜んでいる可能性もあります。たとえば、以下のようなチェックポイントを再確認してください。
- パラメーターのスペルミスや大小文字の誤り
- コマンドレットを呼び出す順序(Connect-MgGraph の呼び出しが抜けていないか)
- 対象デバイスの ID が正確に指定されているか
- コンテキストのスコープ(スクリプト実行時にアクセストークンが正しく発行されているか)
権限を付与しただけでなく、その権限が反映されるまでに時間差がある場合もあります。とくに大規模組織の Azure AD や Intune では変更が一斉に適用されるまでのラグがある場合があるため、権限を与えた直後には再ログインしたり一定時間待ってから再試行するのも有効です。
サンプルスクリプトの提示
参考までに、以下に「Invoke-MgRetireDeviceManagementManagedDevice」を用いる簡単なサンプルスクリプトを示します。もしこのコードが正常に動作しない場合は、エラー内容をフォーラムなどに具体的に提示すると解析の手がかりになるでしょう。
# Microsoft Graph PowerShell へのサインイン
Connect-MgGraph -Scopes "DeviceManagementManagedDevices.ReadWrite.All"
# 対象デバイスの一例(ManagedDevice ID)の取得例
# Intune に登録されているデバイス一覧を取得してみる
$devices = Get-MgDeviceManagementManagedDevice
foreach ($d in $devices) {
Write-Host "Device Name: $($d.DeviceName) | Device ID: $($d.Id)"
}
# 退役したいデバイスの ID を変数に格納
$targetDeviceId = "<RetireTargetDeviceID>"
# 退役コマンドの実行
Invoke-MgRetireDeviceManagementManagedDevice -ManagedDeviceId $targetDeviceId
上記スクリプトを実行し、エラーが出た際にはエラーメッセージの内容が重要です。例えば「Insufficient privileges to complete the operation」などが表示された場合は、権限が足りないか、ロールや API パーミッションに問題があると推測できます。
まとめ
「Invoke-MgRetireDeviceManagementManagedDevice コマンドレット」で Intune 登録デバイスを退役できない原因は、バージョン不整合、権限不足、PowerShell モジュール特有の不具合など、さまざまな要因が複合しています。以下のポイントを総合的に確認することで、解決への糸口が見つかるでしょう。
- コマンドレットのバージョンチェック: 可能なら GA(一般提供)版を利用
- Azure AD / Intune 権限の再点検: 必要ロールが正しく付与されているか、一度ポータルからも操作を試す
- Graph API 直接呼び出しの検証: REST API レベルで操作が成功するなら、PowerShell コマンドレット固有の問題を疑う
- エラーメッセージの精査: エラー内容をもとにフォーラムやサポートに問い合わせることで、より的確な助言を得られる
- 企業内のポリシーや設定の影響: 大規模組織の場合はセキュリティポリシーが複雑化しているため、その影響も再検討する
最終的にどうしても解決しない場合は、Microsoft Tech Community や Stack Overflow などにエラーメッセージや環境構成を具体的に提示した上で質問してみてください。企業の有償サポートやコンサルティングを利用するのも一つの選択肢です。スムーズな退役操作を実現し、セキュリティリスクを最小化しつつ運用の効率化を図りましょう。
コメント