[C#.NET][Active Directory] 使用 PrincipalContext 類別確認帳號是否通過驗証
.NET3.5 推出了 System.DirectoryServices.AccountManagement 命名空間 ,它封裝了有關使用者、電腦和群組主體的類別,可以讓我們更容易的操作 Windows 的帳號資訊,這裡有更多的詳細的範例可參考:
http://msdn.microsoft.com/zh-tw/magazine/cc135979.aspx
http://www.codeproject.com/Articles/90142/Everything-in-Active-Directory-via-C-NET-3-5-Using
目前知道有兩個方法可以使用
- PrincipalContext.ValidateCredentials ,不需輸入 AD 帳號密碼,回傳 bool
- UserPrincipal.FindByIdentity,需要輸入 AD 帳號密碼,回傳 UserPrincipal ,可帶出詳細的資料
PrincipalContext 類別提供了相當多的建構子,在使用的時候或許會有一些困惑
- 該機器沒有加入網域,實體化的時候要帶入帳號密碼,把它想成是 Login 的動作就對了,可查詢帳號的詳細資訊
- 若是要特殊的查詢,可使用cn、ou
接下來咱們來看一個簡單的例子,調用 PrincipalContext.ValidateCredentials 方法驗証 AD 帳號是否通過驗証
{ using (var context = new PrincipalContext(ContextType.Domain, this.textBox_Domain.Text)) { bool exist = context.ValidateCredentials(this.textBox_FindUserAccount.Text, this.textBox_FindUserPassword.Text); MessageBox.Show(exist ? "Exist" : "No Exist"); } }
使用 UserPrincipal.FindByIdentity 方法,需要輸入AD 帳號密碼,然後查詢
{ //login in using (var context = new PrincipalContext(ContextType.Domain, this.textBox_Domain.Text, this.textBox_LoginUser.Text, this.textBox_LoginPassword.Text)) { //find account var user = UserPrincipal.FindByIdentity(context, this.textBox_FindUserAccount.Text); if (user != null) { MessageBox.Show("Exist"); } else { MessageBox.Show("No Exist"); } } }
找台AD來試驗一下,因為這台機器沒有加入 AD,但跟 AD 同網段所以我用 IP Address
直接在AD上執行程式,輸入Domain Name: kuas.local 來驗証帳號密碼
整個使用起來真的比 System.DirectoryServices 命名空間 裡的類別方便許多~
文章出自:http://www.dotblogs.com.tw/yc421206/archive/2013/08/18/114781.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET