potshock
Goto Top

Powershell: Remove-ItemProperty

Hi Powershell User,

ich habe ein Poweshell-Script, mit welchem ich diverse Einstellung für User konfiguriere.
U.a. wird je nachdem, ob es sich bei dem Gerät um einen Desktop oder ein mobiles Gerät handelt, bei Desktop Geräten ein Proxy konfiguriert.
Wenn der Registry-Eintrag nicht vorhanden war, konnte ich den Fehler via "-ErrorAction SilentlyContinue" unterdrücken, was jetzt nicht mehr funktioniert!
Dies funktionierte Monate einwandfrei, plötzlich wift es eine Fehlermeldung aus.

Hier der betroffene Codeschnippsel:
$Desktop = Get-WmiObject  -class win32_ComputerSystem | select PcSystemType
if ($Desktop.PcSystemType -eq 2) {
    Write-Host -Foreground Yellow "Pc ist ein Laptop, es wird kein Proxy konfiguriert!"  
    Set-ItemProperty -Type DWord -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "AutoDetect" -value "0"  
    # "Remove-ItemProperty" warf vormals eine Fehlermeldung aus, wenn der Wert (-name) nicht existiert, was der Normalfall ist. 
    # Um diese Fehlermeldung zu unterdruecken, haengten wir ein "-ErrorAction SilentlyContinue" an. 
    Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "AutoConfigURL" -ErrorAction SilentlyContinue  
    # Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"  -Name "AutoConfigURL" 
}
else {
    Write-Host -Foreground Yellow "Pc ist ein Desktop/Workstation/Server, es wird die Automatische Konfiguration des Proxy durchgefuehrt!"  
    Set-ItemProperty -Type DWord -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "AutoDetect" -value "0"  
    Set-ItemProperty -Type ExpandString -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "AutoConfigURL" -value "http://www.UnsereDomain/proxy.pac"  
}

Seit einiger Zeit erhalte ich bei bei der Zeile
Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "AutoConfigURL" -ErrorAction SilentlyContinue  
folgenden Fehler:
Remove-ItemProperty : Die Eigenschaft AutoConfigURL ist im Pfad 
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings nicht vorhanden.
In Zeile:45 Zeichen:5
+     Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Curre ...  
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (AutoConfigURL:String) [Remove-ItemProperty], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException,Microsoft.PowerShell.Commands.RemoveItemProp 
   ertyCommand

Wer hilft mir auf die Sprünge?

Gruß
Potshock

Content-ID: 3029900600

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

em-pie
em-pie 09.06.2022 um 14:38:59 Uhr
Goto Top
Moin,

die Fehlermeldung ist doch eindeutig:
den RegKey/ -pfad HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings gibt es nicht (mehr)...

Gruß
em-pie
potshock
potshock 09.06.2022 aktualisiert um 15:01:18 Uhr
Goto Top
Hi em-pie,

tja, den Pfad gibt es (immer) noch. Frisch installierte Kiste mit Win 10 21H2.
regpfad


Ausserdem müsste es dann vorher schon in der Zeile
Set-ItemProperty -Type DWord -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "AutoDetect" -value "0"  
Gemecker geben.

Gruß
Potshock
em-pie
em-pie 09.06.2022 um 15:20:06 Uhr
Goto Top
es fehlt aber der RegEintrag "AutoConfigURL"

und was nicht da ist, kann er nicht löschen.
Wie gesagt: Die Fehlermeldung ist da eindeutig.
potshock
potshock 09.06.2022 um 15:46:45 Uhr
Goto Top
Hi em-pie,

ja genau, vielleicht habe ich mich mal wieder etwas mißverständlich ausgedrückt.

Dieser Fehler wird bei laptops ja von mir erwartet, aber wie oben schon gesagt, konnte ich diese Fehlermeldung immer via "-ErrorAction SilentlyContinue" unterdrücken und es wurde kein Fehler ausgeworfen.
Das scheint jetzt aber nicht mehr zu funktionieren!

Wie könnte ich den Fehler denn anders unterdrücken. Das Script macht ja sonst was es soll und läuft auch nach dem Fehler weiter durch.
Ich sammel am Ende des Scripts alle aufgetreten Fehler und schreibe die in eine Log Datei. Und genau diesen erwartbaren Fehler will ich dort nicht sehen.
if ($error.Count -gt 0) { 
	$error | fl >> $LOG
}

Gruß
Potshock
em-pie
em-pie 09.06.2022 aktualisiert um 16:03:28 Uhr
Goto Top
Ahh... das hab ich tatsächlich übersehen...

Gute Frage, weshalb das nicht geht... hier und da gibt es ähnliche Phänomene dem Parameter. Die Lösung war dann ein try... catch
try {Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "AutoConfigURL"} catch {}  
TK1987
TK1987 09.06.2022 aktualisiert um 16:31:17 Uhr
Goto Top
Moin,

Zitat von @potshock:
Ich sammel am Ende des Scripts alle aufgetreten Fehler und schreibe die in eine Log Datei. Und genau diesen erwartbaren Fehler will ich dort nicht sehen.
das heisst, auf der Konsole selbst wird der Fehler schon unterdrückt?

Naturgemäß unterdrückt -ErrorAction SilentlyContinue nur die Ausgabe auf der Konsole - schreibt SIe aber dennoch in die $Error-Variable.

back-to-topWie verhindert man das?
back-to-topMöglichkeit 1: Das Property nur löschen, falls es existiert
$Item = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"  
if (Test-Path $Item -and (Get-Item $Item).GetValue("AutoConfigURL")) {Remove-ItemProperty $Item "AutoConfigURL"}  

back-to-topMöglichkeit 2: Fehler mit Try/Catch abfangen und aus der Errorvariable entfernen
try {Remove-ItemProperty -ErrorAction Stop "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" "AutoConfigURL"}  
catch {$Error.Remove($_)}

Gruß Thomas
potshock
potshock 10.06.2022 um 15:11:12 Uhr
Goto Top
Hi em-pie,

try {Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name "AutoConfigURL"} catch {}  
liefert in meiner error Ausgabe nach wie vor:
Remove-ItemProperty : Die Eigenschaft AutoConfigURL ist im Pfad 
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings nicht vorhanden.
In Zeile:58 Zeichen:6
+ try {Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Curr ...  
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (AutoConfigURL:String) [Remove-ItemProperty], PSArgumentExcep 
   tion
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException,Microsoft.PowerShell.Commands 
   .RemoveItemPropertyCommand
 


hi Thomas,

Möglichkeit 1 schreibt folgenden Fehler (-and ist doch aber der Verknüpfungsoperator):
Test-Path : Es wurde kein Parameter gefunden, der dem Parameternamen "and" entspricht.  
In Zeile:61 Zeichen:21
+ if (Test-Path $Item -and (Get-Item $Item).GetValue("AutoConfigURL"))  ...  
+                     ~~~~
    + CategoryInfo          : InvalidArgument: (:) [Test-Path], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.TestPathCommand
 

Möglichkeit 2 gibt den selben Fehler wie oben bei em-pie in der Error.log aus:
Remove-ItemProperty : Die Eigenschaft AutoConfigURL ist im Pfad 
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings nicht vorhanden.
In Zeile:63 Zeichen:6
+ try {Remove-ItemProperty -ErrorAction Stop "HKCU:\Software\Microsoft\ ...  
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (AutoConfigURL:String) [Remove-ItemProperty], PSArgumentExcep 
   tion
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException,Microsoft.PowerShell.Commands 
   .RemoveItemPropertyCommand


Viele Grüße
Potshock
TK1987
Lösung TK1987 11.06.2022 um 14:39:19 Uhr
Goto Top
Moin,

Zitat von @potshock:
Möglichkeit 1 schreibt folgenden Fehler (-and ist doch aber der Verknüpfungsoperator):
Test-Path : Es wurde kein Parameter gefunden, der dem Parameternamen "and" entspricht.  
In Zeile:61 Zeichen:21
+ if (Test-Path $Item -and (Get-Item $Item).GetValue("AutoConfigURL"))  ...  
+                     ~~~~
mein Fehler. Test-Path muss natürlich in Klammern, um -and nutzen zu können.
if ((Test-Path $Item) -and (Get-Item $Item).GetValue("AutoConfigURL"))  

Möglichkeit 2 gibt den selben Fehler wie oben bei em-pie in der Error.log aus:
Seltsamer Weise, scheint der ErrorRecord, der dem Catch-Block übergeben wird, nicht mit dem in der ErrorVariable übereinzustimmen (obwohl die exakt beide den selben Inhalt haben). Da wir im Catch-Block schon wissen, dass ein zu löschender Fehler in der Error-Variable steht, können wir aber natürlich auch einfach das letzte Objekt in der Error-Variable löschen lassen.
try {Remove-ItemProperty -ErrorAction Stop "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" "AutoConfigURL"}  
catch {$Error.Remove($Error[-1])}

Gruß Thomas
potshock
potshock 13.06.2022 um 09:32:00 Uhr
Goto Top
Guten Morgen Thomas,

danke Dir, Möglichkeit 1 nutze ich jetzt. Fehler erscheint nicht mehr und nach weiteren Umbauarbeiten am Script keine weiteren Probleme aufgetaucht.

@ em-pie: auch Dir besten Dank für die Unterstützung!

Wünsche Euch einen guten Start in die Woche
Potshock