hoffi3d
Goto Top

(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

Content-Key: 234524

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

Printed on: April 24, 2024 at 06:04 o'clock

Member: SaschaRD
SaschaRD Apr 04, 2014 updated at 06:54:51 (UTC)
Goto Top
Morgen hoffi3d,
Hier deine psloggedon Abfrage
IF ERRORLEVEL = 1 (
echo niemand ist angemeldet
Hier dein shutdown Befehl
) ELSE (
echo jemand ist angemeldet
)

Gruß, Sascha
Member: hoffi3d
hoffi3d Apr 04, 2014 at 07:31:57 (UTC)
Goto Top
Hallo Sascha,

das ist nicht ganz richtig(denke ich!?)

Erstmal korrigiere ich mich es muss heißen:

psloggedon \\rechnername -x > d:\sicherung\loggedin.tmp (ohne -l)

Wenn am fernen Rechner niemand angemeldet ist bekomme ich =>

Connecting to Registry of \\ferner_rechner...

No one is logged on locally.

Users logged on via resource shares:
mein_rechner\mein_user


zurück

Wenn aber jemand angemeldet ist:

Connecting to Registry of \\ferner_rechner...

Users logged on locally:
ferner_rechner\angemeldeter_user

Users logged on via resource shares:
mein_rechner\mein_user


So sieht es dann aus!

Kannst du mir sagen wie ich den Code wie du formatieren kann?
Member: SaschaRD
SaschaRD Apr 04, 2014 updated at 08:50:24 (UTC)
Goto Top
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:
psloggedon \\rechnername -x > d:\sicherung\loggedin.tmp
IF ERRORLEVEL = 1 ( 
echo niemand ist angemeldet
Hier dein shutdown Befehl
) ELSE (
echo jemand ist angemeldet
)
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)
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
)
Frage: Wofür ist der net use?
Speicherst Du auf den PC(d:\sicherung\) die log?

Gruß, Sascha
Member: hoffi3d
hoffi3d Apr 04, 2014 at 10:11:35 (UTC)
Goto Top
hallo Sascha,

in beiden Fällen, also mit angemeldeten User als auch ohne erhalte ich immer das Echo jemand ist angemeldet.
Für mich auch einleuchtend, da es ja kein Error ist wenn niemand angemeldet ist!

Ich bekomme den shutdown befehl nur ausgeführt wenn ich mich vorher via net use mit dem PC verbinde, sonst bin ich nicht berechtigt! Das Ganze funktioniert auch!

Die Log war dafür gedacht mir anzuzeigen was psloggedon ermittelt hat!
Member: Xaero1982
Xaero1982 Apr 05, 2014 updated at 11:05:18 (UTC)
Goto Top
Das geht so nicht, weil psloggedon offenbar keinen ERRORLEVEL kennt.

Was du mit der Sicherung meinst keine Ahnung... aber versuchs mit Powershell face-smile 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
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:

#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 | 
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ß
Member: hoffi3d
hoffi3d Apr 07, 2014 at 06:47:50 (UTC)
Goto Top
Hallo,

nur leider würde ich dann von neuem anfangen, ich habe ja bereits eine bat Datei die funktioniert.
Mit dieser würde ich gerne weiterarbeiten...! Von Powershell habe ich keine Ahnung -_-

Eine Lösung in BAT wäre toll!!
Member: Xaero1982
Xaero1982 Apr 07, 2014 updated at 07:15:49 (UTC)
Goto Top
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ß
Member: hoffi3d
hoffi3d Apr 07, 2014 at 08:11:37 (UTC)
Goto Top
Hallo Xaero,

ok das ist eine Variante.

Naja ich habe diverse Logs und auch eine automatisierte eMail Erstellung und alles soweit fertig das es 1A läuft.
In Powershell müsste ich erst einarbeiten.
Wenn ich nichts finden sollte, werde ich deine Lösung kopieren.
Vielen Dank erstmal!
Member: Xaero1982
Xaero1982 Apr 07, 2014 at 08:52:29 (UTC)
Goto Top
Was du noch machen kannst ist die Ausgabe von psloggedon in eine txt-datei zu schreiben, diese einzulesen und nach dem entsprechenden String zu suchen der besagt, dass niemand mehr angemeldet ist. Wenn das so ist soll er den pc herunter fahren...
Member: hoffi3d
hoffi3d Apr 07, 2014 at 08:57:27 (UTC)
Goto Top
jep, nur leider weiß ich nur wie ich etwas in eine Datei schreibe, wie ich diese wieder auslese, daran hapert es!
Member: Xaero1982
Solution Xaero1982 Apr 07, 2014, updated at Apr 16, 2014 at 07:08:47 (UTC)
Goto Top
@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.
Member: hoffi3d
hoffi3d Apr 16, 2014 at 07:09:12 (UTC)
Goto Top
Danke das klappt!
Sorry für die späte Antwort!

VIELEN DANK
Member: Xaero1982
Xaero1982 Apr 16, 2014 at 07:13:00 (UTC)
Goto Top
Zitat von @hoffi3d:

Danke das klappt!
Sorry für die späte Antwort!

VIELEN DANK

Super!
Besser spät als nie wie manch anderer ;P

Gerne!

Gruß