13.09.2019

Powershell ile kullanıcı hesapları yönetimi

Süresi dolan parolalar, yanlış girilince kilitlenen hesaplar... Komut satırından yönetilse fena mı olurdu?

Windows istemci işletim sistemleri için RSAT'ın yüklenişi için şu bağlantıya bakılabilir. Bir kere

PS> Get-Module -ListAvailable
ile ActiveDirectory modülünü gördükten sonra Powershell 3.0 ve üstü sürümlerde Import-Module'e gerek kalmadan doğrudan cmdlet isimlerini yazarak kullanabiliriz.

En sık kullanılabilecek şey parola süresi dolan hesapları görmek olabilir. Search-ADAccount bu amaçlı güzel bir İsviçre çakısı.
PS> Search-ADAccount -PasswordExpired

Parolası dolan hesapları admin tarafından değiştirmek için şu yöntem kullanılabilir:

PS> Set-ADAccountPassword -Identity kullanici.adi
   -Reset
   -NewPassword (ConvertTo-SecureString -AsPlainText "P@ssw0rd!" -Force)

Burada -NewPassword alanı SecureString  tipinde bir veri bekliyor. Bunu sağlamak çin ConvertTo-SecureString cmdlet'ini kullanıyoruz. Ama şifreyi de aynı zamanda okunabilir bir şekilde yazdığımız için ConvertToSecureString cmdlet'i bunu ilk başta çevirmeyi reddedecektir. Bütün bu uyarıları görmezden gelmek için -Force parameteresini kullanmamız gerek. Daha doğru bir yöntemle şöyle de yapabilirdik:

PS> Set-ADAccountPassword -Identity kullanici.adi
   -Reset
   -NewPassword (Read-Host "Yeni parola" -AsSecureString)

Ya da parola süresi asla dolmayacak hesapların listesini almak için

PS> Search-ADAccount -PasswordNeverExpires
olabilir. Account lockout politikasına göre kilitlenmiş hesapları görmek için ise
PS> Search-ADAccount -Lockedout
faydalı olur. Bazı hesapları süreli açarız ve o süre dolduktan sonra hesabın kullanılmamasını isteriz. Bu şekilde süresi dolmuş hesapları görmek için
PS> Search-ADAccount -AccountExpired
ya da süresi haftaya dolacak hesapları görmek için
PS> Search-ADAccount -AccountExpiring -DateTime (Get-Date).AddDays(7)
ve kapatılmış (disabled) hesapları görmek için de
PS> Search-ADAccount -AccountDisabled
kullanılabilir. Bu komutların hepsi çok ayrıntılı sayfalarca veri üretiyorsa daha özet bir veri görmek için Select-Object (veya kısaca select) kullanılabilir. Örneğin son komut için
PS> Search-ADAccount -AccountDisabled | select SamAccountName
olabilir. Search-ADAccount'un yardımına bakınca -ComputersOnly ve -UsersOnly parametrelerini gördüm. Bu cmdlet hem bilgisayar hem de kullanıcı hesaplarını çıkış olarak verdiği için bu parametrelerle sadece bilgisayar veya sadece kullanıcı hesaplarını süzmek mümkün.
PS> Search-ADAccount -AccountDisabled -UsersOnly | select SamAccountName
Son 90 günde kullanılmamış (inactive) hesapları görmek için
PS> Search-ADAccount -AccountInactive
Parola süresi dolmuş bir hesabın parolasını değiştirmek için (net user hesap.adi * /DOM)
PS> Set-ADAccountPassword -Identity kullanici.adi -NewPassword (ConvertTo-SecureString -AsPlainText "..." -Force)
 Evet, bunu bir cmdlet'e çevirmek faydalı olabilir.

Yeni bir Active Directory hesabı yaratmak için: (net user user1 password /add /DOM)
PS> New-ADUser -Name "Kullanıcı Adı" 
   -GivenName "Ön Ad" 
   -Surname "Soyad" 
   -SamAccountName "hesap.adi" 
   -UserPrincipalName "hesap.adi@firmaadi.com" 
   -Path "OU=yoneticiler,DC=firmaadi,DC=com" 
   -AccountPassword(Read-Host -AsSecureString "Parola:")
   -Enabled $true
New-ADUser cmdlet'i ile kullanıcı adı yaratırken parola vermek zorunlu değildir, çünkü ilk yaratılan durumda kullanıcı etkinleştirilmemiş olarak yaratılır. Ya daha sonra parola ataması yapıp (domain password policy'ye uygun olarak) Enable-ADAccount ile kullanıcı etkinleştirilmeli, ya da yukarıdaki gibi hem parola belirtilip hem de -Enable $true parameteresi kullanılmalı. Başka önemli bir nokta ise -AccountPassword parametresi SecureString tipinde veri beklenmesi. Buraya "P@ssw0rd" gibi bir parola veremeyiz. Ama illaki önceden belirlenmiş bir parola verilecekse
PS> ConverTo-SecureString "P@ssw0rd" -AsPlainText -Force
kullanılabilir.

Mevcut bir hesabı görmek için (net user hesap.adi /DOM)
PS> Get-ADUser -Identity "hesap.adi"
ya da hesabı bir sorgu ile bulmak için
PS> Get-ADUser -Filter {Name -like "murat*"}
Var olan bir kullanıcı hesabını silmek için (net user hesap.adi /Del /DOM)
PS> Remove-ADUser -Identity "hesap.adi"
Mevcut bir hesabın son kullanım tarihini 3 ay olarak belirlemek için
PS> Set-ADAccountExpiration hesap.adi -DateTime (Get-Date).AddMonths(3)
Tam  tersi, hesap üzerindeki son kullanma tarihini kaldırarak süresiz kullanılabilmesini sağlamak için
PS> Clear-ADAccountExpiration -Identity hesap.adi
Var olan bir hesabı kullanıma kapatmak için (disable, net user hesap.adi /DOM /active:no)
PS> Disable-ADAccount -Identity hesap.adi
Ya da tekrar etkinleştirmek için (net user hesap.adi /DOM /active:yes)
PS> Enable-ADAccount -Identity hesap.adi
Lockout olmuş bir hesabı tekrar kullanıma açmak için
PS> Unlock-ADAccount -Identity hesap.adi

Ya da unlock olmuş hesapları tek satırda bulup onları unlock etmek için

PS> Search-ADAccount - Lockedout | Unlock-ADAccount

 Active Directory modülü ile gelen benzer komutları aramak için

PS> Get-Command -Noun ADAccount*

veya

PS> Get-Command -Module ActiveDirectory

 kullanılabilir. Benzer şekilde grup işlemleri ile ilgili

PS> Get-Command -Noun ADGroup*
yazdığımda birkaç grup cmdlet'i buldum. Birkaç grup işlemi için de örnek yapayım.

Mail ile başlayan grupları bulmak için
PS> Get-ADGroup -Filter {Name -like 'Mail*'}

Bir kullanıcının grup üyeliklerini görmek için ise

PS> Get-ADPrincipalGroupMembership -Identity kullanici.adi

Bir grubun üyelerini görmek için (net group GrupAdi /DOM)
PS> Get-ADGroupMember Administrators
Veya bir kullanıcıyı gruba eklemek için (net group GrupAdi hesap.adi /DOM /ADD)
PS> Add-ADGroupMember -Identity GrupAdi -Members hesap.adi
Ve hatta bir kullanıcıyı grup üyeliğinden çıkarmak için (net group GrupAdi hesap.adi /DOM /DEL)
PS> Remove-ADGroupMember -Identity GrupAdi -Members hesap.adi -Confirm

Bu komut, kullanıcıyı gruptan çıkarmadan önce onaylama isteyecektir. Sondaki -Confirm bu onayı peşinen vermek için.

Evet, komut isimleri uzun, parametreler ve ek yönlendirmelerle gayet uzun komutlara dönüşebiliyorlar. Bunun için yeni alias'lar tanımlanabilir, ya da amaca özel yeni cmdlet'ler oluşturulabilir.

2022-08-25 Ek: Yerel hesaplar için de powershell gibisi yok. Yeni bir yerel hesap yaratmak için

PS> New-LocalUser -Name fatih -FullName 'Fatih Terim'

Bu komutu çalıştırdıktan sonra bir parola sorar. Parolasız bir kullanıcı oluşturmak istiyorsak -NoPassword kullanabilir, veya parolayı -Password argumanı ile vermek istiyorsak da Read-host -AsSecureString ile yapabiliriz. Ayrıca -AccountExpires ve -Desription gibi argümanlar da var. Parolasız oluşturulan hesabın parolasını daha sonra oluşturmak için

PS> Set-LocalUser -Name fatih -Password (Readhost "Parola?" -AsSecureString)

Yerel kullanıcı hesaplarının yönetilmesinde kullanılabilecek diğer cmdlet'ler ise şöyle:

PS> Enable-LocalUser -Name fatih

PS> Disable-LocalUser -Name fatih

PS> Remove-LocalUser -Name fatih

PS> Rename-LocalUser -Name Fatih -NewName FatihTerim

Yeni oluşturulan bir hesabı var olan bir gruba, örneğin Administrators grubuna üye yapmak için

PS> Add-LocalGroupMember -Group Administrators -Member fatih

kullanabiliriz. Yeni bir grup oluşturmak için New-LocalGroup, grup veya kullanıcı hesabını silmek için ise bu cmdlet'lerin Remove'larını, yani Remove-LocalGroup veya Remove-LocalUser kullanabiliriz.

Bonus
Eskiden, Windows sunucu etki alanı üyesi bir bilgisayarın ismini değiştirmek istediğimizde önce etki alanından çıkartıp, sonra ismini değiştirip sonra tekrar etki alanı üyesi yapardık. Bunun için de 3 kez terar başlatmak gerekirdi. Windows 7 sonrasında artık bu işi etki alanından çıkarmadan yapabileceğimizi duymuştum ama denememiştim. Bu şerefe powershell ile nail oldum. Aşağıdaki şekilde uzaktaki bir bilgsayara yeni bir isim vermek çok büyük kolaylık.

PS> Rename-Computer -ComputerName eskiadi -NewName yeniadi -Restart -Force -DomainCredential (Get-Credential)
Burada:
-ComputerName: hangi bilgisayarda yeniden adlandırma işlemi uygulanacak
-NewName: bilgisayarın yeni ismi ne olacak
-Force: Emin misiniz? gibi sorulara baştan "evet" diye cevap vermek için
-Restart: Yeniden adlandırma işleminin geçerli olması için hemen ardından yeniden başlatmaya zorlamak için. Bu parametre kullanılmazsa yeniden başlatma kullanıcının insiyatifinde olacak. Bilgisayar özelliklerinde de yeniden başlatma sonrası bilgisayarın yeni adının ne olacağına dair bir bilgilendirme mesajı görüntülenecek.
-DomainCredential: Etki alanında bu işlemi yapmak için yetkisi olan bir kullanıcı hesabını bildirmek için
-(Get-Credential): Grafik arayüz ile kullanıcı adı ve şifrenin girilebilmesi için

Bununla birlikte bilgisayarın yeni ismi şu anda ağda mevcut bir isim olamaz. Yeniden adlandırma öncesinde etki alanında bu isme sahip bir bilgisayar var mı diye bakabiliriz:
PS> Get-ADComputer -Identity yeniadi
ya da daha geniş bir arama için isim filtresi kullanarak
PS> Get-ADComputer -Filter 'Name -like "*ad*"'
ve eğer mevcutta böyle bir bilgisayar varsa o eski hesabı silmek için (kullanılmayan, eski bir hesap ise)
PS> Get-ADComputer -Identity yeniadi | Remove-ADComputer -Credential (Get-Credential)

Hiç yorum yok: