使用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".
编辑:我忘了告诉你,我已经把我的远程计算机和服务器设置成不会连接失败的方式,如关闭防火墙,配置本地系统策略,更改网络和共享中心。
//远程关机
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文件,我可以调用它,让它从我的应用程序中运行。
所以我的问题解决了,我知道它有点....不完美。但它至少是有效的。
感谢大家的快速回复