satosan
Goto Top

7zip - Vergebenes Passwort wird nicht uebergeben

Moin,

ich mache mit folgendem Script privat Backups von verschiedenen Folders.

# Define folders
$7zipPath = "$env:ProgramFiles\7-Zip\7z.exe"  
$SourceFolder = "C:\Group Drives\ABC\XYZ\"  
$DestFolder = "C:\Staging\A\"  
$FileName = "A_Backup_" + (Get-Date –format "yyyyMMdd_HHmmss") + ".7z"  
$Archive = $Destfolder+$FileName
$FinalDestFolder = "Y:\Backups\A\"  
$FileEnding = "*.7z"  

Set-Alias 7z $7zipPath

# Build archive for today
7z a -t7z -mmt=8 -mx=9 -mfb=64 -md=32m -ms=on $Archive $SourceFolder

# Move archived file to backup destination
Move-Item -Path $Archive -Destination $FinalDestFolder 

# Delete old files 
$n  =5
$items = Get-ChildItem "Y:\Backups\A\*.7z"  
$items | 
  Sort-Object Name -Descending | 
  Select-Object -Last ($items.count - $n) | 
  Foreach-Object { Remove-Item $_ }

Das funktioniert auch wunderbar. Jetzt moechte ich diese erstellten Dateinen jedoch jeweils mit einem Passwort versehen. Dazu gebe ich ich PowerShell folgenden Befehl ein.
Read-Host "AbCdEfG1357924680" -AsSecureString | ConvertFrom-SecureString | Out-File "C:\Backup\passkey.txt  
oder
 ConvertTo-SecureString "AbCdEfG1357924680" -AsPlainText -Force | ConvertFrom-SecureString | Set-Content "C:\Backup\passkey.txt"  
Wenn ich dann aber das Script so veraendere dass das Passwort aus dem File C:\Backup\passkey.txt gelesen wird
$pass = Get-Content "C:\Backup\passkey.txt" | ConvertTo-SecureString  
und dann das Passwort in dem Process der Archivierung uebernommen wird
7z a -t7z -p$pass -mmt=8 -mx=9 -mfb=64 -md=32m -ms=on $Archive $SourceFolder
dann erstellt er mir das Archiv. Wenn ich dann aber das Archiv zum Test manuell mit 7zip entpacke und nach dem Passwort gefragt werde, dann ist das Passwort immer falsch.

Wo liegt bei mir der Fehler ?

Content-ID: 648139

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

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

147323
Lösung 147323 04.02.2021 aktualisiert um 16:39:12 Uhr
Goto Top
Wo liegt bei mir der Fehler ?
Dein Fehler ist das du das du ein Object vom Typ SecureString an 7Zip übergibst und kein Plaintext Passwort das du ja auf der Kommandozeile benötugst, du musst den SecureString also erst zu Plaintext wandeln und dann übergeben
https://stackoverflow.com/questions/28352141/convert-a-secure-string-to- ...
$SecurePassword = gc 'd:\datei.txt' | ConvertTo-SecureString  
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
$UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
$UnsecurePassword
Sei dir auch bewusst das du den Inhalt der Textdatei (also das geschützte Passwort) nur mit dem Account entschlüsseln kannst mit dem du den SecureString auch erstellt hast weil ein SecureString immer Abhängig vom Userprofile ist bzw. mit einem Salt verschlüsselt wird welcher für jeden Account unterschiedlich ist.
Beispielszenario:
Wenn man also versuchen würde das obige Skript mit dem System-Account in der Aufgabenplanung laufen zu lassen obwohl man den SecureString mit dem eigenen Account erstellt hat würde das kläglich scheitern wenn man keinen festen Salt benutzt.

Gruß j.
satosan
satosan 05.02.2021 aktualisiert um 00:17:39 Uhr
Goto Top
Hallo J.,

vielen Dank vorab fuer den Hinweis. Hast Du natuerlich total Recht.

Im Zuge dessen habe ich aber auch noch einen anderen Fehler gefunden. Die Option zum Passwort setzen im Befehl
7z .... -p$pass ....
war falsch gesetzt. Dadurch wird immer das Password als $pass gesetzt. Richtig muss es lauten
7z .... -p"$pass" ....  

Werde jetzt weiter dran arbeiten die jeweiligen Passwort-Files von irgendwo online zu laden wenn das Script started und dann wieder zu loeschen wenn das Script 'durch' ist.

Vielen Dank nochmal.

Sato