Hasta XP y Server 2003, puede hacer uso de otra herramienta incluida (VBScript): los dos scripts siguientes hacen el trabajo que desea.
Primero getpwd.cmd:
@echo off
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.
Entonces getpwd.vbs,:
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
los getpwd.vbs simplemente utiliza el objeto contraseña que introduzca la contraseña del usuario y luego imprimir en la salida estándar (el párrafo siguiente explicará por qué no se presenta en el terminal).
los getpwd.cmd script de comando es un poco más complicado, pero básicamente funciona de la siguiente manera.
El efecto del "<nul: set /p passwd=Password: "comando es generar el indicador sin un carácter de nueva línea al final; es una forma engañosa de emular el "echo -n" comando desde el bashshell. Se establece passwden una cadena vacía como un efecto secundario irrelevante y no espera la entrada, ya que la toma del nul:dispositivo.
La "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"declaración es la parte más complicada. Ejecuta VBScript sin "publicidad" de Microsoft, por lo que la única salida de línea es la contraseña (de VBscript"Wscript.StdOut.WriteLine strPassword" .
No es necesario establecer los delimitadores en nada para capturar una línea de entrada completa con espacios; de lo contrario, solo obtiene la primera palabra. los"for ... do set ..." bit se establecepasswd como la salida de contraseña real de VBScript.
Luego hacemos eco de una línea en blanco (para terminar la "Password: "línea) y la contraseña estará en elpasswd variable de entorno después de que se haya ejecutado el código.
Ahora, como se mencionó, scriptpw.dllsolo está disponible hasta XP / 2003. Para rectificar esto, simplemente puede copiar el scriptpw.dllarchivo de la Windows\System32carpeta de un sistema XP / 2003 a la carpeta Winnt\System32o Windows\System32en su propio sistema. Una vez que se haya copiado la DLL, deberá registrarla ejecutando:
regsvr32 scriptpw.dll
Para registrar correctamente la DLL en Vista y versiones posteriores, necesitará privilegios de administrador. No he examinado la legalidad de un movimiento así, lector de cuevas.
Si no está demasiado interesado en intentar rastrear y registrar archivos DLL más antiguos (por conveniencia o razones legales), existe otra forma. Versiones posteriores de Windows (las que no tienen la DLL requerida) deberían tener Powershell disponible para usted.
Y, de hecho, debería considerar actualizar sus scripts para usarlos por completo, ya que es un lenguaje de scripting mucho más capaz que cmd.exe. Sin embargo, si desea mantener la mayor parte de su código como cmd.exescripts (por ejemplo, si tiene un muchos código que no desea convertir), puede usar el mismo truco.
Primero, modifique el cmdscript para que llame a Powershell en lugar de CScript:
@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i
El script de Powershell es igualmente simple:
$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password
aunque con algunas referencias para obtener el texto real de la contraseña.
Recuerde que, para ejecutar scripts de Powershell locales sin firmar en su máquina, es posible que deba modificar la política de ejecución del valor predeterminado (draconiano, aunque muy seguro), con algo como:
set-executionpolicy remotesigned
desde dentro de Powershell.