Jusqu'à XP et Server 2003, vous pouvez utiliser un autre outil inclus (VBScript) - les deux scripts suivants font le travail que vous souhaitez.
Premièrement getpwd.cmd
,:
@echo off
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.
Ensuite getpwd.vbs
,:
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
Le getpwd.vbs
utilise simplement l'objet mot de passe pour saisir le mot de passe de l'utilisateur, puis l'imprimer sur la sortie standard (le paragraphe suivant expliquera pourquoi cela n'apparaît pas dans le terminal).
Le getpwd.cmd
script de commande est un peu plus délicat mais il fonctionne essentiellement comme suit.
L'effet de la "<nul: set /p passwd=Password: "
commande est de sortir l'invite sans caractère de fin de ligne - c'est un moyen sournois d'émuler la "echo -n"
commande à partir du bash
shell. Il définit passwd
une chaîne vide comme un effet secondaire non pertinent et n'attend pas d'entrée car il prend son entrée du nul:
périphérique.
La "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
déclaration est la partie la plus délicate. Il exécute le VBScript sans "publicité" Microsoft, de sorte que la seule sortie de ligne est le mot de passe (du VBscript "Wscript.StdOut.WriteLine strPassword"
.
La définition des délimiteurs sur rien est nécessaire pour capturer une ligne d'entrée entière avec des espaces, sinon vous obtenez juste le premier mot. Le "for ... do set ..."
bit est défini passwd
comme étant la sortie de mot de passe réelle du VBScript.
Ensuite, nous renvoyons une ligne vide (pour terminer la "Password: "
ligne) et le mot de passe sera dans la passwd
variable d'environnement une fois le code exécuté.
Maintenant, comme mentionné, scriptpw.dll
n'est disponible que jusqu'à XP / 2003. Pour corriger cela, vous pouvez simplement copier le scriptpw.dll
fichier du Windows\System32
dossier d'un système XP / 2003 vers le dossier Winnt\System32
ou Windows\System32
de votre propre système. Une fois la DLL copiée, vous devrez l'enregistrer en exécutant:
regsvr32 scriptpw.dll
Pour enregistrer correctement la DLL sur Vista et versions ultérieures, vous aurez besoin de privilèges d'administrateur. Je n'ai pas examiné la légalité d'un tel mouvement, donc lecteur de caverne.
Si vous n'êtes pas trop désireux d'essayer de retrouver et d'enregistrer des fichiers DLL plus anciens (pour des raisons pratiques ou légales), il existe un autre moyen. Les versions ultérieures de Windows (celles qui n'ont pas la DLL requise) devraient avoir Powershell à votre disposition.
Et, en fait, vous devriez vraiment envisager de mettre à niveau vos scripts pour les utiliser pleinement, car il s'agit d'un langage de script beaucoup plus performant que cmd.exe
. Cependant, si vous souhaitez conserver la majeure partie de votre code sous forme de cmd.exe
scripts (par exemple, si vous avez beaucoup de code que vous ne souhaitez pas convertir), vous pouvez utiliser la même astuce.
Tout d'abord, modifiez le cmd
script pour qu'il appelle Powershell plutôt que CScript:
@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i
Le script Powershell est tout aussi simple:
$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password
bien qu'avec un peu de rassemblement pour obtenir le texte du mot de passe réel.
N'oubliez pas que, pour exécuter des scripts Powershell locaux non signés sur votre machine, vous devrez peut-être modifier la politique d'exécution par défaut (draconienne, bien que très sûre), avec quelque chose comme:
set-executionpolicy remotesigned
de l'intérieur de Powershell lui-même.