Code für Löschen von Registry Eintägen
Hallo zusammen,
ich muss zuerst gestehen, dass ich bzgl. Coding absoluter Laie bin und bitte um Nachsicht.
Ich habe aktuell das Problem, dass ich ein js Script erstellen soll, mit dem bestimmte Registry Einträge unter HKCU gelöscht werden sollen.
Mein aktueller Stand ist folgender:
function DeleteRegEntry()
{
try
{
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.RegDelete("HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\Skype");
}
}
Das funktioniert für den einen Eintrag soweit auch ganz gut. Problem ist nun aber, dass ich mehrere Registry Einträge bzw. zum Teil komplette Reg-Strukturen löschen müsste und dann einzelne Reg-Werte neu setze.
Konkret geht es um diese Reg-Strukturen:
[-HKCU\Software\Microsoft\Office\14.0\Common\Toolbars]
[-HKCU\Software\Microsoft\Office\14.0\Excel]
[-HKCU\TempHive\Software\Microsoft\Office\14.0\PowerPoint]
[-HKCU\Software\Microsoft\Office\14.0\Word]
[HKCU\Software\Microsoft\Office\14.0\Word\Options]
"ForceSetCopyCount"=dword:00000001
[-HKCU\Software\Software\7-Zip]
[HKCU\Software\7-Zip\FM]
"PanelPath0"="D:\\Kunden"
"Toolbars"=dword:0000000b
[HKCU\Software\7-Zip\Options]
"WorkDirPath"="D:\\Kunden"
[HKCU\Software\7-Zip\Compression]
"Archiver"="zip"
Wie löse ich das denn dann am besten?!
Alternativ könnte man u.U. auch ein *.reg File erstellen, welches die obigen Reg-Pfade enthält, welches dann per regedit.exe /s *.reg importiert wird.
Aber wie rufe ich das in js im aktuellen Nutzerkontext auf?
ich muss zuerst gestehen, dass ich bzgl. Coding absoluter Laie bin und bitte um Nachsicht.
Ich habe aktuell das Problem, dass ich ein js Script erstellen soll, mit dem bestimmte Registry Einträge unter HKCU gelöscht werden sollen.
Mein aktueller Stand ist folgender:
function DeleteRegEntry()
{
try
{
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.RegDelete("HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\Skype");
}
}
Das funktioniert für den einen Eintrag soweit auch ganz gut. Problem ist nun aber, dass ich mehrere Registry Einträge bzw. zum Teil komplette Reg-Strukturen löschen müsste und dann einzelne Reg-Werte neu setze.
Konkret geht es um diese Reg-Strukturen:
[-HKCU\Software\Microsoft\Office\14.0\Common\Toolbars]
[-HKCU\Software\Microsoft\Office\14.0\Excel]
[-HKCU\TempHive\Software\Microsoft\Office\14.0\PowerPoint]
[-HKCU\Software\Microsoft\Office\14.0\Word]
[HKCU\Software\Microsoft\Office\14.0\Word\Options]
"ForceSetCopyCount"=dword:00000001
[-HKCU\Software\Software\7-Zip]
[HKCU\Software\7-Zip\FM]
"PanelPath0"="D:\\Kunden"
"Toolbars"=dword:0000000b
[HKCU\Software\7-Zip\Options]
"WorkDirPath"="D:\\Kunden"
[HKCU\Software\7-Zip\Compression]
"Archiver"="zip"
Wie löse ich das denn dann am besten?!
Alternativ könnte man u.U. auch ein *.reg File erstellen, welches die obigen Reg-Pfade enthält, welches dann per regedit.exe /s *.reg importiert wird.
Aber wie rufe ich das in js im aktuellen Nutzerkontext auf?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 216894
Url: https://administrator.de/forum/code-fuer-loeschen-von-registry-eintaegen-216894.html
Ausgedruckt am: 03.04.2025 um 10:04 Uhr
9 Kommentare
Neuester Kommentar
Hallo menace,
für RegDelete gibt es eine andere Einschränkung. Es gilt, dass nur ein einzelner Key gelöscht werden kann, keine Strukturen.
RegWrite hingegen erstellt die gesamte Struktur bis hin zum Wert in einem Rutsch.
Musst du also einen Key löschen, der Subkeys enthält, würde ich dir mal eine Funktion anbieten, die das rekursiv über WMI erledigt.
Aufrufen dann wie folgt:
Wenn nötig, kannst du iRet anschließend auswerten. -1 wenn was schief gegangen ist, ansonsten die Gesamtzahl der gelöschten Keys in der Struktur.
Grüße
rubberman
für RegDelete gibt es eine andere Einschränkung. Es gilt, dass nur ein einzelner Key gelöscht werden kann, keine Strukturen.
RegWrite hingegen erstellt die gesamte Struktur bis hin zum Wert in einem Rutsch.
Musst du also einen Key löschen, der Subkeys enthält, würde ich dir mal eine Funktion anbieten, die das rekursiv über WMI erledigt.
var HKCR = HKEY_CLASSES_ROOT = 0x80000000;
var HKCU = HKEY_CURRENT_USER = 0x80000001;
var HKLM = HKEY_LOCAL_MACHINE = 0x80000002;
var HKU = HKEY_USERS = 0x80000003;
var HKCC = HKEY_CURRENT_CONFIG = 0x80000005;
function regDelKey(strComputer, uHive, strRegPath) {
try {
var iRet = 0;
var objLocator = new ActiveXObject("WbemScripting.SWbemLocator");
var objService = objLocator.ConnectServer(strComputer, "root\\default");
objService.Security_.ImpersonationLevel = 3; //wbemImpersonationLevelImpersonate
var objReg = objService.Get("StdRegProv");
var objEnumMethod = objReg.Methods_.Item("EnumKey");
var objEnumInParam = objEnumMethod.InParameters.SpawnInstance_();
objEnumInParam.hDefKey = uHive;
objEnumInParam.sSubKeyName = strRegPath;
var objEnumOutParam = objReg.ExecMethod_(objEnumMethod.Name, objEnumInParam);
if (objEnumOutParam.ReturnValue == 0) {
if (objEnumOutParam.sNames != null) {
for (var i = 0; i <= objEnumOutParam.sNames.ubound(); i++) {
var strNewPath = strRegPath + "\\" + objEnumOutParam.sNames.getItem(i);
iRet += regDelKey(strComputer, uHive, strNewPath);
}
}
var objDelMethod = objReg.Methods_.Item("DeleteKey");
var objDelInParam = objDelMethod.InParameters.SpawnInstance_();
objDelInParam.hDefKey = uHive;
objDelInParam.sSubKeyName = strRegPath;
var objDelOutParam = objReg.ExecMethod_(objDelMethod.Name, objDelInParam);
iRet = (objDelOutParam.ReturnValue == 0) ? ++iRet : -1;
}
return iRet;
}
catch(e) {return -1;}
}
Aufrufen dann wie folgt:
var sCompName = ".";
var iRet;
iRet = regDelKey(sCompName, HKCU, "Software\\7-Zip");
Grüße
rubberman
Hallo menace,
so kompliziert ist das eigentlich nicht, wäre für dich jetzt lediglich Copy/Paste gewesen. Aber natürlich kannst du auch mit der Run Methode arbeiten (wobei man so etwas normalerweise vermeidet).
Ein paar Dinge zum Verständnis:
- zu
- Strings (Zeichenfolgen) gehören in Apostrophen oder Anführungszeichen eingefasst
- Backslashes müssen verdoppelt werden, da jeweils das erste eine Escapesequenz einleitet
Ungetestet:
BTW: Dir ist klar dass du das JScript als Administrator ausführen musst, da Regedit diese Rechte verlangt?
Grüße
rubberman
so kompliziert ist das eigentlich nicht, wäre für dich jetzt lediglich Copy/Paste gewesen. Aber natürlich kannst du auch mit der Run Methode arbeiten (wobei man so etwas normalerweise vermeidet).
Ein paar Dinge zum Verständnis:
- zu
try
gehört eigentlich auch ein catch()
, sonst bringt das keinen Vorteil- Strings (Zeichenfolgen) gehören in Apostrophen oder Anführungszeichen eingefasst
- Backslashes müssen verdoppelt werden, da jeweils das erste eine Escapesequenz einleitet
Ungetestet:
function RestoreDefaultSettings()
{
try
{
var WshShell = new ActiveXObject("WScript.Shell");
var r = WshShell.Run("regedit.exe /s c:\\scripts\\restore.reg", 0, true);
if (r)
{
WScript.Echo("Regedit meldet Fehlernummer " + r + ".");
return true;
}
return false;
}
catch(e)
{
WScript.Echo(e.message);
return true;
}
}
BTW: Dir ist klar dass du das JScript als Administrator ausführen musst, da Regedit diese Rechte verlangt?
Grüße
rubberman
Hallo menace,
du willst im HKEY_CURRENT_USER arbeiten, auf die der Benutzer im allgemeinen auch Schreibrechte hat. Ergo:
- Entweder: Vergiss regedit.exe und arbeite mit JScript, so wie ich es vorgeschlagen habe.
- Oder: Setze eine spezielle Umgebungsvariable im JScript Prozess, bevor du regedit aufrufst, um mit Benutzerrechten(!) zu arbeiten.
Ich verstehe aber immernoch nicht warum es unbedingt regedit sein muss. Dan brauchst du kein JScript und kannst das auch mit Batch (sogar noch sinnvoller) abarbeiten.
Grüße
rubberman
du willst im HKEY_CURRENT_USER arbeiten, auf die der Benutzer im allgemeinen auch Schreibrechte hat. Ergo:
- Entweder: Vergiss regedit.exe und arbeite mit JScript, so wie ich es vorgeschlagen habe.
- Oder: Setze eine spezielle Umgebungsvariable im JScript Prozess, bevor du regedit aufrufst, um mit Benutzerrechten(!) zu arbeiten.
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Environment("PROCESS")("__COMPAT_LAYER") = "RunAsInvoker";
WshShell.Run("regedit.exe");
Grüße
rubberman
Schön und gut, dann sollte ja zumindest mein zweiter Vorschlag funktionieren, sofern deine Kiosk Software nicht in einer Art Sandbox läuft, die Änderungen auf dem lokalen Rechner nicht zulässt (so wie das bei Webbrowsern die Regel ist). Eigentlich war ich davon ausgegangen, dass es sich um ein Stand-Alone JScript unter Windows handelt ...
Grüße
rubberman
Grüße
rubberman