scanco
Goto Top

Mit VB Script einen hexadezimalen DWORD-Wert eintragen

Nach langem Googlen immer noch keine Lösung

Hallo,

nachdem ich nun stundenlang das Internet durchsucht und so manchen Tipp probiert habe, fand ich leider bisher immer noch keine Lösung

Ich möchte mit VBScript einen Eintrag in die Registry schreiben. Schwierigkeit: Es ist ein langer hexadezimaler DWORD-Eintrag.
Normale Zeichenfolgen eintragen ist ja mit "WSHShell.RegWrite" kein Problem. Allerdings scheitert es hier an dem Hex-Wert

Mein Befehl sieht so aus:
WSHShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002\New Signature" , "53 00 49 00 47 00 4e 00 41 00 54 00 55 00 52 00 00 00" , "REG_DWORD"  

Leider erhalte ich dann immer den Hinweis:
Laufzeitfehler in Microsoft VBScript
Code: 800A000D
Fehler: Typen unverträglich

Kann mir da jemand helfen?

Vielen Dank

Content-Key: 149788

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

Printed on: April 23, 2024 at 10:04 o'clock

Member: DerWoWusste
DerWoWusste Aug 26, 2010 at 12:18:02 (UTC)
Goto Top
Moin.
Keine Lösung für Dich, aber: warum nicht per regedit /s regfile.reg lösen?
Member: scanco
scanco Aug 26, 2010 at 12:19:39 (UTC)
Goto Top
Das wär dann die Notlösung...
Am besten wärs allerdings wenn alles in einem VB Script abläuft und keine zusätzlichen Dateien notwendig wären...
Mitglied: 76109
76109 Aug 26, 2010 at 13:00:57 (UTC)
Goto Top
Hallo scanco!

Kommentar erstmal wieder entferntface-wink

Gruß Dieter
Member: scanco
scanco Aug 26, 2010 at 13:17:49 (UTC)
Goto Top
Zitat von @76109:
Hallo scanco!

Kommentar erstmal wieder entferntface-wink

Gruß Dieter

Kapier ich jetzt ned...
Mitglied: 76109
76109 Aug 26, 2010 at 13:23:30 (UTC)
Goto Top
Hallo scanco!

Tja, dachte ich hätte was gesehen, was nicht sein sollte, war aber ein Irrtum.

Also, hier nochmal das Ganze:

DWord ist nur ein 32Bit-Zahlenwert (4Byte).

Du benötigst ein REG_BINARY-Array, dass nicht in Stringform übergeben werden kann, sondern als Byte-Array.

Eventuell könnte das funktionieren:
Dim Binary, Text, i

Text = Split("53 00 49 00 47 00 4e 00 41 00 54 00 55 00 52 00 00 00") 'Einzelne Werte in Text-Array schreiben  

ReDim Binary(UBound(Text)) 'Byte-Array definieren  

For i = 0 To UBound(Text) 
    Binary(i) = CByte("&H" & Text(i)) 'Byte-Array mit Zahlenwerte füllen  
Next

WSHShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002\New Signature" , Binary , "REG_BINARY"  
aber ohne Garantie, dass es auch funktioniertface-wink

Gruß Dieter
Member: scanco
scanco Aug 26, 2010 at 13:50:33 (UTC)
Goto Top
Hat sich gut gelesen - und hat sich logisch angehört...
Leider kommt auch hier der Mist mit der Typenunverträglichkeit
Mitglied: 76109
76109 Aug 26, 2010 at 13:58:45 (UTC)
Goto Top
Hallo scanco!

Das hatte ich fast befürchtet. Das Problem hierbei ist, das in VBS keine Byte-Arrays (Dim Binary() As Byte) definiert werden können und somit wohl vom Typ Variant/Byte mit Byte-Werten sind, denn die Bytewerte stimmen. Ich habe da noch eine Idee, wie ich in VBS ein echtes Byte-Array zu erzeugen kann, aber das kann jetzt ein bisschen dauernface-wink

Gruß Dieter
Member: scanco
scanco Aug 26, 2010 at 14:54:40 (UTC)
Goto Top
Hallo Dieter,

Mensch, das wär klasse!

Würd mich freuen von dir zu lesen' Merci!
Mitglied: 76109
76109 Aug 26, 2010 at 16:15:18 (UTC)
Goto Top
Hallo scanco!

Mit echten Byte-Arrays funktioniert es mit WshShell auch nicht. Offensichtlich können mit WshShell keine Byte-Arrays übergeben werden. Eine direkte Angabe mit &H12345678 funktioniert gerade noch, aber dann ist aber auch Schlussface-sad

Gruß Dieter
Mitglied: 76109
76109 Aug 26, 2010 at 18:21:02 (UTC)
Goto Top
Hallo nochmal!

Also dieses Beispiel funktioniert tadellosface-wink
Const HKEY_CURRENT_USER = &H80000001

Dim RegText, ByteArray, i, objReg, strComputer, strKeyPath, strValueName

RegText = Split("53 00 49 00 47 00 4e 00 41 00 54 00 55 00 52 00 00 00")  

ReDim ByteArray(UBound(RegText))

For i = 0 To UBound(RegText)
    ByteArray(i) = CByte("&H" & RegText(i))  
Next

strComputer = "."  

strKeyPath = "Software\Aerofox\Foxmail\"  

strValueName = "Test"  

Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")  

objReg.SetBinaryValue HKEY_CURRENT_USER, strKeyPath, strValueName, ByteArray

Set objReg = Nothing

Gruß Dieter
Member: Biber
Biber Aug 26, 2010 at 20:14:19 (UTC)
Goto Top
Moin didi1954,

ist meiner Meinung nach zum Scheitern verurteilt.
Nich' wegen dir jezz'... wegen der PraktikantInnen.

Die schreiben doch in ihren Wochenberichten z.b hier so was wie
The RegWrite method automatically converts the parameter anyValue to either a string or an integer.
- oder auch-
Tip:
RegWrite will write at most one DWORD to a REG_BINARY value. Larger values are not supported with this method.
Frag jetzt nicht, wieso die das "Tip" nennen... so gut ist mein outlandish nun auch nicht.

Anyway, egal jetzt ob die nun zu blöd sind oder doch... auf Oldenburger Platt runtergebrochen heisst das doch wohl:
"Okay, klar kannst du auch einen REG_BINARY schreiben. Aber pass ein bisschen auf, dass er möglichst 0 oder 1 oder so ist.
Zumindest nicht größer als diese Zahlen beim Bingo oder Lotto."


Damit fällt doch wohl der REG_BINARY in der Aufgabe hier raus.

Ich als alter Bätchschroter würde es so machen (wenn ich es müsste)
[Skizze zur Demo, keine Fettich-Lösung!]
Const HKEY_CURRENT_USER = &H80000001
' Const NewSIGNATUR ="MfG Biber"  
Const NewSIGNATUR ="SIGNATUR"  
Dim aHValues()

strRegPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002"  
strRegKey =chr(34)& "New Signature" & chr(34)  

strNewValueSz =NewSIGNATUR & Chr(0) ' null terminated string - C-like  

WScript.echo "#1 Len(StrNewValueSz) " & Len(StrNewValueSz)  
WScript.echo "#2 LenB(StrNewValueSz)" & LenB(StrNewValueSz)  

ReDim aHValues( lenB(StrNewValueSz ) ) '  weil jedes Zeichen auch noch mal null-terminiert wird  

For i = 1 to Len(StrNewValueSz) step 1
    wscript.echo i &": " & Mid( strNewvalueSz, i, 1) & " Asc(" & Mid( strNewvalueSz, i, 1)&"): " _   
     & Asc( Mid( strNewvalueSz, i, 1)) & " Hex: " & Hex( Asc( Mid( strNewvalueSz, i, 1)))  
    aHValues(i*2-2)   = Hex( Asc( Mid( strNewvalueSz, i, 1)))
    aHValues(i*2-1) = &H0
Next

' Set oReg = GetObject("winMgmts:\\.\root\default:StdRegProv")  
' strValueSet = oReg.SetBinaryValue(HKEY_CURRENT_USER, strRegPath, strRegKey, aHValues)  

Anmerkung: die letzten beiden Zeilen sind a) zu testen und b) sollen die Schreiberei machen
Der Rest, also der reine Demo-Schnipsel bringt:
+>z:\austausch\temp\RegBinaryRegWriteWork.vbs
#1 Len(StrNewValueSz) 9
#2 LenB(StrNewValueSz)18
1: S Asc(S): 83 Hex: 53
2: I Asc(I): 73 Hex: 49
3: G Asc(G): 71 Hex: 47
4: N Asc(N): 78 Hex: 4E
5: A Asc(A): 65 Hex: 41
6: T Asc(T): 84 Hex: 54
7: U Asc(U): 85 Hex: 55
8: R Asc(R): 82 Hex: 52
9:

In den Demo-Ausgaben lässt sich der (später geschriebene) REG_BINARY-Wert ja erkennen.
Das wäre mein Plan.

Grüße
Biber
Mitglied: 76109
76109 Aug 26, 2010 at 21:02:32 (UTC)
Goto Top
Hallo Biber!

Bin ich jetzt irgendwie im falschen Film?face-smile

Das mit WShell auch bei REG_BINARY maximal nur 32Bit-Werte(sprich &H12345678) möglich sind, habe inzwischen auch herausgefunden und weiter oben bereits kommentiert. Hab ich halt net gwisst, weil ich's noch net gmacht habface-sad

In meinem letzten kommentar, habe ich doch ein Skript reingeballert, dass ich getestet habe und auch funktioniert. Swa jetz mit moim Beispiel, aber vom Prinzip her verwertbar und die ByteArray-Übergabe funktioniert auch einwandfrei exakt mit den Hexwerten, wie sie im Textstring stehenface-wink

Gruß Dieter
Member: Biber
Biber Aug 26, 2010 at 21:11:19 (UTC)
Goto Top
Upps, didi1954,

sorry, nicht du warst im falschen Film... da hatte ich wohl noch eine ältere Folge gesehen. Sorry.
Ich war noch bei dem Schnipsel-Stand von "didi1954 schreibt am 26.08.2010, 15:23:30 Uhr"
... deine spätere Lösung habe ich eben erst bemerkt.
Ähmm ... vergiss es einfach.

Manchmal finde ich mich in Situationen wieder, die auch in 70er-Jahre-Sketchen sehr beliebt waren...
Kommt ein Mann zum Patentamt und sagt: 'Ich werde meine Erfindung "Fernsehen" nennen'.... kennst du bestimmt.

Peinlich, peinlich...

Grüße
Biber
Mitglied: 76109
76109 Aug 26, 2010 at 21:21:22 (UTC)
Goto Top
Hallo Biber!

Zitat von @Biber:
Manchmal finde ich mich in Situationen wieder, die auch in 70er-Jahre-Sketchen sehr beliebt waren...
Kommt ein Mann zum Patentamt und sagt: 'Ich werde meine Erfindung "Fernsehen" nennen'....
kennst du bestimmt.
War das nicht KlimBim mit meiner damaligen Traumfrau Ingrid Steegert?face-smile Achnee, des war doch glab ich die Wochenshow mit dem Dingsda? Ne, auch net. Des war ja der, der immer gesagt hat "komm ich jetzt ins Fernsehen". Komm nicht drauf (peinlich, peinlich)face-sad

Peinlich, peinlich...
Iwo, auch Vollprofis unterlaufen mal Fehler und ist zum Glück menschlischface-wink

Gruß Dieter.
Mitglied: 76109
76109 Aug 27, 2010 at 06:38:35 (UTC)
Goto Top
Hallo scanco, Hallo Biber!

Aufgrund Bibers Lösung und Ausführungen, habe ich auch noch eine 2. Version gebastelt, bei der die Signatur auch direkt in ein Byte-Array übersetzt wirdface-wink
Const HKEY_CURRENT_USER = &H80000001
Const NewSignatur = "SIGNATUR"  

    Dim RegText, NewRegText, ByteArray, i, objReg, strComputer, strKeyPath, strValueName
    
    RegText = NewSignatur & Chr(0)
    
    For i = 1 To Len(RegText)
        NewRegText = NewRegText & Mid(RegText, i, 1) & Chr(0)
    Next
    
    ReDim ByteArray(Len(NewRegText) - 1)
    
    For i = 0 To UBound(ByteArray) Step 2
        ByteArray(i) = CByte(Asc(Mid(NewRegText, i + 1, 1)))
        ByteArray(i + 1) = CByte(0)
    Next
    
    strComputer = "."  
    
    strKeyPath = "Software\Aerofox\Foxmail\"  
    
    strValueName = "Test"  
    
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")  
    
    objReg.SetBinaryValue HKEY_CURRENT_USER, strKeyPath, strValueName, ByteArray
    
    Set objReg = Nothing
Ist aber nur oberflächlich getestetface-smile

Gruß Dieter
Member: scanco
scanco Sep 20, 2010 at 06:12:02 (UTC)
Goto Top
Vielen Dank für Eure Unterstützung - hat wunderbar geklappt.
Kunde zufrieden - Chef zufrieden - wunderbar.

HERZLICHEN DANK NOCHMAL!!!
Mitglied: 76109
76109 Sep 20, 2010 at 07:56:51 (UTC)
Goto Top
Hallo scanco!

Zitat von @scanco:
Vielen Dank für Eure Unterstützung - hat wunderbar geklappt.
Kunde zufrieden - Chef zufrieden - wunderbar.
Na, wenn die alle zufrieden sind, dann bin ich es natürlich auchface-smile

HERZLICHEN DANK NOCHMAL!!!
Gern geschehenface-wink

Gruß Dieter