从客户端重启远程服务器

时间:2015-09-02 06:46:57

标签: c# asp.net-mvc-4 visual-studio-2013

我已经访问过远程服务器,但可能存在一些问题。所以我想用c#重启远程客户端。这有可能重启吗?

3 个答案:

答案 0 :(得分:1)

using System;
using System.Management; 

namespace WMI3
{
    class Class1
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Computer details retrieved using Windows Management Instrumentation (WMI)");
            //Connect to the remote computer
            ConnectionOptions co = new ConnectionOptions();
            co.Username = "username";
            co.Password = "Pass";
            string serverName="servername";

            System.Management.ManagementScope ms = new System.Management.ManagementScope(servername + "\\root\\cimv2", co); 
            //Query remote computer across the connection
            System.Management.ObjectQuery oq = new  System.Management.ObjectQuery("SELECT * FROM Win32_OperatingSystem");
            ManagementObjectSearcher query1 = new ManagementObjectSearcher(ms,oq);
            ManagementObjectCollection queryCollection1 = query1.Get(); 

            foreach( ManagementObject mo in queryCollection1 ) 
            {
                string[] ss={""};
                mo.InvokeMethod("Reboot",ss);
                Console.WriteLine(mo.ToString());
            }
        }
    }
}

答案 1 :(得分:1)

这是我的解决方案,它支持静默模式、“即发即忘”和延迟重启。 In 可以简单地通过进程启动的个人登录来增强。

public static bool RebootRemoteMachineSOVersion(ContentControl parentControl, string remoteHostNameOrIp, int waitSeconds = 60, bool silent = false, bool waitForExit = true)
{
    waitSeconds = Math.Max(0, waitSeconds);

    if (!silent && MessageBox.Show($"Reboot remote computer ({ remoteHostNameOrIp }) in { waitSeconds } seconds?", "Reboot remote machine", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.No)
    {
        return false;
        //<-----------
    }

    ProcessStartInfo processInfo = new ProcessStartInfo();
    processInfo.FileName = "shutdown.exe";
    processInfo.Arguments = $@"-r -t { waitSeconds } -m \\{ remoteHostNameOrIp }";
    processInfo.WindowStyle = ProcessWindowStyle.Hidden;
    processInfo.CreateNoWindow = true;

    Process proc;
    try
    {
        proc = Process.Start(processInfo);

        if (waitForExit) proc.WaitForExit();
        else return true;
        //<----------
    }
    catch (Exception ex)
    {
        if (!silent) MessageBox.Show($"An error happened:\n\n{ ex.Message }", "Reboot remote machine", MessageBoxButton.OK, MessageBoxImage.Error);
        return false;
        //<-----------
    }

    {
        string message = "";
        const int ERROR_BAD_NETPATH = 53;
        const int ERROR_SHUTDOWN_IN_PROGRESS = 1115;
        const int RPC_S_UNKNOWN_IF = 1717;

        switch (proc.ExitCode)
        {
            case 0:
                if (!silent) MessageBox.Show($"Remote computer is rebooting  ({ remoteHostNameOrIp }) in { waitSeconds } seconds.", "Reboot remote computer", MessageBoxButton.OK, MessageBoxImage.Information);
                return true;
            //<----------

            case ERROR_BAD_NETPATH:
                message = $"Remote computer not found ({ remoteHostNameOrIp })";
                break;

            case ERROR_SHUTDOWN_IN_PROGRESS:
                message = $"A shutdown is already in progress ({ remoteHostNameOrIp })";
                break;

            case RPC_S_UNKNOWN_IF:
                message = $"Remote computer does not accept shutdown. Probably it is currently booting. ({ remoteHostNameOrIp })";
                break;

            default:
                message = $"Could not shut down - errorcode: { proc.ExitCode } ({ remoteHostNameOrIp })";
                break;
        }

        if (!silent) MessageBox.Show($"{ message }", "Reboot remote computer", MessageBoxButton.OK, MessageBoxImage.Error);

        return false;
    }
}

答案 2 :(得分:0)

编辑:请参阅下面的@amitdayama's answer了解更合理的方法

是的,这是可能的。

首先,使用命名空间语句添加它:

using System.Diagnostics;
using System.Runtime.InteropServices; 

要关闭计算机,请使用:

Process.Start("shutdown","/s /t 0");    // starts the shutdown application 
                                        // the argument /s is to shut down the computer
                                        // the argument /t 0 is to tell the process that 
                                        // the specified operation needs to be completed 
                                        // after 0 seconds

要重新启动计算机,请使用:

Process.Start("shutdown","/r /t 0"); // the argument /r is to restart the computer

来源:Codeproject.com