【轉】 如何利用C#代碼來進行操做AD

要用代碼訪問 Active Directory域服務,需引用System.DirectoryServices命名空間,該命名空間包含兩個組件類,DirectoryEntry和 DirectorySearcher。DirectoryEntry類可封裝 ActiveDirectory域服務層次結構中的節點或對象,使用此類綁定到對象、讀取屬性和更新特性;使用DirectorySearcher類可對 Active Directory域服務層次結構執行查詢。

若是僅要對AD的組織單元,羣組和用戶進行查詢或者更改屬性,使用上述兩個類便可。下面給出的是查詢在AD中某個組織單元下的全部用戶部分代碼:html

DirectoryEntry objDE = new DirectoryEntry(strADRootPath, strADAccount, strADPassword);  
string strFilter = "(&(objectCategory=person)(objectClass=user))";  
DirectorySearcher objSearcher = new DirectorySearcher(objDE, strFilter);  
//排序  
objSearcher.Sort = new SortOption("name", SortDirection.Ascending);  
SearchResultCollection src = objSearcher.FindAll();

其中ADPath是要查詢組織單元的所在的LDAP,其格式爲:LDAP:\\ OU=XX部門,OU=XX公司,DC=域名,DC=COM,若是鏈接到的AD是在服務器上那麼格式寫成LDAP:\\XX.XX.XX.XX\ OU=XX部門,OU=XX公司,DC=域名,DC=COM(XX.XX.XX.XX爲服務器IP);ADAccount和ADPwd爲AD用戶的帳戶和密碼,若是是管理員則能夠進行任何操做,普通只能進行查詢操做。spring

執行上述代碼便可獲取到在某個指定組織單元的全部用戶,搜索結果存放在src中,要讀取用戶屬性值可以使用下面代碼:服務器

//獲取用戶的名稱和帳戶  
foreach (SearchResult sr in src)  
{  
  strUserName=sr.Properties["name"][0].ToString();  
  strUserName= sr.Properties["userPrincipalName"][0].ToString();  
}  

值得注意的是由於在建立AD用戶的時候填寫的用戶信息不一樣,每一個AD用戶所具備的屬性都不必定相同,建議使用以下方法進行取值:ui

if (sr.Properties.Contains("sn"))  
{  
    strFirstName = sr.Properties["sn"][0].ToString();//
}  
if (sr.Properties.Contains("givenName"))  
{  
    strLastName = sr.Properties["givenName"][0].ToString();//
}  

要知道一個用戶的全部屬性可以使用以下代碼:spa

foreach (string strPropNamein sr.Properties.PropertyNames)  
{  
    Console.WriteLine(strPropName);  
}  

還有一種讀取AD用戶屬性字段值的方法:.net

foreach (SearchResult sr in src)  
{  
    DirectoryEntry myde = sr.GetDirectoryEntry();  
    strGuid = myde.Guid.ToString();//用戶Guid,建立用戶時由系統自動生成  
    strParentGuid = myde.Parent.Guid.ToString();//用戶所在組織單元的Guid  
    myde.Properties["name"][0].ToString();//用戶名稱  
}  

一樣的,若是要獲得是AD組織單元或者羣組的話也是這麼作,對應於組織單元篩選字符串能夠這麼寫:code

//字符篩選器,篩選類型爲OU的對象  
string strFilter = "(&(objectCategory=organizationalUnit)(objectClass=organizationalUnit))";  

羣組的篩選字符串:htm

string strFilter = "(&(objectCategory=group)(objectClass=group))";  

 上面是對AD的查詢操做,若是查詢以後須要修改,僅須要作些許變更,下面是修改用戶屬性部分代碼:對象

foreach (SearchResult sr in src)  
{  
    string strUserName = sr.Properties["name"][0].ToString();  
    //targetUserName:要修改用戶名稱  
    if (strUserName.Equals(targetUserName))  
    {  
        DirectoryEntryde = sr.GetDirectoryEntry();  
        de.Properties["sn"].Value = m_User.FirstName;//
        de.Properties["givenName"].Value = m_User.LastName;//
        de.Properties["mobile"].Value = m_User.Mobile;//移動電話                      
        de.CommitChanges();  
    }  
}  

 修改AD組織單元或者羣組也是用相似的方法。值得注意的是,在AD中有些屬性是拒絕修改的,一旦修改了不容許修改的屬性,會被服務器拒絕或者出現服務器不肯意執行該操做異常。blog

若要向AD中添加用戶,組織單元或者羣組的話也是須要經過DirectoryEntry來添加,以下是向AD的指定路徑添加一個用戶:

public bool AddUser2AD(string strUserName, string strSAMAccountname,  
                        string strPassword, string strPath)  
{  
    string strname = "CN=" + strUserName;  
    try  
    {  
        // strADAccount ,strADPassword爲AD管理員帳戶和密碼  
        DirectoryEntry objDE = new DirectoryEntry(strPath, strADAccount, strADPassword);  
        DirectoryEntries objDES = objDE.Children;  
        DirectoryEntry myDE = objDES.Add(strname, "User");  
        myDE.Properties["userPrincipalName"].Value = strSAMAccountname;  
        myDE.Properties["name"].Value = strUserName;  
        myDE.Properties["sAMAccountName"].Value = strSAMAccountname;  
        myDE.CommitChanges();  
  
        //設置密碼                
        IADsUser objUser = myDE.NativeObject as IADsUser;  
        objUser.SetPassword(strPassword);  
        //設置用戶狀態:密碼永不過時(65536)+用戶正常(512)= 66048  
        objUser.Put("userAccountControl", 66048);  
        objUser.SetInfo();  
    }  
    catch  
    {  
        return false;  
    }  
    return true;  
}  

特別要注意最後幾行設置用戶密碼和帳戶狀態代碼。若是myDE.CommitChanges()後面的代碼沒有;,那麼在AD裏面建立的用戶是禁用狀態,而且密碼爲空。若是在AD中直接寫:

myDE.Password = strPassword;  
myDE.Properties["userAccountControl"].Value = 66048;  

是會失敗的。這裏咱們能夠利用ActiveDs.dll。ActiveDs是一個AD服務相關應用程序COM接口,裏面提供了設置密碼,修改密碼,獲取屬性值的一些方法。按照如上寫法便可建立正常的AD用戶,切用戶密碼永不過時。

解釋一下userAccountControl,該屬性記錄了用戶的AD帳號信息,是一組16進制數,該屬性標誌是累積性的。若要禁用用戶的賬戶,將userAccountControl屬性設置爲 0x0202 (0x002 + 0x0200)。在十進制中,它是 514 (2 + 512);若要啓用帳戶且密碼永不過時,請將 userAccountControl屬性設置爲 0x10200 (0x10000 + 0x0200),十進制爲66048。

若想要修改用戶密碼的話也可使用ActiveDs提供的方法:

DirectoryEntry obj = sr.GetDirectoryEntry();  
IADsUser objUser = obj.NativeObject as IADsUser;  
objUser.ChangePassword(strOldPassword, strNewPassword);  
objUser.SetInfo();  

最後提供一個驗證AD用戶身份的方法以資參考:

/// <summary>  
 ///驗證用戶登陸  
 ///</summary>  
 ///<param name="strUserAccount">用戶帳戶</param>  
 ///<param name="strPassword">用戶密碼</param>  
 ///<returns>驗證經過則返回true,不然返回false</returns>  
public static bool VerifyUserLogin(string strUserAccount, stringstrPassword)  
 {  
    try  
    {  
        // strADRootPath爲該組織單元路徑  
        DirectoryEntry objDE = newDirectoryEntry(strADRootPath, strUserAccount, strPassword);                  
        DirectorySearcher objSerach = new DirectorySearcher(objDE);  
        SearchResult sr = objSerach.FindOne();  
        return true;  
    }  
    catch  
    {  
        return false;  
    }  
 } 

 

 

原文地址:http://blog.csdn.net/dl020840504/article/details/10200227

其餘文章推薦:http://www.cnblogs.com/springyangwc/archive/2012/02/07/2340987.html

相關文章
相關標籤/搜索