網上通過ldap操作ad的例子很多,我也是通過網路搜尋然後成功的搜尋了公司未知結構的ad,中間經歷了一些波折,下面總結一下過程,我相信對需要操作ad的碼工碼農們多多少少是有些幫助。
1 獲取dircontext要注意的地方。
以下是構造dircontext的基本**:
dircontext ctx = null;
string ldapurl = "ldap:";
string user = "test@***.com";
string password = "restart#123";
hashtable env = new hashtable();
env.put(context.initial_context_factory, "com.sun.jndi.ldap.ldapctxfactory");
env.put(context.security_authentication, "******");
env.put(context.provider_url, ldapurl);
env.put(context.security_principal, user);
env.put(context.security_credentials, password);
ctx = new initialdircontext(env);
(1) 對ad結構是未知的情況下,ldapurl的寫法保守一點比較好,所以不在埠後加dn。
(2) 為什麼不用網域名稱,而用ip,因為有時候通過網域名稱訪問不到ad,存在不穩定情況,獲取域位址方法,通過cmd輸入ipconfig -all找到win server既是所需ip,可能會存在多個,一般大點的公司會有多個域控制器。
(3)使用者名稱的寫法,不能直接用使用者名稱,而要加上域資訊,如userid@domain address或domain address\userid方式,如test@***.com,test是域帳號,***.com為ad網域名稱,否則會報異常。
2 查詢要注意的地方。
因為ad結構未知,所以查詢仍然要保守點。
dircontext cnt = null;
trycatch (exception e)
finally
}
(1) 未知ad情況下base開始只寫出dc,因為域帳號通常不會直接建立在user節點下,一般會自己建立組織。
(2) 過濾器條件越少越好,而且最好用模糊匹配,如string filter = samaccountname=*test*",其中test為登入帳號名。
(3)searchcons.setsearchscope(2),設為2會查詢子節點。
(4) searchcons.settimelimit(0),設超時時間為0標識沒有超時限制。
(5)因為過濾條件比較簡單而且是模糊條件,此時基本上能查出想要的資料,但節點數量很大的話查詢會比較慢,此時可以根據查詢的結果資訊來補充dn和filter,如在dn中加入ou根,在filter加上多個條件,filter加多個條件的方法(&(條件1)(條件2))。
(6)searchcons.setcountlimit(limitsize)問題,有時查詢時會報limitsize的異常,這是在遍歷查詢結果時出現的問題,下面是遍歷的部分**:
while (namingenum != null && namingenum.hasmore())
可以手工設定乙個limitsize,當while迴圈次數到達limitsize時跳出while迴圈。
(7)注意關閉dircontext
3 遍歷結果要注意的問題。
(1) 時間的處理
private string getconverttime(object time)
string strtime = time.tostring().trim();
if (strtime.indexof(".") != -1)
long longtime = long.valueof(strtime);
gregoriancalendar win32epoch = new gregoriancalendar(1601, calendar.january, 1);
win32epoch.settimezone(timezone.gettimezone("china"));
date win32epochdate = win32epoch.gettime();
long timesincewin32epoch = longtime / 10000 + win32epochdate.gettime();
date lastlogon = new date(timesincewin32epoch);
return sf.format(lastlogon);
}
這個時間是基於格林威治2023年1月1日的,這要處理兩個問題,a:加上2023年1月1日這個基礎時間-win32epochdate.gettime(),b:格林威治時間與你所在時區有偏移量(win32epoch.settimezone(timezone.gettimezone("china"));
),所以要加減偏移量才是真正的時間。
(2) lastlogon與lastlogontimestamp,其中lastlogon至少在一台ad上是實時更新的,而lastlogontimestamp則不是通常半個月才會更新,lastlogon因為存在在不同ad上的同步問題,所以需要在所有ad上都找到lastlogon,並找出最大值才是最後的登入時間。
(3)id類的處理,id屬性值是一串二進位制資料,需要進行轉換字串。
private static string getguid(byte inarr)
}return guid.tostring();
}
AD和LDAP的關係
ldap是輕量目錄訪問協議 lightweight directory access protocol 的縮寫,ldap標準實際上是在x.500標準基礎上產生的乙個簡化版本 ad是active directory的縮寫,ad應該是ldap的乙個應用例項,而不應該是ldap本身。比如 windows域...
解除LDAP查詢時的AD條目查詢限制
具體步驟如下 1.在 開始 執行 輸入 ntdsutil 回車 2.輸入 ldap policies 回車 3.輸入 connections 回車 4.輸入 connect to domain 當前網域名稱 在中集案例中,網域名稱是 cimc.com 5.連線提示出現後,輸入 quit 回車 6.輸...
解碼未知結構的JSON資料
如果要解碼一段未知結構的json,只需將這段json資料解碼輸出到乙個空介面即可。在解碼json資料的過程中,json資料裡邊的元素型別將做如下轉換 1 json中的布林值將會轉換為go中的bool型別 2 數值會被轉換為go中的float64型別 3 字串轉換後還是string型別 4 json陣...