derwowusste
Goto Top

Ein Powershellskript mit Argumenten füttern, die Kommata enthalten

Moin Kollegen, liebe Skriptinggötter.

Ich versuche einem Powershellskript ein Argument zu übergeben, was auch gelingt, solange kein Komma innerhalb des Argumentes steht. Hier verlassen mich meine Fähigkeiten leider schon, wie bekomme ich das Komma maskiert? [natürlich weiß man nicht vorher, ob ein Komma im Argument übergeben werden wird]

Skript:
$newpw = ConvertTo-SecureString -Force -AsPlainText $args
Add-BitLockerKeyProtector c: -PasswordProtector -password $newpw

Argument könnte ein x-beliebiges Kennwort sein, beispielsweise AdTlT,Fu1T!

Edit: bin schon etwas weiter und habe das Skript oben korrigiert (zuvor standen "" um $args herum).
Was geht ist, das Kennwort in ' einzuschließen:
script.ps 'Kenn,wort'  

Was mir leider noch mehr Kopfzerbrechen bereitet, sind Kennwörter mit enthaltenem &-Symbol oder auch dem Backtick (') selbst.
Und was andere Sonderzeichen noch vorhalten, möchte ich gar nicht wissen.

Noch Ideen dazu?

Content-Key: 232964

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

Ausgedruckt am: 29.03.2024 um 14:03 Uhr

Mitglied: colinardo
Lösung colinardo 19.03.2014 aktualisiert um 10:11:47 Uhr
Goto Top
Moin DWW,
ab Powershell 3.0 hast du eine neue Möglichkeit dieses Problem zu umgehen.
Den Aufruf auf der Kommandozeile machst du folgendermaßen:
script.ps1 --% Dein Ken"nw'o,r$*& ` @  #
Die Magie macht das --% . Alles was danach kommt wird nicht mehr von der Powershell geparst und als ein Parameter an das Script weitergegeben, du musst hier das Kennwort auch nicht in Anführungszeichen setzen (diese gehören dann quasi zum Passwort selber), selbst Leerzeichen werden so weitergegeben. Du musst nur dein Script anweisen den zweiten Parameter $args[1] als Passwort zu nehmen.

Grüße Uwe
Mitglied: DerWoWusste
DerWoWusste 19.03.2014 um 09:34:32 Uhr
Goto Top
Moin.

Vielen Dank.
Es sieht jedoch so aus, als wäre das "&" in Deinem Beispiel nur günstig gesetzt.
Nehme ich
script.ps1 --% Dein K&en"nw'o,r$*& ` @  #  
dann kommt wie erwartet
'en"nw'o,r$*& ` @ #' is not recognized as an internal or external command, operable program or batch file.

Lässt sich das drehen?
Mitglied: colinardo
colinardo 19.03.2014 aktualisiert um 09:48:10 Uhr
Goto Top
Zitat von @DerWoWusste:
Es sieht jedoch so aus, als wäre das "&" in Deinem Beispiel nur günstig gesetzt.
also bei mir ist das wurscht .... geht auch so, wie gesagt alles dahinter wird nicht mehr geparst ...
hast du Powershell 3.0 ? wie rufst du das Script auf , aus einer DOS-Shell ? mach es aus einer Powershell-Konsole heraus dann geht es.
http://powershell.org/wp/2012/01/02/powershell-v3-ctp2-provides-better- ...
Mitglied: DerWoWusste
DerWoWusste 19.03.2014 aktualisiert um 10:11:27 Uhr
Goto Top
Okay, da mit Batch gearbeitet wurde, die an Powershell übergibt, kommt es zu dem Fehler, sonst nicht, super, das lässt sich wohl noch hindengeln! Habe PS4.0, nebenbei.
Tja, dann ist das auch gelöst und eine mögliche Lösung für Bitlocker SSO ist in greifbarer Nähe, ich werde sie dann posten.

Nützlich beim Testen der Übergabe des Securestrings ist übrigens folgende function, vierlleicht kennst Du die noch nicht:
function Decrypt-SecureString {
param(
    [Parameter(ValueFromPipeline=$true,Mandatory=$true,Position=0)]
    [System.Security.SecureString]
    $sstr
)

$marshal = [System.Runtime.InteropServices.Marshal]
$ptr = $marshal::SecureStringToBSTR( $sstr )
$str = $marshal::PtrToStringBSTR( $ptr )
$marshal::ZeroFreeBSTR( $ptr )
$str
}
Decrypt-SecureString $newpw
Mitglied: colinardo
colinardo 19.03.2014 aktualisiert um 12:52:01 Uhr
Goto Top
Yip kenn ich leider schon, brauchte ich gerade letzte Woche face-smile, hier eine Abkürzung:
[Runtime.Interopservices.Marshal]::PtrToStringAuto([Runtime.Interopservices.Marshal]::SecureStringToBStr($securestring_password))
Grüße Uwe