bugger
Goto Top

Powershell - Current User Registry

Hallo,

ich habe hier folgenden Code um mit Powershell die Current User Registry zu bearbeiten:

$root = [Microsoft.Win32.RegistryHive]::Users
$regKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($root, $ComputerName)

# Get all SIDs that don't end with _Classes and are 
# long enough to be a domain SID (not local machine).
$users = $regKey.GetSubKeyNames() | where { $_.Length -gt 10 -and $_.EndsWith("_Classes") -eq $false }  

foreach ($usersid in $users)
{
	# Open the key for write access
	$key = "$usersid\SOFTWARE\Microsoft"  
	$regKey = $regKey.OpenSubKey($key, $true)
	$regKey.SetValue("A Test Value", "a meaningless string", 'String')  
}

Das hatte auch mal funktioniert aber auf einmal nicht mehr. Jetzt kommt immer diese Fehlermeldung:
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In Zeile:8 Zeichen:2
+     $regKey.SetValue("A Test Value", "a meaningless string", 'String' ...  
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) , RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Jemand eine Idee, wie man den wieder zum laufen bekommt?

Content-ID: 382431

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

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

emeriks
emeriks 06.08.2018 um 10:26:28 Uhr
Goto Top
Hi,
testest Du das vielleicht mit einem Zielcomputer, an welchem sich noch nie jemand angemeldet hat? Oder bei welchem eingestellt ist, dass bei Abmeldung das Benutzerprofil gelöscht werden soll?

Zeile 2 funktioniert?

E.
colinardo
colinardo 06.08.2018 aktualisiert um 11:18:07 Uhr
Goto Top
Servus.
$key = "$usersid\SOFTWARE\Microsoft"
$regKey = $regKey.OpenSubKey($key, $true)
Keiner weiß weiß hier was in $users drin steht und ob es die SID im Users Key gibt. Ich vermute das es eben eine der SIDs im "Users" Key nicht gibt und damit die Variable $regKey (welche übrigens bereits dem Basekey zugewiesen wurde(ebenfalls Schlecht da du dadurch den Basekey nicht mehr ordnungsgemäß über die Close-Methode schließen kannst)) leer ist.

Also prüfe erst ob die Keys existieren z.B. über Try-Catches bevor du Methoden auf Ihnen ausführst. Denn hat eine Variable keinen Inhalt, kannst du auch keine Methode darauf ausführen face-wink, deswegen auch die passende Fehlermeldung: Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.

Grüße Uwe
Bugger
Bugger 06.08.2018 aktualisiert um 11:32:59 Uhr
Goto Top
Habe den Code auch nur in einem Microsoft Forum gefunden.^^ Beitrag ist allerdings schon von 2011 also gibt es da heute möglicherweise bessere Methoden zum Ziel.

Wenn ich ein echo $users eingebe, kommt auf jedenfall die richtige SID bei raus. Und wie gesagt, es hatte auch mal funktioniert, dass wurdert mich am meisten.

Und bei dem Ziel Computer ist jemand angemeldet und das Profil löscht sich auch nicht von alleine.
colinardo
colinardo 06.08.2018 aktualisiert um 11:47:53 Uhr
Goto Top
Zitat von @Bugger:

Habe den Code auch nur in einem Microsoft Forum gefunden.^^ Beitrag ist allerdings schon von 2011 also gibt es da heute möglicherweise bessere Methoden zum Ziel.
Nicht gerade schlau Code zu verwenden den man nicht 100% trauen kann face-smile.

Wenn ich ein echo $users eingebe, kommt auf jedenfall die richtige SID bei raus. Und wie gesagt, es hatte auch mal funktioniert, dass wurdert mich am meisten.
Ob es die SID im Ordner gibt und auch den Unterordner weißt nur du, können wir hier nicht sehen, mangels stichhaltigen Infos .
Und bei dem Ziel Computer ist jemand angemeldet und das Profil löscht sich auch nicht von alleine.
  • Als erstes prüfe die Firewall für die Remote-Verwaltungsausnahme und ob der RemoteRegistry-Dienst auf dem Zielsystem läuft.
  • Passende Rechte (hier ja ebenfalls Schreibrechte) für den Zugriff auf den Unterschlüssel in der Registry müssen gegeben sein. Skript muss mit diesen Rechten gestartet sein.
  • Fürs Debugging setze Start-Transcript für's Logging ein und um jeden kritischen Abschnitt Try-Catches mit Fehlerausgabe. So bekommst du das schnell in den Griff.
Bugger
Bugger 06.08.2018 um 12:32:30 Uhr
Goto Top
Ich empfand den Code jetzt nicht so verwerflich, man sieht ja was der macht face-smile

Aber ich habe den Fehler gefunden, ich kam durcheinander mit dem Beispielcode oben und meinem eigenen. Der Beispielcode hat nämlich funktioniert. Ich habe daraufhin herausgefunden, dass er den Code nicht ausführt, wenn der obere Schlüssel fehlt, was ja auch logisch ist.^^
Ein anhängen von .CreateSubKey("Schlüssel") an $regKey = $regKey.OpenSubKey($key, $true) hat dann geholfen. War halt verwirrend, dass es mal ohne funktioniert hatte.

Also wieder Fehler 40... sorry für die Umstände aber vielen Dank für die Hilfe face-smile