batファイルの入力テキストをマスクできますか?


102

他のプログラムを実行するためのバッチファイルを作成しています。この場合、パスワードを要求する必要があります。入力テキストをマスクする方法はありますか?入力文字の代わりに*******文字を印刷する必要はありません。Linuxのパスワードプロンプトの動作(入力中は何も印刷しない)で十分です。

@echo off
SET /P variable=Password : 
echo %variable%
Pause

これは入力を読み取りますが、このアプローチを使用してテキストをマスクすることはできません。


回答:


50

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.dllXP / 2003までしか使用できません。これを修正するには、scriptpw.dllファイルをWindows\System32XP / 2003システムのフォルダーから自分のシステムのWinnt\System32またはWindows\System32フォルダーにコピーするだけです。DLLがコピーされたら、次を実行してDLLを登録する必要があります。

regsvr32 scriptpw.dll

Vista以降でDLLを正常に登録するには、管理者権限が必要です。私はそのような移動の合法性については調べていません。


(便宜上または法的な理由で)古いDLLファイルを追跡して登録しようとすること熱心でない場合は、別の方法があります。それ以降のバージョンのWindows(必要なDLL がないバージョン)では、Powershellを使用できます。

そして、実際には、スクリプトを完全に使用できるようにスクリプトをアップグレードすることを検討する必要がありますcmd.exe。ただし、コードの大部分をcmd.exeスクリプトとして保持したい場合(たとえば、変換したくないコードがたくさんある場合など)は、同じトリックを使用できます。

まず、cmdCScriptではなく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自体から。


2
おっと、その<nul:セット/ pは本当にクールです。今のところそれを知りませんでした:-)。しかし、VBScriptが機能しません。MicrosoftVBScriptランタイムエラー:ActiveXコンポーネントがオブジェクトを作成できません: 'ScriptPW.Password'。Windows 7 Beta x64はこちら。
ジョーイ

興味深いことに、それはXP以降で利用できるようになっています。Win7が機能しない場合は、まだ完全に終了していないと思います(または、Win7を機能させるために他の方法を実行する必要があります)。少し調べてみると、その理由がわかります。私のアップデートをご覧ください。
paxdiablo 2009年

2
いいね。コマンドラインから呼び出すことができる同等の言語の代わりにVBSファイルを使用できることに注意してください。たとえば、cscriptセクションを次のように置き換えることができます: 'python -c "from getpass import getpass; pwd = getpass(); print pwd;"'
Cerin

1
私はこの質問が新しいときにこの方法を使用していました- 追加のスクリプトなしでそれを行う方法を以下に答えました。
2013

1
@ビル:したがって、「今、残念ながら、...」から始まる私のセクション:-)しかし、うまくいけばそれをより良くするために、答えにオプションをさらに追加しました。具体的には、ではなくpowershellの使用scriptpw.dll
paxdiablo 2016

153

はい-私は4年遅れています。

しかし、外部スクリプトを作成することなく、これを1行で行う方法を見つけました。バッチファイルからPowerShellコマンドを呼び出す。

TessellatingHecklerのおかげで-テキストファイルに出力しません(forshell内の1つの長い行で非常に乱雑なので、変数にpowershellコマンドを設定しました)。

@echo off
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
echo %password%

もともとはテキストファイルに出力するように書いた後、そのテキストファイルから読み取りました。しかし、上記の方法の方が優れています。非常に長く、ほとんど理解できない一行:

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt & set /p password=<.tmp.txt & del .tmp.txt
echo %password%

これを分解します-キャレットを使用して数行に分割できます^

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt 
set /p password=<.tmp.txt & del .tmp.txt
echo %password%

この記事では、PowerShellコマンドの機能について説明します。基本的にはRead-Host -AsSecureString、次を使用して入力を取得します。次の2行は、セキュリティで保護された文字列をプレーンテキストに戻し、出力(プレーンテキストパスワード)はを使用してテキストファイルに送信されます>.tmp.txt。次に、そのファイルが変数に読み込まれ、削除されます。


5
元の答えは素晴らしかったが、私はこれが今の決定的なものであるべきだと思う
ジェームズ・ワイズマン

30
これは素晴らしいです。しかし、それがプレーンテキストのパスワードをディスクに保存する方法は私を不快にします。代わりにこれを行うことでそれを回避します。for /f "usebackq tokens=*" %%p in (``powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"``) do set password=%%p次にecho %password%。NB。このコメントを取得してバッククォートを適切にエスケープすることはできません-"powershell"の前と最後の ")"の前は2つのバックティックですが、1つのバックティックである必要があります。
TessellatingHeckler 14年

1
@TessellatingHeckler良い考えです、私は私の答えを更新しました。あなたの提案のわずかに変更されたバージョン。ありがとう。
未解決14年

キーを押すたびにこのメソッドが "*"(スター)をエコーし​​ないようにすることはできますか?つまり、パスワードの長さをオブザーバーに知られたくありません。
Sam Hasler

1
@RegieBaguioいいえ、Powershellを有効にする必要があります。以下のnpocmakaの純粋なBatchソリューションをご覧ください。これはもっと複雑ですが、うまくいくはずです。
unclemeat

26

1. ここにあるXCOPYコマンドとその/P /Lスイッチを(ab)使用する純粋なバッチソリューション(これに関するいくつかの改善点はここにあります):

:: Hidden.cmd
::Tom Lavedas, 02/05/2013, 02/20/2013
::Carlos, 02/22/2013
::https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/f7mb_f99lYI


@Echo Off
:HInput
SetLocal EnableExtensions EnableDelayedExpansion
Set "FILE=%Temp%.\T"
Set "FILE=.\T"
Keys List >"%File%"
Set /P "=Hidden text ending with Ctrl-C?: " <Nul
Echo.
Set "HInput="
:HInput_
For /F "tokens=1* delims=?" %%A In (
 '"Xcopy /P /L "%FILE%" "%FILE%" 2>Nul"'
) Do (
  Set "Text=%%B"
  If Defined Text (
    Set "Char=!Text:~1,1!"
    Set "Intro=1"
    For /F delims^=^ eol^= %%Z in ("!Char!") Do Set "Intro=0"
    Rem If press Intro
    If 1 Equ !Intro! Goto :HInput#
    Set "HInput=!HInput!!Char!"
  )
)
Goto :HInput_
:HInput#
Echo(!HInput!
Goto :Eof 

1.2 replaceコマンドに基づく別の方法

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set /P "=Enter a Password:" < Nul
Call :PasswordInput
Echo(Your input was:!Line!

Goto :Eof

:PasswordInput
::Author: Carlos Montiers Aguilera
::Last updated: 20150401. Created: 20150401.
::Set in variable Line a input password
For /F skip^=1^ delims^=^ eol^= %%# in (
'"Echo(|Replace.exe "%~f0" . /U /W"') Do Set "CR=%%#"
For /F %%# In (
'"Prompt $H &For %%_ In (_) Do Rem"') Do Set "BS=%%#"
Set "Line="
:_PasswordInput_Kbd
Set "CHR=" & For /F skip^=1^ delims^=^ eol^= %%# in (
'Replace.exe "%~f0" . /U /W') Do Set "CHR=%%#"
If !CHR!==!CR! Echo(&Goto :Eof
If !CHR!==!BS! (If Defined Line (Set /P "=!BS! !BS!" <Nul
Set "Line=!Line:~0,-1!"
)
) Else (Set /P "=*" <Nul
If !CHR!==! (Set "Line=!Line!^!"
) Else Set "Line=!Line!!CHR!"
)
Goto :_PasswordInput_Kbd

2.HTAポップアップを使用するパスワード送信者これはハイブリッド.bat / jscript / mshtaファイルであり、.batとして保存する必要があります。

<!-- :
:: PasswordSubmitter.bat
@echo off
for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do (
    set "pass=%%p"
)

echo your password is %pass%
exit /b
-->

<html>
<head><title>Password submitter</title></head>
<body>

    <script language='javascript' >
        window.resizeTo(300,150);
        function entperPressed(e){
                if (e.keyCode == 13) {
                    pipePass();
                }
        }
        function pipePass() {
            var pass=document.getElementById('pass').value;
            var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
            close(fso.Write(pass));

        }
    </script>

    <input type='password' name='pass' size='15' onkeypress="return entperPressed(event)" ></input>
    <hr>
    <button onclick='pipePass()'>Submit</button>

</body>
</html>

3. 自己コンパイルされた.netハイブリッド .Againはとして保存する必要があります.bat。他のソリューションとは異なり、呼び出される小さな.exeファイルを作成/コンパイルします(削除したい場合)。インストールされた.netフレームワークも必要ですが、それは問題ではありません。

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal enableDelayedExpansion

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

for /f "tokens=* delims=" %%p in ('"%~n0.exe"') do (
    set "pass=%%p"
)

echo your password is !pass!

endlocal & exit /b %errorlevel%

*/



import System;



var pwd = "";
var key;

Console.Error.Write("Enter password: ");

        do {
           key = Console.ReadKey(true);

           if ( (key.KeyChar.ToString().charCodeAt(0)) >= 20 && (key.KeyChar.ToString().charCodeAt(0) <= 126) ) {
              pwd=pwd+(key.KeyChar.ToString());
              Console.Error.Write("*");
           }

           if ( key.Key == ConsoleKey.Backspace && pwd.Length > 0 ) {
               pwd=pwd.Remove(pwd.Length-1);
               Console.Error.Write("\b \b");
           }


        } while (key.Key != ConsoleKey.Enter);
        Console.Error.WriteLine();
        Console.WriteLine(pwd);

6
私のハック感は、特にハイブリッドでチクチクしています!
Mark K Cowan、2014

2
その最初の解決策は非常に賢いです-素晴らしい1つ+1。
未解決14

replaceコマンドに基づく2.1の方法では、すばやく入力するとキープレスが失敗します
Sam Hasler

@SamHasler-はい、これを修正しようとしますが、2.1で問題を再現できませんでした。Enterキーが押されたかどうかを確認するためにHTAも更新しました。
npocmaka

1
@npocmaka 1.2メソッドの最終バージョン(最終更新日:20150405)は次のとおりです
carlos

16

私はおそらくそうするでしょう:

..
echo Before you enter your password, make sure no-one is looking!
set /P password=Password:  
cls
echo Thanks, got that.
.. 

プロンプトが表示され、入力すると画面がクリアされます。

コマンドプロンプトからバッチファイルを実行した場合、入力したパスワードはCMD履歴に保存されることに注意してください(@Mark K Cowanに感謝)。

それでも不十分な場合は、Pythonに切り替えるか、スクリプトではなく実行可能ファイルを作成します。

私はこれらが完璧なソウションではないことを知っていますが、多分1つで十分です:)


4
コマンドプロンプトからバッチファイルを実行した場合、入力したパスワードはCMD履歴に保存されます。あなたがほとんど言ったように、cmdは仕事のための間違ったツールですが、反対投票はありません。
Mark K Cowan

コンソールのコマンド履歴が重要でない場合は、を実行doskey /reinstallして直前のコマンドバッファをクリアできclsます。
RuntimeException

1
doskey / reinstallを使用せずにコマンド履歴をクリアしたくない場合は、別のオプションで上記のコードを別のターミナルウィンドウで実行し、すぐに終了します。入力した文字列がアスタリスクに置き換えられないことに注意してください。上記の解決策は、powershellを実行したくない場合のオプションです。C:\>start "console" cmd /c ireadconsole.bat
RuntimeException '29年

9

あらゆる形式の入力に対してReadFormattedLineサブルーチンを使用できます。たとえば、次のコマンドは8文字のパスワードを読み取り、画面にアスタリスクを表示し、Enterキーを押す必要なく自動的に続行します。

call :ReadFormattedLine password="********" /M "Enter password (8 chars): "

このサブルーチンは純粋なBatchで記述されているため、追加のプログラムを必要とせず、数字だけを読み取る、文字を大文字に変換するなど、いくつかのフォーマットされた入力操作を行うことができます


EDIT 2018-08-18「見えない」パスワードを入力する新しい方法

FINDSTRコマンドには奇妙なバグがあり、このコマンドを使用して文字をカラーで表示し、そのようなコマンドの出力がCONデバイスにリダイレクトされると発生します。FINDSTRコマンドを使用してテキストをカラーで表示する方法の詳細については、このトピックを参照してください。

この形式のFINDSTRコマンドの出力がCONにリダイレクトされると、テキストが目的の色で出力された後に奇妙なことが起こります。より正確な説明は、テキストが黒の背景に黒のテキストとして出力します。COLORコマンドを使用して画面全体の前景色と背景色をリセットすると、元のテキストが表示されます。ただし、テキストが「非表示」の場合は、SET / Pコマンドを実行できるため、入力したすべての文字が画面に表示されません。

@echo off
setlocal

set /P "=_" < NUL > "Enter password"
findstr /A:1E /V "^$" "Enter password" NUL > CON
del "Enter password"
set /P "password="
cls
color 07
echo The password read is: "%password%"

5

別の選択肢は、私のEditV32(x86)またはEditV64(x64)コマンドラインツールです。例えば:

editv32 -m -p "Password: " PWD

-mは「マスクされた入力」を意味し、-pはプロンプトです。ユーザーの入力はPWD環境変数に格納されます。あなたはそれをここで得ることができます:

https://westmesatech.com/?page_id=19


5
これが唯一のクローズドソースソリューションではありません(Windowsはクローズドソースです!)。もちろん、自由に使用することはできません...
Bill_Stewart、2014年

ソースコードの不足が気になる場合は、ReadLine.exeに関する他の回答を参照してください。
Bill_Stewart 2014年

いいね!ライセンスはそれを使用することができます。さらに、統合が簡単です。終了コードを処理するだけです。1。コマンドラインのエラー、2入力行が空白、3環境変数が変更されなかった、4 Ctrl-Cでプログラムが中止された
James Jithin

注:editenv32 / editenv64およびreadlineユーティリティは、オープンソースのeditenvユーティリティに置き換えられました。
Bill_Stewart

4

ソースコードの不足が気になる場合は、別の方法があります。

@echo off
for /f "delims=" %%p in ('ReadLine -h -p "Enter password: "') do set PWD=%%p
echo You entered: %PWD%

https://westmesatech.com/?page_id=49から取得できます。ソースコードが含まれています。


注:editenv32 / editenv64およびreadlineユーティリティは、オープンソースのeditenvユーティリティに置き換えられました。
Bill_Stewart

3

Pythonがインストールされている場合は、以下を使用できます。

for /f "delims=" %%A in ('python -c "import getpass; print(getpass.getpass('Enter the CVS password: '));"') do @set CVSPASS=%%A
echo PASS: %CVSPASS%

出力:

Enter the CVS password:
PASS: 123

2

私は私の考えでは実際に素晴らしいBlorgbeardの上記のソリューションを使用しました。次に、次のように拡張しました。

  1. Google for ansicon
  2. zipファイルとサンプルテキストファイルをダウンロードします。
  3. インストール(つまり、2つのファイルをsystem32にコピーします)

次のように使用します。

@echo off
ansicon -p
set /p pwd=Password:ESC[0;37;47m
echo ESC[0m

これにより、パスワード入力のためにコンソールが灰色から灰色に切り替わり、終了すると元に戻ります。ESCは実際には印刷できない文字である必要があります。これは、ダウンロードしたサンプルテキストファイル(メモ帳の左矢印のように表示されます)からバッチファイルにコピーできます。サンプルテキストファイルを使用して、すべての色の組み合わせのコードを見つけることができます。

マシンの管理者でない場合は、システム以外のディレクトリにファイルをインストールできる可能性があります。プログラムを呼び出してエスケープシーケンスを使用する前に、スクリプトのPATHにディレクトリを追加する必要があります。ほんの数ファイルの管理者以外の配布可能なパッケージが必要な場合、これはおそらく現在のディレクトリになる可能性もあります。


これをテストすることはできませんが、入力したパスワードが後でcmd履歴に表示されることを期待します。
Mark K Cowan、2014

@MarkKCowanそれがまさに何が起こるかです。
sjngm

1

非表示の文字に必要なものを呼び出すバッチファイルを作成してから、呼び出されるバッチファイルのショートカットを作成します。

右クリック

プロパティ

テキスト==黒

背景==黒

適用する

OK

よろしくお願いします!!!!!!!!


事前に環境をセットアップする必要があるため、バッチの状況で常に実用的であるとは限りませんが、優れた横向きのアプローチ。ああにハングアップ、多分これは動作します:stackoverflow.com/a/14447306/14420おそらくまたはstackoverflow.com/questions/4339649/...
マットウィルキー

1

更新:
clsを使用して入力を非表示にする代わりに、1行のみの新しいポップアップを作成する2つの新しいメソッドを追加しました。

欠点は、1つの方法(方法2)がレジストリにジャンクを残すということです。「適切な権限なしで実行した場合」と、もう1つの方法(方法3)は、スクリプトにジャンクを追加します。言うまでもなく、それは簡単に任意のtmpファイルに書き込んで削除できるので、代わりの方法を考え出そうとしました。

制限:パスワードは英数字のみで、他の文字は使用できません。

@echo off
if "%1"=="method%choice%" goto :method%choice%
::::::::::::::::::
::Your code here::
::::::::::::::::::
cls
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo ::::                   Batch script to prompt for password!                 :::
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:choice
echo.
echo 1. First method
echo.
echo 2. Second method
echo.
echo 3. Third method
echo.
set/p choice=Choose a method: 
if "%choice%" gtr "3" echo. & echo invalid option & echo. & pause & goto choice

call :vars
    set options= %num%%smAlph%%cpAlph%
    set pwdLen=6

if "%choice%" == "1" (
    set /p=Password: <nul 
    for /l %%i in (1,1,%pwdLen%) do call :password
) else (
    start /wait cmd /c call "%~f0" method%choice%
    )

call :result%choice%


::just to see if it worked!
echo.
echo The Password you entered is: "%pwd%"&pause>nul

::::::::::::::::::
::More code here::
::::::::::::::::::
exit /b





:vars
set num=1234567890
set smAlph=abcdefghijklmnopqrstuvwxyz
set cpAlph=ABCDEFGHIJKLMNOPQRSTUVWXYZ
    set pwd=
goto :EOF


:method2
call :popUp
setx result %pwd% >nul
goto :EOF

:method3
call :popUp
    >> "%~f0" echo.
    >> "%~f0" echo :result%choice%
    >> "%~f0" echo set pwd=%pwd%
goto :EOF

:popUp
title Password
mode con lines=1 cols=30
color 5a
set /p=Password: <nul
for /l %%i in (1,1,%pwdLen%) do call :password
goto :EOF

:password
:: If you don't want case sensative remove "/cs" but remember to remove %cpAlph% from the %options%
choice /c %options% /n /cs >nul
    call SET pwd=%pwd%%%options:~%errorlevel%,1%%
    set /p =*<nul
GOTO :EOF


:result2
for /f "tokens=3" %%a in ('reg query hkcu\environment /v result') do set pwd=%%a
    setx result "" >nul
    reg delete hkcu\environment /v result /f >nul 2>&1
:result1
goto :EOF   
::You can delete from here whenever you want.

更新:サハディーの投稿が完璧であること わかり、「ポップアップ」の癖を追加しました。

@Echo Off  
  SetLocal EnableDelayedExpansion
  if "%1"==":HInput" goto :HInput
  set r=r%random%
  start /wait cmd /c call "%~f0" :HInput

For /f "tokens=2,13 delims=, " %%a in (
    'tasklist /v /fo csv /fi "imagename eq cmd.exe"
    ^|findstr /v "Windows\\system32\\cmd.exe"
    ^|findstr "set /p=%r%"'
     ) do (
        set pid=%%a
        set Line=%%b
        set Line=!Line:%r%=!
        set Line=!Line:~,-2!
        )       
taskkill /pid %pid:"=%>nul
  goto :HIEnd


  :HInput
  SetLocal DisableDelayedExpansion
  title Password
  mode con lines=2 cols=30

Echo Enter your Code :
   Set "Line="
   For /F %%# In (
   '"Prompt;$H&For %%# in (1) Do Rem"'
   ) Do Set "BS=%%#"

  :HILoop
   Set "Key="
   For /F "delims=" %%# In (
   'Xcopy /W "%~f0" "%~f0" 2^>Nul'
   ) Do If Not Defined Key Set "Key=%%#"
   Set "Key=%Key:~-1%"
   SetLocal EnableDelayedExpansion
   If Not Defined Key start /min cmd /k mode con lines=1 cols=14 ^&set/p %r%!Line!=&exit
  If %BS%==^%Key% (Set /P "=%BS% %BS%" <Nul
   Set "Key="
   If Defined Line Set "Line=!Line:~0,-1!"
   ) Else Set /P "=*" <Nul
   If Not Defined Line (EndLocal &Set "Line=%Key%"
   ) Else For /F delims^=^ eol^= %%# In (
   "!Line!") Do EndLocal &Set "Line=%%#%Key%"
  Goto :HILoop

  :HIEnd
   Echo(
Echo Your code is :  "!Line!"
   Pause
   Goto :Eof

1

私はeditenv以前のeditv32/ editv64ユーティリティを置き換えるオープンソースプログラムを作成しました。

https://github.com/Bill-Stewart/editenv

--maskinput-m)オプション[*]は、あなたが(マスク)型指定された入力を非表示にすることができますし、(デフォルトの文字があり、設定可能な文字を持っています*)。例えば:

editenv -m -p "Password: " PWD

--prompt-p)オプションは、入力プロンプトを指定できます。上記はPassword:プロンプトを表示し、何かを入力するのを待ちます。入力した文字はと表示され*ます。Ctrl+を押すCを、プログラムが終了コード1223で終了します。

ダウンロードはこちら:

https://github.com/Bill-Stewart/editenv/releases

[*] --maskinput-m)オプションは安全でないことに注意してください-入力された文字列は、環境ではプレーンテキストとして入力されます。この機能は便宜上のものです。



-1
@echo off
color 0f
MODE CON COLS=132 LINES=50
:start
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: 
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%out%
SET show=*
:loop
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: %code%
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%code%%out%
SET show=%show%*
goto loop
:submit
cls
SET password=%code%
IF %password% EQU 0cZrocks! SET result=1
IF ELSE SET result=2
IF %result% EQU 1 echo password correct
IF %result% EQU 2 echo password incorrect
timeout /T 2 /NOBREAK >nul
cls
IF %result% EQU 1 goto end
IF ELSE goto start
:end

あなたはコードを説明せず、そのコードをコピーしただけです。画面を更新する必要があり、パスワードはx文字である必要があるため、これはそのための良い方法ではありません。
Anic17

-1

Blorgbeardが出ているのと同じように、別のオプションは次のようなものを使用することです:

SET /P pw=C:\^>

^エスケープし>て、パスワードプロンプトが標準のcmdコンソールプロンプトのようになるようにします。


1
質問は、パスワードプロンプトを非表示/偽装する方法ではなく、入力中にパスワードが表示されないようにすることです。したがって、これは質問に答えません(しようとします)。
ステファン

私がリンクした回答(執筆時点では13票)にも対応していません。これは一部のユーザーにとって有用な代替手段になる可能性があるため、私の答えはそれについてさらに詳しく説明しています(Blogbeardがリリースされたため、私にとってはそうでした)。(コメントとして追加しましたが、サイトでは許可されていません。)
nimbell

それは良い答えではありません。パスワードを隠したり隠したりしていない。良い解決策や答えが出たらコメントしてください。
Anic17

-3

私は、バッチファイルでパスワードをマスクする方法について、ネット上の不格好なソリューションをすべて読みました。hide.comソリューションを使用したものや、テキストと背景を同じ色にするものでさえもです。hide.comソリューションは適切に機能し、あまり安全ではありません。また、64ビットWindowsでは機能しません。とにかく、100%Microsoftユーティリティを使用して、方法があります!

まず、私の使い方を説明しましょう。Windowsに自動ログオンするワークステーションが約20台あります。彼らのデスクトップには、臨床アプリケーションへのショートカットが1つあります。マシンはロックされており、右クリックすることはできず、デスクトップ上の1つのショートカットにアクセスする以外に何もできません。自動ログユーザーアカウントをログオフせずに、技術者が一部のデバッグアプリケーションを起動し、Windowsエクスプローラを参照してログファイルを確認する必要がある場合があります。

これが私がしたことです。

希望どおりに実行しますが、私は2つのバッチファイルを、ロックダウンされたコンピューターがアクセスできるネットワーク共有に配置します。

私のソリューションは、Windowsの1つの主要コンポーネントであるrunasを利用しています。作成しようとしているrunas.batへのショートカットをクライアントに配置します。ちなみに、クライアントでは、見やすくするためにショートカットの名前を変更し、アイコンを変更しました。

2つのバッチファイルを作成する必要があります。

バッチファイルにrunas.batおよびDebug Support.batという名前を付けました

runas.batには、次のコードが含まれています。

cls
@echo off
TITLE CHECK CREDENTIALS 
goto menu

:menu
cls
echo.
echo           ....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           ....................................
echo.
@set /p un=What is your domain username? 
if "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto debugsupport
if not "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto noaccess
echo.
:debugsupport
"%SYSTEMROOT%\system32\runas" /netonly /user:PUT-YOUR-DOMAIN-NAME-HERE\%un% "\\PUT-YOUR-NETWORK-SHARE-PATH-HERE\Debug Support.bat"
@echo ACCESS GRANTED! LAUNCHING THE DEBUG UTILITIES....
@ping -n 4 127.0.0.1 > NUL
goto quit
:noaccess
cls
@echo.
@echo.
@echo.
@echo.
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@echo   \\                                   \\
@echo   \\    Insufficient privileges         \\  
@echo   \\                                    \\
@echo   \\      Call Cajun Wonder             \\
@echo   \\                                    \\
@echo   \\              At                    \\
@echo   \\                                    \\
@echo   \\        555-555-5555                \\
@echo   \\                                    \\
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@ping -n 4 127.0.0.1 > NUL
goto quit
@pause
:quit
@exit

アクセスを許可するすべてのユーザーに対して、「%un%」の場合と「%un%」ない場合の数を追加できます。@pingは、秒タイマーを作成するための私のクーナの方法です。

これで、最初のバッチファイルが処理されます。

Debug Support.batのコードは次のとおりです。

cls
@echo off
TITLE SUPPORT UTILITIES
goto menu

:menu
cls
@echo %username%
echo.
echo           .....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           .....................................
echo.
echo What do you want to do? 
echo.
echo [1]  Launch notepad
echo.

:choice
set /P C=[Option]? 
if "%C%"=="1" goto notepad
goto choice

:notepad
echo.
@echo starting notepad....
@ping -n 3 127.0.0.1 > NUL
start notepad
cls
goto menu

私はコーダーではなく、1年ほど前にバッチスクリプトの作成を始めたばかりです。バッチファイルでパスワードをマスクすることを発見したこのラウンド方法はかなり素晴らしいです!

私以外の誰かがそれを利用できるようになることを期待しています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.