# WindowsScript

# Flag

  • JScriptVBScript同属于官方支持的Windows Script,这俩脚本都需要依赖于特定的宿主(Host)才能执行, JavaScript浏览器环境之外,还可以运行在Windows Script Host中。
  • Windows Script Host是一个language-independent的脚本宿主环境,主要用于执行Windows管理任务
  • Windows脚本宿主有两个版本:
    • 一个基于Windows的版本(WScript.exe (opens new window)) ,它提供用于设置脚本属性的属性表;运行以vbs为后缀的文件
    • 一个基于命令提示符的版本(CScript.exe (opens new window) 直接执行可查看帮助),它提供命令行。用于设置脚本属性的开关。
      • //E:engine 使用执行脚本的引擎有:VBScriptJScript

# 系统环境变量

环境变量 作用
%ALLUSERSPROFILE% 指所有用户的用户目录,通常是C:/ProgramData
%APPDATA% 指当前用户的Application Data目录,通常是C:/Users/当前用户名/AppData/Roaming
%CD% 列出当前目录。
%CLIENTNAME% 列出联接到终端服务会话时客户端的NETBIOS名。
%CMDCMDLINE% 列出启动当前cmd.exe所使用的命令行。
%CMDEXTVERSION% 命令出当前命令处理程序扩展版本号。
%CommonProgramFiles% 指公用文件(Common Files)目录, 通常是C:/Program Files/Common Files
%COMMONPROGRAMFILES(x86)% C:\Program Files (x86)\Common Files
%COMPUTERNAME% 列出了计算机名。
%COMSPEC% 列出了可执行命令外壳(命令处理程序)的路径。
%DATE% 列出当前日期。
%ERRORLEVEL% 列出了最近使用的命令的错误代码。
%HOMEDRIVE% 同%SYSTEMDRIVE%
%HOMEDRIVE%%HOMEPATH% 同%USERPROFILE%
%HOMEPATH% 同%USERPROFILE%
%HOMESHARE% 列出用户共享主目录的网络路径。
%LOCALAPPDATA% C:\Users\用户名\AppData\Local
%LOGONSERVER% 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 计算机上运行的处理器数目。
%OS% 用户工作站所用的操作系统。
%PATH% 路径环境变量。
%PATHEXT% 列出操作系统认为可被执行的文件扩展名,通常为 .com、 .exe、.bat 或 .cmd
%PROCESSOR_ARCHITECTURE% 用户工作站使用的处理器类型。
%PROCESSOR_IDENTFIER% 列出了处理器的描述。
%PROCESSOR_LEVEL% 列出了计算机的处理器的型号。
%PROCESSOR_REVISION% 列出了处理器的修订号。
%PROGRAMDATA% C:\ProgramData
%ProgramFiles% 指Program Files的路径,通常是C:/Program Files
%PROGRAMFILES(X86)% C:\Program Files (x86)
%PROMPT% 列出了当前命令解释器的命令提示设置。
%PUBLIC% C:\Users\Public
%RANDOM% 列出界于0 和 32767之间的随机十进制数。
%SESSIONNAME% 列出连接到终端服务会话时的连接和会话名。
%SYSTEM% C':\WINDOWS\SYSTEM32
%SYSTEMDRIVE% 系统所在的本地驱动器(例如,c:)。
%SYSTEMROOT% 指Windows系统所在的目录,通常是C:/Windows
%TEMP% 指当前用户的临时文件目录,通常是C:/Users/当前用户名/AppData/Local/Temp
%TIME% 列出当前时间。
%TMP% 同%TEMP%
%USERDOMAIN% 列出了包含用户帐号的域的名字。
%USERNAME% 列出当前登录的用户的名字。
%USERPROFILE% 指当前帐户的用户目录通常是C:/Users/当前用户名
%WINDIR% 同%SYSTEMROOT%

# WScript对象

所有的Wscript对象都存放在WSHOM.ocx文件中

# WScript对象的属性

属性 返回值类型 说明
Application Object 返回 IHost_Class 对象(Wscript 对象)。
Arguments IArguments_Class 返回 WshArguments 对象(参数集)。
BuildVersion Long 返回 Windows 脚本宿主的内部版本。
FullName String 返回宿主可执行文件(CScript.exe 或 WScript.exe)的全路径。
Interactive Boolean 设置或确定脚本模式。
Name String WScript 对象(宿主可执行文件)的名称。
Path String 返回包含宿主可执行文件(CScript.exe 或 WScript.exe)的路径名称。
ScriptFullName String 返回当前运行脚本的完整路径。
ScriptName String 返回当前运行脚本的文件名。
StdIn TextStream 显示当前脚本的输入流。
StdErr TextStream 显示当前脚本的错误输出流。Write输出,WriteLine换行输出
StdOut TextStream 显示当前脚本的输出流。Write输出,WriteLine换行输出
Timeout Long 超时设定秒:允许脚本运行的最长时间。
Version String 返回 Windows 脚本宿主的版本。

# WScript对象的方法

方法 参数 返回值 说明
ConnectObject (Object As Object, Prefix As String) 将对象的事件源连接到具有给定前缀的函数。
CreateObject (ProgID As String, [Prefix As String]) Object 创建对象。
DisconnectObject (Object As Object) 断开已连接对象的事件源的连接。
Echo (ParamArray pArgs() As Variant) 将文本输出到消息框中或命令控制台窗口。
GetObject (Pathname As String, [ProgID As String], [Prefix As String]) Object 检索现有的对象或从文件中创建新对象。
Quit ([ExitCode As Long]) 强制脚本停止执行。
Sleep (Time As Long) 在指定的时间长度内将脚本执行挂起,然后继续执行。

# 常用组件对象

所有对象都可通过Power Shell命令查看属性和方法New-Object -ComObject "对象名称" | Get-Member, 获取本机所有COM组件对象脚本 Get-COM-Objects.bat

都在注册表HKEY_CLASSES_ROOT注册表项中,正常情况下项中带有CLSID键的是脚本可创建的

对象 说明
WScript.Shell 脚本外壳
Wscript.NetWork 提供网络连接和远程打印机管理的函数。
AspSmartUpload.SmartUpload
CDO.Configuration
CDONTS.NewMail 邮件发送的组件
Huang.UploadFile
InternetExplorer.application
JMail.message 邮件发送的组件
MSWC.AdRotator
MSWC.BrowserType
MSWC.NextLink
Shell.Application Windows外壳
SQLOLE.SQLServer
WSHController
System.IO.StringWriter
Registry 注册表
ADODB对象 说明
ADODB.Command
ADODB.Connection 提供数据库连接对象
ADODB.Error
ADODB.Parameter
ADODB.Record
ADODB.Recordset 提供数据库返回结果集对象
ADODB.Stream
ADOMD.Catalog
ADOMD.Cellset
ADOX.Catalog 包含描述数据源模式目录的集合
ADOX.Column 表示表、索引或关键字的列
ADOX.Group 表示在安全数据库内有访问权限的组帐号
ADOX.Index 表示数据库表中的索引
ADOX.Key 表示数据库表中的主关键字、外部关键字或唯一关键字
ADOX.Procedure 表示存储的过程
ADOX.Table 表示数据库表,包括列、索引和关键字
ADOX.User 表示在安全数据库内具有访问权限的用户帐号
ADOX.View 表示记录或虚拟表的过滤集
office对象 说明
Word.Application office
Word.Document
Excel.Application 提供EXCEL操作对象
Excel.Chart
Excel.Sheet
Outlook.Application office
PowerPoint.Application office
MSGraph.Application office
WIA对象 说明
WIA.ImageFile 图像处理组件:加载图片
WIA.ImageProcess 图像处理组件:转换图片格式
WIA.Rational
WIA.Vector

所有Scripting对象都存放在SCRRUN.DLL文件中

Scripting对象 说明
Scripting.Dictionary 用来返回存放键值对的字典对象,读取DOS环境变量,读取链接中的设置
Scripting.Encoder 编码
Scripting.FileSystemObject 提供一整套文件系统操作函数
Scripting.Signer 签名
Collections对象 说明
System.Collections.ArrayList 包含动态数组的添加元素、删除元素、遍历、统计元素个数、清空
System.Collections.Hashtable
System.Collections.Queue 包含队列的添加元素(入队)、删除元素(出队)、遍历、统计元素个数、清空
System.Collections.SortedList
System.Collections.Stack 包含堆栈的添加元素(压栈)、删除元素(出栈)、遍历、统计元素个数、清空

# HTTP

微软提供了二套API:WinINet, WinHTTP(分别封装于system32目录下的wininet.dllwinhttp.dll内) 二者主要区别在于后者更为安全和稳定,可以说WinHTTPWinINet的升级版

XMLHttpRequest是基于WinInet封装的,而WinHttpRequestServerXMLHTTPRequest则是基于WinHTTP封装的 稳定性属XMLHttpRequest为最差,封装成COM形式主要是为了方便jsvbs等脚本的调用

XMLRequest成员参考缺点:和浏览器挂钩,大多情况下会共享cookiessession、不支持单独设置代理。 优点:和浏览器挂钩,大多情况下会共享cookiessession

ServerXMLHTTP成员参考缺点:系统没有对应dll的情况下程序需要外挂一个dll文件。优点:脱离浏览器,使用代理方便

WinHttpRequest成员参考缺点:暂无。优点:脱离浏览器,使用代理方便, WinHttp.WinHttpRequest.5.1msxml4.0的底层对象,也就是说XMLHTTPServerXMLHTTP也是在它的基础上封装而来

# 图像处理

WIA全称:WindowsImageAcquisition,自动化层是一个功能齐全的图像处理组件,可提供端到端的图像处理功能。 WIA自动化层可以轻松地从数码相机,扫描仪或网络摄像头获取图像,以及旋转,缩放和注释图像文件。 WIA Automation Layer取代了Windows Image Acquisition(WIA)1.0提供的WIA脚本模型。

New-Object -ComObject "WIA.ImageFile" | Get-Member

New-Object -ComObject "WIA.ImageProcess" | Get-Member

# 操作文件

Scripting.FileSystemObject对象提供的功能:New-Object -ComObject "Scripting.FileSystemObject" | Get-Member

对象和集合

对象/集合 描述
Drive 包含储存设备的信息,包括硬盘、光驱、ram盘、网络驱动器
Drives 提供一个物理和逻辑驱动器的列表
File 检查和处理文件
Files 提供包含在文件夹内的所有文件的列表
Folder 检查和处理文件夹
Folders 提供在 Folder 内的所有文件夹的列表
TextStream 对象。用来读写文本文件。

注意:TextStream对文件只可以从上往下读取,指针无法任意定位,也无法往回走。

  • fso.OpenTextFile(path,[mode,create,encoding])
    • mode 模式,缺省为只读方式打开
      • ForReading=1 以只读方式打开
      • ForWriting=2 以读写方式打开
      • ForAppending=8 以附加方式打开
    • create 不存在时是否创建缺省为否,即不创建文件
    • encoding 何种方式打开,缺省以ASCII方式
      • TristateUseDefault=-2 以系统默认方式打开
      • TristateTrue=-1Unicode方式打开
      • TristateFalse=0ASCII方式打开
  • fso.CreateTextFile(path,[overrwite,unicode])
    • overrwite 是否覆盖,缺省为是
    • unicode 是否以Unicode方式创建,缺省为false,即以ASCII方式创建

# Shell

  • Wscript.Shell对象提供的功能:New-Object -ComObject "Wscript.Shell" | Get-Member
  • Shell.Application对象提供的功能:New-Object -ComObject "Shell.Application" | Get-Member
  • Run Exec 执行cmd命令,同Shell.ApplicationShellExecute (opens new window)
  • CreateShortcut 创建快捷方式
  • SpecialFolders 访问Windowsshell文件夹
  • Environment 操作环境变量
  • RegRead 从注册表中返回指定的键或值
  • RegWrite 在注册表中设置指定的键或值
  • RegDelete 从注册表中删除指定的键或值
  • SendKeys 模拟按键
  • Popup 显示包含指定消息的消息弹出窗口
  • ExpandEnvironmentStrings 返回环境变量的扩展值
    • ExpandEnvironmentStrings("%USERNAME%") 获取用户名
    • ExpandEnvironmentStrings("%ComputerName%") 获取计算机名

# 执行命令

Run

执行命令完成后返回值是一个整数,就是0成功或1失败两个状态。

int Run(string, Variant, Variant)第二个是cmd窗口的风格,第三个是否等待执行完成。

窗口风格 说明
0 隐藏一个窗口并激活另一个窗口。
1 如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。第一次显示该窗口时,应用程序应指定此标志。
2 激活窗口并将其显示为最小化窗口。
3 激活窗口并将其显示为最大化窗口。
4 按最近的窗口大小和位置显示窗口。活动窗口保持活动状态。
5 激活窗口并按当前的大小和位置显示它。
6 最小化指定的窗口,并按照Z顺序激活下一个顶部窗口。
7 将窗口显示为最小化窗口。活动窗口保持活动状态。
8 将窗口显示为当前状态。活动窗口保持活动状态。
9 如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。还原最小化窗口时,应用程序应指定此标志。
10 根据启动应用程序的程序状态来设置显示状态

Exec

返回值是一个对象,从返回对象中可以获得控制台输出信息和控制台错误信息,即StdOutStdErr 属性等。

  • Exec类具有属性ExitCodeProcessIDStatusStdErrStdInStdOut以及一个函数Terminate
    • Status属性具有三个值:0为正在执行,1为完成,2为失败
    • 获取输出信息:StdOut.ReadAll()

Shell.Application运行文件的5种方法

Set objShellApp = CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace("c:/")
' 方法1
objFolder.Items().item("demo.exe").invokeverb
' 方法2
objFolder.Items().item("demo.exe").InvokeVerbEx
' 方法3
objShellApp.Open("C:/demo.exe")
' 方法4,可以加参数和设置参数值
objShellApp.ShellExecute "demo.exe","","c:/","", 0
' 方法5:在文件上打开鼠标邮件点击打开按钮
Set objFolderItem = objShellApp.NameSpace("C:/").Items().item("demo.exe")
Set objFIVs = objFolderItem.Verbs()
For i=0 To objFIVs.Count - 1
    ' MsgBox objFIVs.Item(i)
    Set objFIV = objFIVs.Item(i)
    If objFIV.Name = "打开(&O)" Then '右键菜单中在中文系统是"打开(&O)",英文自己改
        objFIV.DoIt
        Exit For
    End IF
Next

# 特殊文件夹

SpecialFolders属性提供WshSpecialFolders对象以便访问Windowsshell文件夹

使用:WshShell.SpecialFolders("strFolderName"),如果没有查询的目录则返回NULL

变量名 说明
AllUsersDesktop 公共桌面
AllUsersStartMenu 公共程式
AllUsersPrograms 公共程序
AllUsersStartup 公共启动
Desktop 桌面
Favorites 收藏
Fonts 字体
MyDocuments 我的文档
NetHood 网络
PrintHood 打印机
Programs 程序
Recent 最近
SendTo 发给
StartMenu 开始菜单
Startup 启动
Templates 模板
AppData 应用程序数据

# 模拟按键

  • SendKeys键击参数说明
    • Enter回车建表示{Enter}、字母A表示{A}、数字2表示{2}
      • 示例Wshshell.SendKeys("{Enter}")Wshshell.SendKeys("{A}")Wshshell.SendKeys("{2}")
    • 组合键Shift+代替、Ctrl^代替、Alt%代替
      • 示例Wshshell.SendKeys("+%{DELETE}")Wshshell.SendKeys("^{C}")Wshshell.SendKeys("^{V}")
    • 模拟快捷键Ctrl + S保存内容:Wshshell.SendKeys("^{s}")
    • 使用+{f10}可以z有限制地方调用,如调用桌面菜单{f5}+{f10}

# WMI和MI

Windows Management Instrumentation(WMI)的新版本是 Windows Management Infrastructure (MI)

SWBEM脚本是可以用来访问和控制WMI内部对象的一系列可用在脚本中的对象, 脚本通过访问wbemdisp.dll这个library来访问VMI对象,这个仅被设计用来为脚本工作。

查询方式类似sql语句(其实系统信息也是存储在计算中一个类似数据库的文件中)获取我们需要的对象的记录集

表名 说明
Win32_BaseBoard 主板
Win32_BIOS BIOS芯片
Win32_BootConfiguration 系统启动配置
Win32_CDROMDrive 光盘驱动器
Win32_ComputerSystem 操作系统信息,系统位数
Win32_DesktopMonitor 显示器
Win32_DiskDrive 硬盘驱动器
Win32_DiskPartition 磁盘分区
Win32_Group 系统管理组
Win32_GroupUser 系统组帐号
Win32_Keyboard 键盘
Win32_LogicalDisk 逻辑磁盘
Win32_LogicalMemoryConfiguration 逻辑内存配置
Win32_NetworkAdapter 网络适配器
Win32_NetworkAdapterConfiguration 网络适配器设置
Win32_NetworkClient 已安装的网络客户端
Win32_NetworkProtocol 已安装的网络协议
Win32_OperatingSystem 操作系统信息,系统版本
Win32_PageFile 系统页文件信息
Win32_PageFileSetting 页文件设置
Win32_ParallelPort 并口
Win32_PhysicalMemory 物理内存
Win32_PointingDevice 点输入设备,如鼠标
Win32_POTSModem MODEM
Win32_POTSModemToSerialPort MODEM端口
Win32_Printer 打印机
Win32_PrinterConfiguration 打印机设置
Win32_PrintJob 打印机任务
Win32_Process 系统进程
Win32_Processor CPU处理器
Win32_SerialPort 串口
Win32_Service 系统安装的服务
Win32_Share 共享
Win32_SoundDevice 多媒体设置
Win32_StartupCommand 系统自动启动程序
Win32_SystemDriver 驱动程序
Win32_TCPIPPrinterPort 打印机端口
Win32_Thread 系统线程
Win32_TimeZone 时区
Win32_USBController USB控制器
Win32_UserAccount 用户帐号
Win32_VideoController 显卡细节。
Win32_VideoSettings 显卡支持的显示模式。
Win32_ScheduledJob 创建一个作业AT命令(不是任务计划)
Win32_NetworkLoginProfile 一个特定的用户运行Windows的计算机系统上的网络登录信息。
MSFT_NetAdapter 逻辑网络适配器
Win32_NetworkConnection 一个基于Windows的环境中活动的网络连接

创建SWbemServices对象方式

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(".", "root\cimv2")

' 隐式使用本地计算机(.) 和默认名称空间("root\cimv2")
Set objWMIService = GetObject("winmgmts:")

Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")

Set objWMIService = GetObject("winmgmts:root\cimv2")

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

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")

' wmi与cimv2不同
Set objWMIService = GetObject("winmgmts:\\.\root\wmi")
// JScript.
var LoginProfiles = GetObject("winmgmts:").InstancesOf ("Win32_NetworkLoginProfile");
for(e = new Enumerator(LoginProfiles) ; !e.atEnd() ; e.moveNext()) {
   var Profile = e.item();
   WScript.Echo(Profile.Name);
   WScript.Echo(Profile.LastLogon);
}