Redaktionssystem [www.ingenieur-menzel.de]
Passwortdialoge (maskierte Eingaben)

Für Rückgaben im Klartext verfügt Powershell über keine Commandlets, die eine maskierte Benutzereingabe erlauben. Nachfolgend werden zwei Möglichkeiten beschrieben, um diese Funktionalität bereitzustellen

Hintergrund
Die Anweisungen Read-Host -AsSecurestring und Get-Credential maskieren die Benutzereingabe. Als Rückgabe wird jedoch eine geschützte Zeichenkette vom Typ [System.Security.SecureString] zurückgegeben. Viele Anwendungen außerhalb von Powershell können eine so geschützte Zeichenkette nicht weiterverarbeiten. 

 

Verwenden der COM-Bibliothek [scriptpw.dll]

Eine Möglichkeit für einen maskierten Eingabedialog bietet die COM-Bibliothek [scriptpw.dll]. Die Verwendung ist eigentlich einfach.  

 

# *** Passwort abfragen ***
$objPassword = new-object -comobject "ScriptPW.Password"
Write-Host `
  'Bitte Passwort eingeben und [Eingabe]-Taste drücken.' `
   -BackgroundColor Black -ForegroundColor Yellow
$strPassword = $objPassword.GetPassword() 

# *** Passwort ausgeben ***
Write-Host `
  'Das Passwort lautet: ' $strPassword `
  -BackgroundColor Black -ForegroundColor Yellow
Read-Host "Bitte [Eingabe]-Taste drücken ..."

Code: PS1, PWT_ScriptPW_DLL.ps1  

 

Ein gravierender Nachteil ist jedoch, dass die DLL auf aktuellen Systemen (Windows 7/2008) nicht mehr lauffähig ist. 

 

Maskieren von Eingaben mit Powershell-Mitteln

Eine universelle Möglichkeit zur Eingabemaskierung besteht in der Gleichschaltung der augenblicklichen Powershell-Konsolen-Farben für Hintergrund und Text.  

 

# *************************
# *** Passwort abfragen ***
# *************************
# Bildschirmfarben speichern
$colForeGround_before = $Host.UI.RawUI.ForegroundColor
$colBackGround_before = $Host.UI.RawUI.BackgroundColor

Write-Host `
    'Bitte Passwort eingeben und [Eingabe]-Taste drücken.' `
    -BackgroundColor Black -ForegroundColor Yellow

# Bildschirmfarben (Hintergrund und Text) auf Schwarz setzen
$Host.UI.RawUI.ForegroundColor = [System.ConsoleColor]::Black
$Host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::Black

# Passwort abfragen
$strPassword = `
    Read-Host 'Bitte Passwort eingeben und [Eingabe]-Taste drücken.'

# Bildschirmfarben (Hintergrund und Text) auf Ursprung zurücksetzen
$Host.UI.RawUI.ForegroundColor = $colForeGround_before
$Host.UI.RawUI.BackgroundColor = $colBackGround_before
# *************************

# *** Passwort ausgeben ***
Write-Host `
   'Das Passwort lautet: ' $strPassword `
    -BackgroundColor Black -ForegroundColor Yellow
Read-Host "Bitte [Eingabe]-Taste drücken ..."

Code: PS1, PWT_ColorControl.ps1  

 

Beispiel FreeOTFE-Steuerung

Eine praktische Anwendung des Passwortdialoges erfolgt mit einem Powershell-Skript zum Öffnen von geschützten Containern mit der Anwendung FreeOTFE.  

 

# Typisierungszwang, verhindert LESEN nicht initialisierter Variablen
set-strictmode -version 2.0
<#
=================================================================================
* Mounten von [FreeOTFE]-Archivdateien *

    Version:
        12.01.2012 15:10
    
    Autor:
        Alfred Menzel
        (c) ingenieur-menzel.de
=================================================================================
* globale Fehlerbehandlung *

  Zweck:
  Skript-Terminierung bei auftretendem Fehler
#>
trap {
    Write-Host ("### ABBRUCH ###") -ForegroundColor red 
    Write-Error ($_.Exception.Message)
    Read-Host "Bitte [Eingabe]-Taste drücken ..."
    # Skript beenden
    Exit
}
<#
**********************************************************************************
* Assemblies laden *
#>
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
<#
*********************************************************************************
* Main-Routine *
*********************************************************************************
# ===============================================================================
#  * Deklarationen *
# ===============================================================================
#>
#    allgemein
[System.String]        $strExeption              = ''           # Fehlermeldung
[System.String]        $strMessage              = ''            # Meldung
[System.String]        $strPassword             = ''            
[System.Boolean]       $blnPathFile_Exists      = $false        
#    spez.
[System.String]        $strOTFE_FPath           = ''            # DateiPfad 
# ... zur [FreeOTFE.exe]
[System.String]        $strOTFE_ARG             = `
    '/mount /volume {1} /freeotfe /readonly /password {2} /silent /noexit'
[System.String]        $strARG                  = ''
[System.ConsoleColor]  $colForeGround_before    = [System.ConsoleColor]::Cyan
[System.ConsoleColor]  $colBackGround_before    = [System.ConsoleColor]::Cyan
[System.String[]]      $strArrArcFiles          = ''
[System.String]        $strArcFile              = ''
[System.String]        $strArcPath              = ''            # ArchivPfad mit 
# ... abschliessendem '\' (Backslash)
[System.String]        $strArcFPath             = ''            # ArchivDateiPfad
[System.Int32]         $intFile_Index           = 0
[System.Int32]         $intFile_Count           = 0
# ===============================================================================
#  * Initialisierungen *
# ===============================================================================
# Bildschirm löschen
Clear-Host
$strOTFE_FPath     = 'C:\Programme\FreeOTFE\FreeOTFE.exe'
# ArchivPfad
$strArcPath        = 'C:\TEMP\'
# ArcDateien angegen
$strArrArcFiles[0] = "01.vol"
$strArrArcFiles   += "02.vol" 
$strArrArcFiles   += "03.vol" 
# ===============================================================================

# *****************************************
# *** OTFE_DateiPfad auf Zugriff testen ***
# *****************************************
$blnPathFile_Exists = Test-Path $strOTFE_FPath
switch($blnPathFile_Exists)
{
    $true   {
    }
    default {
         # Abbruch auslösen
        $strExeption = 
@"
Der Dateipfad [$strOTFE_FPath] wurde nicht richtig angegeben 
oder die Zugriffsrechte sind nicht vorhanden.
"@

        throw $strExeption
    }
}
# *****************************************

# **************************************
# *** Archivpfad auf Zugriff testen ***
# **************************************
$blnPathFile_Exists = Test-Path $strArcPath
switch($blnPathFile_Exists)
{
    $true   {
    }
    default {
         # Abbruch auslösen
        $strExeption = 
@"
Der Archipfad [$strArcPath] wurde nicht richtig angegeben 
oder die Zugriffsrechte sind nicht vorhanden.
"@

        throw $strExeption
    }
}
# **************************************

# *************************
# *** Passwort abfragen ***
# *************************
# Bildschirmfarben speichern
$colForeGround_before = $Host.UI.RawUI.ForegroundColor
$colBackGround_before = $Host.UI.RawUI.BackgroundColor

Write-Host `
    'Bitte Passwort eingeben und [Eingabe]-Taste drücken.' `
    -BackgroundColor Black -ForegroundColor Yellow

# Bildschirmfarben (Hintergrund und Text) auf Schwarz setzen
$Host.UI.RawUI.ForegroundColor = [System.ConsoleColor]::Black
$Host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::Black

# Passwort abfragen
$strPassword = Read-Host 'Passwort'

# Bildschirmfarben (Hintergrund und Text) auf Ursprung zurücksetzen
$Host.UI.RawUI.ForegroundColor = $colForeGround_before
$Host.UI.RawUI.BackgroundColor = $colBackGround_before
# *************************

# ***********************
# *** Archive mounten ***
# ***********************
foreach ( $strArcFile in $strArrArcFiles)
{
    # DateiPfad zusammenstellen
    $strArcFPath = $strArcPath + $strArcFile


    # ---------------------------------
    # *** Datei auf Existenz prüfen ***
    # ---------------------------------
    $blnPathFile_Exists = Test-Path $strArcFPath
    switch($blnPathFile_Exists)
    {
        $true   {
        }
        default {
             # Abbruch auslösen
            $strExeption = 
@"
Der Archivdatei [$strArcFile] wurde nicht richtig angegeben 
oder die Zugriffsrechte sind nicht vorhanden.
"@

            throw $strExeption
        }
    }
    # ---------------------------------

    $strARG = $strOTFE_ARG.Replace("{1}", [char]34 + $strArcFPath + [char]34)
    $strARG = $strARG.Replace("{2}", $strPassword)

    Start-Process $strOTFE_FPath -ArgumentList $strARG
    
}
# ***********************

Read-Host "Ende, bitte [Eingabe]-Taste drücken ..."
# ENDE

Code: PS1, OTFE_Call.ps1

Siehe ebenfalls
Pfad:  Anleitungen > Powershell 2.0 > Passwortdialoge (maskierte Eingaben)
TopicID: [_tut_ps_passworddialog]
© Dipl.-Ing. (FH) Alfred Menzel, 2012
Impressum, Haftungsausschluss und Nutzungsbedingungen