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-Key: 391744

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

Printed on: April 24, 2024 at 17:04 o'clock

Member: wisebeer
wisebeer Nov 06, 2018 updated at 05:45:25 (UTC)
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
Member: Markus2016
Markus2016 Nov 06, 2018 at 21:56:59 (UTC)
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
Member: Markus2016
Markus2016 Nov 07, 2018 at 20:33:16 (UTC)
Goto Top
Hallo zusammen,

hat noch jemand eine Idee wie ich das hinbekommen kann?

Gruß
Markus
Member: Markus2016
Markus2016 Nov 07, 2018 at 22:38:08 (UTC)
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