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-ID: 365896

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

Printed on: November 11, 2024 at 10:11 o'clock

NetzwerkDude
NetzwerkDude Feb 23, 2018 at 10:31:50 (UTC)
Goto Top
Also Try / Catch wäre eine möglichkeit....

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

catch {
    $test = "kein angemeldeter user"  
}

$test
135333
135333 Feb 23, 2018 updated at 11:16:38 (UTC)
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
NetzwerkDude
NetzwerkDude Feb 23, 2018 at 13:34:50 (UTC)
Goto Top
Ich schau mal Nachher ob "Win32_LoggedOnuser" sich besser handeln lässt
135333
135333 Feb 23, 2018 updated at 14:14:04 (UTC)
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}  
            }
        }
    }
}
135333
Solution 135333 Feb 23, 2018 updated at 14:32:33 (UTC)
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  
}
NetzwerkDude
NetzwerkDude Feb 23, 2018 at 15:11:40 (UTC)
Goto Top
Danke, werde aber vor Montag da nichts mehr machen face-smile
135333
135333 Feb 23, 2018 updated at 15:15:24 (UTC)
Goto Top
Zitat von @NetzwerkDude:

Danke, werde aber vor Montag da nichts mehr machen face-smile
Aha, Azubinchen face-smile.
NetzwerkDude
NetzwerkDude Feb 23, 2018 at 15:23:55 (UTC)
Goto Top
wie meinst?