`

如何使用 WMI 管理远程计算机

阅读更多

转自:http://hi.baidu.com/peter_she/blog/item/2203c4f198411ac87931aab5.html

 

一般情况下,可以在本地计算机上执行的 WMI 操作也可以在远程计算机上执行,只要您拥有该计算机的管理员权限。 如果您对远程命名空间拥有权限(请参见如 何设置 WMI 命名空间的安全性? ) 并且远程计算机支持远程访问,您就可以连接到该远程计算机并执行拥有相应权限的操作。另外,如果远程计算机启动了委派,您还可以使用委派功能。委派允许远 程计算机使用来自客户端的身份验证信息到另外一台计算机上获取数据。 换句话说,您可以在计算机 A 上运行脚本连接到计算机 B;计算机 B 将会使用运行在计算机 A 上的脚本所提供的用户名和密码来连接计算机 C。关于委派情境的故障处理,请参见远 程操作涉及到第三台计算机的时候为何失败?

使用 WMI 工具连接远程命名空间

1.

想使用类似 CIM Studio 或 Wbemtest 这样的工具进行远程连接,必需按照以下格式指定一个命名空间:“\\<machinename>\root \<namespace>”
例如:\\myserver\root\cimv2

2.

身份验证可以使用 Kerberos 或 NTLM 进行处理。如果使用 NTLM 或默认(非 Kerberos)验证,请指定如下内容:

User :<domain>\<User>
Password :<password>
Authority :保留空白,或者输入 “NTLMDomain:<domain>”。如果想要包含 Authority 参数,请把“<domain>\”从 User 参数中去掉,只输入用户名即可。例如:

User :kenmyer
Password :45Tgfr98q
Authority :NTLMDomain:fabrikam

3.

要使用 Kerberos 认证,请按如下指定:

User :<domain>\<User>
Password :<password>
Authority :在这里输入 “Kerberos:<domain>\<machinename>”。例如:

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 \\< remotecomputer >\\C$ /u:< domain\username > *

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:????<remote machine>

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:????<console Machine >

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 文件

分享到:
评论

相关推荐

    利用WMI控制远程计算机 源码

    3. **执行管理操作**:WMI提供了多种类和方法,如`Win32_Process`类可用于创建、终止或管理远程计算机上的进程,`Win32_Service`类则可用来启动、停止或改变服务状态。 4. **处理结果**:执行查询或操作后,你需要...

    C#利用WMI 控制远程计算机

    通过以上步骤,你可以使用C#通过WMI技术控制远程计算机,获取其系统信息,甚至执行管理任务。这个例子不仅适用于操作系统信息,还可以扩展到获取和管理网络适配器(Win32_NetworkAdapter)、进程(Win32_Process)等...

    Windows Management Instrumentation(WMI):常见问题

    10:如何使用 WMI 管理远程计算机? 11:远程操作涉及到第三台计算机的时候为何失败? 12:为什么我的查询需要很长时间才能完成? 13:如何列出特定计算机上已经安装的所有应用? 14:如何获得性能计数器数据?

    C#中用WMI控制远程计算机.txt

    ### C#中使用WMI控制远程计算机的知识点详解 #### WMI简介 Windows Management Instrumentation (WMI) 是Microsoft提供的一套用于管理Windows系统的方法和技术。它为管理员提供了查询和控制本地或远程计算机上的...

    WMI远程操作调用代码

    - 使用WMI进行远程操作通常涉及创建一个`SWbemLocator`对象,然后连接到远程计算机的命名空间,例如`\\RemoteComputer\root\CIMV2`。 3. **注册表操作** - WMI中的`StdRegProv`类提供了对注册表的操作,如读取、...

    c#利用wmi远程关机

    WMI是Microsoft在Windows平台上实现的一种基于COM的技术,它允许应用程序、用户脚本和管理员访问关于本地或远程计算机的硬件和操作系统的信息。WMI支持多种编程语言,包括但不限于C#、VBScript等。 #### 远程关机...

    怎样用WMI获取远程系统信息.doc

    然后,创建一个 ManagementScope 对象,指定远程计算机的路径和连接选项。 使用 ObjectQuery 对象可以查询远程系统的信息,例如进程列表、系统信息、服务列表等。 在查询结果中,可以使用 foreach 循环遍历结果,...

    使用C#控制远程计算机的服务

    "使用C#控制远程计算机的服务" 在.NET中,System.ServiceProcess命名空间下的ServiceController类和System.Management命名空间下的WMI操作类提供了显示和控制Windows系统上的服务的功能。然而,使用Service...

    WMI获取远程服务器CPU,内存使用率函数源代码

    这两个函数可以分别用来获取远程服务器的CPU和内存使用率,它们是通过WMI连接到远程计算机并执行查询来获取数据的。请注意,为了能够成功连接到远程机器,需要确保防火墙设置允许WMI通信,并且账户有足够的权限。 ...

    学习使用WMI管理网络

    ### 学习使用WMI管理网络 #### 关键知识点概览 - **WMI简介**:Windows Management Instrumentation(WMI)是一种内置在Windows操作系统中的技术,用于远程管理和监控Windows设备的状态。 - **命名空间的理解**:...

    WMI技术在计算机局域网中的应用

    WMI技术的应用非常广泛,特别是在局域网中的远程计算机管理方面,例如实现远程计算机的重启和关机等功能。下面是一个简单的应用实例: **1. 程序设计和运行环境设置** - 操作系统:Windows 2000 Professional - ...

    怎样使用WMI查询

    2. 在WMI测试工具窗口中,选择“连接”选项,然后在出现的对话框中填入目标计算机的名称(默认为本地计算机)和所需的凭据(如果需要连接到远程计算机)。 3. 点击“连接”按钮后,你会进入一个新的界面,在这里你...

    C#\使用C#控制远程计算机的服务

    在实际应用中,我们可以使用 System.Management 命名空间下的类来实现对远程计算机服务的控制和管理,并使用 WMI 来实现对远程计算机服务的监控和管理。这将极大地提高我们的工作效率和管理能力。

    C#、wmi 远程监控进程内存

    开发者可以利用WMI API编写应用程序,实现对远程计算机的监控和管理。 在C#中,我们通常会使用System.Management命名空间来访问WMI接口。以下是一个简单的示例,展示如何查询远程计算机上的进程信息: ```csharp ...

    C#重启远程计算机()

    首先,要实现远程计算机的重启功能,你需要理解Windows操作系统提供的远程管理接口,如Windows Management Instrumentation (WMI)。WMI是Windows系统中的一个核心组件,它允许开发者通过标准的脚本和编程语言访问和...

    使用wmi查询声音设备信息

    WMI是微软提供的一种标准的管理架构,它基于WBEM(Web-Based Enterprise Management)标准,可以访问和控制本地或远程计算机的管理系统资源。通过WMI,我们可以获取关于系统硬件、软件、网络等多方面的信息,包括...

    使用wmi查询串行端口信息

    1. **连接到WMI服务**:在代码中,你需要使用`wbemscripting.SWbemLocator`对象来连接到本地或远程计算机的WMI服务。例如,以下VBScript代码展示了如何连接到本地计算机的WMI服务: ```vbscript Set wmiService = ...

    使用Splunk(WMI)远程获取服务器日志

    - 在计算机管理中,进入WMI Control的属性,选择安全选项,添加SplunkAdmin用户并赋予启用账户和远程启用权限。 - 在安全设置中选择This namespace and subnamespaces。 4. 赋予服务器B上的DCOM权限: - 在本地...

    WMI 获取计算机信息(cpu 硬盘 网卡 网速)

    在IT领域,Windows Management Instrumentation(WMI)是微软提供的一种管理系统资源的接口,它允许开发者获取和控制本地或远程Windows系统的各种信息。本篇文章将深入探讨如何利用WMI技术来获取计算机信息,包括CPU...

    使用wmi查询处理器信息

    同时,也可以利用WMI查询远程计算机的处理器信息,只需更改`GetObject`或`ManagementObjectSearcher`的连接字符串即可。 总之,WMI提供了一种方便、统一的方式来获取和管理Windows系统中的各种信息,对于开发者和...

Global site tag (gtag.js) - Google Analytics