none
ConvertTo-SecureString : Schlüssel ist im angegebenen Status nicht gültig. RRS feed

  • Frage

  • Hallo,

    ich habe folgendes Problem zu dem ich im I-Net auch nichts finde.

    Habe ein PS-Script erstellt welches aus einer Textdatei ein verschlüsseltes Passwort ausliest und damit ein Credential-Objekt erstellt. Das ganze funktioniert auf meinem Testrechner unter Windows XP wunderbar, lasse ich das Script aber unter Windows 7 laufen, dann kommt beim erzeugen des passworts in der folgenden Zeile ein Fehler:

    $password = get-content ($PWDPath + $PwdFile) | convertto-securestring

    Der Fehler lautet eben:

    ConvertTo-SecureString : Schlüssel ist im angegebenen Status nicht gültig.

     

     

    Und wie gesagt, unter XP läuft es durch.

     Das verschlüsselte Passwort habe ich über ein anderes Script erzeugt, die relevanten Zeilen darin sind:

    $cred = Read-Host -prompt "Bitte Passwort für $file angeben:" -AsSecureString

    $cred | ConvertFrom-SecureString | Set-Content ($pfad + $file)

     

     

     

    Kann mir da jemand mal schnell weiter helfen?

     

    Vielen Dank & Gruß

     

     

    Donnerstag, 13. Januar 2011 07:30

Antworten

  • ConvertFrom-SecureString verschlüsselt die Daten mit der Windows Standard-Data-Protection-API. Das bedeutet hier das nur der Useraccount der die Daten verschlüsselt hat, sie auch wieder entschlüsseln kann. Wenn du es mit einem anderen Benutzer probierst, erhältst du die Fehlermeldung "Schlüssel ist im angegebenen Status nicht gültig." da dieser User eben keinen Zugriff auf den Schlüssel hat.

    Lösung: entweder Entschlüsselung mit gleichem Account vornehmen oder einen hardcoded Verschlüsselungskey benutzen. Das sähe dann so aus:

    Verschlüsselung :

    $cred = Read-Host -prompt "Bitte Passwort für $file angeben:" -AsSecureString
    $key = (3,4,2,3,6,2,1,1,2,3,2,4,3,1,4,2)
    $cred | ConvertFrom-SecureString -key $key| Set-Content ("d:\passw.txt")
    

    Entschlüsselung :

    $key = (3,4,2,3,6,2,1,1,2,3,2,4,3,1,4,2)
    $passw = get-content ("d:\passw.txt") | convertto-securestring -key $key
    $passw = [Runtime.Interopservices.Marshal]::PtrToStringAuto([Runtime.Interopservices.Marshal]::SecureStringToBStr($passw)) # dies hier wandelt wieder in Klartext um und dient nur zur Kontrolle. Später rauslöschen. #
    write-host $passw
    

    Hier gibts noch mehr Infos zum -key Schalter.

    Grüße, Denniver

    Donnerstag, 13. Januar 2011 14:24
    Moderator
  • Ja das siehst du richtig. Das ist allerdings auch bei der von dir gewollten Methode so gewesen.
    Hierbei hätte ein User das Passwort sogar ohne den Schlüssel zu kennen, entschlüsseln können. Es gibt leider keine sichere Methode um Passwörter in Scripten zu hinterlegen, bestenfalls verschleiern kann man sie.
    Schau mal hier und hier .

    Grüße, Denniver

    Freitag, 14. Januar 2011 09:18
    Moderator

Alle Antworten

  • ConvertFrom-SecureString verschlüsselt die Daten mit der Windows Standard-Data-Protection-API. Das bedeutet hier das nur der Useraccount der die Daten verschlüsselt hat, sie auch wieder entschlüsseln kann. Wenn du es mit einem anderen Benutzer probierst, erhältst du die Fehlermeldung "Schlüssel ist im angegebenen Status nicht gültig." da dieser User eben keinen Zugriff auf den Schlüssel hat.

    Lösung: entweder Entschlüsselung mit gleichem Account vornehmen oder einen hardcoded Verschlüsselungskey benutzen. Das sähe dann so aus:

    Verschlüsselung :

    $cred = Read-Host -prompt "Bitte Passwort für $file angeben:" -AsSecureString
    $key = (3,4,2,3,6,2,1,1,2,3,2,4,3,1,4,2)
    $cred | ConvertFrom-SecureString -key $key| Set-Content ("d:\passw.txt")
    

    Entschlüsselung :

    $key = (3,4,2,3,6,2,1,1,2,3,2,4,3,1,4,2)
    $passw = get-content ("d:\passw.txt") | convertto-securestring -key $key
    $passw = [Runtime.Interopservices.Marshal]::PtrToStringAuto([Runtime.Interopservices.Marshal]::SecureStringToBStr($passw)) # dies hier wandelt wieder in Klartext um und dient nur zur Kontrolle. Später rauslöschen. #
    write-host $passw
    

    Hier gibts noch mehr Infos zum -key Schalter.

    Grüße, Denniver

    Donnerstag, 13. Januar 2011 14:24
    Moderator
  • Hallo Denniver,

    vielen Dank für deine Antwort.

    Aber jetzt mal eine Frage. Ich brauiche das ganze Procedere um ein Programm mit lokalen Adminrechten zu starten, während ein User mit beschränkten Rechten angemeldet ist. Das lokale Admin-Passwort steht dabei verschlüsselt in einer Textdatei auf einem Share, so das jeder User darauf zugreifen kann, es aber eben nicht im Klartext lesen kann.

    Steht nun der Verschlüsselungskey als Klartext im Script, dann kann sich der User ja das Passwort im Klartext über die PS-Konsole ausgeben lassen. Oder? Womnit das ganze Procedere irgendwie sinnlos geworden ist. Oder sehe ich da was falsch?

    Freitag, 14. Januar 2011 08:54
  • Ja das siehst du richtig. Das ist allerdings auch bei der von dir gewollten Methode so gewesen.
    Hierbei hätte ein User das Passwort sogar ohne den Schlüssel zu kennen, entschlüsseln können. Es gibt leider keine sichere Methode um Passwörter in Scripten zu hinterlegen, bestenfalls verschleiern kann man sie.
    Schau mal hier und hier .

    Grüße, Denniver

    Freitag, 14. Januar 2011 09:18
    Moderator
  • Umpf, na super. Das war dann wohl ein Satz mit X.

    Trotzdem vielen Dank für deine Hilfe.

    Gruß

    Freitag, 14. Januar 2011 10:00
  • Ja das siehst du richtig. Das ist allerdings auch bei der von dir gewollten Methode so gewesen.
    Hierbei hätte ein User das Passwort sogar ohne den Schlüssel zu kennen, entschlüsseln können. Es gibt leider keine sichere Methode um Passwörter in Scripten zu hinterlegen, bestenfalls verschleiern kann man sie.
    Schau mal hier und hier .

    Grüße, Denniver


    Ich bin der Autor des Verschlüsselungsmoduls verwiesen (bittangents.com). Dies ist ein gemeinsames Ding, das Leute mich um Erfordern eines Kennworts für die Verschlüsselung fragen. In meinem Artikel schlage ich vor, dass eine powershell Schriftart einen Verbraucher für ein Kennwort veranlasst. Der andere Weg des Machens dies benutzt PSCredential. Lassen Sie mich wissen, wenn Sie mich möchten, etwas nach oben für Gebrauch zu entwerfen. Mein Deutsch ist schlecht, weil ich Englisch spreche, und muss meine Wörter übersetzen.
    Mittwoch, 19. Januar 2011 08:22