saschard
Goto Top

Powershell: Verschüsseltes Passwort verwenden

Hallo zusammen,

das Passwort eines Domain-Benutzers, welcher Daten vom Dateisystem kopiert, soll verschlüsselt werden. Derzeit steht es in den Skripts immer als Klartext.
Das Passwort wurde wie folgt mit PowerShell verschlüsselt:
'mypassword' | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File $File  
Anschließend lese ich die Datei als Passwort ein, um mich an das Dateisystem anzumelden:
$User = 'mydomain\testuser'  
$UserPass = Get-Content $File | ConvertTo-SecureString
net use Z: $Z /user:$User $UserPass
Leider erhalte ich immer, dass das Netzwerkkennwort falsch ist.
Verwendet jemand in seinen Scripts verschlüsselte Passwörter inklusive Anmeldung per net use?

Danke und Gruß, Sascha

Content-ID: 291521

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

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

122990
Lösung 122990 22.12.2015 aktualisiert um 14:43:07 Uhr
Goto Top
Ja nee das geht so nicht, weil $userpass im Format Secure-String ist was du ja gerade mit ConvertTo-SecureString machst, also kein Plaintext sondern ein Object und netuse erwartet hier ja kein Object sondern einen String !
Wenn du das reine Passwort aus dem Secure-String brauchst musst du es zurückwandeln

Hier ein Beispiel
<#
    Ver- und Entschlüsselung eines Passwortes mit Hilfe eines Secure-Strings
    (Wichtiger Hinweis: verwendet werden kann der verschlüsselte String nur auf dem selben Rechner mit dem selben Account)
#>

$password = read-host -prompt "Passwort eingeben"   

# Password verschlüsselt als String speichern
$securetext = ConvertTo-SecureString $password -force -asPlainText | ConvertFrom-SecureString
write-host "Der Verschlüsselungs-String des Passwortes lautet:`r`n" -ForegroundColor Green  
write-host $securetext -ForegroundColor Yellow

# Passwort aus dem String entschlüsseln
$decrypted = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR((ConvertTo-SecureString -String $securetext)))
write-host "`r`nDecrypte das Password aus dem Verschlüsselungs-String ... das Passwort lautet: " -ForegroundColor Green -NoNewline  
write-host "$decrypted" -ForegroundColor Red -BackgroundColor White  
oder man macht es über ein Credential Object und dem Securestring-Object um an das Plaintextpasswort zu kommen:
$cred = New-Object PSCredential("USERNAME",$DEINSECURESTRINGOBJECT)  
$cred.GetNetworkCredential().Password
Gruß grexit
SaschaRD
SaschaRD 22.12.2015 um 14:46:57 Uhr
Goto Top
Hallo grexit,

das macht dann natürlich auch Sinn, wenn net use nur einen String verarbeiten kann. Für alle die die auch nach einer Lösung suchen:
$File = "C:\pass.txt"  
# Das Verschlüsseln muss einmalig ausgeführt werden; danach einfach auskommentieren (Achtung! funktioniert mit dem Benutzer mit dem das Passwort verschlüsselt wurde)
'mypassword' | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File $File  

$User = 'mydomain\testuser'  
$UserPassCrypted = Get-Content $File | ConvertTo-SecureString
$UserPassDecrypted = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR(($UserPassCrypted))) 

net use Z: $Z /user:$User $UserPassDecrypted

Danke und Gruß, Sascha
114757
114757 22.12.2015 aktualisiert um 14:56:42 Uhr
Goto Top
Moin,
p.s. es gibt in Powershell auch New-PSDrive dem man Credentials übergeben kann face-wink
$File = "C:\pass.txt"  
$cred = New-Object PSCredential("USERNAME",(Get-Content $File | ConvertTo-SecureString))   
New-PSDrive -Name Z -Root "\\SERVER\FREIGABE" -Credential $cred -PSProvider FileSystem  
Frohes Fest
Gruß jodel32
StefanKittel
StefanKittel 23.12.2015 um 09:13:43 Uhr
Goto Top
Zitat von @SaschaRD:
> net use Z: $Z /user:$User $UserPassDecrypted
> 

Hallo,

aber so kann doch jeder der dies ausführen darf sich eine Kopie der Batchdatei machen und dort ein
echo $UserPassDecrypted
einbauen und hat dann doch wieder das Kennwort.

Stefan
114757
114757 23.12.2015 aktualisiert um 10:05:44 Uhr
Goto Top
aber so kann doch jeder der dies ausführen darf sich eine Kopie der Batchdatei machen und dort ein
@StefanKittel Falsch, das stimmt so eben nicht, denn an das Passwort kommt man nur, wenn das Skript mit dem Benutzer mit dem der SecureString erstellt wurde ausgeführt wird, und auch nur auf dem selben Rechner... So leicht ist es also nicht.
Der Part zum anlegen des SecureStrings kommt natürlich nicht ins Finale Skript sondern dient nur einmalig dazu den SecureString zu erstellen.
Der SecureString ist also an Account und Client gebunden auf dem er erstellt wurde!
http://social.technet.microsoft.com/wiki/contents/articles/4546.working ...

Eine echte starke Verschlüsselung ersetzt das sicher nicht, aber es erhöht den Aufwand, und ist allemal besser als das PW im Klartext einzupflanzen, noch besser wäre es wenn er dem Account die entsprechenden Rechte auf das Netzlaufwerk vergibt dann wäre es obsolet.

Gruß jodel32