PowerShell: Bilgisayar/OU/Etki Alanı başına tüm oturum açmış Kullanıcıları alın (Get-UserLogon)
Son zamanlarda oturum açmış tüm kullanıcıların nasıl gösterileceği soruldu. Bu yüzden bundan bir fonksiyon yaratma fikrim vardı. Şimdi bu işlevi toplulukla paylaşacağım. Kim, hangi bilgisayarda, ne zaman oturum açtı? Bu makalenin sorusu bu. Aslında asıl soru şu: Şu anda kim oturum açmış?
Bu makalenin önkoşulu düzenli ve temiz bir Active Directory ortamıdır. Neden? Çünkü bir bilgisayarda oturum açan kullanıcıyı sorgulamak yaklaşık 4 saniye sürüyor. Veritabanında hâlâ kullanılmayan bilgisayar hesapları varsa, bu işlem gereksiz yere daha uzun sürecektir. Özellikle etki alanının tamamını sorgulamaya çalışırsanız. Hadi dalalım.
Amaç
Hedef, oturum açmış tüm kullanıcıları bilgisayar adına veya kuruluş birimine göre gösteren bir işlevdir. Ayrıca etki alanının tamamındaki tüm bilgisayarları sorgulamak da mümkündür. Bunun biraz zaman alabileceğini unutmayın. Test ortamımda bilgisayar başına ortalama 4 saniye sürdü.
Eylemde
Bilgisayar
Client01'in oturum açmış kullanıcısı alınıyor. Bu Petra. 06:41'de giriş yaptı.
Get-UserLogon -Computer client01
kuruluş birimi
Diyelim ki bir kuruluş birimi iş istasyonlarımız var. Bu kuruluş birimi çalıştırmasındaki tüm bilgisayarlarda oturum açmış tüm kullanıcıları almak istiyorsanız
Get-UserLogon -OU 'ou=Workstations,dc=sid-500,dc=com'
İkinci örnek, tüm Etki Alanı Denetleyicilerinde mevcut oturum açmış kullanıcıyı gösterir.
Tamam, ekranımın biraz sıkıcı olduğunu itiraf etmeliyim. Küçük bir Active Directory test ortamındayım. ?
Etki Alanının Tamamı
Bu da beni son parametreye getiriyor. Bu bir anahtar parametresidir. Bir değer vermeyin.
Get-UserLogon -All
Tamam işte bu. Bunun çoğumuz için oldukça faydalı olduğunu düşünüyorum.
Get-UserLogon İşlevi
Ve işte fonksiyonun kendisi:
function Get-UserLogon {
[CmdletBinding()]
param
(
[Parameter ()]
[String]$Computer,
[Parameter ()]
[String]$OU,
[Parameter ()]
[Switch]$All
)
$ErrorActionPreference="SilentlyContinue"
$result=@()
If ($Computer) {
Invoke-Command -ComputerName $Computer -ScriptBlock {quser} | Select-Object -Skip 1 | Foreach-Object {
$b=$_.trim() -replace '\s+',' ' -replace '>','' -split '\s'
If ($b[2] -like 'Disc*') {
$array= ([ordered]@{
'User' = $b[0]
'Computer' = $Computer
'Date' = $b[4]
'Time' = $b[5..6] -join ' '
})
$result+=New-Object -TypeName PSCustomObject -Property $array
}
else {
$array= ([ordered]@{
'User' = $b[0]
'Computer' = $Computer
'Date' = $b[5]
'Time' = $b[6..7] -join ' '
})
$result+=New-Object -TypeName PSCustomObject -Property $array
}
}
}
If ($OU) {
$comp=Get-ADComputer -Filter * -SearchBase "$OU" -Properties operatingsystem
$count=$comp.count
If ($count -gt 20) {
Write-Warning "Search $count computers. This may take some time ... About 4 seconds for each computer"
}
foreach ($u in $comp) {
Invoke-Command -ComputerName $u.Name -ScriptBlock {quser} | Select-Object -Skip 1 | ForEach-Object {
$a=$_.trim() -replace '\s+',' ' -replace '>','' -split '\s'
If ($a[2] -like '*Disc*') {
$array= ([ordered]@{
'User' = $a[0]
'Computer' = $u.Name
'Date' = $a[4]
'Time' = $a[5..6] -join ' '
})
$result+=New-Object -TypeName PSCustomObject -Property $array
}
else {
$array= ([ordered]@{
'User' = $a[0]
'Computer' = $u.Name
'Date' = $a[5]
'Time' = $a[6..7] -join ' '
})
$result+=New-Object -TypeName PSCustomObject -Property $array
}
}
}
}
If ($All) {
$comp=Get-ADComputer -Filter * -Properties operatingsystem
$count=$comp.count
If ($count -gt 20) {
Write-Warning "Search $count computers. This may take some time ... About 4 seconds for each computer ..."
}
foreach ($u in $comp) {
Invoke-Command -ComputerName $u.Name -ScriptBlock {quser} | Select-Object -Skip 1 | ForEach-Object {
$a=$_.trim() -replace '\s+',' ' -replace '>','' -split '\s'
If ($a[2] -like '*Disc*') {
$array= ([ordered]@{
'User' = $a[0]
'Computer' = $u.Name
'Date' = $a[4]
'Time' = $a[5..6] -join ' '
})
$result+=New-Object -TypeName PSCustomObject -Property $array
}
else {
$array= ([ordered]@{
'User' = $a[0]
'Computer' = $u.Name
'Date' = $a[5]
'Time' = $a[6..7] -join ' '
})
$result+=New-Object -TypeName PSCustomObject -Property $array
}
}
}
}
Write-Output $result
}
İşletim Sistemi Dili ile İlgili Önemli Not
Yukarıdaki işlevin, düz metin çıktısı veren quser komutunu kullandığını unutmayın. Örneğin; Almanca sunucular ve İngilizce sunucular. Bu, yukarıda gösterilen çıktıyı yalnızca Englisch işletim sistemlerinde alacağınız anlamına gelir.
Kalıcı hale getirin
Yaklaşımımı beğendiyseniz PowerShell ISE'yi açın. İşlevi ISE oturumunuza kopyalayın. C:\Program Files\Windows PowerShell\Modules konumunda bir klasör oluşturun ve kodu psm1 dosyası olarak kaydedin. Dosya adınızla klasör adınızın eşleştiğinden emin olun.
Artık PowerShell, PowerShell her başlatıldığında özel modülü yükleyecektir.
Teşekkür
Harika işlevi Get-LoggedOnUser için Jaap Brasser'a (MVP) teşekkürler. Onun işlevi benim için çok yardımcı oldu ve bir adım daha ileri giderek oturum açmış tüm kullanıcıları kuruluş birimine veya etki alanının tamamına göre çağırmam için bana ilham verdi.
İşlevini burada bulabilirsiniz:
https://gallery.technet.microsoft.com/scriptcenter/Get-LoggedOnUser-Gathers-7cbe93ea



