AD Sorunlarını Giderirken İhtiyacınız Olan Araçlar


style="letter-spacing: 0px; text-transform: unset; arka plan rengi: şeffaf;">AD veya Azure AD gibi bir dizin hizmetinden mi sorumlusunuz? O zaman zaten sorun gidermeye epey zaman harcamış olmalısınız. Neyse ki her yöneticinin hayatını kolaylaştıracak bir yol var.

Dizin hizmeti ister Active Directory (AD) ister Azure AD (AAD) tarafından sağlansın, dizinler kuruluşların kimlik yönetimi için bir doğruluk kaynağı sağlar ve sorunların giderilmesi veya tanımlanması, dizinden sorumlu olanlar tarafından gerçekleştirilmesi gereken önemli bir görevdir. . Doğru aracı (veya araçları) kullanmak bu görevi yönetilebilir hale getirmeye yardımcı olabilir ve komut dosyası oluşturmanın (PowerShell veya başka bir şekilde) bu tür görevler için yararlı bir araç olduğu kanıtlanmıştır.

Bu yazıda Active Directory'de sık karşılaşılan sorunların giderilmesinde PowerShell'i nasıl kullanabileceğimizi inceleyeceğiz. AD sorunlarını gidermek için gereken her şeyin doğrudan PowerShell ile yapılamayacağını belirtmekte fayda var, ancak PowerShell'i diğer işlemlerin etrafına bir 'sarmalayıcı' yerleştirmek ve başarılı sorun giderme amacıyla verileri çekmek için PowerShell'den yararlanabiliriz.

AD siteleri ve hizmetleri bağlantıları

Siteden siteye çoğaltma bağlantılarında yapılan yaygın bir hata, çoğaltma sorununu KCC'nin (Kısaltma!) oluşturduğu Otomatik Oluşturulan bağlantılara güvenmek yerine manuel bağlantıyla düzeltmektir. Manuel bağlantılar otomatik olarak güncellenmez veya topoloji değişiklikleriyle iyi çalışmaz, dolayısıyla manuel olarak oluşturulan bağlantıların tanımlanması sağlıklı bir ortam için iyi olabilir.

Otomatik oluşturulan bağlantıları bulun

Aşağıdakilerle, tüm AD çoğaltma bağlantılarını GUID'leriyle, Kime ve Kimden sunucularıyla ve bağlantının Otomatik Oluşturulmuş olup olmadığını listeleyebiliriz:

Get-ADReplicationConnection -Filter * |
    Select-Object -Property Name, AutoGenerated, ReplicateFromDirectoryServer, ReplicateToDirectoryServer |
    ForEach-Object {
        $From = $_.ReplicateFromDirectoryServer        $To = $_.ReplicateToDirectoryServer
        $_.ReplicateFromDirectoryServer = (($From -Split ',')[1] -Split '=')[1]
        $_.ReplicateToDirectoryServer = (($To -Split ',')[0] -Split '=')[1]
        Return $_ 
    }

Örnek çıktı

Bir veya daha fazla bağlantının AutoGenerate için 'Yanlış' değeri varsa, bunun neden oluşturulduğuna ilişkin bir araştırma yapılmalıdır. Microsoft tarafından desteklenmese de geçerli bir nedeni olabilir.

Çoğaltma

Site Bağlantılarına ek olarak, bu bağlantıları çaprazlayan çoğaltmanın kontrol edilmesi, AD sorunlarını gidermenin kritik bir bileşeni olabilir. Bu bölümde, bir ortamdaki Etki Alanı Denetleyicileri (DC) arasındaki iletişimi incelemek için PowerShell'i yerel Windows araçlarının etrafında sarmalayıcı olarak kullanmanın bazı yollarını keşfedeceğiz. Bu bölümde kullanılan araçlar dsquery, repadmin ve dcdiag'dir. PowerShell ile bu araçların sonuçlarını bilgili bir AD yöneticisi tarafından analiz edilmek üzere bir çıktı dosyasına aktarabiliriz.

Sorgulama

İlk aracımız AD'de bilgi sorgulamak için kullanılan dsquery'dir ve özellikle bu durumda AD'de sadece Etki Alanı Denetleyicilerini sorguluyoruz. Bu tek satırlık konu hakkında daha fazla bilgiyi Microsoft Dokümanlar'da bulabilirsiniz.

'dsquery server -o rdn'

Repadmin

Repadmin aracı, hem gelen hem de giden DC'ler arasında meydana gelebilecek daha derin çoğaltma sorunlarından bazılarını ortaya çıkarmak için kullanılabilir. Repadmin, artık kopyalanamayan DC'lerle ilgili kritik sorunları ortaya çıkarabilir, topoloji sorunlarını belirleyebilir ve daha fazlasını yapabilir. Aşağıda bir PowerShell betiğinden çalıştırılabilecek iyi bir temel cmdlet seti bulunmaktadır. Her satırın sonuçları incelenecek bir dosyaya aktardığını unutmayın:

$ADCmdletDestination =  'ADReplicationOutput.txt '

Tüm sunucular için çoğaltmayı kontrol edin, tüm siteler arasında geçiş yapın
C:\Windows\System32\repadmin.exe /syncall /e >> $ADCmdletDestination

Adlandırma Bağlamı Çoğaltmasını Denetle
C:\Windows\System32\repadmin.exe /syncall /A >> $ADCmdletDestination

GUID DNS'yi değil, DN'yi kullanarak senkronizasyon
C:\Windows\System32\repadmin.exe /syncall /d >> $ADCmdletDestination

Kısa Çoğaltma Özeti
C:\Windows\System32\repadmin.exe /replsummary * >> $ADCmdletDestination

KCC'yi topolojiyi yeniden hesaplamaya zorlar
C:\Windows\System32\repadmin.exe /kcc * >> $ADCmdletDestination

Son AD yedeklemesini gösterir
C:\Windows\System32\repadmin.exe /showbackup * >> $ADCmdletDestination

Son gelen çoğaltma için çoğaltma durumunu kontrol eder
C:\Windows\System32\repadmin.exe /showrepl * >> $ADCmdletDestination

Gelen sıraya alınmış istekleri görüntüler
C:\Windows\System32\repadmin.exe /queue * >> $ADCmdletDestination

AD Bridgehead sunucularını sorunlar açısından kontrol eder
C:\Windows\System32\repadmin.exe /bridgeheads * /verbose >> $ADCmdletDestination

Siteler Arası Topoloji Oluşturucu (ISTG) sunucusunu döndürür
C:\Windows\System32\repadmin.exe /istg * /verbose >> $ADCmdletDestination

"DS Bind önbelleğindeki girişlerin listesi."
C:\Windows\System32\repadmin.exe /showoutcalls * >> $ADCmdletDestination

KCC Hatalarını Listeler
C:\Windows\System32\repadmin.exe /failcache * >> $ADCmdletDestination

Bilinen AD güvenlerini listeler
C:\Windows\System32\repadmin.exe /showtrust * >> $ADCmdletDestination

DC için çoğaltma özelliklerini görüntüler
C:\Windows\System32\repadmin.exe /bind * >> $ADCmdletDestination

Genel olarak, sorunlar varsa bu komutların doğru olmayan bir şeyi göstermesi gerekir. Örneğin, DC'nin saati kapalıysa çoğaltma özeti senkronizasyon hatalarını gösterir. Yapılandırılmış Kaldırılan süre sınırı içinde çoğaltılmadığı için Kaldırılan bir DC bile görebiliriz. Olay günlüğü hata mesajları da keşfedilecek ve temel neden analizine yardımcı olacaktır.

/replsummary anahtarından örnek

Dcdiag

dcdiag aracıyla, her DC'nin göreceli yardımını belirlemeye yardımcı olacak bir dizi Etki Alanı Denetleyicisi testi çalıştırabiliriz. Aşağıdaki tek satırlık tüm dcdiag testlerini burada [/c] açıklandığı gibi çalıştıracak, [/e] içinde bulunduğu Site ne olursa olsun tüm DC'ler için testleri yürütecek ve ayrıntılı çıktıyı [/v] kullanacak. Komutun çıktısının da analiz için bir dosyaya aktarıldığını unutmayın. Daha büyük ortamlarda bunun çalıştırılmasının ve dışa aktarılan sonuçların analiz edilmesinin zaman alabileceğini unutmayın.

 
dcdiag /c /e /v >> $ADCmdletDestination

Örnek ekran çıktısı

Bu arada, PowerShell'de bu araçlar için bazı doğrudan değiştirmeler mevcuttur, ancak bu makalenin yazıldığı sırada bu cmdlet'ler, sorun giderme amacıyla AD çoğaltmasının daha ayrıntılı bir görünümünü sunmaktadır.

DNS sağlığı

DNS, Active Directory sağlığı açısından önemlidir ve yöneticiler DNS sunucularını birkaç araçla test edebilir. Yerel PowerShell ile oldukça sınırlı olan ancak belirli bir DNS sunucusunun hızlı bir şekilde test edilmesini sağlayabilen bir 'Test-DNSServer' cmdlet'imiz var.

Örnek 'Test-DnsServer' cmdlet

Bununla birlikte, biraz daha derine inmek için, DNSLint'ten dcdiag'a kadar daha derine inmek üzere Windows araçlarını çalıştırmak için PowerShell'i kullanabiliriz, çünkü bu araçlar PowerShell ile bile hala geçerlidir.

 
$DC = Get-ADDomainController $Env:ComputerName
$IPs = @()
$IPs = $DC.IPv4Address
$Server = $IPs[0]
$DNSLint = .\DNSLint.exe /ad $Server /s $Server /r dnslint /no_open /y

Daha da fazla bilgi için DNS sunucusunun işlevselliğini test etmek amacıyla dcdiag'ı kullanabiliriz.

Örnek DNSLint hata raporu


Function GetInfo {
    DCDiag /s:$DC /Test:dns /v /q /i /x:$DNSXMLDestination
    $Data = @($DC,$Domain,$Site)
    $Xml = $DNSXMLDestination
    [Xml]$DCDiag = Get-Content $xml
    $Summary = $dcdiag.DCDIAGTestResults.DNSEnterpriseTestResults.Summary.Domain.DC.test
    Foreach ($line2 in $summary) {
      $Data += @($Line2.Status)
    }
    $Rowline = $Data -join ","
    Add-Content $DNSDestination $Rowline
    $Rowline = $Null
}

# Main Script Body
$DNSDestination = 'DNSTestResults.csv'
$DNSXMLDestination = 'DNSTestResults.xml'
$Rows = "DC," + "Domain," + "Site," + "Auth," + "Basc," + "Forw," + "Del," + "Dyn," + "Rreg," + "Ext"
Add-Content -Path $DNSDestination $Rows

$Domains = (Get-ADForest).Domains
Foreach ($Domain in $Domains) {
    $DomainControllers = Get-ADDomainController -Server $Domain -Filter *
    Foreach ($Line in $DomainControllers) {
        $Dc = $Line.HostName
        $Domain = $Line.Domain
        $Site = $Line.Site
        GetInfo
    }
}

Bu scriptlerin her ikisini de kullanarak artık DNS'in resmini alabilir ve logları inceleyerek DNS altyapısının doğrulanmasını sağlayabiliriz.

Örnek DCDiag sonuç dosyası

Ağ yapılandırması

DHCP'nin etkin olduğu veya çok fazla ağ geçidinin bulunduğu bir etki alanı denetleyicisi, çoğaltma, kullanıcı kimlik doğrulaması ve uygulama sorunlarıyla ilgili her türlü soruna neden olabilir. Her sunucunun nasıl yapılandırıldığını iyi anlamak, yöneticinin etki alanı denetleyicileriyle ilgili bir sorunu bulmasına yardımcı olabilir. Aşağıdaki komut dosyası, bir sunucudaki her Ağ Arayüz Kartına (NIC) bakacak ve doğrulama için özellikleri geri bildirecektir:

# Variables
$Rows = 'Computer,' + 'IPAddress,' + 'Subnet Mask,' + 'Default Gateway,' + 'DHCP,' + 'DNS Servers'
$NICDestination = 'DC-NetworkConfig.csv'
Add-Content -Path $NICDestination $Rows

$Domains = (Get-ADForest).Domains
Foreach ($Domain in $Domains) {
    $Rows = "Domain - $Domain"
    Add-Content -Path $NICDestination $Rows

    $DomainControllers = Get-ADDomainController -Server $Domain -Filter *
    # Foreach ($Computer in $ComputerNames) {
    Foreach ($DomainController in $DomainControllers) {
        $Computer = $DomainController.HostName
        $Server = $DomainController.Name

        $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer -EA Stop |
            Where-Object { $_.IPEnabled }

        Foreach ($Network in $Networks) {
            $IPAddress = $Network.IpAddress[0]
            $SubnetMask = $Network.IPSubnet[0]
            $DefaultGateway = $Network.DefaultIPGateway
            $DNSServers = $Network.DNSServerSearchOrder
            $IsDHCPEnabled = $false
            If ($Network.DHCPEnabled) {
                $IsDHCPEnabled = $true
            }
            $MACAddress = $Network.MACAddress 
            $OutputObj = New-Object -Type PSObject
            $OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Server.ToUpper()
            $OutputObj | Add-Member -MemberType NoteProperty -Name IPAddress -Value $IPAddress
            $OutputObj | Add-Member -MemberType NoteProperty -Name SubnetMask -Value $SubnetMask
            $OutputObj | Add-Member -MemberType NoteProperty -Name Gateway -Value ($DefaultGateway -join ',')
            $OutputObj | Add-Member -MemberType NoteProperty -Name IsDHCPEnabled -Value $IsDHCPEnabled
            $OutputObj | Add-Member -MemberType NoteProperty -Name DNSServers -Value ($DNSServers -join ',')
            $OutputObj | Format-Table -AutoSize
            $Row = "$Server," + "$IPAddress," + "$SubnetMask," + "$DefaultGateway," + "$ISDHCPEnabled," + "$DNSServers"
            Add-Content -Path $NICDestination $Row
        }
    }
}

Örnek çıktı (tüm DC'lerin bir çekirdek DC'yi ve DNS için kendilerini işaret ettiğini unutmayın)

Bu konfigürasyon istenildiği gibi olabileceği gibi ortama ve/veya BT'nin hedeflerine bağlı olarak kötü bir konfigürasyon da olabilir.

Katı çoğaltma

Windows 2003'te sunulan bir özellik olan Active Directory'deki bozulmayı önlemek için hâlâ gerekli ve etkin tutulması gereken bir ayardır. Çoğaltma sorunları olduğunda ve muhtemelen AD'de kalan eski nesneler olduğunda, hangi DC'lerin bunu yapılandırdığını ve hangilerinin yapılandırmadığını doğrulamak iyidir. En iyi uygulama olarak bu etkinleştirilmelidir. Referans için lütfen bu makaleye bakın.

Aşağıdaki kodu kullanarak bir etki alanındaki tüm DC'ler için 'katı çoğaltma tutarlılığı' ayarını kontrol edebiliriz:

$DCs = (Get-ADDomainController -Filter *).Name | Sort-Object
Foreach ($DC in $DCs) {
    $Script = {
        $Name = 'Strict Replication Consistency'
        $RegistryPath = 'HKLM:\System\CurrentControlSet\Services\NTDS\Parameters\'
        $Val = (Get-ItemProperty -Path $RegistryPath -Name $Name).$Name        Return $Val
    }
    $StrictCheck = Invoke-Command -ComputerName $DC -ScriptBlock $Script
    If ($StrictCheck -eq '1') {
        Write-Host " * Strict Replication Consistency is enabled on the $DC Domain Controller." -ForegroundColor Cyan
    }
    Else {
        Write-Host " * Strict Replication Consistency is disabled on the $DC Domain Controller." -ForegroundColor Yellow
    }
} 

Bu PowerShell kod bloğundan gerçek sonuçlar

Birden fazla ormanı/alanı kontrol etmeniz gerekiyorsa bazı kod ayarlamaları gerekli olacaktır.

En iyi uygulama analizörleri

Son olarak, Windows sunucuları, sunucuya yüklenen her rol için yerleşik bir En İyi Uygulama Çözümleyicisi içerir; aşağıda iki örnek verilmiştir:

Active Directory ve DNS BPA GUI

Bunlara Invoke-BPAModule ve Get-BPAResult ile PowerShell ile de erişilebilir. BPA'lar, bir sunucuda yüklü olan Windows Rolüne karşılık gelen bir 'modeller' sistemi üzerinde çalışır. Örneğin, DNS rolünün bir DNSServer model adı vardır ve AD-Domain-Services'in modeli DirectoryServices'tir. Bunları açıklamamıza yardımcı olması için bu Model adlarını Get-BPAModel cmdlet'inden alabiliriz. Aşağıdaki kodda iki rolü (DNS ve DC) sorguluyoruz ve eğer yüklüyse, her birinin Model adı daha önce bahsedilen iki cmdlet tarafından işlenecek bir değişkene ekleniyor. Artık bu çabanın çıktısı, çalıştırılan her BPA Modeli için bir CSV dosyasıyla sonuçlanıyor.

Sample Code:
# Variables
$FilePath = (Get-Item -Path ".\" -Verbose).FullName 
$Server = $Env:ComputerName
$BPA = @() 
If ((Get-WindowsFeature AD-Domain-Services).Installed) {$BPA += "Microsoft/Windows/DirectoryServices"} 
If ((Get-WindowsFeature DNS).Installed) {$BPA += "Microsoft/Windows/DNSServer"} 
 
Foreach ($Model in $bpa) {
  $Name = $Model.Replace("Microsoft/Windows/","") 
  $CSV = "BPA-Results-$Name-$Server.csv"  
  Invoke-BPAModel $Model -ErrorAction SilentlyContinue
  Get-BPAResult -BestPracticesModelId $Model -ErrorAction SilentlyContinue |
    Where-Object {$_.Problem -ne $Null} |
    Select-Object ResultNumber,Severity,Category,Title,Problem,Impact,Resolution |
    Export-Csv $CSV -NoTypeInformation -Encoding UTF8
}

Çözüm

Bu makale her senaryo için PowerShell sağlamasa da, sorun giderme senaryolarında PowerShell olmayan araçlarla birlikte bile PowerShell'in nasıl kullanılabileceğine ilişkin temel bilgileri kapsamaktadır. Active Directory doğası gereği çok karmaşık olabilir ve bu karmaşıklık nedeniyle sorunları gidermek için sıklıkla çeşitli araçlar kullanılır. Bazen ipuçları uygulama sorunları, kullanıcı hayal kırıklığı veya izleme yazılımı bildirimleriyle sağlanır. Sonunda, iş için en iyi aracı seçmek ve bazen belirli bir sorun giderme yönünü bir kenara atmak, geriye doğru izlemek ve bir sorunu çözmek için yeni araçlar, komut dosyaları vb. ile her şeye baştan başlamak yöneticiye kalmıştır. PowerShell, bu senaryolar için birçok bilgi sağlamanın yanı sıra eski araçlara da güvenebilir. İyi avlar!

İlgili makaleler