Board logo

标题: [网络连接] 求助,如何给写好的bat加有效期验证 [打印本页]

作者: sditwzh    时间: 2022-10-14 13:49     标题: 求助,如何给写好的bat加有效期验证

想给写好的bat加个有效期远程验证,就是运行需要先验证是否在有效期内,在有效期内就继续运行,过期就提示过期不再继续执行。谁有好的方案,可付费。
利用txt文本截取字段和本地时间做比对这个方法试过了,但是容易出现问题。
不知还有没有其他的方法。
作者: Batcher    时间: 2022-10-14 16:39

回复 1# sditwzh


    请把你的代码发出来并说明一下具体啥问题
作者: sditwzh    时间: 2022-10-14 16:45

回复 2# Batcher


    没有代码,我是想找大神给写个,我写的那个利用txt那个不好用
作者: Batcher    时间: 2022-10-14 16:51

回复 3# sditwzh


    想看一下你是怎么对比的,以及如何在此基础上进一步优化。
作者: sditwzh    时间: 2022-10-14 17:00

本帖最后由 sditwzh 于 2022-10-17 17:25 编辑

回复 4# Batcher


@echo off

@mode con lines=28 cols=60

echo.

echo 正在验证软件授权信息,请稍候!

ping 127.1 -n 2 >nul

echo.
rem 截取第x行内容
set line=1
set "url=http://10.214.195.222/date.txt"
(echo;var http=new ActiveXObject^('Msxml2.XMLHTTP'^);
echo;http.open^('GET', "%url%", false^);
echo;http.send^(^);
echo;WSH.echo^(http.ResponseText^);
)>"%tmp%\j.j"
for /f "tokens=1* delims=:" %%a in ('cscript -nologo -e:jscript "%tmp%\j.j"^|findstr /n .*') do (
    if %%a equ %line% set name=%%b
)

set "name=%name:~0,6%"
echo;授权单位:%name%

echo.
rem 截取第x行第n个字符之后内容
set line=1
set index=14
set "url=http://10.214.195.222/date.txt"
(echo;var http=new ActiveXObject^('Msxml2.XMLHTTP'^);
echo;http.open^('GET', "%url%", false^);
echo;http.send^(^);
echo;WSH.echo^(http.ResponseText^);
)>"%tmp%\j.j"
for /f "tokens=1* delims=:" %%a in ('cscript -nologo -e:jscript "%tmp%\j.j"^|findstr /n .*') do (
    if %%a equ %line% set serverdate=%%b
)
call set "serverdate=%%serverdate:~%index%%%"
>"%tmp%\v.v" echo;WSH.echo Year(date) ^& right("0" ^& Month(date),2) ^& right("0" ^& Day(date),2)
for /f %%a in ('cscript -nologo -e:vbscript "%tmp%\v.v"') do set localdate=%%a
if "%serverdate%" leq "%localdate%" (
echo;您的授权已过期。
echo.
echo 请您在授权期内使用&goto :end)

echo 您的授权在有效期内可以正常使用。

ping 127.1 -n 3 >nul

echo.

echo 正在启动

echo.

start  D:\dev_tool\nginx-1.9.9\nginx.exe

ping 127.1 -n 5 >nul
exit
:end
echo.
pause
exit


这个方法有时候出现第一次可以读取txt信息,但是后面就算把txt信息改了,再次运行还是能执行,无论怎么改读取到的信息都是第一次的,所以想看看又没有别的方式,或者建立一个mdb数据库从数据库读取。再或者有其他方法。还有能不能利用读取文件名称的方式来实现,例如123文件夹下有1个文件夹一个txt,文件夹名称是客户名称,txt文件名是对应的授权日期。这样再取这个txt文件名和电脑时间做对比。
作者: sditwzh    时间: 2022-10-16 11:20

回复 4# Batcher


    请大神看看给个好的解决方案。可以付费
作者: hlzj88    时间: 2022-10-16 16:02

  1. @echo off&&setlocal enabledelayedexpansion
  2. set qx=20221015
  3. wget --user-agent="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3" --no-check-certificate -c -q -N -t 0 -O 1.yyy "www.bathome.net/thread-64050-1-1.html"
  4. for /f "tokens=2 delims= " %%i in ('findstr /i "GMT+8" 1.yyy') do set "rq=%%i"
  5. del /q *.yyy>nul 2>nul
  6. set rq=!rq:-=!
  7. if !rq! leq %qx% (goto bq) else (echo 程序使用到期,不再运行&&ping /n 5 127.1>nul&&exit)
  8. :bq
  9. echo 欢迎使用
  10. pause
复制代码
仅写了验证时间的部分,当设定期限QX后,如果当前日期小于等于期限是允许执行的。缺点,1依靠网络时间(本例采用本论坛时间)2需要外置程序 wget,根据系统是多少位,需要不同版本。
wget 地址 http://bcn.bathome.net/s/tool/index.html?key=wget
如果采用,希望你下功夫另找一个国家级省级这种会多年在线的带服务器时间的网页地址,替换本例中的地址。
作者: hlzj88    时间: 2022-10-16 18:33

  1. @echo off&&setlocal enabledelayedexpansion
  2. del /q *a1.*
  3. set qx=20221017
  4. wget --user-agent="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3" --no-check-certificate -c -q -N -t 0 -O a1.html "http://www.weather.com.cn/#404"
  5. findstr /i "utf" a1.html&&iconv -c -f utf-8 -t GBK a1.html>>gba1.html
  6. findstr /i "padding" gba1.html|findstr /i "%date:~0,4%">a1.txt
  7. cls
  8. for /f "tokens=1,2* delims=^< " %%i in (a1.txt) do (
  9. set "sj=%%i"
  10. set sj=!sj: =!
  11. set sj=!sj:年=!
  12. set sj=!sj:月=!
  13. set sj=!sj:日=!
  14. )
  15. del /q *a1.*>nul 2>nul
  16. if !rq! leq %qx% (goto bq) else (echo 程序使用到期,不再运行&&ping /n 5 127.1>nul&&exit)
  17. :bq
  18. echo 欢迎使用
  19. pause
复制代码
采用天气网的网页数据,因为要转码,又多采用了iconv程序http://bcn.bathome.net/s/tool/index.html?key=iconv
作者: sditwzh    时间: 2022-10-17 13:46

回复 8# hlzj88


    不过问题是给客户执行的bat是固定死的,我这边要能控制期限,我看了下你的代码,那是和网络时间进行比对,这个比对内容我没有办法控制,就这么说吧,目的是客户的bat是写好的,我这边可以通过修改一些东西来控制这个bat来使用。通过网络校对是必须的,但是我没有好的方案,只想到这个利用txt文本。
作者: holley    时间: 2022-10-17 17:08

回复 9# sditwzh
我记得文件变量后面直接加_t是不是就是获取此文件的修改时间?再以此为基础判断是否授权过期?
作者: Batcher    时间: 2022-10-17 17:16

回复 9# sditwzh


    如果客户也懂点BAT,那么他只需要修改你代码里面的一个if语句就能跳过验证了。
作者: sditwzh    时间: 2022-10-17 17:19

回复 11# Batcher


    我给客户的不是bat源文件,我是转换到exe格式的
作者: sditwzh    时间: 2022-10-17 17:20

本帖最后由 sditwzh 于 2022-10-17 17:22 编辑

回复 10# holley


    你的意思是利用文件修改时间和当前时间做对比?那也不行,我还有一段代码是用来读取名称呢,就是说先是读取名称,读取到后再去验证时间是否到期。
作者: hlzj88    时间: 2022-10-17 19:12

回复 9# sditwzh

按你的要求,你需要两个日期,1 你控制期限的日期,2不是客户电脑时间的日期。对于第一个日期,如果局域网可能好办点,在ftp,或你共享的文件夹里放txt供bat来下载获得时间。如果没这条件,可以在网络开博客利用一个固定网页来提供这两个时间。当然博客的该网页内容是要允许反复编辑的。我没玩过博客,不了解。总之,你需要一个可以提供时间的地址。第2个问题在上面选天气网已经考虑到长期需要的情况,已经可以解决。但是不是绝对可靠。
作者: sditwzh    时间: 2022-10-18 13:54

回复 14# hlzj88


    我现在就是用的你说的这种读取txt里面的时间来控制,但是不稳定,你看我上面的描述,有时候你就算改了txt内容,bat显示的还是修改前的。不知道什么情况
作者: holley    时间: 2022-10-18 15:24

本帖最后由 holley 于 2022-10-18 15:57 编辑

回复 13# sditwzh
我说的意思就是单纯以服务器上某一个或两个文件的修改时间作为基准,一般不去动它,只有此文件的内容发生变化且被保存,才会更新修改时间(甚至有工具可以直接修改‘修改时间’)。再定义一个授权日期,先校验文件名再确认你的授权日期在这两个文件的修改时间之内才能正常运行bat。想让bat过期,只需要自己控制服务器上文件的修改时间即可。或者定义授权日期完全等于服务器上此文件的修改时间,你可以随时控制它是否过期。
闲的,简单试了一下:
  1. @echo off
  2. set file_1="\\192.168.87.128\A\a.bat"
  3. set file_2="\\192.168.87.128\A\b.bat"
  4. call :check %file_1% %file_2%
  5. pause>nul&exit
  6. :your
  7. echo 调用客户需要运行的文件或命令
  8. :check
  9. if "%~t1"=="%~t2" (call :your) else echo 此程序授权已过期!
复制代码

作者: sditwzh    时间: 2022-10-19 15:52

回复 16# holley


    你这个是可以不过不是我说的那个思路,本地电脑时间是固定的,但是云端的时间是可变的。
作者: holley    时间: 2022-10-20 14:26

回复 17# sditwzh
最要是本地电脑时间也是可调的,属于不可控的变量。发散想了想:你倒是可以定义一个授权周期,跟本地电脑时间做对比,20天内有效之类的。
作者: hlzj88    时间: 2022-10-21 20:46

回复 17# sditwzh
其实,只需要在bat内指定固定时间执行一个循环,重新读取指定地址的时间,比如限定为半夜。有的人电脑是永不关机的,没有这个循环,他是永不过期的。
作者: sditwzh    时间: 2022-10-22 15:10

回复 19# hlzj88


    我的目的就是我这边边有个可控制的时间,对比的话可以是获取电脑时间,完全可以忽略通过修改电脑时间来达到永久有效的目的,因为启动的软件也是要获取电脑时间的,如果修改了时间那么软件的时间也不对,对于业务也有影响。
只不过我现在没有好的方案,用txt这个不知道为啥容易出问题。
作者: Roxx    时间: 2023-5-30 14:16

  1. if /i %date:~0,10% leq 2023/10/01 (goto :b)
  2. echo 程序使用到期
  3. pause
  4. :b
  5. echo 欢迎使用
  6. pause
复制代码
本地时间验证




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2