一般情况下,可以在本地计算机上执行的 WMI 操作也可以在远程计算机上执行,只要您拥有该计算机的管理员权限。
如果您对远程命名空间拥有权限(请参见如何设置
WMI 命名空间的安全性?)
并且远程计算机支持远程访问,您就可以连接到该远程计算机并执行拥有相应权限的操作。另外,如果远程计算机启动了委派,您还可以使用委派功能。委派允许远程计算机使用来自客户端的身份验证信息到另外一台计算机上获取数据。
换句话说,您可以在计算机 A 上运行脚本连接到计算机 B;计算机 B 将会使用运行在计算机 A
上的脚本所提供的用户名和密码来连接计算机 C。关于委派情境的故障处理,请参见远程操作涉及到第三台计算机的时候为何失败?
使用 WMI 工具连接远程命名空间
1.
想使用类似 CIM Studio 或 Wbemtest
这样的工具进行远程连接,必需按照以下格式指定一个命名空间:“\\\root\”
例如:\\myserver\root\cimv2
2.
身份验证可以使用 Kerberos 或 NTLM 进行处理。如果使用 NTLM 或默认(非
Kerberos)验证,请指定如下内容:
User:\
Password:
Authority:保留空白,或者输入“NTLMDomain:”。如果想要包含
Authority 参数,请把“\”从 User
参数中去掉,只输入用户名即可。例如:
User:kenmyer
Password:45Tgfr98q
Authority:NTLMDomain:fabrikam
3.
要使用 Kerberos 认证,请按如下指定:
User:\
Password:
Authority:在这里输入“Kerberos:\”。例如:
User:kenmyer
Password:45Tgfr98q
Authority:Kerberos:fabrikam\atl-ws-01
使用脚本连接到远程计算机上的 WMI
1.
开始之前,请确保对远程命名空间拥有相应的权限。 如果拥有权限,您可以在不指定用户身份信息的情况下连接到远程计算机。WMI
将使用您登陆时输入的用户身份进行连接。
2.
如果不指定用户身份信息,您可以使用被称作 别名字符串
的简短连接语法连接到远程计算机。更多信息,请访问:http://msdn.microsoft.com/library/default.asp
并搜索 “Constructing a Moniker String”(构造一个别名字符串)。例如,以下别名字符串将连接到一个名为
TargetComputer 的远程计算机的默认命名空间(因为没有指定命名空间,会自动连接到默认的命名空间):
•
Set objWMIService = GetObject("winmgmts:\\TargetComputer”)
•
如果 TargetComputer
位于另外一个域中,还必需在命名空间中包含域名。否则将会返回一个“拒绝访问”错误。例如,以下命名空间连接到位于 DomainName
域的 TargetComputer 计算机:
Set objWMIService = GetObject("winmgmts:\\DomainName\TargetComputer”)
•
尽管不是必需的,您也可以在别名字符串中指定 WMI
命名空间。这对连接到不同平台是非常有帮助的,因为在不同版本的操作系统上默认的命名空间不完全相同。例如,在 Windows
2000、Windows XP 和 Windows Server 2003 上,默认的命名空间是 root\cimv2;但是,在
Windows NT 4.0 和 Windows 98 上,默认的命名空间是 root\default。
以下别名字符串连接到远程计算机 TargetComputer 的 root\cimv2 命名空间:
Set objWMIService = GetObject("winmgmts:\\TargetComputer\root\cimv2)
•
如果需要处理多种平台,您可能还需要指定 Impersonation(模拟)级别; 尽管 Windows 2000
和更高版本的默认 Impersonation 级别为“Impersonate”,但之前版本的 Windows 的默认
Impersonation 级别为“Identify”。如果需要处理 Windows NT 4.0 和(或)Windows 98
计算机,需要在别名字符串中包含 Impersonation 级别;使用委派的时候也需要包含 Impersonation 级别。
以下别名连接到 TargetComputer 的 root\cimv2 命名空间,并且指定了“Impersonate”作为
Impersonation 级别:
Set objWMIService = GetObject _
("winmgmts:{impersonationLevel=Impersonate}!\\TargetComputer\root\cimv2")
•
最后,您可能还需要根据操作系统版本的不同来设置 Authentication(身份验证)级别。您可以通过指定
Authentication 级别来请求 DCOM
的身份验证类型和在整个连接过程中需要用到的隐私数据。它的设置的范围从“无身份验证”一直到“每数据保加密身份验证”(per-packet
encrypted authentication)。
以下别名连接到名为 TargetComputer 的计算机的 root\cimv2 命名空间,同时指定了
Impersonation 级别为“Impersonate”。另外,它还将 Authentication 级别配置为 pkt:
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate," _ &
"authenticationLevel=pkt}!\\ _
TargetComputer\root\cimv2")
3.
也可以在脚本中指定用户的身份验证信息;这样,即使您用一个标准用户账户登录到远程计算机,仍然可以运行需要管理员权限的脚本。更多信息,请访问:http://msdn.microsoft.com/library/default.asp
并搜索 “Creating a WMI Script”(创建 WMI 脚本)。
wbemImpersonationLevelImpersonate = 3
wbemAuthenticationLevelPktPrivacy = 6
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer _
("TargetComputer", "root\cimv2", "UserName", "Password")
objService.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate
objservices.Security_.AuthenticationLevel = wbemAuthenticationLevelPktPrivacy
注意。一般来说,在脚本代码中写入管理员密码是不明智的。更好的办法是在每次运行的时候询问密码。
更多信息,请访问http://msdn.microsoft.com/library/default.asp
并搜索“Connecting Between Different Operating
Systems”(不同操作系统间的连接)。
使用 WMIC 连接 WMI
如果对远程命名空间拥有权限并且远程计算机支持远程操作,则连接的时候可以不指定用户名和密码,WMIC
会自动使用当前的用户身份信息。例如:
WMIC /NODE:"computer1" OS GET
Caption,CSDVersion,CSName
如果需要使用委派,应该在 WMIC 连接字符串中包含 /IMPLEVEL:Delegate 和 /AUTHORITY
设置。例如:
WMIC /NODE:"computer1" /IMPLEVEL:Delegate
/AUTHORITY:"Kerberos:domain\computer1" OS
另外,您也可以选择指定用户账户和密码(对于 WMI 脚本,默认只有管理员拥有 WMI 远程连接权限)。例如:
WMIC /NODE:"computer1" /USER:"domainname\username" OS
GET Caption,CSDVersion
下面这个命令的例子包含了密码和用户名:
WMIC /NODE:"computer1" /USER:"domainname\username"
/PASSWORD:"userpassword" OS GET
Caption,CSDVersion,CSName
更多信息,请访问http://msdn.microsoft.com/library/default.asp
并搜索 “Connecting to WMI on a Remote Computer”(连接到远程计算机上的 WMI)。
“拒绝访问”(Access Denied)错误意味着什么?
试图连接到 WMI 命名空间或对象的时候可能会遇到“Access Denied”错误。Access Denied
错误有多种类型:
0x80041003 (WBEM_E_ACCESS_DENIED)
试图连接命名空间的进程如果没有必需的 WMI
权限通常是出现该错误的原因。试图进行远程访问的账户应该是目标计算机的管理员;另外,该账户的具体权限也需要被启用。
要解决该错误,请检查远程计算机上的命名空间的安全性,确定是否为该账户启用了相应的权限。
0x80070005 (DCOM ACCESS_DENIED)
如果远程计算机不能识别连接用户或者对其具有某种形式的限制(例如,该用户被锁定),就会导致该错误。
这种情况大多数是因为账户属于另外一个域。对 WMI 安全性的最新修改也可能导致该错误发生:
•
以前版本允许的空密码在 Windows XP 和 Windows Server 2003 中不被允许。
•
WMI 不支持针对 Windows 98 客户端的异步回调。从 Windows 98 计算机到 Windows XP 计算机的
SWbemServices.ExecNotificationQueryAsync 调用将会向
Windows 98 计算机返回一个“拒绝访问”错误。
•
DCOM 访问设置可能发生了改变。
•
如果目标计算机运行 Windows XP,注册表键
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 下的
Forceguest 值可能被设置为强制禁止 Guest 账户(值为 0)。
0x800706xx (DCOM RPC 错误)
如果远程计算机配置了防火墙,通常会导致该错误。 您需要在防火墙上打开特定端口,允许通过 DCOM 进行远程管理。
或者,计算机可能在映射 IP 和主机名方面出现了问题。要测试这种可能性,请尝试在连接字符串中使用 IP 地址代替主机名:
Set objWMIService = GetObject("winmgmts:\\192.168.1.1")
要排除远程错误
1.
请检查用户是否可以访问远程计算机。在命令提示行执行以下命令:
net user
\\\\C$
/u:
*
2.
在远程计算机上启用“详细的日志记录”,然后重新运行脚本。脚本运行之后,
检查远程计算机上的日志文件(%windir%\system32\wbem\Logs\)。
3.
启用审核事件来判断哪一个账户连接失败。启用之后,您将在事件日志中看到类似如下的事件:
Event Type:????Failure Audit
Event Source:????Security
Event Category:????Logon/Logoff
Event ID:????529
Date:????????6/14/2004
Time:????????10:52:35 AM
User:????????NT AUTHORITY\SYSTEM
Computer:????
Description:
Logon Failure:
?????Reason:????????Unknown user name or bad password
?????User Name:????xuser
?????Domain:????????NTDEV
?????Logon Type:????3
?????Logon Process:????NtLmSsp
?????Authentication
Package:????MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
?????Workstation Name:????
>
4.
Check the DCOM configuration for the Access\Launch permission;
the user running the script must have this permission.
5.
如果所有这些检查都正常,如果用户可以被远程计算机识别,但仍然会发生“DCOM
拒绝访问”错误,请联系产品支持服务(http://support.microsoft.com/default.aspx)并提供以下信息:
•
每台计算机运行的操作系统。
•
安装历史
•
导致错误发生的步骤
•
发生错误的脚本或工具
•
进行 WMI 连接的用户身份信息,包括“身份验证”和“模拟”的级别。
•
两台计算机的 %windir%\system32\wbem\logs 目录的 zip 文件