Systemwiederherstellung per PowerShell deaktivieren

Reinhard77

Lieutenant
Registriert
Feb. 2019
Beiträge
1.010
Es gibt im Rahmen der automatisierten Installation einen PowerShell Schritt, der die Systemwiederherstellung von Windows deaktivieren soll. Das funktioniert eigentlich auch einwandfrei. Jedenfalls so lange ich diesen Schritt z.B. über die ISE manuell ausführe.
Dann funktioniert dieser Schritt immer.

Wenn das Ganze aber im Zusammenspiel mit einer .exe Datei ausgeführt wird, die für das Handling von vielen Schritten verantwortlich ist, dann wird bei LTSC System (auf Windows 11 Pro z.B. funktioniert es) die Systemwiederherstellung für Laufwerk C: (also über den Befehl
PowerShell:
Disable-ComputerRestore -Drive "C:\"
) nicht deaktiviert.

Woran kann es liegen?
Der untere Teil mit der IF-Abfrage funktioniert auch immer.

Hier der Schritt:
PowerShell:
Disable-ComputerRestore -Drive "C:\"
#Systemwiederherstellungseinstellungen können nicht mehr manuell verändert werden                            
if (!(Test-Path 'HKLM:\Software\Policies\Microsoft\Windows NT\SystemRestore')) {                                        
    New-Item -Path 'HKLM:\Software\Policies\Microsoft\Windows NT' -Name "SystemRestore"                                
    New-ItemProperty -Path 'HKLM:\Software\Policies\Microsoft\Windows NT\SystemRestore' -Name "DisableSR" -Value "1" -Type DWORD                                                                                    
}                                        
else                                        
{                                        
    Set-ItemProperty -Path 'HKLM:\Software\Policies\Microsoft\Windows NT\SystemRestore' -Name "DisableSR" -Value "1" -Type DWORD                                                                                    
}
 
Zuletzt bearbeitet:
Pruefe nach in welchem Nutzerkontext die EXE rennt.
Und was fuer eine EXE. Der Powershellkrams als EXE oder eine EXE die den Powershellkrams aufrufen soll?
 
Ich habe für mich ein Template geschrieben (basierend auf Tipps von c't), die mir ein PowerShell-Script immer mit Admin-Rechten startet (bei Fehlen eben dazu auffordert), und das ganze kann als .cmd-Datei aufgerufen werden:

Code:
@echo off
setlocal enabledelayedexpansion
for %%i in (%*) do (
    set "param=%%i"
    if !param:~0^,1!!param:~-1! neq "" set "param="!param!""
    set "params=!params!,!param!"
)

echo param([switch]$Elevated) > "%temp%\%~n0.ps1"
echo Set-Location "%cd%" >> "%temp%\%~n0.ps1"
echo $cmdargs=%params% >> "%temp%\%~n0.ps1"
%windir%\System32\more +25 "%~f0" >> "%temp%\%~n0.ps1"
endlocal

where /q pwsh.exe
if errorlevel 1 (
    set POWERSHELL_EXE=powershell.exe
) else (
    set POWERSHELL_EXE=pwsh.exe
)
%POWERSHELL_EXE% -NoProfile -ExecutionPolicy Bypass -File "%temp%\%~n0.ps1" %*
exit /b

*** Ab hier PowerShell ***
# Voraussetzung: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

function Test-Admin {
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

if ((Test-Admin) -eq $false)  {
    if ($elevated) {
        # tried to elevate, did not work, aborting
    } else {
        Start-Process ${Env:POWERSHELL_EXE} -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
    }
    exit
}

'running with full privileges'

# Hier folgt das eigentliche Script

ich sage jetzt nicht, dass du das ganze Script so verwenden sollst, aber vielleicht sind ja Teile davon nützlich...

Zur Erklärung zu dem Script: Diese cmd-Datei schreibt ein ps1-Script im Temp-Ordner und führt das dann aus. Es bevorzugt die neue PowerShell, nimmt als Fallback die Windows PowerShell.
 
Zurück
Oben