XPとServer 2003までは、別の付属ツール(VBScript)を使用できます。次の2つのスクリプトで目的の処理を実行できます。
まず、getpwd.cmd
:
@echo off
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.
次に、getpwd.vbs
:
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
はgetpwd.vbs
単にパスワードオブジェクトを使用してユーザーからパスワードを入力し、それを標準出力に出力します(次の段落では、それがターミナルに表示されない理由を説明します)。
getpwd.cmd
コマンドスクリプトは、ビットトリッキーですが、以下のように、それは基本的に動作します。
"<nul: set /p passwd=Password: "
コマンドの効果は、末尾の改行文字なしでプロンプトを出力することです。これ"echo -n"
は、bash
シェルからコマンドをエミュレートする卑劣な方法 です。これはpasswd
、無関係な副作用として空の文字列に設定され、nul:
デバイスから入力を取得するため、入力を待機しません。
"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"
文は最も扱いにくいビットです。Microsoftの "アドバタイズ"なしでVBScriptを実行するため、出力されるのは(VBscriptからの)パスワードだけです"Wscript.StdOut.WriteLine strPassword"
。
スペースを含む入力行全体をキャプチャするには、区切り文字を何も設定しないでください。そうしないと、最初の単語しか取得できません。"for ... do set ..."
ビットがセットpasswd
のVBScriptから実際のパスワード出力します。
次に、空白行をエコーし(行を終了するため"Password: "
)passwd
、コードの実行後にパスワードを環境変数に含めます。
現在、前述のように、scriptpw.dll
XP / 2003までしか使用できません。これを修正するには、scriptpw.dll
ファイルをWindows\System32
XP / 2003システムのフォルダーから自分のシステムのWinnt\System32
またはWindows\System32
フォルダーにコピーするだけです。DLLがコピーされたら、次を実行してDLLを登録する必要があります。
regsvr32 scriptpw.dll
Vista以降でDLLを正常に登録するには、管理者権限が必要です。私はそのような移動の合法性については調べていません。
(便宜上または法的な理由で)古いDLLファイルを追跡して登録しようとすることに熱心でない場合は、別の方法があります。それ以降のバージョンのWindows(必要なDLL がないバージョン)では、Powershellを使用できます。
そして、実際には、スクリプトを完全に使用できるようにスクリプトをアップグレードすることを検討する必要がありますcmd.exe
。ただし、コードの大部分をcmd.exe
スクリプトとして保持したい場合(たとえば、変換したくないコードがたくさんある場合など)は、同じトリックを使用できます。
まず、cmd
CScriptではなくPowershellを呼び出すようにスクリプトを変更します。
@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i
Powershellスクリプトも同様に単純です。
$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password
ただし、実際のパスワードテキストを取得するためにマーシャリングが行われます。
マシン上でローカルの署名されていないPowershellスクリプトを実行するには、実行ポリシーを(非常に安全ではありますが)デフォルトから変更する必要があるかもしれません。
set-executionpolicy remotesigned
Powershell自体から。