WMI

http://singlepine.cnblogs.com/articles/299457.html

http://www.cnblogs.com/haiq/archive/2011/01/14/1935377.html

 http://msdn.microsoft.com/zh-cn/library/ms257337(v=vs.80).aspx

public class WMICmdProcessor
    {
        private const int PollingDelay = 15000;
        internal const string DefaultUsername = "...";
        internal const string DefaultPassword = "...";

        uint processId;
        string server;
        string password;
        string userName;
        string command;

        public uint ExitCode { get; set; }
        public bool ProcessExited { get; set; }

        public WMICmdProcessor(string server, string command, string userName = DefaultUsername, string password = DefaultPassword)
        {
            this.server = server;
            this.userName = userName;
            this.password = password;

            if (command == null)
            {
                throw new ArgumentNullException("command");
            }

            this.command = command.Replace("%SystemDrive%", this.SystemDrive);
        }

        string systemDrive;
        public string SystemDrive
        {
            get
            {
                if (systemDrive == null)
                {
                    ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
                    foreach (ManagementObject queryObj in searcher.Get())
                    {
                        systemDrive = Convert.ToString(queryObj["SystemDrive"]);
                        break;
                    }
                }

                return systemDrive;
            }
        }

        private ManagementScope ManagementScope
        {
            get
            {
                return new ManagementScope()
                {
                    Options = new ConnectionOptions()
                    {
                        Username = userName,
                        Password = password
                    },
                    Path = new ManagementPath(@"\" + server + @"
ootcimv2")
                };
            }
        }

        public UInt32 RunCommand()
        {
            this.ExitCode = 0;
            this.ProcessExited = false;
            Log.Info("Starting command: {0} on remote sever {1}", this.command, this.server);

            // verify the parameters:
            if (String.IsNullOrEmpty(server))
            {
                string message = "You must specify a non-empty server name.";
                throw new ArgumentNullException("server", message);
            }
            if (String.IsNullOrEmpty(command))
            {
                string message = "You must specify a non-empty command to run.";
                throw new ArgumentNullException("command", message);
            }
            if (String.IsNullOrEmpty(userName))
            {
                string message = "You must specify a non-empty username.";
                throw new ArgumentNullException("username", message);
            }
            if (String.IsNullOrEmpty(password))
            {
                string message = "You must specify a non-empty password.";
                throw new ArgumentNullException("password", message);
            }

            Utility.PollCondition pollCondition = new Utility.PollCondition(
                delegate()
                {
                    using (ManagementClass managementClass = new ManagementClass("Win32_Process") { Scope = this.ManagementScope })
                    using (ManagementBaseObject input = managementClass.GetMethodParameters("Create"))
                    {
                        input.SetPropertyValue("CommandLine", command);

                        using (ManagementBaseObject output = managementClass.InvokeMethod("Create", input, null))
                        {
                            try
                            {
                                this.processId = Convert.ToUInt32(output.GetPropertyValue("ProcessID").ToString());
                            }
                            catch (Exception)
                            {
                                Log.Error("Failed to start process");
                                return false;
                            }
                        }
                    }

                    return true;
                });

            // retry 3 times if we don't get process id (process creation failure)
            Utility.PollWait(pollCondition, pollCondition, 3, TimeSpan.FromSeconds(60));

            return processId;
        }

        public void WaitForProcess()
        {
            WaitForProcess(TimeSpan.FromSeconds(30));
        }

        public void WaitForProcess(TimeSpan waitTimeout)
        {
            Log.Info("Waiting for process {0}, command: {1} to finish on remote sever {2}", this.processId, this.command, this.server);

            Utility.PollCondition pollCondition = new Utility.PollCondition(
                delegate()
                {
                    if (this.ProcessExists())
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                });
            Utility.PollWait(pollCondition, TimeSpan.FromSeconds(30), waitTimeout);

            Log.Info("Process id: " + processId + " exits on remote sever " + server + ".");
        }

        public bool ProcessExists()
        {
            string query = "SELECT * FROM WIN32_Process WHERE ProcessID=" + processId;
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(ManagementScope, new SelectQuery(query));
            ManagementObjectCollection processes = searcher.Get();

            return (processId != 0 && processes != null && processes.Count > 0);
        }

    }
原文地址:https://www.cnblogs.com/Jessy/p/3538783.html