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