-
关于批处理输入密码的问题
最近要写一个批处理来处理系统服务的账号和密码变更,需要涉及到密码的输入。但是貌似批处理是无法处理密码不明文显示的问题。不过相信广大码农的智慧还是无穷的,于是乎就开始百度。果不其然,找到了差不多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%
运行结果如下:
问题完美解决。并以此文记录,防止以后忘记。
出处:https://www.cnblogs.com/pengd/p/4213360.html