2019-09-13

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

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ı.
Search-ADAccount -PasswordExpired

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


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:


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

Search-ADAccount -PasswordNeverExpires

olabilir. Account lockout politikasına göre kilitlenmiş hesapları görmek için ise

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

Search-ADAccount -AccountExpired

ya da süresi haftaya dolacak hesapları görmek için

Search-ADAccount -AccountExpiring -DateTime (Get-Date).AddDays(7)

ve kapatılmış (disabled) hesapları görmek için de

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

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.

Search-ADAccount -AccountDisabled -UsersOnly | select SamAccountName

Son 90 günde kullanılmamış (inactive) hesapları görmek için

-ADAccount -AccountInactive

Parola süresi dolmuş bir hesabın parolasını değiştirmek için (net user hesap.adi * /DOM)


Set-ADAccountPassword -Identity kullanici.adi -NewPassword (ConvertTo-SecureString -AsPlainText "..." -Force)

Evet, bunu bir cmdlet'e çevirmek faydalı olabilir.

Yeni bir Active Directory hesabı oluşturmak için: (net user user1 password /add /DOM)


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 ile SecureString tipinde veri beklenmesi. Buraya "P@ssw0rd" gibi bir parola veremeyiz. Ama illaki önceden belirlenmiş bir parola verilecekse

-AccountPassword (ConverTo-SecureString "P@ssw0rd" -AsPlainText -Force)

kullanılabilir.

Mevcut bir hesabı görmek için (net user hesap.adi /DOM)

Get-ADUser -Identity "hesap.adi"

ya da hesabı bir sorgu ile bulmak için

Get-ADUser -Filter {Name -like "murat*"}

Var olan bir kullanıcı hesabını silmek için (net user hesap.adi /Del /DOM)

Remove-ADUser -Identity "hesap.adi"

Mevcut bir hesabın son kullanım tarihini 3 ay olarak belirlemek için


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

Clear-ADAccountExpiration -Identity hesap.adi

Var olan bir hesabı kullanıma kapatmak için (disable, net user hesap.adi /DOM /active:no)

Disable-ADAccount -Identity hesap.adi

Ya da tekrar etkinleştirmek için (net user hesap.adi /DOM /active:yes)

Enable-ADAccount -Identity hesap.adi

Lockout olmuş bir hesabı tekrar kullanıma açmak için

Unlock-ADAccount -Identity hesap.adi

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

Search-ADAccount - Lockedout | Unlock-ADAccount

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

Get-Command -Noun ADAccount*

veya

Get-Command -Module ActiveDirectory

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

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

Get-ADGroup -Filter {Name -like 'Mail*'}

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

Get-ADPrincipalGroupMembership -Identity kullanici.adi

Bir grubun üyelerini görmek için (net group GrupAdi /DOM)

Get-ADGroupMember Administrators

Veya bir kullanıcıyı gruba eklemek için (net group GrupAdi hesap.adi /DOM /ADD

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)

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


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


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

Bir kullanıcının parolasının süresiz olmasını sağlamak için

Set-LocalUser -Name fatih -PasswordNeverExpires $true

Parolanın süreli olması için $true yerine $false yazılmalı. Ama parolanın süresini belirlemenin powershell ile bir yolu yok. Bu ayar kullanıcı başına belirlenen bir ayar değil. Bunu değiştirmek için

net /maxpwage:30

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

Enable-LocalUser -Name fatih
Disable-LocalUser -Name fatih
Remove-LocalUser -Name fatih
Rename-LocalUser -Name Fatih -NewName FatihTerim

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

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.


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:

Get-ADComputer -Identity yeniadi

ya da daha geniş bir arama için isim filtresi kullanarak

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)


Get-ADComputer -Identity yeniadi | Remove-ADComputer -Credential (Get-Credential)

Hiç yorum yok: