Seite 1 von 1
RegOpenKeyEx auf 64-Bit Windows Systemen
Verfasst: 18 Dez 2009, 12:33
von mr.quickly
Hallo zusammen,
mir ist folgender Fehler aufgefallen. Wenn man unter Windows 7 64 Bit versucht einen Registry Wert auszulesen bekommt an ggf. folgende Meldung:
Code: Alles auswählen
Set $pxe_inst_check$ = GetRegistryStringValue ("[HKEY_LOCAL_MACHINE\SOFTWARE\opsi.org\preloginloader] <KEY>")
Info: Registry key [HKEY_LOCAL_MACHINE\SOFTWARE\opsi.org\preloginloader] could not be opened by RegOpenKeyEx, Errorno 2 "Das System kann die angegebene Datei nicht finden"
The value of the variable is now: ""
Das Problem wird wahrscheinlich folgendes sein (Lösung incl.):
http://stackoverflow.com/questions/2522 ... ista-64bit
Re: RegOpenKeyEx auf 64-Bit Windows Systemen
Verfasst: 20 Dez 2009, 16:21
von d.oertel
Hi,
ich habe das Problem bisher noch nicht beobachtet.
Ich werde es aber morgen nochmal überprüfen und danke für den (Lösungs-)Hinweis.
So oder so kann hiermit nur auf die 32-Bit Registry zugegriffen werden.
Ein workaround findet sich in:
http://download.uib.de/opsi3.4/testing/ ... 1.0-2.opsi
gruss
d.oertel
Re: RegOpenKeyEx auf 64-Bit Windows Systemen
Verfasst: 04 Jan 2010, 16:19
von mr.quickly
Hallo Herr Oertel,
danke für den Hinweis. Aber ich verstehe das noch nicht. Hab folgendes gefunden:
Code: Alles auswählen
[Initial]
Message=
LogLevel=3
ExitOnError=false
ScriptErrorMessages=on
TraceMode=off
StayOnTop=false
DefVar $SystemType$
DefVar $ResultList$
Set $SystemType$ = GetSystemType
[Aktionen]
if $SystemType$ = "64 Bit System"
set $ResultList$ = getOutStreamFromSection("execWith_reg_query '%SystemRoot%\cmd64.exe' /C")
for $s$ in $ResultList$ do sub_fetch_SearchResult
else
set $SearchResult$ = GetRegistryStringValue("["+$SearchKey$+"] "+$SearchValue$)
endif
[execWith_reg_query]
@echo off
reg query "$SearchKey$" /v "$SearchValue$"
Sie fragen also über die 64-Bit cmd.exe mittels dem Kommando reg query den gewünschten Wert ab, aber das geht so bei mir nicht. Es kommt immer Folgender Fehler:
fehler.png
Können Sie das bitte noch mal genauer erklären.
Re: RegOpenKeyEx auf 64-Bit Windows Systemen
Verfasst: 04 Jan 2010, 16:33
von d.oertel
Hi,
$Resultlist$ ist eine Stringliste und muss mit
DefStringlist $ResultList$
und nicht mit
DefVar $ResultList$
deklariert werden.
gruss
d.oertel
Re: RegOpenKeyEx auf 64-Bit Windows Systemen
Verfasst: 05 Jan 2010, 09:28
von mr.quickly
Ist das kompliziert, ich versteh es einfach nicht, tut mit Leid.
Hier noch mal mein angepasster Programmcode:
Code: Alles auswählen
[Initial]
Message=Installiere xxxx ......
LogLevel=3
ExitOnError=false
ScriptErrorMessages=on
TraceMode=off
StayOnTop=false
DefVar $SystemType$
DefVar $s$
DefVar $SearchValue$
DefVar $SearchRegKey$
DefVar $SearchRegValue$
Set $SystemType$ = GetSystemType
set $SearchRegKey$ = "HKLM\SOFTWARE\opsi.org\preloginloader"
set $SearchRegValue$ = "pxe-installed"
DefStringlist $ResultList$
DefStringlist $ResultList2$
DefStringlist $ResultList3$
[Aktionen]
ShowBitmap /3 "%scriptpath%\xxx.png"
if $SystemType$ = "64 Bit System"
set $ResultList$ = getOutStreamFromSection("execWith_reg_query '%SystemRoot%\cmd64.exe' /C")
for $s$ in $ResultList$ do sub_fetch_SearchResult
else
set $SearchResult$ = GetRegistryStringValue("["+$SearchKey$+"] "+$SearchValue$)
endif
[execWith_reg_query]
@echo off
reg query "$SearchRegKey$" /v "$SearchRegValue$"
;reg query "HKLM\SOFTWARE\opsi.org\preloginloader" /v pxe-installed
[sub_fetch_SearchResult]
set $ResultList2$ = splitStringOnWhiteSpace("$s$")
if $SearchValue$ = takeString(1,$ResultList2$)
if not (takeString(3,$ResultList2$) = "")
set $ResultList3$ = getSublist(3:, $ResultList2$)
set $SearchResult$ = composeString($ResultList3$," ")
else
set $SearchResult$ = ""
endif
endif
pause $ResultList$
Vielleicht wäre es hilfreich, wenn Sie mal ein Beispiel hier posten indem Sie unter einem 64-Bit System nur einen Registry Wert auslesen und auswerten, damit ich mal sehen kann wie das genau funktioniert, bzw. was genau benötigt wird. Das Script aus dem Paket "opsi-template-with-admin_1.0-2.opsi" ist mit zu komplex. Schon mal Dank im Voraus.
Re: RegOpenKeyEx auf 64-Bit Windows Systemen
Verfasst: 05 Jan 2010, 18:55
von d.oertel
Hi,
hier ein Stück Code.
Wichtig ist zu verstehen was man aus der 32-Bit Regitry und was aus der 64 Bit regitry lesen will und wo es keinen unterschied macht.....
Code: Alles auswählen
[Aktionen]
DefVar $SystemType$
DefVar $SearchKey$
DefVar $SearchValue$
DefVar $SearchResult$
DefStringlist $ResultList$
DefStringlist $ResultList2$
DefStringlist $ResultList3$
Set $SystemType$ = GetSystemType
comment "use the following code not (!) for 32 Bit Registry keys on 64 bit systems"
Set $SearchKey$ = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set $SearchValue$ = "DefaultDomainName"
; "HKLM\SOFTWARE\opsi.org\preloginloader" auf einem 64 bit system hierüber abzufragen ist unfug, da das in der 32-Bit registry ist
;set $SearchRegKey$ = "HKLM\SOFTWARE\opsi.org\preloginloader"
;set $SearchRegValue$ = "pxe-installed"
sub_retrieve_registry_data
comment "the result is: "+$SearchResult$
[sub_retrieve_registry_data]
if $SystemType$ = "64 Bit System"
comment "we try to read the registry via 64 bit reg.exe"
set $ResultList$ = getOutStreamFromSection("execWith_reg_query '%SystemRoot%\cmd64.exe' /C")
for $s$ in $ResultList$ do sub_fetch_SearchResult
else
comment "we try to read the registry via 32 bit winst function"
set $SearchResult$ = GetRegistryStringValue("["+$SearchKey$+"] "+$SearchValue$)
endif
[execWith_reg_query]
@echo off
reg query "$SearchKey$" /v "$SearchValue$"
[sub_fetch_SearchResult]
set $ResultList2$ = splitStringOnWhiteSpace("$s$")
if $SearchValue$ = takeString(1,$ResultList2$)
if not (takeString(3,$ResultList2$) = "")
set $ResultList3$ = getSublist(3:, $ResultList2$)
set $SearchResult$ = composeString($ResultList3$," ")
else
set $SearchResult$ = ""
endif
endif
gruss
d.oertel
Re: RegOpenKeyEx auf 64-Bit Windows Systemen
Verfasst: 08 Jul 2011, 12:14
von erwinr
Nur der Vollständigkeit halber, da dieses Problem nunmehr einfacher gelöst ist:
GetRegistryStringValue64
GetRegistrystringvalueSysNative
siehe opsi-winst Handbuch vom 01.06.2011, Seite 78