REG_MULTI_SZ ändern

zylex
Beiträge: 54
Registriert: 23 Jan 2013, 08:55

REG_MULTI_SZ ändern

Beitragvon zylex » 07 Jun 2019, 15:26

Moin moin,

ich würde gerne eine REG_MULTI_SZ Registry-Variable auslesen, bearbeiten (Zeilen entfernen) und wieder zurückschreiben.

Da mir auf Anhieb nichts einfacheres eingefallen ist, hab ich es wohl etwas umständlich gemacht. Ich schreibe die Werte mit "SaveValueToFile" in eine Textdatei, loope durch und prüfe ob ein bestimmter Pfad enthalten ist, und erzeuge aus den restlichen Zeilen ein zweites File. Dieses kann ich dann mit "GetMultiSZFromFile" zurück in die Registry schreiben (noch nicht im Script, sollte aber kein Problem sein).

Sieht dann in etwa so aus:

Code: Alles auswählen

DefVar $output$
DefVar $input$
DefVar $searchString$
DefVar $inputList$
DefStringList $strlist1$
DefStringList $strlist2$
Set $output$ = "%SCRIPTPATH%\output.txt"
Set $input$ = "%SCRIPTPATH%\input.txt"
Set $searchString$ = "VALUE"

Registry_PathPatch
Set $strlist1$ = loadTextFile($output$)
for $app1$ in $strlist1$ do Sub_searchString
Set $strlist2$ = splitString($inputList$,"::")
for $app2$ in $strlist2$ do PatchTextFile_input $input$

[Registry_PathPatch]
openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
SaveValueToFile "PendingFileRenameOperations" "$output$"

[Sub_searchString]
if not ("$app1$" = "")
if contains("$app1$",$searchString$)
else
set $inputList$ = $inputList$ + "$app1$" + "::"
endif
endif

[PatchTextFile_input]
AddLine "$app2$"
AddLine ""
SaveToFile "$input$"


Wie man sieht ist das recht umständlich aber funktioniert. Hat jemand eine etwas elegantere Lösung? Man will ja schließlich hinzulernen :-)

Grüße!

Benutzeravatar
SisterOfMercy
Beiträge: 969
Registriert: 22 Jun 2012, 19:18

Re: REG_MULTI_SZ ändern

Beitragvon SisterOfMercy » 07 Jun 2019, 16:35

What value are you exactly trying to change?

I'm not sure if getRegistryValue would work. If that does work it is quite easy with some string replacement.
Bitte schreiben Sie Deutsch, when I'm responding in the German-speaking part of the forum!

zylex
Beiträge: 54
Registriert: 23 Jan 2013, 08:55

Re: REG_MULTI_SZ ändern

Beitragvon zylex » 11 Jun 2019, 08:15

Da geht es um Einträge die bei einem Suchtreffer (also der $searchString$ aus meinem Script) gelöscht werden sollen. Mir reicht es nach einem Teil eines Pfads zu suchen und diese Zeile komplett zu löschen. Dieser Pfad kommt aber öfter vor.

Die Werte des Multi-SZ Eintrags sind mit Leerzeilen getrennt, in etwa also so:
__________________________
"C:\Program Files\7-Zip\Lang\de.txt"

"C:\Program Files\7-Zip\Lang\en.txt"

"C:\Program Files\7-Zip\Lang\at.txt"

"C:\Program Files\Microsoft Office\Office16"

C:\Program Files\Microsoft Office\Office17"
___________________________

In diesem Beispiel würde es reichen nach "7-Zip" zu suchen und die Zeilen mit einem Treffer (und die Leerzeile danach) zu löschen. Die anderen Zeilen dürfen nicht verändert werden.

Benutzeravatar
ThomasT
uib-Team
Beiträge: 125
Registriert: 26 Jun 2013, 12:26

Re: REG_MULTI_SZ ändern

Beitragvon ThomasT » 12 Jun 2019, 08:19

Vielleicht kannst du die ganze Stringmanipulation auch innerhalb einer Variable halten?
Ich würde es vielleicht mal mit so etwas ausprobieren:
https://download.uib.de/opsi4.1/documentation/html/opsi-winst-manual/opsi-winst-manual.html#opsi-winst-string-functions-reg
Kein Support per DM!
_________________________
opsi support - https://www.uib.de/
For productive opsi installations we recommend support contracts.

Benutzeravatar
SisterOfMercy
Beiträge: 969
Registriert: 22 Jun 2012, 19:18

Re: REG_MULTI_SZ ändern

Beitragvon SisterOfMercy » 12 Jun 2019, 09:53

zylex hat geschrieben:Da geht es um Einträge die bei einem Suchtreffer (also der $searchString$ aus meinem Script) gelöscht werden sollen. Mir reicht es nach einem Teil eines Pfads zu suchen und diese Zeile komplett zu löschen. Dieser Pfad kommt aber öfter vor.


Uh, sorry, I meant the exact location in the registry.
I just don't often come across reg_multi_sz values, more the reg_expand_sz version.
Bitte schreiben Sie Deutsch, when I'm responding in the German-speaking part of the forum!

zylex
Beiträge: 54
Registriert: 23 Jan 2013, 08:55

Re: REG_MULTI_SZ ändern

Beitragvon zylex » 12 Jun 2019, 13:32

ThomasT hat geschrieben:Vielleicht kannst du die ganze Stringmanipulation auch innerhalb einer Variable halten?
Ich würde es vielleicht mal mit so etwas ausprobieren:
https://download.uib.de/opsi4.1/documentation/html/opsi-winst-manual/opsi-winst-manual.html#opsi-winst-string-functions-reg


Jo das hatte ich gelesen, bin aber nicht wirklich weiter gekommen. Der Reg-Key enthält ja eine Liste von Werten in denen ich suchen möchte und nicht nur einen Wert. Das müsste ja irgendwie über eine String-Liste laufen. Und in dieser müsste ich wiederum nach einem bestimmten Wort suchen können.

SisterOfMercy hat geschrieben:Uh, sorry, I meant the exact location in the registry.
I just don't often come across reg_multi_sz values, more the reg_expand_sz version.


Achso, der Reg-Pfad wäre: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
Das ist eine Liste, welche z.B. gesperrte Dateien beim nächsten Reboot löscht.

Benutzeravatar
SisterOfMercy
Beiträge: 969
Registriert: 22 Jun 2012, 19:18

Re: REG_MULTI_SZ ändern

Beitragvon SisterOfMercy » 12 Jun 2019, 15:02

Code: Alles auswählen

DefVar $registry_key$
DefStringList $list1$

Set $registry_key$ = GetRegistryStringValueSysNative("[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager] PendingFileRenameOperations")
set $registry_key$ = stringReplace($registry_key$, "\r\n", "")
set $list1$ = splitStringOnWhiteSpace("$registry_key$")


We get the value from the registry, remove the \r\n entries, and make it a stringlist that has been split on the whitespaces.

I'm not sure if you have to make it a stringlist, but this might be easier to delete an entire entry.
Afterwards you make it a string again, but with | as deliminator. Then write the registry value.
Zuletzt geändert von SisterOfMercy am 13 Jun 2019, 22:04, insgesamt 1-mal geändert.
Bitte schreiben Sie Deutsch, when I'm responding in the German-speaking part of the forum!

zylex
Beiträge: 54
Registriert: 23 Jan 2013, 08:55

Re: REG_MULTI_SZ ändern

Beitragvon zylex » 12 Jun 2019, 17:26

Die Idee wäre gut, man könnte sogar das "stringReplace" komplett weglassen und mit
Set $list1$ = splitString($registry_key$,"\r\n")
direkt die Liste erzeugen. Das verhindert das unerwünschte Trennen an Leerzeichen im Pfad.

Leider scheint OPSI da ein Problem zu haben (in beiden Fällen). splitString oder stringReplace funktioniert nicht mit "\r\n". Andere Kombinationen funktionieren, zb "\??\". Warum "\r\n" zu keinem Ergebnis kommt ist seltsam, der String bleibt danach wie er war.

Benutzeravatar
SisterOfMercy
Beiträge: 969
Registriert: 22 Jun 2012, 19:18

Re: REG_MULTI_SZ ändern

Beitragvon SisterOfMercy » 13 Jun 2019, 22:07

zylex hat geschrieben:Die Idee wäre gut, man könnte sogar das "stringReplace" komplett weglassen und mit
Set $list1$ = splitString($registry_key$,"\r\n")
direkt die Liste erzeugen. Das verhindert das unerwünschte Trennen an Leerzeichen im Pfad.


Oh, I didn't know \r is the same as a space. I also made a small error in the stringReplace line. Anyway, I would try it without removing \r\n and ignore them. Then perhaps the end result will be what is wanted, or not :D

By the way, what is the reason you want to modify this value? Are you doing some sort of trick I don't know about?
Bitte schreiben Sie Deutsch, when I'm responding in the German-speaking part of the forum!

zylex
Beiträge: 54
Registriert: 23 Jan 2013, 08:55

Re: REG_MULTI_SZ ändern

Beitragvon zylex » 14 Jun 2019, 09:22

Das habe ich versucht, komischerweise funktioniert das nicht. WINST ignoriert "\r\n" komplett. Zumindest wenn das "\r\n" der Platzhalter für eine neue Zeile ist.

Der Inhalt des MULTI_SZ Eintrags sieht (manuell gesetzt) so aus:
Test-String
Test-String2
Test-String3

Das Script ist recht einfach:

Code: Alles auswählen

DefVar $registry_key$
DefStringList $list1$

Set $registry_key$ = GetRegistryStringValueSysNative("[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager] PendingFileRenameOperations")
Set $list1$ = splitString($registry_key$,"\r\n")


Das Ergebnis ist folgendes:

Code: Alles auswählen

[6] [Jun 14 08:55:20:433] Registry key [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]  opened
[6] [Jun 14 08:55:20:434] Key closed
[6] [Jun 14 08:55:20:436]   The value of the variable "$registry_key$" is now: "Test-String\r\nTest-String2\r\nTest-String3\r\n\r\n"
[6] [Jun 14 08:55:20:437] Set  $list1$ = splitString($registry_key$,"\r\n")
[7] [Jun 14 08:55:20:439]   The value of the variable "$list1$" is now:
[7] [Jun 14 08:55:20:441]   (string   0)Test-String\r\nTest-String2\r\nTest-String3


Wie man sieht wird nicht an "\r\n" getrennt, da "\r\n" in diesem Fall für einen Zeilenumbruch steht. Setzt man das "\r\n" aber als Text in den Teststring, klappt die Trennung genau an dieser Stelle:

Code: Alles auswählen

Test-String_\r\n_Test-String
Test-String2
Test-String3

Code: Alles auswählen

[6] [Jun 14 09:02:26:634]   The value of the variable "$registry_key$" is now: "Test-String_\r\n_Test-String\r\nTest-String2\r\nTest-String3\r\n\r\n"
[6] [Jun 14 09:02:26:636] Set  $list1$ = splitString($registry_key$,"\r\n")
[7] [Jun 14 09:02:26:637]   The value of the variable "$list1$" is now:
[7] [Jun 14 09:02:26:639]   (string   0)Test-String_
[7] [Jun 14 09:02:26:640]   (string   1)_Test-String\r\nTest-String2\r\nTest-String3


Entweder ist das so gewollt oder ein Fehler. Auf jeden Fall kurios. Der Wert ist immer "\r\n", aber WINST unterscheidet ob es ein Zeilenumbruch oder ein Text ist.

Zu deiner zweiten Frage: Nein es ist kein Trick, ich muss nur das Verhalten einer bestimmten Software korrigieren. Diese Software setzt dort Einträge um gewisse Dateien nach der Deinstallation zu löschen. Installiert man diese Software aber gleichzeitig neu, also ohne nach der Deinstallation einen (ansonsten unnötigen) Reboot zu machen, werden die Dateien beim nächsten Reboot trotzdem gelöscht und die Software funktioniert nicht mehr. Die Neuinstallation der Software löscht diese Einträge nicht automatisch, deshalb muss das mein Script machen. Da dort aber auch Einträge von anderen Anwendungen drin sein können, möchte ich nur die Einträge dieser speziellen Software löschen.