疑难解答:本地部署 Microsoft Entra 密码保护

部署 Microsoft Entra Password Protection 后,可能需要进行故障排除。 本文详细介绍了如何帮助你了解一些常见的故障排除步骤。

DC 代理无法在目录中找到代理服务器

此问题的主要症状是 DC 代理管理员事件日志中的 30,017 个事件。

此问题的常见原因是尚未注册代理。 如果注册了代理,可能会由于 AD 复制延迟而一直延迟到特定 DC 代理能够看到该代理为止。

DC 代理程序无法与代理服务器通信

此问题的主要症状是 DC 代理管理员事件日志中的 30,018 个事件。 此问题可能有多个可能的原因:

  • DC 代理位于网络的隔离部分,该部分不允许与已注册的代理建立网络连接。 只要其他 DC 代理可以与代理服务器通信,以便从 Azure 下载密码策略,该问题可能是良性的。 下载策略后,被隔离的 DC 通过复制 sysvol 共享中的策略文件来获取这些策略。

  • 代理主机阻止访问 RPC 终结点映射器终结点(端口 135)

    Microsoft Entra Password Protection 代理安装程序会自动创建允许访问端口 135 的 Windows 防火墙入站规则。 如果以后删除或禁用此规则,DC 代理将无法与代理服务通信。 如果内置 Windows 防火墙被禁用,而不是另一个防火墙产品,则必须将该防火墙配置为允许访问端口 135。

  • 代理主机阻止访问代理服务侦听的 RPC 终结点(动态或静态)

    Microsoft Entra 密码保护代理安装程序会自动创建一个 Windows 防火墙入站规则,该规则允许访问Microsoft Entra Password Protection 代理服务侦听的任何入站端口。 如果以后删除或禁用此规则,DC 代理将无法与代理服务通信。 如果禁用了内置 Windows 防火墙,而使用另一个防火墙产品,则必须将该防火墙配置为允许访问 Microsoft Entra 密码保护代理服务侦听的任何入站端口。 如果代理服务配置为侦听特定的静态 RPC 端口(使用 Set-AzureADPasswordProtectionProxyConfiguration cmdlet),则此配置可能更具体。

  • 代理主机未配置为允许域控制器登录到计算机。 此行为通过“从网络访问此计算机”用户特权分配进行控制。 必须向林中的所有域中的所有域控制器授予此权限。 此设置通常作为更大网络加固工作的一部分而受到限制。

代理服务无法与 Azure 通信

  1. 确保代理计算机与 部署要求中列出的终结点建立连接。

  2. 确保将林和所有代理服务器注册到同一 Azure 租户。

    可以通过运行 Get-AzureADPasswordProtectionProxyGet-AzureADPasswordProtectionDCAgent PowerShell cmdlet 来检查此要求,然后比较每个返回项的 AzureTenant 属性。 若要正确操作,报告租户名称在所有 DC 代理和代理服务器中必须相同。

    如果 Azure 租户注册不匹配条件存在,可以通过根据需要运行 Register-AzureADPasswordProtectionProxy 和/或 Register-AzureADPasswordProtectionForest PowerShell cmdlet 来修复此问题,确保对所有注册使用同一 Azure 租户中的凭据。

DC 代理无法加密或解密密码策略文件

Microsoft Entra 密码保护依赖于Microsoft密钥分发服务提供的加密和解密功能。 加密或解密失败可能表现出各种症状,并有多种潜在原因。

  • 确保在域中所有 Windows Server 2012 及更高版本的域控制器上启用 KDS 服务并正常运行。

    默认情况下,KDS 服务的服务启动模式配置为手动(触发器启动)。 此配置意味着客户端首次尝试使用该服务时,会按需启动该服务。 Microsoft Entra Password Protection 正常工作时,此默认服务启动模式是可以接受的。

    如果 KDS 服务启动模式配置为“已禁用”,则必须修复此配置,然后才能Microsoft Entra Password Protection 正常工作。

    此问题的简单测试是通过服务管理 MMC 控制台或使用其他管理工具(例如,从命令提示符控制台运行“net start kdssvc”)手动启动 KDS 服务。 KDS 服务应成功启动并保持运行状态。

    KDS 服务无法启动的最常见根本原因是 Active Directory 域控制器对象位于默认域控制器 OU 之外。 此配置不受 KDS 服务支持,也不是由 Microsoft Entra 密码保护施加的限制。 此条件的解决方法是将域控制器对象移动到默认域控制器 OU 下的位置。

  • 不兼容的 KDS 加密缓冲区格式变化(从 Windows Server 2012 R2 到 Windows Server 2016)

    Windows Server 2016 中引入了 KDS 安全修补程序,用于修改 KDS 加密缓冲区的格式。 这些缓冲区有时无法在 Windows Server 2012 和 Windows Server 2012 R2 上解密。 相反的方向没问题。 在 Windows Server 2012 和 Windows Server 2012 R2 上加密的缓冲区始终在 Windows Server 2016 及更高版本上成功解密。 如果 Active Directory 域中的域控制器正在运行这些操作系统的组合,可能会偶尔报告 Microsoft Entra Password Protection 解密失败。 鉴于安全修复的性质,无法准确预测这些故障的时间或症状。 此外,鉴于在给定时间由哪个域控制器上的 Microsoft Entra 密码保护 DC 代理来加密数据是不确定的。

    除了不要在 Active Directory 域中运行这些不兼容操作系统的组合之外,此问题没有解决方法。 换句话说,应仅运行 Windows Server 2012 和 Windows Server 2012 R2 域控制器,或者只应运行 Windows Server 2016 及更高版本的域控制器。

DC 代理会认为林尚未注册

此问题的症状为 DC Agent\Admin 通道中记录的 30016 事件,其中部分内容为:

The forest hasn't been registered with Azure. Password policies can't be downloaded from Azure unless this is corrected.

此问题有两个可能的原因。

  • 林尚未注册。 若要解决此问题,请运行 Register-AzureADPasswordProtectionForest 命令,如 部署要求中所述。
  • 林已注册,但 DC 代理无法解密林注册数据。 这种情况的根本原因与 DC 代理下列出的问题 #2 相同,无法加密或解密密码策略文件。 确认此理论的一种简单方法是,仅在 Windows Server 2012 或 Windows Server 2012R2 域控制器上运行的 DC 代理上看到此错误,而 Windows Server 2016 及更高版本的域控制器上运行的 DC 代理是正常的。 解决方法相同:将所有域控制器升级到 Windows Server 2016 或更高版本。

弱密码已被接受,但不应接受

此问题可能有多种原因。

  • 您的 DC 代理正在运行一个已过期的公共预览版软件。 请参阅公共预览版 DC 代理软件已过期

  • DC 代理无法下载策略或无法解密现有策略。 检查前面的文章中是否存在可能的原因。

  • 密码策略强制模式仍设置为“审核”。 如果此配置生效,请使用 Microsoft Entra Password Protection 门户将其重新配置为强制实施。 有关详细信息,请参阅 操作模式

  • 密码策略已禁用。 如果此配置生效,请使用 Microsoft Entra Password Protection 门户将其重新配置为启用。 有关详细信息,请参阅 操作模式

  • 尚未在域中的所有域控制器上安装 DC 代理软件。 在这种情况下,难以确保远程 Windows 客户端在密码更改操作期间连接到特定域控制器。 如果你认为已成功将安装 DC 代理软件的特定 DC 作为目标,可以通过仔细检查 DC 代理管理员事件日志来验证:无论结果如何,至少有一个事件记录密码验证的结果。 如果更改了密码的用户不存在任何事件,则密码更改可能由其他域控制器处理。

    作为替代测试,请尝试在直接登录到安装了 DC 代理软件的 DC 时设置\更改密码。 不建议对生产 Active Directory 域使用此方法。

    尽管受这些限制支持 DC 代理软件的增量部署,但Microsoft强烈建议尽快在域中的所有域控制器上安装 DC 代理软件。

  • 密码验证算法实际上可能按预期工作。 请参阅如何评估密码

Ntdsutil.exe 无法设置 DSRM 弱密码

Active Directory 始终会验证新的目录服务恢复模式密码,以确保它满足域的密码复杂性要求;此验证还会调用密码筛选器 DLL,例如 Microsoft Entra 密码保护。 如果拒绝新的 DSRM 密码,则会出现以下错误消息:

C:\>ntdsutil.exe
ntdsutil: set dsrm password
Reset DSRM Administrator Password: reset password on server null
Please type password for DS Restore Mode Administrator Account: ********
Please confirm new password: ********
Setting password failed.
        WIN32 Error Code: 0xa91
        Error Message: Password doesn't meet the requirements of the filter dll's

Microsoft Entra Password Protection 记录 Active Directory DSRM 密码的密码验证事件日志事件时,预计事件日志消息不包含用户名。 发生此行为的原因是 DSRM 帐户是不属于实际 Active Directory 域的本地帐户。

由于使用 DSRM 弱密码,域控制器副本升级失败

在 DC 升级过程中,新的目录服务修复模式密码提交到域中的现有 DC 进行验证。 如果拒绝新的 DSRM 密码,则会出现以下错误消息:

Install-ADDSDomainController : Verification of prerequisites for Domain Controller promotion failed. The Directory Services Restore Mode password doesn't meet a requirement of the password filter(s). Supply a suitable password.

在这种情况下,就像在上一个问题中一样,任何 Microsoft Entra Password Protection 密码验证结果事件的用户名都是空的。

由于本地管理员密码薄弱,域控制器降级失败

支持将仍在运行 DC 代理软件的域控制器降级。 但是,管理员应注意 DC 代理软件在降级过程中继续强制实施当前密码策略。 新的本地管理员帐户密码(在降级操作中指定)会像任何其他密码一样得到验证。 Microsoft建议为本地管理员帐户选择安全密码作为 DC 降级过程的一部分。

降级成功后,域控制器将重新启动,并再次作为普通成员服务器运行,DC 代理软件将还原为在被动模式下运行。 然后,可以随时卸载它。

启动进入目录服务修复模式

如果域控制器启动进入目录服务修复模式,则无论当前处于活动状态的策略配置是什么,DC 代理密码筛选器 dll 都会检测此情况,并导致所有密码验证或实施活动被禁用。 DC 代理密码筛选器 dll 将 10023 警告事件记录到管理员事件日志,例如:

The password filter dll is loaded but the machine appears to be a domain controller that is booted into Directory Services Repair Mode. All password change and set requests are automatically approved. No further messages are logged until after the next reboot.

公共预览版 DC 代理软件已过期

在Microsoft Entra Password Protection 公共预览期间,DC 代理软件经过硬编码,可停止处理以下日期的密码验证请求:

  • 版本 1.2.65.0 已于 2019 年 9 月 1 日停止处理密码验证请求。
  • 版本 1.2.25.0 及以前的版本已于 2019 年 7 月 1 日停止处理密码验证请求。

随着截止日期的临近,所有有时间限制的 DC 代理版本均在启动时在 DC 代理管理事件日志中发出 10021 事件,如下所示:

The password filter dll has successfully loaded and initialized.

The allowable trial period is nearing expiration. Once the trial period has expired, the password filter dll no longer processes passwords. Please contact Microsoft for a newer supported version of the software.

Expiration date:  9/01/2019 0:00:00 AM

This message won't be repeated until the next reboot.

期限过后,所有受时间限制的 DC 代理版本在启动时在 DC 代理管理员事件日志中发出 10022 事件,如下所示:

The password filter dll is loaded but the allowable trial period has expired. All password change and set requests are automatically approved. Please contact Microsoft for a newer supported version of the software.

No further messages are logged until after the next reboot.

由于仅在首次启动时检查了截止日期,因此可能在日历截止日期过后很久才会看到这些事件。 一旦确认截止时间,不会对域控制器或更大的环境产生负面影响,只是所有密码将被自动批准。

重要

Microsoft建议将过期的公共预览版 DC 代理立即升级到最新版本。

在您的环境中识别需要升级的 DC 代理程序的一种简单方法是运行 Get-AzureADPasswordProtectionDCAgent cmdlet,例如:

PS C:\> Get-AzureADPasswordProtectionDCAgent

ServerFQDN            : bpl1.bpl.com
SoftwareVersion       : 1.2.125.0
Domain                : bpl.com
Forest                : bpl.com
PasswordPolicyDateUTC : 8/1/2019 9:18:05 PM
HeartbeatUTC          : 8/1/2019 10:00:00 PM
AzureTenant           : bpltest.onmicrosoft.com

在本文中,SoftwareVersion 字段显然是要查看的关键属性。 你还可以使用 PowerShell 筛选功能筛选出已达到或高于所需基准版本的 DC 代理,例如:

PS C:\> $LatestAzureADPasswordProtectionVersion = "1.2.125.0"
PS C:\> Get-AzureADPasswordProtectionDCAgent | Where-Object {$_.SoftwareVersion -lt $LatestAzureADPasswordProtectionVersion}

Microsoft Entra Password Protection 代理软件在任何版本中都不受时间限制。 Microsoft仍建议 DC 和代理程序在新版本发布时升级到最新版本。 Get-AzureADPasswordProtectionProxy cmdlet 可用于查找需要升级的代理程序,类似于上述 DC 代理程序的示例。

有关特定升级过程的详细信息,请参阅 升级 DC 代理升级代理服务

紧急补救

如果发生 DC 代理服务导致问题的情况,DC 代理服务可能会立即关闭。 DC 代理密码筛选器 dll 仍尝试调用未运行的服务并记录警告事件(10012,10013),但在此期间接受所有传入的密码。 然后,还可以通过 Windows 服务控制管理器配置 DC 代理服务,并根据需要使用“已禁用”的启动类型。

另一个修正措施是在 Microsoft Entra Password Protection 门户中将“启用”模式设置为“否”。 下载更新的策略后,各 DC 代理服务进入静默模式,在这种模式下,将按原样接受所有密码。 有关详细信息,请参阅 操作模式

删除

如果决定卸载 Microsoft Entra 密码保护软件并从域和林中清理所有相关状态,可使用以下步骤完成此任务:

重要

必须按顺序执行这些步骤。 如果代理服务的任何实例保持运行状态,它将定期重新创建其 serviceConnectionPoint 对象。 如果 DC 代理服务的任何实例保持运行状态,它会定期重新创建其 serviceConnectionPoint 对象和 sysvol 状态。

  1. 从所有计算机中卸载代理软件。 完成此步骤后不需要重新启动。

  2. 从所有域控制器卸载 DC 代理软件。 此步骤 需要重新启动

  3. 在每个域命名上下文中手动删除所有代理服务连接点。 可以使用以下 Active Directory PowerShell 命令发现这些对象的位置:

    $scp = "serviceConnectionPoint"
    $keywords = "{ebefb703-6113-413d-9167-9f8dd4d24468}*"
    Get-ADObject -SearchScope Subtree -Filter { objectClass -eq $scp -and keywords -like $keywords }
    

    不要在$keywords变量值的末尾省略星号 (“*”)。

    然后,可通过管道将 Get-ADObject 命令找到的结果对象传送到 Remove-ADObject,或手动将其删除。

  4. 在每个域命名上下文中手动删除所有 DC 代理连接点。 林中的每个域控制器可能有一个这些对象,具体取决于软件的部署范围。 可以使用以下 Active Directory PowerShell 命令发现该对象的位置:

    $scp = "serviceConnectionPoint"
    $keywords = "{2bac71e6-a293-4d5b-ba3b-50b995237946}*"
    Get-ADObject -SearchScope Subtree -Filter { objectClass -eq $scp -and keywords -like $keywords }
    

    然后,可通过管道将 Get-ADObject 命令找到的结果对象传送到 Remove-ADObject,或手动将其删除。

    不要在$keywords变量值的末尾省略星号 (“*”)。

  5. 手动删除林级配置状态。 林配置状态保留在 Active Directory 配置命名上下文中的某个容器内。 可按如下所示发现和删除该状态:

    $passwordProtectionConfigContainer = "CN=Azure AD Password Protection,CN=Services," + (Get-ADRootDSE).configurationNamingContext
    Remove-ADObject -Recursive $passwordProtectionConfigContainer
    
  6. 通过手动删除以下文件夹及其所有内容,手动删除 sysvol 相关的所有状态:

    \\<domain>\sysvol\<domain fqdn>\AzureADPasswordProtection

    如有必要,也可以在给定域控制器上本地访问此路径;默认位置类似于以下路径:

    %windir%\sysvol\domain\Policies\AzureADPasswordProtection

    如果在非默认位置配置了 sysvol 共享,则此路径不同。

使用 PowerShell cmdlet 进行健康测试

AzureADPasswordProtection PowerShell 模块包括两个与运行状况相关的 cmdlet,用于执行软件已安装且正常运行的基本验证。 建议在设置新部署之后运行这些 cmdlet(此后定期运行),以及在调查问题时运行这些 cmdlet。

每项健康测试返回基本的通过或失败结果,若失败会有可选信息。 如果失败原因尚不清楚,请查找可能解释失败的错误事件日志消息。 启用文本日志消息可能也很有用。 有关更多详细信息,请参阅监视 Microsoft Entra 密码保护

代理运行状况测试

Test-AzureADPasswordProtectionProxyHealth cmdlet 支持两个可以单独运行的健康测试。 第三种模式允许运行不需要任何参数输入的所有测试。

代理注册验证

此测试验证代理是否已正确注册到 Azure,并且能够向 Azure 进行身份验证。 成功的运行如下所示:

PS C:\> Test-AzureADPasswordProtectionProxyHealth -VerifyProxyRegistration

DiagnosticName          Result AdditionalInfo
--------------          ------ --------------
VerifyProxyRegistration Passed

如果检测到错误,测试将返回失败的结果和可选的错误消息。 下面是一个可能失败的示例:

PS C:\> Test-AzureADPasswordProtectionProxyHealth -VerifyProxyRegistration

DiagnosticName          Result AdditionalInfo
--------------          ------ --------------
VerifyProxyRegistration Failed No proxy certificates were found - please run the Register-AzureADPasswordProtectionProxy cmdlet to register the proxy.

端到端 Azure 连接的代理验证

此测试是 -VerifyProxyRegistration 测试的超集。 它要求代理在 Azure 中正确注册,能够向 Azure 进行身份验证,最后添加一个检查,确认消息可以成功发送到 Azure,从而验证完整的端到端通信是否正常工作。

成功的运行如下所示:

PS C:\> Test-AzureADPasswordProtectionProxyHealth -VerifyAzureConnectivity

DiagnosticName          Result AdditionalInfo
--------------          ------ --------------
VerifyAzureConnectivity Passed

所有测试的代理验证

此模式允许批量运行不需要参数输入的 cmdlet 支持的所有测试。 成功的运行如下所示:

PS C:\> Test-AzureADPasswordProtectionProxyHealth -TestAll

DiagnosticName          Result AdditionalInfo
--------------          ------ --------------
VerifyTLSConfiguration  Passed
VerifyProxyRegistration Passed
VerifyAzureConnectivity Passed

DC 代理运行状况测试

Test-AzureADPasswordProtectionDCAgentHealth cmdlet 支持多个可以单独运行的运行状况测试。 第三种模式允许运行不需要任何参数输入的所有测试。

基本 DC 代理运行状况测试

以下测试都可以单独运行,并且不接受参数。 下表列出了每个测试的简要说明。

DC 代理运行状况测试 描述
-VerifyPasswordFilterDll 验证密码筛选器 dll 当前是否已加载并能够调用 DC 代理服务
-VerifyForestRegistration 验证该林区当前是否已注册
-VerifyEncryptionDecryption 使用 Microsoft KDS 服务验证基本加密和解密功能是否正常工作。
-VerifyDomainIsUsingDFSR 验证当前域是否正在使用 DFSR 进行 sysvol 复制
-VerifyAzureConnectivity 验证与 Azure 的端到端通信是否通过任何可用的代理而正常工作

下面是 -VerifyPasswordFilterDll 测试通过的示例,其他成功测试看起来类似:

PS C:\> Test-AzureADPasswordProtectionDCAgentHealth -VerifyPasswordFilterDll

DiagnosticName          Result AdditionalInfo
--------------          ------ --------------
VerifyPasswordFilterDll Passed

所有测试的 DC 代理验证

此模式允许批量运行不需要参数输入的 cmdlet 支持的所有测试。 成功的运行如下所示:

PS C:\> Test-AzureADPasswordProtectionDCAgentHealth -TestAll

DiagnosticName             Result AdditionalInfo
--------------             ------ --------------
VerifyPasswordFilterDll    Passed
VerifyForestRegistration   Passed
VerifyEncryptionDecryption Passed
VerifyDomainIsUsingDFSR    Passed
VerifyAzureConnectivity    Passed

使用特定代理服务器进行连接测试

许多故障排除情况涉及调查 DC 代理与代理服务器之间的网络连接。 有两种运行状况测试可专门针对此类问题。 这些测试要求指定特定的代理服务器。

验证 DC 代理程序与特定代理服务器之间的连接

该测试验证了从 DC agent 到代理的第一段通信链路的连通性。 它会验证代理是否收到呼叫,但不会涉及与 Azure 的通信。 成功的运行如下所示:

PS C:\> Test-AzureADPasswordProtectionDCAgentHealth -VerifyProxyConnectivity bpl2.bpl.com

DiagnosticName          Result AdditionalInfo
--------------          ------ --------------
VerifyProxyConnectivity Passed

下面是在目标服务器上运行的代理服务停止的示例故障条件:

PS C:\> Test-AzureADPasswordProtectionDCAgentHealth -VerifyProxyConnectivity bpl2.bpl.com

DiagnosticName          Result AdditionalInfo
--------------          ------ --------------
VerifyProxyConnectivity Failed The RPC endpoint mapper on the specified proxy returned no results; please check that the proxy service is running on that server.

验证 DC 代理与 Azure 之间的连接(使用特定代理)

此测试使用特定代理验证 DC 代理与 Azure 之间的完全端到端连接。 成功的运行如下所示:

PS C:\> Test-AzureADPasswordProtectionDCAgentHealth -VerifyAzureConnectivityViaSpecificProxy bpl2.bpl.com

DiagnosticName                          Result AdditionalInfo
--------------                          ------ --------------
VerifyAzureConnectivityViaSpecificProxy Passed

后续步骤

Microsoft Entra 密码保护常见问题

有关全局和自定义禁止密码列表的详细信息,请参阅 禁止错误密码