我正在尝试使用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#异常“系统找不到指定的文件”。
编辑:
我忘了告诉你,我已经设置了我的远程计算机和服务器,它们不会无法连接到彼此,例如关闭防火墙,配置本地系统策略以及更改网络和共享中心。
答案 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帖子。它谈到了重启远程机器。
如果你看一下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)
您还必须在目标计算机上启用“远程注册表”服务,并且您必须具有远程计算机的管理员权限。
答案 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 以将其更改为关闭)