them-man
Goto Top

PC bzw. Notebook automatisch ab einer bestimmten Zeit herunterfahren, wenn kein User mehr angemeldet ist

Hallo Community.

Ich suche krampfhaft nach einer Lösung PCs/Notebooks ab einer bestimmten Zeit (z.B. 18 Uhr) automatisch herunterfahren zu können, jedoch soll vorher geprüft werden, ob noch User angemeldet sind, wenn ja, soll z.B. das Skript einen Timeout von 5 oder 10 Minuten machen und dann vorn vorn beginnen (Loop).
Habe schon gegoogelt und gemacht, aber bin bis jetzt auf keinen grünen Zweig gekommen. Die betroffenen Systeme haben Windows 7 Professional.
Hab schon mit qwinsta und query user probiert, nur leider schaffe ich es nicht, einen sinnvollen Wert in einen Parameter zu übergeben, diesen per if auszuwerten und dann entsprechend weiter zu verarbeiten.
Natürlich muss dann auch noch das Skript per Aufgabenplanung ohne Nutzeranmeldung laufen.

Hat da jemand eine Lösung für mich.
Hänge echt fest und komme nicht weiter.

Danke im Voraus

Content-Key: 315835

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

Ausgedruckt am: 19.03.2024 um 06:03 Uhr

Mitglied: AndreasHoster
AndreasHoster 21.09.2016 aktualisiert um 15:22:15 Uhr
Goto Top
Mit Powershell ungefähr so:
$tempverz = "C:\temp"  
$1 = "Name des PCs"  
# Query zur Abfrage mit Ausgabeumleitung
Start-Process -FilePath "c:\windows\system32\query.exe" -ArgumentList @("USER","/SERVER:$1") -RedirectStandardOutput "$tempverz\Query_$1.txt" -RedirectStandardError "$tempverz\QueryError_$1.txt" -WindowStyle Hidden  
# Einlesen der umgeleiteten Ausgabe
$temp = Get-Content -Path "$tempverz\Query_$1.txt","$tempverz\QueryError_$1.txt"  
if(($temp -imatch "Aktiv") -or ($temp -imatch "Active")) {  
   # Noch jemand aktiv, hier könnte man protokollieren, wenn man will
} else {
   # Niemand mehr angemeldet, hier könnte dann der Shutdown stehen, z.B.
   Stop-Computer -ComputerName $1 -Force
}
Wobei dieser Code mit $temp -imatch "Aktiv" nur nach interaktiven Sessions sucht, disconnectete RDP Sessions werden nicht beachtet.
Mitglied: TheM-Man
TheM-Man 21.09.2016 um 15:57:07 Uhr
Goto Top
Naja. Das sieht schon super aus. Jedoch hänge ich nun auch leider wieder (bin leider nicht gerade der Powershell-Skript-Freak).
Ich bräuchte ein Loop drin. Sprich: Wenn noch jemand angemeldet ist, soll er am besten 5 oder 10 Minuten warten und dann erneut von vorn prüfen oder wie würdest du das an dieser stelle lösen.
Mitglied: TheM-Man
TheM-Man 21.09.2016 um 16:10:12 Uhr
Goto Top
Irgendwas haut leider nicht hin.
Habe es nun leicht angepasst.
Schaut jetzt so aus:

$tempverz = "$env:windir\temp"
$1 = "$env:computername"
Start-Process -FilePath "c:\windows\system32\query.exe" -ArgumentList @("USER","/SERVER:$1") -RedirectStandardOutput "$tempverz\Query_$1.txt" -RedirectStandardError "$tempverz\QueryError_$1.txt" -WindowStyle Hidden
$temp = Get-Content -Path "$tempverz\Query_$1.txt","$tempverz\QueryError_$1.txt"
if(($temp -imatch "Aktiv") -or ($temp -imatch "Aktiv")) {
        1. Noch jemand aktiv, hier könnte man protokollieren, wenn man will
        Get-Date -RedirectStandardOutput "$tempverz\AngemeldeteUser_$1.txt"
        Start-Process -FilePath "c:\windows\system32\query.exe" -ArgumentList @("USER","/SERVER:$1") -RedirectStandardOutput "$tempverz\AngemeldeteUser_$1.txt"
        } else {
              1. Niemand mehr angemeldet, hier könnte dann der Shutdown stehen, z.B.
              Stop-Computer -ComputerName $1 -Force
              }

              Leider ist es aber so, das mein PC dann auch noch herunter fährt, obwohl ich angemeldet bin (was er ja nicht tun soll).
              RDP brauche ich nicht. Es geht nur um die Prüfung, ob lokal noch ein User am Client angemeldet ist, wenn ja, soll er ein Loop machen (nach z.B. 5 Minuten), wenn keiner mehr angemeldet ist, dann Shutdown.
Mitglied: AndreasHoster
AndreasHoster 21.09.2016 um 16:34:32 Uhr
Goto Top
Ich habe das an meinem Windows 8.1 Rechner kurz zusammengebaut, da gibt query user sowas zurück:
query user /Server:MeinRechner
BENUTZERNAME SITZUNGSNAME ID STATUS LEERLAUF ANMELDEZEIT
administrator console 1 Aktiv Kein 21.09.2016 08:17

Eventuell gibt query User bei Windows 7 was anderes zurück, so das man nicht auf Aktiv filtern kann.
Was gibt den Dein query user zurück?
Alternativ, Windows 7 hat eine ältere Powershellversion, eventuell klappt die Ausgabeumleitung nicht so, schau mal nach, ob in den Ausgabedateien tatsächlich was drinsteht.
Mitglied: TheM-Man
TheM-Man 21.09.2016 um 16:46:18 Uhr
Goto Top
Doch. Gibt auch "Aktiv" zurück.
Schaut so aus.
Es läuft ohne Probleme bis zu Get-Content.
Vermute es liegt am if und diesem -imatch

Ausgabe query user:
BENUTZERNAME SITZUNGSNAME ID STATUS LEERLAUF ANMELDEZEIT
mario.eichner console 1 Aktiv Kein 21.09.2016 16:05

Inhalt ist aus der txt, die das Skript anlegt.
Hab's jetzt Testweise mal so und lande immer bei Else (also Hallo und der anschließenden Pause).
Somit hängt es wohl an diesem -imatch.
Mitglied: TheM-Man
TheM-Man 22.09.2016 um 14:32:44 Uhr
Goto Top
Ok.
Habe es inzwischen ohne Powershell mit ner Batch lösen können.
Geht über qwinsta, findstr und eine IF-funktion.
Wichtig ist, wenn man es per aufgabe ausführen möchte, was sinn macht, dass man bei shutdown nicht -s sondern -p verwendet!

Trotzdem danke für die Hilfe.
Mitglied: colinardo
colinardo 22.09.2016 aktualisiert um 17:16:11 Uhr
Goto Top
Hallo TheM-Man,
mit Powershell ist das so einfach gemacht:
while($true){
    if ((gwmi Win32_Computersystem).Username -eq $null){stop-computer -force; return}
    sleep -Seconds 60
}
Die Prüfung per Batch geht auch per wmic
@echo off
:loop
wmic computersystem get username /format:list | findstr /ib "UserName=[a-z]" >nul 2>&1 || (  
    echo Kein Benutzer mehr angemeldet, fahre die Kiste in den Keller ...
    shutdown /s /t 0
    goto :eof
)
timeout /T 60
goto loop
Bei keinem angemeldeten User ist die WMI Eigenschaft Username der Klasse Win32_Computersystem leer ansonsten steht dort ein Benutzername.

Wichtig ist, wenn man es per aufgabe ausführen möchte, was sinn macht, dass man bei shutdown nicht -s sondern -p verwendet!
Das ist kein muss, es geht auch problemlos wenn du den Parameter /T auf 0 setzt face-smile

Grüße Uwe

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Mitglied: TheM-Man
TheM-Man 26.09.2016 um 08:44:48 Uhr
Goto Top
Danke.

für das nächste mal dann face-wink