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
GELÖST

Mit VB Script einen hexadezimalen DWORD-Wert eintragen

Frage Entwicklung VB for Applications

Mitglied: scanco

scanco (Level 1) - Jetzt verbinden

26.08.2010 um 13:58 Uhr, 7130 Aufrufe, 17 Kommentare

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:
01.
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
Mitglied: DerWoWusste
26.08.2010 um 14:18 Uhr
Moin.
Keine Lösung für Dich, aber: warum nicht per regedit /s regfile.reg lösen?
Bitte warten ..
Mitglied: scanco
26.08.2010 um 14:19 Uhr
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...
Bitte warten ..
Mitglied: 76109
26.08.2010 um 15:00 Uhr
Hallo scanco!

Kommentar erstmal wieder entfernt

Gruß Dieter
Bitte warten ..
Mitglied: scanco
26.08.2010 um 15:17 Uhr
Zitat von 76109:
Hallo scanco!

Kommentar erstmal wieder entfernt

Gruß Dieter

Kapier ich jetzt ned...
Bitte warten ..
Mitglied: 76109
26.08.2010 um 15:23 Uhr
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:
01.
Dim Binary, Text, i 
02.
 
03.
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 
04.
 
05.
ReDim Binary(UBound(Text)) 'Byte-Array definieren 
06.
 
07.
For i = 0 To UBound(Text)  
08.
    Binary(i) = CByte("&H" & Text(i)) 'Byte-Array mit Zahlenwerte füllen 
09.
Next 
10.
 
11.
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 funktioniert

Gruß Dieter
Bitte warten ..
Mitglied: scanco
26.08.2010 um 15:50 Uhr
Hat sich gut gelesen - und hat sich logisch angehört...
Leider kommt auch hier der Mist mit der Typenunverträglichkeit
Bitte warten ..
Mitglied: 76109
26.08.2010 um 15:58 Uhr
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
Bitte warten ..
Mitglied: scanco
26.08.2010 um 16:54 Uhr
Hallo Dieter,

Mensch, das wär klasse!

Würd mich freuen von dir zu lesen' Merci!
Bitte warten ..
Mitglied: 76109
26.08.2010 um 18:15 Uhr
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
Bitte warten ..
Mitglied: 76109
26.08.2010 um 20:21 Uhr
Hallo nochmal!

Also dieses Beispiel funktioniert tadellos
01.
Const HKEY_CURRENT_USER = &H80000001 
02.
 
03.
Dim RegText, ByteArray, i, objReg, strComputer, strKeyPath, strValueName 
04.
 
05.
RegText = Split("53 00 49 00 47 00 4e 00 41 00 54 00 55 00 52 00 00 00") 
06.
 
07.
ReDim ByteArray(UBound(RegText)) 
08.
 
09.
For i = 0 To UBound(RegText) 
10.
    ByteArray(i) = CByte("&H" & RegText(i)) 
11.
Next 
12.
 
13.
strComputer = "." 
14.
 
15.
strKeyPath = "Software\Aerofox\Foxmail\" 
16.
 
17.
strValueName = "Test" 
18.
 
19.
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") 
20.
 
21.
objReg.SetBinaryValue HKEY_CURRENT_USER, strKeyPath, strValueName, ByteArray 
22.
 
23.
Set objReg = Nothing
Gruß Dieter
Bitte warten ..
Mitglied: Biber
26.08.2010 um 22:14 Uhr
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!]
01.
Const HKEY_CURRENT_USER = &H80000001 
02.
' Const NewSIGNATUR ="Mit freundlichen Grüßen Biber" 
03.
Const NewSIGNATUR ="SIGNATUR" 
04.
Dim aHValues() 
05.
 
06.
strRegPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002" 
07.
strRegKey =chr(34)& "New Signature" & chr(34) 
08.
 
09.
strNewValueSz =NewSIGNATUR & Chr(0) ' null terminated string - C-like 
10.
 
11.
WScript.echo "#1 Len(StrNewValueSz) " & Len(StrNewValueSz) 
12.
WScript.echo "#2 LenB(StrNewValueSz)" & LenB(StrNewValueSz) 
13.
 
14.
ReDim aHValues( lenB(StrNewValueSz ) ) '  weil jedes Zeichen auch noch mal null-terminiert wird 
15.
 
16.
For i = 1 to Len(StrNewValueSz) step 1 
17.
    wscript.echo i &": " & Mid( strNewvalueSz, i, 1) & " Asc(" & Mid( strNewvalueSz, i, 1)&"): " _  
18.
     & Asc( Mid( strNewvalueSz, i, 1)) & " Hex: " & Hex( Asc( Mid( strNewvalueSz, i, 1))) 
19.
    aHValues(i*2-2)   = Hex( Asc( Mid( strNewvalueSz, i, 1))) 
20.
    aHValues(i*2-1) = &H0 
21.
Next 
22.
 
23.
' Set oReg = GetObject("winMgmts:\\.\root\default:StdRegProv") 
24.
' 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
Bitte warten ..
Mitglied: 76109
26.08.2010 um 23:02 Uhr
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
Bitte warten ..
Mitglied: Biber
26.08.2010 um 23:11 Uhr
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
Bitte warten ..
Mitglied: 76109
26.08.2010 um 23:21 Uhr
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? 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)

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

Gruß Dieter.
Bitte warten ..
Mitglied: 76109
27.08.2010 um 08:38 Uhr
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
01.
Const HKEY_CURRENT_USER = &H80000001 
02.
Const NewSignatur = "SIGNATUR" 
03.
 
04.
    Dim RegText, NewRegText, ByteArray, i, objReg, strComputer, strKeyPath, strValueName 
05.
     
06.
    RegText = NewSignatur & Chr(0) 
07.
     
08.
    For i = 1 To Len(RegText) 
09.
        NewRegText = NewRegText & Mid(RegText, i, 1) & Chr(0) 
10.
    Next 
11.
     
12.
    ReDim ByteArray(Len(NewRegText) - 1) 
13.
     
14.
    For i = 0 To UBound(ByteArray) Step 2 
15.
        ByteArray(i) = CByte(Asc(Mid(NewRegText, i + 1, 1))) 
16.
        ByteArray(i + 1) = CByte(0) 
17.
    Next 
18.
     
19.
    strComputer = "." 
20.
     
21.
    strKeyPath = "Software\Aerofox\Foxmail\" 
22.
     
23.
    strValueName = "Test" 
24.
     
25.
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") 
26.
     
27.
    objReg.SetBinaryValue HKEY_CURRENT_USER, strKeyPath, strValueName, ByteArray 
28.
     
29.
    Set objReg = Nothing
Ist aber nur oberflächlich getestet

Gruß Dieter
Bitte warten ..
Mitglied: scanco
20.09.2010 um 08:12 Uhr
Vielen Dank für Eure Unterstützung - hat wunderbar geklappt.
Kunde zufrieden - Chef zufrieden - wunderbar.

HERZLICHEN DANK NOCHMAL!!!
Bitte warten ..
Mitglied: 76109
20.09.2010 um 09:56 Uhr
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 auch

HERZLICHEN DANK NOCHMAL!!!
Gern geschehen

Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

VB for Applications
gelöst VB Script rekursiv statt nur ein Ordner (4)

Frage von Saschaaaaa zum Thema VB for Applications ...

VB for Applications
gelöst VB Script nach gefundenem Wort die nächsten 4 Zeichen ersetzten (2)

Frage von deutsch73 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...