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

İlgili makaleler