Fireplace April 2026

Systemwiederherstellung per PowerShell deaktivieren

Reinhard77

Lieutenant
Registriert
Feb. 2019
Beiträge
1.012
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?
 
  • Gefällt mir
Reaktionen: kartoffelpü
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.
 
Kann es sein, dass die Execution Policy die Ausführung nicht zulässt?
Was bekommst Du bei "Get-ExecutionPolicy" für eine Ausgabe (evtl. RemoteSigned)?

Du könntest den Schutz mal testweise deaktivieren:
Set-ExecutionPolicy -ExecutionPolicy] Unrestricted

Anschließend Deine EXE nochmal testen und danach wieder auf den vorherigen Wert zurückstellen.
 
@tollertyp Da hast Du natürlich Recht, aber nur weil gemeldet wird, dass der untere Teil immer ausgeführt wird muss das noch lange nicht wirklich so sein.
Bei allen Meldungen bei denen ein Befehl in der ISE funktionierte und anschließend als Skript nicht, war immer die ExecutionPolicy die Ursache.
 
  • Gefällt mir
Reaktionen: areiland
BFF schrieb:
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?

Es ist eine EXE die den Powershellkrams aufrufen soll.

Für alles Weitere hier, muss ich mir erst ein Testsystem aufbauen, da ich aktuell kein LTSC Testsystem zum Überprüfen habe. Deswegen wäre es nett, wenn dieser Thread nicht so schnell geschlossen wird. Kann also etwas dauern, da ich auch erstmal die Zeit dafür haben muss...

Laut einer KI soll es sich bei der Systemwiederherstellung um eine entfernte Funktion bei LTSC handeln. Es soll angeblich nur noch die grafische Oberfläche dieser Funktion zu sehen sein, da LTSC um bestimmte Funktionen beschnitten ist. Das habe ich aber ausgetestet: Es ließen sich problemlos Wiederherstellungspunkte erstellen.
Somit sollte die Aussage der KI in dem Fall falsch sein.
 
Zuletzt bearbeitet:
Der Fall ist gelöst :)

Es lag an der Reihenfolge der Schritte. Nachdem ich den Schritt ans Ende der Installation verschoben habe, hat es einwandfrei funktioniert. Vermutlich liegt es daran, dass der Befehl
PowerShell:
Disable-ComputerRestore -Drive "C:\"
Benutzerabhängig ist.

D.h. es wurde erst unter einem anderen Benutzer dieser Befehl ausgeführt und dann wechselt die Installation zu einem weiteren Benutzer, der dann diese Einstellung nicht hat. Nachdem der Befehl unter dem letztendlich verwendeten Benutzer ausgeführt wurde, funktioniert es.

Vielen Dank und ...
 
  • Gefällt mir
Reaktionen: BFF
Zurück
Oben