Skripte beim 64-bit-Betriebssystem

Der ConfigMgr 2007 Client Agent wie auch der SMS 2003 Client sind reine 32-bit-Anwendungen bzw. Dienste. Das führt dazu, dass Installations- oder Konfigurationsskripte (cmd, vbs) in der 32-bit Umgebung ausgeführt werden, da jeweils die 32-bit-Version des Skript-Interpreters (cmd.exe oder wscript.exe) vom Client Agenten geladen wird. Problematisch wird es dann, wenn innerhalb des Skriptes auf Registry-Werte oder Dateien zugegriffen werden soll, die von einem 64-bit-Anwendungssetup installiert wurden - die File System und Registry Redirection des WoW64-Systems lässt den Zugriff zum falschen Ziel laufen.

Die Probleme im einzelnen:
a) Programm-Dateien werden unter “C:\Programme” installiert und sind sowohl unter der 32-bit- als auch der 64-bit-Skriptumgebung unter genau diesem Pfad erreichbar. Allerdings sollte man doch in einem flexiblen Skript eher die Variable “%ProgramFiles%” verwenden, um den Installationspfad zu referenzieren - die zeigt aber unter der 32-bit-Umgebung auf “C:\Programme (x86)” - also vorbei.
b) Dateien, die von einem 64-bit-Setup unter “%SystemRoot%\system32” installiert wurden, sind unter der 32-bit-Umgebung nicht sichtbar, denn die WOW64-Redirection zeigt uns stattdessen den Inhalt des Ordners “%SystemRoot%\SysWOW64“.
c) Registry-Werte, die in der 64-bit-Installation unter “HKLM\Software” erstellt wurden, sind in der 32-bit-Umgebung ebenso nicht zu sehen, denn die WOW64-Redirection zeigt uns stattdessen den Inhalt des Knotens “HKLM\Software\Wow6432Node“.

Der Lösungsansatz:
Ab Windows Vista x64 gibt es in der WOW64-, also der 32-bit-Umgebung, einen virtuellen Ordner “%SystemRoot%\sysnative“. Man kann diesen nicht per dir-Befehl sehen, aber ihn nutzen, um die 64-bit-Systemdateien zu erreichen. Die 64-bit-Eingabeaufforderung z.B. kann mit “%SystemRoot%\sysnative\cmd.exe” gestartet werden. Unter der nativen 64-bit-Umgebung ist dieser virtuelle Ordner nicht vorhanden.

Wie wandelt man nun ein nicht funktionierendes Skript am einfachsten in ein funktionierendes um, ohne jeden Aufruf eines copy, del oder reg.exe mit einem sysnative-Pfad zu ummanteln? Ich denke, es ist am einfachsten, wenn man das gesamte Skript in der 64-bit-Umgebung aufruft. Das geht mit wenigen Zeilen, die man im vorhanden Skript vorn einfügt.

Das Lösungsskript:

@set ComSpec64=%SystemRoot%\sysnative\cmd.exe
@if not exist "%ComSpec64%" goto Main
@:SwitchTo64
@"%ComSpec64%" /c %0 %*
@exit
@:Main
@REM *** ...und hier kommt der Rest vom Skript

Übrigens: Mit KB942589 (http://support.microsoft.com/kb/942589/en-us) bekommt auch die Windows XP 64-bit Edition seinen virtuellen sysnative-Pfad. In dem Artikel wird auch ein alternativer Ansatz genannt, der sich NTFS Junction Points zu nutze macht. (Diese können mit linkd.exe aus dem ResourceKit erstellt werden.)

Kommentarfunktion ist deaktiviert