Fino a XP e Server 2003, è possibile utilizzare un altro strumento incluso (VBScript): i due script seguenti svolgono il lavoro desiderato.
Innanzitutto getpwd.cmd
:
@echo off
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.
Quindi getpwd.vbs
:
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
La getpwd.vbs
usa semplicemente l'oggetto password per inserire la password da parte dell'utente e quindi stamparlo sullo standard output (paragrafo successivo spiegherà perché che non si presenta nel terminale).
Lo getpwd.cmd
script dei comandi è un po 'più complicato ma fondamentalmente funziona come segue.
L'effetto del "<nul: set /p passwd=Password: "
comando è di visualizzare il prompt senza alcun carattere di nuova riga finale: è un modo subdolo per emulare il "echo -n"
comando dalla bash
shell. Si imposta passwd
su una stringa vuota come effetto collaterale irrilevante e non attende l'input poiché riceve l'input dal nul:
dispositivo.
L' "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
affermazione è la parte più complicata. Esegue VBScript senza "pubblicità" Microsoft, in modo che l'unica riga di output sia la password (dal file VBscript "Wscript.StdOut.WriteLine strPassword"
.
L'impostazione dei delimitatori su nulla è necessaria per acquisire un'intera riga di input con spazi, altrimenti si ottiene solo la prima parola. Il "for ... do set ..."
bit viene impostato passwd
come output della password effettiva da VBScript.
Quindi echeggiamo una riga vuota (per terminare la "Password: "
riga) e la password sarà nella passwd
variabile d'ambiente dopo che il codice è stato eseguito.
Ora, come detto, scriptpw.dll
è disponibile solo fino a XP / 2003. Per correggere questo problema, puoi semplicemente copiare il scriptpw.dll
file dalla Windows\System32
cartella di un sistema XP / 2003 alla cartella Winnt\System32
o Windows\System32
sul tuo sistema. Una volta che la DLL è stata copiata, sarà necessario registrarla eseguendo:
regsvr32 scriptpw.dll
Per registrare correttamente la DLL su Vista e versioni successive, avrai bisogno dei privilegi di amministratore. Non ho esaminato la legalità di una tale mossa, così lettore delle caverne.
Se non siete troppo appassionato cercando di rintracciare e registrare file DLL più anziani (per convenienza o per ragioni legali), c'è un altro modo. Le versioni successive di Windows (quelle che non hanno la DLL richiesta) dovrebbero avere Powershell a tua disposizione.
E, in effetti, dovresti davvero considerare di aggiornare i tuoi script per usarlo completamente poiché è un linguaggio di scripting molto più capace di cmd.exe
. Tuttavia, se vuoi mantenere la maggior parte del tuo codice come cmd.exe
script (ad esempio se hai molto codice che non vuoi convertire), puoi usare lo stesso trucco.
Innanzitutto, modifica lo cmd
script in modo che chiami Powershell anziché CScript:
@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i
Lo script Powershell è altrettanto semplice:
$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password
sebbene con un po 'di marshalling per ottenere il testo della password effettiva.
Ricorda che, per eseguire script Powershell locali non firmati sulla tua macchina, potresti dover modificare la politica di esecuzione dall'impostazione predefinita (draconiana, sebbene molto sicura), con qualcosa del tipo:
set-executionpolicy remotesigned
dall'interno di Powershell stesso.