• 13 Ağustos 2020 00:25

Sait ORHAN

Öğretmek için Öğrenin- Öğrenmek için Öğretin

Sistem Yöneticileri İçin C# Kodları

Bilgisayar biliminin yaygın alanlarından ikisi sistem yönetimi ve yazılım alanlarıdır. Her ne kadar bu iki alanda çalışan arkadaşlar bir birine karışmamaya çalışsa da tecrübelerimiz bize farklı şeyler söylüyor. Tecrübelerimiz, her sistem yöneticisi arkadaşın az da olsa yazılım, her yazılımcı arkadaşın da az da olsa sistem yönetimi konusunda tecrübe edinmesi gerektiğini söylüyor. Bu yazımızda sistem yönetimi için kullanılan bazı kodları paylaşıyor olacağız.

Active Directory Kullanıcı ve Grup İşlemleri

AD işlemleri için .Net Framework 4.5 ile gelen System.DirectoryServices.AccountManagement isim uzayında (Namespace) yer alan sınıfları kullanacağız. İlgili paketi Nuget’ten projemize ekledikten sonra işlemlere başlayabiliriz. Peket linki: https://www.nuget.org/packages/System.DirectoryServices.AccountManagement/

Active Directory işlemlerinin tamamında sunucu ile bağlantıyı sağlayan PrincipalContext sınıfından nesne türetilmelidir. PrincipalContext sınıfının yedi farklı oluşturucu metodu olsa da en sık kullanılan üç metodu şunlardır;

  • PrincipalContext(ContextType): Sadece bağlanacak sunucun türünün alındığı oluşturucu metottur. ContextType enum değerinin alabileceği değerler:
    * ApplicationDirectory: Uygulama dizin sunucusu
    * Domain: Domain controllerdan verileri okumak için okunur.
    * Machine: Local makine SAM veri tabanına bağlantıda kullanılır.
  • PrincipalContext(ContextType, String): İlkinin yanında ikinci parametre olarak bağlanacak domain controller adını alır. cozumpark.local gibi…
  • PrincipalContext(ContextType, String, String, String): İlk iki metodun parametrelerinin yanında üçüncü parametre olarak bağlantıda kullanılacak kullanıcı adı ve dördüncü parametre olarak da girilen kullanıcı adının şifresini alır.

AD Kullanıcılarının Sistemden Alınması

AD kullanıcılarının sistemden alınabilmesi için oluşturulan PrincipalContext nesnesini parametre alan bir UserPrincipal nesnesi oluşturulur. Daha sonra bu nesne üzerinden istenen filtre değerleri girilir. Örneğin aşağıdaki kodda sadece aktif kullanıcıları istediğimizden “userPrincipal.Enabled = true;” ataması ile bunun filtreye ekliyoruz. Daha sonra oluşturulan bu UserPrincipal nesnesini parametre alan bir PrincipalSearcher nesnesi oluşturulur. Son adım olarak PrincipalSearcher nesnesinin FindAll metodu ile UserPrincipal üzerinden girilen değerlere uygun kullanıcılar sistemden alınır. Metotdan dönen değerler PrincipalSearchResult türünde olduğundan “Cast<UserPrincipal>()” metodu ile dönen sonuç UserPrincipal türüne çevrilir.

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "saitorhan.local", "Administrator", "123456qaZ.");
UserPrincipal userPrincipal = new UserPrincipal(principalContext);
userPrincipal.Enabled = true;
PrincipalSearcher principalSearcher = new PrincipalSearcher(userPrincipal);
List<UserPrincipal> principalSearchResult = principalSearcher.FindAll().Cast<UserPrincipal>().OrderBy(u => u.SamAccountName).ToList();

Ekran görüntüsünde de görüldüğü üzere bu şekilde kullanıcı bilgileri AD Sunucusu üzerinden alındığında hesap ile ilgili her türlü bilgi elde edilebiliyor.

Kullanıcının Üyesi Olduğu Grupları Bulma

Kullanıcının gruplarını bulmak için öncelikle “UserPrincipal.FindByIdentity” metodu ile üyesi olduğu grupların sorgulanacağı kullanıcıyı sistemden alıyoruz. UserPrincipal.FindByIdentity metodu üç parametre alır. Bu parametreler sırasıyla;

  1. Yazının başında tanımını yaptığımız PrincipalContext nesnesi
  2. Kullanıcı hesabı sorgulanırken kullanılacak özellik. Biz örneğimizde SamAccountName özelliği ile sorgulama yapacağımızdan IdentityType.SamAccountName değerini kullanıyoruz.
  3. Sorgulama yapılacak özelliğe ait değer
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "saitorhan.local", "Administrator", "123456qaZ.");
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext, IdentityType.SamAccountName, "saitorhan");
List<GroupPrincipal> principalSearchResult = userPrincipal.GetGroups().Cast<GroupPrincipal>().ToList();

Dönen UserPrincipal nesnesinin GetGroups metodu ile kullanıcının üyesi olduğu gruplar alınır ve gene Cast<GroupPrincipal>() metodu ile dönen sonucu grupların temsil edildiği GroupPrincipal türüne çeviriyoruz.

Ekran görüntüsünde de görünen enteresan bir duruma dikkatinizi çekmek istiyorum. Sonuç dönen grupların “Members” özelliğinin içinde o gruba üye olan kullanıcıları görebiliyoruz. Tabi bu kullanıcıların içerisinde de üye oldukları gruplar görünüyor. Bu iç içe sonuç kümeleri sayesinde aslında kullanıcının birinin hesabından girip aslında bütün kullanıcı ve grup bilgilerine ulaşılabilir. 🙂

AD Gruplarının Sistemden Alınması

AD sunucusundan grupların alınması işlemi de yazının ilk maddesi olan kullanıcı bilgilerinin alınması ile aynı adımlardan oluşmaktadır. Aradaki fark burada UserPrincipal yerine GroupPrincipal sınıfı kullanılmaktadır.

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "saitorhan.local", "Administrator", "123456qaZ.");
GroupPrincipal groupPrincipal = new GroupPrincipal(principalContext);
PrincipalSearcher principalSearcher = new PrincipalSearcher(groupPrincipal);
List<GroupPrincipal> groupPrincipals = principalSearcher.FindAll().Cast<GroupPrincipal>().ToList();

AD Grup Üyelerine Kullanıcı Ekleme

AD gruplarından birine kullanıcı eklemek için öncelikle GroupPrincipal.FindByIdentity metodu ile kullanıcı eklenecek grup seçilir. Daha sonra dönen GroupPrincipal türündeki grup nesnesinin Members özelliğine Add metodu (group.Members.Add) ile kullanıcı eklenir. Add metodu üç parametre alır. Bu parametreler;

  1. Sunucu ile bağlantıyı sağlayan PrincipalContext
  2. Eklenecek kullanıcının hangi özelliği ile bulunup ekleneceği
  3. Eklenecek kullanıcının ikinci parametrede verilen özelliğinin değeri
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "saitorhan.local", "Administrator", "123456qaZ.");
GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, "Help Desk");
group.Members.Add(principalContext, IdentityType.SamAccountName, "saitorhan");
group.Save();

AD Grup Üyelerinden Kullanıcı Silmek

Gruptan kullanıcı silinirken de ekleme ile aynı adımlar takip edilir. Aradaki tek fark Add metodu yerine Remove metodu kullanılır.

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "saitorhan.local", "Administrator", "123456qaZ.");
GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, "Help Desk");
group.Members.Remove(principalContext, IdentityType.SamAccountName, Username);
group.Save();

AD Kullanıcı Parolası Doğrulama

PrincipalContext.ValidateCredentials metodu, parametre olarak aldığı kullanıcı adı ve parolanın eşleşip eşleşmediğini kontrol eder. İkinci parametrede verilen parola ilk parametrede verilen kullanıcıya aitse “true” yanlış şifre ise de “false” değer döner.

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "saitorhan.local", "Administrator", "123456qaZ.");
bool credentials = principalContext.ValidateCredentials("bilalorhan", "Parolam1234");

AD Kullanıcı Şifresi Değiştirme

AD kullanıcısına ait şifreyi değiştirmek için UserPrincipal sınıfının SetPassword metodu kullanılır.

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "saitorhan.local", "Administrator", "123456qaZ.");
 UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext, IdentityType.SamAccountName, "bilalorhan");
userPrincipal.SetPassword("Parolam1234");
userPrincipal.Save();

AD Kullanıcıyı İlk Oturum Açmada Parola Değiştirmeye Zorlama

Kullanıcıyı ilk oturumda parola değiştirmeye zorlamak için öncelikle “userPrincipal.PasswordNeverExpires = false” ifadesi ile kullanıcının şifresinin süresiz geçerli olması iptal edilir. İkinci adımda “userPrincipal.ExpirePasswordNow()” metodu ile kullanıcının parolasını süresi sona ermişe çekilir.

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "saitorhan.local", "Administrator", "123456qaZ.");
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext, IdentityType.SamAccountName, userName);
userPrincipal.PasswordNeverExpires = false;
userPrincipal.ExpirePasswordNow();
userPrincipal.Save();

Kaynak Kodlar: https://github.com/saitorhan/CSharpForSystemAdmins

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.