64-Bit-Unterstützung unter Windows [W]
Der opsi-script ist ein 32 Bit-Programm. Damit sich auch 32 Bit-Programme auf 64 Bit-Systemen normal arbeiten können, gibt es für 32 Bit-Programme sowohl in der Registry als auch im Dateisystem Spezialbereiche auf die Zugriffe umgeleitet werden, die sonst in 64 Bit vorbehaltenen Bereichen landen würden.
So wird ein Zugriff auf c:\windows\system32
umgelenkt auf c:\windows\syswow64
.
Aber ein Zugriff auf c:\program files
wird nicht umgelenkt auf c:\program files (x86)
.
So wird ein Registry Zugriff auf [HKLM\software\opsi.org]
umgelenkt auf [HKLM\software\wow6432node\opsi.org]
.
Key |
Windows Server 2008 R2, Windows 7, and Newer |
HKEY_LOCAL_MACHINE\SOFTWARE |
Redirected |
HKEY_CURRENT_USER\SOFTWARE |
Shared |
Die obenstehende Regel ist die einfache Regel zum merken.
Im Detail ist es allerdings komplizierter, da es unterhalb von redirected Zweigen auch welche ohne redirection (shared) geben kann die dann wieder Zweige enthalten welche wieder redirected werden.
Key |
Windows Server 2008 R2, Windows 7, and Newer |
HKEY_LOCAL_MACHINE\SOFTWARE |
Redirected |
HKEY_LOCAL_MACHINE\SOFTWARE\Classes |
Shared |
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID |
Redirected |
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\DirectShow |
Redirected |
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface |
Redirected |
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Media Type |
Redirected |
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MediaFoundation |
Redirected |
HKEY_CURRENT_USER |
Shared |
HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID |
Redirected |
HKEY_CURRENT_USER\SOFTWARE\Classes\DirectShow |
Redirected |
HKEY_CURRENT_USER\SOFTWARE\Classes\Interface |
Redirected |
HKEY_CURRENT_USER\SOFTWARE\Classes\Media Type |
Redirected |
HKEY_CURRENT_USER\SOFTWARE\Classes\MediaFoundation |
Redirected |
Tatsächlich ist es noch komplizierter. Die obigen Tabellen sind nur Teile der Originaltabelle. Die vollständige Tabelle mit allen Details finden Sie hier:
https://learn.microsoft.com/en-us/windows/win32/winprog64/shared-registry-keys#redirected-shared-and-reflected-keys-under-wow
opsi-script installiert daher als 32 Bit-Programm Skripte, die unter 32 Bit laufen, auch in 64 Bit-Systemen korrekt.
Für die Installation von 64 Bit-Programmen liefern einige alte Konstanten wie '%ProgramFilesDir%'´ für 64 Bit-Programme die falschen Werte. Daher gibt es ab opsi-script Version 4.10.8 folgende Neuerungen:
In der Regel kann (und sollte) nun explizit angegeben werden, wohin geschrieben und woher gelesen werden soll. Dazu gibt es drei Varianten:
- 32
-
Explizit 32 Bit
- 64
-
Explizit 64 Bit. Wenn nicht auf einem 64 Bit System, dann wie
SysNative
. - SysNative
-
Entsprechend der Architektur des Betriebssystems auf dem das Skript läuft.
Entsprechend gibt es zusätzlichen Konstanten:
Konstante | 32 Bit | 64 Bit |
---|---|---|
|
c:\program files |
c:\program files (x86) |
|
c:\program files |
c:\program files (x86) |
|
c:\program files |
c:\program files |
|
c:\program files |
c:\program files |
%ProgramFilesDir%
-
sollte in Zukunft besser gemieden werden. Verhält sich genauso wie
%ProgramFiles32Dir%
. %ProgramFiles32Dir%
-
sollten Sie verwenden, wenn Sie explizit 32 Bit-Software installieren wollen.
%ProgramFiles64Dir%
-
sollten Sie verwenden, wenn Sie explizit 64 Bit-Software installieren wollen.
%ProgramFilesSysnativeDir%
-
sollten Sie verwenden, wenn Sie auf den Default der Architektur zugreifen wollen.
Für den Zugriff auf eigentlich 64 Bit-Software vorbehaltene Bereiche kennt der opsi-script folgende zusätzlichen Befehle:
-
GetRegistrystringvalue32
,GetRegistrystringvalue64
,GetRegistrystringvalueSysNative
(besser:getRegistryValue
) -
getRegistryKeyList32
,getRegistryKeyList64
,getRegistryKeyListSysNative
(besser:getRegistryKeyList
) -
getRegistryVarList32
,getRegistryVarList64
,getRegistryVarListSysNative
(besser:getRegistryVarList
) -
getRegistryVarMap32
,getRegistryVarMap64
,getRegistryVarMapSysNative
(besser:getRegistryVarMap
) -
FileExists32
,FileExists64
,FileExistsSysNative
-
getFileInfoMap32
,getFileInfoMap64
,getFileInfoMapSysNative
Bei den folgenden Funktionen kann die Zugriffsart als optionaler Parameter mitgegeben werden (der default ist sysnative
):
-
getRegistryValue
-
RegKeyExists
-
RegVarExists
-
powershellCall
-
FileOrFolderExists
-
DirectoryExists
-
listFiles
Bei den folgenden Funktionen muss die Zugriffsart als Parameter mitgegeben werden:
-
getRegistryKeyList
-
getRegistryVarList
-
getRegistryVarMap
Registry
-Sektionen schreiben in den 32 Bit-Bereich der Registry. Ebenfalls werden in Files
-Sektionen Zugriffe auf c:\windows\system32
umgelenkt.
Für Registry
, Files
und Winbatch
Sektionen gibt es daher nun die Aufrufparameter:
-
/32Bit
Das ist der Default. Schreibzugriffe werden in die 32 Bit-Registry bzw. das 32 Bit-Systemverzeichnis gelenkt.
-
/64Bit
Schreibzugriffe werden in die 64 Bit-Registry bzw. das 64 Bit-Systemverzeichnis gelenkt. Gibt es diesen nicht, so wird der architekturspezifische Zweig verwendet. -
/SysNative
Schreibzugriffe werden in den architekturspezifischen Zweig der Registry bzw. des Systemverzeichnisses gelenkt.
Für ShellScript
und Execwith
gilt dasselbe, nur dass die Parameter durch das Schlüsselwort winst
abgegrenzt werden müssen.
Beispiel:
ShellScript_do_64bit_stuff winst /64Bit