Как выключить компьютер из C # - PullRequest
131 голосов
/ 19 сентября 2008

Как лучше всего выключить компьютер из программы на C #?

Я нашел несколько методов, которые работают - я опубликую их ниже - но ни один из них не очень изящен. Я ищу что-то более простое и изначально .net.

Ответы [ 16 ]

3 голосов
/ 18 июня 2017

Просто добавьте к ответу Pop Catalin, вот один вкладыш , который выключает компьютер без отображения окон:

Process.Start(new ProcessStartInfo("shutdown", "/s /t 0") {
  CreateNoWindow = true, UseShellExecute = false
});
2 голосов
/ 05 августа 2011

** Разработанный ответ ...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
// Remember to add a reference to the System.Management assembly
using System.Management;
using System.Diagnostics;

namespace ShutDown
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnShutDown_Click(object sender, EventArgs e)
        {
            ManagementBaseObject mboShutdown = null;
            ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem");
            mcWin32.Get();

            // You can't shutdown without security privileges
            mcWin32.Scope.Options.EnablePrivileges = true;
            ManagementBaseObject mboShutdownParams = mcWin32.GetMethodParameters("Win32Shutdown");

            // Flag 1 means we want to shut down the system
            mboShutdownParams["Flags"] = "1";
            mboShutdownParams["Reserved"] = "0";

            foreach (ManagementObject manObj in mcWin32.GetInstances())
            {
                mboShutdown = manObj.InvokeMethod("Win32Shutdown", mboShutdownParams, null);
            }
        }
    }
}
2 голосов
/ 24 февраля 2011

Я пытался метод WMI roomaroo для выключения Windows 2003 Server, но он не работал, пока я не добавил `[STAThread] '(то есть модель потоков * Single Threaded Apartment ) в объявление Main ():

[STAThread]
public static void Main(string[] args) {
    Shutdown();
}

Затем я попытался отключиться от потока, и чтобы это работало, мне также пришлось установить «Состояние квартиры» потока на STA:

using System.Management;
using System.Threading;

public static class Program {

    [STAThread]
    public static void Main(string[] args) {
        Thread t = new Thread(new ThreadStart(Program.Shutdown));
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
        ...
    }

    public static void Shutdown() {
        // roomaroo's code
    }
}

Я ноб C #, поэтому я не совсем уверен в значении потоков STA с точки зрения выключения системы (даже после прочтения ссылки, которую я разместил выше). Возможно, кто-то еще может уточнить ...?

1 голос
/ 29 июля 2016

Используйте shutdown.exe. Чтобы избежать проблем с передачей аргументов, сложным выполнением, выполнением из WindowForms, используйте сценарий выполнения PowerShell:

using System.Management.Automation;
...
using (PowerShell PowerShellInstance = PowerShell.Create())
{
    PowerShellInstance.AddScript("shutdown -a; shutdown -r -t 100;");
    // invoke execution on the pipeline (collecting output)
    Collection<PSObject> PSOutput = PowerShellInstance.Invoke();
} 

System.Management.Automation.dll должен быть установлен в ОС и доступен в GAC.

Извините за мой английский.

0 голосов
/ 04 июня 2009

Если вы хотите выключить компьютер удаленно, вы можете использовать

Using System.Diagnostics;

при любом нажатии кнопки

{
    Process.Start("Shutdown","-i");
}
0 голосов
/ 19 сентября 2008

. Нет собственного метода .net для выключения компьютера. Вам необходимо выполнить P / Invoke для вызова API ExitWindows или ExitWindowsEx.

...