使用受保护的构造诊断工具进行故障排除
本文介绍如何使用 Guarded Fabric 诊断工具识别和修正受保护的构造基础结构的部署、配置和正在进行的操作中的常见故障。 这包括主机保护者服务 (HGS)、所有受保护的主机以及 DNS 和 Active Directory 等支持服务。
适用于: Windows Server 2022、Windows Server 2019、Windows Server 2016
诊断工具可用于在对故障防护构造进行会审时执行第一次传递,为管理员提供解决中断和识别配置错误的资产的起点。 该工具不是对操作受保护的面料的健全把握的替代工具,只是为了快速验证日常操作中遇到的最常见问题。
本文中使用的 cmdlet 的完整文档可以在 HGSDiagnostics 模块参考中找到。
注意
运行受保护的结构诊断工具 (Get-HgsTrace -RunDiagnostics) 时可能会返回不正确的状态,声明 HTTPS 配置已损坏,而其实际上并未损坏或未使用。 任何 HGS 认证模式可能都会返回此错误。 根本原因可能是:
- HTTPS 确实未正确配置/已损坏
- 你正在使用管理员信任的证明,信任关系已损坏。 这与 HTTPS 配置正确、不正确或根本不在使用无关。 请注意,诊断仅在面向 Hyper-V 主机时返回此不正确的状态。 如果诊断面向主机保护者服务服务,将返回正确的状态。
快速入门
你可以通过从具有本地管理员权限的 Windows PowerShell 会话调用以下命令来诊断受保护的主机或 HGS 节点:
Get-HgsTrace -RunDiagnostics -Detailed
这将自动检测当前主机的角色,并诊断可以自动检测到的任何相关问题。 由于 -Detailed
开关的存在,在此过程中生成的所有结果都会显示出来。
本主题的其余部分将详细介绍 Get-HgsTrace
的高级用法,如一次诊断多个主机和检测复杂的跨节点错误配置。
诊断概述
任何安装了与受保护虚拟机相关的工具和功能的主机(包括运行服务器核心的主机)都可以使用保护结构诊断。 目前,诊断程序包含在以下功能/包中:
- 主机保护者服务角色
- 主机保护者 Hyper-V 支持
- 用于结构管理的 VM 防护工具
- 远程服务器管理工具 (RSAT)
这意味着诊断工具将在所有受保护的主机、HGS 节点、某些结构管理服务器以及任何安装了 RSAT 的 Windows 10 工作站上可用。 可以从上述任何机器调用诊断,目的是诊断受保护结构中的任何受保护主机或 HGS 节点。使用远程跟踪目标,诊断可以定位并连接到运行诊断的计算机以外的主机。
诊断所针对的每个主机都称为“跟踪目标”。跟踪目标由其主机名和角色标识。 角色描述给定跟踪目标在受保护的架构中执行的功能。 目前,跟踪目标支持 HostGuardianService
和 GuardedHost
角色。 请注意,主机可以同时占据多个角色,但诊断也支持这样做,但不应在生产环境中执行此操作。 HGS 和 Hyper-V 主机应始终保持独立且不同。
管理员可以通过运行 Get-HgsTrace
来开始任何诊断任务。 此 cmdlet 基于运行时提供的开关执行两个不同的函数:跟踪收集和诊断。 这两者结合在一起构成了整个受保护的结构诊断工具。 尽管没有明确要求,但大多数有用的诊断都需要只能使用跟踪目标上的管理员凭据收集的跟踪。 如果执行跟踪收集的用户没有足够的权限,则需要提升的跟踪将失败,而所有其他跟踪将通过。 这允许在特权不足的操作员执行分类的情况下进行部分诊断。
跟踪收集
默认情况下,Get-HgsTrace
仅收集跟踪并将其保存到临时文件夹中。 跟踪采用文件夹的形式,以目标主机命名,其中填充了描述如何配置主机的特殊格式的文件。 跟踪还包含描述如何调用诊断以收集跟踪的元数据。 在执行手动诊断时,诊断使用此数据来恢复有关主机的信息。
如有必要,可以手动查看跟踪。 所有格式都是可读的(XML),也可以使用标准工具(例如 X509 证书和 Windows Crypto Shell 扩展)随时检查。 但请注意,跟踪不是为手动诊断设计的,并且使用诊断设施 Get-HgsTrace
处理跟踪总是更有效。
运行跟踪集合的结果不会指示给定主机的运行状况。 它们只是表示已成功收集踪迹。 必须使用诊断设施 Get-HgsTrace
来确定跟踪是否指示失败的环境。
使用 -Diagnostic
参数,可以将跟踪收集限制为仅收集操作指定诊断所需的跟踪。 这减少了收集的数据量以及调用诊断所需的权限。
诊断
通过 -Path
参数向 Get-HgsTrace
提供跟踪的位置并指定 -RunDiagnostics
开关,可以诊断收集的跟踪。 此外,通过提供 -RunDiagnostics
开关和跟踪目标列表,Get-HgsTrace
可以在单次传递中执行收集和诊断。 如果未提供跟踪目标,则会将当前计算机用作隐式目标,并通过检查已安装的 Windows PowerShell 模块来推断其角色。
诊断将以分层格式提供结果,显示哪些跟踪目标、诊断集和各个诊断是特定故障的原因。 如果可以确定下一步应该采取什么行动,则失败包括补救和解决建议。 默认情况下,传递的结果和不相关的结果是隐藏的。 要查看诊断程序测试的所有内容,请指定 -Detailed
开关。 这会导致所有结果显示,而不考虑其状态。
可以限制使用 -Diagnostic
参数运行的诊断集。 这使你可以指定应针对跟踪目标运行的诊断类别,并禁止所有其他类别。 可用诊断类别的示例包括网络、最佳实践和客户端硬件。 请参阅 cmdlet 文档以查找可用诊断的最新列表。
警告
诊断不是强监视和事件响应管道的替代项。 有一个 System Center Operations Manager 软件包可用于监视受保护的结构,以及各种事件日志通道,可以监视这些通道以及早检测问题。 然后,可以使用诊断来快速对这些故障进行分类,并确定行动方案。
面向诊断
Get-HgsTrace
针对跟踪目标进行操作。 跟踪目标是对应于 HGS 节点或受保护结构内的受保护主机的对象。 可以将其视为扩展, PSSession
其中包括诊断所需的信息,例如构造中主机的角色。 可以隐式生成目标(例如本地诊断或手动诊断),也可以使用 cmdlet 显式 New-HgsTraceTarget
生成目标。
本地诊断
默认情况下,Get-HgsTrace
将指向本地主机(即调用 cmdlet 的位置)。 这称为隐式本地目标。 仅当 -Target
参数中未提供目标并且在 -Path
中未找到预先存在的跟踪时,才使用隐式本地目标。
隐式本地目标使用角色推断来确定当前主机在受保护的架构中扮演什么角色。 这基于已安装的 Windows PowerShell 模块,这些模块大致对应于系统上已安装的功能。 模块的存在 HgsServer
会导致跟踪目标扮演角色 HostGuardianService
,并且模块的存在 HgsClient
会导致跟踪目标扮演角色 GuardedHost
。 给定主机可以同时存在两个模块,在这种情况下,它将被视为 a 和 a HostGuardianService
GuardedHost
。
因此,用于在本地收集跟踪的诊断的默认调用:
Get-HgsTrace
这等效于以下内容:
New-HgsTraceTarget -Local | Get-HgsTrace
提示
Get-HgsTrace
可以通过管道或直接通过 -Target
参数接受目标。 两者在操作上没有区别。
使用跟踪目标进行远程诊断
可以通过使用远程连接信息生成跟踪目标来远程诊断主机。 所需要的只是主机名和一组能够使用 Windows PowerShell 远程处理进行连接的凭据。
$server = New-HgsTraceTarget -HostName "hgs-01.secure.contoso.com" -Role HostGuardianService -Credential (Enter-Credential)
Get-HgsTrace -RunDiagnostics -Target $server
此示例生成收集远程用户凭据的提示,然后使用远程主机 hgs-01.secure.contoso.com
运行诊断以完成跟踪收集。 将生成的跟踪下载到本地主机,然后进行诊断。 诊断结果的显示与进行本地诊断时相同。 同样,不需要指定角色,因为可以根据安装在远程系统上的 Windows PowerShell 模块推断角色。
远程诊断将 Windows PowerShell 远程处理用于对远程主机的所有访问。 因此,跟踪目标已启用 Windows PowerShell 远程处理(请参阅 “启用 PSRemoting”),并且 localhost 已正确配置为启动到目标的连接。
注意
在大多数情况下,只有 localhost 是同一 Active Directory 林的一部分,并且使用了有效的 DNS 主机名。 如果你的环境使用更复杂的联合模型,或者你希望使用直接 IP 地址进行连接,则可能需要执行其他配置,例如设置 WinRM 受信任主机。
可以使用 Test-HgsTraceTarget
cmdlet 验证跟踪目标是否已正确实例化并配置为接受连接:
$server = New-HgsTraceTarget -HostName "hgs-01.secure.contoso.com" -Role HostGuardianService -Credential (Enter-Credential)
$server | Test-HgsTraceTarget
此 cmdlet 返回 $True
是否且仅当 Get-HgsTrace
能够与跟踪目标建立远程诊断会话时。 失败后,此 cmdlet 返回相关状态信息,以便进一步排查 Windows PowerShell 远程处理连接问题。
隐式凭据
从具有足够权限的用户执行远程诊断以远程连接到跟踪目标时,无需向 New-HgsTraceTarget
该用户提供凭据。 在打开连接时,Get-HgsTrace
cmdlet 将自动重用调用该 cmdlet 的用户的凭据。
警告
某些限制适用于重复使用凭据,特别是在执行所谓的“第二跃点”时。当尝试从远程会话内部到另一台计算机重复使用凭据时,会发生这种情况。 必须 设置 CredSSP 来支持此方案,但这超出了受保护的构造管理和故障排除的范围。
使用 Windows PowerShell Just Enough Administration (JEA) 和诊断
远程诊断支持使用 Windows PowerShell 终结点,但受到 JEA 的约束。 默认情况下,远程跟踪目标将使用默认 microsoft.powershell
终结点进行连接。 如果跟踪目标具有 HostGuardianService
角色,它还将尝试使用 microsoft.windows.hgs
安装 HGS 时配置的终结点。
如果要使用自定义终结点,则必须在使用 -PSSessionConfigurationName
参数构造跟踪目标时指定会话配置名称,如下所示:
New-HgsTraceTarget -HostName "hgs-01.secure.contoso.com" -Role HostGuardianService -Credential (Enter-Credential) -PSSessionConfigurationName "microsoft.windows.hgs"
诊断多个主机
可以一次将多个跟踪目标传递给 Get-HgsTrace
。 这包括本地和远程目标的混合。 依次跟踪每个目标,然后同时诊断每个目标的跟踪。 诊断工具可以使用部署的增强知识来识别无法检测到的复杂跨节点错误配置。 使用此功能只需要同时提供来自多个主机的跟踪(在手动诊断的情况下),或者在调用 Get-HgsTrace
时以多个主机为目标(在远程诊断的情况下)。
下面是使用远程诊断对由两个 HGS 节点和两个受保护主机组成的结构进行分类的示例,其中一个受保护主机用于启动 Get-HgsTrace
。
$hgs01 = New-HgsTraceTarget -HostName "hgs-01.secure.contoso.com" -Credential (Enter-Credential)
$hgs02 = New-HgsTraceTarget -HostName "hgs-02.secure.contoso.com" -Credential (Enter-Credential)
$gh01 = New-HgsTraceTarget -Local
$gh02 = New-HgsTraceTarget -HostName "guardedhost-02.contoso.com"
Get-HgsTrace -Target $hgs01,$hgs02,$gh01,$gh02 -RunDiagnostics
注意
诊断多个节点时,无需诊断整个受保护的构造。 在许多情况下,包含可能涉及给定故障条件的所有节点就足够了。 这通常是受保护主机的子集,以及 HGS 集群中的一些节点。
使用保存的跟踪进行手动诊断
有时,你可能想要重新运行诊断而不再次收集跟踪,或者可能没有必要的凭据来远程诊断构造中的所有主机。 手动诊断是一种机制,通过该机制,你仍然可以使用 Get-HgsTrace
来执行整个结构分类,但不使用远程跟踪收集。
在执行手动诊断之前,需要确保构造中每个主机的管理员已准备就绪,并愿意代表你执行命令。 诊断跟踪输出不会公开通常被视为敏感的任何信息,但用户有责任确定向其他人公开此信息是否安全。
注意
跟踪不会匿名,并显示网络配置、PKI 设置和其他有时被视为专用信息的配置。 因此,跟踪只应传输给组织内的受信任实体,而不应公开发布。
执行手动诊断的步骤如下:
请求每个主机管理员运行
Get-HgsTrace
,指定一个已知的-Path
和你打算对结果跟踪运行的诊断列表。 例如:Get-HgsTrace -Path C:\Traces -Diagnostic Networking,BestPractices
请求每个主机管理员将生成的跟踪文件夹打包并将其发送给你。 此过程可以通过电子邮件、文件共享或基于组织建立的操作策略和过程的任何其他机制来驱动。
将所有接收到的跟踪合并到一个文件夹中,不包含其他内容或文件夹。
例如,假设你让管理员将从名为 HGS-01、HGS-02、RR1N2608-12 和 RR1N2608-13 的四台计算机收集的跟踪信息发送给你。 每个管理员都会以相同的名称向你发送一个文件夹。 将组合一个如下所示的目录结构:
FabricTraces |- HGS-01 | |- TargetMetadata.xml | |- Metadata.xml | |- [any other trace files for this host] |- HGS-02 | |- [...] |- RR1N2608-12 | |- [...] |- RR1N2608-13 |- [..]
执行诊断,在
-Path
参数上提供组装的跟踪文件夹的路径,并指定-RunDiagnostics
开关以及你要求管理员收集跟踪的那些诊断。 诊断将假定它无法访问路径中找到的主机,因此将尝试仅使用预先收集的跟踪。 如果任何跟踪丢失或损坏,诊断程序将仅使受影响的测试失败并正常进行。 例如:Get-HgsTrace -RunDiagnostics -Diagnostic Networking,BestPractices -Path ".\FabricTraces"
将保存的跟踪与其他目标混合
在某些情况下,你可能有一组预先收集的跟踪,希望通过其他主机跟踪进行扩充。 可以将预先收集的跟踪与将在单个诊断调用中跟踪和诊断的其他目标混合使用。
按照上述说明收集和组合指定的跟踪文件夹,使用在预先收集的跟踪文件夹中未找到的其他跟踪目标进行调用 Get-HgsTrace
:
$hgs03 = New-HgsTraceTarget -HostName "hgs-03.secure.contoso.com" -Credential (Enter-Credential)
Get-HgsTrace -RunDiagnostics -Target $hgs03 -Path .\FabricTraces
诊断 cmdlet 将标识所有预先收集的主机,以及还需要跟踪的附加主机,并执行必要的跟踪。 然后,将诊断所有预先收集和刚收集的跟踪的总和。 生成的跟踪文件夹将同时包含旧跟踪和新跟踪。
已知问题
受保护的架构诊断模块在 Windows Server 2019 或 Windows 10 版本 1809 及更新的操作系统版本上运行时具有已知的限制。 使用以下功能可能会导致错误结果:
- 主机密钥证明
- “仅证明”HGS 配置(适用于始终加密的 SQL Server 方案)
- 在 HGS 服务器上使用 v1 策略项目,其中证明策略默认值为 v2
使用这些功能时失败 Get-HgsTrace
不一定指示 HGS 服务器或受保护的主机配置不正确。
使用其他诊断工具(如在受保护的主机上的 Get-HgsClientConfiguration
)测试主机是否已通过证明。