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:
(normale ausgabe in weiß)
In ISE:
(in rot)
wobei $lastexitcode in beiden fällen 1 ist
Ich habe an sowas gedacht:
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:
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 ...
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 *
In ISE:
query user /server:servername
query : Kein Benutzer vorhanden fr *
At line:1 char:1
+ query user /server:servername
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Kein Benutzer vorhanden fr *:String) , RemoteException
+ FullyQualifiedErrorId : NativeCommandError
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])
Bin jetzt nicht der erste der das problem hat:
https://social.technet.microsoft.com/Forums/windowsserver/en-US/bc71f977 ...
Please also mark the comments that contributed to the solution of the article
Content-ID: 365896
Url: https://administrator.de/contentid/365896
Printed on: November 11, 2024 at 10:11 o'clock
8 Comments
Latest comment
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
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
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}
}
}
}
}
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
}
Aha, Azubinchen .