【问题标题】:Remote shutdown PC using C# windows form?使用 C# windows 窗体远程关闭 PC?
【发布时间】:2013-04-21 08:43:45
【问题描述】:

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

编辑:

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

【问题讨论】:

    标签: c# cmd shutdown


    【解决方案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;
            }
        }
    

    【讨论】:

      【解决方案2】:

      在 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秒后关机'");

      【讨论】:

      • 您好,还是不行,我多次尝试更改代码,但仍然不行我知道网络连接正常,因为我尝试运行命令提示符并关闭远程计算机.留给我的唯一选择是使用 C# 通过具有远程关闭命令的 .bat 文件执行程序。
      【解决方案3】:

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

      WMI to reboot remote machine

      如果你看Win32Shutdown方法

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

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

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

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

      【讨论】:

      • 我可以知道什么是“标志”以及数字 2 和 1 我对这些代码一无所知。
      • 不管怎样,我忘了打开你的链接,刚才我发现这有一个与我现在正在做的事情相关的好内容。谢谢。
      【解决方案4】:

      这应该可行:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          See here for details.

          【讨论】:

          • 是的,是的,我已经尝试过,我也尝试过纯 cmd,它可以工作,但在 c# 中它不是!
          【解决方案7】:

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

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

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

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

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

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

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

          -f 对我不起作用

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

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

          感谢大家的快速回复

          【讨论】:

          • 正如其他人已经说过的,这是一个问答网站,而不是论坛。每次发布答案时,您都应该回答问题,而不是就之前的答案展开对话。也就是说,在这里你似乎有一个解决方案,如果它是可读的,那就没问题了。请访问help center 并了解如何格式化您的答案,然后回到这里并edit 它。此外,如果您的答案基于另一个答案,请添加一个链接。顺序并不总是相同的(例如,它取决于投票)。谢谢!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多