Lire la branche de registre x64 à partir du programme d'installation SFX 7-zip via PowerShell

2

Je souhaite que mon archive auto-extractible à 7 zip exécute un script PowerShell après l'extraction des fichiers. Pour ce faire, j'utilise la méthode décrite ici: http://www.sphaero.org/blog:2011:0504_7zip_self_extracting_autostart_exe

Après l'extraction de fichier, je souhaite exécuter un script PowerShell. Voici le contenu de mon fichier config.txt:

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

Le fichier InstallCU.bat lance PowerShell:

powershell.exe -ExecutionPolicy Unrestricted -File InstallCU.ps1

Dans le script powershell, je fais beaucoup de choses, notamment en vérifiant certaines clés de registre sous cette branche:

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

en utilisant Test-Path et Get-ItemProperty cmd-let

Je ne l'ai pas testé, mais je pense que sur les ordinateurs 32 bits, tout se passera bien.

Mon problème est que sur les systèmes 64 bits, la version 32 bits (x86) de PowerShell est lancée. Lorsque j'accède à un chemin du registre sous HKLM: \ Software, il est redirigé vers HKLM: \ Software \ Wow6432Node \ et, bien sûr, il ne parvient pas à trouver les informations dont j'ai besoin (car elles se trouvent dans la branche de registre 64 bits). )

Question:

1) Comment créer un fichier SFX 64 bits 7-zip?

OU

2) Comment puis-je exécuter PowerShell 64 bits à partir de SFX 32 bits?

OU

3) Comment puis-je lire le registre 64 bits (pas Wow6432Node) via le PowerShell 32 bits? (Bien que je pense que cela soit impossible ou augmentera considérablement la quantité de code PowerShell)

OU

D'autres suggestions?

Ubeogesh
la source

Réponses:

1

Voici une fonction d'archétype imbriquée pour déterminer le bitness du système d'exploitation + le bitness de Powershell. Ajout du sysnativechemin d'accès dans une variable à reg.exe afin que vous puissiez modifier à nouveau les clés x64 à partir d'un processus 32 bits. Si vous ne préférez pas reg.exe, je suis sûr qu'il existe d'autres moyens de faire la même chose.

    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

Résultat

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

ou

Running 32-bit PowerShell on 64-bit Windows
%WINDIR%\sysnative\reg.exe
Knuckle-Dragger
la source
1

Probablement trop tard, mais il vaut la peine de le faire savoir à tout le monde, il existe un module "7zsd_All_x64.sfx", ajoutez-le à votre fichier de configuration et à votre archive pour obtenir un fichier de 64 bits.

Leonavas
la source
Merci, il se trouve à github.com/chrislake/7zsfxmm/releases/tag/1.7.1.3901
Yoel halb