farys
Goto Top

PsTools (psloggedon) in eine Batchdatei einpflegen

Hi,

Ich suche eine Möglichkeit, um eine Gruppe von PCs automatisch herunterzufahren und sie wieder am nächsten Tag hochfahren. Das Ganze soll aber passieren, nur wenn KEIN User angemeldet ist. Also..ich habe nachgeforscht , nach einem passenden Tool, etc., das das Überprüfen, ob j-d noch am PC angemeldet ist, übernimmt und das System entsprechend runterfährt oder nicht.

Ich habe sehr oft auf "pstools" von Microsotf (Tools hat Firma Winternals geschrieben, aber Microsoft hat die dann gekauft;)) gestoßen und auf meinem Rechner installiert. Die Tools sind auf microsoft-seite zum Herunterladen und das Paket enthält mehrere Tools wie:
  • psloggedon = zeigt, wer in einem System angemeldet ist....
  • psshutdown = fährt das System automatisch runter (gibt’s mehrere Optionen dazu)

So....ich habe psloggedon auf EINEM PC ausprobiert, es hat hervorragend funktioniert, d.h. ich bakam folgende Ausgabe:
Y:\admin\scripts\ordnername>psloggedon -l -x \\ pcname1  [= cmd-Eingabe]

loggedon v1.33 - See who's logged on 
Copyright ® 2000-2006 Mark Russinovich
Sysinternals - www.sysinternals.com

Users logged on locally:
     NT-AUTORIT?T\LOKALER DIENST
     NT-AUTORIT?T\NETZWERKDIENST
     DOMÄNEname\user1                     ----------------------> hier steht der Username
     NT-AUTORIT?T\SYSTEM

Jetz wollte ich natürlich nicht nur EINEN Comp auswerten, sondern alle. Dazu habe ich eine Liste mit Computernamen erstellt und sie zusammen mit Batch-Dateien in einen Ordner gepackt.

[die Aufruf-Batchdatei sieht folgend aus:
echo off

del rechner-psloggedon.txt
for /f "delims=" %%i in ('type "rechner-list.txt"') do call "logg.bat" "%%i" >> rechner-psloggedon.txt  
"logg.bat" enthält:
echo off

psloggedon -l -x 


goto :EOF


Das Problem ist: wenn ich das Tool "psloggedon" durch meine Batchdateien aufrufe bekomme ich folgende Ausgabe:
Users logged on locally:
     NT-AUTORITÄT\LOKALER DIENST
     NT-AUTORITÄT\NETZWERKDIENST
     DOMÄNEname\meinName                          -----------> ich war überhaupt dort nicht eingeloggt !!
     DOMÄNEname\meinAdminName                ----------->  wie oben 
     NT-AUTORITÄT\SYSTEM

Users logged on locally:
     NT-AUTORITÄT\LOKALER DIENST
     NT-AUTORITÄT\NETZWERKDIENST
     DOMÄNEname\meinName                          -----------> wie oben
     DOMÄNEname\meinAdminName                ----------->  wie oben 
     NT-AUTORITÄT\SYSTEM

Als ob der Script auf diese PC nicht zugreifen könnte....oder sind die Befehle in Batchdateien falsch???
Falls jemand Fehler sieht, schreibt mir bitte zurück!! Wäre nett ;)

Thx,

Schöne Grüsse

Content-ID: 62373

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

Ausgedruckt am: 23.11.2024 um 11:11 Uhr

bastla
bastla 26.06.2007 um 15:45:39 Uhr
Goto Top
Hallo FARYS!

Wenn Deine Batch-Datei wie beschrieben aussieht, ist das Ergebnis leicht zu erklären: Du übergibst zwar den Rechnernamen an das Unterprogramm (das, ganz nebenbei, nicht in einer eigenen Datei stehen muss bzw gar nicht nötig wäre), verwendest diesen aber dort nicht - die entscheidende Befehlszeile im Unterprogramm müsste lauten:
psloggedon -l -x \\%~1
Es sollte aber auch etwa so genügen:
del rechner-psloggedon.txt
for /f "delims=" %%i in ('type "rechner-list.txt"') do psloggedon -l -x \\%%i >> rechner-psloggedon.txt  
Etwas besser zu verwenden werden die Ergebnisse, wenn Du Unnötiges ausfilterst, zB mit
for /f "delims=" %%i in ('type "rechner-list.txt"') do psloggedon -l -x \\%%i|findstr /v "NT-AUTOR logged">> rechner-psloggedon.txt  

Grüße
bastla
FARYS
FARYS 26.06.2007 um 15:57:53 Uhr
Goto Top
hallo bastla!

danke schön für deine Antwort!! Es hat funktioniert!!
Ich bastle dann weiter, um meine Ergebnisse zu bekommen.

Übrigens: ich habe überhaupt keine Erfahrung mti Batchdeteien, das war so zusagen mein Debiut ;)..deswegen diese Fehler.

Grüsse
FARYS
FARYS
FARYS 27.06.2007 um 13:50:01 Uhr
Goto Top
so....das Ganze ist für mich komplizierter als ich dachte ;)
Vielleicht könntets Du (@bastla) oder j-d anders mir weiter helfen..

Jetzt wollte ich weiter in dieser Batchdatei (oder wenn es nötig in einer neuen) eine Abfrage durchführen, um aus der zweiten txt-datei ("rechner-psloggedon.txt") nur diese Werte (PCs) rausfiltern, wo NIEMAND eingeloggt ist und dann mit "psshutdown" diese Rechner herunterzufahren.
Ich vermute, es geht mit "if Errorlevel"-Abfrage, aber wie gesagt, da ich kein Programmierer bin, scheint das Ganze für mich zu verwirrend sein...;).

Wie sollte ich jetzt meine Befehle formulieren?

Und...ist es möglich, dass die Rechnernamen immer behalten werden?, d.h. ob sie in der "rechner-psloggedon.txt"-Datei neben den Ergebnissen (wer da eingeloggt ist) gezeigt werden? zurzeit werden die Rechnernamen gelöscht und nur die Ergebnisse gezeigt.

Danke für die Antworten!

Grüsse
farys
bastla
bastla 27.06.2007 um 14:36:20 Uhr
Goto Top
Hallo FARYS!

Der folgende Entwurf beinhaltet eine Kombination aus "Erstellung der Rechnerliste" und "Durchführen des Herunterfahrens", wobei anzumerken wäre, dass die Liste in diesem Fall eigentlich gar nicht benötigt würde, sondern anstelle des Eintragens in die Liste (nach "if not defined LoggedOn") auch gleich der "Shutdown"-Befehl stehen könnte ...
@echo off & setlocal
set "RechnerList=D:\Rechner-List.txt"  
set "ShutDownList=D:\Rechner-PsSLoggedOn.txt"  
if exist "%ShutDownList%" del "%ShutDownList%"  
for /f "delims=" %%i in ('type "%RechnerList%"') do call :ProcessComp "%%i"  
goto :ShutEmDown
:ProcessComp
ping %~1>nul || goto :eof
set LoggedOn=
for /f "delims=" %%u in ('psloggedon -l -x \\%~1^|findstr /v "NT-AUTOR logged"') do set LoggedOn=%%u  
if not defined LoggedOn echo %~1>>"%ShutDownList%"  
goto :eof
:ShutEmDown
if exist "%ShutDownList%" for /f "usebackq delims=" %%r in ("%ShutDownList%") do echo Shutdown \\%%r  
Das Herunterfahren wird durch die Ausgabe von "Shutdown \\Rechnername" nur simuliert - wenn alles klappt, anstelle des "echo Shutdown \\%%r" den eigentlichen Befehl (ob per "PsShutDown" oder per "shutdown.exe") platzieren.

Anmerkung: Du hast bis jetzt die Betriebssystemversion des Rechners, auf dem der Batch laufen soll, nicht genannt. Sollte es sich um W2000 handeln, müsste die Überprüfung der Erreichbarkeit eines Rechners über "ping" anders erfolgen, da der Errorlevel von W2000 nicht richtig gesetzt wird.

Grüße
bastla
FARYS
FARYS 02.07.2007 um 10:25:48 Uhr
Goto Top
hallo,

ich habe Deine Befehle wie sie oben stehen eingepflegt und diese Batchdatei ausgeführt (anstatt "echo shutdown \\%%r" habe ich psshutdown hinzugefügt). Leider bekomme ich überhaupt keine Ausgabe, oder besser gesagt die Befehle werden nicht ausgeführt = nachdem ich meine Batchdatei aufrufe, bekomme ich immer die Meldung:
"Das Gerät ist nicht bereit".

In welchem Zusammenhang könnte das auftreten? Hast Du schon mal was Ähnliches gehabt?
Sollte ich irgendwelche Freigaben auf den Remoterechnern einschalten?

Schöne Grüsse
FARYS
bastla
bastla 02.07.2007 um 13:52:05 Uhr
Goto Top
Hallo FARYS!

Ändere bitte einmal in der ersten Zeile das "@echo off" auf "@echo on" und führe den Batch von der Kommandozeile aus - dadurch kannst Du mitverfolgen, an welcher Stelle genau der Fehler auftritt.

Grüße
bastla
FARYS
FARYS 02.07.2007 um 15:09:39 Uhr
Goto Top
hi bastla!

Der Fehler tritt nach der Zeile:

for /f "delims=" %%i in ('type "%RechnerList%"') do call :ProcessComp "%%i"
Das Gerät ist nicht bereit.

..also als ob er den Befehl ":ProcessComp" nicht ausführen wollte.

Oder?
bastla
bastla 02.07.2007 um 15:17:52 Uhr
Goto Top
Hallo FARYS!

Sehen wir uns zur Sicherheit die %RechnerList% an - füge dazu die Zeile
type "%RechnerList%" & pause  
unmittelbar nach der Zeile set "RechnerList=..." ein, wobei das type "%RechnerList%" aus der for-Zeile kopiert sein sollte.

Grüße
bastla
FARYS
FARYS 02.07.2007 um 15:36:27 Uhr
Goto Top
Hier die Ausgabe nach der Änderung:
________________________________

Y:\admin\ordner1\ordner2>loggini.bat

Y:\admin\ordner1\ordner2>set "RechnerList=D:\Rechner-List.txt" type "" & pause
Drücken Sie eine beliebige Taste . . .

Y:\admin\ordner1\ordner2>set "ShutDownList=D:\Rechner-PsLoggedOn.txt"

Y:\admin\ordner1\ordner2>if exist "D:\Rechner-PsLoggedOn.txt" del "D:\Rechner-PsLoggedOn.txt"

Y:\admin\ordner1\ordner2>for /F "delims=" %i in ('type "D:\Rechner-List.txt" type ""') do call :ProcessComp "%i"
Das Gerät ist nicht bereit.

Y:\admin\ordner1\ordner2>goto :ShutEmDown

Y:\admin\ordner1\ordner2>if exist "D:\Rechner-PsLoggedOn.txt" for /F "usebackq delims=" %r in ("D:\Rechner-PsLoggedOn.txt") do psshutdown.exe
Y:\admin\ordner1\ordner2>


hmmm...ich habe type "%RechnerList%" & pause hinzugefügt
warum wird der Name : "%RechnerList%" in der Kommandozeile nicht angezeigt (also nur "")??
bastla
bastla 02.07.2007 um 15:40:42 Uhr
Goto Top
Hallo FARYS!

type "%RechnerList%" & pause  
muss in einer eigenen Zeile stehen - damit wird dann der Inhalt der Rechnerliste zur Kontrolle angezeigt ...

Grüße
bastla
FARYS
FARYS 18.07.2007 um 15:26:51 Uhr
Goto Top
Hallo,

bin wieder da.

Also....in meinem Script war ein Pfadfehler, deswegen habe ich immer diese Ausgabe "Das Gerät ist nicht bereit" bekommen. Nach der Korrektur spricht der Script in der "RechnerList" genannten PCs an
aber ...anstatt sie herunterzufahren (Remoterechner), führt er psshutdown auf dem lokalen (meinem) Rechner! ??????
Sollte ich pstools in einen konkreten Ordner auf den Remoterechnern installieren?? Muss man noch andere Einstellungen (Freigaben..) vornehmen??

Danke für Antworten!

farys
bastla
bastla 18.07.2007 um 15:43:41 Uhr
Goto Top
Hallo FARYS!

Den Rechnernamen musste Du schon mitgeben:
...
if exist "%RechnerList%" for /F "usebackq delims=" %%r in ("%RechnerList%") do psshutdown.exe <b>\\%%r</b>  

Grüße
bastla
FARYS
FARYS 18.07.2007 um 16:10:08 Uhr
Goto Top
;);););););)......was man alleine übersehen kann!!!;)

VIELEN DANK! bastla!