WMI to reboot remote machine

前端 未结 4 1230
长发绾君心
长发绾君心 2020-11-30 09:18

I found this code on an old thread to shutdown the local machine:

using System.Management;

void Shutdown()
{
    ManagementBaseObject mboShutdown = null;
           


        
相关标签:
4条回答
  • 2020-11-30 09:29

    To address WMI queries to a remote computer, you simply specify that computer's name (or IP address) in the ManagementScope object.

    I'm not well up in C#, but here's an example I came up with using MSDN and WMI Code Creator (which is, by the way, an excellent tool for generating WMI code, and supports C# among others). Hope this code will give you the idea.

    (Disclaimer: This code is untested.)

    using System;
    using System.Management;
    ...
    
    void Shutdown()
    {
        try
        {
            const string computerName = "COMPUTER"; // computer name or IP address
    
            ConnectionOptions options = new ConnectionOptions();
            options.EnablePrivileges = true;
            // To connect to the remote computer using a different account, specify these values:
            // options.Username = "USERNAME";
            // options.Password = "PASSWORD";
            // options.Authority = "ntlmdomain:DOMAIN";
    
            ManagementScope scope = new ManagementScope(
              "\\\\" + computerName +  "\\root\\CIMV2", options);
            scope.Connect();
    
            SelectQuery query = new SelectQuery("Win32_OperatingSystem");
            ManagementObjectSearcher searcher = 
                new ManagementObjectSearcher(scope, query);
    
            foreach (ManagementObject os in searcher.Get())
            {
                // Obtain in-parameters for the method
                ManagementBaseObject inParams = 
                    os.GetMethodParameters("Win32Shutdown");
    
                // Add the input parameters.
                inParams["Flags"] =  2;
    
                // Execute the method and obtain the return values.
                ManagementBaseObject outParams = 
                    os.InvokeMethod("Win32Shutdown", inParams, null);
            }
        }
        catch(ManagementException err)
        {
            MessageBox.Show("An error occurred while trying to execute the WMI method: " + err.Message);
        }
        catch(System.UnauthorizedAccessException unauthorizedErr)
        {
            MessageBox.Show("Connection error (user name or password might be incorrect): " + unauthorizedErr.Message);
        }
    }
    
    0 讨论(0)
  • 2020-11-30 09:31

    You can use shutdown command if you need an non-WMI solution.

    shutdown [{-l|-s|-r|-a}] [-f] [-m  [\\ComputerName]] [-t xx] [-c "message"] [-d[u][p]:xx:yy] 
    

    Use the -m for shutting the remote machine.

    Refer this link for more info. http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/shutdown.mspx

    0 讨论(0)
  • 2020-11-30 09:31

    this will work like sharm

    gwmi win32_operatingsystem -ComputerName xxxxxxxxxxxx | Invoke-WmiMethod -Name reboot
    
    0 讨论(0)
  • 2020-11-30 09:54

    I had trouble with this also. WMI can be misleading with methods for classes and object. My solution is for rebooting a host on the network with C# and WMI, but is easily simplified for local machine:

    private void rebootHost(string hostName)
    {
        string adsiPath = string.Format(@"\\{0}\root\cimv2", hostName);
        ManagementScope scope = new ManagementScope(adsiPath);
        // I've seen this, but I found not necessary:
        // scope.Options.EnablePrivileges = true;
        ManagementPath osPath = new ManagementPath("Win32_OperatingSystem");
        ManagementClass os = new ManagementClass(scope, osPath, null);
    
        ManagementObjectCollection instances;
        try
        {
            instances = os.GetInstances();
        }
        catch (UnauthorizedAccessException exception)
        {
            throw new MyException("Not permitted to reboot the host: " + hostName, exception);
        }
        catch (COMException exception)
        {
            if (exception.ErrorCode == -2147023174)
            {
                throw new MyException("Could not reach the target host: " + hostName, exception);
            }
            throw; // Unhandled
        }
        foreach (ManagementObject instance in instances)
        {
            object result = instance.InvokeMethod("Reboot", new object[] { });
            uint returnValue = (uint)result;
    
            if (returnValue != 0)
            {
                throw new MyException("Failed to reboot host: " + hostName);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题