Liest den x64-Registrierungszweig vom 7-Zip-SFX-Installationsprogramm über PowerShell


2

Ich möchte, dass mein selbstextrahierendes 7-Zip-Archiv nach dem Extrahieren von Dateien ein PowerShell-Skript ausführt. Dazu verwende ich die hier beschriebene Methode: http://www.sphaero.org/blog:2011:0504_7zip_self_extracting_autostart_exe

Nach der Dateiextraktion möchte ich ein Powershell-Skript ausführen. Hier ist der Inhalt meiner Datei config.txt:

;!@Install@!UTF-8!
RunProgram="InstallCU.bat"
;!@InstallEnd@!

Die Datei InstallCU.bat startet PowerShell:

powershell.exe -ExecutionPolicy Unrestricted -File InstallCU.ps1

Innerhalb des Powershell-Skripts mache ich viele Dinge, einschließlich der Überprüfung einiger Registrierungsschlüssel unter diesem Zweig:

HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components

Verwenden der cmd-lets Test-Path und Get-ItemProperty

Ich habe es nicht ausprobiert, aber ich denke, auf 32-Bit-Computern läuft alles gut.

Mein Problem ist, dass auf 64-Bit-Systemen eine 32-Bit-Version (x86) der PowerShell gestartet wird. Wenn ich auf einen Pfad in der Registrierung unter HKLM: \ Software darin zugreife, wird er zu HKLM: \ Software \ Wow6432Node \ umgeleitet und kann die benötigten Informationen natürlich nicht finden (da er sich im 64-Bit-Registrierungszweig befindet) )

Frage:

1) Wie erstelle ich 64-Bit 7-Zip-SFX?

ODER

2) Wie kann ich 64-Bit-PowerShell mit 32-Bit-SFX ausführen?

ODER

3) Wie lese ich die 64-Bit-Registrierung (nicht Wow6432Node) über die 32-Bit-PowerShell? (Obwohl ich denke, dass dies entweder unmöglich ist oder die Menge an PowerShell-Code erheblich erhöhen wird.)

ODER

Irgendwelche anderen Vorschläge?

Antworten:


1

Hier ist eine geschachtelte Archetyp-Funktion zum Bestimmen der OS-Bitanzahl + Powershell-Bitanzahl. Hinzugefügt sysnativePfad in einer Variablen Reg.exe so können Sie den x64 - Schlüssel von einem 32 - Bit - Prozess reg bearbeiten. Wenn Sie reg.exe nicht bevorzugen, gibt es sicher noch andere Möglichkeiten, den gleichen Trick auszuführen.

    Function ARCHETYPE (){

    $ARCH = (Get-WmiObject -class Win32_OperatingSystem | Select-Object OSArchitecture).OSArchitecture
    If ($ARCH -eq '64-bit') {
    $DOUBLEARCHES = (Get-Process -Id $PID).StartInfo.EnvironmentVariables["PROCESSOR_ARCHITECTURE"]
    If ($DOUBLEARCHES -eq 'x86') {
    Write-Host 'Running 32-bit PowerShell on 64-bit Windows'
    $REG = "%WINDIR%\sysnative\reg.exe"
    }
    ElseIf ($DOUBLEARCHES -eq 'amd64') {
    Write-Host 'Running 64-bit PowerShell on 64-bit Windows'
    $REG = "%WINDIR%\system32\reg.exe"
    }
    }Else{
    Write-Host 'Running 32-bit PowerShell on 32-bit Windows'
    $REG = "%WINDIR%\system32\reg.exe"
    }
    Write-Host "$REG"
    }

    ARCHETYPE

Ergebnis

Running 64-bit PowerShell on 64-bit Windows
%WINDIR%\system32\reg.exe

oder

Running 32-bit PowerShell on 64-bit Windows
%WINDIR%\sysnative\reg.exe

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.