netzwerkdude
Goto Top

Windows + PS: Query.exe - Unterschiedliches verhalten in PS und ISE

Moin,

Ich bastle an einem skript das aus einer liste an Computern die zurückgibt, an denen jemand angemeldet ist, und dann die angemeldeten User anzeigt - als Prüfwerkzeug nehme ich Query.exe (gibts da eine bessere methode? evtl. PowerShell nativ?).

Aktuell verstehe ich nicht so recht warum Query sich direkt im Powershell Fenster anders verhält als in der ISE:

Direkt in PS:
query user /server:servername
Kein Benutzer vorhanden für *
(normale ausgabe in weiß)

In ISE:
query user /server:servername
query : Kein Benutzer vorhanden fr *
At line:1 char:1
+ query user /server:servername
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Kein Benutzer vorhanden fr *:String) , RemoteException
    + FullyQualifiedErrorId : NativeCommandError
(in rot)

wobei $lastexitcode in beiden fällen 1 ist


Ich habe an sowas gedacht:
$computers = "Server1", "Server2"  
$Computerswithlogin = [ordered]@{}
$ComputersohneLogin = @()

foreach  ($x in $computers) {

    $CheckLogin = query user /server:$x
    
    if ($CheckLogin) {
        $ComputerswithLogin.$x += $CheckLogin
    }
    
    else {
         $ComputersohneLogin += $x
    }
}

Bin mir also gerade nicht sicher wie ich den Rückgabewert von Query testen kann, weil z.B. falls das user angemeldet sind, gibt er ein array zurück, daher dachte ich an sowas:
if ($CheckLogin -is [Array])
wobei das auch nicht geht, der if fall tritt da auch ein...

Bin jetzt nicht der erste der das problem hat:
https://social.technet.microsoft.com/Forums/windowsserver/en-US/bc71f977 ...

Content-Key: 365896

Url: https://administrator.de/contentid/365896

Ausgedruckt am: 19.03.2024 um 08:03 Uhr

Mitglied: NetzwerkDude
NetzwerkDude 23.02.2018 um 11:31:50 Uhr
Goto Top
Also Try / Catch wäre eine möglichkeit....

try{
    $test = query user /server:ServerName
}

catch {
    $test = "kein angemeldeter user"  
}

$test
Mitglied: 135333
135333 23.02.2018 aktualisiert um 12:16:38 Uhr
Goto Top
Tipp:
Win32_LoggedOnuser

Gruß Snap

p.s. Zum Fehler: Da es wenn es keinen User gibt geht alles in stderr und für Powershell ist das nunmal ein Fehler und den zeigt es mit der Meldung an face-smile
Mitglied: NetzwerkDude
NetzwerkDude 23.02.2018 um 14:34:50 Uhr
Goto Top
Ich schau mal Nachher ob "Win32_LoggedOnuser" sich besser handeln lässt
Mitglied: 135333
135333 23.02.2018 aktualisiert um 15:14:04 Uhr
Goto Top
Noch eine weitere Möglichkeit über die Explorer Prozesse:
Function Get-LoggedOnUsers {
Param(
        [Parameter(Mandatory = $True,Position = 0,ValueFromPipeline = $True)][string[]]$computers
    )
    Process {
        foreach($comp in $computers){
            gwmi win32_process -computer $comp -Filter "Name = 'explorer.exe'" | %{  
                [pscustomobject] @{"Computer"=$comp;"Domain"=($_.GetOwner()).Domain;"User"=($_.GetOwner()).User}  
            }
        }
    }
}
Mitglied: 135333
Lösung 135333 23.02.2018 aktualisiert um 15:32:33 Uhr
Goto Top
Und die Win32_LoggedUser Variante falls du es nicht gepackt haben solltest

$computer = "ComputerXYZ"  
gwmi win32_LogonSession -Computer $computer -Filter 'LogonType=2 or LogonType=10' | %{  
    gwmi -ComputerName $computer -Query "Associators of {Win32_LogonSession.LogonId=$($_.LogonId)} Where AssocClass=Win32_LoggedOnUser Role=Dependent" | select -Expand Name  
}
Mitglied: NetzwerkDude
NetzwerkDude 23.02.2018 um 16:11:40 Uhr
Goto Top
Danke, werde aber vor Montag da nichts mehr machen face-smile
Mitglied: 135333
135333 23.02.2018 aktualisiert um 16:15:24 Uhr
Goto Top
Zitat von @NetzwerkDude:

Danke, werde aber vor Montag da nichts mehr machen face-smile
Aha, Azubinchen face-smile.
Mitglied: NetzwerkDude
NetzwerkDude 23.02.2018 um 16:23:55 Uhr
Goto Top
wie meinst?