it-swarm.com.de

PowerShell-Skript zum Anzeigen der aktuell angemeldeten Benutzer (Domäne und Computer) + Status (aktiv, im Leerlauf, abwesend)

Ich suche nach einem einfachen Befehl, um angemeldete Benutzer auf dem Server zu sehen. Ich kenne diesen:

Get-WmiObject -Class win32_computersystem

dies gibt mir jedoch nicht die Informationen, die ich brauche Es gibt Folgendes zurück: domainManufactureerModelName (Computername) PrimaryOwnerName TotalPhysicalMemory

Ich führe Powershell 3.0 auf einem Windows 2012-Server aus.

Ebenfalls 

Get-WmiObject Win32_LoggedOnUser -ComputerName $Computer | Select Antecedent -Unique

gibt mir nicht die genauen Antworten, die ich brauche ... Ich würde gerne auch die Leerlaufzeit sehen, oder ob sie aktiv sind oder nicht.

27
RayofCommand

Auf der Suche nach dieser Lösung habe ich unter einer anderen Frage in stackoverflow gefunden, was ich brauchte: Powershell-log-off-remote-session . Die folgende Zeile gibt eine Liste der angemeldeten Benutzer zurück.

query user /server:$SERVER
78
Hyon

Dafür gibt es keinen "einfachen Befehl". Sie können eine Funktion schreiben oder mehrere auswählen, die online in verschiedenen Code-Repositories verfügbar sind. Ich benutze das:

function get-loggedonuser ($computername){

#mjolinor 3/17/10

$regexa = '.+Domain="(.+)",Name="(.+)"$'
$regexd = '.+LogonId="(\d+)"$'

$logontype = @{
"0"="Local System"
"2"="Interactive" #(Local logon)
"3"="Network" # (Remote logon)
"4"="Batch" # (Scheduled task)
"5"="Service" # (Service account logon)
"7"="Unlock" #(Screen saver)
"8"="NetworkCleartext" # (Cleartext network logon)
"9"="NewCredentials" #(RunAs using alternate credentials)
"10"="RemoteInteractive" #(RDP\TS\RemoteAssistance)
"11"="CachedInteractive" #(Local w\cached credentials)
}

$logon_sessions = @(gwmi win32_logonsession -ComputerName $computername)
$logon_users = @(gwmi win32_loggedonuser -ComputerName $computername)

$session_user = @{}

$logon_users |% {
$_.antecedent -match $regexa > $nul
$username = $matches[1] + "\" + $matches[2]
$_.dependent -match $regexd > $nul
$session = $matches[1]
$session_user[$session] += $username
}


$logon_sessions |%{
$starttime = [management.managementdatetimeconverter]::todatetime($_.starttime)

$loggedonuser = New-Object -TypeName psobject
$loggedonuser | Add-Member -MemberType NoteProperty -Name "Session" -Value $_.logonid
$loggedonuser | Add-Member -MemberType NoteProperty -Name "User" -Value $session_user[$_.logonid]
$loggedonuser | Add-Member -MemberType NoteProperty -Name "Type" -Value $logontype[$_.logontype.tostring()]
$loggedonuser | Add-Member -MemberType NoteProperty -Name "Auth" -Value $_.authenticationpackage
$loggedonuser | Add-Member -MemberType NoteProperty -Name "StartTime" -Value $starttime

$loggedonuser
}

}
19
mjolinor

Da wir uns im PowerShell-Bereich befinden, ist es besonders nützlich, wenn wir ein ordnungsgemäßes PowerShell-Objekt zurückgeben können.

Ich persönlich mag diese Methode des Parsens, wegen der Klarheit:

((quser) -replace '^>', '') -replace '\s{2,}', ',' | ConvertFrom-Csv

Hinweis: Dies gilt nicht für Benutzer, die nicht verbunden sind ("Disc"), funktioniert jedoch gut, wenn Sie nur eine kurze Liste von Benutzern anzeigen möchten und sich nicht für die restlichen Informationen interessieren. I wollte nur eine Liste und kümmerte sich nicht darum, ob sie gerade getrennt waren.

Wenn Sie sich um den Rest der Daten kümmern, sind diese etwas komplexer:

(((quser) -replace '^>', '') -replace '\s{2,}', ',').Trim() | ForEach-Object {
    if ($_.Split(',').Count -eq 5) {
        Write-Output ($_ -replace '(^[^,]+)', '$1,')
    } else {
        Write-Output $_
    }
} | ConvertFrom-Csv

Ich gehe einen Schritt weiter und gebe dir ein sehr sauberes Objekt in meinem Blog.

Ich habe daraus ein Modul gemacht.

8
VertigoRay

Vielleicht kannst du etwas mit machen 

    get-process -includeusername
2
js2010

Hier ist mein Ansatz basierend auf DarKalimHeros Vorschlag, indem ich nur auf Explorer.exe-Prozesse auswähle

Function Get-RdpSessions 
{
    param(
        [string]$computername 
    )

    $processinfo = Get-WmiObject -Query "select * from win32_process where name='Explorer.exe'" -ComputerName $computername

    $processinfo | ForEach-Object { $_.GetOwner().User } | Sort-Object -Unique | ForEach-Object { New-Object psobject -Property @{Computer=$computername;LoggedOn=$_} } | Select-Object Computer,LoggedOn
}
1
Matze

Wenn Sie interaktiv angemeldete Benutzer finden möchten, habe ich hier einen guten Tipp gefunden: https://p0w3rsh3ll.wordpress.com/2012/03/03/get-logged-on-users/ (Win32_ComputerSystem hat nicht geholfen mir)

$explorerprocesses = @(Get-WmiObject -Query "Select * FROM Win32_Process WHERE Name='Explorer.exe'" -ErrorAction SilentlyContinue)
If ($explorerprocesses.Count -eq 0)
{
    "No Explorer process found / Nobody interactively logged on"
}
Else
{
    ForEach ($i in $explorerprocesses)
    {
        $Username = $i.GetOwner().User
        $Domain = $i.GetOwner().Domain
        Write-Host "$Domain\$Username logged on since: $($i.ConvertToDateTime($i.CreationDate))"
    }
}
1
DarKalimHero