(BAT,CMD) Shutdown mit Prüfung ob User angemeldet ist
Hallo zusammen,
ich habe eine BAT Datei die automatisiert alle PC´s bei mir sichert. Die PC´s werden via WOL hochgefahren, dann auf meinen PC zwischengespeichert eh der Weg dann auf eine USB Festplatte geht.
Soweit so gut, alles funktioniert.
Jetzt stehe ich vor dem Problem, das ich die PC´s nach der Sicherung herunterfahren möchte, sofern KEIN User angemeldet ist.
Bisher bin ich soweit:
::@echo off
Set nutzer=user
Set passwort=pw
psloggedon \\rechnername -l -x > d:\sicherung\loggedin.tmp
net use z: \\rechnername\d /user:%nutzer% %passwort%
shutdown /s /m \\rechnername
net use z: /delete /yes
Ich würde mit shutdown den PC herunterfahren, das klappt.
mit psloggedon will ich auslesen ob jemand angemeldet ist, das klappt auch!
Nur wie lese ich das Ganze jetzt aus und bastel daraus ein Wenn/Dann; If/Else ????
ich komme einfach nicht wirklich weiter!
Vielen Dank im vorraus
ich habe eine BAT Datei die automatisiert alle PC´s bei mir sichert. Die PC´s werden via WOL hochgefahren, dann auf meinen PC zwischengespeichert eh der Weg dann auf eine USB Festplatte geht.
Soweit so gut, alles funktioniert.
Jetzt stehe ich vor dem Problem, das ich die PC´s nach der Sicherung herunterfahren möchte, sofern KEIN User angemeldet ist.
Bisher bin ich soweit:
::@echo off
Set nutzer=user
Set passwort=pw
psloggedon \\rechnername -l -x > d:\sicherung\loggedin.tmp
net use z: \\rechnername\d /user:%nutzer% %passwort%
shutdown /s /m \\rechnername
net use z: /delete /yes
Ich würde mit shutdown den PC herunterfahren, das klappt.
mit psloggedon will ich auslesen ob jemand angemeldet ist, das klappt auch!
Nur wie lese ich das Ganze jetzt aus und bastel daraus ein Wenn/Dann; If/Else ????
ich komme einfach nicht wirklich weiter!
Vielen Dank im vorraus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 234524
Url: https://administrator.de/contentid/234524
Ausgedruckt am: 25.11.2024 um 15:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo hoffi3d,
führe ich die obengenannte IF Bedingung aus, erhalte ich je nach Anmeldung das gewünschte Ergebnis.
Ich erläutere die Bedingung etwas genauer:
Deine Abfrage bzw. der Aufruf von psloggedon in Zeile 1, gibt dann einen Wert zurück "1" oder "0".
1 = niemand ist angemeldet
0 = jemand ist angemeldet
Ist gleich zu setzen mit true/false.
Ist niemand an diesem PC angemeldet, soll er herruntergefahren werden.
Dann wird unter dem "echo" das shutdown eingefügt (die echo's können später natürlich entfernt werden, sind zum Testen aber sehr praktisch)
Frage: Wofür ist der net use?
Speicherst Du auf den PC(d:\sicherung\) die log?
Gruß, Sascha
führe ich die obengenannte IF Bedingung aus, erhalte ich je nach Anmeldung das gewünschte Ergebnis.
Ich erläutere die Bedingung etwas genauer:
psloggedon \\rechnername -x > d:\sicherung\loggedin.tmp
IF ERRORLEVEL = 1 (
echo niemand ist angemeldet
Hier dein shutdown Befehl
) ELSE (
echo jemand ist angemeldet
)
1 = niemand ist angemeldet
0 = jemand ist angemeldet
Ist gleich zu setzen mit true/false.
Ist niemand an diesem PC angemeldet, soll er herruntergefahren werden.
Dann wird unter dem "echo" das shutdown eingefügt (die echo's können später natürlich entfernt werden, sind zum Testen aber sehr praktisch)
psloggedon \\rechnername -x > d:\sicherung\loggedin.tmp
IF ERRORLEVEL = 1 (
echo niemand ist angemeldet
shutdown /s /m \\rechnername
Hier dein shutdown Befehl
) ELSE (
echo jemand ist angemeldet
)
Speicherst Du auf den PC(d:\sicherung\) die log?
Gruß, Sascha
Das geht so nicht, weil psloggedon offenbar keinen ERRORLEVEL kennt.
Was du mit der Sicherung meinst keine Ahnung... aber versuchs mit Powershell Ungetestet an Remote-PCs
Das speicherst du in einer Datei mit der Dateiendung .ps1.
Wenn nicht bereits getan musst du in der Powershell vorher: (Powershell muss als Administrator ausgeführt werden)
eingeben und mit "J" bestätigen.
Zum Ausführen der Powershelldatei kannst du einen Rechtklick darauf machen und "mit Powershell ausführen" klicken.
Im Script musst du:
das # Zeichen entfernen (# steht für Kommentierungen) - Diese Zeile ist aber ungetestet.
Wenn es um einen lokalen PC handelt auf dem du das Script ausführst musst du in der Zeile
Das -Credential $cred
entfernen - sonst gibt es eine Fehlermeldung.
Zur Erläuterung:
Zeilen 1-5 werden Variablen definiert.
:1 Der Tempordner wird in $temppath geschrieben
:2 Der Pfad einer Temporären Datei wird aus dem Temppfad und dem Dateinamen "log.txt" "zusammen gebaut
:3 Siehe 2 für die Passwortdatei
:4 Hier den Remote-PC Namen eintragen - kann man auch über Read-Host direkt in der powershell abfragen
:5 Username der auf dem Remote-PC Adminrechte hat
:7 Simple Ausgabe
:9 Das Passwort wird eingelesen und die Anzeige so umgestellt, dass nur *** erscheinen und in die Passwortdatei geschrieben
:11 Das Passwort wird in der Variable $password gesichert aus der Passwortdatei
:12 Die Variable $cred wird mit dem Passwort und dem Usernamen "gefüllt"
:15 Simple Ausgabe
:18 Es wird geprüft ob die Temporäre Datei vorhanden ist und wenn ja
:19 diese gelöscht
:20 Wenn nicht wird abgefragt ob auf dem Remote-PC der Prozess "Explorer.exe" läuft, welcher nur läuft wenn ein Benutzer angemeldet ist. Wenn ja wird der Computername in die Temporäredatei geschrieben die zeitgleich erstellt wird. Wenn niemand angemeldet ist wird auch keine Datei erstellt - noch nicht mal eine leere.
:26 Wenn die Tempdatei vorhanden ist, ist jemand angemeldet und es gibt eine simple Ausgabe
:28 Wenn nicht
:29 Simple Ausgabe
:30 PC wird herunter gefahren
:34 Wenn die tempdatei vorhanden ist wird diese gelöscht
:37 Passwortdatei wird gelöscht
Gruß
Was du mit der Sicherung meinst keine Ahnung... aber versuchs mit Powershell Ungetestet an Remote-PCs
$temppath = $env:temp
$strFileName=$temppath+"\log.txt"
$strSecureFileName=$temppath+"\securestring.txt"
$strComputerName="Computername"
$username = "domänenname\Benutzername"
Write-Host "Bitte geben Sie das Administratorpasswort vom Remote-PC ein!"
read-host -assecurestring | convertfrom-securestring | out-file $strSecureFileName `
$password = cat $strSecureFileName | convertto-securestring
$cred = new-object -typename System.Management.Automation.PSCredential `
-argumentlist $username, $password
Write-host "Passwort wurde verschlüsselt und in der Datei $strSecureFileName gespeichert"
If (Test-Path $strFileName){
Remove-Item $strFileName
} Else {
Get-WmiObject -Class win32_process -ComputerName $strComputerName -Credential $cred |
Where-Object{ $_.Name -eq "explorer.exe" } |
ForEach-Object{ ($_.GetOwner()).Domain + "\\" + ($_.GetOwner()).User | Out-file $strFileName -Encoding ASCII; }
}
If (Test-Path $strFileName){
Write-Host "Es ist noch ein Benutzer angemeldet!"
} Else {
write-host "Es ist kein Benutzer mehr angemeldet. Der PC wird jetzt herunter gefahren!"
#stop-computer -Computername $strComputerName -Authentication default -Credential $cred
}
If (Test-Path $strFileName){
Remove-Item $strFileName
}
Remove-Item $strSecureFileName
Write-Host "Dateien gelöscht!"
Das speicherst du in einer Datei mit der Dateiendung .ps1.
Wenn nicht bereits getan musst du in der Powershell vorher: (Powershell muss als Administrator ausgeführt werden)
Set-ExecutionPolicy unrestricted
Zum Ausführen der Powershelldatei kannst du einen Rechtklick darauf machen und "mit Powershell ausführen" klicken.
Im Script musst du:
#stop-computer -Computername $strComputerName -Authentication default -Credential $cred
das # Zeichen entfernen (# steht für Kommentierungen) - Diese Zeile ist aber ungetestet.
Wenn es um einen lokalen PC handelt auf dem du das Script ausführst musst du in der Zeile
Get-WmiObject -Class win32_process -ComputerName $strComputerName -Credential $cred |
entfernen - sonst gibt es eine Fehlermeldung.
Zur Erläuterung:
Zeilen 1-5 werden Variablen definiert.
:1 Der Tempordner wird in $temppath geschrieben
:2 Der Pfad einer Temporären Datei wird aus dem Temppfad und dem Dateinamen "log.txt" "zusammen gebaut
:3 Siehe 2 für die Passwortdatei
:4 Hier den Remote-PC Namen eintragen - kann man auch über Read-Host direkt in der powershell abfragen
:5 Username der auf dem Remote-PC Adminrechte hat
:7 Simple Ausgabe
:9 Das Passwort wird eingelesen und die Anzeige so umgestellt, dass nur *** erscheinen und in die Passwortdatei geschrieben
:11 Das Passwort wird in der Variable $password gesichert aus der Passwortdatei
:12 Die Variable $cred wird mit dem Passwort und dem Usernamen "gefüllt"
:15 Simple Ausgabe
:18 Es wird geprüft ob die Temporäre Datei vorhanden ist und wenn ja
:19 diese gelöscht
:20 Wenn nicht wird abgefragt ob auf dem Remote-PC der Prozess "Explorer.exe" läuft, welcher nur läuft wenn ein Benutzer angemeldet ist. Wenn ja wird der Computername in die Temporäredatei geschrieben die zeitgleich erstellt wird. Wenn niemand angemeldet ist wird auch keine Datei erstellt - noch nicht mal eine leere.
:26 Wenn die Tempdatei vorhanden ist, ist jemand angemeldet und es gibt eine simple Ausgabe
:28 Wenn nicht
:29 Simple Ausgabe
:30 PC wird herunter gefahren
:34 Wenn die tempdatei vorhanden ist wird diese gelöscht
:37 Passwortdatei wird gelöscht
Gruß
Dann rufst du es eben auf aus der Batch oder die batch aus der powershell...
Du kannst das auch mit VBS + WMI machen... aber offenbar nicht mit Batch, außer du versuchst die Ausgabe von ps loggedon zu zerlegen und auszulesen wenn niemand angemeldet ist, aber das bekommen hier andere sicher besser hin mit Strings zerlegen etc.
Noch dazu sehe ich jetzt nicht groß was da noch fehlt ... WOL kannst du auch aus der Powershell aufrufen und eine "Sicherung" was auch immer du sicherst auch... Was das Script noch machen soll keine Ahnung
Gruß
Du kannst das auch mit VBS + WMI machen... aber offenbar nicht mit Batch, außer du versuchst die Ausgabe von ps loggedon zu zerlegen und auszulesen wenn niemand angemeldet ist, aber das bekommen hier andere sicher besser hin mit Strings zerlegen etc.
Noch dazu sehe ich jetzt nicht groß was da noch fehlt ... WOL kannst du auch aus der Powershell aufrufen und eine "Sicherung" was auch immer du sicherst auch... Was das Script noch machen soll keine Ahnung
Gruß
@echo off
set logdatei=d:\sicherung\loggedin.txt
set pstools=c:\pstools\
set rechnername=bitteändern
%pstools%psloggedon \\%rechnername% -l -x > %logdatei%
find /i "DEIN Text der Aussagt, dass niemand eingeloggt ist" %logdatei%
if errorlevel 1 goto angemeldet
%pstools%psshutdown -u %nutzer% -p %passwort% \\%rechnername%
goto EOF
:angemeldet
Echo Es ist noch ein Benutzer angemeldet!
goto EOF
:EOF
del %logdatei%
Weiß nicht wie der String ist wenn niemand angemeldet ist. Den musst du dann oben einsetzen.
Allerdings bin ich mir nicht sicher wie das bei psloggedon mit den Berechtigungen ist. Also ob du die überhaupt auslesen kannst ohne pw und username.
Gruß
Edit: Ungetestet - schreibe vor das shutdown (beachte PSSHUTDOWN aus den pstools - da kannst du username und pw übergeben) ein Echo zum testen.
Super!
Besser spät als nie wie manch anderer ;P
Gerne!
Gruß