Makale Özeti

Bu makalemde System.DirectoryServices.AccountManagement kullanarak gerek Active Directory'de gerek ise makine üzerinde kullanıcı hesaplarını nasıl oluşturacağımızı, sileceğimizi ve değiştireceğimizi inceleyeceğiz. Bu işlemi .Net Framework 2.0 da DirectorySearcher nesnesi ile dönen DirectoryEntry nesnesinin Invoke metodunu kullanarak yapıyorduk. ANcak .Net Framework 3.5 çıkmasıyla System.DirectoryServices.AccountManagement namespace'inin sunduğu özelliklerle yapabileceğiz.

Makale

         Merhabalar

         Bu makalemde System.DirectoryServices.AccountManagement kullanarak gerek Active Directory'de gerek ise makine üzerinde kullanıcı hesaplarını nasıl oluşturacağımızı, sileceğimizi ve değiştireceğimizi inceleyeceğiz. Bu işlemi .Net Framework 2.0 da DirectorySearcher nesnesi ile dönen DirectoryEntry nesnesinin Invoke metodunu kullanarak yapıyorduk. Ancak .Net Framework 3.5 çıkmasıyla System.DirectoryServices.AccountManagement namespace'inin sunduğu özelliklerle yapabileceğiz.

         İsterseniz öncelikle bu makalemizde kullanacağımız nesneleri inceleyelim;

PrincipalContext PrincipalContext nesnesi tüm bu işlemlerin yapılacağı dizin hizmetinin tanımlandığı class'tır.Örneğin AD, Machine SAM
Principal Principal nesnesi biraz sonra inceleyeceğimiz principal nesneleri için en temeldeki base class'tır.
GroupPrincipal GroupPrincipal nesnesi Principal class'ından türemektedir ve Grup işlemleri için gerekli metodları bizlere sunmaktadır.
AuthenticablePrincipal Bu principal Principal base class'ından türemektedir, Ancak bu class'ta farklı olarak bir kullanıcının bilgilerinin kontrol edilmesi gibi Authentication mekanizmalarına ait metodlar bulunmaktadır.
UserPrincipal Domain ve lokal bilgisayar üzerinde kullanıcı işlemleri yapmak için kullanacağımız ve kullanıcıları temsil eden nesnedir.

          Şimdi bu nesnelerin kullanımını en iyi inceleyebileceğimiz şekilde bir uygulama yazmaya başlayalım.

Öncelikle uygulamamıza System.DirectoryServices.AccountManagement referansını eklememiz gerekiyor.


Şimdi ise frmMain adında bir form oluşturup bu formun kontrollerini oluşturmaya başlayalım. Form bir tabstrip ve bu tabstrip içindeki 2 tab'dan oluşacak. Bu tablardan bir tanesinde kullanıcı işlemlerini diğerinde ise grup işlemlerini yapabileceğiz. Bu kontrolleri form üzerine aşağıda gözüktüğü şekilde yerleştiriyoruz.

Groups sekmesinde;
Grupları listeleme,
Grupları belirli bir kritere göre listeleme,
Yeni grup oluşturma,
Grup düzenleme,
Grup silme,
Gruba ait kullanıcıları listeme işlemlerine dair örnekler yapılacaktır.
Users sekmesinde;
Kullanıcıları listeleme,
Kullanıcıları belirli bir kritere göre listeleme,
Yeni kullanıcı oluşturma,
Kullanıcı düzenleme,
Kullanıcı silme,
Şifre değiştirme,
Kullanıcının dahil olduğu grupları listeleme,
Kullanıcıyı bir gruba ekleme,
Kullanıcıyı bir gruptan çıkarma işlemlerine dair örnekler yapılacaktır.

Ayrıca grup ve kullanıcı özelliklerini gerek düzenlemek gerek ise görüntülemek için uygulamamıza frmProperties adında bir form oluşturup içine PropertyGrid kontrolünü dock olacak şekilde ekliyoruz. Ayrıca seçili aksiyonu(Ekleme, düzenleme, filtreleme) gerçekleştirecek bir düğme ve formu kapayacak bir düğmeyi de bu forma ekliyoruz. Bu formun dizaynı aşağıdaki gibi olacaktır.Bu formun kodunu makalenin en sonunda ayrıca paylaşıyor olacağım.


Şimdi isterseniz uygulamamızın kodunu yazmaya başlayalım;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.DirectoryServices.AccountManagement;

namespace AccountManagementGUI
{
 
    public partial class frmMain : Form
    {
        internal class UserPassword
        {
            private string _Password;
 
            public string Password
            {
                get { return _Password; }
                set { _Password = value; }
            }
        }
        internal class UserGroup
        {
            private string _GroupName;
 
            public string GroupName
            {
                get { return _GroupName; }
                set { _GroupName = value; }
            }
        }
        public enum ActionTypes
        {
            Filter,
            Save,
            None,
        }
        public frmMain()
        {
            InitializeComponent();
        }

 
         Öncelikle uygulamamızın ilerleyen kısımlarında kullanacağımız bazı nesneleri oluşturuyoruz. Bu nesnelerden UserPassword şifre sıfırlama için propertygrid'e bind edilecek, UserGroup kullanıcı grubu silme veya ekleme için propertygrid'e bind edilecek nesnelerdir. Ayrıca ActionTypes enum'u ise frmProperties ekranında yapılacak aksiyonun ne olduğunu belirleyen enumeration olarak görev yapacaktır.

        PrincipalContext insPrincipalContext = new PrincipalContext(ContextType.Machine);

 
        Bu kısımda PrincipalContext nesnesi ile işlemleri gerçekleştireceğimiz yapıyı belirliyoruz. Yukarıdaki örnekte Lokal bilgisayara bağlanılmıştır. Bu nesnenin constructor'larını inceleyerek daha farklı yapılara nasıl bağlanılacağını anlamak basittir. Hemen aşağıda birkaç bağlantı örneğini sizlerler paylaşıyorum. 

        PrincipalContext insPrincipalContext = new PrincipalContext(ContextType.Domain, "MyDomain", "DC=MyDomain,DC=com"); //domaine bağlanma

        PrincipalContext insPrincipalContext = new PrincipalContext(ContextType.Machine,"TAMERO","administrator","password");//lokal bilgisayara bir kullanıcı ile bağlanma

 
        Gördüğünüz gibi bir domain controller'a bağlanmak ile local bilgisayara bağlanmak arasında fark yok. Burdan sonra yapacağımız tüm işlemler domain üzerinde de aynı şekilde yapılabilmektedir. Ayrıca makalemin sonunda PrincipalContext kullanılarak bir kullanıcının Authentication bilgilerinin nasıl doğrulanabileceğini de inceleyeceğiz.

        private void Form1_Load(object sender, EventArgs e)
        {
            ListGroups();
            ListUsers();
 
        }
        private void SearchGroups(GroupPrincipal parGroupPrincipal)
        {
            lbGroups.Items.Clear();
            PrincipalSearcher insPrincipalSearcher = new PrincipalSearcher();
            insPrincipalSearcher.QueryFilter = parGroupPrincipal;
            PrincipalSearchResult<Principal> results = insPrincipalSearcher.FindAll();
            foreach (Principal p in results)
            {
                lbGroups.Items.Add(p);
            }
        }
        private void SearchUsers(UserPrincipal parUserPrincipal)
        {
            lbUsers.Items.Clear();
            PrincipalSearcher insPrincipalSearcher = new PrincipalSearcher();
            insPrincipalSearcher.QueryFilter = parUserPrincipal;
            PrincipalSearchResult<Principal> results = insPrincipalSearcher.FindAll();
            foreach (Principal p in results)
            {
                lbUsers.Items.Add(p);
            }
        }
        private void ListGroups()
        {
            GroupPrincipal insGroupPrincipal = new GroupPrincipal(insPrincipalContext);
            insGroupPrincipal.Name = "*";
            SearchGroups(insGroupPrincipal);
        }
        private void ListUsers()
        {
            UserPrincipal insUserPrincipal = new UserPrincipal(insPrincipalContext);
            insUserPrincipal.Name = "*";
            SearchUsers(insUserPrincipal);
        }

 
        Form'un load eventinde ListUsers ve ListGroups isimli iki metodu çağırıyoruz. Uygulamanın bundan sonraki tüm aşamalarında kullanıcılarla ilgişi işlemlerimizi UserPrincipal, gruplarla ilgili işlemlerimizi yapmak içinse GroupPrincipal kullanacağız. Search işlemini yerine getirebilmek için öncelikle ilgili tipte(Kullanıcı aramak için UserPrincipal, Grup aramak için GroupPrincipal) principal nesnemizi tanımlamamız gerekiyor. Daha sonrasından bu nesnenin ilgili property'sine belirlediğimiz arama kriterini yazmamız gerekiyor. Tüm kayıtların gelmesini istiyorsak tüm kayıtlarda mevcut olan name property'sine * sorgusunu göndermemiz yeterlidir. Adı sadece Tamer olan kullanıcıları aramak için bu property'e Tamer, Tamer ile başlayan kullanıcılar için Tamer*, içinde a harfi geçen kullanıcılar için *a* değerlerini atayabiliriz.

      Daha sonrasında ise oluşturduğumuz bu nesneyi PrincipalSearcher nesnesinin yeni bir instance'ını aldıktan sonra QueryFilter property'sine atıyoruz. PrincipalSearcher nesnesinin FindAll() metodunu kullanarak belirlediğimiz kriterlere uyan tüm objeleri Principal nesnesinin taşıyan bir collection olarak alabiliyoruz. Ayrıca bu kısımda FindOne metodunu kullanarak tek bir kayıt döndürmemiz de mümkün olmaktadır.

      Makalemin sonunda ise tarih kriteri için küçüktür büyüktür gibi karşılaştırmaları nasıl yapabileceğimizden ayrıca bahsedeceğim.

        private void btnFilterUsers_Click(object sender, EventArgs e)
        {
            UserPrincipal insUserPrincipal = new UserPrincipal(insPrincipalContext);
            frmProperties insFrmProperties = new frmProperties(insUserPrincipal, ActionTypes.Filter);
            insFrmProperties.ShowDialog();
            if (insFrmProperties.DialogResult == DialogResult.OK)
            {
                SearchUsers(insUserPrincipal);
            }
        }
        private void btnFilterGroups_Click(object sender, EventArgs e)
        {
            GroupPrincipal insGroupPrincipal = new GroupPrincipal(insPrincipalContext);
            frmProperties insFrmProperties = new frmProperties(insGroupPrincipal, ActionTypes.Filter);
            insFrmProperties.ShowDialog();
            if (insFrmProperties.DialogResult == DialogResult.OK)
            {
                SearchGroups(insGroupPrincipal);
            }
        }

 
        Filtreleme işlemi için yine öncelikle ilgili Principal nesnesini oluşturarak, arama yapılacak property'lerinin kullanıcı tarafından doldurulması için frmProperties formuna geçiriyoruz. Bu form'un içinde bulunan PropertyGrid sayesinde kullanıcılar gerekli bilgileri kolaylıkla girebilmektedirler. Arama yapılmak için doldurulan özellikleri taşıyan nesneyi çalışma mantığından biraz önce bahsettiğimiz Search metoduna göndererek ilgili listbox'ların dolmasını sağlıyoruz.
 

        private void btnClearFilterUsers_Click(object sender, EventArgs e)
        {
            ListUsers();
        }
        private void btnClearFilterGroups_Click(object sender, EventArgs e)
        {
            ListGroups();
        }

 
        Filtrelemeyi temizlemek için kullandığımız metodlar Form'un load eventinde kullandığımız metodlar ile aynıdır.
 

        private void btnNewUser_Click(object sender, EventArgs e)
        {
            UserPrincipal insUserPrincipal = new UserPrincipal(insPrincipalContext);
            frmProperties insFrmProperties = new frmProperties(insUserPrincipal, ActionTypes.Save);
            insFrmProperties.ShowDialog();
            if (insFrmProperties.DialogResult == DialogResult.OK)
            {
                try
                {
                    insUserPrincipal.Save();
                    insUserPrincipal.Dispose();
                    MessageBox.Show("User created.");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
 
                ListUsers();
            }
        }
        private void btnNewGroup_Click(object sender, EventArgs e)
        {
            GroupPrincipal insGroupPrincipal = new GroupPrincipal(insPrincipalContext);
            frmProperties insFrmProperties = new frmProperties(insGroupPrincipal, ActionTypes.Save);
            insFrmProperties.ShowDialog();
            if (insFrmProperties.DialogResult == DialogResult.OK)
            {
                try
                {
                    insGroupPrincipal.Save();
                    insGroupPrincipal.Dispose();
                    MessageBox.Show("Group created.");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                } 
                ListGroups();
            }
        }

 
        Yeni bir kullanıcı veya grup oluşturmak için ilgili Principal nesnesinden oluşturup kullanıcının istediği özellikleri(Ad, PasswordNeverExpires, Enabled gibi) doldurması için frmProperties ekranına referans geçiriyoruz. Kullanıcı bu ekranda değerleri atadıktan ve Kaydet'e bastıktan sonra ilgili Principal nesnesinin Save metodunu kullanarak grubun veya kullanıcının kaydedilmesini sağlıyoruz. Vista ve Windows7 kullanan kullanıcılar için bu ksıımda AccessDenied veya ErişimEngellendi gibi bir hata almaları mümkün olabilmektedir. Bunun için uygulamayı Run As Administrator(Yönetici olarak çalıştır) seçeneğini kullanarak çalıştırmak gerekmektedir.

        private void btnEditUser_Click(object sender, EventArgs e)
        {
            if (lbUsers.SelectedItem == null)
            {
                MessageBox.Show("Please select a user");
                return;
            }
            UserPrincipal insUserPrincipal = (UserPrincipal)lbUsers.SelectedItem;
            frmProperties insFrmProperties = new frmProperties(insUserPrincipal, ActionTypes.Save);
            insFrmProperties.ShowDialog();
            if (insFrmProperties.DialogResult == DialogResult.OK)
            {
                try
                {
                    insUserPrincipal.Save();
                    insUserPrincipal.Dispose();
                    MessageBox.Show("User updated.");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
 
                ListUsers();
            }
        }
        private void btnEditGroup_Click(object sender, EventArgs e)
        {
            if (lbGroups.SelectedItem == null)
            {
                MessageBox.Show("Please select a group");
                return;
            }
            GroupPrincipal insGroupPrincipal = (GroupPrincipal)lbGroups.SelectedItem;
            frmProperties insFrmProperties = new frmProperties(insGroupPrincipal, ActionTypes.Save);
            insFrmProperties.ShowDialog();
            if (insFrmProperties.DialogResult == DialogResult.OK)
            {
                try
                {
                    insGroupPrincipal.Save();
                    insGroupPrincipal.Dispose();
                    MessageBox.Show("Group updated.");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
 
                ListGroups();
            }
        }

 
        Edit işlemi için kaydet metodundaki gibi Principal nesnesinin Save metodu kullanılmaktadır. Burda yaptığımız farklı tek iş yeni bir Principal nesnesi oluşturmaktansa listede seçili nesneyi alıp kullanıcının değiştirmek istediği özellikleri değiştirmesi için frmProperties formuna göndermektir.

        private void btnDeleteUser_Click(object sender, EventArgs e)
        {
            if (lbUsers.SelectedItem == null)
            {
                MessageBox.Show("Please select a user");
                return;
            }
            UserPrincipal insUserPrincipal = (UserPrincipal)lbUsers.SelectedItem;
            try
            {
                insUserPrincipal.Delete();
                insUserPrincipal.Dispose();
                MessageBox.Show("User deleted.");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 
            ListUsers();
        }
        private void btnDeleteGroup_Click(object sender, EventArgs e)
        {
            if (lbGroups.SelectedItem == null)
            {
                MessageBox.Show("Please select a group");
                return;
            }
            GroupPrincipal insGroupPrincipal = (GroupPrincipal)lbGroups.SelectedItem;
            try
            {
                insGroupPrincipal.Delete();
                insGroupPrincipal.Dispose();
                MessageBox.Show("Group deleted.");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 
            ListUsers();
        }

 
        Delete işlemi için ise yine listbox'ta seçili olan Principal nesnesinin Delete metodunu çağırmak yeterli olacaktır.
 

        private void btnChangePassword_Click(object sender, EventArgs e)
        {
            if (lbUsers.SelectedItem == null)
            {
                MessageBox.Show("Please select a user");
                return;
            }
            UserPrincipal insUserPrincipal = (UserPrincipal)lbUsers.SelectedItem;
 
            UserPassword password = new UserPassword();
            frmProperties insFrmProperties = new frmProperties(password, ActionTypes.Save);
            insFrmProperties.ShowDialog();
            if (insFrmProperties.DialogResult == DialogResult.OK)
            {
                try
                {
                    insUserPrincipal.SetPassword(password.Password);
                    MessageBox.Show("Password changed.");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
 
                ListUsers();
            }
        }

 
        Şifre değişikliği için ise kullanıcının listbox'ta seçmiş olduğu UserPrincipal nesnesini alıyoruz, bundan hemen sonra yeni bir password nesnesi oluşturup bunu frmProperties formuna geçirerek kullanıcının şifre girmesini sağlıyoruz. Kullanıcının şifreyi girmesinin hemen ardından UserPrincipal nesnesinin SetPassword metodunu kullanarak belirleiğimiz şifreyi hesaba atıyoruz. Burada şifrenin domain veya lokal bilgisayardaki policylere uymaması halinde exception ile durum hakkında bilgi verilmektedir.

        private void btnListGroupUser_Click(object sender, EventArgs e)
        {
            if (lbGroups.SelectedItem == null)
            {
                MessageBox.Show("Please select a group");
                return;
            }
            GroupPrincipal insGroupPrincipal = (GroupPrincipal)lbGroups.SelectedItem;
            List<Principal> insListPrincipal = new List<Principal>();
            foreach (Principal p in insGroupPrincipal.Members)
            {
                insListPrincipal.Add(p);
            }
            frmProperties insFrmProperties = new frmProperties(insListPrincipal, ActionTypes.None);
            insFrmProperties.ShowDialog();
        }

 
         Bir gruptaki kullanıcıları listelemek için GroupPrincipal nesnesinin Members property'sine erişmek yeterlidir. Bu property Principal nesnesinin bir collection'unu taşımaktadır. Uygulama üzerinde ise bu property'deki değerleri frmProperties ekranında gösterilmektedir.
 

        private void btnListUsersGroups_Click(object sender, EventArgs e)
        {
            if (lbUsers.SelectedItem == null)
            {
                MessageBox.Show("Please select a user");
                return;
            }
            UserPrincipal insUserPrincipal = (UserPrincipal)lbUsers.SelectedItem;
            List<Principal> insListPrincipal = new List<Principal>();
            foreach (Principal p in insUserPrincipal.GetGroups())
            {
                insListPrincipal.Add(p);
            }
            frmProperties insFrmProperties = new frmProperties(insListPrincipal, ActionTypes.None);
            insFrmProperties.ShowDialog();
        }

 
        Bir kullanıcının dahil olduğu grupları listelemek için ise öncelikle kullanıcının seçmiş olduğu UserPrincipal nesnesini alıyoruz. UserPrincipal nesnesinin GetGroups metodu bize istediğimiz bilgiyi bir collection olarak vermektedir. Bunun arkasından aldığımız bilgiyi ise yine frmProperties formunda gösteriyoruz.
 

        private void btnAddUserToAGroup_Click(object sender, EventArgs e)
        {
            if (lbUsers.SelectedItem == null)
            {
                MessageBox.Show("Please select a user");
                return;
            }
            UserPrincipal insUserPrincipal = (UserPrincipal)lbUsers.SelectedItem;
 
            UserGroup group = new UserGroup();
            frmProperties insFrmProperties = new frmProperties(group, ActionTypes.Save);
            insFrmProperties.ShowDialog();
            if (insFrmProperties.DialogResult == DialogResult.OK)
            {
                try
                {
                    GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(insPrincipalContext, group.GroupName);
                    if (groupPrincipal == null)
                    {
                        MessageBox.Show("Group not found.");
                        return;
                    }
                    if (groupPrincipal.Members.Contains(insPrincipalContext, IdentityType.SamAccountName, insUserPrincipal.SamAccountName))
                    {
                        MessageBox.Show(insUserPrincipal.Name + " is already a member of group " + group.GroupName);
                        return;
                    }
                    groupPrincipal.Members.Add(insUserPrincipal);
                    groupPrincipal.Save();
 
                    MessageBox.Show("User added to group.");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
 
                ListUsers();
            }
        }

 
        Bir kullanıcıyı gruba eklemek için öncelikle listede seçili UserPrincipal nesnesini alıyoruz. Bunun hmen ardından UserGroup nesnesinden bir instance alıp frmProperties formuna geçirerek kullanıcının bir grup ismi girmesini sağlıyoruz. Girilen grup adının geçerli olup olmadığına dair kontrolü GroupPrincipal nesnesinin static olan FindByIdentity metodu ile yapıyoruz. Grup nesnesi varsa bu ada sahip grup nesnesinin bir değişkene atıyoruz. Daha sonra ise kullanıcının zaten belirtilen grupta olup olmadığına dair kontrolü seçili grup nesnesinin Members property'sinin Contains metodu ile kontrol ediyoruz. Kullanıcı olmaması durumunda ise yine member property'sinin Add metodunu kullanarak kullanıcıyı ilgili gruba ekliyoruz. Burda yaptığımız değişikliğin geçerli olabilmesi için mutlaka GroupPrincipal nesnesinin Save metodunun çağrılmış olması gerekmektedir.

        private void btnRemoveUserFromAGroup_Click(object sender, EventArgs e)
        {
            if (lbUsers.SelectedItem == null)
            {
                MessageBox.Show("Please select a user");
                return;

            }
            UserPrincipal insUserPrincipal = (UserPrincipal)lbUsers.SelectedItem;
 
            UserGroup group = new UserGroup();
            frmProperties insFrmProperties = new frmProperties(group, ActionTypes.Save);
            insFrmProperties.ShowDialog();
            if (insFrmProperties.DialogResult == DialogResult.OK)
            {
                try
                {
                    GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(insPrincipalContext, group.GroupName);
                    if (groupPrincipal == null)
                    {
                        MessageBox.Show("Group not found.");
                        return;
                    }
                    if (!groupPrincipal.Members.Contains(insPrincipalContext, IdentityType.SamAccountName, insUserPrincipal.SamAccountName))
                    {
                        MessageBox.Show(insUserPrincipal.Name + " is not a member of group " + group.GroupName);
                        return;
                    }
                    groupPrincipal.Members.Remove(insUserPrincipal);
                    groupPrincipal.Save();
 
                    MessageBox.Show("User removed from group.");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
 
                ListUsers();
            }
        }
    }
}

 
        Kullanıcıyı belirli bir gruptan silmek için yaptığımız tüm işlemler eklemek ile aynı, tek fark GroupPrincipal nesnesinin Members property'sinin Add metodu yerine Remove metodu kullanmamız gerektiğidir.

        Böylece System.DirectoryServices.AccountManagement  namespace'ini kullanarak ActiveDirectory ve Local Machine üzerinde nasıl işlem yapabileceğimizi görmüş olduk. Şimdi isterseniz neredeyse uygulamamızdaki her metodda kullandığımız frmProperties nesnesinin koduna bakalım.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.DirectoryServices.AccountManagement;
 
namespace AccountManagementGUI
{
    public partial class frmProperties : Form
    {
        public frmProperties(object propertyItem, frmMain.ActionTypes actionType)
        {
            InitializeComponent();
            if (propertyItem is List<Principal>)
            {
                pgMain.SelectedObject = ((List<Principal>)propertyItem).ToArray();
            }
            else
            {
                pgMain.SelectedObject = propertyItem;
            }
            btnAction.Text = actionType.ToString();
            btnAction.Visible = (actionType != frmMain.ActionTypes.None);
 
        }
 
        private void btnAction_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
 
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }
    }
}

 
        Gördüğünüz gibi formun ana fikri Constructor'da geçen nesnenin PropertyGrid'e atanması ve kullanıcı tarafından değiştirilen property'lerinin ardından referans olarak geçen bir nesne olduğundan frmMain formundan erişilebilir olmasıdır.

         Şimdi ise daha önce bahsettiğim En sonra belirli bir tarihten önce giriş yapmış olan kullanıcıları nasıl listeleyebileceğimizi veya bir kullanıcının bilgilerini nasıl PrincipalContext ile kontrol edebileceğimizi inceleyelim.
 

insPrincipalContext.ValidateCredentials("Tamer", "12345678");
parUserPrincipal.AdvancedSearchFilter.AccountExpirationDate(DateTime.Now.Date.AddDays(10), MatchType.Equals);
parUserPrincipal.AdvancedSearchFilter.BadLogonCount(5, MatchType/span>.GreaterThanOrEquals);

 
         Kullanıcı bilgilerini doğrulamak için PrincipalContext nesnesinin ValidateCredentials metodu kullanılabilmektedir. Bunun yarı sıra AccountExpirationDate, LastBadPasswordAttempt, BagLogonCount, AccountLockoutTime, LastPasswordSetTime gibi kriterlere göre arama yapmak için ise UserPrincipal nesnesinin AdvancedSearchFilter property'sini kullanmak gerekmektedir.

Umarım faydakı bir makale olmuştur.
Tamer Öz
         tamer.oz@yazgelistir.com
         oztamer@hotmail.com
   
Ornek Kodlar