コマンド集 / Entra ID / Intune
Entra ID / Intune コマンド集
Entra ID とオンプレ AD のハイブリッド構成で、Graph 接続・同期・デバイス参加・Autopilot・Intune・条件付きアクセスを確認・操作するコマンドを、同期スコープの事故を含む実測の罠つきで引ける。
オンプレ AD ad.lab.example.jp を Entra ID へ一方向に同期し、人の ID は Entra、マシンとサービスは AD が権威、という分担のラボ向け。同期エージェントは sync01(Windows Server 2022)。テナントは本番と共用なので、同期スコープと本物のアカウントが交差しない設計を前提にしている。
Graph に繋ぐ#
対話で繋ぐ#
スコープは最小で取る。管理センターで見えるものでも、Graph では別の権限になっていることが多い。
Connect-MgGraph -Scopes "User.Read.All","Group.Read.All","Device.Read.All"
Get-MgContext | Select-Object TenantId,Account,AuthType,Scopes
⚠️ az login の Azure CLI アプリには Intune のスコープが同意されていない。Microsoft.Graph モジュールを入れても解決せず、対話認証になるので自動化には使えない。専用のアプリ登録を作る。
アプリ専用(証明書)で繋ぐ#
サーバー上で鍵をエクスポート不可で作り、公開証明書だけを登録する。秘密鍵は運ばない。
New-SelfSignedCertificate -Subject "CN=notify-<host>" -CertStoreLocation Cert:\LocalMachine\My -KeyExportPolicy NonExportable -KeySpec Signature -KeyAlgorithm RSA -KeyLength 2048 -NotAfter (Get-Date).AddYears(2)
Connect-MgGraph -TenantId <tenant-id> -ClientId <app-id> -CertificateThumbprint <thumbprint> -NoWelcome
⚠️ az ad app credential reset --cert @file は --append を付けないと既存の資格情報が全部消える。--end-date を省くと 1 年に丸められる。Unsupported app-only call を返す API(MDM 登録ポリシーなど)は権限不足ではなく API 側の制限。
一覧は最後のページまで取る#
$top=999 の 1 ページ目だけ見て「存在しない」と結論した実例あり(497 件中 1 ページ)。
Get-MgApplication -All | Select-Object DisplayName,AppId
Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/servicePrincipals?`$top=999" | Select-Object -ExpandProperty '@odata.nextLink'
⚠️ @odata.nextLink が返る限り辿る。権限エラーを catch { continue } で捨てると「0 件」が不在の証明に化ける。
ユーザーとグループ#
検索する#
Get-MgUser -Filter "startsWith(userPrincipalName,'user')" -Property Id,UserPrincipalName,OnPremisesSyncEnabled,OnPremisesDistinguishedName
Get-MgUser -Filter "onPremisesSyncEnabled eq true" -All | Select-Object UserPrincipalName,OnPremisesSecurityIdentifier
⚠️ クラウド同期は onPremisesDistinguishedName を埋めない(Connect Sync とは違う)。空でも異常ではない。
グループとメンバー#
Get-MgGroup -Filter "startsWith(displayName,'<動的グループ名>')" | Select-Object Id,DisplayName,MembershipRule
Get-MgGroupMember -GroupId <group-id> -All | Select-Object Id
⚠️ プロビジョニングは入れ子のグループを辿らない。静的グループの中に動的グループを入れず、アプリへ直接割り当てる。ロールを定義しているアプリに既定アクセスの GUID 00000000-... で割り当てると Permission being assigned was not found on application で弾かれる。
動的グループの規則#
同期されたユーザーは onPremisesDistinguishedName に DN を持つので、OU 構成をそのまま写せる(Connect Sync の場合)。
(user.onPremisesDistinguishedName -endsWith "OU=Standard,OU=Users,OU=Example,DC=ad,DC=lab,DC=example,DC=jp")
(user.onPremisesSecurityIdentifier -ne null)
(device.devicePhysicalIds -any (_ -eq "[OrderID]:<タグ>"))
⚠️ user.dirSyncEnabled -eq true は使わない。同期エンジンのサービスアカウント ADToAADSyncServiceAccount が混ざる(フラグは立つが DN も SID も無い)。規則を変えると既存メンバーが一度外れる。
Entra Connect / 同期#
どちらのエンジンか#
このラボはクラウド同期が主(sync01)。Connect Sync は検証用に別 OU を排他で持たせている。同じオブジェクトを 2 つのエンジンで扱うのは非サポート。
Get-Service AADConnectProvisioningAgent,ADSync,ODJConnectorSvc | Select-Object Name,Status,StartType
⚠️ ADSync が Running でもコネクタ 0 個の残骸のことがある。Get-ADSyncScheduler が 0x80230613 を返すのがその状態で、診断を誤らせる。
同期を回す・待つ・結果を見る#
Import-Module ADSync
Get-ADSyncScheduler
Start-ADSyncSyncCycle -PolicyType Delta
while ((Get-ADSyncScheduler).SyncCycleInProgress) { Start-Sleep 10 }
Get-ADSyncRunProfileResult -NumberRequested 4 | Select-Object ConnectorName,RunProfileName,Result
⚠️ スケジューラを止めない。止めると手動サイクルが起動できず、Set-ADSyncScheduler 自体も Configuration can not be changed while Connectors are running で失敗する。サイクルは起動直後まだ SyncCycleInProgress が立たないので、待つ前に少し眠る。
スコープは allow-list で持つ#
「ドメインルートから 12 個を除外」という形は、後から作った OU を既定で取り込む。2026-09-22、この形を読んで「対象は空の OU だけ」と結論した後に作った OU=NewDept の 2,004 件が本番テナントへ同期された。
$c = Get-ADSyncConnector | Where-Object { $_.Type -eq 'AD' }
$p = $c.Partitions | Where-Object { $_.Name -eq 'ad.lab.example.jp' }
$p.ConnectorPartitionScope.ContainerInclusionList
$p.ConnectorPartitionScope.ContainerExclusionList
$p.ConnectorPartitionScope.ContainerInclusionList = [string[]]@("OU=Sync,DC=ad,DC=lab,DC=example,DC=jp")
$p.ConnectorPartitionScope.ContainerExclusionList = [string[]]@()
Add-ADSyncConnector -Connector $c | Out-Null
Start-ADSyncSyncCycle -PolicyType Initial
⚠️ Set-ADSyncConnector は存在しない。保存も Add-ADSyncConnector。スコープ変更はフルインポート(Initial)でしか効かず、コネクタ稼働中は失敗が静か。書いたら読み返す。「同期された」だけでは足りず、NoSync-* の対照群が上がっていないことも見る。サービスアカウントやサーバーが Entra に上がったらスコープが間違っている。
誤削除しきい値で止まったとき#
スコープを絞ると、外れた分は削除として Entra へ流れる。既定は 1 サイクル 500 件で止まる。
Error Code: 95. Unable to process this synchronization cycle in Azure Active Directory
because the object deletion threshold was met or exceeded. Export Errors : 2281
Disable-ADSyncExportDeletionThreshold -AADUserName <全体管理者の UPN>
Restart-Service ADSync -Force
Start-Sleep 90
Start-ADSyncSyncCycle -PolicyType Delta
while ((Get-ADSyncScheduler).SyncCycleInProgress) { Start-Sleep 10 }
Get-ADSyncRunProfileResult -NumberRequested 4 | Select-Object ConnectorName,RunProfileName,Result
Enable-ADSyncExportDeletionThreshold -DeletionThreshold 500 -AADUserName <UPN>
⚠️ Disable- だけでは効かない。無効化は Entra 側に書かれるが同期サービスは古い値を持ったまま Error Code: 95 を返し続ける。Restart-Service ADSync を挟んで初めて通った。Enable- は成功を確かめてから戻す。両コマンドとも引数を省くと対話で聞かれ、空のまま進むと何も起きないのにエラーも出ない。
match フラグ(Graph)#
Connect-MgGraph -Scopes "OnPremDirectorySynchronization.ReadWrite.All"
$s = Get-MgDirectoryOnPremiseSynchronization
$s.Features | Select-Object BlockSoftMatchEnabled,BlockCloudObjectTakeoverThroughHardMatchEnabled,PasswordSyncEnabled
⚠️ 同期は UPN またはプライマリ SMTP が一致するクラウドユーザーをソフトマッチで結合し、結合後に AD 側を消すとクラウドの実アカウントも消える。AD の代替 UPN サフィックスは実ユーザーが 0 件の <テナント>.onmicrosoft.com にし、衝突しうる値を選べない状態にする。
デバイスと参加状態#
Windows 側で見る#
dsregcmd /status
⚠️ DSREG_TOKEN_MISSING_ON_PREM_ID (0x801c0095) は 2025 DC で EnableKerbHaadj.exe → 再起動、SEC_E_LOGON_DENIED (0x8009030c) は DRS の KerberosPolicy:ExchangeForJwt タグ。どちらも出たときの対処で前提条件ではない。DRS の servicePrincipalNames と tags は配列ごと置き換わるので既存を読んでから足す。
参加させる#
OU=HybridJoin に入れることが必須。既定の CN=Computers に落ちると同期対象外で GPO も当たらない。
Add-Computer -DomainName ad.lab.example.jp -NewName <name> -OUPath "OU=HybridJoin,OU=Devices,OU=Example,DC=ad,DC=lab,DC=example,DC=jp" -Credential (Get-Credential) -Restart
Test-ComputerSecureChannel
⚠️ 参加と同時に改名する。後から改名すると登録済みの情報と食い違う。参加時は DC に直接届くセグメントに置く。
Entra 側で見る#
Get-MgDevice -Filter "displayName eq '<コンピューター名>'" -Property DisplayName,TrustType,OnPremisesSyncEnabled,IsCompliant,IsManaged
Get-MgDevice -Filter "trustType eq 'ServerAd'" -All | Select-Object DisplayName,ApproximateLastSignInDateTime
⚠️ trustType は ServerAd(ハイブリッド)/ AzureAd(Entra 参加)/ Workplace(登録のみ)。表示名は端末のホスト名から来るので、Entra 側だけ変えても戻る。
macOS#
Intune 登録だけでは参加にならず、Platform SSO ポリシーを通してしか Entra Join にならない。Company Portal は App Store に無い。
brew install --cask intune-company-portal
security find-certificate -a -c "MS-Organization-Access" /Library/Keychains/System.keychain
log show --last 1h --predicate 'subsystem contains "com.microsoft.CompanyPortalMac"'
⚠️ 設定カタログの Registration Token に {{DEVICEREGISTRATION}}(波括弧ごと)を入れないと Entra Join にならない。割り当てはユーザー向け(デバイスグループは非対応)。profiles -L はユーザースコープしか見せない。Platform SSO には Company Portal 5.2604.0 以上が要る。
Autopilot#
VM のシリアルを先に入れる#
Proxmox は既定で DMI シリアルを書かず、Win32_BIOS.SerialNumber が空になる。Autopilot はシリアルを主キーに扱う。
qm set <vmid> -smbios1 'uuid=<既存の UUID を必ず引き継ぐ>,serial=<base64>,base64=1'
⚠️ SMBIOS を変えるとハードウェアハッシュも変わる。シリアルを設定してからハッシュを取る。qm set は smbios1 を丸ごと置き換えるので UUID を書き忘れると別の機体になる。
ハードウェアハッシュを取る#
Get-WindowsAutopilotInfo を入れなくても取れる。
(@(Get-CimInstance -Namespace root/cimv2/mdm/dmmap -ClassName MDM_DevDetail_Ext01))[0].DeviceHardwareData
Get-CimInstance Win32_BIOS | Select-Object SerialNumber
⚠️ -Filter を付けると引用符が壊れて空を返すことがある。フィルタ無しで列挙して [0] を取る。
登録・割り当て・ESP#
POST /v1.0/deviceManagement/importedWindowsAutopilotDeviceIdentities
GET /v1.0/deviceManagement/importedWindowsAutopilotDeviceIdentities/<id> -> deviceImportStatus
GET /v1.0/deviceManagement/windowsAutopilotDeviceIdentities -> deploymentProfileAssignmentStatus
⚠️ 投入直後は一覧に出ない。deviceImportStatus が complete になってからさらに数分かかる。notAssigned の端末はリセットしても Autopilot が始まらない。タグごとにグループを分け、検証機のプロファイルが実機に効かないようにする。ESP はデバイスフェーズなので、ユーザー対象のポリシーは事前プロビジョニングに間に合わない。
同じ OU を 4 箇所に書く#
デバイス同期のスコープ/ODJ コネクタの .exe.config/OU の ACL(MSA に CreateChild computer)/Intune の Domain Join プロファイル。ズレた場所で症状が全部違う。
$sch = (Get-ADRootDSE).schemaNamingContext
[guid](Get-ADObject -SearchBase $sch -LDAPFilter "(lDAPDisplayName=computer)" -Properties schemaIDGUID).schemaIDGUID
⚠️ 新しい ODJ コネクタはサーバーのコンピューターアカウントではなく MSA(msaODJ<ランダム>$)で動き、既定では OU に computer を作れない。旧コネクタの「10 台まで通る」と読むと 1 台目から失敗する。
コネクタのログはイベントログ#
C:\ProgramData\Microsoft\ODJConnector は存在しない。
Get-WinEvent -LogName 'Microsoft-Intune-ODJConnectorService/Operational' -MaxEvents 2000 | Where-Object Level -le 3 | Format-List TimeCreated,Id,LevelDisplayName,Message
wevtutil epl "Microsoft-Intune-ODJConnectorService/Operational" C:\Temp\odj.evtx
⚠️ Level -le 3 と数値で絞る。日本語ロケールでは LevelDisplayName が「エラー」で返り -match 'Error' は空振り。Id=30121 は 30 秒ごとの正常ノイズ、見るのは 30122(Download_Failure)。WHfB はクラウド Kerberos 信頼(UseCloudTrustForOnPremAuth)にし、UseCertificateForOnPremAuth を入れると証明書信頼が優先されて効かなくなる。設定カタログは親設定の下に入れ子にしないと 400。
Intune#
管理対象デバイス#
Connect-MgGraph -Scopes "DeviceManagementManagedDevices.Read.All"
Get-MgDeviceManagementManagedDevice -All | Select-Object DeviceName,OperatingSystem,ComplianceState,LastSyncDateTime,DeviceEnrollmentType,ManagedDeviceOwnerType,IsEncrypted
⚠️ 端末への同期(syncDevice)や名前変更は DeviceManagementManagedDevices.PrivilegedOperations.All が要る。遠隔ワイプもできる権限なので、読み取り用アプリには持たせない。
端末側で同期・状態を見る#
Get-ScheduledTask -TaskPath "\Microsoft\Windows\EnterpriseMgmt\*" | Start-ScheduledTask
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\PolicyManager\current\device\Defender"
⚠️ MDM 由来の設定は PolicyManager\current\device\... に入る。Get-MpPreference の値が期待どおりでも元からそうだったことがある。configurationPolicies/{id}?$expand=assignments は割り当てを返さないので専用の /assignments を見る。detectedApps は消したアプリが残る。
コンプライアンス#
条件付きアクセスが compliantDevice を見るなら、ポリシーが 0 件だと全端末が既定で準拠になる。
Get-MgDeviceManagementDeviceCompliancePolicy -All | Select-Object DisplayName,Id
Get-MgDeviceManagementManagedDevice -All | Group-Object ComplianceState | Select-Object Name,Count
⚠️ iOS の userEnrollment(個人所有)にパスコード条件を 1 つでも入れると、Intune が 6 桁 PIN を強制し15 分ごとに促し続ける。条件を書く前に登録種別を見る。
条件付きアクセス#
一覧を読む・レポート専用にする#
enabled は「効いている」ではない。対象アプリが None のポリシーは永久に発火しない。
Connect-MgGraph -Scopes "Policy.Read.All"
Get-MgIdentityConditionalAccessPolicy | Select-Object DisplayName,State
(Get-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId <id>).Conditions.Applications | Select-Object IncludeApplications,ExcludeApplications
(Get-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId <id>).GrantControls | Select-Object Operator,BuiltInControls
Update-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId <id> -State enabledForReportingButNotEnforced
⚠️ Operator が OR で mfa と compliantDevice が並ぶと、準拠デバイスなら MFA は要求されない。管理者 MFA のポリシーで本人が除外されていて誰にも当たっていなかった実例あり。除外を外す前に本人の MFA 登録を確認する。
break-glass の除外#
条件付きアクセスを壊しても入れる口を 1 つ残す。Policy.ReadWrite.ConditionalAccess は読み取り用アプリに持たせない(変更はポータルで)。
(Get-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId <id>).Conditions.Users | Select-Object ExcludeUsers,ExcludeGroups
⚠️ 同期サービスアカウント ADToAADSyncServiceAccount は MFA や対話型認証のポリシーが効くとエラーになる。全ユーザー対象のポリシーを足すときは除外を確認する。
困ったとき#
同期エージェントが黙って止まる#
Get-Service AADConnectProvisioningAgent,ODJConnectorSvc | Select-Object Name,Status,StartType
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7034} -MaxEvents 20
⚠️ 稼働中の Windows VM に qm set -net0 ...,firewall=1 を当てるとホットプラグでエージェントが落ちる。止めてから設定して起動。qm shutdown が got timeout のまま「再起動した」と言わない。
Connect Sync の導入が LocalDB で落ちる#
[SQLLocalDB] WaitForMultipleObjects エラー 575 → [ADSyncBootstrap] Sqlcmd: Login timeout expired の連鎖。
⚠️ ドメイン参加直後の初回プロファイル作成中にインストーラーを走らせたのが引き金。一度ログオンしてプロファイルを作り切り、再起動してから入れる。エージェントのホストは Windows Server 2022、事前に TLS 1.2 をレジストリで有効化して再起動。Get-HotFix は累積更新に含まれた KB を列挙しないので、未適用の証明にならない。