tralveller
Goto Top

Powershell: Registry Sichern und wiederherstellen (ohne reg.exe oder regedit.exe)

Hallo zusammen,

ich versuche momentan bestimmte Registry-Schlüssel und Werte zu sichern, kann aber nicht auf reg.exe oder regedit.exe zurückgreifen.

Bisher konnte ich nur die Werte exportieren:
get-Childitem 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles' -recurse | Export-CliXML C:\Temp\Test.xml  

Wie kann ich die exportieren Werte nun wieder importieren?

Danke vielmals und Grüße
Tralveller

Content-ID: 367223

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

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

Kraemer
Kraemer 07.03.2018 um 23:03:24 Uhr
Goto Top
colinardo
Lösung colinardo 08.03.2018 aktualisiert um 22:18:03 Uhr
Goto Top
function Export-RegTree([string]$regkey,[string]$exportpath){
    $data = @()
    $createobject = {
        param($k,$n)
        [pscustomobject] @{
            Name = @{$true='(Default)';$false=$n}[$n -eq '']  
            Value = $k.GetValue($n)
            Path = $k.PSPath
            Type = $k.GetValueKind($n)
        }
    }
    get-item $regkey -PipelineVariable key| %{
        $key.GetValueNames() | %{$data += . $createobject $key $_}
    }
    gci $regkey -Recurse -Force -PipelineVariable key | %{
        $key.GetValueNames() | %{$data += . $createobject $key $_}
    }
   $data | Export-Clixml $exportpath
}

function Import-RegTree([string][ValidateScript({Test-Path $_})]$xmlfile){
    Import-Clixml $xmlfile | %{
        if (!(Test-Path $_.Path)){md $_.Path -Force | out-null}
        New-ItemProperty -Path $_.Path -Name $_.Name -Value $_.Value -PropertyType $_.Type -Force
    }
}

# Export
Export-RegTree 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles' 'D:\export.xml'  
# Import
Import-RegTree 'D:\export.xml'  
Grüße Uwe
tralveller
tralveller 08.03.2018 aktualisiert um 22:13:47 Uhr
Goto Top
Hallo @colinardo,

ich hatte gehofft, dass es irgendwie in einem "Einzeiler" machbar ist, aber das scheint dann ohne reg bzw. regedit doch nicht so trivial zu sein.

Super, dein Entwurf war sehr hilfreich und hat die Lösung gebracht. face-smile

Ich habe noch einen kleinen Fehler ausgemerzt, es in 2 Skripte aufgeteilt und das Ganze so erweitert, dass man Registry-Pfad und Speicherort beim Start des Skripts mit angeben kann (dann muss man nicht im Skript selber "rumfrimeln" face-wink)

Das Export-Skript sieht nun so aus:
[CmdletBinding()]
param (
	[Parameter(Mandatory = $true)]
	[String]$RegKey,
	[Parameter(Mandatory = $true)]
	[String]$ExportPath
)

function Export-RegTree([string]$RegKey,[string]$ExportPath){
    $data = @()
    $createobject = {
        param($k,$n)
        [pscustomobject] @{
            Name = @{$true='(Default)';$false=$n}[$n -eq '']  
            Value = $k.GetValue($n)
            Path = $k.PSPath
            Type = $k.GetValueKind($n)
        }
    }
    get-item $RegKey -PipelineVariable key| %{
        $key.GetValueNames() | %{$data += . $createobject $key $_}
    }
    gci $RegKey -Recurse -Force -PipelineVariable key | %{
        $key.GetValueNames() | %{$data += . $createobject $key $_}
    }
   $data | Export-Clixml $ExportPath
}

# Export
Export-RegTree "$RegKey" "$ExportPath"  

Und wird z.B. gestartet via:
PowerShell.exe -executionpolicy unrestricted -Command ".\Reg_Export.ps1 -RegKey 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles' -ExportPath 'C:\temp\test.xml'"  

Das Import-Skript sieht so aus:
[CmdletBinding()]
param (
	[Parameter(Mandatory = $true)]
	[String]$XmlFile
)

function Import-RegTree([string][ValidateScript({Test-Path $_})]$XmlFile){
    Import-Clixml $XmlFile | %{
        if (!(Test-Path $_.Path)){md $_.Path -Force | out-null}
        New-ItemProperty -Path $_.Path -Name $_.Name -Value $_.Value -PropertyType $_.Type -Force
    }
}
# Import
Import-RegTree "$XmlFile"  

Und wird z.B. gestartet via:
PowerShell.exe -executionpolicy unrestricted -Command ".\Reg_Import.ps1 -XmlFile 'C:\temp\test.xml'"  


Danke an alle für die Hilfe.

Viele Grüße
Tralveller
colinardo
colinardo 08.03.2018 aktualisiert um 22:15:24 Uhr
Goto Top
Ich habe noch die kleinen Fehler ausgemerzt
Was für Fehler, ich sehe da keinen Unterschied? Du hast es nur mit Parametern an deine Bedürfnisse erweitert sonst nüscht face-smile.
Naja dann allzeit frohes Shellen ...
tralveller
tralveller 08.03.2018 um 22:17:06 Uhr
Goto Top
Simmt, sorry, es war ein kleiner "Fehler" mit dem doppelten Anführungszeichen, wenn überhaupt.
Import-RegTree 'D:\export.xml"  
Danke dir vielmals face-smile
colinardo
colinardo 08.03.2018 aktualisiert um 22:20:41 Uhr
Goto Top
Upps, OK das war dann ein Glas zuviel face-big-smile, ist korrigiert.

Keine Ursache und schönen Abend noch.