Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: speedy26gonzales

speedy26gonzales (Level 1) - Jetzt verbinden

17.11.2012, aktualisiert 22.11.2012, 6653 Aufrufe, 50 Kommentare

Hallo,

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

50 Antworten
Mitglied: bastla
17.11.2012 um 16:01 Uhr
Hallo speedy26gonzales!

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

Grüße
bastla
Bitte warten ..
Mitglied: rubberman
17.11.2012, aktualisiert um 16:13 Uhr
Hallo speedy26gonzales und bastla.

Wie immer - viele Wege führen nach Rom.

01.
@echo off &setlocal 
02.
set /a num = 123 
03.
 
04.
cmd /c exit /b %num% 
05.
for /f "tokens=* delims=0" %%i in ("%=ExitCode%") do set "hex=%%i" 
06.
 
07.
echo %hex% 
08.
pause
Grüße
rubberman
Bitte warten ..
Mitglied: bastla
17.11.2012 um 18:43 Uhr
Hallo rubberman!

Sehr hybsch ...

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

Grüße
bastla
Bitte warten ..
Mitglied: rubberman
17.11.2012 um 19:34 Uhr
[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.

01.
@echo off &setlocal 
02.
cd /d C:\Windows 
03.
cd /d D:\ 
04.
cmd /c exit /b 65 
05.
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]
Bitte warten ..
Mitglied: speedy26gonzales
17.11.2012, aktualisiert um 21:45 Uhr
Hi,

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

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

01.
REM DEZ in HEX Umrechnung 
02.
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F" 
03.
 
04.
set /a Dez = %FILESIZE% 
05.
set /a Rest=Dez 
06.
set "Hex=" 
07.
 
08.
:LoopDezHex 
09.
if %Rest%==0 goto :MAKEREG 
10.
set /a Ziffer=Rest%%16 
11.
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%" 
12.
set "Hex=%Ziffer%%Hex%" 
13.
set /a Rest=Rest/16 
14.
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:

01.
REM Programm durchsucht das komplette Laufwerk nach *.EXE Dateien 
02.
@ECHO OFF 
03.
REM Skript wird in UniCode geschrieben 
04.
ECHO Windows Registry Editor Version 5.00 > "safer.reg" 
05.
ECHO. >> "safer.reg" 
06.
REM Durchsucht das angegebene Laufwerk nach *.Exe Dateien und bei jeder gefundenen Datei ruft er das Unterprogramm auf 
07.
FOR /R "%SystemDrive%" %%I IN ("*.exe") DO CALL :MAKERULE "%%I"  
08.
CALL :CLEAN 
09.
EXIT /B 
10.
 
11.
:MAKERULE 
12.
REM Schreibe Pfadname 
13.
SET FILEPATH=%~1 
14.
SET FILESIZE=%~z1 
15.
SET FILENAME=%~n1 
16.
REM Erstelle eine GUID 
17.
cscript.exe //NoLogo uuid.vbs > "GUID.txt" 
18.
SET /P GUID=<GUID.txt 
19.
REM Erstelle einen sha1 - HASH 
20.
fciv.exe -add "%~1" -sha1 > "HASH.txt" 
21.
FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a) 
22.
 
23.
REM DEZ in HEX Umrechnung 
24.
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F" 
25.
 
26.
set /a Dez = %FILESIZE% 
27.
set /a Rest=Dez 
28.
set "Hex=" 
29.
 
30.
:LoopDezHex 
31.
if %Rest%==0 goto :MAKEREG 
32.
set /a Ziffer=Rest%%16 
33.
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%" 
34.
set "Hex=%Ziffer%%Hex%" 
35.
set /a Rest=Rest/16 
36.
goto :LoopDezHex 
37.
 
38.
REM echo Hexadezimal: %Hex% 
39.
 
40.
REM CALL :MAKEREG 
41.
REM GOTO :EOF 
42.
 
43.
:MAKEREG 
44.
ECHO. >> "safer.reg" 
45.
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\%GUID%] >> "safer.reg" 
46.
REM TODO: Auslesen der letzten Dateiaenderung und anpassen des Formats (xx,xx,xx,xx...) 
47.
ECHO >> "safer.reg" "LastModified"=hex(b):  
48.
REM TODO: Anpassung der Beschreibung 
49.
ECHO >> "safer.reg" "Description"="%FILEPATH%"  
50.
REM TODO: Bessere Benennung des FriendlyName 
51.
ECHO >> "safer.reg" "FriendlyName"="%FILENAME%"  
52.
REM Zu "SaferFlags" existiert keine Doku, Wert immer 0 
53.
ECHO >> "safer.reg" "SaferFlags"=dword:00000000  
54.
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD 
55.
ECHO >> "safer.reg" "ItemSize"=hex(b):%Hex%  
56.
REM Aufsplitten des Hashs in Zweiergruppen 
57.
ECHO >> "sha1.txt" "ItemData"=hex:%HASH%  
58.
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% 
59.
REM Hash Algorithmus wird auf SHA1 gesetzt: 0x8003 (32771) = MD5, 0x8004 (32772) = SHA1 
60.
ECHO >> "safer.reg" "HashAlg"=dword:00008004  
61.
ECHO. >> "safer.reg" 
62.
GOTO :EOF 
63.
 
64.
:CLEAN 
65.
del GUID.txt 
66.
del HASH.txt 
67.
GOTO :EOF
Vielleicht könnt Ihr mir hier auch etwas weiterhelfen bei meinen noch offenen Punkten?
Bitte warten ..
Mitglied: rubberman
18.11.2012 um 01:00 Uhr
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:
01.
set "strHex=FFFFFFFFFFFFFFFF" 
02.
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
Bitte warten ..
Mitglied: speedy26gonzales
18.11.2012, aktualisiert um 01:14 Uhr
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?
Bitte warten ..
Mitglied: rubberman
18.11.2012, aktualisiert um 01:59 Uhr
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:
01.
set "strHex=A1B2AF" 
02.
 
03.
set "strHex=0000000000000000%strHex%" 
04.
set "strHex=%strHex:~-16%" 
05.
 
06.
>>"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
Bitte warten ..
Mitglied: speedy26gonzales
19.11.2012, aktualisiert um 15:56 Uhr
Zitat von rubberman:
01.
> set "strHex=A1B2AF" -> Hier wird ein Hexwert gesetzt 
02.
>  
03.
> set "strHex=0000000000000000%strHex%" -> Hier wird mit 16 Nullen aufgefüllt und daran der Hexwert von oben gehängt. 
04.
> 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 
05.
>  
06.
> >>"test.reg" echo -> Erstellt die Datei "test.reg" 
07.
> "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?  
08.
 
09.
> 

Hi rubberman,

Danke erst mal. Ich habe deinen Code mal eingebaut und es scheint wirklich zu gehen . 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:
01.
REM DEZ in HEX Umrechnung 
02.
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F" 
03.
 
04.
set /a Dez = %FILESIZE% 
05.
set /a Rest=Dez 
06.
set "Hex=" 
07.
 
08.
:WandlungDezHex 
09.
if %Rest%==0 goto :HEXCONVERT 
10.
set /a Ziffer=Rest%%16 
11.
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%" 
12.
set "Hex=%Ziffer%%Hex%" 
13.
set /a Rest=Rest/16 
14.
goto :WandlungDezHex 
15.
 
16.
:HEXCONVERT 
17.
set "strHex=%Hex%" 
18.
 
19.
set "strHex=0000000000000000%strHex%" 
20.
set "strHex=%strHex:~-16%"
Ausgabe:
01.
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD 
02.
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% 
Bitte warten ..
Mitglied: rubberman
19.11.2012, aktualisiert um 17:37 Uhr
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:
01.
@echo off &setlocal 
02.
 
03.
set "strBigint=18446744073709551615" 
04.
:: set "strBigint=1311768467294899695" 
05.
:: set "strBigint=15" 
06.
 
07.
setlocal EnableDelayedExpansion 
08.
set "strHex=" 
09.
set "strPool=0123456789ABCDEF" 
10.
set "strBigint=00000000000000000000%strBigint%" 
11.
for /f "tokens=* delims=0" %%i in ("%strBigint:~-20,5%") do set "int4=%%i" &if not defined int4 set "int4=0" 
12.
for /f "tokens=* delims=0" %%i in ("%strBigint:~-15,5%") do set "int3=%%i" &if not defined int3 set "int3=0" 
13.
for /f "tokens=* delims=0" %%i in ("%strBigint:~-10,5%") do set "int2=%%i" &if not defined int2 set "int2=0" 
14.
for /f "tokens=* delims=0" %%i in ("%strBigint:~-5%")    do set "int1=%%i" &if not defined int1 set "int1=0" 
15.
for /l %%i in (1,1,16) do ( 
16.
    set /a "int3 += (int4 & 15) * 100000 , int4 >>= 4" 
17.
    set /a "int2 += (int3 & 15) * 100000 , int3 >>= 4" 
18.
    set /a "int1 += (int2 & 15) * 100000 , int2 >>= 4" 
19.
    set /a "x = int1 & 15 , int1 >>= 4" 
20.
    for %%j in (!x!) do set "strHex=!strPool:~%%j,1!!strHex!" 
21.
22.
endlocal &set "strHex=%strHex%" 
23.
 
24.
echo %strHex% 
25.
 
26.
pause
Grüße
rubberman
Bitte warten ..
Mitglied: speedy26gonzales
19.11.2012 um 21:29 Uhr
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
Bedeutet dein letzter Post dass ich eher die Lösung als die vorher eingebaut nutzen soll?
Bitte warten ..
Mitglied: rubberman
19.11.2012 um 21:46 Uhr
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
Bitte warten ..
Mitglied: speedy26gonzales
19.11.2012 um 22:04 Uhr
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:

01.
REM Programm durchsucht das komplette Laufwerk nach *.EXE Dateien 
02.
@echo off & setlocal 
03.
REM Skript wird in ANSI geschrieben 
04.
ECHO Windows Registry Editor Version 5.00 > "safer.reg" 
05.
ECHO. >> "safer.reg" 
06.
REM Durchsucht das angegebene Laufwerk nach *.Exe Dateien und bei jeder gefundenen Datei ruft er das Unterprogramm auf 
07.
FOR /R "%SystemDrive%" %%I IN ("*.exe") DO CALL :MAKERULE "%%I"  
08.
CALL :CLEAN 
09.
EXIT /B 
10.
 
11.
:MAKERULE 
12.
REM Schreibe Pfadname 
13.
SET FILEPATH=%~1 
14.
SET FILESIZE=%~z1 
15.
SET FILENAME=%~n1 
16.
REM Erstelle eine GUID 
17.
cscript.exe //NoLogo uuid.vbs > "GUID.txt" 
18.
SET /P GUID=<GUID.txt 
19.
REM Erstelle einen sha1 - HASH 
20.
fciv.exe -add "%~1" -sha1 > "HASH.txt" 
21.
FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a) 
22.
 
23.
REM DEZ in HEX Umrechnung 
24.
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F" 
25.
 
26.
set /a Dez = %FILESIZE% 
27.
set /a Rest=Dez 
28.
set "Hex=" 
29.
 
30.
:WandlungDezHex 
31.
if %Rest%==0 goto :HEXCONVERT 
32.
set /a Ziffer=Rest%%16 
33.
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%" 
34.
set "Hex=%Ziffer%%Hex%" 
35.
set /a Rest=Rest/16 
36.
goto :WandlungDezHex 
37.
 
38.
:HEXCONVERT 
39.
set "strHex=%Hex%" 
40.
 
41.
set "strHex=0000000000000000%strHex%" 
42.
set "strHex=%strHex:~-16%" 
43.
 
44.
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% 
45.
REM echo Hexadezimal: %Hex% 
46.
REM CALL :MAKEREG 
47.
REM GOTO :EOF 
48.
 
49.
:MAKEREG 
50.
ECHO. >> "safer.reg" 
51.
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\%GUID%] >> "safer.reg" 
52.
REM TODO: Auslesen der letzten Dateiaenderung und anpassen des Formats (xx,xx,xx,xx...) 
53.
ECHO >> "safer.reg" "LastModified"=hex(b):  
54.
REM TODO: Anpassung der Beschreibung 
55.
ECHO >> "safer.reg" "Description"="%FILEPATH%"  
56.
REM TODO: Bessere Benennung des FriendlyName 
57.
ECHO >> "safer.reg" "FriendlyName"="%FILENAME%"  
58.
REM Zu "SaferFlags" existiert keine Doku, Wert immer 0 
59.
ECHO >> "safer.reg" "SaferFlags"=dword:00000000  
60.
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD 
61.
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%  
62.
REM Aufsplitten des Hashs in Zweiergruppen 
63.
ECHO >> "sha1.txt" "ItemData"=hex:%HASH%  
64.
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% 
65.
REM Hash Algorithmus wird auf SHA1 gesetzt: 0x8003 (32771) = MD5, 0x8004 (32772) = SHA1 
66.
ECHO >> "safer.reg" "HashAlg"=dword:00008004  
67.
ECHO. >> "safer.reg" 
68.
GOTO :EOF 
69.
 
70.
:CLEAN 
71.
del GUID.txt 
72.
del HASH.txt 
73.
GOTO :EOF
Bitte warten ..
Mitglied: rubberman
19.11.2012 um 22:51 Uhr
Hi.

Welchen Wert hat denn die Umgebungsvariable %SytemDrive% auf deinem virtuellen Testsystem?
Bitte warten ..
Mitglied: speedy26gonzales
19.11.2012, aktualisiert 20.11.2012
Wenn ich ne Batch schreibe:
01.
 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:
01.
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?
Bitte warten ..
Mitglied: rubberman
20.11.2012 um 00:26 Uhr
Hallo.

Zitat von speedy26gonzales:
Verhält sich dann unter WindowsXP und Windows7 doch anderst ??
Scheint so
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.
Bitte warten ..
Mitglied: bastla
20.11.2012 um 08:00 Uhr
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
Bitte warten ..
Mitglied: rubberman
20.11.2012 um 12:52 Uhr
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
Bitte warten ..
Mitglied: speedy26gonzales
20.11.2012 um 13:10 Uhr
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:
Bitte warten ..
Mitglied: rubberman
20.11.2012 um 14:13 Uhr
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 ...

Grüße
rubberman
Bitte warten ..
Mitglied: bastla
20.11.2012 um 15:21 Uhr
Hallo rubberman!

Ich staune mit Dir ...

Grüße
bastla
Bitte warten ..
Mitglied: speedy26gonzales
21.11.2012, aktualisiert um 20:06 Uhr
Freut mich dass ich Euch Profis auch noch zum staunen gebracht hab

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

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

Grüße
rubberman
Bitte warten ..
Mitglied: speedy26gonzales
21.11.2012, aktualisiert um 20:07 Uhr
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.
Bitte warten ..
Mitglied: speedy26gonzales
21.11.2012, aktualisiert um 20:44 Uhr
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.
Bitte warten ..
Mitglied: rubberman
21.11.2012, aktualisiert 23.11.2012
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 ~~~
01.
FOR /F "DELIMS=" %%I IN ('DIR /A-D /B /S "%SystemDrive:~,2%\*.exe"') DO ( 
02.
  REM Schreibe Pfadname 
03.
  SET "FILEPATH=%%~I" 
04.
  SET "FILESIZE=%%~zI" 
05.
  SET "FILENAME=%%~nI 
06.
  CALL :MAKERULE 
07.
08.
CALL :CLEAN 
09.
EXIT /B 
10.
 
11.
:MAKERULE 
12.
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
Teste einfach aus, ob der Wert notwendig ist.

Grüße
rubberman

Edit: Option /S vergessen
Bitte warten ..
Mitglied: speedy26gonzales
21.11.2012 um 20:55 Uhr
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.
Bitte warten ..
Mitglied: rubberman
21.11.2012, aktualisiert um 21:22 Uhr
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?
Bitte warten ..
Mitglied: speedy26gonzales
21.11.2012, aktualisiert um 21:57 Uhr
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".

01.
Windows Registry Editor Version 5.00 
02.
 
03.
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\{5e0d40e2-cfb8-447a-8cc1-68cc94dad214}] 
04.
"LastModified"=hex(b):e1,f1,0d,c7,28,c8,cd,01 
05.
"Description"="" 
06.
"FriendlyName"=" (14.0.1.4577)" 
07.
"SaferFlags"=dword:00040000 (32771) 
08.
"ItemSize"=hex(b):e0,f1,0d,00,00,00,00,00 
09.
"ItemData"=hex:3f,67,71,72,f2,3f,c1,72,83,d9,bc,e4,b4,2e,3f,65 
10.
"HashAlg"=dword:00008003 (262144) 
11.
 
12.
 
13.
Windows Registry Editor Version 5.00 
14.
 
15.
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\{5e0d40e2-cfb8-447b-8cc1-68cc94dad214}] 
16.
"LastModified"=hex(b):e1,f1,0d,c7,28,c8,cd,01 
17.
"Description"="" 
18.
"FriendlyName"=" (14.0.1.4577)" 
19.
"SaferFlags"=dword:00040004 (262148) 
20.
"ItemSize"=hex(b):e0,f1,0d,00,00,00,00,00 
21.
"ItemData"=hex:65,d0,2a,50,d0,d8,8e,65,d2,d7,53,39,dd,27,19,78,c1,ea,50,37 
22.
"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.
Bitte warten ..
Mitglied: rubberman
21.11.2012, aktualisiert um 22:23 Uhr
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.
01.
REM Erstelle eine GUID 
02.
:: cscript.exe //NoLogo uuid.vbs > "GUID.txt" 
03.
:: SET /P GUID=<GUID.txt 
04.
FOR /F %%i IN  ('cscript //nologo uuid.vbs') DO SET "GUID=%%i" 
05.
 
06.
REM Erstelle einen sha1 - HASH 
07.
:: fciv.exe -add "%~1" -sha1 > "HASH.txt" 
08.
:: FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a) 
09.
FOR /F "skip=3" %%a IN ('fciv.exe -add "%FILEPATH%" -sha1') DO SET "HASH=%%a"
Grüße
rubberman
Bitte warten ..
Mitglied: speedy26gonzales
22.11.2012 um 12:59 Uhr
> 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 , 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
Bitte warten ..
Mitglied: rubberman
22.11.2012 um 14:08 Uhr
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
Bitte warten ..
Mitglied: speedy26gonzales
22.11.2012, aktualisiert 27.11.2012
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 ?
Bitte warten ..
Mitglied: rubberman
22.11.2012, aktualisiert 23.11.2012
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 ).
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
Bitte warten ..
Mitglied: speedy26gonzales
23.11.2012, aktualisiert um 09:15 Uhr
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
).
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.
Bitte warten ..
Mitglied: rubberman
23.11.2012, aktualisiert um 15:21 Uhr
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 .

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
01.
set "fpath=c:\pagefile.sys" 
02.
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
Bitte warten ..
Mitglied: speedy26gonzales
26.11.2012 um 11:54 Uhr
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 .
Mein Code um eine GUID zu erzeugen sieht ja so aus:
01.
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.
Bitte warten ..
Mitglied: speedy26gonzales
26.11.2012, aktualisiert um 16:11 Uhr
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:

01.
REM Startskript 
02.
REM @echo off & setlocal 
03.
@prompt $g  
04.
set olddir=%cd% 
05.
 
06.
ECHO Erstelle die MD5-Hashs 
07.
set Suchpfad=%SystemDrive:~,2%\Windows 
08.
set DateiCMD=cmd 
09.
set DateiEXE=exe 
10.
set DateiJAR=jar 
11.
set DateiOCX=ocx 
12.
set Hashversion=md5 
13.
 
14.
mkdir "%olddir%"\"%Hashversion%" 
15.
set Speicherpfad=%olddir%\%Hashversion% 
16.
ECHO "%Speicherpfad%" >>Test2.txt 
17.
 
18.
call "%cd%\Main.cmd" "%Suchpfad%" "%DateiCMD%" "%Speicherpfad%" 
19.
PAUSE 
20.
call "%cd%\Main.cmd" "%Suchpfad%" "%DateiEXE%" "%Speicherpfad%" 
21.
PAUSE 
22.
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:
01.
REM Programm durchsucht das komplette Laufwerk nach *.EXE Dateien 
02.
REM @echo off & setlocal 
03.
@prompt $g 
04.
REM Skript wird in ANSI geschrieben 
05.
SET Speicherpfad=%~3\safer_%~2.reg 
06.
ECHO "%Speicherpfad%" >> Test3.txt 
07.
ECHO Windows Registry Editor Version 5.00 > "%Speicherpfad%" 
08.
ECHO. >> "%Speicherpfad%" 
09.
REM Durchsucht das angegebene Laufwerk nach *.Exe Dateien und bei jeder gefundenen Datei ruft er das Unterprogramm auf 
10.
REM FOR /R "%SystemDrive%" %%I IN ("*.exe") DO CALL :MAKERULE "%%I"  
11.
FOR /R "%~1" %%I IN ("*.%~2") DO CALL :MAKERULE "%%I" 
12.
CALL :CLEAN 
13.
EXIT /B 
14.
 
15.
:MAKERULE 
16.
REM Schreibe Pfadname 
17.
SET FILEPATH=%~1 
18.
SET FILESIZE=%~z1 
19.
SET FILENAME=%~n1 
20.
REM Erstelle eine GUID 
21.
cscript.exe //NoLogo uuid.vbs > "GUID.txt" 
22.
SET /P GUID=<GUID.txt 
23.
REM Erstelle einen sha1 - HASH 
24.
fciv.exe -add "%~1" -md5 > "HASH.txt" 
25.
FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a) 
26.
 
27.
REM DEZ in HEX Umrechnung 
28.
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F" 
29.
 
30.
set /a Dez = %FILESIZE% 
31.
set /a Rest=Dez 
32.
set "Hex=" 
33.
 
34.
:WandlungDezHex 
35.
if %Rest%==0 goto :HEXCONVERT 
36.
set /a Ziffer=Rest%%16 
37.
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%" 
38.
set "Hex=%Ziffer%%Hex%" 
39.
set /a Rest=Rest/16 
40.
goto :WandlungDezHex 
41.
 
42.
:HEXCONVERT 
43.
set "strHex=%Hex%" 
44.
 
45.
set "strHex=0000000000000000%strHex%" 
46.
set "strHex=%strHex:~-16%" 
47.
 
48.
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% 
49.
REM echo Hexadezimal: %Hex% 
50.
REM CALL :MAKEREG 
51.
REM GOTO :EOF 
52.
 
53.
:MAKEREG 
54.
ECHO. >> "%Speicherpfad%" 
55.
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\%GUID%] >> "%Speicherpfad%" 
56.
REM TODO: Auslesen der letzten Dateiaenderung und anpassen des Formats (xx,xx,xx,xx...) 
57.
ECHO >> "%Speicherpfad%" "LastModified"=hex(b):  
58.
REM TODO: Anpassung der Beschreibung 
59.
ECHO >> "%Speicherpfad%" "Description"="%FILEPATH%"  
60.
REM TODO: Bessere Benennung des FriendlyName 
61.
ECHO >> "%Speicherpfad%" "FriendlyName"="%FILENAME%"  
62.
REM Zu "SaferFlags" existiert keine Doku, Wert bei Hash und SHA1 siehe unten 
63.
ECHO >> "%Speicherpfad%" "SaferFlags"=dword:00040004  
64.
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD 
65.
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%  
66.
REM Aufsplitten des Hashs in Zweiergruppen 
67.
ECHO >> "sha1.txt" "ItemData"=hex:%HASH%  
68.
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% 
69.
REM Hash Algorithmus wird auf SHA1 gesetzt: 0x8003 (32771) = MD5, 0x8004 (32772) = SHA1 
70.
ECHO >> "%Speicherpfad%" "HashAlg"=dword:00008004  
71.
ECHO. >> "%Speicherpfad%" 
72.
GOTO :EOF 
73.
 
74.
:CLEAN 
75.
del GUID.txt 
76.
del HASH.txt 
77.
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.
Bitte warten ..
Mitglied: rubberman
26.11.2012 um 19:04 Uhr
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
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
01.
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do ( 
02.
  pushd %%i 
03.
  for /f "delims=" %%j in ('dir /a-d /b /s *.cmd *.exe *.ocx *.jar') do ( 
04.
    call :MAKERULE "%%j" 
05.
06.
  popd 
07.
)
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
Bitte warten ..
Mitglied: speedy26gonzales
26.11.2012 um 23:40 Uhr
Zitat von rubberman:
Folgender Änderungsvorschlag:
~~~ snip ~~~
01.
> FOR /F "DELIMS=" %%I IN ('DIR /A-D /B /S "%SystemDrive:~,2%\*.exe"') DO ( 
02.
>   REM Schreibe Pfadname 
03.
>   SET "FILEPATH=%%~I" 
04.
>   SET "FILESIZE=%%~zI" 
05.
>   SET "FILENAME=%%~nI 
06.
>   CALL :MAKERULE 
07.
> ) 
08.
> CALL :CLEAN 
09.
> EXIT /B 
10.
>  
11.
> :MAKERULE 
12.
> REM Erstelle eine GUID 
13.
> 
~~~ 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:
01.
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\{1C5C418A-F79A-4F60-95D4-9740DE19EED0}]  
02.
 "LastModified"=hex(b):  
03.
 "Description"="C:\AUTOEXEC.BAT"  
04.
 "FriendlyName"="AUTOEXEC"  
05.
 "SaferFlags"=dword:00040000  
06.
 "ItemSize"=hex(b):00,00,00,00,00,00,00,00  
07.
 "ItemData"=hex:To,,,,,,,,,,,,,,, 
08.
 "HashAlg"=dword:00008003 
Mein Skript sieht so aus:
01.
FOR /F "DELIMS=" %%I IN ('DIR /A-D /B /S "%SystemDrive:~,2%\*.*"') DO ( 
02.
  REM Schreibe Pfadname 
03.
  SET "FILEPATH=%%~I" 
04.
  SET "FILESIZE=%%~zI" 
05.
  SET "FILENAME=%%~nI 
06.
  CALL :MAKERULE 
07.
08.
CALL :CLEAN 
09.
EXIT /B 
10.
 
11.
:MAKERULE 
12.
REM Erstelle eine GUID 
13.
cscript.exe //NoLogo uuid.vbs > "GUID.txt" 
14.
SET /P GUID=<GUID.txt 
15.
REM Erstelle einen sha1 - HASH 
16.
fciv.exe -add "%~1" -md5 > "HASH.txt" 
17.
FOR /F "skip=3 eol=; tokens=1 usebackq delims= " %%a IN ("HASH.txt") DO (SET HASH=%%a)
Bitte warten ..
Mitglied: rubberman
26.11.2012, aktualisiert um 23:56 Uhr
Hi,

%1 gibt es nicht mehr als Parameter, da keiner mehr übergeben wird.
fciv.exe -add "%FILEPATH%" -md5 > "HASH.txt"
Grüße
rubberman
Bitte warten ..
Mitglied: speedy26gonzales
27.11.2012, aktualisiert um 02:36 Uhr
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
Bitte warten ..
Mitglied: rubberman
27.11.2012, aktualisiert um 00:27 Uhr
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
Bitte warten ..
Mitglied: speedy26gonzales
27.11.2012 um 01:14 Uhr
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.
Bitte warten ..
Mitglied: speedy26gonzales
04.01.2013 um 15:33 Uhr
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:
01.
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do ( 
02.
  pushd %%i 
03.
  for /f "delims=" %%j in ('dir /a-d /b /s *.cmd *.exe *.ocx *.jar') do ( 
04.
    call :MAKERULE "%%j" 
05.
06.
  popd 
07.
)
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?
Bitte warten ..
Mitglied: rubberman
04.01.2013, aktualisiert um 16:30 Uhr
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.
01.
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do ( 
02.
  pushd %%i 
03.
  for /f "delims=" %%j in ('dir /a-d /b /s *.cmd *.exe *.ocx *.jar') do ( 
04.
    set "FILEPATH=%%~j" 
05.
    set "FILESIZE=%%~zj" 
06.
    set "FILENAME=%%~nj" 
07.
    call :MAKERULE 
08.
09.
  popd 
10.
)
Grüße
rubberman
Bitte warten ..
Mitglied: speedy26gonzales
04.01.2013 um 18:01 Uhr
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:
01.
REM Programm durchsucht das komplette Laufwerk nach *.EXE Dateien 
02.
REM @echo off & setlocal 
03.
@setlocal 
04.
@prompt $g 
05.
set olddir=%cd% 
06.
REM Skript wird in ANSI geschrieben 
07.
ECHO Windows Registry Editor Version 5.00 > "%cd%\saferDLL.reg" 
08.
ECHO. >> "%cd%\saferDLL.reg" 
09.
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes] >> "%cd%\saferDLL.reg"  
10.
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do ( 
11.
  pushd %%i 
12.
  for /f "delims=" %%j in ('dir /a-d /b /s *.cmd *.exe *.ocx *.jar') do ( 
13.
    REM Schreibe Pfadname 
14.
	SET "FILEPATH=%%~j" 
15.
	SET "FILESIZE=%%~zj" 
16.
	SET "FILENAME=%%~nj" 
17.
	call :MAKERULE  
18.
19.
  popd 
20.
21.
 
22.
CALL :CLEAN 
23.
EXIT /B 
24.
 
25.
:MAKERULE 
26.
REM Erstelle eine GUID 
27.
FOR /F %%i IN  ('cscript //nologo uuid.vbs') DO SET "GUID=%%i" 
28.
REM Erstelle einen sha1 - HASH 
29.
FOR /F "skip=3" %%a IN ('fciv.exe -add "%FILEPATH%" -sha1') DO SET "HASH=%%a" 
30.
 
31.
REM DEZ in HEX Umrechnung 
32.
set "Z10=A" & set "Z11=B" & set "Z12=C" & set "Z13=D" & set "Z14=E" & set "Z15=F" 
33.
 
34.
set /a Dez = %FILESIZE% 
35.
set /a Rest=Dez 
36.
set "Hex=" 
37.
 
38.
:WandlungDezHex 
39.
if %Rest%==0 goto :HEXCONVERT 
40.
set /a Ziffer=Rest%%16 
41.
if %Ziffer% gtr 9 call set "Ziffer=%%Z%Ziffer%%%" 
42.
set "Hex=%Ziffer%%Hex%" 
43.
set /a Rest=Rest/16 
44.
goto :WandlungDezHex 
45.
 
46.
:HEXCONVERT 
47.
set "strHex=%Hex%" 
48.
 
49.
set "strHex=0000000000000000%strHex%" 
50.
set "strHex=%strHex:~-16%" 
51.
 
52.
:MAKEREG 
53.
ECHO. >> "%cd%\saferDLL.reg" 
54.
ECHO [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers\262144\Hashes\%GUID%] >> "saferDLL.reg" 
55.
REM TODO: Auslesen der letzten Dateiaenderung und anpassen des Formats (xx,xx,xx,xx...) 
56.
ECHO >> "%cd%\saferDLL.reg" "LastModified"=hex(b): 
57.
REM TODO: Anpassung der Beschreibung 
58.
ECHO >> "%cd%\saferDLL.reg" "Description"="%FILEPATH:\=\\%"  
59.
REM TODO: Bessere Benennung des FriendlyName 
60.
ECHO >> "%cd%\saferDLL.reg" "FriendlyName"="%FILENAME%"  
61.
REM Zu "SaferFlags" existiert keine Doku, Wert bei Hash und SHA1 siehe unten 
62.
ECHO >> "%cd%\saferDLL.reg" "SaferFlags"=dword:00000000  
63.
REM TODO: Umrechnung von dezimal in hex und konvertierung in REG_QWORD 
64.
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%  
65.
REM Aufsplitten des Hashs in Zweiergruppen 
66.
ECHO >> "sha1.txt" "ItemData"=hex:%HASH%  
67.
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% 
68.
REM Hash Algorithmus wird auf SHA1 gesetzt: 0x8003 (32771) = MD5, 0x8004 (32772) = SHA1 
69.
ECHO >> "%cd%\saferDLL.reg" "HashAlg"=dword:00008003  
70.
 
71.
GOTO :EOF 
72.
 
73.
:CLEAN 
74.
del GUID.txt 
75.
del HASH.txt 
76.
GOTO :EOF
Bitte warten ..
Mitglied: rubberman
04.01.2013, aktualisiert um 19:51 Uhr
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.
01.
for %%i in ("c:\pfad1" "d:\pfad2" "x:\pfad3" "z:\pfad4") do ( 
02.
  for /f "delims=" %%j in ('pushd %%i ^& dir /a-d /b /s *.cmd *.exe *.ocx *.jar ^& popd') do ( 
03.
    set "FILEPATH=%%~j" 
04.
    set "FILESIZE=%%~zj" 
05.
    set "FILENAME=%%~nj" 
06.
    call :MAKERULE 
07.
08.
)
Grüße
rubberman
Bitte warten ..
Mitglied: speedy26gonzales
04.01.2013 um 21:25 Uhr
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?
Bitte warten ..
Mitglied: rubberman
04.01.2013 um 22:56 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Netzwerkgrundlagen
IPsec - .conf und .secret erstellen aus Gruppe und User (16)

Frage von MaxMLe zum Thema Netzwerkgrundlagen ...

RedHat, CentOS, Fedora
gelöst Erstellen von Desktopverknüpfungen und Anpassung der Taskleiste (2)

Frage von honeybee zum Thema RedHat, CentOS, Fedora ...

Vmware
ESXI Template erstellen (2)

Frage von Phill93 zum Thema Vmware ...

Batch & Shell
Ordner erstellen ll Datei hinein kopieren (1)

Frage von heyalice zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...