speedy26gonzales
Goto Top

Hex in Dez umwandeln innerhalb einer Batchdatei, SAFER HASH-Regeln erstellen

Hallo,

kann mir einer sagen wie ich innerhalb einer Batchdatei ein in einer Variablen stehender Dezimal Wert von >DEZ in HEX< umwandeln kann?

Content-ID: 194418

Url: https://administrator.de/forum/hex-in-dez-umwandeln-innerhalb-einer-batchdatei-safer-hash-regeln-erstellen-194418.html

Ausgedruckt am: 22.12.2024 um 13:12 Uhr

bastla
bastla 17.11.2012 um 16:01:09 Uhr
Goto Top
Hallo speedy26gonzales!

Damit Du nicht selbst (nach "dec to hex batch") suchen musst: http://www.dostips.com/DtTipsArithmetic.php

Grüße
bastla
rubberman
rubberman 17.11.2012 aktualisiert um 16:13:21 Uhr
Goto Top
Hallo speedy26gonzales und bastla.

Wie immer - viele Wege führen nach Rom.

@echo off &setlocal
set /a num = 123

cmd /c exit /b %num%
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i"  

echo %hex%
pause

Grüße
rubberman
bastla
bastla 17.11.2012 um 18:43:06 Uhr
Goto Top
Hallo rubberman!

Sehr hybsch ... face-smile

Wie bist Du auf
"%=ExitCode%"
gekommen?

Grüße
bastla
rubberman
rubberman 17.11.2012 um 19:34:38 Uhr
Goto Top
[OT]
Hallo bastla.

Hab ich gelegentlich gelesen (vieles von @jeb-the-batcher, auch in anderen Foren). Variablen beginnend mit = sind CMD-intern. Du hast keine Chance sie per SET Befehl zu ändern und im Normalfall siehst du sie auch nicht. Mittels SET; machst sie letztlich aber doch sichtbar.

@echo off &setlocal
cd /d C:\Windows
cd /d D:\
cmd /c exit /b 65
set; | findstr /b "="  
=::=::\
=C:=C:\Windows
=D:=D:\
=ExitCode=00000041
=ExitCodeAscii=A
Was in der ersten Zeile erscheint, habe ich noch nicht herausgefunden.
Auf LW C: war ich zuletzt auf C:\Windows, Auf LW D: zuletzt im Root.
Nun kommt der "Errorlevel" als HEX Wert, dann als ASCII Zeichen (sofern er sich als druckbares Standard-ASCII Zeichen darstellen lässt).

Grüße
rubberman
[/OT]
speedy26gonzales
speedy26gonzales 17.11.2012 aktualisiert um 21:45:44 Uhr
Goto Top
Hi,

ich wunderte mich dass ich keine Antwort bekam und hab jetzt bemerkt dass die Mails mal wieder im SPAM landeten face-sad

Ich hab jetzt durch die weitere Suche hier mal was zusammengebastelt:

REM DEZ in HEX Umrechnung
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F"  

set /a Dez = %FILESIZE%
set /a Rest=Dez
set "Hex="  

:LoopDezHex
if %Rest%==0 goto :MAKEREG
set /a Ziffer=Rest%%16
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%"  
set "Hex=%Ziffer%%Hex%"  
set /a Rest=Rest/16
goto :LoopDezHex
Funktioniert soweit auch, bin allerdings gleich auf das nächste Problem gestoßen. Ich brauche den Wert um einen Registrywert vom Typ: REG_QWORD zu schreiben. Jetzt frag ich mich, wie ich denn diese Formatierung hinbekomme. Mit "reg add" kann ich ja einen Schlüssel erstellen aber der schreibt ihn ja direkt in die Registry.

Als Hintergrund: Mein Script soll bestimmte Verzeichnisse (die später eingestellt werden sollen) nach bestimmten Dateiendungen (später auch einstellbar) suchen und daraus sogenannte "SAFER - REGELN" erstellen und dann in die Registry schreiben. So sieht mein Programm derzeit aus:

REM Programm durchsucht das komplette Laufwerk nach *.EXE Dateien
@ECHO OFF
REM Skript wird in UniCode geschrieben
ECHO Windows Registry Editor Version 5.00 > "safer.reg"  
ECHO. >> "safer.reg"  
REM Durchsucht das angegebene Laufwerk nach *.Exe Dateien und bei jeder gefundenen Datei ruft er das Unterprogramm auf
FOR /R "%SystemDrive%" %%I IN ("*.exe") DO CALL :MAKERULE "%%I"   
CALL :CLEAN
EXIT /B

:MAKERULE
REM Schreibe Pfadname
SET FILEPATH=%~1
SET FILESIZE=%~z1
SET FILENAME=%~n1
REM Erstelle eine GUID
cscript.exe //NoLogo uuid.vbs > "GUID.txt"  
SET /P GUID=<GUID.txt
REM Erstelle einen sha1 - HASH
fciv.exe -add "%~1" -sha1 > "HASH.txt"  
FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a)  

REM DEZ in HEX Umrechnung
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F"  

set /a Dez = %FILESIZE%
set /a Rest=Dez
set "Hex="  

:LoopDezHex
if %Rest%==0 goto :MAKEREG
set /a Ziffer=Rest%%16
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%"  
set "Hex=%Ziffer%%Hex%"  
set /a Rest=Rest/16
goto :LoopDezHex

REM echo Hexadezimal: %Hex%

REM CALL :MAKEREG
REM GOTO :EOF

:MAKEREG
ECHO. >> "safer.reg"  
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\%GUID%] >> "safer.reg"  
REM TODO: Auslesen der letzten Dateiaenderung und anpassen des Formats (xx,xx,xx,xx...)
ECHO >> "safer.reg" "LastModified"=hex(b):   
REM TODO: Anpassung der Beschreibung
ECHO >> "safer.reg" "Description"="%FILEPATH%"   
REM TODO: Bessere Benennung des FriendlyName
ECHO >> "safer.reg" "FriendlyName"="%FILENAME%"   
REM Zu "SaferFlags" existiert keine Doku, Wert immer 0  
ECHO >> "safer.reg" "SaferFlags"=dword:00000000   
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD
ECHO >> "safer.reg" "ItemSize"=hex(b):%Hex%   
REM Aufsplitten des Hashs in Zweiergruppen
ECHO >> "sha1.txt" "ItemData"=hex:%HASH%   
ECHO >> "safer.reg" "ItemData"=hex:%HASH:~0,2%,%HASH:~2,2%,%HASH:~4,2%,%HASH:~6,2%,%HASH:~8,2%,%HASH:~10,2%,%HASH:~12,2%,%HASH:~14,2%,%HASH:~16,2%,%HASH:~18,2%,%HASH:~20,2%,%HASH:~22,2%,%HASH:~24,2%,%HASH:~26,2%,%HASH:~28,2%,%HASH:~30,2%,%HASH:~32,2%,%HASH:~34,2%,%HASH:~36,2%,%HASH:~38,2%  
REM Hash Algorithmus wird auf SHA1 gesetzt: 0x8003 (32771) = MD5, 0x8004 (32772) = SHA1
ECHO >> "safer.reg" "HashAlg"=dword:00008004   
ECHO. >> "safer.reg"  
GOTO :EOF

:CLEAN
del GUID.txt
del HASH.txt
GOTO :EOF

Vielleicht könnt Ihr mir hier auch etwas weiterhelfen bei meinen noch offenen Punkten?
rubberman
rubberman 18.11.2012 um 01:00:11 Uhr
Goto Top
Hallo speedy26gonzales.

Ein REG_QWORD ist letztlich ein 64 Bit breiter Ganzahlwert. Mit einem Hex-String kommst du für REG ADD und Batch schon mal um einiges weiter. Testen kannst du ja in einem dafür angelegten Key, den du anschließend wieder löscht.
Beispiel:
set "strHex=FFFFFFFFFFFFFFFF"  
reg add "HKCU\test" /v "test_value" /t REG_QWORD /d "0x%strHex%" /f  
In strHex findet sich dein Hex String (im Beispiel der für den größtmöglichen Wert). Für REG ADD musst du noch ein 0x davor setzen.

Grüße
rubberman
speedy26gonzales
speedy26gonzales 18.11.2012 aktualisiert um 01:14:58 Uhr
Goto Top
Ich hab das mit dem "reg add" heute schon mal angeschaut. Allerdings ist es doch so, dass dieser Befehl direkt in die Registry schreibt. Ich aber in meinem Skript erstmal alles in eine eigene *.reg Datei schreiben lasse und dann wenn alle Dateien gescannt wurden in die Registry übertrage.

Ander wie über "reg add" geht es nicht über ne Batch?
Und wie kann ich die Ausgabe in meine Datei umleiten?
rubberman
rubberman 18.11.2012 aktualisiert um 01:59:56 Uhr
Goto Top
Hallo speedy26gonzales.

Ein kurzer Test macht das klar.
Wenn du einen REG_QWORD Wert exportierst, siehst du wie es aussehen muss.
"test_value"=hex(b):ef,cd,ab,90,67,56,34,12
Hier wird der Wert 0x1234567890ABCDEF repräsentiert. Das niedrigste Byte steht also am Anfang. Es sind immer alle 8 Bytes anzugeben
Für deinen Batch bedeutet das, du musst den Hex String ggf. mit vorangestellten Nullen auf 16 Stellen erweitern und ihn dann in Zweiersteps von hinten nach vorn in der Ausgabe arrangieren.

Beispiel:
set "strHex=A1B2AF"  

set "strHex=0000000000000000%strHex%"  
set "strHex=%strHex:~-16%"  

>>"test.reg" echo "test_value"=hex(b):%strHex:~-2%,%strHex:~-4,2%,%strHex:~-6,2%,%strHex:~-8,2%,%strHex:~-10,2%,%strHex:~-12,2%,%strHex:~-14,2%,%strHex:~,2%  

Grüße
rubberman
speedy26gonzales
speedy26gonzales 19.11.2012 aktualisiert um 15:56:03 Uhr
Goto Top
Zitat von @rubberman:
> set "strHex=A1B2AF" -> Hier wird ein Hexwert gesetzt  
> 
> set "strHex=0000000000000000%strHex%" -> Hier wird mit 16 Nullen aufgefüllt und daran der Hexwert von oben gehängt.  
> set "strHex=%strHex:~-16%" -> Der Hexwert wird auf 16 Stellen begrenzt, somit werden überflüssige Nullen gestrichen. Wie genau funktioniert das hier? Eigentlich sollte dort doch im Moment drin stehen z.B.: 0000000000000000FFFFF, bedeutet er macht von hinten -16 Stellen und schneidet den Rest weg? Also: 00000000000FFFFF  
> 
> >>"test.reg" echo -> Erstellt die Datei "test.reg"  
> "test_value"=hex(b):%strHex:~-2%,%strHex:~-4,2%,%strHex:~-6,2%,%strHex:~-8,2%,%strHex:~-10,2%,%strHex:~-12,2%,%strHex:~-14,2%,%strHex:~,2%  -> Schreibt den umgewandelten Wert in die vorher erstellte Datei. Wie genau macht er das?  -> Das Minus bedeutet er fängt von hinten an?   

> 
Hi rubberman,

Danke erst mal. Ich habe deinen Code mal eingebaut und es scheint wirklich zu gehen face-smile. Kannst Du mir den Code noch etwas genauer erklären? Wie das ganze denn funktioniert. Ich habe mal ein paar Kommentare geschrieben wie ich es soweit verstehe. Bitte mal ergänzen oder verbessern.

Meine jetzige Programmerweiterung:
REM DEZ in HEX Umrechnung
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F"  

set /a Dez = %FILESIZE%
set /a Rest=Dez
set "Hex="  

:WandlungDezHex
if %Rest%==0 goto :HEXCONVERT
set /a Ziffer=Rest%%16
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%"  
set "Hex=%Ziffer%%Hex%"  
set /a Rest=Rest/16
goto :WandlungDezHex

:HEXCONVERT
set "strHex=%Hex%"  

set "strHex=0000000000000000%strHex%"  
set "strHex=%strHex:~-16%"  
Ausgabe:
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD
ECHO >> "safer.reg" "ItemSize"=hex(b):%strHex:~-2%,%strHex:~-4,2%,%strHex:~-6,2%,%strHex:~-8,2%,%strHex:~-10,2%,%strHex:~-12,2%,%strHex:~-14,2%,%strHex:~,2%   
rubberman
rubberman 19.11.2012 aktualisiert um 17:37:49 Uhr
Goto Top
Hallo speedy26gonzales.

Wenn du dir die Hilfe zu SET ansiehst (SET /?), wirst du die passenden Erklärungen finden.
Zuerst werden 16 Nullen deinem Hex String vorangestellt. Um auf die exakte Länge von 16 Stellen insgesamt zu kommen, werden im Nachgang per %strHex:~-16% nur die letzten 16 Stellen des Variablenwertes wieder der Variablen zugewiesen. Der Rest funktioniert genauso.
  • %strHex:~-2% - die letzten beiden Zeichen
  • %strHex:~-4,2% - die ersten beiden Zeichen der letzten 4.
  • ...
  • %strHex:~,2% - die ersten beiden Zeichen des Strings (auch als %strHex:~0,2% falls es so deutlicher wird)

BTW: Sowohl bastlas Link, als auch mein und dein Lösungsweg zur Erstellung des Hex Strings funktioniert nur mit Zahlen, die die CMD auch als Zahlenwert verarbeiten kann. Im Klartext bedeutet das, ein ganzzahliger vorzeichenbehafteter Wert mit max. 32 Bit Breite (-2147483648 bis 2147483647). Dateien können aber gerne mal größer sein und auch ein REG_QWORD ist dafür gemacht einen nicht-vorzeichenbehafteten ganzahligen Wert von 64 Bit Breite (bis 18446744073709551615) anzunehmen. Dafür brauchst du aber eine Sonderbehandlung. Batch kann damit nur schrittweise rechnen.

Dieser Algorithmus aus Stringmanipulation und bitweiser Arithmetik könnte das und gibt dir auch gleich einen 16-stelligen Hex String aus:
@echo off &setlocal

set "strBigint=18446744073709551615"  
:: set "strBigint=1311768467294899695" 
:: set "strBigint=15" 

setlocal EnableDelayedExpansion
set "strHex="  
set "strPool=0123456789ABCDEF"  
set "strBigint=00000000000000000000%strBigint%"  
for /f "tokens=* delims=0" %%i in ("%strBigint:~-20,5%") do set "int4=%%i" &if not defined int4 set "int4=0"  
for /f "tokens=* delims=0" %%i in ("%strBigint:~-15,5%") do set "int3=%%i" &if not defined int3 set "int3=0"  
for /f "tokens=* delims=0" %%i in ("%strBigint:~-10,5%") do set "int2=%%i" &if not defined int2 set "int2=0"  
for /f "tokens=* delims=0" %%i in ("%strBigint:~-5%")    do set "int1=%%i" &if not defined int1 set "int1=0"  
for /l %%i in (1,1,16) do (
    set /a "int3 += (int4 & 15) * 100000 , int4 >>= 4"  
    set /a "int2 += (int3 & 15) * 100000 , int3 >>= 4"  
    set /a "int1 += (int2 & 15) * 100000 , int2 >>= 4"  
    set /a "x = int1 & 15 , int1 >>= 4"  
    for %%j in (!x!) do set "strHex=!strPool:~%%j,1!!strHex!"  
)
endlocal &set "strHex=%strHex%"  

echo %strHex%

pause

Grüße
rubberman
speedy26gonzales
speedy26gonzales 19.11.2012 um 21:29:48 Uhr
Goto Top
Hi Rubber,

Danke für die Antwort.
Die Lösung wo ich im Moment eingebaut habe würde ja Dateien bis 256 MB verarbeiten können. Das Vorzeichen bringt mir ja rein gar nix weil der Speicher nicht negativ benutzt werden kann face-smile
Bedeutet dein letzter Post dass ich eher die Lösung als die vorher eingebaut nutzen soll?
rubberman
rubberman 19.11.2012 um 21:46:42 Uhr
Goto Top
Hallo speedy26gonzales.

Solange du von ein paar hundert MB redest, ist alles OK. Und dass du mit negativen Zahlenwerten nichts anfangen kannst, war mir klar. Darum auch mein Vorschlag, zugleich nur im positiven Bereich zu arbeiten, den Bereich auszuschöpfen den das REG_QWORD bietet und ohne Umschweife einen 16-stelligen Hex String zu bekommen.
Dass du dich damit bei den möglichen Dateigrößen im Exabyte Bereich bewegst und das sicher etwas overkill ist, ist mir bewusst. Andererseits bist du auf der sicheren Seite.

Grüße
rubberman
speedy26gonzales
speedy26gonzales 19.11.2012 um 22:04:38 Uhr
Goto Top
Ich werde morgen mal die "große" Variante einbauen.
Hab derzeit irgendwie noch ein anderes Problem:
Das Skript will auf meinem virtuellen Testsystem mit WindowsXP nicht laufen. Er durchsucht nur den Ordner aus dem ich es starte und findet dort nur die fciv.exe. Dann beendet er es? Ich hab keine Ahnung warum. Unter Windows7 läuft er zumindest die ganzen Ordner unter C:\ durch. Endsystem soll WindowsXP erst mal sein. Später evtl. dann Windows7.

So sieht derzeit das Skript aus:

REM Programm durchsucht das komplette Laufwerk nach *.EXE Dateien
@echo off & setlocal
REM Skript wird in ANSI geschrieben
ECHO Windows Registry Editor Version 5.00 > "safer.reg"  
ECHO. >> "safer.reg"  
REM Durchsucht das angegebene Laufwerk nach *.Exe Dateien und bei jeder gefundenen Datei ruft er das Unterprogramm auf
FOR /R "%SystemDrive%" %%I IN ("*.exe") DO CALL :MAKERULE "%%I"   
CALL :CLEAN
EXIT /B

:MAKERULE
REM Schreibe Pfadname
SET FILEPATH=%~1
SET FILESIZE=%~z1
SET FILENAME=%~n1
REM Erstelle eine GUID
cscript.exe //NoLogo uuid.vbs > "GUID.txt"  
SET /P GUID=<GUID.txt
REM Erstelle einen sha1 - HASH
fciv.exe -add "%~1" -sha1 > "HASH.txt"  
FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a)  

REM DEZ in HEX Umrechnung
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F"  

set /a Dez = %FILESIZE%
set /a Rest=Dez
set "Hex="  

:WandlungDezHex
if %Rest%==0 goto :HEXCONVERT
set /a Ziffer=Rest%%16
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%"  
set "Hex=%Ziffer%%Hex%"  
set /a Rest=Rest/16
goto :WandlungDezHex

:HEXCONVERT
set "strHex=%Hex%"  

set "strHex=0000000000000000%strHex%"  
set "strHex=%strHex:~-16%"  

REM >>"test.reg" echo "test_value"=hex(b):%strHex:~-2%,%strHex:~-4,2%,%strHex:~-6,2%,%strHex:~-8,2%,%strHex:~-10,2%,%strHex:~-12,2%,%strHex:~-14,2%,%strHex:~,2%  
REM echo Hexadezimal: %Hex%
REM CALL :MAKEREG
REM GOTO :EOF

:MAKEREG
ECHO. >> "safer.reg"  
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\%GUID%] >> "safer.reg"  
REM TODO: Auslesen der letzten Dateiaenderung und anpassen des Formats (xx,xx,xx,xx...)
ECHO >> "safer.reg" "LastModified"=hex(b):   
REM TODO: Anpassung der Beschreibung
ECHO >> "safer.reg" "Description"="%FILEPATH%"   
REM TODO: Bessere Benennung des FriendlyName
ECHO >> "safer.reg" "FriendlyName"="%FILENAME%"   
REM Zu "SaferFlags" existiert keine Doku, Wert immer 0  
ECHO >> "safer.reg" "SaferFlags"=dword:00000000   
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD
ECHO >> "safer.reg" "ItemSize"=hex(b):%strHex:~-2%,%strHex:~-4,2%,%strHex:~-6,2%,%strHex:~-8,2%,%strHex:~-10,2%,%strHex:~-12,2%,%strHex:~-14,2%,%strHex:~,2%   
REM Aufsplitten des Hashs in Zweiergruppen
ECHO >> "sha1.txt" "ItemData"=hex:%HASH%   
ECHO >> "safer.reg" "ItemData"=hex:%HASH:~0,2%,%HASH:~2,2%,%HASH:~4,2%,%HASH:~6,2%,%HASH:~8,2%,%HASH:~10,2%,%HASH:~12,2%,%HASH:~14,2%,%HASH:~16,2%,%HASH:~18,2%,%HASH:~20,2%,%HASH:~22,2%,%HASH:~24,2%,%HASH:~26,2%,%HASH:~28,2%,%HASH:~30,2%,%HASH:~32,2%,%HASH:~34,2%,%HASH:~36,2%,%HASH:~38,2%  
REM Hash Algorithmus wird auf SHA1 gesetzt: 0x8003 (32771) = MD5, 0x8004 (32772) = SHA1
ECHO >> "safer.reg" "HashAlg"=dword:00008004   
ECHO. >> "safer.reg"  
GOTO :EOF

:CLEAN
del GUID.txt
del HASH.txt
GOTO :EOF
rubberman
rubberman 19.11.2012 um 22:51:44 Uhr
Goto Top
Hi.

Welchen Wert hat denn die Umgebungsvariable %SytemDrive% auf deinem virtuellen Testsystem?
speedy26gonzales
speedy26gonzales 19.11.2012, aktualisiert am 20.11.2012 um 00:15:02 Uhr
Goto Top
Wenn ich ne Batch schreibe:
 ECHO %SystemDrive% >"C:\Test.txt"  
schreibt er nur C: , kann es sein dass mir dort ein \ hinter dem %SystemDrive% fehlt?
Hhhm kann aber auch nicht sein. Laut dem Eintrag: http://de.wikipedia.org/wiki/Umgebungsvariable müsste es doch passen?

EDIT: Habe jetzt mal so erweitert:
FOR /R "%SystemDrive%"\ %%I IN ("*.exe") DO CALL :MAKERULE "%%I"    
Jetzt scheint es zu gehen. Verhält sich dann unter WindowsXP und Windows7 doch anderst ??

Habe das Skript jetzt mal so laufen lassen. Irgendwann bricht er mir ab mit dem Fehler "fehlender Operand" , was könnte das sein?
rubberman
rubberman 20.11.2012 um 00:26:58 Uhr
Goto Top
Hallo.

Zitat von @speedy26gonzales:
Verhält sich dann unter WindowsXP und Windows7 doch anderst ??
Scheint so face-wink
FOR /R "%SystemDrive:~,2%\" %%I IN ("*.exe") DO CALL :MAKERULE "%%I"
... sollte dann hoffentlich einigermaßen universal funktionieren.

Zitat von @speedy26gonzales:
Habe das Skript jetzt mal so laufen lassen. Irgendwann bricht er mir ab mit dem Fehler "fehlender Operand" , was könnte das sein?
Das kannst du nur selbst herausfinden.
Ersetze des @echo off mal durch ein @prompt $g um den Befehlsprompt etwas übersichtlicher zu machen. Nun solltest du die Stelle im Batch sehen und auch welcher Wert warum fehlt.
bastla
bastla 20.11.2012 um 08:00:04 Uhr
Goto Top
Hallo rubberman und speedy26gonzales!

Für "%systemdrive%" habe ich bisher noch auf keinem System einen Pfad, sondern immer nur ein Laufwerk vorgefunden - insofern wäre IMHO in dem zitierten Wikipedia-Artikel eine Korrektur fällig ...

Grüße
bastla
rubberman
rubberman 20.11.2012 um 12:52:28 Uhr
Goto Top
Hallo bastla,

kann ich nur bestätigen. Dass die FOR /R Schleife auf Win7 auch ohne Backslash am Ende funktioniert, allerdings nicht. Ich gehe davon aus, dass sich speedy26gonzales bei seinen Tests auf Win7 bereits im Root des Laufwerks als Arbeitsverzeichnis bewegt hat. Anders kann ich mir das scheinbar unterschiedliche Verhalten nicht erkären.

Grüße
rubberman
speedy26gonzales
speedy26gonzales 20.11.2012 um 13:10:32 Uhr
Goto Top
Hi,

das mit dem ECH OFF werde ich heute gleich machen und hoffentlich sehen warum der abbricht.

Das Skript wurde auf der Windows7 Maschine immer vom Laufwerk D: gestartet, also nicht direkt im root C:
rubberman
rubberman 20.11.2012 um 14:13:33 Uhr
Goto Top
Hi speedy26gonzales,

ich bin platt. Von D: aufgerufen, funktioniert das tatsächlich ohne Backslash. Bills Wege sind unergründlich. Da denkt man, man hat etwas verstanden und dann Gates doch anders als gedacht ... face-wink

Grüße
rubberman
bastla
bastla 20.11.2012 um 15:21:28 Uhr
Goto Top
Hallo rubberman!

Ich staune mit Dir face-confused ...

Grüße
bastla
speedy26gonzales
speedy26gonzales 21.11.2012 aktualisiert um 20:06:03 Uhr
Goto Top
Freut mich dass ich Euch Profis auch noch zum staunen gebracht hab face-smile

Habe die FOR - Schleife aber trotzdem auf folgendes abgeändert
FOR /R "%SystemDrive:~,2%\" %%I IN ("*.exe") DO CALL :MAKERULE "%%I"  
rubberman
rubberman 21.11.2012 um 19:59:43 Uhr
Goto Top
Hi,

damit machst du keinesfalls etwas falsch.
Wie sieht's eigentlich mit deiner Fehlersuche aus? (neugierig face-wink)

Grüße
rubberman
speedy26gonzales
speedy26gonzales 21.11.2012 aktualisiert um 20:07:27 Uhr
Goto Top
Habe bisher noch die "alte" Hexkonvertierung drin gelassen um nicht mehrere Baustellen auf einmal aufzureißen. Einzige Änderung war die FOR - Schleife. Dann einen Testlauf mit einem Scan vom gesamten C: nach Exe-Dateien gemacht. Komsicherweise durchlief er jetzt komplett "ohne" Fehler das gesamte Laufwerk C: . Lags evtl. beim Abbruch doch noch an dem fehlenden "\". Ich mache auf jedenfall noch weitere Tests.
speedy26gonzales
speedy26gonzales 21.11.2012 aktualisiert um 20:44:12 Uhr
Goto Top
Was mir noch fehlt und Ihr vielleicht auch ne Lösung wisst: "LastModified"=hex(b)

Braucht man den überhaupt oder kann ich den komplett weglassen? Wäre es sinnvoll dort den Wert (Datum) von der Datei selbst erinzuschreiben?

Was ich rausgefunden habe: Der Wert ist ein NT-Zeitstempel: QWORD mit 100ns-Ticks seit 1.1.1601
http://blogs.msdn.com/b/oldnewthing/archive/2009/03/06/9461176.aspx Kann beliebigen Inhalt haben!

Werde daraus aber nicht wirklich schlau.
rubberman
rubberman 21.11.2012, aktualisiert am 23.11.2012 um 21:20:15 Uhr
Goto Top
Hi,

eine potenzielle Fehlerquelle ist mir noch eingefallen (wenn auch unwahrscheinlich).
Durch das CALL werden mögliche Prozentzeichen im Dateinamen eleminiert, bzw. in Prozentzeichen eingefasste Teilstrings versucht zu Variablenwerten zu expandieren. Du solltest die Varablenzuweisung also bereits in die FOR Schleife auslagern.

Was für dich wesentlich interessanter sein dürfte, ist die Tatsache, dass du per FOR /R längst nicht alle Dateien erwischt. Im Grunde nur die, die du auch im Explorer siehst. Dateien, die das Attribut "hidden" oder "system" tragen, bleiben außen vor.

Folgender Änderungsvorschlag:
~~~ snip ~~~
FOR /F "DELIMS=" %%I IN ('DIR /A-D /B /S "%SystemDrive:~,2%\*.exe"') DO (  
  REM Schreibe Pfadname
  SET "FILEPATH=%%~I"  
  SET "FILESIZE=%%~zI"  
  SET "FILENAME=%%~nI  
  CALL :MAKERULE
)
CALL :CLEAN
EXIT /B

:MAKERULE
REM Erstelle eine GUID
~~~ snip ~~~

Die FOR /F Schleife hat zwar den Nachteil, dass der gesamte Ausgabestream des DIR Commands erst mal gepuffert wird und somit dein Batch etwas langsamer läuft, dafür erwischt du so jede Datei mit Endung .exe.

Zum "LastModified" kann ich dir leider keine Antwort geben face-sad
Teste einfach aus, ob der Wert notwendig ist.

Grüße
rubberman

Edit: Option /S vergessen
speedy26gonzales
speedy26gonzales 21.11.2012 um 20:55:54 Uhr
Goto Top
Danke rubberman,

vermutlich kommt daher auch der Fehler dass er für manche Dateien keinen HASH erstellen konnte?

Ich lass gerade parallel an dem virtuellen XP und am Windows 7 das Skript immer wieder durchlaufen.
Bisher ist es einmal an dem Punkt wo er einen Hash in die externe "Tempdatei" schreiben wollt in Windows 7 stehen geblieben. Es läuft aber auch durch, daher kann der Fehler nicht immer da sein.
rubberman
rubberman 21.11.2012 aktualisiert um 21:22:43 Uhr
Goto Top
Hi.

Zitat von @speedy26gonzales:
vermutlich kommt daher auch der Fehler dass er für manche Dateien keinen HASH erstellen konnte?

Ich kann nur mutmaßen. Um den Hash zu erstellen, muss die Datei Bit für Bit gescannt werden. Sollte die Datei vom System gesperrt worden sein, könnte der Zugriff das zu tun verwehrt sein.

Grüße
rubberman

EDIT:

Noch eine Möglichkeit:
Dein 3rd Party Tool kann nicht in die Datei schreiben, weil der Virenscanner gerade drauf hängt.
Kannst du die Ausgabe nicht ohne temporäre Datei gleich in einer FOR /F Schleife auswerten?
speedy26gonzales
speedy26gonzales 21.11.2012 aktualisiert um 21:57:28 Uhr
Goto Top
Mir ist gerade ein noch gravierender Fehler aufgefallen.
Ich meinte bei dem Eintrag "SaferFlags" muss IMMER 0 drin stehen. Ist aber nur bei Pfadregeln so.
Wenn ich jetzt eine HASH-Regel über das SnapIn "gpedit.msc" erstelle schreibt er aber in dieses REG_DWORD etwas anderes wie "0". Vorallem erstellt er einen md5 UND sha1 Hash und je nachdem welcher HASH steht etwas anderes in dem "SaferFlags".

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\{5e0d40e2-cfb8-447a-8cc1-68cc94dad214}]
"LastModified"=hex(b):e1,f1,0d,c7,28,c8,cd,01  
"Description"=""  
"FriendlyName"=" (14.0.1.4577)"  
"SaferFlags"=dword:00040000 (32771)  
"ItemSize"=hex(b):e0,f1,0d,00,00,00,00,00  
"ItemData"=hex:3f,67,71,72,f2,3f,c1,72,83,d9,bc,e4,b4,2e,3f,65  
"HashAlg"=dword:00008003 (262144)  


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\{5e0d40e2-cfb8-447b-8cc1-68cc94dad214}]
"LastModified"=hex(b):e1,f1,0d,c7,28,c8,cd,01  
"Description"=""  
"FriendlyName"=" (14.0.1.4577)"  
"SaferFlags"=dword:00040004 (262148)  
"ItemSize"=hex(b):e0,f1,0d,00,00,00,00,00  
"ItemData"=hex:65,d0,2a,50,d0,d8,8e,65,d2,d7,53,39,dd,27,19,78,c1,ea,50,37  
"HashAlg"=dword:00008004 (32772)  

Zitat von @rubberman:
Noch eine Möglichkeit:
Dein 3rd Party Tool kann nicht in die Datei schreiben, weil der Virenscanner gerade drauf hängt.
Kannst du die Ausgabe nicht ohne temporäre Datei gleich in einer FOR /F Schleife auswerten?

Ich habe leider keine Möglichkeit hinbekommen es ohne das schreiben in eine Datei zu machen, war ewig lang dran dass es überhaupt geht. Kann dir die 2 Windowstools gerne mal zukommen lassen.
rubberman
rubberman 21.11.2012 aktualisiert um 22:23:53 Uhr
Goto Top
Hi.

Zitat von @speedy26gonzales:
Mir ist gerade ein noch gravierender Fehler aufgefallen.
Ich meinte bei dem Eintrag "SaferFlags" muss IMMER 0 drin stehen. Ist aber nur bei Pfadregeln so.
Wenn ich jetzt eine HASH-Regel über das SnapIn "gpedit.msc" erstelle schreibt er aber in dieses REG_DWORD etwas anderes wie "0". Vorallem erstellt er einen md5 UND sha1 Hash und je nachdem welcher HASH steht etwas anderes in dem "SaferFlags".
Bevor du mit dem ganzen Spaß angefangen hast, wirst du dich sicher informiert haben. Wo ist denn die Doku dafür zu finden?

Zitat von @speedy26gonzales:
Ich habe leider keine Möglichkeit hinbekommen es ohne das schreiben in eine Datei zu machen, war ewig lang dran dass es überhaupt geht.
So schwer kann das nicht sein.
REM Erstelle eine GUID
:: cscript.exe //NoLogo uuid.vbs > "GUID.txt"  
:: SET /P GUID=<GUID.txt
FOR /F %%i IN  ('cscript //nologo uuid.vbs') DO SET "GUID=%%i"  

REM Erstelle einen sha1 - HASH
:: fciv.exe -add "%~1" -sha1 > "HASH.txt"  
:: FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a)  
FOR /F "skip=3" %%a IN ('fciv.exe -add "%FILEPATH%" -sha1') DO SET "HASH=%%a"  
Grüße
rubberman
speedy26gonzales
speedy26gonzales 22.11.2012 um 12:59:31 Uhr
Goto Top
> Zitat von @speedy26gonzales:
> Bevor du mit dem ganzen Spaß angefangen hast, wirst du dich sicher informiert haben. Wo ist denn die Doku dafür zu finden?

Klar face-smile, Wochenlang. Hier paar Links:
http://schneegans.de/computer/safer/
http://home.arcor.de/skanthak/safer.html#safer
http://support.microsoft.com/kb/324036/de
http://technet.microsoft.com/de-de/library/cc163080.aspx
rubberman
rubberman 22.11.2012 um 14:08:57 Uhr
Goto Top
Hi,

das gibt mir schon mal einen kleinen Einblick.
"SaferFlags" ist natürlich nicht immer 0. Der Name sagt bereits aus, dass hier mehr als nur eine Information drin steckt. Normalerweise bedeutet "Flags", dass jedes Bit eine eigene (boolesche) Bedeutung hat.

Beispiel zur Verdeutlichung:
Ein Objekt hat 4 Eigenschaften (A, B, C, und D) die durch Flags repräsentiert werden sollen. Das kannst du also mit einem Wert von 4 Bit Breite darstellen, wobei du definiert hast, dass das niedrigste Bit die Eigenschaft A repräsentiert und das höchste die Eigenschaft D.
Siehst du nun als Flags bspw. die Zahl 12, ergibt sich folgendes:
Binäre Darstellung der 12 in 4 Bits ist 1100 => A ist falsch, B ist falsch, C ist wahr, D ist wahr.

Du hast nun 2 Möglichkeiten für dein Problem mit dem Wert "SaferFlags". Entweder du bekommst durch Tests heraus, dass der Wert im Fall von SHA1 Hashes immer gleich ist, oder du musst dir eine Doku suchen, die dir die Bedeutung der Flags im einzelnen erklärt.

Andere Sache:
Du erzeugst per Script eine GUID. Wie stellst du sicher, dass
  • diese noch nicht in Verwendung ist,
  • bei den hunderten von Dateien, die du verarbeitest, nicht 2x der gleiche Wert erzeugt wird?

Grüße
rubberman
speedy26gonzales
speedy26gonzales 22.11.2012, aktualisiert am 27.11.2012 um 00:09:41 Uhr
Goto Top
Hi,

ich hab zum Thema "SaferFlags" schon geschaut aber keine wirkliche Erklärung gefunden. Wie 4 Threads weiter oben zu sehen, sind das die Werte die er bei einer HASH-Regel erstellt. Einmal für den md5 Hash und einmal für den sha1 Hash.

Was mich aber in der Hilfe von MS verwirrt http://technet.microsoft.com/de-de/library/cc163080.aspx:
-> Ausführbare Dateien, die nicht digital signiert sind, verwenden einen MD5-Hashwert.
Bedeutet ich muss für jede Datei 2 Hashs erstellen so wie es Windows über den SnapIN auch macht?

Zitat von @rubberman:
Andere Sache:
Du erzeugst per Script eine GUID. Wie stellst du sicher, dass
  • diese noch nicht in Verwendung ist,
  • bei den hunderten von Dateien, die du verarbeitest, nicht 2x der gleiche Wert erzeugt wird?

Das ist eine gute Frage, ich hab mir dazu schon mal kurz Gedanken gemacht, sie aber wieder verworfen ohne Ergebnis.
Wie weiß denn das SnapIN was es schon an GUIDs gibt? Geht es darum um die GUIDs in der ganzen Registry oder nur in dem SAFER Unterverzeichniss? Weil ich steh sofern es dann mal laufen sollte auch vor dem Problem wie gehe ich bei einem Update eines einzelnen Programms vor. Dort sollte ich ja eigentlich die alte Regel löschen und eine neue erstellen.

EDIT: So weitere Fortschritte. Ich hab jetzt für eine Datei zusätzlich einen MD5 - Hash erstellt und dann kann ich die Datei nach Import in die Registry ausführen. Jetzt bleibt nur die Frage ob ich IMMER beide HASHs erstellen muss oder vielleicht nur den MD5 Hash nutzen sollt.

Geändert hab ich in dem Registryeintrag: "SaferFlags: von 00040004 auf 00040000" , "HashAlg: 00008004 auf 00008003. Dann natürlich den HASH selbst noch.
(sieh auch oben in meinem vorigen Post mit dem Vergleich)

EDIT2: Was auch komisch ist, wenn ich ECHO OFF drin hab steigt es ab und an mal aus mit dem Fehler "Fehler Operand" oder "Find Path not". Sobald ich aber "@prompt $g" drin stehen hab läuft es immer durch ??? Muss man das verstehen ?
rubberman
rubberman 22.11.2012, aktualisiert am 23.11.2012 um 00:19:57 Uhr
Goto Top
Hi.

Zitat von @speedy26gonzales:
Wie weiß denn das SnapIN was es schon an GUIDs gibt? Geht es darum um die GUIDs in der ganzen Registry oder nur in dem SAFER Unterverzeichniss? Weil ich steh sofern es dann mal laufen sollte auch vor dem Problem wie gehe ich bei einem Update eines einzelnen Programms vor. Dort sollte ich ja eigentlich die alte Regel löschen und eine neue erstellen.
Hmm, da von einer eindeutigen GUID die Rede war, würde ich mal auf alle GUIDs tippen. Ergo wird wohl das SnapIn im Vorfeld alle GUIDs auslesen und bei der Neuerstellung gegenprüfen. Ich weiß nicht wie Windows das intern regelt, ggf. sind auch nur bestimmte GUIDs für diesen Anwedungsbereich reserviert, was die Sache vereinfachen würde. Keine Ahnung, da sollten die Admins sich mal zu Wort melden (ich gehöre eigentlich zu denen, die auf die Arbeit von Admins angewiesen sind face-wink).
Fakt ist, da du vorhast erst alles in eine .reg Datei zu schreiben, statt gleich in die Registry, reicht es nicht nur auf das Vorhandensein in der Registry zu prüfen, du musst auch noch wissen, welche neue GUID du bereits generiert hast.

Zitat von @speedy26gonzales:
EDIT2: Was auch komisch ist, wenn ich ECHO OFF drin hab steigt es ab und an mal aus mit dem Fehler "Fehler Operand" oder "Find Path not". Sobald ich aber "@prompt $4" drin stehen hab läuft es immer durch ??? Muss man das verstehen ?
Das fällt entweder unter die Rubrik "dummer Zufall", oder du bekommst die Fehler einfach nicht mit, bei der Flut an Ausgaben bei eingeschaltetem Commandprompt. Läuft denn der Batch trotzdem weiter?

Zu welchem Ergebnis bist du eigentlich bzgl. "LastModified" gekommen? Notwendig oder nicht?
Falls notwendig, fürchte ich dass du nicht ohne ein weiteres 3rd Party auskommen wirst. Falls du nichts brauchbares finden solltest, biete ich an ein paar Zeilen in C für diesen Zweck zu schreiben.

Grüße
rubberman
speedy26gonzales
speedy26gonzales 23.11.2012 aktualisiert um 09:15:36 Uhr
Goto Top
Zitat von @rubberman:
Hmm, da von einer eindeutigen GUID die Rede war, würde ich mal auf alle GUIDs tippen. Ergo wird wohl das SnapIn im
Vorfeld alle GUIDs auslesen und bei der Neuerstellung gegenprüfen. Ich weiß nicht wie Windows das intern regelt, ggf.
sind auch nur bestimmte GUIDs für diesen Anwedungsbereich reserviert, was die Sache vereinfachen würde. Keine Ahnung, da
sollten die Admins sich mal zu Wort melden (ich gehöre eigentlich zu denen, die auf die Arbeit von Admins angewiesen sind
face-wink).
Fakt ist, da du vorhast erst alles in eine .reg Datei zu schreiben, statt gleich in die Registry, reicht es nicht nur auf das
Vorhandensein in der Registry zu prüfen, du musst auch noch wissen, welche neue GUID du bereits generiert hast.

Ich hab dazu jetzt noch einen Artikel gefunden, werde aber trotzdem nicht ganz schlau daraus: http://www.aboutvb.de/khw/artikel/khwcreateguid.htm .Es wird wirklich nirgends beschrieben dass vorher kontrolliert wird ob die GUID schon besteht. Die schreiben dass die Generierung wohl so sicher ist dass es jedesmal eine neue erstellt.
Windows stellt dieses Tool zur verfügung, ich konnte es aber nicht über eine Batch ansteuern: http://www.microsoft.com/en-us/download/details.aspx?id=17252

> Zitat von @speedy26gonzales:
> ----
> EDIT2: Was auch komisch ist, wenn ich ECHO OFF drin hab steigt es ab und an mal aus mit dem Fehler "Fehler Operand"
oder "Find Path not". Sobald ich aber "@prompt $4" drin stehen hab läuft es immer durch ??? Muss man das
verstehen ?
Das fällt entweder unter die Rubrik "dummer Zufall", oder du bekommst die Fehler einfach nicht mit, bei der Flut an
Ausgaben bei eingeschaltetem Commandprompt. Läuft denn der Batch trotzdem weiter?

Zu welchem Ergebnis bist du eigentlich bzgl. "LastModified" gekommen? Notwendig oder nicht?
Falls notwendig, fürchte ich dass du nicht ohne ein weiteres 3rd Party auskommen wirst. Falls du nichts brauchbares finden
solltest, biete ich an ein paar Zeilen in C für diesen Zweck zu schreiben.

Hhhmm da fällt mir gerade ein, evtl. bekomm ich die Fehler wirklich nicht mit weil die Suche weiterläuft und ich immer dachte sie hat abgebrochen. Werde es mal nochmals testen und die Konsole dann eine weile offen lassen.

Also bei eingeschaltetem Commandoprompt lief es bisher immer durch.

Zu "LastModified" bin ich soweit gekommen dass der Wert wohl nicht zwingend gebraucht wird. Ich habe das Feld mal leer gelassen und gestern sowohl md5 wie auch sha1 HASHs erstellt. Mit dem Ergebnis dass danach die gesacnnten Dateien unter Zuschaltung der SAFER - Richtlinien ausführbar waren.
Mein Gedanke war evtl. das Datum der gescannten Datei auszulesen und in "LastModified" reinzuschreiben, aber obs Sinn macht?


Aktuell erstelle ich pro Datei jeweils einen md5 und sha1 HASH. Jetzt frag ich mich wie ich dann die ganzen verschiedenen BATCH-Files steuern kann. Hab jetzt 16 verschiedene Batchs die ausgeführt werden sollen.
Alternativ könnte man eine "Steuer-Batch" machen die dann jeweils in den Such-Algo eine Variable mit Dateiendung und Pfad übergibt.
Nächster Gedanke war, ob ich die erstellten Daten in eine *.INF Datei schreibe (siehe die vorgefertigte weiter oben) und sie über die INF installiere.
rubberman
rubberman 23.11.2012 aktualisiert um 15:21:02 Uhr
Goto Top
Hi.

Zitat von @speedy26gonzales:
Ich hab dazu jetzt noch einen Artikel gefunden, werde aber trotzdem nicht ganz schlau daraus:
http://www.aboutvb.de/khw/artikel/khwcreateguid.htm .Es wird wirklich nirgends beschrieben dass vorher kontrolliert wird ob die GUID schon besteht. Die schreiben dass die Generierung wohl so sicher ist dass es jedesmal eine neue erstellt.
Dieser Code nutzt die COM Funktion CoCreateGuid, die wiederum die Remote Procedure Call Funktion UuidCreate aufruft. Das scheint der von M$ vorgegebene Weg zu sein. Aber, wie gesagt, du wendest die erzeugten GUIDs nicht sofort an. Ich weiß somit nicht, ob nicht trotzdem eine GUID mehrfach erzeugt wird.
Das von dir angesprochene M$ Tool kopiert die GUID in die Zwischenablage. Nicht besonders vorteilhaft um damit per Batch weiter zu arbeiten face-wink.

Zitat von @speedy26gonzales:
Zu "LastModified" bin ich soweit gekommen dass der Wert wohl nicht zwingend gebraucht wird. Ich habe das Feld mal leer gelassen und gestern sowohl md5 wie auch sha1 HASHs erstellt. Mit dem Ergebnis dass danach die gesacnnten Dateien unter Zuschaltung der SAFER - Richtlinien ausführbar waren.
Mein Gedanke war evtl. das Datum der gescannten Datei auszulesen und in "LastModified" reinzuschreiben, aber obs Sinn macht?
Nein. Wenn schon, must du dort einen FILETIME Wert rein bringen. Außer WMIC fällt mir kein Befehl ein, der die Zeit beinah in dieser Genauigkeit rüber bringt, á la
set "fpath=c:\pagefile.sys"  
WMIC DATAFILE WHERE "name='%fpath:\=\\%'" GET LastModified /value  
Wie du siehst, hat die Ausgabe aber nicht mal ansatzweise etwas damit zu tun, was du 1:1 verwerten könntest. Und bei dem Versuch daraus was Brauchbares zu machen, kommst du wieder über das 32 Bit Limit. Darum mein Angebot, dir das Leben etwas zu erleichtern.

EDIT:
sizedate.zip
SIZEDATE provides (1) the size [bytes] and (2) the last write
   time [100-nanosecond intervals since 1/1/1601 UTC] of the
   specified file.
   They are retrievable as space separated 16 digits long
   HEX strings.

Usage:
SIZEDATE "file path"
Beispielaufruf und Sourcecode sind freilich dabei. Hoffe es hilft.


Zitat von @speedy26gonzales:
Aktuell erstelle ich pro Datei jeweils einen md5 und sha1 HASH. Jetzt frag ich mich wie ich dann die ganzen verschiedenen BATCH-Files steuern kann. Hab jetzt 16 verschiedene Batchs die ausgeführt werden sollen.
Alternativ könnte man eine "Steuer-Batch" machen die dann jeweils in den Such-Algo eine Variable mit Dateiendung und Pfad übergibt.
Nächster Gedanke war, ob ich die erstellten Daten in eine *.INF Datei schreibe (siehe die vorgefertigte weiter oben) und sie über die INF installiere.
Haha, ich glaube ich müsste vor deinem Rechner sitzen um zu verstehen, über was du da redest. 16 Batch Dateien? Da solltest du dir überlegen, ob du die parallel oder in Reihe schaltest, wenn du sie ausführst. Was ich meine ist, per START kannst du asynchron arbeiten. Das erspart dir Zeit, falls die Batchdateien nicht synchron nacheinander laufen müssen.

Grüße
rubberman
speedy26gonzales
speedy26gonzales 26.11.2012 um 11:54:11 Uhr
Goto Top
Zitat von @rubberman:
Dieser Code nutzt die COM Funktion [http://msdn.microsoft.com/en-us/library/windows/desktop/ms688568%28v=vs.85%29.aspx
CoCreateGuid], die wiederum die Remote Procedure Call Funktion
UuidCreate aufruft. Das scheint der von M$
vorgegebene Weg zu sein. Aber, wie gesagt, du wendest die erzeugten GUIDs nicht sofort an. Ich weiß somit nicht, ob nicht
trotzdem eine GUID mehrfach erzeugt wird.
Das von dir angesprochene M$ Tool kopiert die GUID in die Zwischenablage. Nicht besonders vorteilhaft um damit per Batch weiter zu
arbeiten face-wink.
Mein Code um eine GUID zu erzeugen sieht ja so aus:
WScript.Echo WScript.CreateObject("Scriptlet.TypeLib").GUID  
Ich habe mich am WE nochmals mit jemand unterhalten, er meinte dass es wahrscheinlicher ist mehrmals im Lotto zu gewinnen wie 2x die gleiche GUID zu erstellen. Bei einer 128 Bit Zahl kann es fast nicht vorkommen. Somit wäre eine Überprüfung nicht unbedingt notwendig.
Zitat von @rubberman:
EDIT:
sizedate.zip
> SIZEDATE provides (1) the size [bytes] and (2) the last write
>    time [100-nanosecond intervals since 1/1/1601 UTC] of the
>    specified file.
>    They are retrievable as space separated 16 digits long
>    HEX strings.
> 
> Usage:
> SIZEDATE "file path"
> 
Beispielaufruf und Sourcecode sind freilich dabei. Hoffe es hilft.
Hi rubber, Thanks werde ich mir mal anschauen. Bei meinen Tests ist mir aufgefallen dass der Wert "LastModified" gar nicht benutzt/gebraucht wird. So wie es aussieht ist er überflüssig.

Zitat von @rubberman:
Haha, ich glaube ich müsste vor deinem Rechner sitzen um zu verstehen, über was du da redest. 16 Batch Dateien? Da
solltest du dir überlegen, ob du die parallel oder in Reihe schaltest, wenn du sie ausführst. Was ich meine ist, per
START kannst du asynchron arbeiten. Das erspart dir Zeit, falls die Batchdateien nicht synchron nacheinander laufen müssen.
Also ich versuche es mal etwas zu erläutern:
Ich habe derzeit 2 Verzeichnisse die gescannt werden. In den 2 Verzeichnissen wird nach 4 Dateiendungen gescannt, für jede Dateiendung muss bei jeder gefundenen Datei ein sha1 HASH und ein md5 Hash erstellt werden. Somit ergeben sich die 16 verschiedenen Batchdateien, in denen derzeit alles starr drin steht.
Jetzt ist mein Gedanke ob es irgendwie möglich ist eine "Hauptbatch" zu machen von der ich die anderen steuern kann, oder sogar nur eine Batch habe in der ich Paramter übergebe?
Zum Asynchronen ausführen: Dürfte nicht so einfach gehen weil ich aus der Batch heraus das GUID Skript und einmal die fciv.exe um den Hash zu erstellen aufrufe. Wenn ich jetzt 2x darauf zugreife wird er mit ziemlicher Sicherheit abschmieren.
speedy26gonzales
speedy26gonzales 26.11.2012 aktualisiert um 16:11:00 Uhr
Goto Top
Ich habe jetzt mal versucht eine Start-Batch zu erstellen die dann je nach Einstellungen die Batch mit dem Registryzeug aufruft. Irgendwie hab ich da aber nen Denkfehler drin:

REM Startskript
REM @echo off & setlocal
@prompt $g 
set olddir=%cd%

ECHO Erstelle die MD5-Hashs
set Suchpfad=%SystemDrive:~,2%\Windows
set DateiCMD=cmd
set DateiEXE=exe
set DateiJAR=jar
set DateiOCX=ocx
set Hashversion=md5

mkdir "%olddir%"\"%Hashversion%"  
set Speicherpfad=%olddir%\%Hashversion%
ECHO "%Speicherpfad%" >>Test2.txt  

call "%cd%\Main.cmd" "%Suchpfad%" "%DateiCMD%" "%Speicherpfad%"  
PAUSE
call "%cd%\Main.cmd" "%Suchpfad%" "%DateiEXE%" "%Speicherpfad%"  
PAUSE
EXIT /B
Hier soll quasi eingestellt werden in welchem Verzeichnis er suchen soll, nach welcher Dateiendung und wo er dann die erstellten Regeln speichern soll. Das erste "CALL" funktioniert soweit, wenn er aber jetzt wieder zurückspringt in die Start-Batch und von dort das zweite CALL aufruft, will er immer in den Pfad (von dem die Dateien ausfegührt wurden): C:\......\Desktop\md5\safer_cmd.reg\safer_exe.reg schreiben. Wo liegt denn der Fehler dass er die letzte Speicherdatei als Pfad interpretiert?

So sieht meine Änderung im Hauptprogramm aus:
REM Programm durchsucht das komplette Laufwerk nach *.EXE Dateien
REM @echo off & setlocal
@prompt $g
REM Skript wird in ANSI geschrieben
SET Speicherpfad=%~3\safer_%~2.reg
ECHO "%Speicherpfad%" >> Test3.txt  
ECHO Windows Registry Editor Version 5.00 > "%Speicherpfad%"  
ECHO. >> "%Speicherpfad%"  
REM Durchsucht das angegebene Laufwerk nach *.Exe Dateien und bei jeder gefundenen Datei ruft er das Unterprogramm auf
REM FOR /R "%SystemDrive%" %%I IN ("*.exe") DO CALL :MAKERULE "%%I"   
FOR /R "%~1" %%I IN ("*.%~2") DO CALL :MAKERULE "%%I"  
CALL :CLEAN
EXIT /B

:MAKERULE
REM Schreibe Pfadname
SET FILEPATH=%~1
SET FILESIZE=%~z1
SET FILENAME=%~n1
REM Erstelle eine GUID
cscript.exe //NoLogo uuid.vbs > "GUID.txt"  
SET /P GUID=<GUID.txt
REM Erstelle einen sha1 - HASH
fciv.exe -add "%~1" -md5 > "HASH.txt"  
FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a)  

REM DEZ in HEX Umrechnung
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F"  

set /a Dez = %FILESIZE%
set /a Rest=Dez
set "Hex="  

:WandlungDezHex
if %Rest%==0 goto :HEXCONVERT
set /a Ziffer=Rest%%16
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%"  
set "Hex=%Ziffer%%Hex%"  
set /a Rest=Rest/16
goto :WandlungDezHex

:HEXCONVERT
set "strHex=%Hex%"  

set "strHex=0000000000000000%strHex%"  
set "strHex=%strHex:~-16%"  

REM >>"test.reg" echo "test_value"=hex(b):%strHex:~-2%,%strHex:~-4,2%,%strHex:~-6,2%,%strHex:~-8,2%,%strHex:~-10,2%,%strHex:~-12,2%,%strHex:~-14,2%,%strHex:~,2%  
REM echo Hexadezimal: %Hex%
REM CALL :MAKEREG
REM GOTO :EOF

:MAKEREG
ECHO. >> "%Speicherpfad%"  
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\%GUID%] >> "%Speicherpfad%"  
REM TODO: Auslesen der letzten Dateiaenderung und anpassen des Formats (xx,xx,xx,xx...)
ECHO >> "%Speicherpfad%" "LastModified"=hex(b):   
REM TODO: Anpassung der Beschreibung
ECHO >> "%Speicherpfad%" "Description"="%FILEPATH%"   
REM TODO: Bessere Benennung des FriendlyName
ECHO >> "%Speicherpfad%" "FriendlyName"="%FILENAME%"   
REM Zu "SaferFlags" existiert keine Doku, Wert bei Hash und SHA1 siehe unten  
ECHO >> "%Speicherpfad%" "SaferFlags"=dword:00040004   
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD
ECHO >> "%Speicherpfad%" "ItemSize"=hex(b):%strHex:~-2%,%strHex:~-4,2%,%strHex:~-6,2%,%strHex:~-8,2%,%strHex:~-10,2%,%strHex:~-12,2%,%strHex:~-14,2%,%strHex:~,2%   
REM Aufsplitten des Hashs in Zweiergruppen
ECHO >> "sha1.txt" "ItemData"=hex:%HASH%   
ECHO >> "%Speicherpfad%" "ItemData"=hex:%HASH:~0,2%,%HASH:~2,2%,%HASH:~4,2%,%HASH:~6,2%,%HASH:~8,2%,%HASH:~10,2%,%HASH:~12,2%,%HASH:~14,2%,%HASH:~16,2%,%HASH:~18,2%,%HASH:~20,2%,%HASH:~22,2%,%HASH:~24,2%,%HASH:~26,2%,%HASH:~28,2%,%HASH:~30,2%,%HASH:~32,2%,%HASH:~34,2%,%HASH:~36,2%,%HASH:~38,2%  
REM Hash Algorithmus wird auf SHA1 gesetzt: 0x8003 (32771) = MD5, 0x8004 (32772) = SHA1
ECHO >> "%Speicherpfad%" "HashAlg"=dword:00008004   
ECHO. >> "%Speicherpfad%"  
GOTO :EOF

:CLEAN
del GUID.txt
del HASH.txt
GOTO :EOF
Oder geht es vielleicht einfacher? Wie gesagt ich hab ca. 4 verschiedene Dateiendungen und insgesamt dann 4 verschiedene Verzeichnisse in denen automatisch gesucht werden soll.
rubberman
rubberman 26.11.2012 um 19:04:37 Uhr
Goto Top
Hi.

Zitat von @speedy26gonzales:
Ich habe mich am WE nochmals mit jemand unterhalten, er meinte dass es wahrscheinlicher ist mehrmals im Lotto zu gewinnen wie 2x die gleiche GUID zu erstellen. Bei einer 128 Bit Zahl kann es fast nicht vorkommen. Somit wäre eine Überprüfung nicht unbedingt notwendig.
Über diese Statistik habe ich noch gar nicht nachgedacht. Das Argument einer Chance 1:340 Sextillionen ist in der Tat unschlagbar face-wink
Wie auch immer, habe dir auf dem selben Share noch eine guid.exe abgelegt, die die CoCreateGuid Funktion nutzt. Kannst selbst entscheiden ob du sie nutzen willst. Sie dürfte aber um Längen schneller sein, als das VBScript aufzurufen.

Zitat von @speedy26gonzales:
Bei meinen Tests ist mir aufgefallen dass der Wert "LastModified" gar nicht benutzt/gebraucht wird. So wie es aussieht ist er überflüssig.
Du kannst das Programm trotzdem nutzen. Da ich automatisch eine Reihe an Daten erhalte, habe ich auch gleich die Ausgabe der Dateigröße als 16 stelligen Hex String mit implementiert. Das erspart dir die Umrechnung Dec2Hex im Script.

Zitat von @speedy26gonzales:
Jetzt ist mein Gedanke ob es irgendwie möglich ist eine "Hauptbatch" zu machen von der ich die anderen steuern kann, oder sogar nur eine Batch habe in der ich Paramter übergebe?
Zitat von @speedy26gonzales:
Oder geht es vielleicht einfacher? Wie gesagt ich hab ca. 4 verschiedene Dateiendungen und insgesamt dann 4 verschiedene Verzeichnisse in denen automatisch gesucht werden soll.

Hmm,ich kann dir schlecht sagen wie du das regeln sollst. Das ist schon deine Entscheidung.
Möglich wäre immerhin eine FOR Schleife, á la
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do (  
  pushd %%i
  for /f "delims=" %%j in ('dir /a-d /b /s *.cmd *.exe *.ocx *.jar') do (  
    call :MAKERULE "%%j"  
  )
  popd
)

Zitat von @speedy26gonzales:
Zum Asynchronen ausführen: Dürfte nicht so einfach gehen weil ich aus der Batch heraus das GUID Skript und einmal die fciv.exe um den Hash zu erstellen aufrufe. Wenn ich jetzt 2x darauf zugreife wird er mit ziemlicher Sicherheit abschmieren.
Nein, es sollte keine Probleme geben, Programme/Scripte mehrfach aufzurufen. Geht nur dann in die Grütze, wenn alle Instanzen versuchen in die selbe Datei zu schreiben, bzw aus der selben Datei zu lesen. Darum auch mein Vorschlag, die Ausgabe dieser Tools direkt in einer FOR /F Schleife zu verwursten.

Grüße
rubberman
speedy26gonzales
speedy26gonzales 26.11.2012 um 23:40:36 Uhr
Goto Top
Zitat von @rubberman:
Folgender Änderungsvorschlag:
~~~ snip ~~~
> FOR /F "DELIMS=" %%I IN ('DIR /A-D /B /S "%SystemDrive:~,2%\*.exe"') DO (  
>   REM Schreibe Pfadname
>   SET "FILEPATH=%%~I"  
>   SET "FILESIZE=%%~zI"  
>   SET "FILENAME=%%~nI  
>   CALL :MAKERULE
> )
> CALL :CLEAN
> EXIT /B
> 
> :MAKERULE
> REM Erstelle eine GUID
> 
~~~ snip ~~~

Die FOR /F Schleife hat zwar den Nachteil, dass der gesamte Ausgabestream des DIR Commands erst mal gepuffert wird und somit dein
Batch etwas langsamer läuft, dafür erwischt du so jede Datei mit Endung .exe.

Edit: Option /S vergessen

Hab das mal so eingebaut, die Batch läuft zwar, es werden aber keine HASHs mehr erstellt:
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\{1C5C418A-F79A-4F60-95D4-9740DE19EED0}] 
 "LastModified"=hex(b):   
 "Description"="C:\AUTOEXEC.BAT"   
 "FriendlyName"="AUTOEXEC"   
 "SaferFlags"=dword:00040000   
 "ItemSize"=hex(b):00,00,00,00,00,00,00,00   
 "ItemData"=hex:To,,,,,,,,,,,,,,,  
 "HashAlg"=dword:00008003   

Mein Skript sieht so aus:
FOR /F "DELIMS=" %%I IN ('DIR /A-D /B /S "%SystemDrive:~,2%\*.*"') DO (  
  REM Schreibe Pfadname
  SET "FILEPATH=%%~I"  
  SET "FILESIZE=%%~zI"  
  SET "FILENAME=%%~nI  
  CALL :MAKERULE
)
CALL :CLEAN
EXIT /B

:MAKERULE
REM Erstelle eine GUID
cscript.exe //NoLogo uuid.vbs > "GUID.txt"  
SET /P GUID=<GUID.txt
REM Erstelle einen sha1 - HASH
fciv.exe -add "%~1" -md5 > "HASH.txt"  
FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a)  
rubberman
rubberman 26.11.2012 aktualisiert um 23:56:56 Uhr
Goto Top
Hi,

%1 gibt es nicht mehr als Parameter, da keiner mehr übergeben wird.
fciv.exe -add "%FILEPATH%" -md5 > "HASH.txt"

Grüße
rubberman
speedy26gonzales
speedy26gonzales 27.11.2012 aktualisiert um 02:36:19 Uhr
Goto Top
Zitat von @rubberman:
Hi,

%1 gibt es nicht mehr als Parameter, da keiner mehr übergeben wird.
> fciv.exe -add "%FILEPATH%" -md5 > "HASH.txt"
> 


Werde ich gleich probieren, vor lauter verschiedenen Batchdateien und Parameter verlier ich langsam den Überblick. Habs sogar schon fertig gebracht dass gar nix mehr geht.

EDIT: Was ich auch nicht verstehe: Der "Description" Eintrag steht zwar in er safer.reg wird aber nicht in die Registry importiert. Dort taucht er nicht mehr auf
rubberman
rubberman 27.11.2012 aktualisiert um 00:27:18 Uhr
Goto Top
Zitat von @speedy26gonzales:
EDIT: Was ich auch nicht verstehe: Der "Description" Eintrag steht zwar in er safer.reg wird aber nicht in die Registry importiert. Dort taucht er nicht mehr auf

Hi,

dürfte daran liegen dass Backslashes verdoppelt werden müssen.

>>"%Speicherpfad%" ECHO "Description"="%FILEPATH:\=\\%"

Grüße
rubberman
speedy26gonzales
speedy26gonzales 27.11.2012 um 01:14:03 Uhr
Goto Top
Zitat von @rubberman:
dürfte daran liegen dass Backslashes verdoppelt werden müssen.

>>"%Speicherpfad%" ECHO
> "Description"="%FILEPATH:\=\\%"


Genau das wars, Danke. Wieder einen kleinen Schritt weiter.
speedy26gonzales
speedy26gonzales 04.01.2013 um 15:33:59 Uhr
Goto Top
Hi,

ich bin gerade dabei die Umsetzung zu machen um nicht 16 verschiedene Batchfiles für die 4 Ordner + 4 Dateien zu haben.
Dazu hast Du mal folgendes gepostet:
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do (  
  pushd %%i
  for /f "delims=" %%j in ('dir /a-d /b /s *.cmd *.exe *.ocx *.jar') do (  
    call :MAKERULE "%%j"  
  )
  popd
)
Dort fehlen doch jetzt die Einträge für:
SET "FILEPATH=%%~I"
SET "FILESIZE=%%~zI"
SET "FILENAME=%%~nI

oder muss es bei der Variante wieder anderst aussehen?
rubberman
rubberman 04.01.2013 aktualisiert um 16:30:57 Uhr
Goto Top
Hi,

der Aufruf war nur beispielhaft mit der Datei als Argument. Wie schon geschrieben, gibt es dabei eine potenzielle Fehlerchance, im Fall dass irgendwo im Pfad oder Dateinamen Prozentzeichen vorkommen. Natürlich kannst du auch hier die Variablenwerte vorher zuweisen.
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do (  
  pushd %%i
  for /f "delims=" %%j in ('dir /a-d /b /s *.cmd *.exe *.ocx *.jar') do (  
    set "FILEPATH=%%~j"  
    set "FILESIZE=%%~zj"  
    set "FILENAME=%%~nj"  
    call :MAKERULE
  )
  popd
)

Grüße
rubberman
speedy26gonzales
speedy26gonzales 04.01.2013 um 18:01:26 Uhr
Goto Top
Ok genau so hab ichs eingebaut und vorher getestet.
Allerdings mit dem Ergebnis dass er mir in verschiedene Verzeichnisse schreibt und vorallem die beiden externen Dateien für HASH und GUID gar nicht findet und benutzen kann.

Sieht derzeit so aus:
REM Programm durchsucht das komplette Laufwerk nach *.EXE Dateien
REM @echo off & setlocal
@setlocal
@prompt $g
set olddir=%cd%
REM Skript wird in ANSI geschrieben
ECHO Windows Registry Editor Version 5.00 > "%cd%\saferDLL.reg"  
ECHO. >> "%cd%\saferDLL.reg"  
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes] >> "%cd%\saferDLL.reg"   
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do (  
  pushd %%i
  for /f "delims=" %%j in ('dir /a-d /b /s *.cmd *.exe *.ocx *.jar') do (  
    REM Schreibe Pfadname
	SET "FILEPATH=%%~j"  
	SET "FILESIZE=%%~zj"  
	SET "FILENAME=%%~nj"  
	call :MAKERULE 
  )
  popd
)

CALL :CLEAN
EXIT /B

:MAKERULE
REM Erstelle eine GUID
FOR /F %%i IN  ('cscript //nologo uuid.vbs') DO SET "GUID=%%i"  
REM Erstelle einen sha1 - HASH
FOR /F "skip=3" %%a IN ('fciv.exe -add "%FILEPATH%" -sha1') DO SET "HASH=%%a"  

REM DEZ in HEX Umrechnung
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F"  

set /a Dez = %FILESIZE%
set /a Rest=Dez
set "Hex="  

:WandlungDezHex
if %Rest%==0 goto :HEXCONVERT
set /a Ziffer=Rest%%16
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%"  
set "Hex=%Ziffer%%Hex%"  
set /a Rest=Rest/16
goto :WandlungDezHex

:HEXCONVERT
set "strHex=%Hex%"  

set "strHex=0000000000000000%strHex%"  
set "strHex=%strHex:~-16%"  

:MAKEREG
ECHO. >> "%cd%\saferDLL.reg"  
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\%GUID%] >> "saferDLL.reg"  
REM TODO: Auslesen der letzten Dateiaenderung und anpassen des Formats (xx,xx,xx,xx...)
ECHO >> "%cd%\saferDLL.reg" "LastModified"=hex(b):  
REM TODO: Anpassung der Beschreibung
ECHO >> "%cd%\saferDLL.reg" "Description"="%FILEPATH:\=\\%"   
REM TODO: Bessere Benennung des FriendlyName
ECHO >> "%cd%\saferDLL.reg" "FriendlyName"="%FILENAME%"   
REM Zu "SaferFlags" existiert keine Doku, Wert bei Hash und SHA1 siehe unten  
ECHO >> "%cd%\saferDLL.reg" "SaferFlags"=dword:00000000   
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD
ECHO >> "%cd%\saferDLL.reg" "ItemSize"=hex(b):%strHex:~-2%,%strHex:~-4,2%,%strHex:~-6,2%,%strHex:~-8,2%,%strHex:~-10,2%,%strHex:~-12,2%,%strHex:~-14,2%,%strHex:~,2%   
REM Aufsplitten des Hashs in Zweiergruppen
ECHO >> "sha1.txt" "ItemData"=hex:%HASH%   
ECHO >> "%cd%\saferDLL.reg" "ItemData"=hex:%HASH:~0,2%,%HASH:~2,2%,%HASH:~4,2%,%HASH:~6,2%,%HASH:~8,2%,%HASH:~10,2%,%HASH:~12,2%,%HASH:~14,2%,%HASH:~16,2%,%HASH:~18,2%,%HASH:~20,2%,%HASH:~22,2%,%HASH:~24,2%,%HASH:~26,2%,%HASH:~28,2%,%HASH:~30,2%  
REM Hash Algorithmus wird auf SHA1 gesetzt: 0x8003 (32771) = MD5, 0x8004 (32772) = SHA1
ECHO >> "%cd%\saferDLL.reg" "HashAlg"=dword:00008003   

GOTO :EOF

:CLEAN
del GUID.txt
del HASH.txt
GOTO :EOF
rubberman
rubberman 04.01.2013 aktualisiert um 19:51:20 Uhr
Goto Top
Hi.

Ja, liegt am Wechsel der Arbeitsverzeichnisse. Dass lässt sich leicht beheben, indem man PUSHD und POPD mit dem DIR verknüpft. Somit findet die weitere Verarbeitung wieder im ursprünglichen Arbeitsverzeichnis statt.
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do (  
  for /f "delims=" %%j in ('pushd %%i ^& dir /a-d /b /s *.cmd *.exe *.ocx *.jar ^& popd') do (  
    set "FILEPATH=%%~j"  
    set "FILESIZE=%%~zj"  
    set "FILENAME=%%~nj"  
    call :MAKERULE
  )
)
Grüße
rubberman
speedy26gonzales
speedy26gonzales 04.01.2013 um 21:25:38 Uhr
Goto Top
Thanks, jetzt siehts so aus als würde es funktionieren.

Wenn ich oben in der ersten Zeile: set olddir=%cd% mache, kann ich doch in der ganzen Batch mit %olddir% auf das ausführende Verzeichniss zugreifen oder? Die Variable wird ja nicht überschrieben?

Macht es Sinn anstatt C:\Pfad1 , Registrierungspfade oder Umgebungsvariablen zu benutzen?
rubberman
rubberman 04.01.2013 um 22:56:14 Uhr
Goto Top
Die Variable wird ja nicht überschrieben?
Nicht solange du sie nicht explizit überschreibst.

Macht es Sinn anstatt C:\Pfad1 , Registrierungspfade oder Umgebungsvariablen zu benutzen?
Ich sehe kein Problem in der Verwendung von Umgebungsvariablen.

Was du mit "Registrierungspfade" meinst, müsstest du aber noch mal erläutern. Willst du DIR auf die Registry loslassen? Das funktioniert natürlich nicht. Dafür gibt es REG QUERY.

Grüße
rubberman