在Windows 2008上注册的密码filter永远不会触发

我已经为Windows域控制器(一个passfilt.dll)编写了自定义密码filter ,并根据说明进行了注册(将其放在system32文件夹中并更新了registry项)

但是没有任何DLL被称为的迹象。 没有。

我已经设置了系统事件的审计,并且获取了“HKEY_LOCAL_MACHINE.SYSTEM.CurrentControlSet.Control.Lsa”中列出的sceclirassfm的 4614个事件 (“安全帐户pipe理器已经加载了一个通知包”通知包“。 如果我从“通知包”中删除它们,则不会被读取。 正如所料。 但是,我已经把“Notification Packages”中的DLL加载了。 也没有logging失败的审计。 或任何其他事件。 该DLL不加载,因为我可以删除它没有锁。

操作系统是Windows 2008 R2 x64,我正在使用我的DLL的64位版本。

有没有人有一个想法,我应该如何着手解决这个问题? 至lessfind一个错误信息或东西…

您不能dynamic加载或卸载DLL。 把DLL放在system32中。 将名称添加到通知包列表中。 您只需要名称(不是.DLL部分)。 您将需要重新启动。 在启动时,操作系统读取通知包值,并加载所有的DLL。 当您login运行winmsd或msinfo32,以确保您的DLL加载。 请参阅计算机configuration+软件环境+加载的模块。 只有当pw满足窗口要求(最小长度,没有最小年龄问题,不在历史缓冲区中)时,DLL才被调用。 LSA首先检查窗口要求(在2K3和2K8中),然后按照列出的顺序为列在“通知包”中的每个DLL调用PasswordFilter()函数。 如果你的DLL说pw是好的,没有其他的filter拒绝它,那么pw被提交给AD / SAM,然后LSA再次通过列出的所有dll来调用PasswordChangeNotify(),这样DLL就可以进行pw同步pw是致力于AD,从来没有尝试同步PasswordFilter()调用)。 如果您需要修改更新DLL,则必须从Notification Packages中删除条目,重新引导,将新条目复制到system32,再次更新Notification Packages并重新引导。 节省时间,编写一个脚本,并使用2个DLL名称,所以当你重新启动时,你加载第二个然后切换回第一个在下一个重新启动等等。内核debugging是缓慢/痛苦的。 所以,如果你debugging它可能会更容易让它写入一个文件。

我已经通过在每个DC上安装C ++ visual studio的可重新configuration包来解决这个问题。

您必须根据用于编译您的dll的Visual Studio版本安装VS C ++的可再发行包的相同版本。

您可能必须运行regsvr32以确保它正确注册。 该链接解释了正确的语法(通常只是regsvr32 dllname.dll)