【问题标题】:Poll for only password change in Active Directory仅轮询 Active Directory 中的密码更改
【发布时间】:2013-09-11 13:13:24
【问题描述】:

仅在 Active Directory 中轮询密码更改、获取更新的密码并在其他地方更新的推荐方法是什么?

我查看了 System.DirectoryServices.Protocols 命名空间中的类,例如“DirectoryNotificationControl”类,但似乎这会轮询任何属性,稍后我们需要查询我们感兴趣的属性(密码)是否确实发生了变化。

另外,我们如何从活动目录中获取密码值?使用 LSA 是可能的,虽然非常复杂..

【问题讨论】:

  • 虽然很复杂,但可以使用 LSA...

标签: c# active-directory


【解决方案1】:

据我所知,默认情况下,密码(以加密方式存储)无法在 Active-Directory 中读取。您可以更改策略以可逆方式存储它,但这确实不是一件好事。

我知道的唯一方法是在每台客户端机器上安装一个组件。该组件捕获密码更改,您可以为所欲为。

从 NT 到 XP,这个组件被称为 GINA (DLL)。从 Vista 开始,此组件应使用 Credential Provider API 编写。

【讨论】:

    【解决方案2】:

    唯一的“简单”方法(以及那些围绕“简单”的非常大的引号)是编写一个托管在域控制器上的Password Filter Dll

    您可以实现PasswordChangeNotify 接口并让您的代码更新需要通知密码更改的任何外部内容。

    但是这必须在本机代码中完成,因此不允许使用 C#。


    我最初沿着这条路走,最终放弃了,并使用了一种不同的方法来跟踪更改的密码,但是我在此过程中确实发现了一个名为 passwdhk 的开源项目,它可能有助于你。

    passwdhk 所做的是它为您实现了一个密码过滤器 DLL,但是过滤器所做的只是启动另一个可执行文件,其中包含传递给密码更改通知函数的命令行参数(“更改后程序”正在转发来自PasswordChangeNotify 的参数,“预更改程序”正在转发来自PasswordFilter 的参数)。这使您仍然可以编写代码来更新 C# 中的其他服务,它只是从命令行获取密码,而不是拦截密码本身。

    【讨论】:

    • +1 对,我忘了这个。但它应该在每个域控制器上实现还是只在一个具有特定角色的域控制器上实现?
    • @JPBlanc from this MSDN page "所有域控制器都是可写的,因此密码过滤器包必须存在于所有域控制器上。Windows NT 4.0 域: 通知域帐户仅发生在主域控制器上。除了主域控制器之外,密码过滤器包应安装在所有备份域控制器上,以便在服务器角色更改时继续通知。"
    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 2018-03-10
    • 2015-09-11
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多