Windows 2008 上的注册密码过滤器从未触发

Windows 2008 上的注册密码过滤器从未触发

我写了一个自定义密码过滤器对于 Windows 域控制器(passfilt.dll),并根据说明(将其放入system32文件夹并更新注册表项)

但没有任何迹象表明该 DLL 被调用。没有。

我已经设置了系统事件审核,并且正在获取4614 事件(“安全帐户管理器已加载通知包。”)塞克利拉斯芬,均列在“HKEY_LOCAL_MACHINE.SYSTEM.CurrentControlSet.Control.Lsa.Notification Packages”中。如果我将它们从“通知包”中删除,它们不会被读取。正如预期的那样。但我放入“通知包”中的 DLL 并未加载。记录的审核失败也没有记录。或任何其他事件。由于我无需锁定即可删除 DLL,因此不会加载该 DLL。

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

有人知道我该如何解决这个问题吗?至少找到一条错误消息或类似的东西...

答案1

您无法动态加载或卸载 DLL。将 DLL 放入 system32 中。将名称添加到通知包列表中。您只需要名称(而不是 .DLL 部分)。您需要重新启动。启动时,操作系统会读取通知包值并加载那里的所有 DLL。登录时,运行 winmsd 或 msinfo32 以确保您的 DLL 已加载。请参阅计算机配置 + 软件环境 + 已加载模块。只有在密码更改期间,并且密码满足 Windows 要求(最小长度、无最小年龄问题、不在历史缓冲区中)时,才会调用 DLL。LSA 首先检查 Windows 要求(在 2K3 和 2K8 中),然后按列出的顺序为通知包中列出的每个 DLL 调用 PasswordFilter() 函数。如果您的 DLL 表示 pw 正常,且没有其他过滤器拒绝它,则 pw 将提交给 AD/SAM,然后 LSA 将再次遍历那里列出的所有 DLL 以调用 PasswordChangeNotify(),这样 DLL 就可以执行 pw 同步(即,由于 pw 已提交给 AD,因此同步正常,永远不会尝试同步 PasswordFilter() 调用)。如果您需要修改更新 DLL,则必须从通知包中删除条目,重新启动,将新条目复制到 system32,再次更新通知包并重新启动。节省时间,编写脚本并使用 2 个 DLL 名称,这样当您重新启动时,您将加载第二个,然后在下次重新启动时切换回第一个,等等。内核调试很慢/痛苦。因此,如果您进行调试,将其写入文件可能更容易。

答案2

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

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

答案3

你可能得跑regsvr32以确保它正确注册。链接解释了正确的语法(通常只是 regsvr32 dllname.dll)

相关内容