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

Ausgedruckt am: 19.03.2024 um 02:03 Uhr

Mitglied: 135333
135333 13.02.2018 aktualisiert um 15:07:34 Uhr
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
Mitglied: emeriks
emeriks 14.02.2018 um 08:35:54 Uhr
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 ...
Mitglied: emeriks
emeriks 14.02.2018 aktualisiert um 11:37:02 Uhr
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
}
Mitglied: emeriks
emeriks 14.02.2018 um 11:39:40 Uhr
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 14.02.2018 aktualisiert um 17:13:43 Uhr
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