如何: 连接到一台远程计算机

WMI 用来监控远程计算机上的硬件和软件。.NET Framework 中的WMI 远程连接通过ManagementScope 对象实现的。
使用System.Management 命名空间来远程连接内部是使用DCOM 来作为统一的远程架构的。WMI远程连接必须服从DCOM身份模拟和认证的安全要求。在不同的操作系统之间,比如,一个从一台Windows 2000 计算机发起,连接到一台Windows Server 2003 计算机的连接的身份模拟和认证可能与两台Windows 2000 计算机之间的不同。
默认情况下,一个范围绑定到本地计算机的root\cimv2 系统命名空间。然而,你可以在确定构造路径的字符串中改变命名空间或者使用一个ManagementPath对象。这个路径使用的字符串按照其他WMI路径的规则,不可以使用反斜线("\")。
当你在进行远程连接时,你可以使用一个特定用户而不是当前的登录用户, 在远程计算机的操作将在特定用户的上下文中执行。这可以通过使用ConnectionOptions 对象实现。
WMI远程连接一台计算机的环境要求:
1. 保证在源端和目的端同时开启Remote Procedure Call(RPC), Remote Procedure Call(RPC) Locator 服务,且设置它们为自动启动。
2. 设置防火墙
如果出现类似于The RPC is Unavaliable 等类似的一系列错误时,要考虑是否是由于防火墙原因导致的。
分别检查源端的OutBound Rules 和 目的端的InBound Rules, 确保Windows Management Instrucmentation(WMI-Out) 已经允许。
3. 可以在源端Ping 通目的端机器
4. 开始->管理工具->计算机管理->连接到另外一台计算机(右键),查看是否可以正常在源端计算机使用WMI连接到目的端计算机。
5. 开始->运行->DCOMCNFG->Component Services->My Computer->右键
->Default Properties->Enable Distributed COM on this computer(Check it)
->Default Protocols->Add Tunneling TCP/IP(Move it until the top one)
全部设置完以后,重启计算机
6. 使用工具WMICodeCreator 来生成需要的代码
7. 示例代码
            ConnectionOptions connection = new ConnectionOptions();
            //用户名不可以加域名, 要保证用户名和密码正确,否则报RPC is Unavaliable.
            connection.Username = "testUser";
            connection.Password = "testPassword";
            //允许权限提升
            connection.EnablePrivileges = true;
            //委托方式身份模拟
            connection.Impersonation = ImpersonationLevel.Delegate;
            //连接到WMI 的认证级别
            connection.Authentication = AuthenticationLevel.Call;
            //不是ntdlmdomain,也不是kerberoes, 否则会提示Invalid Parameter.
            connection.Authority = "ntlmdomain:MYDOMAIN";

            //地址使用IP或者机器全名
            ManagementScope scope = new ManagementScope(
                "\\\\myIPAddress\\root\\CIMV2", connection);
            scope.Connect();

            ManagementClass classInstance =
                new ManagementClass(scope,
                new ManagementPath("Win32_Process"), null);

            ManagementBaseObject inParams = classInstance.GetMethodParameters("Create");
            //替换成你的可执行文件路径
            inParams["CommandLine"] = "myExecuteFilePath";
            ManagementBaseObject outParams = classInstance.InvokeMethod("Create", inParams, null);


作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/danielWise/p/2007064.html