You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AD密码筛选器DLL返回TRUE时修改密码仍报域要求不符问题

AD自定义密码筛选器DLL放行逻辑不生效排查方案

你当前代码逻辑本身没有问题,PasswordFilter直接返回TRUE就代表放行所有密码请求,出现拦截报错100%是DLL加载失败导致的,按以下顺序排查即可:

  • 架构匹配问题
    所有AD服务器默认都是64位系统,如果你编译时选了x86(32位)平台,64位LSA进程无法加载32位DLL,会直接判定密码校验不通过返回你看到的错误。必须将VS编译目标平台改为x64,编译后将64位DLL放到C:\Windows\System32目录,不要放到C:\Windows\SysWOW64(该目录存放32位系统文件,64位进程不会从这里加载模块)。
  • 注册表配置问题
    定位到注册表路径HKLM\SYSTEM\CurrentControlSet\Control\Lsa下的Notification Packages项,该项是多字符串类型:
    • 添加你的DLL名称时不要带.dll后缀,例如DLL名为CustomPwdFilter.dll,注册表里只需要填写CustomPwdFilter
    • 不要删除该项原有默认值(比如默认存在的scecli),否则会导致系统原生密码策略加载异常
  • 函数导出格式问题
    你当前用__declspec(dllexport)导出C++函数时,编译器会对函数名做名称修饰,导致LSA找不到指定名称的导出函数,加载直接失败。两种修复方式选一个即可:
    1. 给所有导出函数加extern "C"修饰,避免名称修饰,示例:
    extern "C" __declspec(dllexport) BOOLEAN __stdcall InitializeChangeNotify(void)
    {
       return TRUE;
    }
    
    1. 新增模块定义文件(.def),在文件里明确指定导出函数名:
    LIBRARY CustomPwdFilter
    EXPORTS
        InitializeChangeNotify
        PasswordFilter
        PasswordChangeNotify
    
    编译完成后可以用VS自带的dumpbin /exports 你的DLL路径命令检查导出表,确认三个导出函数名完全和上面列的一致,没有多余的修饰字符。
  • 依赖缺失问题
    如果你编译时选择动态链接MSVC运行库(编译选项为/MD),目标AD服务器没有安装对应版本的VC++运行库时,DLL会加载失败。直接把编译选项改为**静态链接运行库(/MT)**即可,不要用Debug版本编译(Debug版本依赖的调试运行库默认不会装在服务器上)。
  • 权限问题
    放到System32目录下的DLL需要给SYSTEM账户授予读取、执行权限,LSA以系统权限运行,权限不足会直接加载失败。

排查时可以直接打开系统事件查看器,路径为Windows 日志 -> 系统,筛选来源为LSA或SceCli的事件,会明确记录密码筛选器加载失败的具体原因,不需要盲目试错。

内容的提问来源于stack exchange,提问作者Xotoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:18:38