WMI 重启远程机器

发布于 2024-09-03 01:16:11 字数 1524 浏览 5 评论 0原文

我在旧线程上找到了这段代码来关闭本地计算机:

using System.Management;

void Shutdown()
{
    ManagementBaseObject mboShutdown = null;
    ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem");
    mcWin32.Get();

    // You can't shutdown without security privileges
    mcWin32.Scope.Options.EnablePrivileges = true;
    ManagementBaseObject mboShutdownParams =
             mcWin32.GetMethodParameters("Win32Shutdown");

    // Flag 1 means we want to shut down the system. Use "2" to reboot.
    mboShutdownParams["Flags"] = "1";
    mboShutdownParams["Reserved"] = "0";
    foreach (ManagementObject manObj in mcWin32.GetInstances())
    {
        mboShutdown = manObj.InvokeMethod("Win32Shutdown", 
                                       mboShutdownParams, null);
    }
}

Is it possible to use aimilar WMI method to restart flag "2" a remote machine, for which I only have machine name, not IPaddress.

编辑:我目前有:

SearchResultCollection allMachinesCollected = machineSearch.FindAll();
Methods myMethods = new Methods();
string pcName;
ArrayList allComputers = new ArrayList();
foreach (SearchResult oneMachine in allMachinesCollected)
{
    //pcName = oneMachine.Properties.PropertyNames.ToString();
    pcName = oneMachine.Properties["name"][0].ToString();
    allComputers.Add(pcName);
    MessageBox.Show(pcName + "has been sent the restart command.");
    Process.Start("shutdown.exe", "-r -f -t 0 -m \\" + pcName);
}

但这不起作用,我更喜欢 WMI 继续前进。

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

using System.Management;

void Shutdown()
{
    ManagementBaseObject mboShutdown = null;
    ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem");
    mcWin32.Get();

    // You can't shutdown without security privileges
    mcWin32.Scope.Options.EnablePrivileges = true;
    ManagementBaseObject mboShutdownParams =
             mcWin32.GetMethodParameters("Win32Shutdown");

    // Flag 1 means we want to shut down the system. Use "2" to reboot.
    mboShutdownParams["Flags"] = "1";
    mboShutdownParams["Reserved"] = "0";
    foreach (ManagementObject manObj in mcWin32.GetInstances())
    {
        mboShutdown = manObj.InvokeMethod("Win32Shutdown", 
                                       mboShutdownParams, null);
    }
}

Is it possible to use a similar WMI method to reboot flag "2" a remote machine, for which i only have machine name, not IPaddress.

EDIT: I currently have:

SearchResultCollection allMachinesCollected = machineSearch.FindAll();
Methods myMethods = new Methods();
string pcName;
ArrayList allComputers = new ArrayList();
foreach (SearchResult oneMachine in allMachinesCollected)
{
    //pcName = oneMachine.Properties.PropertyNames.ToString();
    pcName = oneMachine.Properties["name"][0].ToString();
    allComputers.Add(pcName);
    MessageBox.Show(pcName + "has been sent the restart command.");
    Process.Start("shutdown.exe", "-r -f -t 0 -m \\" + pcName);
}

but this doesn't work, and I would prefer WMI going forward.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

梨涡少年 2024-09-10 01:16:12

这会像沙姆沙伊赫一样工作

gwmi win32_operatingsystem -ComputerName xxxxxxxxxxxx | Invoke-WmiMethod -Name reboot

this will work like sharm

gwmi win32_operatingsystem -ComputerName xxxxxxxxxxxx | Invoke-WmiMethod -Name reboot
痴情 2024-09-10 01:16:11

要向远程计算机发送 WMI 查询,您只需在 ManagementScope 对象。

我不太擅长 C#,但这是我使用 MSDN 和 WMI Code Creator(顺便说一下,这是一个用于生成 WMI 代码的优秀工具,并且支持 C# 等)。希望这段代码能给您带来启发。

免责声明:此代码未经测试。)

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);
    }
}

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);
    }
}
怂人 2024-09-10 01:16:11

我也遇到了这个问题。 WMI 可能会误导类和对象的方法。我的解决方案是使用 C# 和 WMI 重新启动网络上的主机,但对于本地计算机来说很容易简化:

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);
        }
    }
}

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);
        }
    }
}
给不了的爱 2024-09-10 01:16:11

如果您需要非 WMI 解决方案,可以使用 shutdown 命令。

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

使用 -m 关闭远程计算机。

请参阅此链接以获取更多信息。
http://www.microsoft.com。 com/resources/documentation/windows/xp/all/proddocs/en-us/shutdown.mspx

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文