Windows 远程管理中的脚本编写

WinRM 中的脚本 API 和随附的适用于 C++ 的 COM API 旨在密切反映 WS-Management 协议的操作。

Windows 远程管理中的 WinRM 脚本 API 支持除WS-Management协议操作之外的所有协议操作。 它不允许订阅事件。 若要订阅 BMC 系统事件日志中的事件,必须使用 Wecutil 或 Wevtutil 命令行工具。 有关详细信息,请参阅事件

WinRM 脚本 API 由 Winrm.vbs 调用,它是一个命令行工具,以 Visual Basic Scripting Edition (VBScript) 编写。 Winrm.vbs提供了有关如何使用 WinRM 脚本 API 的示例。

使用 WSman 与使用 WMI 脚本相比

WMI 通过 DCOM 连接到远程计算机,这需要 连接到远程计算机上的 WMI 中所述的配置。 WinRM 不使用 DCOM 连接到远程计算机。 相反,WS-Management协议发送 SOAP 消息,服务使用单个端口进行 HTTP 和端口进行 HTTPS 传输。

winrm 命令行工具不同,脚本必须提供传递到WS-Management协议消息所需的 XML。 它们还必须提供 URI。 有关详细信息,请参阅 资源 URIWindows 远程管理和 WMI

WMI 脚本 API 适用于表示计算机上的资源的对象,如 Win32_LogicalDisk 实例。 此 WMI 类在 托管对象格式 (MOF) 文件中定义,这些文件以二进制形式存储在 WMI 存储库中。 在 WMI 中,单个资源的 Get 操作或针对多个实例的查询返回 WMI 对象。

WinRM 脚本不返回对象,而是返回 XML 文本流。 有关详细信息,请参阅 Windows 远程管理和 WMI

显示 WinRM 脚本中的 XML 输出

WinRM 脚本 API 获取并接收描述资源的 XML 字符串。 生成的 XML 采用文本流的形式,需要以其他方式显示 XML 转换。

以下 WinRM 脚本生成原始 XML 输出。

Set Wsman = CreateObject("Wsman.Automation")
Set xmlFile = CreateObject( "MSxml.DOMDocument")
Set Session = Wsman.CreateSession
Response = Session.Get("http://schemas.microsoft.com/wbem/wsman/" _
    & "1/wmi/root/cimv2/Win32_Service?Name=Spooler")
xmlFile.LoadXml(Response)
xmlFile.Save( "c:\RawOutput.xml")

以下文本块显示 WinRM 脚本的 XML 输出。

<p:Win32_Service xmlns:xsi="https://www.w3.org/2001/XMLSchema-
instance" xmlns:p="http://schemas.microsoft.com/wbem/wsman/1
/wmi/root/cimv2/Win32_Service" xmlns:cim="https://schemas.dmtf
.org/wbem/wsman/1/base" cim:Class="Win32_Service"><p:AcceptP
ause>false</p:AcceptPause><p:AcceptStop>true</p:AcceptStop>
<p:Caption>Print Spooler</p:Caption><p:CheckPoint>0</p:CheckP
oint><p:CreationClassName>Win32_Service</p:CreationClassName>
<p:Description>Loads files to memory for later printing</p:De
scription><p:DesktopInteract>true</p:DesktopInteract><p:Displ
ayName>Print Spooler</p:DisplayName><p:ErrorControl>Normal</p
:ErrorControl><p:ExitCode>0</p:ExitCode><p:InstallDate xsi:ni
l="true"/><p:Name>spooler</p:Name><p:PathName>C:\Windows\Syst
em32\spoolsv.exe</p:PathName><p:ProcessId>1720</p:ProcessId><
p:ServiceSpecificExitCode>0</p:ServiceSpecificExitCode><p:Ser
viceType>Own Process</p:ServiceType><p:Started>true</p:Starte
d><p:StartMode>Auto</p:StartMode><p:StartName>LocalSystem</p:
StartName><p:State>Running</p:State><p:Status>OK</p:Status><p
:SystemCreationClassName>Win32_ComputerSystem</p:SystemCreati
onClassName><p:SystemName>wsplab6-4</p:SystemName><p:TagId>0<
/p:TagId><p:WaitHint>0</p:WaitHint><cim:Location xmlns:cim="h
ttp://schemas.dmtf.org/wbem/wsman/1/base" xmlns:a="https://sc
hemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="https://sche
mas.dmtf.org/wbem/wsman/1/wsman"><a:Address>https://schemas.xm
lsoap.org/ws/2004/08/addressing/role/anonymous</a:Address><a:
ReferenceParameters><w:ResourceURI>https://schemas.microsoft.c
om/wbem/wsman/1/wmi/root/cimv2/Win32_Service</w:ResourceURI><
w:SelectorSet><w:Selector Name="Name">spooler</w:Selector></w
:SelectorSet></a:ReferenceParameters></cim:Location></p:Win32
_Service>

脚本可以使用 XML 转换使此输出更具可读性。 有关详细信息,请参阅 显示 WinRM 脚本中的 XML 输出

以下版本的脚本将 XML 格式化为用户可读的输出。

Set Wsman = CreateObject("Wsman.Automation")
Set xmlFile = CreateObject( "MSXml.DOMDocument" )
Set xslFile = CreateObject( "MSXml.DOMDocument" )

Set Session = Wsman.CreateSession
Response = Session.Get("http://schemas.microsoft.com/wbem/wsman/" _
    & "1/wmi/root/cimv2/Win32_Service?Name=Spooler")
xmlFile.LoadXml(Response)
xslFile.Load( "WsmTxt.xsl" )
Wscript.Echo xmlFile.TransformNode( xslFile )

XSL 转换创建以下输出。

Win32_Service
    AcceptPause = false
    AcceptStop = true
    Caption = Print Spooler
    CheckPoint = 0
    CreationClassName = Win32_Service
    Description = Loads files to memory for later printing
    DesktopInteract = true
    DisplayName = Print Spooler
    ErrorControl = Normal
    ExitCode = 0
    InstallDate = null
    Name = Spooler
    PathName = C:\Windows\System32\spoolsv.exe
    ProcessId = 1720
    ServiceSpecificExitCode = 0
    ServiceType = Own Process
    Started = true
    StartMode = Auto
    StartName = LocalSystem
    State = Running
    Status = OK
    SystemCreationClassName = Win32_ComputerSystem
    SystemName = wsplab6-4
    TagId = 0
    WaitHint = 0

WinRM 脚本和 Winrm.cmd 输出

WinRM 脚本的输出以 Unicode 编码。 如果创建 FileSystemObject 并从脚本写入文件,则生成的文件为 Unicode。 但是,如果将输出重定向到文件,则编码为 ANSI。 如果将输出重定向到 XML 文件,并且输出中有 Unicode 字符,则 XML 将无效。 请注意, Winrm 命令行工具输出 ANSI。

关于 Windows 远程管理

使用 Windows 远程管理

MSXSL

DOM,引用