markus2016
Goto Top

Anpassung Registry bei einem bereitgestellten Image

Hallo zusammen,

ich ändere bei einem bereitgestellten Windows 10 Image (1803) in der Registry ein paar Einstellungen.
Hierbei habe ich das Problem, dass anschließend auf das bereitgestellte Image noch ein Prozess zugreift, wodurch ich beim aufheben der Bereitstellung eine Fehlermeldung erhalte.

Fehlerausgabe:
Dismount-WindowsImage | Unsuccessful

Path : C:\Windows_Home\Windows 1803\Mount
ImagePath : C:\Windows_Home\Windows 1803\DiskImage\sources\install.wim
ImageIndex : 5
MountMode : ReadWrite
MountStatus : Ok

Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.


oder

Dismount-WindowsImage | Unsuccessful

Path : C:\Windows_Home\Windows 1803\Mount
ImagePath : C:\Windows_Home\Windows 1803\DiskImage\sources\install.wim
ImageIndex : 5
MountMode : ReadWrite
MountStatus : Invalid

Die Bereitstellung des Verzeichnisses konnte nicht vollständig aufgehoben werden. Dies ist normalerweise darauf zurückzuführen, dass im Bereitstellungsverzeichnis noch Dateien von Anwendungen geöffnet sind. Schließen Sie diese Dateien, und wiederholen Sie die Aufhebung der Bereitstellung, um den Vorgang abzuschließen.


Hierzu habe ich im Netz einen Tipp mit dem "[System.GC]::Collect()" gefunden, aber das Problem besteht weiterhin.
Gibt es hier noch weitere Möglichkeiten, um sicher zu stellen, dass alle Dateizugriffe abgeschlossen sind?

Vielen Dank im Voraus für Eure Unterstützung.

Auszug des Scriptes:
Get-PSDrive -PSProvider Registry | Where-Object {$_} | Select-Object -ExpandProperty Name | ForEach-Object {Start-Process -FilePath "REG.EXE" -ArgumentList "Unload $_" -Wait -WindowStyle Hidden; Remove-PSDrive -Name $_}  

$Checked | ForEach-Object {

. "$Project\Registry\$($_.Name)"  

Start-Process -PassThru -FilePath "REG.EXE" -ArgumentList "Load $(Set-RegKey) ""$(Set-RegPath)""" -Wait -WindowStyle Hidden  

New-PSDrive -Name $(Set-Reg) -PSProvider Registry -Root $(Set-RegRoot)

IF (!(Test-Path $(Set-HivePath)))
{
New-Hive
Set-Hive
} else {
Set-Hive
}

$i = 0
while ((Test-Path $(Set-HivePath)) -AND ($i -le 5)) {
[System.GC]::Collect()
Start-Process -PassThru -FilePath "REG.EXE" -ArgumentList "Unload $(Set-RegKey)" -Wait -WindowStyle Hidden  
$i += 1
}

[System.GC]::Collect()

Remove-PSDrive -Name $(Set-Reg)

[System.GC]::Collect()

}

Get-ChildItem (Split-Path $(Set-RegPath) -Parent) -Force | Where-Object {($_.psiscontainer -eq $false) -AND ($_.Name -like "ntuser*") -AND ($_.name -ne "ntuser.dat") -AND ($_.name -ne "ntuser.ini") -AND ($_.Name -ne "ntuser.pol")} | Remove-Item -Force  

Get-PSDrive -PSProvider Registry | Where-Object {$_} | Select-Object -ExpandProperty Name | ForEach-Object {Start-Process -FilePath "REG.EXE" -ArgumentList "Unload $_" -Wait -WindowStyle Hidden; Remove-PSDrive -Name $_}  

[System.GC]::Collect()

Beispiel einer Reg.ps1, welche ich mittels
. "$Project\Registry\$($_.Name)"  
in das Script lade:
Function Set-Reg {
"HKLM"  
}

Function Set-RegKey {
"HKLM\OFFLINE"  
}

Function Set-RegRoot {
"HKEY_LOCAL_MACHINE"  
}

Function Set-RegPath {
"$Project\Mount\Windows\System32\Config\SOFTWARE"  
}

Function Set-HivePath {
"HKLM:\OFFLINE\Policies\Microsoft\Windows\Windows Search"  
}

Function New-Hive {
New-Item -Path $(Set-HivePath)
}

Function Set-Hive {
Set-ItemProperty -Path $(Set-HivePath) -Name ConnectedSearchUseWeb -Value 0 -PassThru -Force
}

Gruß
Markus2016

Content-ID: 391744

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

Ausgedruckt am: 24.11.2024 um 08:11 Uhr

wisebeer
wisebeer 06.11.2018 aktualisiert um 06:45:25 Uhr
Goto Top
Hallo Markus,

Ich mache das beim Bearbeiten eines Installationsmediums einfach so:

reg load HKEY_LOCAL_MACHINE\WIM $Mountpoint\Users\Default\ntuser.dat

reg add HKEY_LOCAL_MACHINE\WIM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer /v DisableEdgeDesktopShortcutCreation /t REG_DWORD /d "1" /f  

reg unload HKEY_LOCAL_MACHINE\WIM

LG Martin
Markus2016
Markus2016 06.11.2018 um 22:56:59 Uhr
Goto Top
Hallo Martin,

danke für das Beispiel.
Ich habe es über "REG ADD" ausprobiert.
Leider habe ich die selben Fehlermeldungen. face-sad

Schöne Grüße
Markus
Markus2016
Markus2016 07.11.2018 um 21:33:16 Uhr
Goto Top
Hallo zusammen,

hat noch jemand eine Idee wie ich das hinbekommen kann?

Gruß
Markus
Markus2016
Markus2016 07.11.2018 um 23:38:08 Uhr
Goto Top
Hallo zusammen,

nun habe ich es hinbekommen. face-smile

Ein einfaches
Start-Sleep 1
hilft.

Hier gefunden

Der Code sieht nun so aus.
$Checked | ForEach-Object {

. "$Project\Registry\$($_.Name)"  

IF (($WasLoaded = Test-Path $(Set-HivePath)) -eq $false) {
Start-Process -PassThru -FilePath 'REG.EXE' -ArgumentList 'Load $(Set-RegKey) ""$(Set-RegPath)""' -Wait -WindowStyle Hidden | Out-Null  

New-PSDrive -Name $(Set-Reg) -PSProvider Registry -Root $(Set-RegRoot)
}

IF (!(Test-Path $(Set-HivePath)))
{
New-Hive | Out-Null
Set-Hive | Out-Null
} else {
Set-Hive | Out-Null
}
        
IF ($WasLoaded -eq $false) {
[System.GC]::Collect()
Start-Sleep 1

Start-Process -PassThru -FilePath 'REG.EXE' -ArgumentList 'Unload $(Set-RegKey)' -Wait -WindowStyle Hidden | Out-Null  

Remove-PSDrive -Name $(Set-Reg)
}

}

Gruß
Markus