abuelito73
Goto Top

PGP Verschlüsselung mit PowerShell

Hallo @ll,

ich hoffe sehr ihr könnt mir kurzfristig helfen.

Folgendes Problem:

Ich habe diverse CSV-Dateien die ich bisher in PowerShell manuell mit PGP verschlüssle. Jetzt würde ich gerne ein autom. Skript erstellen, damit die Dateien nach und nach verschlüsselt werden. Dabei sollte auch das Datum der Datei autom. angepasst werden.

Aktuell habe ich folgende Schritte, die ich immer manuell durchführe:

1. Ich schaue im Ordner C:\PGP\Archiv\ nach, ob sich irgendwelche alten *.csv Dateien befinden. Wenn ja, lösche ich diese.
2. Anschließend schaue ich im Ordner C:\PGP\ nach, ob sich aktuelle CSV-Dateien befinden *_20240402.csv (immer aktuelles Datum). Wenn ja, verschiebe ich diese in den Ordner C:\PGP\Archiv\
3. Ändere ich im String (für PowerShell) immer das Datum auf den aktuellen Tag (Montag bis Freitag)
4. Samstag und Sonntag erfolgt keine Verarbeitung
5. Öffne ich PowerShell
6. Kopiere ich den ersten String in PowerShell und führe den aus, anschließend kopiere ich den nächsten String usw.
7. Anschließend verschiebe ich manuell alle *.csv.pgp Dateien vom Ordner C:\PGP\Archiv\ in den übergeordneten Ordner C:\PGP\
8. Schließe ich PowerShell wieder

Aktueller String, den ich manuell in PowerShell nacheinander einfüge:

.\GnuPG\bin\gpg.exe -e -r ABCDEFGH -o C:\PGP\Archiv\Test01_20240402.csv.pgp C:\PGP\Archiv\Test01_20240402.csv
.\GnuPG\bin\gpg.exe -e -r ABCDEFGH -o C:\PGP\Archiv\Test02_20240402.csv.pgp C:\PGP\Archiv\Test02_20240402.csv
.\GnuPG\bin\gpg.exe -e -r ABCDEFGH -o C:\PGP\Archiv\Test03_20240402.csv.pgp C:\PGP\Archiv\Test03_20240402.csv
.\GnuPG\bin\gpg.exe -e -r ABCDEFGH -o C:\PGP\Archiv\Test04_20240402.csv.pgp C:\PGP\Archiv\Test04_20240402.csv

Code den ich verwende, um es zu automatisieren, aber nicht funktioniert:

$folder = 'C:\PGP'  
$archiv = 'C:\PGP\ARCHIV'  
remove-item -Path "$archiv\*.csv" -Force -EA SilentlyContinue  
move-item -Path "$folder\*_$(get-date -f yyyyMMdd).csv" -Destination $archiv -EA SilentlyContinue -Force  
foreach ($file in Get-ChildItem -Path $archiv -File -Filter *.csv){
start-process ".\GnuPG\bin\gpg.exe" -ArgumentList "-e -r ABCDEFGH -o `"$($folder)\$($file.Name).pgp`" `"$($file.Fullname)`"" -nonewwindow -wait  
}


Habe den o.a. Code mit 10 CSV-Dateien getestet und sobald ich das Skript mit PowerShell ausführe passiert folgendes:

1. Alle CSV-Dateien werden aus dem Ordner C:\PGP\ARCHIV gelöscht … passt/richtig so
2. Alle aktuellen CSV-Dateien aus dem Ordner C:\PGP werden in den Ordner C:\PGP\ARCHIV verschoben … passt/richtig so
3. Die erste CSV-Datei aus dem Ordner C:\PGP\ARCHIV wird mit PGP verschlüsselt und als *.csv.pgp in dem Ordner C:\PGP abgelegt ... passt/richtig so
4. Der Cursor bleibt in PowerShell stehen und blinkt nur ... heißt, die zweite CSV-Datei wird nicht mehr verschlüsselt und es geht nicht weiter

Kann es sein, dass sich das Skript hier verschluckt, weil er wieder versucht, die erste CSV-Datei zu verschlüsseln und merkt aber, dass diese bereits als verschlüsselte Datei Test01_20240402.csv.pgp existiert und macht nicht mehr weiter?

Leider komme ich selbst nicht weiter. Habe es versucht und scheitere immer wieder.

Ich hoffe sehr, ihr könnt mir helfen.

Vielen lieben Dank

Content-Key: 4337778743

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

Printed on: May 4, 2024 at 01:05 o'clock

Member: Blackmann
Blackmann Apr 02, 2024 updated at 11:14:26 (UTC)
Goto Top
Moin,

kannst Du bitte 'code' verwenden, siehe hier

$folder = 'C:\PGP'  
$archiv = 'C:\PGP\ARCHIV'  
remove-item -Path "$archiv\*.csv" -Force -EA SilentlyContinue  
move-item -Path "$folder\*_$(get-date -f yyyyMMdd).csv" -Destination $archiv -EA SilentlyContinue -Force  
foreach ($file in Get-ChildItem -Path $archiv -File -Filter *.csv){
start-process ".\GnuPG\bin\gpg.exe" -ArgumentList "-e -r ABCDEFGH -o `"$($folder)\$($file.Name).pgp`" `"$($file.Fullname)`"" -nonewwindow -wait  
}

und Deinen Beitrag in der Art bearbeiten -

Danke
BM
Member: Abuelito73
Abuelito73 Apr 02, 2024 at 09:42:42 (UTC)
Goto Top
Hallo Blackman,

vielen Dank für Deine schnelle Antwort/Hilfe.

Leider verstehe ich nicht so ganz, was ich genau machen soll, bin hier neu.

Du schreibst:

kannst Du bitte 'code' verwenden, siehe hier

Hast Du an dem Code etwas verändert, denn der sieht genauso aus.

Du schreibst:

und Deinen Beitrag der Art bearbeiten -

Was meinst Du damit? Ich stehe auf dem Schlauch, sorry.

Vielen Dank.
Member: Penny.Cilin
Penny.Cilin Apr 02, 2024 at 10:14:29 (UTC)
Goto Top
@blackman meint, Du sollst Codetags verwenden. Siehe die Symbole über dem Editorfenster.
Und die FAQs lesen hilft.

Gruss Penny.
Member: Abuelito73
Abuelito73 Apr 02, 2024 at 10:16:06 (UTC)
Goto Top
... vielen Dank, ich stand total auf dem Schlauch.
Member: TK1987
TK1987 Apr 02, 2024 at 10:46:32 (UTC)
Goto Top
Moin,

Zitat von @Abuelito73:
start-process ".\GnuPG\bin\gpg.exe" -ArgumentList "-e -r ABCDEFGH -o `"$($folder)\$($file.Name).pgp`" `"$($file.Fullname)`"" -nonewwindow -wait  
}
warum nutzt du hier start-process, anstatt den Befehl einfach so auszuführen?

Kann es sein, dass sich das Skript hier verschluckt, weil er wieder versucht, die erste CSV-Datei zu verschlüsseln und merkt aber, dass diese bereits als verschlüsselte Datei Test01_20240402.csv.pgp existiert und macht nicht mehr weiter?
Genau das. Gpg arbeitet standardmäßig interaktiv. Wenn die Datei existiert wird somit gefragt, ob sie überschrieben werden soll. Deswegen sollte man immer den "--batch" Parameter verwenden, wenn man gpg per Skript verwendet. So hätte es dann "nur" eine Fehlermeldung gegeben, dass die Datei bereits existiert. Man könnte auch noch mit "--yes" das überschreiben erzwingen.

Gruß Thomas
Member: Blackmann
Blackmann Apr 02, 2024 updated at 10:52:38 (UTC)
Goto Top
Mahlzeit,

die Nachfrage von @Abuelito73 kann ich nachvollziehen.
Vielleicht sollte man den Infotext doch ein wenig treffender wählern ... 'code' sagt aus dem Stehgreif dem neuen, nicht programmiererfahrenden Nutzer nicht sonderlich viel:
code
BG BM

Edit: Und er ist ja nicht der Erste ...
Member: TK1987
TK1987 Apr 02, 2024 updated at 11:31:33 (UTC)
Goto Top
Zitat von @Blackmann:
Vielleicht sollte man den Infotext doch ein wenig treffender wählern ... 'code' sagt aus dem Stehgreif dem neuen, nicht programmiererfahrenden Nutzer nicht sonderlich viel
Ehrlich gesagt hast du es ihm allerdings auch nicht gerade einfach gemacht. Du postest seinen Teil ohne Zitierfunktion und sagst Bitte verwende Code.
So enstand der Eindruck, der von dir gepostete Code wäre bereits ein Lösungsvorschlag.

Imhö wäre es sinniger gewesen, seine falsch formatierten Zeilen zu zitieren und zu schreiben: Bitte verwende den "</>"-Knopf, um die Zeilen als Code zu formatieren.
So wäre es ziemlich unmissverständlich gewesen. Auch ein Verweis auf die faq Formatting instructions in the posts hätte nicht geschadet.

Gruß Thomas
Member: Abuelito73
Abuelito73 Apr 02, 2024 at 11:47:33 (UTC)
Goto Top
Hallo Thomas,

vielen Dank für die schnelle Rückmeldung und Hilfe.

Leider stammt der Code nicht von mir, sondern von einem User hier, den ich leider nicht mehr erreiche.

Ich muss das Skript in Zukunft autom. über einen Task-Schedule laufen lassen.

Würde es helfen, wenn die CSV-Datei, nachdem sie verschlüsselt wurde verschoben wird, damit das Skript mit der nächsten CSV-Datei machen kann? Würde dann praktisch so aussehen:

1. Alle CSV-Dateien werden aus dem Ordner C:\PGP\ARCHIV gelöscht
2. Alle aktuellen CSV-Dateien aus dem Ordner C:\PGP werden in den Ordner C:\PGP\ARCHIV verschoben
3. Die erste CSV-Datei TEST01_20240402.csv aus dem Ordner C:\PGP\ARCHIV wird mit PGP verschlüsselt und als *.csv.pgp in dem Ordner C:\PGP abgelegt
4. Anschließend wird die TEST01_20240402.csv in den Ordner C:\PGP\Archiv_CSV verschoben
5. Die zweite CSV-Datei TEST02_20240402.csv aus dem Ordner C:\PGP\ARCHIV wird mit PGP verschlüsselt und als *.csv.pgp in dem Ordner C:\PGP abgelegt
4. Anschließend wird die TEST02_20240402.csv in den Ordner C:\PGP\Archiv_CSV verschoben
5. Die dritte CSV-Datei TEST03_20240402.csv usw.

.. bis alle CSV-Dateien verschlüsselt wurden und der Ordner C:\PGP\Archiv leer ist. Dann schließt sich PowerShell wieder.

Vielen Dank und Grüße
Member: TK1987
TK1987 Apr 02, 2024 updated at 13:09:56 (UTC)
Goto Top
Zitat von @Abuelito73:
Würde es helfen, wenn die CSV-Datei, nachdem sie verschlüsselt wurde verschoben wird, damit das Skript mit der nächsten CSV-Datei machen kann? Würde dann praktisch so aussehen:
Nein. Helfen würde es, wenn du den "--batch"-Parameter ergänzt, dann würde er auch mit der nächsten Datei weiter machen. Die eigentliche Frage ist, wieso es Dateien mit gleicher Bezeichnung gibt - und, ob die bestehende Datei überschrieben werden kann oder nicht.

Ich muss das Skript in Zukunft autom. über einen Task-Schedule laufen lassen.
In dem Fall solltest du den relativen Pfad zur gpg.exe durch einen absoluten Pfad ersetzen.

1. Alle CSV-Dateien werden aus dem Ordner C:\PGP\ARCHIV gelöscht
Dir ist aber klar, dass dann Dateien verloren gehen können, falls das Skript aus iregendeinem Grund abbricht? Ich würde die Datei direkt nach dem verschlüsseln löschen - jedoch nur, wenn die Aktion erfolgreich war...
# Pfad zur gpg.exe
$gpg    = "C:\Program Files (x86)\GnuPG\bin\gpg.exe"  
$folder = 'C:\PGP'   
$archiv = 'C:\PGP\ARCHIV'  

move-item -Path "$folder\*_$(get-date -f yyyyMMdd).csv" -Destination $archiv -EA SilentlyContinue -Force    

foreach ($file in Get-ChildItem -Path $archiv -File -Filter *.csv){
  &$gpg --batch --yes -e -r ABCDEFGH -o "$folder\$($file.Name).pgp" $file.Fullname  
  # Datei löschen, falls erfolgreich verschlüsselt
  if ($?) {Remove-Item -Path $file}
}
Member: Abuelito73
Abuelito73 Apr 02, 2024 at 13:55:01 (UTC)
Goto Top
Hallo Thomas,
vielen Dank.

Die eigentliche Frage ist, wieso es Dateien mit gleicher Bezeichnung gibt - und, ob die bestehende Datei überschrieben werden kann oder nicht.

Leider muss die PGP-Datei genauso heißen, wie die ursprüngliche CSV-Datei und darf nicht überschrieben bzw. gelöscht werden. Heißt in diesem Fall:

CSV-Datei 1 = Test01_20240402.csv wird nach der PGP-Verschlüsselung zu
PGP-Datei 1 = Test01_20240402.csv.pgp

CSV-Datei 2 = Test02_20240402.csv wird nach der PGP-Verschlüsselung zu
PGP-Datei 2 = Test02_20240402.csv.pgp

usw.

Dir ist aber klar, dass dann Dateien verloren gehen können, falls das Skript aus iregendeinem Grund abbricht?

Die CSV-Dateien dürfen erst am nächsten Tag aus dem Ordner C:\PGP\ARCHIV gelöscht werden. Weil dann die neuen CSV-Dateien (mit aktuellem Datum) von C:\PGP nach C:\PGP\ARCHIV verschoben werden müssen. Anschließend erfolgt die PGP-Verschlüsselung. Weiter unten beschreibe ich, wie ich zur Zeit manuell vorgehe:

Aktuell habe ich folgende Schritte, die ich immer manuell durchführe:

1. Ich schaue im Ordner C:\PGP\Archiv\ nach, ob sich irgendwelche alten *.csv Dateien befinden. Wenn ja, lösche ich diese.
2. Anschließend schaue ich im Ordner C:\PGP\ nach, ob sich aktuelle CSV-Dateien befinden *_20240402.csv (immer aktuelles Datum). Wenn ja, verschiebe ich diese in den Ordner C:\PGP\Archiv\
3. Ich ändere im String (für PowerShell) immer das Datum auf den aktuellen Tag (Montag bis Freitag)
4. Samstag und Sonntag erfolgt keine Verarbeitung
5. Öffne ich PowerShell
6. Ich kopiere den ersten String in PowerShell und führe den aus, anschließend kopiere ich den nächsten String usw.
7. Anschließend verschiebe ich manuell alle *.csv.pgp Dateien vom Ordner C:\PGP\Archiv\ in den übergeordneten Ordner C:\PGP\
8. Schließe ich PowerShell wieder

Aktueller String, den ich zur Zeit manuell in PowerShell nacheinander einfüge:

.\GnuPG\bin\gpg.exe -e -r ABCDEFGH -o C:\PGP\Archiv\Test01_20240402.csv.pgp C:\PGP\Archiv\Test01_20240402.csv
.\GnuPG\bin\gpg.exe -e -r ABCDEFGH -o C:\PGP\Archiv\Test02_20240402.csv.pgp C:\PGP\Archiv\Test02_20240402.csv
.\GnuPG\bin\gpg.exe -e -r ABCDEFGH -o C:\PGP\Archiv\Test03_20240402.csv.pgp C:\PGP\Archiv\Test03_20240402.csv
.\GnuPG\bin\gpg.exe -e -r ABCDEFGH -o C:\PGP\Archiv\Test04_20240402.csv.pgp C:\PGP\Archiv\Test04_20240402.csv