Até o XP e o Server 2003, você pode usar outra ferramenta incluída (VBScript) - os dois scripts a seguir fazem o trabalho que você deseja.
Primeiro getpwd.cmd
:
@echo off
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.
Então getpwd.vbs
,:
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
O getpwd.vbs
simplesmente usa o objeto de senha para inserir a senha do usuário e depois imprime na saída padrão (o próximo parágrafo irá explicar por que isso não aparece no terminal).
O getpwd.cmd
script de comando é um pouco mais complicado, mas basicamente funciona da seguinte maneira.
O efeito do "<nul: set /p passwd=Password: "
comando é produzir o prompt sem nenhum caractere de nova linha à direita - é uma maneira sorrateira de emular o "echo -n"
comando do bash
shell. Ele é definido passwd
como uma string vazia como um efeito colateral irrelevante e não espera pela entrada, pois está recebendo a entrada do nul:
dispositivo.
A "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
declaração é a parte mais complicada. Ele executa o VBScript sem "publicidade" da Microsoft, de modo que a única saída de linha é a senha (do VBscript "Wscript.StdOut.WriteLine strPassword"
.
Definir os delimitadores para zero é necessário para capturar uma linha de entrada inteira com espaços, caso contrário, você apenas obterá a primeira palavra. O "for ... do set ..."
bit é definido passwd
como a saída de senha real do VBScript.
Em seguida, ecoamos uma linha em branco (para encerrar a "Password: "
linha) e a senha estará na passwd
variável de ambiente após a execução do código.
Agora, conforme mencionado, scriptpw.dll
está disponível apenas até XP / 2003. Para corrigir isso, você pode simplesmente copiar o scriptpw.dll
arquivo da Windows\System32
pasta de um sistema XP / 2003 para a pasta Winnt\System32
ou Windows\System32
em seu próprio sistema. Depois que a DLL for copiada, você precisará registrá-la executando:
regsvr32 scriptpw.dll
Para registrar com êxito a DLL no Vista e posterior, você precisará de privilégios de administrador. Eu não examinei a legalidade de tal movimento, então leitor das cavernas.
Se você não estiver muito interessado em rastrear e registrar arquivos DLL mais antigos (por conveniência ou por motivos legais), existe outra maneira. Versões posteriores do Windows (aquelas que não têm a DLL necessária) devem ter o Powershell disponível para você.
E, de fato, você realmente deve considerar atualizar seus scripts para usá-los totalmente, já que é uma linguagem de script muito mais capaz do que cmd.exe
. No entanto, se você deseja manter a maior parte do seu código como cmd.exe
scripts (por exemplo, se você tiver muitos códigos que não deseja converter), pode usar o mesmo truque.
Primeiro, modifique o cmd
script para que ele chame Powershell em vez de CScript:
@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i
O script Powershell é igualmente simples:
$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password
embora com algum empacotamento para obter o texto da senha real.
Lembre-se de que, para executar scripts Powershell locais não assinados em sua máquina, você pode precisar modificar a política de execução do padrão (draconiano, embora muito seguro), com algo como:
set-executionpolicy remotesigned
de dentro do próprio Powershell.