我们调用DirectoryEntry.Invoke(" SetPassword",newpwd)来更改本地用户的密码,但在对远程SQL服务器执行Windows身份验证时,不会立即使用新密码。它确实在重启后使用,但这对我来说不是一个真正的选择。如何在不重启的情况下使其生效?我现在需要在客户端上运行进程才能立即开始使用新密码。
环境是两个Windows 7嵌入式系统,称之为服务器'和'客户端',并且没有域,但它们都在同一个工作组中。我们在两个系统上使用相同的用户名。有多个服务器有不同的密码(根据各种事情计算)。当我们需要切换到使用其他服务器时,我们会在本地更改密码。更改本身是成功的,但是从客户端到服务器的SQL访问失败并带有
SSPI handshake failed with error code 0x8009030c, state 14 while establishing a connection with integrated security; the connection has been closed. Reason: AcceptSecurityContext failed. The Windows error code indicates the cause of failure.
和
Login failed. The login is from an untrusted domain and cannot be used with Windows authentication.
但是一旦客户端重新启动,它就可以成功访问服务器的数据库。
两个系统上的SQL Express 2008,配置为仅使用Windows身份验证。
Wireshark向我展示了SMB2 NTLMSSP_AUTH数据包,看起来像是常见的信息,虽然我不知道如何解码安全blob。否则,它匹配成功会话的数据包。在故障情况下,此数据包之后是带有STATUS_LOGON_FAILURE的SMB2响应和缺少的安全blob。我只能认为客户端在该安全blob中提供了某种密码哈希值,并且服务器发现它并不匹配自己的密码哈希 - 或类似的东西。
不幸的是,更改环境('使用Active Directory','使用Kerberos'等)对我来说不是一个选择。此外,这些是消费者触摸屏信息亭,没有人知道密码,也无法用键盘输入密码。
ADD:仅供参考,因此更改了密码:
DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://localhost/{0}", username));
directoryEntry.Invoke("SetPassword", newPassword);
ADD:将该参数设为新对象[] {newPassword},并调用.CommitChanges(),因为这些看似正确的事情要做。行为没有变化。