Powershell Get Active-Benutzer auf lokalem Computer angemeldet

10146
Reddy

Ich versuche, aktuell angemeldete Benutzer mit aktiver Sitzung abzurufen.

Im Task-Manager ist die Liste klar, dass zwei Benutzersitzungen vorhanden sind und eine aktiv ist.

Ich möchte das gleiche über Powershell abfragen. Ich habe einige der verfügbaren Befehle ausprobiert, in Get-WmiObject Win32_LoggedOnUser | Select Antecedent -Uniquedenen viel mehr Benutzer aufgeführt sind, als ich überhaupt sehen kann [Domäne, die dem Computer beigetreten ist]

Ich suche nach der Abfrage, die genau wie der Task-Manager Ergebnisse liefert. Powershell Get Active-Benutzer auf lokalem Computer angemeldet

2
Was ist mit "Abfrage Benutzer"? duenni vor 7 Jahren 0
@duenni scheint richtig zu sein. trotzdem zu analysieren und "Active User" zu erhalten. Scheint, als wäre es eine String-Ausgabe Reddy vor 7 Jahren 0
Vielleicht kann Ihnen dies helfen http://superuser.com/q/587737/378809 duenni vor 7 Jahren 0
AFAIK gibt es über PowerShell keine native Methode, ich habe in der Vergangenheit danach gesucht. Siehe [Powershell, erhalten Sie einen Wert von "Abfrage Benutzer" und nicht die Kopfzeilen usw.] (http://superuser.com/questions/587737/powershell-get-a-value-from-query-user-and-not-the- Header-etc? noredirect = 1 & lq = 1) Ƭᴇcʜιᴇ007 vor 7 Jahren 0
@MagicallyDelicous, ich versuche tatsächlich, einige Skripts in Remote-Maschinen mit Remote-Powershell auszuführen. Wenn kein Benutzer aktiv ist, versuche ich, den Computer neu zu starten. Reddy vor 7 Jahren 0
Reddy - Mach dich bereit, wenn es Zeit für Spaghetti ist, und erinnere mich daran, meine Machete zu holen, damit ich hacken, hacken, hacken kann ... Psyche ... Wie ist der Status dazu? Hast du auch meine Kommentare gelesen? Pimp Juice IT vor 7 Jahren 0
@MagicallyDelicous Ich habe es anders gemacht http://stackoverflow.com/questions/42711592/getting-the-logged-in-user-in-powershell Das funktioniert in allen Maschinen und ist nicht langabhängig und liefert die richtigen Ergebnisse Reddy vor 7 Jahren 0
Sie haben also einen C # -Code in PS mit dem 'Add-Type' verwendet ... das war meine zweite Vermutung ... ** NICHT ** !! Pimp Juice IT vor 7 Jahren 0

3 Antworten auf die Frage

2
omniomi

Das Problem mit Get-WmiObject Win32_LoggedOnUser | Select Antecedent -Uniqueist, dass alle Sitzungen angezeigt werden, auch diejenigen, die seit dem letzten Neustart des Computers geschlossen wurden. Der einfachste Weg, Sitzungen abzufragen, ist leider die alte ausführbare Datei query.exe.

Sie können die Ausgabe von query.exe in ein bisschen Regex in Objekte konvertieren:

$Computer = $env:COMPUTERNAME $Users = query user /server:$Computer 2>&1  $Users = $Users | ForEach-Object { (($_.trim() -replace ">" -replace "(?m)^([A-Za-z0-9])\s+(\d\s+\w+)", '$1 none $2' -replace "\s", "," -replace "none", $null)) } | ConvertFrom-Csv  foreach ($User in $Users) { [PSCustomObject]@{ ComputerName = $Computer Username = $User.USERNAME SessionState = $User.STATE.Replace("Disc", "Disconnected") SessionType = $($User.SESSIONNAME -Replace '#', '' -Replace "[0-9]+", "") }  } 

Was gibt Ihnen eine Ausgabe wie folgt:

ComputerName Username SessionState SessionType ------------ -------- ------------ ----------- BSMITH-LT bobsm Active console  

Wir gehen noch viel näher auf eine Funktion ein:

function Convert-QueryToObjects { [CmdletBinding()] [Alias('QueryToObject')] [OutputType([PSCustomObject])] param ( [Parameter(Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0)] [Alias('ComputerName', 'Computer')] [string] $Name = $env:COMPUTERNAME )  Process { Write-Verbose "Running query.exe against $Name." $Users = query user /server:$Name 2>&1  if ($Users -like "*No User exists*") { # Handle no user's found returned from query. # Returned: 'No User exists for *' Write-Error "There were no users found on $Name : $Users" Write-Verbose "There were no users found on $Name." } elseif ($Users -like "*Error*") { # Handle errored returned by query. # Returned: 'Error ...<message>...' Write-Error "There was an error running query against $Name : $Users" Write-Verbose "There was an error running query against $Name." } elseif ($Users -eq $null -and $ErrorActionPreference -eq 'SilentlyContinue') { # Handdle null output called by -ErrorAction. Write-Verbose "Error action has supressed output from query.exe. Results were null." } else { Write-Verbose "Users found on $Name. Converting output from text."  # Conversion logic. Handles the fact that the sessionname column may be populated or not. $Users = $Users | ForEach-Object { (($_.trim() -replace ">" -replace "(?m)^([A-Za-z0-9])\s+(\d\s+\w+)", '$1 none $2' -replace "\s", "," -replace "none", $null)) } | ConvertFrom-Csv  Write-Verbose "Generating output for $($Users.Count) users connected to $Name."  # Output objects. foreach ($User in $Users) { Write-Verbose $User if ($VerbosePreference -eq 'Continue') { # Add '| Out-Host' if -Verbose is tripped. [PSCustomObject]@{ ComputerName = $Name Username = $User.USERNAME SessionState = $User.STATE.Replace("Disc", "Disconnected") SessionType = $($User.SESSIONNAME -Replace '#', '' -Replace "[0-9]+", "") } | Out-Host } else { # Standard output. [PSCustomObject]@{ ComputerName = $Name Username = $User.USERNAME SessionState = $User.STATE.Replace("Disc", "Disconnected") SessionType = $($User.SESSIONNAME -Replace '#', '' -Replace "[0-9]+", "") } } } } } } 

und jetzt kannst du Dinge tun wie: Get-ADComputer -Filter | Convert-QueryToObjects | ? {$_.SessionState -eq 'Active'}

Das einzige Problem ist. Der `quser` gibt die Ausgabe in der Landessprache aus. Dies ist ein Problem, wenn man auf entfernten Rechnern laufen möchte, die möglicherweise eine andere Sprache haben Reddy vor 7 Jahren 0
Sie können die Funktion ändern, um mit verschiedenen Sprachen umzugehen, aber es gibt leider keine wirklichen Alternativen, um die benötigten Informationen zu erhalten. Die einzig mögliche reine PowerShell-Methode besteht darin, zu überprüfen, ob explorer.exe-Prozesse auf dem Remote-Computer ausgeführt werden. Dies unterscheidet jedoch nicht zwischen aktiven und getrennten Sitzungen. Das heißt, jetzt ist es an der Zeit, die Standardisierung der Installationssprache Ihrer Server in Betracht zu ziehen und Benutzer zu veranlassen, Set-WinUILanguageOverride für ihre persönlichen UI-Sprachanforderungen zu verwenden. omniomi vor 7 Jahren 0
1
js2010

So mache ich es. Es funktioniert jedoch nicht für rdp-Sitzungen.

$out = query session | where {$_ -match 'console'} $array = $out -split('\s+') $consoleuser = $array[1] 

Oder:

$consoleuser = query session | select-string console | foreach { -split $_ } |  select -index 1 
-1
s0mm3r

Das kann man mit:

get-wmiobject -Class Win32_Computersystem | Benutzernamen auswählen

Grüße

Es gibt mir ein leeres Ergebnis, wenn ich in Remote-Maschine von RDP aus ausführen :( Reddy vor 7 Jahren 0
Die WMI-Abfrage wird nur lokal bei Benutzern angemeldet. Versuchen Sie, "qwinsta" zu verwenden. Hier ist ein Skript, das ich mit einer einzigen Google-Suche erhalten habe: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-script-to-Find -d2ba4252 s0mm3r vor 7 Jahren 1