Connect 1.4.xx.x とデバイスの消失Microsoft Entraについて

Microsoft Entra Connect のバージョン 1.4.xx.x を実装すると、Windows デバイスの一部または全部がMicrosoft Entra IDから消える可能性があります。 これらのデバイス ID は条件付きアクセスの承認中にMicrosoft Entra IDによって使用されないため、これは問題の原因ではありません。 この変更により、ハイブリッド参加のMicrosoft Entra IDに正しく登録された Windows デバイスMicrosoft Entra削除されません。

エクスポートの削除しきい値を超えるMicrosoft Entra IDにデバイス オブジェクトの削除が表示された場合は、削除を許可します。 方法: 削除が削除のしきい値を超えたときにフローを許可する

背景

ハイブリッド参加Microsoft Entraとして登録された Windows デバイスは、デバイス オブジェクトとしてMicrosoft Entra IDで表され、条件付きアクセスに使用できます。 Windows 10デバイスは、Microsoft Entra Connect 経由でクラウドに同期されますが、ダウン レベルの Windows デバイスは、Active Directory フェデレーション サービス (AD FS) (AD FS) またはシームレス シングル サインオンを使用して直接登録されます。

Windows 10 デバイス

ハイブリッド結合によって構成された特定の userCertificate 属性値を持つWindows 10デバイスのみ、Microsoft Entra Microsoft Entra Connect によってクラウドに同期する必要があります。 以前のバージョンの Microsoft Entra Connect では、この要件は厳密に適用されておらず、不要なデバイス オブジェクトがMicrosoft Entra IDに追加されました。 これらのデバイスはMicrosoft Entra IDに登録することを意図していなかったので、Microsoft Entra IDのこのようなデバイスは常に "保留中" 状態のままでした。

このバージョンの Microsoft Entra Connect では、ハイブリッド参加Microsoft Entra正しく構成されているデバイスWindows 10のみが同期されます。 Microsoft Entra参加特定の userCertificate を持たないデバイス オブジェクトWindows 10は、Microsoft Entra IDから削除されます。

Windows デバイスの Down-Level

Microsoft Entra Connect では、ダウンレベルの Windows デバイスを同期しないでください。 以前に正しく同期Microsoft Entra IDデバイスは、Microsoft Entra IDから削除されます。 Microsoft Entra Connect がダウンレベルの Windows デバイスを削除しようとすると、デバイスは、Windows 10以外のコンピューター MSI 用に Microsoft Workplace Join によって作成されたデバイスではなく、他のMicrosoft Entra機能では使用できません。

一部のお客様は、Windows デバイスを正しく登録し、それらのデバイスがデバイス ベースの条件付きアクセスに参加できることを確認するために、Microsoft Entraハイブリッド参加の実装を計画する方法を見直す必要がある場合があります。

この更新プログラムを使用して削除されるデバイスを確認するにはどうすればよいですか?

削除されたデバイスを確認するには、 PowerShell 証明書レポート スクリプトの PowerShell スクリプトを使用します。

このスクリプトは、Active Directory コンピューター オブジェクトに格納されている証明書、特に Microsoft Entra ハイブリッド参加機能によって発行された証明書に関するレポートを生成します。

スクリプトは、AD の Computer オブジェクトの UserCertificate プロパティに存在する証明書も確認します。 有効期限が切れていない証明書が存在するたびに、スクリプトは、Microsoft Entra ハイブリッド結合機能 (などSubject Name matches CN={ObjectGUID}) に対して証明書が発行されたかどうかを検証します。

この更新プログラムの前に、Microsoft Entra接続は、少なくとも 1 つの有効な証明書を含むコンピューター Microsoft Entraに同期します。 Microsoft Entra Connect バージョン 1.4 以降、同期エンジンはハイブリッド参加証明書Microsoft Entra識別し、有効なMicrosoft Entraがない限り、コンピューター オブジェクトがMicrosoft Entra IDに同期されないように cloudfilter フィルターを使用します。ハイブリッド参加証明書。

以前に AD に同期されていたが、有効なMicrosoft Entraハイブリッド参加証明書がないMicrosoft Entraデバイスは、フィルター CloudFiltered=TRUEを使用して同期エンジンによって削除されます。

PowerShell 証明書レポート スクリプト

<#

Filename:    Export-ADSyncToolsHybridAzureADjoinCertificateReport.ps1.

DISCLAIMER:
Copyright (c) Microsoft Corporation. All rights reserved. This script is made available to you without any express, implied or statutory warranty, not even the implied warranty of  merchantability or fitness for a particular purpose, or the warranty of title or non-infringement. The entire risk of the use or the results from the use of this script remains with you.
.Synopsis
This script generates a report about certificates stored in Active Directory Computer objects, specifically, 
certificates issued by the Microsoft Entra hybrid join feature.
.DESCRIPTION
It checks the certificates present in the UserCertificate property of a Computer object in AD and, for each 
non-expired certificate present, validates if the certificate was issued for the Microsoft Entra hybrid join feature 
(i.e. Subject Name matches CN={ObjectGUID}).
Before, Microsoft Entra Connect would synchronize to Microsoft Entra ID any Computer that contained at least one valid 
certificate but starting on Microsoft Entra Connect version 1.4, the sync engine can identify Hybrid 
Microsoft Entra join certificates and will 'cloudfilter' the computer object from synchronizing to Microsoft Entra ID unless 
there's a valid Microsoft Entra hybrid join certificate.
Microsoft Entra Device objects that were already synchronized to AD but do not have a valid Microsoft Entra hybrid join 
certificate will be deleted (CloudFiltered=TRUE) by the sync engine.
.EXAMPLE
.\Export-ADSyncToolsHybridAzureADjoinCertificateReport.ps1 -DN 'CN=Computer1,OU=SYNC,DC=Fabrikam,DC=com'
.EXAMPLE
.\Export-ADSyncToolsHybridAzureADjoinCertificateReport.ps1 -OU 'OU=SYNC,DC=Fabrikam,DC=com' -Filename "MyHybridAzureADjoinReport.csv" -Verbose

#>
   [CmdletBinding()]
   Param
   (
       # Computer DistinguishedName
       [Parameter(ParameterSetName='SingleObject',
               Mandatory=$true,
               ValueFromPipelineByPropertyName=$true,
               Position=0)]
       [String]
       $DN,

       # AD OrganizationalUnit
       [Parameter(ParameterSetName='MultipleObjects',
               Mandatory=$true,
               ValueFromPipelineByPropertyName=$true,
               Position=0)]
       [String]
       $OU,

       # Output CSV filename (optional)
       [Parameter(Mandatory=$false,
               ValueFromPipelineByPropertyName=$false,
               Position=1)]
       [String]
       $Filename

   )

   # Generate Output filename if not provided
   If ($Filename -eq "")
   {
       $Filename = [string] "$([string] $(Get-Date -Format yyyyMMddHHmmss))_ADSyncAADHybridJoinCertificateReport.csv"
   }
   Write-Verbose "Output filename: '$Filename'"
   
   # Read AD object(s)
   If ($PSCmdlet.ParameterSetName -eq 'SingleObject')
   {
       $directoryObjs = @(Get-ADObject $DN -Properties UserCertificate)
       Write-Verbose "Starting report for a single object '$DN'"
   }
   Else
   {
       $directoryObjs = Get-ADObject -Filter { ObjectClass -like 'computer' } -SearchBase $OU -Properties UserCertificate
       Write-Verbose "Starting report for $($directoryObjs.Count) computer objects in OU '$OU'"
   }

   Write-Host "Processing $($directoryObjs.Count) directory object(s). Please wait..."
   # Check Certificates on each AD Object
   $results = @()
   ForEach ($obj in $directoryObjs)
   {
       # Read UserCertificate multi-value property
       $objDN = [string] $obj.DistinguishedName
       $objectGuid = [string] ($obj.ObjectGUID).Guid
       $userCertificateList = @($obj.UserCertificate)
       $validEntries = @()
       $totalEntriesCount = $userCertificateList.Count
       Write-verbose "'$objDN' ObjectGUID: $objectGuid"
       Write-verbose "'$objDN' has $totalEntriesCount entries in UserCertificate property."
       If ($totalEntriesCount -eq 0)
       {
           Write-verbose "'$objDN' has no Certificates - Skipped."
           Continue
       }

       # Check each UserCertificate entry and build array of valid certs
       ForEach($entry in $userCertificateList)
       {
           Try
           {
               $cert = [System.Security.Cryptography.X509Certificates.X509Certificate2] $entry
           }
           Catch
           {
               Write-verbose "'$objDN' has an invalid Certificate!"
               Continue
           }
           Write-verbose "'$objDN' has a Certificate with Subject: $($cert.Subject); Thumbprint:$($cert.Thumbprint)."
           $validEntries += $cert

       }
       
       $validEntriesCount = $validEntries.Count
       Write-verbose "'$objDN' has a total of $validEntriesCount certificates (shown above)."
       
       # Get non-expired Certs (Valid Certificates)
       $validCerts = @($validEntries | Where-Object {$_.NotAfter -ge (Get-Date)})
       $validCertsCount = $validCerts.Count
       Write-verbose "'$objDN' has $validCertsCount valid certificates (not-expired)."

       # Check for Microsoft Entra hybrid join Certificates
       $hybridJoinCerts = @()
       $hybridJoinCertsThumbprints = [string] "|"
       ForEach ($cert in $validCerts)
       {
           $certSubjectName = $cert.Subject
           If ($certSubjectName.StartsWith($("CN=$objectGuid")) -or $certSubjectName.StartsWith($("CN={$objectGuid}")))
           {
               $hybridJoinCerts += $cert
               $hybridJoinCertsThumbprints += [string] $($cert.Thumbprint) + '|'
           }
       }

       $hybridJoinCertsCount = $hybridJoinCerts.Count
       if ($hybridJoinCertsCount -gt 0)
       {
           $cloudFiltered = 'FALSE'
           Write-verbose "'$objDN' has $hybridJoinCertsCount Microsoft Entra hybrid join Certificates with Thumbprints: $hybridJoinCertsThumbprints (cloudFiltered=FALSE)"
       }
       Else
       {
           $cloudFiltered = 'TRUE'
           Write-verbose "'$objDN' has no Microsoft Entra hybrid join Certificates (cloudFiltered=TRUE)."
       }
       
       # Save results
       $r = "" | Select ObjectDN, ObjectGUID, TotalEntriesCount, CertsCount, ValidCertsCount, HybridJoinCertsCount, CloudFiltered
       $r.ObjectDN = $objDN
       $r.ObjectGUID = $objectGuid
       $r.TotalEntriesCount = $totalEntriesCount
       $r.CertsCount = $validEntriesCount
       $r.ValidCertsCount = $validCertsCount
       $r.HybridJoinCertsCount = $hybridJoinCertsCount
       $r.CloudFiltered = $cloudFiltered
       $results += $r
   }

   # Export results to CSV
   Try
   {        
       $results | Export-Csv $Filename -NoTypeInformation -Delimiter ';'
       Write-Host "Exported Hybrid Microsoft Entra Domain Join Certificate Report to '$Filename'.`n"
   }
   Catch
   {
       Throw "There was an error saving the file '$Filename': $($_.Exception.Message)"
   }

次の手順

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。