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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 315835
Url: https://administrator.de/contentid/315835
Ausgedruckt am: 16.11.2024 um 01:11 Uhr
8 Kommentare
Neuester Kommentar
Mit Powershell ungefähr so:
Wobei dieser Code mit $temp -imatch "Aktiv" nur nach interaktiven Sessions sucht, disconnectete RDP Sessions werden nicht beachtet.
$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
}
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.
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.
Hallo TheM-Man,
mit Powershell ist das so einfach gemacht:
Die Prüfung per Batch geht auch per wmic
Bei keinem angemeldeten User ist die WMI Eigenschaft Username der Klasse Win32_Computersystem leer ansonsten steht dort ein Benutzername.
Grüße Uwe
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
mit Powershell ist das so einfach gemacht:
while($true){
if ((gwmi Win32_Computersystem).Username -eq $null){stop-computer -force; return}
sleep -Seconds 60
}
@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
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 Grüße Uwe
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.