4

我正在尝试通过命令提示符使用 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# 异常“系统找不到指定的文件”。

编辑:

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

4

7 回答 7

2

// 远程关机

    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;
        }
    }
于 2021-04-21T11:39:50.857 回答
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秒后关机'");

于 2013-04-21T08:53:48.437 回答
1

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

WMI 重启远程机器

如果你看一下Win32Shutdown方法

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

所以在上面的 SO 链接中你将不得不改变

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

 // Add the input parameters.
 inParams["Flags"] =  1; //Shutdown
于 2013-04-21T09:04:12.283 回答
1

这应该有效:

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

于 2016-10-25T18:56:54.263 回答
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();
于 2021-04-13T14:43:29.320 回答
-1

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

详情请看这里

于 2013-04-21T08:50:03.010 回答
-1

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

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

自己试试 :-) Start+R (run) 你会看到它有效:)

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

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

里面有“shutdown -s -m \IP -t 40”

提醒关闭或保存东西的延迟(不是必需的)

-f 对我不起作用

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

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

感谢大家的快速回复

于 2016-10-28T22:00:20.953 回答