[C#.NET][Active Directory] 使用 PrincipalContext 類別確認帳號是否通過驗証

[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

 

目前知道有兩個方法可以使用

  1. PrincipalContext.ValidateCredentials ,不需輸入 AD 帳號密碼,回傳 bool
  2. UserPrincipal.FindByIdentity,需要輸入 AD 帳號密碼,回傳 UserPrincipal ,可帶出詳細的資料

 

PrincipalContext 類別提供了相當多的建構子,在使用的時候或許會有一些困惑

  1. 該機器沒有加入網域,實體化的時候要帶入帳號密碼,把它想成是 Login 的動作就對了,可查詢帳號的詳細資訊
  2. 若是要特殊的查詢,可使用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

image


直接在AD上執行程式,輸入Domain Name: kuas.local 來驗証帳號密碼

image

 

整個使用起來真的比 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

Image result for microsoft+mvp+logo