從網上搜到lualdap,狂喜,試之,串連,查詢,新增User,OU,修改屬性都OK,唯獨修改不了密碼unicodePwd. 重祭google大法, 結果沒讓人暈過去, 網上討論這個問題一大把, 看來問題嚴重. 細看, 發現涉及認證, TLS/SSL, ASN.1 BER等, 怒了, 修改一個破密碼這個多破事. 一一按要求辦了, 還是報DSID-031A0FC0錯誤, 服了.
看來還得從頭來過, 開始準備重新編譯lualdap, 從API一步一步來, 看行不行.
下載個lualdap源碼, 寫個bkl檔案, 編譯一下, 成功. 下一步說得慢慢啃API了.
還是三劍客, bkl, bkgen, bat
lualdap.bkl
<?xml version="1.0"?><makefile><include file="presets$(DIRSEP)simple.bkl"/><option name="WXLUA_DIR" category="path"/><!-- option path --><option name="LUA_DIR" category="path"/><!-- path --><set var="ROOT_DIR">..</set><set-srcdir>$(ROOT_DIR)$(DIRSEP)src</set-srcdir><set var="OUTPUT_PROFIX"><if cond="FORMAT=='mingw'">gcc_dll</if></set><set var="BUILDDIR">$(ROOT_DIR)$(DIRSEP)lib$(DIRSEP)$(OUTPUT_PROFIX)</set><set var="BINDIR">$(ROOT_DIR)</set><dll id="lualdap" template="simple"><define>WINLDAP</define><!-- include --><include>"$(LUA_DIR)$(DIRSEP)src"</include><sources>$(fileList('*.cpp'))</sources><sources>$(fileList('*.c'))</sources><ldflags>-Wl,--enable-auto-import $(SRCDIR)$(DIRSEP)lualdap.def</ldflags><sys-lib>lua5.1</sys-lib><sys-lib>wldap32</sys-lib><dirname>$(BUILDDIR)</dirname><lib-path>$(WXLUA_DIR)\lib\gcc_dll</lib-path><dllname>lualdap</dllname></dll></makefile>
lualdap.bkgen
<?xml version="1.0" ?><!-- $Id: lualdap.bkgen, v1.0 2010/11/1 14:12:03 $ --><bakefile-gen xmlns="http://www.bakefile.org/schema/bakefile-gen"><input>lualdap.bkl</input><add-formats>mingw</add-formats><add-flags formats="mingw">-o$(INPUT_FILE_DIR)/makefile.gcc</add-flags> <add-flags>-DWINLDAP -DBUILD=release</add-flags><add-flags>-DLUA_DIR=$(envvar("lua"))</add-flags></bakefile-gen>
bakeit.bat
clsbakefile_gen --desc=lualdap.bkgen mingw32-make -f makefile.gcc cleanmingw32-make -f makefile.gcc COMSPEC=%comspec% WXLUA_DIR="%wxlua%" LUA_DIR="%lua%" allcopy ..\lib\gcc_dll\lualdap.dll ..\test
找到了幾篇討論這個問題的文章,
第一篇詳細描述了如何產生符合要求的unicodePwd(和MSDN上描述的相差太多,MSDN居然忽悠人).
1.http://technet.microsoft.com/en-us/magazine/ff848710.aspx
第二篇詳細描述了如何使用ldifde工具匯入帶有unicodePwd的ldf檔案.
2.http://www.winserverkb.com/Uwe/Forum.aspx/windows-server-ad/20168/LDIFDE-Error-when-trying-to-change-passwords
第三篇有點綜合前兩篇
3.http://www.nonhostile.com/howto-format-unicodepwd-ldif-active-directory.asp
需要注意的是ldifde命令帶-h參數, unicodePwd在ldf檔案中後面是帶::,注意不是單個冒號
c:\csv:lidfde -i -h -f changpass.ldif -j c:\csvHere is the content of my ldif filedn: CN=testuser,OU=testOU,DC=domain,DC=localchangetype: modifyreplace: unicodePwdunicodePwd::IgBwAGEAcwBzAHcAbwByAGQAIgA=-
4.http://msdn.microsoft.com/en-us/library/aa366105(v=vs.85).aspx
5.http://msdn.microsoft.com/en-us/library/Aa367033
非常奇怪,使用ldifde能夠順利的修改unicodePwd,僅僅是加了個-h參數(啟用SASL層加密),用depends查看ldifde.exe發現其並沒有匯入SASL和SSL之類的函數。僅僅是一些init,connect和bind的函數。為什麼內建的工具能夠如此簡單的使用unicodePwd(好像使用ADSI也很簡單就能修改),而使用ldap卻有那麼多的限制。