關於批處理輸入密碼的問題


        最近要寫一個批處理來處理系統服務的賬號和密碼變更,需要涉及到密碼的輸入。但是貌似批處理是無法處理密碼不明文顯示的問題。不過相信廣大碼農的智慧還是無窮的,於是乎就開始百度。果不其然,找到了差不多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%

      運行結果如下:

      image

 

      問題完美解決。並以此文記錄,防止以后忘記。

 

文章已遷移到:http://www.izonso.com/forum.php


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM