使用C#windows窗体远程关闭PC?

时间:2013-04-21 08:43:46

标签: c# cmd shutdown

我正在尝试使用c#通过命令提示符以编程方式远程关闭PC,我已经完成了一些搜索并找到了这种代码。

System.Diagnostics.Process.Start("shutdown", "/s");

并且因为它没有任何关闭的电脑,所以我尝试将这些代码更改为我认为满足我的目标的代码。但事实证明这不起作用。

System.Diagnostics.Process.Start("shutdown", "/s /m \\192.168.1.21 /t 5 /c 'Shutdown in 5 seconds'");

在C#中没有异常,它只是不关闭。

我也尝试过但没有运气。

 System.Diagnostics.Process.Start("shutdown /s /m \\192.168.1.21 /t 5 /c 'Shutdown in 5 seconds'");

C#异常“系统找不到指定的文件”。

编辑:

我忘了告诉你,我已经设置了我的远程计算机和服务器,它们不会无法连接到彼此,例如关闭防火墙,配置本地系统策略以及更改网络和共享中心。

7 个答案:

答案 0 :(得分:1)

在C#中,\\在字符串中表示\

所以参数解释为

/ s / m \ 192.168.1.21 / t 5 / c'在5秒内关机'

你应该使用\\\\来代表\\

或在开头引号之前添加@标记,如此

System.Diagnostics.Process.Start(“shutdown”,@“/ s / m \\ 192.168.1.21 / t 5 / c'5秒内关机'”);

答案 1 :(得分:1)

您可以查看下面的SO帖子。它谈到了重启远程机器。

WMI to reboot remote machine

如果你看一下Win32Shutdown方法

  

Shutdown => 1(0x1)&重启=> 2(0x2)

所以在上面的SO链接中你必须改变

 // Add the input parameters.
 inParams["Flags"] =  2; //Reboot

 // Add the input parameters.
 inParams["Flags"] =  1; //Shutdown

答案 2 :(得分:1)

// 远程关机

    public bool RemoteShutdown(string userName, string password, string ip)
    {
        try
        {
            ConnectionOptions op = new ConnectionOptions();
            op.Username = userName;
            op.Password = password;
            // Make a connection to a remote computer.  
            ManagementScope scope = new ManagementScope("\\\\" + ip + "\\root\\cimv2", op);
            scope.Connect();
            //Query system for Operating System information  
            ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
            ManagementObjectSearcher query = new ManagementObjectSearcher(scope, oq);
            ManagementObjectCollection queryCollection = query.Get();
            foreach (ManagementObject obj in queryCollection)
            {
                obj.InvokeMethod("ShutDown", null); //shutdown  
            }

            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

// 远程重启

    public bool RemoteReboot(string userName, string password, string ip)
    {
        try
        {
            ConnectionOptions op = new ConnectionOptions();
            op.Username = userName;
            op.Password = password;
            // Make a connection to a remote computer.  
            ManagementScope scope = new ManagementScope("\\\\" + ip + "\\root\\cimv2", op);
            scope.Connect();
            //Query system for Operating System information  
            ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
            ManagementObjectSearcher query = new ManagementObjectSearcher(scope, oq);
            ManagementObjectCollection queryCollection = query.Get();
            foreach (ManagementObject obj in queryCollection)
            {
                obj.InvokeMethod("Reboot", null); //shutdown  
            }

            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

答案 3 :(得分:0)

您还必须在目标计算机上启用“远程注册表”服务,并且您必须具有远程计算机的管理员权限。

See here for details

答案 4 :(得分:0)

这应该有效:

System.Diagnostics.Process.Start("shutdown", @"-m \\192.168.1.21 -s -f -t 0");

标志的语法应该是-m,而不是/ m。

更好的是创造一个"沉默"关闭(没有要显示的cmd窗口):

var shutdown = new ProcessStartInfo("shutdown", @"-m \\192.168.1.8 -s -f -t 0");
shutdown.CreateNoWindow = true;
shutdown.UseShellExecute = false;
Process.Start(shutdown);

在win7,.Net framework 4.03中测试

答案 5 :(得分:0)

感谢createnowindow,如果一切正常,我已经在考虑使用它了(但如果你想看看发生了什么,那么它就没有用了)

没有解释我的破折号没有评论。只要我知道,你可以选择 - 或/

自己尝试:-)开始+ R(运行)你会发现它有效:)

我认为要解决它需要做很多工作。

所以我发现能够使用文件“FILENAME.cmd”

中包含“shutdown -s -m \ IP -t 40”

提醒关闭或保存内容的延迟(不是nessecary)

-f对我不起作用

但是使用cmd文件我可以调用它并让它从我的应用程序运行。

所以我的问题解决了,我知道它有点......不完美。但它起码至少。

Thanx to all for quick reply's

答案 6 :(得分:0)

这是我用于关闭/重启远程机器的代码:

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

var proc = Process.Start(processInfo);

// Works without WaitForExit(); 
// When using this you can check in "proc" if the shutdown was accepted by 
// the remote machine 
// 
// proc.WaitForExit();

Here is my complete solution for reboot(将 -r 更改为 -s 以将其更改为关闭)