Microsoft Entra Connect 1.4.xx.x 및 디바이스 실종 이해

Microsoft Entra Connect 버전 1.4.xx.x를 구현하면 고객은 Windows 디바이스의 일부 또는 전부가 Microsoft Entra ID 사라지는 것을 볼 수 있습니다. 이러한 디바이스 ID는 조건부 액세스 권한 부여 중에 Microsoft Entra ID 사용되지 않으므로 이는 문제가 되지 않습니다. 이 변경은 Microsoft Entra 하이브리드 조인을 위해 Microsoft Entra ID 올바르게 등록된 Windows 디바이스를 삭제하지 않습니다.

Microsoft Entra ID 디바이스 개체의 삭제가 내보내기 삭제 임계값을 초과하는 경우 삭제를 통과하도록 허용합니다. 방법: 삭제 임계값을 초과할 때 삭제가 흐르도록 허용

배경

Microsoft Entra 하이브리드 조인으로 등록된 Windows 디바이스는 Microsoft Entra ID 디바이스 개체로 표시되며 조건부 액세스에 사용할 수 있습니다. Windows 10 디바이스는 Microsoft Entra Connect를 통해 클라우드에 동기화되고 하위 수준 Windows 디바이스는 AD FS(Active Directory Federation Services) 또는 원활한 Single Sign-On을 사용하여 직접 등록됩니다.

Windows 10 장치

Microsoft Entra 하이브리드 조인으로 구성된 특정 userCertificate 특성 값이 있는 Windows 10 디바이스만 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 연결은 하위 수준 Windows 디바이스를 동기화해서는 안 됩니다. 이전에 잘못 동기화된 Microsoft Entra ID 모든 디바이스는 Microsoft Entra ID 삭제됩니다. Microsoft Entra Connect가 하위 수준 Windows 디바이스를 삭제하려고 시도하는 경우 디바이스는 비 Windows 10 컴퓨터 MSI용 Microsoft Workplace Join에서 만든 디바이스가 아니며 다른 Microsoft Entra 기능에서 사용할 수 없습니다.

일부 고객은 방법: Microsoft Entra 하이브리드 조인 구현 계획을 다시 검토하여 Windows 디바이스를 올바르게 등록하고 해당 디바이스가 디바이스 기반 조건부 액세스에 참여할 수 있는지 확인해야 할 수 있습니다.

이 업데이트로 삭제된 디바이스를 확인하려면 어떻게 해야 하나요?

삭제된 디바이스를 확인하려면 PowerShell 인증서 보고서 스크립트에서 PowerShell 스크립트를 사용합니다.

이 스크립트는 Active Directory 컴퓨터 개체에 저장된 인증서, 특히 Microsoft Entra 하이브리드 조인 기능에서 발급한 인증서에 대한 보고서를 생성합니다.

또한 스크립트는 AD의 Computer 개체의 UserCertificate 속성에 있는 인증서를 확인합니다. 만료되지 않은 각 인증서에 대해 스크립트는 Microsoft Entra 하이브리드 조인 기능(예Subject Name matches CN={ObjectGUID}: )에 대해 인증서가 발급되었는지 여부를 확인합니다.

이 업데이트 전에 Microsoft Entra Connect는 하나 이상의 유효한 인증서가 포함된 컴퓨터를 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 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.