Windowsスクリプト内のユーザーから認証資格情報を取得する必要がありますが、従来の「最初のGoogle結果」アプローチ:
SET /P USR=Username:
SET /P PWD=Password:
満足のいくものではないので、HTML の input type="password"に「相当する」ものがあるのではないかと考えていました。
コメントをお待ちしております。
Windowsスクリプト内のユーザーから認証資格情報を取得する必要がありますが、従来の「最初のGoogle結果」アプローチ:
SET /P USR=Username:
SET /P PWD=Password:
満足のいくものではないので、HTML の input type="password"に「相当する」ものがあるのではないかと考えていました。
コメントをお待ちしております。
これをチェックしてください
http://www.netikka.net/tsneti/info/tscmd052.htm
@echo off & setlocal enableextensions
:: Build a Visual Basic Script
set vbs_=%temp%\tmp$$$.vbs
set skip=
findstr "'%skip%VBS" "%~f0" > "%vbs_%"
::
:: Prompting without linefeed as in Item #15
echo.|set /p="Password: "
:: Run the script with Microsoft Windows Script Host Version 5.6
for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass1=%%a
::
::echo.
echo.|set /p="Retype : "
for /f "tokens=* delims=" %%a in ('cscript //nologo "%vbs_%"') do set MyPass2=%%a
::
:: Clean up
for %%f in ("%vbs_%") do if exist %%f del %%f
::
:: Demonstrate the result
echo.
if "%MyPass1%"=="%MyPass2%" (
echo The entered password was %MyPass1%
) else (
echo No match)
endlocal & goto :EOF
'
'The Visual Basic Script
Set WshPass = WScript.CreateObject("ScriptPW.Password") 'VBS
Password=WshPass.GetPassWord() 'VBS
WScript.Echo PassWord 'VBS
Windows で自由に利用できる別のツールを慎重に使用すると、次の 2 つのスクリプトで目的の作業を実行できます。
まず、GetPwd.cmd:
@echo off
:: GetPwd.cmd - Get password with no echo.
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i
echo.
:: This bit's just to prove we have the password.
echo %passwd%
次に、GetPwd.vbs:
' GetPwd.vbs - Get password with no echo then echo it. '
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
説明:
GetPwd.vbs は、単純にパスワード オブジェクトを使用してユーザーからパスワードを入力し、それを標準出力に出力します (次の段落では、ターミナルにパスワードが表示されない理由を説明します)。
GetPwd.cmd は少しトリッキーです (ただし、コマンド スクリプトは通常そうです)。
この"<nul: set /p passwd=Password: "
コマンドは、末尾に CR/LF を付けずにプロンプトを出力するだけです。これは、bash をエミュレートする卑劣な方法"echo -n"
です。passwd
副作用として空の文字列に設定され、入力を nul: デバイスから取得しているため、入力を待機しません。
ステートメントは最も"for /f "delims=" %%i in ('cscript /nologo GetPwd.vbs') do set passwd=%%i"
トリッキーなビットです。Microsoft の広告なしで vbscript を実行する/nologo
ため ( )、唯一の行出力はパスワード (vbscript から)"Wscript.StdOut.WriteLine strPassword"
です。
スペースを含む入力行をキャプチャするには、区切り文字を何も設定しない必要があります。そうしないと、最初の単語を取得するだけです。"for ... do set ..."
セットはpasswd
、vbscript からの実際のパスワード出力になります。
次に、空白行をエコーし (実際に"Password: "
は行を終了します)、パスワードをエコーして、それが機能することを確認できるようにします。
C:\Pax> GetPwd
Password:
this is my password
C:\Pax>
scriptpw.dll は XP および 2K3 で使用できますが、それ以降のバージョンであるとは限りません。
Vista およびおそらく Win7 の手順は以下のとおりです。試してみてください。
パスワードをマスクするために、スクリプトは ScriptPW COM オブジェクトを利用します。ScriptPW は、デフォルトで Windows XP および Windows 2003 にロードされます。Windows 2000 または Windows Vista を実行している場合は、XP システムまたは Windows 2003 システムのフォルダから Windows 2000のまたはフォルダに
scriptpw.dll
ファイルをコピーする必要があります。または Vista システム。DLL がコピーされたら、次のコマンドを実行して登録する必要があります。Windows\System32
Winnt\System32
Windows\System32
regsvr32 scriptpw.dll
Vista マシンで DLL を正常に登録するには、コマンド プロンプトを管理者として開く必要があります。これを行うには、[スタート] | [開始] をクリックします。すべてのプログラム | 付属品。次に、コマンド プロンプトのショートカットを右クリックし、[管理者として実行] を選択します。コマンド プロンプトが管理者として表示されると、コマンドを正常に実行し
regsvr32 scriptpw.dll
て DLL を登録できます。
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
2.HTA ポップアップを使用するパスワード送信者 。これは hybrit .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' >
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'></input>
<hr>
<button onclick='pipePass()'>Submit</button>
</body>
</html>
3.自己コンパイルされた .net ハイブリッド.Again として保存する必要があります.bat
。他のソリューションとは異なり、呼び出される小さな .exe ファイルを作成/コンパイルします (必要に応じて削除できます)。インストールされた .net フレームワークも必要ですが、それはむしろ問題ではありません:
@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal
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("*");
}
} while (key.Key != ConsoleKey.Enter);
Console.Error.WriteLine();
Console.WriteLine(pwd);
私たちはいつもこのようなことをしますが、パスワードをコマンドラインに入れて、バッチファイルの変数に渡します。
Cygwin をインストールできる場合は、デフォルトで bash シェルが取得されるため、次のコマンドが機能します。
read -s -p "パスワード: " PASSWORD
唯一の問題は、PASSWORD の値が bash シェルでのみ設定され、バッチ ファイルが参照できる環境変数として設定されていないことです (これは cygwin で別のことを意味するため、PWD を使用しないでください)。そのため、スクリプトを bash シェル スクリプトとして書き直す必要があります (コマンド プロンプトの制限を考えると、それほど難しくないかもしれません!)。
または、パスワードを cygwin からバッチ スクリプトに渡すこともできますが、これは、コマンド プロンプトの新しいインスタンスを実行することを意味します。
cmd /cyyourbatchfile.bat $PASSWORD
少し複雑で、満足のいくものではありません;)
画面にパスワードをエコーしたくないと思います。
ポップアップ ウィンドウが必要な場合は、たとえば VBScript を使用して、パスワード フィールドを表示する IE ウィンドウを表示できます。ここに例があります。
別の方法として、HTA (HTML アプリケーション) ファイルからスクリプトを呼び出すこともできます (「HTML アプリケーション (HTA) の紹介」を参照)。
よろしく、ディーボ
すべての種類のフォーマットされた入力に ReadFormattedLine サブルーチンを使用できます。たとえば、次のコマンドは、それぞれ 8 文字のユーザー名とパスワードを読み取り、画面にアスタリスクを表示し、Enter キーを押す必要なく自動的に続行します。
call :ReadFormattedLine USR="********" /M "Username: "
call :ReadFormattedLine PWD="********" /M "Password: "
または別の方法で:
call :ReadFormattedLine nameAndPass="******** / ********" /M "Enter Username / Password: "
前の例では、ユーザーがユーザー名を完了すると、サブルーチンはスラッシュを表示してパスワードを読み取ります。ユーザーが文字を削除すると、スラッシュも自動的に削除されます。
このサブルーチンは純粋な Batch で記述されているため、追加のプログラムは必要ありません。また、数字だけを読み取る、文字を大文字に変換するなど、いくつかのフォーマットされた入力操作が可能です。特定の形式の行を読み取るから ReadFormattedLine サブルーチンをダウンロードできます。
ConSetは、Frank P. Westlake によって作成された無料のツールです。これは、標準の Windows コマンドセットの拡張バージョンです。
ConSet.exe - cmd.exe 環境変数を表示、設定、または削除し、コンソール パラメータを変更し、浮動小数点演算を実行します。
これは標準の Windows コンソール アプリケーションではないため、このツールを使用するには、このツールをバッチ ファイルと共に配布するか、ツールをサーバー共有に保存して、バッチ ファイルがサーバー共有からこのツールを直接呼び出す必要があります。
ConSetは、環境変数に非表示の入力が割り当てられたパスワード文字列のプロンプトを非常に簡単にします。
ConSet.exe /PH "PWD=Password: "
パラメータを追加するH
と、ユーザー入力が非表示になります。
もう 1 つの方法は、スクリプトPowerShell
からコマンドを呼び出すことです。Batch
サービスのログオン アカウントを構成する例を次に示します。
$password = Read-Host "Enter password" -AsSecureString;
$decodedpassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password));
& "sc.exe" config THE_SERVICE_NAME obj= THE_ACCOUNT password= $decodedPassword;
ここで、THE_SERVICE_NAME は構成するサービスの名前で、THE_ACCOUNT はログオン アカウントです。
次に、次のようなバッチ スクリプトから使用できます。
call powershell -Command "$password = Read-Host "Enter password" -AsSecureString; $decodedpassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)); & "sc.exe" config THE_SERVICE_NAME obj= THE_ACCOUNT password= $decodedPassword;"
これは単に PowerShell.exe を呼び出して 3 つのコマンドを渡すだけです。
このアプローチの利点は、今日の Windows インストールの大部分に が含まれPowerShell
ているため、追加のプログラムやスクリプトが必要ないことです。欠点は、PowerShell
(私の例のように) 呼び出し内でパスワードを使用するか、環境変数に保存してからバッチ スクリプトから使用する必要があることです。前者の方が安全で簡単なので、私は前者を好みます。