使用c#窗体远程关机PC

本文关键字:关机 PC 程关机 窗体 使用 | 更新日期: 2023-09-27 18:10:22

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

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

并且由于它没有指定任何要关闭的pc,所以我尝试将该代码更改为我认为满足我目标的代码。但事实证明这不起作用。

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

NO Exception in c# it just not shutdown.

我也试过这个,但没有运气。

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

c#异常"The system cannot find file specified".

编辑:

我忘了告诉你,我已经把我的远程计算机和服务器设置成不会连接失败的方式,如关闭防火墙,配置本地系统策略,更改网络和共享中心。

使用c#窗体远程关机PC

//远程关机

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

在c#中,'' in string表示'

所以参数被解释为

/s/m '192.168.1.21/t 5/c "关机5秒"

您应该使用''''来表示''

或在开始引号前添加@标记,如

System.Diagnostics.Process。开始("关闭"@"/s/m ' ' 5 192.168.1.21/t/c在5秒关机");

你可以看看下面的SO帖子。它讨论重新启动远程机器。

WMI重新启动远程计算机

如果你看Win32Shutdown方法

关机=> 1 (0x1) &Reboot => 2 (0x2)

所以在上面的So链接中你需要修改

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

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

应该可以:

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

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

更好的方法是创建一个"静默"关机(不需要cmd-window显示):

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中测试

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

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

您还必须在目标计算机上启用"Remote Registry"服务,并且您必须具有远程计算机的管理员权限。

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

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

你自己试一下:-)开始+R(运行)你会看到它工作的:)

我认为要解决这个问题需要做很多工作。

所以我发现我可以使用文件"FILENAME.cmd"

包含"shutdown -s -m 'IP -t 40"

提醒关闭或保存内容的延迟(不必要)

-f不适合我

但是有了CMD文件,我可以调用它,让它从我的应用程序中运行。

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

感谢大家的快速回复