PowerShell ile Yerel Yöneticiyi Yönetme


HTA'da uzak bilgisayara bağlanmak ve yerel yönetici hesabını almak için ADSI'yi kullandım. Geri aldığınız nesne, parolanın değiştirilmesinden bu yana geçen saniye sayısını belirten bir PasswordAge özelliğine sahiptir. İşte bir kod örneği.

$computers="chi-win8-01","chi-win81","chi-core01","chi-fp02","chi-hvr2"
$account="administrator"
#get password age
$computers | foreach {
 [int]$Age = ([adsi]"WinNT://$_/$account,user").passwordage.value/86400
 $LastChange=(Get-Date).AddHours(-$age)
 New-Object -TypeName PSObject -Property @{
  Computername = $_
  Account = $Account
  Age = $Age
  LastChange = $LastChange
 }
}

Bu örnekte bir isim listesi tanımlıyorum. Ancak Get-Content ile bir metin dosyasının içeriğini kolayca okuyabilir veya Active Directory'yi sorgulayabilirsiniz. Yönetici hesabını yeniden adlandırmış olabileceğiniz veya farklı bir yerel hesabı kontrol etmeniz gerekebileceği için hesap adı için bir değişken oluşturdum. PowerShell daha sonra her bilgisayarın adını alır ve yönetici hesabıyla bir ADSI bağlantısı oluşturarak parola değerini alır ve bunu bir gün içindeki saniye sayısına böler. Yani $Age, gün cinsinden hesap şifresinin yaşı olur. PowerShell tamamen nesnelerle ilgili olduğundan, bazı ilgili bilgileri içeren özel bir nesne oluşturuyorum. İşte sonuç.

Neden ForEach numaralandırıcısı yerine ForEach-Object kullandığımı merak ediyor olabilirsiniz. Bunun nedeni, ikincisinin boru hattına hiçbir şey yazmamasıdır ve sonuçları bir metin dosyasına kaydetmek veya CSV'ye aktarmak isteyebilirim.

$computers="chi-win8-01","chi-win81","chi-core01","chi-fp02","chi-hvr2"
$account="administrator"
#get password age
$computers | foreach {
 [int]$Age = ([adsi]"WinNT://$_/$account,user").passwordage.value/86400
 $LastChange=(Get-Date).AddHours(-$age)
 New-Object -TypeName PSObject -Property @{
  Computername = $_
  Account = $Account
  Age = $Age
  LastChange = $LastChange
 }
} | Export-CSV -path c:\work\local-admin-report.csv -notypeinformation

Sadece bazı PowerShell örneklerini gösterdiğimi unutmayın. İdeal olarak, diğer PowerShell araçlarıyla birleştirebileceğiniz parola bilgilerini almak için bir araç oluşturmak istersiniz. Aslında size verdiğim şey zaten bir fonksiyon olmaya yakın ama bunu çözüp çözemeyeceğinizi görmenize izin vereceğim. Bunun gibi bir komutu çalıştırabilmek istiyorsunuz:

get-content computers.txt | get-localpasswordAge | export-csv -path c:\work\age.csv

Ortadaki komut oluşturacağınız araçtır.

Şimdi şifreyi değiştirmeye ne dersiniz? Bu da tek satırlık bir komutla gerçekleştirilebilir.

([adsi]"WinNT://COMPUTER01/administrator,user").setpassword("P@ssw0rd")

Raporladığınız tüm makinelerin şifresini değiştirmek isterseniz, "get" kodunu değiştirmek çok fazla iş gerektirmez. Görüyorsunuz, PowerShell'de ADSI kullanmak, VBScript'te kullanmak kadar, hatta daha kolay.

Birkaç uyarı var:

  • WinNT adının büyük/küçük harfe duyarlı olduğunu unutmayın.
  • Alternatif kimlik bilgilerini kullanmanın kolay bir yolu yoktur.
  • Bunu sağlayan bir komut dosyası yazmadığınız sürece WhatIf desteği yoktur.

Buradaki kod örneklerim eğitim amaçlıdır. İhtiyaçlarınıza göre daha sağlam bir çözüm oluşturmak ve test etmek için zaman ayırmalısınız. Bir dahaki sefere VBScript'e ihtiyacınız olduğunu düşündüğünüzde durun ve PowerShell Place'e ilerleyin.

İlgili makaleler