Bat Script Probleme bei Sonderzeichen
hi @all,
habe ein bat script geschrieben mit dem ich alle PC's in meinem Netzwerk schnell und bequem das pw änder lasse, doch wenn ich nun pw's mit sonderzeichen (in meinem Fall "&") wird der eintrag an diesem Zeichen ("&") natürlich im bat script in viele fetzen gerissen.
Ergebnis das script schmiert natürlich ab. habt ihr ne Idee?
REM Die Variablen
REM -------------------
set logfile=logfile.txt
set iplist=iplist.txt
set passfile=passwort.bat
REM -------------------
REM Ab hier nichtsmehr ändern!
REM -------------------
@echo off
cls
set /p username=Benutzernamen eingeben:
set /p passwort=Benutzer Kenwort eingeben:
goto 3
:1
cls
echo Leider ist das neue Kennwort nicht identisch!
:3
echo Bitte noch keine Sonderzeichen verwenden.
set /p newpassword=neues Kennwort eingeben:
set /p newpassword2=Bitte wiederholen Sie das neue Kennwort:
IF NOT "%newpassword%"=="%newpassword2%" (
goto 1 ) ELSE ( goto 2 )
:2
echo moechten Sie die PC's danach neustarten herunterfahren oder anlassen?
set /p sys=0 fuer anlassen, 1 fuer Neustart, 2 fuer Herunterfahren:
IF NOT "%sys%"=="0" (
set /p comment=Kommentar fuer den Neustart/Herunterfahren?:
set /p sek=Zeit bis der Neustart/Herunterfahren wirkt in sek.: )
echo alle Variablen sind jetzt komplett, um zu beginnen.
echo Druecken Sie bitte ENTER
echo net user %username% %newpassword% >> c:\%passfile%
echo Scan Ergebnisse vom %date%, %time% >> %logfile%
echo ............................................................... >> %logfile%
echo I >> %logfile%
pause > NUL
FOR /F %%i in (%iplist%) do (
ping -n 1 %%i | find "Antwort" >> nul ) && (
NET USE \\%%i\IPC$ /USER:"%username%" "%passwort%" > NUL
copy c:\%passfile% \\%%i\c$\ > NUL
cmd /c PSEXEC \\%%i -u "%username%" -p "%passwort%" C:\%passfile% > NUL
DEL \\%%i\c$\%passfile% > nul
IF "%sys%"=="0" ( goto 4 )
IF "%sys%"=="1" (
cmd /c SHUTDOWN -m \\%%i -t "%sek%" -c "%comment%" -f -r > NUL
) ELSE (cmd /c SHUTDOWN -m \\%%i -t "%sek%" -c "%comment%" -f -s > NUL)
:4
NET USE \\%%i\IPC$ /D > nul
echo [ %%i ] ERFOLGREICH [ Zumindest sollte es]
echo I [ %%i ] ERFOLGREICH [ Zumindest sollte es] >> %logfile%
echo I [ %%i ] GESCHEITERT -!- [Offline] >> %logfile% )
)
del c:\%passfile%
echo I >> %logfile%
echo ............................................................... >> %logfile%
echo. >> %logfile%
echo. >> %logfile%
echo. >> %logfile%
echo.
echo.
cls
echo Script beendet! %iplist% verarbeitet. Die Logfile: %logfile% liegt zur auswertung bereit.!
pause > nul
habe ein bat script geschrieben mit dem ich alle PC's in meinem Netzwerk schnell und bequem das pw änder lasse, doch wenn ich nun pw's mit sonderzeichen (in meinem Fall "&") wird der eintrag an diesem Zeichen ("&") natürlich im bat script in viele fetzen gerissen.
Ergebnis das script schmiert natürlich ab. habt ihr ne Idee?
REM Die Variablen
REM -------------------
set logfile=logfile.txt
set iplist=iplist.txt
set passfile=passwort.bat
REM -------------------
REM Ab hier nichtsmehr ändern!
REM -------------------
@echo off
cls
set /p username=Benutzernamen eingeben:
set /p passwort=Benutzer Kenwort eingeben:
goto 3
:1
cls
echo Leider ist das neue Kennwort nicht identisch!
:3
echo Bitte noch keine Sonderzeichen verwenden.
set /p newpassword=neues Kennwort eingeben:
set /p newpassword2=Bitte wiederholen Sie das neue Kennwort:
IF NOT "%newpassword%"=="%newpassword2%" (
goto 1 ) ELSE ( goto 2 )
:2
echo moechten Sie die PC's danach neustarten herunterfahren oder anlassen?
set /p sys=0 fuer anlassen, 1 fuer Neustart, 2 fuer Herunterfahren:
IF NOT "%sys%"=="0" (
set /p comment=Kommentar fuer den Neustart/Herunterfahren?:
set /p sek=Zeit bis der Neustart/Herunterfahren wirkt in sek.: )
echo alle Variablen sind jetzt komplett, um zu beginnen.
echo Druecken Sie bitte ENTER
echo net user %username% %newpassword% >> c:\%passfile%
echo Scan Ergebnisse vom %date%, %time% >> %logfile%
echo ............................................................... >> %logfile%
echo I >> %logfile%
pause > NUL
FOR /F %%i in (%iplist%) do (
ping -n 1 %%i | find "Antwort" >> nul ) && (
NET USE \\%%i\IPC$ /USER:"%username%" "%passwort%" > NUL
copy c:\%passfile% \\%%i\c$\ > NUL
cmd /c PSEXEC \\%%i -u "%username%" -p "%passwort%" C:\%passfile% > NUL
DEL \\%%i\c$\%passfile% > nul
IF "%sys%"=="0" ( goto 4 )
IF "%sys%"=="1" (
cmd /c SHUTDOWN -m \\%%i -t "%sek%" -c "%comment%" -f -r > NUL
) ELSE (cmd /c SHUTDOWN -m \\%%i -t "%sek%" -c "%comment%" -f -s > NUL)
:4
NET USE \\%%i\IPC$ /D > nul
echo [ %%i ] ERFOLGREICH [ Zumindest sollte es]
echo I [ %%i ] ERFOLGREICH [ Zumindest sollte es] >> %logfile%
)
del c:\%passfile%
echo I >> %logfile%
echo ............................................................... >> %logfile%
echo. >> %logfile%
echo. >> %logfile%
echo. >> %logfile%
echo.
echo.
cls
echo Script beendet! %iplist% verarbeitet. Die Logfile: %logfile% liegt zur auswertung bereit.!
pause > nul
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 23541
Url: https://administrator.de/contentid/23541
Ausgedruckt am: 26.11.2024 um 16:11 Uhr
7 Kommentare
Neuester Kommentar
Moin nEmEsIs,
schade, das wollte ich mir alles für mein Batch-Tut IV aufheben, aber egal...
...dann kennen die Syntax in 10 Minuten halt doppelt so viele Leute wie vorher.. *gg
Du musst dieses Sonderzeichen "&" ja im Batch maskieren, weil es für die CMD.exe auch ein Steuerzeichen ist.
Maskieren geht mit "^" vor dem Zeichen - so weit würde man/frau ja auch mit M$-Hilfe kommen.
Wenn dieser String mit Steuerzeichen allerdings noch mehrfach "weitergereicht" (noch mal in einer %Variable% verpackt und aufgelöst) wird, dann:
...muss auch die Maskierung maskiert werden (nein, ich habe keinen an der Waffel, ich zeigs mal).
Ich turn es mal am CMD-Prompt vor:
$cmd$ set /P pass1="Bitte Passwort eingeben: "
Bitte Passwort eingeben: Dies&Das
D:\temp>
$cmd$ set pass1
pass1=Dies&Das
...
Wenn dieser String in der Variablen %pass1% möglicherweise ein Ampersand ("&") enthalten können darf, dann maskieren:
$cmd$set xpass1=%pass1:&=^^^&%
(-----> übersetzt in etwa: "Ersetze das Zeichen "&" durch ein "^&". Da aber "^" auch ein Steuerzeichen ist, muss ich das maskieren.)
D:\temp>
$cmd$ set xpass1
xpass1=Dies^&Das
$cmd$ echo net use username %xpass1%
net use username Dies&Das
Ich denke, das reicht Dir, um das umzusetzen - Dein Batchschnipsel hat ja schon gewisse Reife...
Gruß Biber
schade, das wollte ich mir alles für mein Batch-Tut IV aufheben, aber egal...
...dann kennen die Syntax in 10 Minuten halt doppelt so viele Leute wie vorher.. *gg
Du musst dieses Sonderzeichen "&" ja im Batch maskieren, weil es für die CMD.exe auch ein Steuerzeichen ist.
Maskieren geht mit "^" vor dem Zeichen - so weit würde man/frau ja auch mit M$-Hilfe kommen.
Wenn dieser String mit Steuerzeichen allerdings noch mehrfach "weitergereicht" (noch mal in einer %Variable% verpackt und aufgelöst) wird, dann:
...muss auch die Maskierung maskiert werden (nein, ich habe keinen an der Waffel, ich zeigs mal).
Ich turn es mal am CMD-Prompt vor:
$cmd$ set /P pass1="Bitte Passwort eingeben: "
Bitte Passwort eingeben: Dies&Das
D:\temp>
$cmd$ set pass1
pass1=Dies&Das
...
Wenn dieser String in der Variablen %pass1% möglicherweise ein Ampersand ("&") enthalten können darf, dann maskieren:
$cmd$set xpass1=%pass1:&=^^^&%
(-----> übersetzt in etwa: "Ersetze das Zeichen "&" durch ein "^&". Da aber "^" auch ein Steuerzeichen ist, muss ich das maskieren.)
D:\temp>
$cmd$ set xpass1
xpass1=Dies^&Das
$cmd$ echo net use username %xpass1%
net use username Dies&Das
Ich denke, das reicht Dir, um das umzusetzen - Dein Batchschnipsel hat ja schon gewisse Reife...
Gruß Biber
Moin nEmEsIs,
soooo schlimm war es nun auch nicht mit dem vorgezogenen Tutorial-Absatz - so war es wenigstens (hoffentlich) für jemand von Nutzen.
Zu Deiner Frage "kennst jemand alle zeichen wie & die von der cmd dann umgesetzt würden?":
Ich fürchte, das wirst Du nur durch probieren herausfinden können, aber das ist ja relativ einfach.
Du kannst alle theoretisch erlaubten Sonderzeichen für Passworte ja per "SET" in Variable packen und wieder ausgeben lassen, wie in dem obigen Schnipsel von mir.
Umlaute oder Zeichen, die nicht auf allen Codepages vorhanden sind, musst Du ohnehin weglassen - so viel bleibt also nicht über.
Zu den Zeichen, die unter dem CMD "maskiert" werden müssen, gehören sicher: Runde und spitze Klammern, arithmetische Operatoren, die logischen Operatoren für UND und ODER, das Prozentzeichen, das Gleichheitszeichen sowie das Komma.
Gruß Biber
P.S. Wenn Du keine Einwände hast, verschieben wir Deinen Beitrag mal von "Betriebssysteme" nach "Batch & Shell".
soooo schlimm war es nun auch nicht mit dem vorgezogenen Tutorial-Absatz - so war es wenigstens (hoffentlich) für jemand von Nutzen.
Zu Deiner Frage "kennst jemand alle zeichen wie & die von der cmd dann umgesetzt würden?":
Ich fürchte, das wirst Du nur durch probieren herausfinden können, aber das ist ja relativ einfach.
Du kannst alle theoretisch erlaubten Sonderzeichen für Passworte ja per "SET" in Variable packen und wieder ausgeben lassen, wie in dem obigen Schnipsel von mir.
Umlaute oder Zeichen, die nicht auf allen Codepages vorhanden sind, musst Du ohnehin weglassen - so viel bleibt also nicht über.
Zu den Zeichen, die unter dem CMD "maskiert" werden müssen, gehören sicher: Runde und spitze Klammern, arithmetische Operatoren, die logischen Operatoren für UND und ODER, das Prozentzeichen, das Gleichheitszeichen sowie das Komma.
Gruß Biber
P.S. Wenn Du keine Einwände hast, verschieben wir Deinen Beitrag mal von "Betriebssysteme" nach "Batch & Shell".
Moin nEmEsIs,
Na, frag doch mal hier im Forum rum, ob mir schon mal die Ideen ausgegangen sind ..
Ich hatte je das Beispiel mit der "maskierten Maskierung am CMD-Prompt durchgespielt.
Wenn der "Net use" von einem Batch aufgerufen wird, ist es noch eine Maskierungsebene mehr.
Denn in der erzeugten Batch-Datei muss ja drinstehen
..damit tatsächlich ausgeführt wird, was Du meinst, nämlich...
Andernfalls tritt der von Dir beschreibene Effekt auf: das "&"-Zeichen wird als "logisches UND" interpretiert.. also führe den Befehl "Net use testuser 1" aus UND den Befehl "1" UND den Befehl "2" UND den Befehl "3" UND...
Also zurück..von hinten aufgerollt. Du willst als Net-Use-Aufruf mit Parameter haben:
Na ja, so weit die Skizze... ich hab es (das Prinzip) zwar eben am CMD-Prompt an-, aber nicht zu Ende getestet.
Die Zeilen von "var=...." bis " ..." sind aber schon vom Bildschirm kopiert.
Alternativen:
- die Benutzung von "&" in diesen Passworten verbieten
- oder eine andere Form der Passworterfassung - Suche mal in Beiträgen von fpschultze hier im Forum.
Der hat bei einem Beitrag "Batch: Passwort verdeckt eingeben" eine pragmatischere Lösung.
BTW...willst Du jetzt ein
- "Net use"/Laufwerke mappen machen oder
- "Net user" / neue Benutzerpassworte setzen?
Oben stehen beide Varianten, deshalb die Rückfrage.
Grüße Biber
P.S. Für diese IsNumeric-Funktion mach bitte einen neuen Beitrag auf in "Batch und Shell".
Da gibt es keine Standard-Funktion, da müssen eine Handvoll Zeilen *.bat geschrieben werden und ist auch ein anderes Thema.
hast dafür noch ne idee?
Ich hatte je das Beispiel mit der "maskierten Maskierung am CMD-Prompt durchgespielt.
Wenn der "Net use" von einem Batch aufgerufen wird, ist es noch eine Maskierungsebene mehr.
Denn in der erzeugten Batch-Datei muss ja drinstehen
net user testuser 1^&^2^&3^&4
net user testuser 1&2&3&4
C:\>net user testuser 1 & 2 & 3 & 4 <i>...wie Du geschrieben hast, oder, in anderer Schreibweise wäre das:</i>
(net user testuser 1) & (2) & (3) & (4) <i>... so versteht es der/die CMD.exe.</i>
:: Step 0)
net user testuser 1&2&3&4
::
:: Dann musst Du in der erzeugten *.Bat stehen haben:
:: Step -1)
net user testuser 1^&2^&3^&4
::
:: Dann muss der echo-Befehl im Batch davor schreiben:
:: Step -2)
echo net user testuser 1^^^&2^^^&3^^^&4
::
:: Also muss Deine Ersetze-Mir-Jedes-&-Zeichen ungefähr so aussehen:
var=1&2&3&4
set xvar=%var:&=^^^^^^^&%
$cmd$set xv
xvar=1^^^&2^^^&3^^^&4
...
Die Zeilen von "var=...." bis " ..." sind aber schon vom Bildschirm kopiert.
Alternativen:
- die Benutzung von "&" in diesen Passworten verbieten
- oder eine andere Form der Passworterfassung - Suche mal in Beiträgen von fpschultze hier im Forum.
Der hat bei einem Beitrag "Batch: Passwort verdeckt eingeben" eine pragmatischere Lösung.
BTW...willst Du jetzt ein
- "Net use"/Laufwerke mappen machen oder
- "Net user" / neue Benutzerpassworte setzen?
Oben stehen beide Varianten, deshalb die Rückfrage.
Grüße Biber
P.S. Für diese IsNumeric-Funktion mach bitte einen neuen Beitrag auf in "Batch und Shell".
Da gibt es keine Standard-Funktion, da müssen eine Handvoll Zeilen *.bat geschrieben werden und ist auch ein anderes Thema.
Jau, nEmEsIs,
ich denke schon, dass dieser Beitrag in "Batch und Shell" besser reinpasst als in "Betriebssysteme".
a) Einen formalen Tipp noch zur Lesbarkeit:
Statt:
IF NOT EXIST %iplist% ( goto create
) ELSE ( echo moechten Sie eine neue IP Liste erstellen oder die Aktuell Liste verwenden?
set /p createip=1 = erstellen / 2 = Aktuelle verwenden:
)
IF "%createip%" EQU "1" ( goto create )
IF "%createip%" EQU "2" ( goto ipnow
) ELSE ( goto wrongip )
besser:
IF NOT EXIST %iplist% goto create
echo moechten Sie eine neue IP Liste erstellen oder die Aktuell Liste verwenden?
set /p createip=1 = erstellen / 2 = Aktuelle verwenden:
IF "%createip%" EQU "1" goto create
IF "%createip%" EQU "2" goto ipnow
goto wrongip
.. ist kürzer und weniger tippfehlerträchtig IMO.
b) und der Fairness halber (so gerne ich Bätchelchen zusammenbrate)
Es gibt auch CMD-Line-Tools zum ändern des User-Passworts. Die natürlich dann "pwchange.exe" oder "changepw.exe" heißen.
Sollten über Suchmaschinen zu finden sein.
Eventuell kannst Du mit so einem Utility diesen Aufruf:
"cmd /c PSEXEC \\%%i -u %username% -p %passwort% C:\%passfile%.bat > NUL"
durch einen direkteren Aufruf (ohne Zwischenbatch) ersetzen.
Bzw. ginge das an dieser Stelle nicht ohnehin ohne Temp-Batch??
PSEXEC \\%%i -u %username% -p %passwort% net user %username% %newpasswort% > NUL
Laut PsExec-Syntax kannst Du Parameter einfach mitgeben. Evtl noch den (Server-)Pfad vor die Net.exe.
Oder übersehe ich etwas?
Grübelnd
Biber
ich denke schon, dass dieser Beitrag in "Batch und Shell" besser reinpasst als in "Betriebssysteme".
a) Einen formalen Tipp noch zur Lesbarkeit:
Statt:
IF NOT EXIST %iplist% ( goto create
) ELSE ( echo moechten Sie eine neue IP Liste erstellen oder die Aktuell Liste verwenden?
set /p createip=1 = erstellen / 2 = Aktuelle verwenden:
)
IF "%createip%" EQU "1" ( goto create )
IF "%createip%" EQU "2" ( goto ipnow
) ELSE ( goto wrongip )
besser:
IF NOT EXIST %iplist% goto create
echo moechten Sie eine neue IP Liste erstellen oder die Aktuell Liste verwenden?
set /p createip=1 = erstellen / 2 = Aktuelle verwenden:
IF "%createip%" EQU "1" goto create
IF "%createip%" EQU "2" goto ipnow
goto wrongip
.. ist kürzer und weniger tippfehlerträchtig IMO.
b) und der Fairness halber (so gerne ich Bätchelchen zusammenbrate)
Es gibt auch CMD-Line-Tools zum ändern des User-Passworts. Die natürlich dann "pwchange.exe" oder "changepw.exe" heißen.
Sollten über Suchmaschinen zu finden sein.
Eventuell kannst Du mit so einem Utility diesen Aufruf:
"cmd /c PSEXEC \\%%i -u %username% -p %passwort% C:\%passfile%.bat > NUL"
durch einen direkteren Aufruf (ohne Zwischenbatch) ersetzen.
Bzw. ginge das an dieser Stelle nicht ohnehin ohne Temp-Batch??
PSEXEC \\%%i -u %username% -p %passwort% net user %username% %newpasswort% > NUL
Laut PsExec-Syntax kannst Du Parameter einfach mitgeben. Evtl noch den (Server-)Pfad vor die Net.exe.
Oder übersehe ich etwas?
Grübelnd
Biber