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 bash
shell. Se establece passwd
en 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.dll
solo está disponible hasta XP / 2003. Para rectificar esto, simplemente puede copiar el scriptpw.dll
archivo de la Windows\System32
carpeta de un sistema XP / 2003 a la carpeta Winnt\System32
o Windows\System32
en 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.exe
scripts (por ejemplo, si tiene un muchos código que no desea convertir), puede usar el mismo truco.
Primero, modifique el cmd
script 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.