当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 排除 AD 故障时所需的工具

作者:精品下载站 日期:2024-12-14 08:13:07 浏览:14 分类:玩电脑

排除 AD 故障时所需的工具


[玩转系统] 排除 AD 故障时所需的工具

您负责 AD 或 Azure AD 等目录服务吗?那么您一定已经花费了相当多的时间来排除故障。幸运的是,有一种方法可以让每个管理员的生活变得更轻松。

目录为组织的身份管理提供了真实来源,无论目录服务是由 Active Directory (AD) 还是 Azure AD (AAD) 提供,并且故障排除或识别问题是负责目录的人员必须执行的一项关键任务。使用正确的工具(或多个工具)可以帮助使此任务易于管理,并且脚本(PowerShell 或其他)已被证明是执行此类任务的有用工具。

在本文中,我们将探讨如何使用 PowerShell 来解决 Active Directory 中的常见问题。值得注意的是,并非解决 AD 问题所需的所有操作都可以直接使用 PowerShell 完成,但是,我们可以使用 PowerShell 在其他进程周围放置“包装器”,并利用 PowerShell 提取数据以成功进行故障排除。

AD 网站和服务链接

使用站点到站点复制链接时常犯的错误是使用手动链接来纠正复制问题,而不是依赖 KCC(缩写!)创建的自动生成的链接。手动链接不会自动更新,也不会很好地适应拓扑更改,因此识别手动创建的链接可能有利于健康的环境。

查找自动生成的链接

通过以下内容,我们可以列出所有 AD 复制链接及其 GUID、发送至和来自服务器以及链接是否为自动生成:

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 $_
  }

样本输出

[玩转系统] 排除 AD 故障时所需的工具

如果一个或多个链接的“自动生成”值为“False”,则应调查创建此链接的原因。尽管 Microsoft 不支持,但可能有正当理由。

复制

除了站点链接之外,检查跨这些链接的复制可能是 AD 故障排除的关键组成部分。在本节中,我们将探讨一些使用 PowerShell 作为本机 Windows 工具包装器的方法,以便检查环境中域控制器 (DC) 之间的通信。本节使用的工具是dsquery、repadmindcdiag。借助 PowerShell,我们可以将这些工具的结果导出到输出文件,以供知识丰富的 AD 管理员进行分析。

查询

我们的第一个工具是 dsquery,它用于在 AD 中查询信息,特别是在本例中,我们仅查询 AD 中的域控制器。有关此单行的更多信息可以在 Microsoft Docs 中找到。

'dsquery server -o rdn'

瑞帕明

工具repadmin可用于暴露DC之间(入站和出站)之间可能发生的一些更深层次的复制问题。 Repadmin 可以揭示 DC 不再能够复制的关键问题、识别拓扑问题等。下面是一组很好的核心 cmdlet,可以从 PowerShell 脚本运行。请注意,每一行都将结果导出到要检查的文件中:

$ADCmdletDestination = 'ADReplicationOutput.txt '

检查所有服务器的复制,跨所有站点
C:\Windows\System32\repadmin.exe /syncall /e >> $ADCmdletDestination

检查命名上下文复制
C:\Windows\System32\repadmin.exe /syncall /A >> $ADCmdletDestination

使用 DN 而非 GUID DNS 进行同步
C:\Windows\System32\repadmin.exe /syncall /d >> $ADCmdletDestination

简明复制摘要
C:\Windows\System32\repadmin.exe /replsummary * >> $ADCmdletDestination

强制 KCC 重新计算拓扑
C:\Windows\System32\repadmin.exe /kcc * >> $ADCmdletDestination

显示最后一次 AD 备份
C:\Windows\System32\repadmin.exe /showbackup * >> $ADCmdletDestination

检查上次入站复制的复制状态
C:\Windows\System32\repadmin.exe /showrepl * >> $ADCmdletDestination

显示任何入站排队请求
C:\Windows\System32\repadmin.exe /queue * >> $ADCmdletDestination

检查 AD 桥头服务器是否存在问题
C:\Windows\System32\repadmin.exe /bridgeheads * /verbose >> $ADCmdletDestination

返回站点间拓扑生成器 (ISTG) 服务器
C:\Windows\System32\repadmin.exe /istg * /verbose >> $ADCmdletDestination

"DS Bind 缓存中的条目列表。"
C:\Windows\System32\repadmin.exe /showoutcalls * >> $ADCmdletDestination

列出 KCC 故障
C:\Windows\System32\repadmin.exe /failcache * >> $ADCmdletDestination

列出已知的 AD 信任
C:\Windows\System32\repadmin.exe /showtrust * >> $ADCmdletDestination

显示 DC 的复制功能
C:\Windows\System32\repadmin.exe /bind * >> $ADCmdletDestination

一般来说,如果出现问题,这些命令应该显示不正确的内容。例如,如果 DC 的时间关闭,复制摘要将显示同步错误。我们甚至可能会看到一个已被逻辑删除的 DC,因为它尚未在配置的逻辑删除时间限制内进行复制。还将发现事件日志错误消息并帮助进行根本原因分析。

[玩转系统] 排除 AD 故障时所需的工具

来自 /replsummary 开关的示例

诊断仪

使用 dcdiag 工具,我们可以运行一系列域控制器测试,这将有助于确定每个 DC 的相对帮助。下面的一行将按照此处所述运行所有 dcdiag 测试 [/c],对所有 DC 执行测试,无论其位于哪个站点 [/e] 并使用详细输出 [/v]。请注意,该命令的输出也会导出到文件中以供分析。请记住,在较大的环境中,这可能需要时间来运行并分析导出的结果。

 
dcdiag /c /e /v >> $ADCmdletDestination

[玩转系统] 排除 AD 故障时所需的工具

屏幕输出示例

与此同时,PowerShell 中有一些工具可以直接替代这些工具,但是,在撰写本文时,这些 cmdlet 提供了更深入的 AD 复制视图,以便进行故障排除。

DNS 健康状况

DNS 对于 Active Directory 的健康状况非常重要,管理员可以使用一些工具测试其 DNS 服务器。使用本机 PowerShell,我们有一个“Test-DNSServer”cmdlet,它的功能相当有限,但可以提供对特定 DNS 服务器的快速测试。

[玩转系统] 排除 AD 故障时所需的工具

示例“Test-DnsServer” cmdlet

然而,为了更深入地研究,我们可以使用 PowerShell 执行 Windows 工具,以更深入地研究从 DNSLint 到 dcdiag,因为即使使用 PowerShell,这些工具仍然有效。

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

如需更多信息,我们可以使用 dcdiag 来测试 DNS 服务器功能。

[玩转系统] 排除 AD 故障时所需的工具

DNSLint 错误报告示例


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
  }
}

使用这两个脚本,我们现在可以了解 DNS 的情况,并通过查看日志来验证 DNS 基础设施。

[玩转系统] 排除 AD 故障时所需的工具

DCDiag 结果文件示例

网络配置

启用 DHCP 或网关过多的域控制器可能会导致各种复制、用户身份验证以及应用程序问题。充分掌握每台服务器的配置方式可以帮助管理员查明其域控制器的问题。以下脚本将查看服务器上的每个网络接口卡 (NIC) 并报告属性以进行验证:

# 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
    }
  }
}

[玩转系统] 排除 AD 故障时所需的工具

示例输出(请注意,所有 DC 都指向核心 DC 及其本身的 DNS)

此配置可能是所需的,也可能是错误的配置,具体取决于环境和/或 IT 的目标。

严格复制

为了防止 Active Directory 损坏,Windows 2003 中引入的一项功能仍然是必要且值得保持启用的设置。当存在复制问题,并且 AD 中可能存在旧对象时,最好验证哪些 DC 已配置此配置,哪些 DC 未配置。作为最佳实践,应该启用此功能。请参考这篇文章以供参考。

使用下面的代码,我们可以检查域中所有 DC 的“严格复制一致性”设置:

$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
  }
} 

[玩转系统] 排除 AD 故障时所需的工具

此 PowerShell 代码块的实际结果

如果您需要检查多个林/域,则需要进行一些代码调整。

最佳实践分析器

最后,Windows 服务器为服务器上安装的每个角色包含一个内置的最佳实践分析器,以下是两个示例:

[玩转系统] 排除 AD 故障时所需的工具

Active Directory 和 DNS BPA GUI

这些也可以通过 PowerShell 使用 Invoke-BPAModuleGet-BPAResult 进行访问。 BPA 在“模型”系统上工作,该“模型”系统对应于服务器上安装的 Windows 角色。例如,DNS 角色具有 DNSServer 模型名称,AD-Domain-Services 的模型是 DirectoryServices。我们可以从 Get-BPAModel cmdlet 获取这些模型名称,以帮助拼写这些名称。在下面的代码中,我们查询两个角色(DNS 和 DC),如果安装了它们,则每个角色的模型名称将添加到变量中,以便由前面提到的两个 cmdlet 处理。现在,这项工作的输出结果是为每个运行的 BPA 模型生成一个 CSV 文件。

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
}

结论

虽然本文没有为每种场景提供 PowerShell,但它确实涵盖了在故障排除场景中如何使用 PowerShell 的基础知识,甚至与非 PowerShell 工具结合使用。 Active Directory 本质上可能非常复杂,并且由于这种复杂性,经常使用各种工具来解决问题。有时,应用程序问题、用户沮丧或监控软件通知会提供线索。最后,由管理员来选择最适合工作的工具,有时会放弃特定的故障排除方向,回溯并使用新的工具、脚本等重新开始来解决问题。 PowerShell 可以提供大量信息,并依赖传统工具来应对这些场景。狩猎快乐!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯