menace
Goto Top

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?

Content-Key: 216894

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

Ausgedruckt am: 19.03.2024 um 09:03 Uhr

Mitglied: rubberman
rubberman 14.09.2013 um 12:58:46 Uhr
Goto Top
Hallo menace,

bist du sicher, dass diese Keys existieren?
[-HKCU\TempHive\Software\Microsoft\Office\14.0\PowerPoint]
[-HKCU\Software\Software\7-Zip]

Aber zu deiner Frage. Neben RegDelete gibt es auch RegWrite. Beispiele sind jeweils dabei.

Grüße
rubberman
Mitglied: menace
menace 16.09.2013 um 08:38:13 Uhr
Goto Top
Du hast natürlich recht, die zwei Reg-Keys sind Käse. Habe beim copy - paste hier für`s Forum was verhauen.

Meine Frage wäre nun, funktioniert regdelete auch, wenn ich im Script einen Reg-Pfad angebe, der gelöscht werden soll, welcher aber gar nicht existiert?
Mitglied: rubberman
rubberman 16.09.2013 aktualisiert um 11:19:07 Uhr
Goto Top
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.

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");  
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
Mitglied: menace
menace 17.09.2013 um 09:31:48 Uhr
Goto Top
Hallo,

besten Dank für Deine Hilfe bisher!
Ehrlich gesagt sieht mir das Ganze aber etwas zu kompliziert aus, da ich hier aufgrund nicht voirhandener Programmierkentnisse so gut wie nichts nachvollziehen kann.

Falls möglich würde gerne in die Richtung arbeiten, dass ich ein Script baue, welches dann die reg.exe mit einer *.reg Datei als Parameter aufruft.
In der *.reg Datei stehen dann die Registry-Pfade, welche gelöscht bzw. angelegt werden sollen.


function RestoreDefaultSettings()
{
try
{
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("regedit.exe /s " + c:\scripts\restore.reg, 0, true);
}
}

könnte das so klappen?!
Mitglied: rubberman
rubberman 17.09.2013 aktualisiert um 14:08:50 Uhr
Goto Top
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 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
Mitglied: menace
menace 22.10.2013 um 13:30:03 Uhr
Goto Top
Hi, danke für Deinen Hinweis.
Wie stelle ich es denn dann nun am besten an, dass die regedit.exe mit Adminrechten gestartet wird, wenn ich das Script mit einem Benutzer aufrufe, der eingeltich keine Adminrechte hat?!
Mitglied: rubberman
rubberman 22.10.2013 aktualisiert um 20:21:03 Uhr
Goto Top
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.
var WshShell = new ActiveXObject("WScript.Shell");   

WshShell.Environment("PROCESS")("__COMPAT_LAYER") = "RunAsInvoker";  
WshShell.Run("regedit.exe");  
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
Mitglied: menace
menace 23.10.2013 um 11:58:17 Uhr
Goto Top
Hallo,

das Problem ist folgendes:

Ich habe hier PCs, auf dem eine spezielle Internet Kiosk Software unter einem beschränkten Benutzer läuft. Im Grunde handelt es sich um einen Web-Browser, der im Vollbild dargestellt wird, damit der Kunde am PC "nichts anstellen" kann.
Im Browser gibt es einen "Ausloggen" Button, den der Kunde drückt, wenn er mit der Nutzung des PCs fertig ist. Dieser Button löst dann verschiedenen Mechanismen aus, die z.B. temp. Internet-Dateien löschen etc. Zudem gibt es die Möglichkeit, dann eine spezielle, interne Webseite aufzurufen, mit der dann z.B. das gewünschte Java Script Löschscript ausgeführt werden soll.
Hintergrund ist der, dass über dieses Script z.B. auch "verstellte" Office Programme auf default zurück gesetzt werden sollen. Das kann der reguläre Ausloggen-Button des Browsers nämlich nicht. Folgende Reg-Settings sollen gesetzt bzw. gelöscht werden:


[-HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\Common\Toolbars]

[-HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\Excel]

[-HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\PowerPoint]

[-HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\Word]

[HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\Word\Options]
"ForceSetCopyCount"=dword:00000001

[HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\Word\File MRU]
"Max Display"=dword:00000000

[HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\Word\Place MRU]
"Max Display"=dword:00000000

[HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\Excel\File MRU]
"Max Display"=dword:00000000

[HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\Excel\Place MRU]
"Max Display"=dword:00000000

[HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\PowerPoint\File MRU]
"Max Display"=dword:00000000

[HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Office\14.0\PowerPoint\Place MRU]
"Max Display"=dword:00000000

[-HKEY_LOCAL_MACHINE\TempHive\Software\Software\7-Zip]

[HKEY_LOCAL_MACHINE\TempHive\Software\7-Zip\FM]
"PanelPath0"="D:\\Kunden"
"Toolbars"=dword:0000000b

[HKEY_LOCAL_MACHINE\TempHive\Software\7-Zip\Options]
"WorkDirPath"="D:\\Kunden"

[HKEY_LOCAL_MACHINE\TempHive\Software\7-Zip\Compression]
"Archiver"="zip"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run]
"SunJavaUpdateSched"=-

[-HKEY_LOCAL_MACHINE\TempHive\Software\EPSON\EPSON Scan]

[HKEY_LOCAL_MACHINE\TempHive\Software\Microsoft\Internet Explorer\Main]
"Default Download Directory"="D:\\kunden"
"NotifyDownloadComplete"="no"


Dieses Reg-File wird aktuell automatisch bei jedem Reboot des PCs ausgeführt. Daher auch "HKEY_LOCAL_MACHINE\TempHive", weil ich per Batch-Script die HKEY_LOCAL_MACHINE des beschränkten Benutzers lade (ntuser.dat) und dann die Werte ändern lasse.

Hier das Batch-Script, welches das reg Fiel ausführt:

@echo off
setlocal
set regcmd=%SystemRoot%\system32\reg.exe
set regeditcmd=%SystemRoot%\regedit.exe
set keypath=Software\Microsoft\Office\14.0
set regpath=C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown\Office_Restore.reg


set hive=HKLM\TempHive
set key=%hive%\%keypath%
%regcmd% load %hive% "C:\Users\Kiosk\NTUSER.DAT"
%regeditcmd% /s %regpath%
%regcmd% unload %hive%
endlocal


Das alles funktioniert soweit auch problemlos.
Ich hätte nun gerne dieses Rücksetzen der Registry bei jeder Betätigung des Ausloggen Buttons für den aktuell angemeldeten Benuzter.
Mitglied: rubberman
rubberman 23.10.2013 aktualisiert um 22:09:34 Uhr
Goto Top
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