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:
Leider erhalte ich dann immer den Hinweis:
Laufzeitfehler in Microsoft VBScript
Code: 800A000D
Fehler: Typen unverträglich
Kann mir da jemand helfen?
Vielen Dank
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 149788
Url: https://administrator.de/contentid/149788
Ausgedruckt am: 26.11.2024 um 09:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo scanco!
Kommentar erstmal wieder entfernt
Gruß Dieter
Kommentar erstmal wieder entfernt
Gruß Dieter
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:
aber ohne Garantie, dass es auch funktioniert
Gruß Dieter
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"
Gruß Dieter
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 dauern
Gruß Dieter
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 dauern
Gruß Dieter
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 Schluss
Gruß Dieter
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 Schluss
Gruß Dieter
Hallo nochmal!
Also dieses Beispiel funktioniert tadellos
Gruß Dieter
Also dieses Beispiel funktioniert tadellos
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
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
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!]
Anmerkung: die letzten beiden Zeilen sind a) zu testen und b) sollen die Schreiberei machen
Der Rest, also der reine Demo-Schnipsel bringt:
In den Demo-Ausgaben lässt sich der (später geschriebene) REG_BINARY-Wert ja erkennen.
Das wäre mein Plan.
Grüße
Biber
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.RegWrite will write at most one DWORD to a REG_BINARY value. Larger values are not supported with this method.
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
Hallo Biber!
Bin ich jetzt irgendwie im falschen Film?
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 hab
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 stehen
Gruß Dieter
Bin ich jetzt irgendwie im falschen Film?
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 hab
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 stehen
Gruß Dieter
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
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
Hallo Biber!
Peinlich, peinlich...
Iwo, auch Vollprofis unterlaufen mal Fehler und ist zum Glück menschlisch
Gruß Dieter.
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? 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)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...
Gruß Dieter.
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 wird
Ist aber nur oberflächlich getestet
Gruß Dieter
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 wird
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
Gruß Dieter
Hallo scanco!
HERZLICHEN DANK NOCHMAL!!!
Gern geschehen
Gruß Dieter
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 auchVielen Dank für Eure Unterstützung - hat wunderbar geklappt.
Kunde zufrieden - Chef zufrieden - wunderbar.
HERZLICHEN DANK NOCHMAL!!!
Gruß Dieter