Kullanıcı logon girişlerini engellemek, kurum içi güvenlik politikaları ve geçici yetki kaldırma süreçlerinde oldukça önemlidir. Kullanıcı hesaplarını tamamen devre dışı bırakmadan, yalnızca belirli koşullar altında veya belirli bir süre için logon kısıtlaması yapmak, kullanıcı bilgilerinin ve erişim haklarının korunmasını sağlar. Bu yöntem, kullanıcıların geçici görev değişikliklerinde, güvenlik ihlalleri şüphesi olduğunda veya erişim haklarının geçici olarak durdurulması gereken durumlarda etkili bir şekilde kullanılır.
Windows Server ortamlarında, bu tür kısıtlamalar için en etkili çözüm Group Policy Object (GPO) yapılandırmasıdır. GPO, belirli kullanıcı grupları veya Organizational Unit (OU) seviyesinde hesaplara detaylı ve esnek kısıtlamalar uygulama imkânı sunar. Bu yöntemle, kullanıcıların yalnızca belirli sistemlere veya Network kaynaklarına erişimleri sınırlandırılabilir. Böylece, kullanıcı oturumlarının güvenli bir şekilde yönetilmesi ve yetkisiz erişimlerin önlenmesi sağlanır. Bu girişte, GPO’nun bu alandaki esnekliğine ve sunduğu teknik avantajlara genel bir bakış sunulmaktadır.
Danışmanlık hizmeti verdiğim bir müşterim, yıllık izine çıkan çalışanların Active Directory hesapları güvenliği sebebiyle Disable ettiklerini ancak bu Disable etme yönetiminin Cisco Call Manager, Cisco Jabber, Okta gibi Active Directory Sync işlemi yapan uygulamalardaki kullanıcı ayarlarını sıfırlaması sebebi ile Diable etmeden Logon işlemini engellemenin bir yönetimini uygulamamı istemişti.
Bu işlem için en uygun yöntem, Group Policy Management üzerinde bir GPO oluşturup, bu GPO içinde User Rights Assignment altındaki Deny log on locally ayarını kullanıp, ilgili Security Group nesnesini eklemek olacaktır ancak bu işlemin en az eforla yapılması gerekiyordu. Yani bu işlem öyle bir otomatik hale getirilmeliydi ki Sistem yöneticisi, Active Directory'de sadece çok küçük bir efor harcamalıydı. Bu makalemde sizlere, böyle bir talep karşısında en az eforla bu işlemi nasıl otomatize edeceğinizden bahsedeceğim.
Active Directory Yapılandırması
1- Active Directory hiyerarşi yapım, departman bazında oluşturulmuş durumda olup, her departman için yıllık izin kullanan kullanan kullanıcıların tutulacağı Security Group nesneleri oluşturdum. Bu grupları, aşağıdaki komutla isim kriterinde filtreleyerek görüntülüyorum.
Get-ADGroup -filter * | sort name | select name | Where-Object {$_.name -like "*LEAVE*"} |

2- Şimdi de bu Security Group nesnelerinin bulunduğu Organization Unit'leri, LDAP bilgileri ile listeliyorum. Organization Unit'lerin LDAP bilgileri ve kullanacağımız Security Group isimleri, ilerleyen adımlarda kullanacağımız script içinde tanımlamak için gerekli olacak.
Get-ADOrganizationalUnit -Filter 'Name -like "*"' | Where-Object {$_.Name -like "*LEAVE*"} | Format-Table DistinguishedName -A |

3- Her departman için yıllık izin kullanan kullanıcıların tutulacağı Security Group nesnelerinin üyelik işlemleri, bu kullanıcıların belli bir Organization Unit içinde olup olmaması kriterine bağlı olacağı için, yine her departman için ayrı ayrı Organization Unit'ler oluşturdum. Aşağıdaki komut yardımıyla da bu Organization Unit'lerin içerik bilgilerini çekiyorum.
Get-ADUser -Filter * -SearchBase “OU=Users On Leave,OU=IT,OU=Istanbul,OU=Turkey,OU=Europe,DC=firatboyan,DC=local” |

Group Policy Yapılandırması
4- Active Directory tarafındaki Organization Unit ve Security Group oluşturma işlemlerimi tamamladıktan sonra sıra, Group Policy Management üzerinde bir GPO oluşturup, ilgili tüm Security Group nesnelerini Rights Assignment altındaki Deny log on locally içinde tanımlamak olacak. Bu GPO ayarına erişmek için
Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights Assisgment |
yolunu takip ederek Deny logon locally Policy ayarını çift tıklayarak açıyorum.

4.1- Deny logon locally Properties penceresinde Define these policy settings seçeneğini seçiyor, alt kısımdaki Add User or Group... butonuna tıklıyorum.

4.2- Add User or Group penceresinde Browse botununa tıklıyor, iligli Security Group nesenelerimi seçerek ekliyorum.




Task Scheduler Yapılandırması
5- Active Directory ve Group Policy Yapılandırma işlemlerinden sonra sıra, işlemimizi otomatize etmek için kullanacağımız PowerShell Script dosyasının Task Scheduler içinde belirleyeceğimiz tarih ve zaman aralıklarına çalışmasını sağlamak için gerekli Task Scheduler yapılandırma ayarlarını yapacağım. Bunun için Task Scheduler'ı açıyor, sol bölümdeki Task Scheduler üzerinde sağ tıklayarak Create Task... seçeneğinine tıklıyorum.

5.1- Create Task penceresindeki General sekmesi altında Task'ıma bir isim yazıyor, en alt kısımdaki Run with highest privaliges seçeneğini işeretledikten sonra Triggers sekmesine geçiş yapıyorum.

5.2- Triggers sekmesinde alt kısımdaki New... butonuna tıklıyor, yeni bir tetikleme işlemi için gerekli ayarlamaları yapıyorum.

Buradaki tetikleme işlemi, bir sonraki Actions bölümünde tanımlayacağım PowerShell Script'in ne sıklıkla işletileceği ile ilgili tarih ve saat ayarlarının yapılandırıldığı bölümdür. Ben, Trigger'ımı haftata 1 gün, Pazartesi ve Cuma günleri çalışacak şekilde yapılandırdım. Start bölümündeki tatih ve saat bilgileri, Trigger işleminin ilk başlancının ne zaman ve saat kaçta yapılacağı ile bundan sonraki seçili günlerde hangi saatte yapılacağının ayarlandığı kısımdır.

6- Actions sekmesinde alt kısımdaki New... butonuna tıklıyor, yeni bir aksiyon işlemi için gerekli ayarlamaları yapıyorum.

6.1- New... butonuna tıkldıktan sonra karşıma gelen penceredeki ayarlarımı aşağıdaki gibi yapılandırıyorum.
• Action:
Start a program
• Program/Script:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe |
• Add arguments (optional):
-ExecutionPolicy Bypass -File "C:\PS\IST-IT-USR-ON-LEAVE-GRP.ps1" |

6.2- yapılandırma ayarlarımı tamamladıktan sonra OK butonuna basarak pencereyi kapatıyorum.

7- Conditions sekmesinde herhangi bir değişiklik yapmıyorum.

8- Settings sekmesinde herhangi bir değişiklik yapmıyorum.

9- Task Scheduler'daki Task'ım hazır durumda.

PowerShell Script'in Çalışma Prensibi
10- Sistem yöneticisinin harcaması gereken tek efor, yıllık izine çıkacak olan kullanıcıları Users OU'su içinden, her departmana ait ayrı ayrı oluşturmuş olduğum "Users On Leave" adındaki Organization Unit'lere taşımak olacaktır. Örnek olarak 3 adet kullanıcıyı IT Organization Unit'i altındaki Users OU'sundan "Users On Leave" OU'suna taşıdım.

11- Yapılandırdığım Task Scheduler Trigger'ı arka planda çalışmış, "Users On Leave" OU'sunun içini okuyarak, bu OU içindeki kullanıcıları, yine ilgili Security Group'lara üye yapmıştır.

12- İlgili PowerShell Script'in çalışma prensibini biraz daha yakından inceleyelim. Oluşturmuş olduğum "Users On Leave" OU'su içine 3 kullanıcı daha taşıyorum.

13- Bu sefer de ilgili PowerShell Script'i Windows Powershell ISE ile açıyor, Task Scheduler Trigger'ın zamanını beklemeden çalıştırıyorum. Script, ilgili OU içini okuyup, mevcut olanlara ek olarak sadece yeni eklenenleri ilgili Security Group içine ekleme işlemi yapıyor.

14- Aynı işlemin tam tersini yapacak olursak, bu sefer de "Users On Leave" OU'sundan eklediğim son 3 kişiyi tekrar Users OU'su altına taşıdım. Script, ilgili OU içini okuyup, mevcut olanların dışında kalan kullanıcıları ilgili Security Group içinden çıkarma işlemi yapıyor.



15- Dilerseniz, ilgili PowerShell Script'in Trigger tarih ve saatibi beklemeden de Trigger üzerinde sağ tıklayarak Run seçeneğini seçip, Script'in menuel olarak çalıştırılmasını da sağlayabilirsiniz.

16- Örneğin Fırat Boyan isimli kullanıcı yıllık izine çıkmış olsun. Anlattığım tüm bu süreçlerden işetildikten sonra kullanıcı hesabı ile logon olunmaya çalışıldığında, Logon işleminin Group Policy üzerindeki kısıtlama sayesinde yapıladığını görebiliyoruz.


Faydalı olması dileğiyle...
Her türlü görüş ve önerilerinizi aşağıdaki yorum panelinden bırakabilir, kafanıza takılanları veya merak ettiklerinizi sorabilirsiniz.