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.
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
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
}
}
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.
Vielleicht kannst du etwas mit machen
get-process -includeusername
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
}
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))"
}
}