VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 批处理教程 >
  • 关于批处理输入密码的问题

最近要写一个批处理来处理系统服务的账号和密码变更,需要涉及到密码的输入。但是貌似批处理是无法处理密码不明文显示的问题。不过相信广大码农的智慧还是无穷的,于是乎就开始百度。果不其然,找到了差不多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

 

      问题完美解决。并以此文记录,防止以后忘记。

 

出处:https://www.cnblogs.com/pengd/p/4213360.html


相关教程