我想让这段代码要求输入10秒后超时的密码,如果你写了正确的密码,它会转到:哇但是如果它不正确它只是继续代码。 (代码只是一个例子)
@ECHO OFF
TIMEOUT /t 10>nul
exit
:wow
echo now this is fun!
pause
exit
答案 0 :(得分:1)
批处理脚本,因为它们生活在纯文本文件的世界中,不太有利于存储和匹配密码。毕竟,运行脚本的人可以在记事本中轻松打开它并查看预期的密码。那不是很讨厌,现在,是吗?
这些批量密码问题会不时出现,脚本中的硬编码密码总是让我烦恼。那么,对于更改,我们如何使用MD5哈希来模糊密码? Windows中没有内置的简单命令可以实现这一点,但它可以通过一个(公认的复杂的)PowerShell单行程来完成。
将此帮助程序脚本另存为md5sum.bat:
@echo off
setlocal
if "%~1"=="" goto :EOF
powershell "[Security.Cryptography.HashAlgorithm]::Create('MD5').ComputeHash([Text.Encoding]::UTF8.GetBytes('%~1')) | %%{write-host -n $_.tostring('x2')}"
然后用它来找到你想要的密码的MD5哈希:
md5sum.bat "password"
结果将输出
5f4dcc3b5aa765d61d8327deb882cf99
您现在可以硬编码5f4dcc3b5aa765d61d8327deb882cf99
。
现在有趣的是。您也可以从Powershell借用来模糊用户条目,如下所示:
@echo off
setlocal
<NUL set /P "=Password? "
set "psCommand=powershell -command "$p=read-host -AsSecureString;^
$m=[Runtime.InteropServices.Marshal];$m::PtrToStringAuto($m::SecureStringToBSTR($p))""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set "pass=%%p"
setlocal enabledelayedexpansion
echo You entered !pass!
endlocal
结合使用这两种方法,您可以检查用户输入的密码是否与硬编码到脚本中的哈希匹配。
@echo off
setlocal
<NUL set /P "=Password? "
set "psCommand=powershell "$p=read-host -AsSecureString;^
$m=[Runtime.InteropServices.Marshal];$x=$m::PtrToStringAuto($m::SecureStringToBSTR($p));^
[Security.Cryptography.HashAlgorithm]::Create('MD5').ComputeHash([Text.Encoding]::UTF8.GetBytes($x)) ^| %%{write-host -n $_.tostring('x2')}""
for /f "usebackq delims=" %%I in (`%psCommand%`) do (
if "%%~I"=="5f4dcc3b5aa765d61d8327deb882cf99" goto :match
)
echo Nope.
goto :EOF
:match
echo w00!
瞧!现在您可以期望用户输入password
但用户无法通过在记事本中打开password
是正确的密码来轻松查看。很酷,嗯?
回到原来的问题,你可以在10秒后完成超时,你必须要有点创意。一种解决方案是在后台启动一个等待10秒的帮助程序脚本,然后杀死所有powershell.exe
个任务。这可能会干扰你可能运行的其他类似功能 - 但是说实话。鉴于问题的基本性质,我认为可以安全地假设在这种情况下不会出现问题。
我会这样做:
@echo off
setlocal
if "%~1"=="helper" goto helper
start /b "" "%~f0" helper
<NUL set /P "=Password? "
set "psCommand=powershell "$p=read-host -AsSecureString;^
$m=[Runtime.InteropServices.Marshal];$x=$m::PtrToStringAuto($m::SecureStringToBSTR($p));^
[Security.Cryptography.HashAlgorithm]::Create('MD5').ComputeHash([Text.Encoding]::UTF8.GetBytes($x)) ^| %%{write-host -n $_.tostring('x2')}""
for /f "usebackq delims=" %%I in (`%psCommand%`) do (
waitfor /s %computername% /si PasswordEntered >NUL 2>NUL
if "%%~I"=="5f4dcc3b5aa765d61d8327deb882cf99" goto :match
)
echo Nope.
goto :EOF
:match
echo w00!
goto :EOF
:: // END MAIN RUNTIME
:helper
>NUL 2>NUL (
title Enter password.
waitfor PasswordEntered /t 10 || taskkill /im "powershell.exe" /f
)
exit
如果您不想taskkill
Powershell,可以make read-host time out,但我会将其作为读者的练习。
答案 1 :(得分:0)
您可以使用密码提示启动VBS
文件。
http://www.robvanderwoude.com/vbstech_ui_password.php
上面的链接指向带有密码提示脚本的页面。您可以添加等待10秒然后关闭的超时。