最近要寫一個批處理來處理系統服務的賬號和密碼變更,需要涉及到密碼的輸入。但是貌似批處理是無法處理密碼不明文顯示的問題。不過相信廣大碼農的智慧還是無窮的,於是乎就開始百度。果不其然,找到了差不多3,4種方法。每一種據說都是灰常犀利的,但是很悲劇的是,我這邊一種都沒有成功執行過。我總結了下,網上的方法大約如下:
方法一:使用ASCODE
1: @echo off
2: chcp 437 >nul
3: graftabl 936 >nul
4: >"%temp%\in.com" echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5x
5: set /p=請輸入密碼:<nul
6: for /f "tokens=*" %%a in ('"%temp%\in.com"') do (
7: set "InputPass=%%a"
8: )
9: echo %InputPass%
10: pause
能想出段代碼的簡直是個天才,它是將in.com 程序的所有的代碼全部分布於ASCII碼表的可顯示字符范圍中。
但是這段網上流傳很犀利的代碼,也解決不了我的問題,因為它與64位win7的環境不兼容。
方法二:
1: @echo off
2: :main
3: title [請輸入密碼]
4: call :HidePass %0 pwd
5: if /i "%pwd%"=="ulptfstx" goto :運行
6: goto main
7: :運行
8: title 密碼輸入正確
9: start iexplore.exe
10: pause
11: exit /b
12: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
13: :HidePass
14: ::請刪除本文件中的空行,不要更改注釋。
15: pushd %tmp%&set lines=0&set f=%1&set p=%2
16: for /f "usebackq delims=" %%a in (%f%) do if "%%a" neq "::for debug:" (set/a lines+=1) else (goto :w)
17: :w
18: set/a lines+=1
19: more +%lines% %f%|debug>nul&move t "t.com"
20: cls
21: t
22: echo exit|cmd /kprompt d20:0 20$_q$_|debug>t
23: for /f "skip=2 tokens=*" %%a in (t) do set t=%%a&call set t=%%t:~61,16%%&call set s=%%s%%%%t%%
24: for /f "skip=2 tokens=2" %%a in (t) do set/a l=0x%%a&goto :t
25: :t
26: call set %p%=%%s:~1,%l%%%&set "lines="&set "f="&set "p="&set "t="&set "s="&set "l="
27: del t t.com&popd&>nul (chcp 437&graftabl 936)&goto :eof
28: ::for debug:
29: e0100 BB 00 B8 8E C3 BF 00 00 BE 00 00 B4 00 CD 16 80
30: e0110 FC 0E 75 0E 83 FE 00 74 F2 4E 4F 4F 26 C6 05 20
31: e0120 EB E9 80 FC 1C 74 1C 3C 20 72 E0 26 C6 05 2A 8C
32: e0130 C2 BB 00 00 8E C3 26 88 84 01 02 8E C2 83 C7 02
33: e0140 46 EB C8 BB 00 00 8E C3 8B C6 26 A2 00 02 B8 00
34: e0150 4C CD 21
35: rcx
36: 53
37: n t
38: w
39: q
這段代碼不知道大家能不能跑起來,反正我是沒辦法運行的,它會提示debug不是內部或外部的命令。所以我也放棄了。
方法三:利用runas實現輸入密碼時的密碼隱藏
1: @echo off
2: echo 請輸入密碼:
3: call :login 123456
4: if %login% (echo 正確) else (echo 錯誤)
5: pause
6: exit /b
7:
8: :login
9: net user %1824 %1 /add >nul
10: runas /user:%1824 hh >nul
11: if errorlevel 1 (set login=1==2) else (set login=1==1)
12: net user %1824 /del >nul
大致就是在系統中創建一個用戶,然后在輸入密碼的時候記錄密碼,最后刪除用戶。當我運行這段腳本的時候,被殺毒軟件各種阻止,最后還被提示無權訪問。所以也只好作罷。
方法四:BAT動態生成VBS並調用
1: @echo off
2: >"%temp%\GetPwd.vbs" echo WScript.Echo CreateObject("ScriptPW.PassWord").GetPwdWord
3: set /p=請輸入密碼:<nul
4: for /f %%a in ('cscript //nologo "%temp%\GetPwd.vbs"') do (
5: set "InputPass=%%a"
6: )
7: echo %InputPass%
8: pause
這段腳本最終我也沒跑起來,當我運行的時候提示無法創建“ScriptPW.PassWord”對象,后來在一個網站上看到,是說需要注冊ScriptPW.dll組件,並且這個主鍵只在xp和2003的系統中才有,在win7和2008的系統里面被去除了。據說將這個主鍵拷貝到win7系統中還是可以用的,不過,既然只是一個簡單批處理腳本,就不需要對客戶的系統有這種要求,所以這種方法也被放棄了。
找了一整天大概也就找到了這幾種方法,本來都已經絕望了,但沒辦法,任務還是要完成滴,只能硬着頭皮逛一些鳥語網站,終於在一個網站的小角落里找到了一個解決批處理輸入密碼的方法,並親測可用。代碼也相當簡潔。
1: @echo off
2: set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
3: $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
4: [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
5: for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
6: echo %password%
運行結果如下:
問題完美解決。並以此文記錄,防止以后忘記。
文章已遷移到:http://www.izonso.com/forum.php

