仅在 Active Directory 中轮询密码更改、获取更新的密码并在其他地方更新的推荐方法是什么?
我查看了 System.DirectoryServices.Protocols 命名空间中的类,例如“DirectoryNotificationControl”类,但似乎这会轮询任何属性,稍后我们需要查询我们感兴趣的属性(密码)是否确实发生了变化。
另外我们如何从活动目录中获取密码值?虽然非常复杂,但可以使用 LSA。
仅在 Active Directory 中轮询密码更改、获取更新的密码并在其他地方更新的推荐方法是什么?
我查看了 System.DirectoryServices.Protocols 命名空间中的类,例如“DirectoryNotificationControl”类,但似乎这会轮询任何属性,稍后我们需要查询我们感兴趣的属性(密码)是否确实发生了变化。
另外我们如何从活动目录中获取密码值?虽然非常复杂,但可以使用 LSA。
唯一的“简单”方法(以及那些围绕“简单”的非常大的引号)是编写一个托管在域控制器上的密码过滤器 Dll 。
您可以实现PasswordChangeNotify接口并让您的代码更新需要通知密码更改的任何外部内容。
但是,这必须在本机代码中完成,因此不允许使用 C#。
我最初沿着这条路走,最终放弃了,并使用了一种不同的方法来跟踪更改的密码,但是我在此过程中确实发现了一个名为passwdhk的开源项目,它可能对您有所帮助。
passwdhk 所做的是它为您实现了一个密码过滤器 DLL,但是过滤器所做的只是启动另一个带有命令行参数的可执行文件,该命令行参数传递给密码更改通知函数(“更改后程序”正在转发来自PasswordChangeNotify的参数,“预更改程序”正在转发来自PasswordFilter的参数)。这使您仍然可以编写代码来更新 C# 中的其他服务,它只是从命令行获取密码,而不是拦截密码本身。
据我所知,默认情况下,密码(以加密方式存储)无法在 Active-Directory 中读取。您可以更改策略以可逆方式存储它,但这确实不是一件好事。
我知道的唯一方法是在每台客户端机器上安装一个组件。该组件捕获密码更改,您可以做任何您想做的事情。
从 NT 到 XP,这个组件被称为 GINA (DLL)。从 Vista 开始,这个组件应该使用 Credential Provider API 编写。