1

有人有一些关于如何使用主机名、用户名和密码从远程系统检索 Win32_ComputerSystem WMI 类的对象的示例 C# 代码吗?

4

1 回答 1

1

连接:

try
        {
            rcOptions = new ConnectionOptions();
            rcOptions.Authentication = AuthenticationLevel.Packet;
            rcOptions.Impersonation = ImpersonationLevel.Impersonate;
            rcOptions.EnablePrivileges = true;
            rcOptions.Username = servername + @"\" + username;
            rcOptions.Password = password;

            mScope = new ManagementScope(String.Format(@"\\{0}\root\cimv2", servername), rcOptions);
            mScope.Connect();
            if (mScope.IsConnected == true) { MessageBox.Show("Connection Succeeded", "Alert"); } else { MessageBox.Show("Connection Failed", "Alert"); }
            if (mScope.IsConnected == true) { lblConnectionStateWarning.Text = "Connected"; } else { lblConnectionStateWarning.Text = "Disconnected"; } //I have a label that displays connectionstate, you can leave that out

        }
        catch (Exception ex) { MessageBox.Show(ex.Message); }

使用方法获取查询,加载到字典并返回到列表视图

private void FindWMI(string servername, string classSelection, ConnectionOptions rcOptions, ListView listView)
        {
            try
            {
                var dct = new Dictionary<string, string>();
                List<ListViewItem> itemsList = new List<ListViewItem>();
                oQuery = new ObjectQuery("select * from " + classSelection);
                moSearcher = new ManagementObjectSearcher(mScope, oQuery);
                moCollection = moSearcher.Get();

            Invoke(new MethodInvoker(() =>
            {
                listView.Items.Clear();
            }));

            foreach (ManagementObject mObject in moCollection)
            {
                if (mObject != null)
                {
                    foreach (PropertyData propData in mObject.Properties)
                    {
                        if (propData.Value != null && propData.Value.ToString() != "" && propData.Name != null && propData.Name != "")
                            dct[propData.Name] = propData.Value.ToString();
//Don't forget this, when the result is an array, you want all the strings in that array..
if (propData.Value is Array) { dct[propData.Name] = ""; foreach (string stringArray in (string[])propData.Value) { dct[propData.Name] += stringArray + "\n"; } }
                    }
                }
            }

            foreach (KeyValuePair<string, string> listItem in dct)
            {
                ListViewItem lstItem = new ListViewItem(listItem.Key);
                lstItem.SubItems.Add(listItem.Value);
                itemsList.Add(lstItem);
            }

            Invoke(new MethodInvoker(() =>
            {
                listView.Items.AddRange(itemsList.ToArray());
            }));
        }
        catch (Exception) { }
    }
于 2013-02-02T17:18:19.320 回答