实际上,我正在调试一个 C# 应用程序,但由于在 PowerShell 中可以使用相同的命令,所以我正在尝试。
我正在尝试使用 PowerShell 中的以下命令验证用户帐户:
> Add-Type -AssemblyName System.DirectoryServices.AccountManagement
> $ds = New-Object System.DirectoryServices.AccountManagement.PrincipalContext("domain", "<domain>", "<OuDN>", "negotiate", "<username>", "<password>")
> $ds.ValidateCredentials("<username>", "<password>", "negotiate")
最后一个命令总是返回 false,我已经通过使用它们登录验证了凭据是否正确。我们已经在环境中关闭了 NTLM 身份验证,每次我ValidateCredentials()
通过 lsass.exe 执行 NTLM 连接时,我都可以看到被阻止(事件查看器中的事件 ID 4002)。我打开了 Kerberos 日志记录,但在尝试验证时,事件查看器中没有生成任何事件。这反过来让我相信它甚至没有尝试 Kerberos 身份验证,但我可能错了。
我已经通过 验证了该计算机的 SPN 确实存在setspn -L
,而且由于 Kerb 身份验证在系统的其他地方都能正常工作,所以我不确定这是否是配置错误。
更新:
我找到了一个解决方案,但尚未将其发布为答案,因为我仍然有一些奇怪的行为。我将其添加@<domain>
到用户名中,这在我正在调试的 C# 应用程序中有效,但在 PowerShell 中运行完全相同的命令仍然返回 false,尽管现在我KDC_ERR_PREAUTH_FAILED
在事件查看器中得到了一个。