emeriks
Goto Top

PowerShell - Registry x64

Hi,
ich will sicherstellen, dass ein PowerShell Script immer im x64-Zweig der Registry liest, egal ob die PowerShell in 32 oder 64 Bit läuft.
Also greife ich folgendermaßen zu:
$Reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Registry64)
$Value1 = $Reg.OpenSubKey("SOFTWARE\MySoftware").GetValue("Value1")  


Das funktioniert unter PS v4 tadellos. Jedoch unter PS v2.0 kommt

Microsoft.Win32.RegistryView : Der Typ [Microsoft.Win32.RegistryView] kann nicht gefunden werden: Stellen Sie sicher, dass die Assembly, die diesen Typ enth„lt, geladen wird.
Bei ........ps1:108 Zeichen:127
_+ $Reg = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView] <<<< ::Registry64)
_+ CategoryInfo : InvalidOperation: (Microsoft.Win32.RegistryView:String) , RuntimeException
_+ FullyQualifiedErrorId : TypeNotFound

Mit Get-ItemProperty liest er doch immer abhängig davon, ob PS als x86 oder x64 läuft. Das ist doch richtig?

Welche Optionen habe ich in PS v2.0 für o.g.?

Ich benötige PS v2.0, weil dieses Script in einer Exchange 2010 PowerShell laufen muss.

E.

Content-Key: 364617

Url: https://administrator.de/contentid/364617

Printed on: April 26, 2024 at 05:04 o'clock

Mitglied: 135333
135333 Feb 13, 2018 updated at 14:07:34 (UTC)
Goto Top
Checke einfach am Anfang des Skriptes ob es eine 32 oder 64 Bit Konsole ist und restarte die Session als 64bit wenn es keine 64bit ist
https://www.reddit.com/r/PowerShell/comments/2rv3y3/force_script_to_rela ...
Gruß snap
Member: emeriks
emeriks Feb 14, 2018 at 07:35:54 (UTC)
Goto Top
Checke einfach am Anfang des Skriptes ob es eine 32 oder 64 Bit Konsole ist und restarte die Session als 64bit wenn es keine 64bit ist.
Das wäre eine Variante ...
Member: emeriks
emeriks Feb 14, 2018 updated at 10:37:02 (UTC)
Goto Top
Danke, damit bin ich jetzt weiter gekommen.

So habe ich es gelöst: s.u.
(Achtung: Ich habe es nicht getestet, wenn auf einem Computer nur die v2.0 installiert ist und auch nur ein x86 OS.)

Jetzt kann ich einfach mit Get-ItemProperty in der Registry lesen.

$IsPowerShellx64 = ([IntPtr]::size -eq 8)
$IsPowerShellv2 = ($PSVersionTable.PSVersion -eq [Version]"2.0")  
If(-not $IsPowerShellv2 -or -not $IsPowerShellx64) {
  # PS-Version ist größer als 2.0 --> Das Script startet sich selbst noch einmal mit PS v2.0
  # und/oder
  # PS läuft nicht als x64 --> Das Script startet sich selbst noch einmal mit PS v2.0 und x64
  
  # Hinweis: Normalerweise ist in einen 32bit-Prozess der SYSWOW64-Pfad nicht sichtbar, er wird als "System32" emuliert. 
  # Trotzdem verweist $PSHOME in seinem Pfad auf SYSWOW64, wenn es als x86 läuft.
  $PSpath = $PSHOME.ToLower().Replace("syswow64","sysnative") + "\powershell.exe"  
  $ScriptPath = $MyInvocation.MyCommand.Definition
  Start-Process -FilePath $PSpath -ArgumentList "-Version 2 -File `"$ScriptPath`" `"$DataFilePath`"" -Wait  
  exit
}
Member: emeriks
emeriks Feb 14, 2018 at 10:39:40 (UTC)
Goto Top
Nee, das war es doch noch nicht.

Ich habe hier zwei Server mit Win2008R2. Beide mit PowerShell 4. Auf dem einen funktioniert es, auf dem anderen nicht.
Wo es nicht funktioniert, da wird auch beim Start der Powershell aus dem Script heraus mit "-Version 2" weiterhin Version 4 gemeldet.

Was ist das jetzt schon wieder?
Mitglied: 135333
135333 Feb 14, 2018 updated at 16:13:43 (UTC)
Goto Top
Zitat von @emeriks:

Checke einfach am Anfang des Skriptes ob es eine 32 oder 64 Bit Konsole ist und restarte die Session als 64bit wenn es keine 64bit ist.
Das wäre eine Variante ...
Zweite Variante: Über "StdRegProvider" und WMI und "__ProviderArchitecture" arbeiten
https://gallery.technet.microsoft.com/scriptcenter/6062bbfc-53bf-4f92-99 ...
https://msdn.microsoft.com/en-us/library/aa393067(v=vs.85).aspx