nintox
Goto Top

Powershell Wert der Property entfernen manipulieren

Hallo zusammen,

ich möchte einen bestimmten Key in der Registry ändern. Genauer gesagt, dass bei allen Volumes der Papierkorb direkt geleert wird.
Dafür hab ich ein Powershell-Script angefangen zu schreiben.
Die Volumes lass ich mir über die Get-Volumes Funktion ausgeben und via Where-Object selektiere ich die Volumes nach Labels.
Nun hab ich die gewünschten Werte, also besser gesagt die UniqueID der Volumes. Leider ist da aber noch eine Pfadangabe mit im Wert, die es unmöglich macht, den Wert als Variable zu definieren und in ein Registry-Key-Befehl einzubauen.

Wie kann ich nun den Wert einer Property manipulieren bzw. auf den gewünschten Bereich kürzen?

Bsp: ?\\ssfdf {6545fd6sd4fsdfggsdfg} hier möchte ich nur {6545fd6sd4fsdfggsdfg} weiter nutzen.

Geht das überhaupt?

Content-ID: 333879

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

Ausgedruckt am: 23.11.2024 um 00:11 Uhr

H41mSh1C0R
H41mSh1C0R 01.04.2017 um 23:36:25 Uhr
Goto Top
Servus,

Wenn es nur um das leeren der Papierkörbe geht geht das doch einfacher:

https://www.windowspro.de/script/clear-recyclebin-papierkorb-leeren-powe ...

VG
132692
Lösung 132692 02.04.2017 aktualisiert um 10:51:29 Uhr
Goto Top
Das ist doch schnell per GPO (oder einem einzigen Reg-Eintrag) erledigt!
http://m.windowsitpro.com/windows/q-how-can-i-disable-recycle-bin

Wenn das per PS gesetzt werden soll, warum auch immer:
# Für den aktuellen User des Rechners
New-Item "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" -EA SilentlyContinue  
New-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" -Name NoRecycleFiles -Value 1 -PropertyType DWORD -Force  

# "ODER" alternativ direkt für alle User des Rechners 
New-Item "HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" -EA SilentlyContinue  
New-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" -Name NoRecycleFiles -Value 1 -PropertyType DWORD -Force  
Gruß p.
Nintox
Nintox 02.04.2017 um 17:19:59 Uhr
Goto Top
Danke schon mal dafür. Funktioniert auch super!

Wenn man aber nur bestimmte Platten mit der Regel bestimmen will, wirds so etwas schwer.
Gibts da nicht ne andere Alternative. Was in Richtung wie ich oben beschrieben hab.

Hier mal ein Auszug der Registry. Wenn ich hier bei einer bestimmte Platte den NukeOnDelete Wert auf 1 setze, bin ich manuell am Ziel.
Das müsste jetzt nur noch in Powershell machbar sein.
Wie gesagt, die Platten kann ich über die Labels selektieren.
2017-04-02 17_16_10-registrierungs-editor
132692
Lösung 132692 02.04.2017 aktualisiert um 17:41:50 Uhr
Goto Top
Nichts leichter als das ...
$ids = gwmi win32_Volume | ?{$_.DriveLetter -in 'c:','d:'} | %{$_.DeviceId -replace '.*(\{.*\}).*','$1'}  
gci 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\Volume' | ?{$_.PSChildName -in $ids} | %{New-ItemProperty $_.PSPath -Name NukeOndelete -PropertyType DWORD -Value 1 -Force}  
Nintox
Nintox 02.04.2017 um 18:19:37 Uhr
Goto Top
Sehr sehr cool.
Jetzt hab ich natürlich nicht viel dabei gelernt, wenn ich nur das Script da in die Konsole kloppe.
Wäre echt mega, wenn es dazu noch ne kleine Erklärung gibt.
Wie ich sehe beherrschst du dein Handwerk bzw Powershell ^^
H41mSh1C0R
H41mSh1C0R 02.04.2017 um 18:27:31 Uhr
Goto Top
Wo klemmts denn mit dem Verständnis?
132692
132692 02.04.2017 aktualisiert um 18:30:14 Uhr
Goto Top
Zitat von @Nintox:
Wäre echt mega, wenn es dazu noch ne kleine Erklärung gibt.
Machen wir doch glatt:
$ids = gwmi win32_Volume | ?{$_.DriveLetter -in 'c:','d:'} | %{$_.DeviceId -replace '.*(\{.*\}).*','$1'}
Filtert mit where-object (?{} ist die Abkürzung dafür, ja Powersheller sind Schreibfaul face-smile) die Drives die gewünscht sind und mit einer For-Each -Schleife (%{} Abkürzung) wird mit Regular Expression-Replace die ID extrahiert. In der Variablen $ids befindet sich also hinterher ein Array der GUIDs der Drives.
gci 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\Volume' | ?{$_.PSChildName -in $ids} | %{New-ItemProperty $_.PSPath -Name NukeOndelete -PropertyType DWORD -Value 1 -Force}
Mit Get-Childitem holen wir uns den Registry-Key und vergleichen wieder mit einem where-object (?{} du erinnerst dich face-wink) ob der Name eines Subkeys in der Liste der $ids vorkommt (-in Operator), wenn ja legen wir wieder mit der For-Each-Schleife in den passenden Keys einen neuen DWORD Wert an, feddich.
Nintox
Nintox 02.04.2017 um 18:43:24 Uhr
Goto Top
Hätte nicht besser erklärt werden können. Danke dir vielmals dafür.

Eine Sache ging mir aber noch bisschen zu schnell.

-replace '.*(\{.*\}).*','$1'

Der Abschnitt ist mir noch nicht ganz klar. Was bedeutet '.*(\{.*\}).*','$1
132692
Lösung 132692 02.04.2017 aktualisiert um 19:08:31 Uhr
Goto Top
Zitat von @Nintox:
Der Abschnitt ist mir noch nicht ganz klar. Was bedeutet '.*(\{.*\}).*','$1
Der erste Parameter definiert den Regular Expression-Pattern der folgendes Bedeutet:
.*(\{.*\}).*
------------
Match any single character «.*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Match the regex below and capture its match into backreference number 1 «(\{.*\})»
   Match the character “{” literally «\{»
   Match any single character «.*»
      Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
   Match the character “}” literally «\}»
Match any single character «.*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»

$1

Insert the text that was last matched by capturing group number 1 «$1»
Und der zweite definiert was ersetzt wird, das $1 ist die Backreference 1 welche mit den Klammern im Pattern definiert wird.

Regular Expressions ist ein eigenes riesiges Thema, da solltest du dich erst mal einlesen:
Regular Expressions Tutorial


Wenn das zu schwer für dich ist, es geht auch klassisch einfacher in der For-Each Schleife und einem Split:
%{"{$($_.DeviceId.split('{}')[1])}"}