Jaki jest najlepszy sposób na wyłączenie komputera z poziomu programu C #?
Znalazłem kilka metod, które działają - zamieszczę je poniżej - ale żadna z nich nie jest zbyt elegancka. Szukam czegoś, co jest prostsze i natywnie .net.
Działa począwszy od systemu Windows XP, niedostępne w wersji 2000 lub niższej:
To najszybszy sposób:
Process.Start("shutdown","/s /t 0");
W przeciwnym razie użyj P / Invoke lub WMI, jak powiedzieli inni.
Edycja: jak uniknąć tworzenia okna
var psi = new ProcessStartInfo("shutdown","/s /t 0");
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process.Start(psi);
Zaczerpnięte z: post Geekpedia
Ta metoda wykorzystuje WMI do zamykania okien.
Aby z tego skorzystać, musisz dodać odwołanie do System.Management do projektu.
źródło
Ten wątek zawiera niezbędny kod: http://bytes.com/forum/thread251367.html
ale oto odpowiedni kod:
Stosowanie:
lub
źródło
Różne metody:
ZA.
System.Diagnostics.Process.Start("Shutdown", "-s -t 10");
B. Instrumentacja zarządzania Windows (WMI)
C. System.Runtime.InteropServices Pinvoke
D. Zarządzanie systemem
Po przesłaniu, widziałem, że wielu innych również opublikowało ...
źródło
Stara brzydka metoda. Użyj
ExitWindowsEx
funkcji z interfejsu API Win32.W kodzie produkcyjnym powinieneś sprawdzać zwracane wartości wywołań API, ale pominąłem to, aby przykład był jaśniejszy.
źródło
Krótkie i słodkie. Zadzwoń do programu zewnętrznego:
Uwaga: wywołuje to program Shutdown.exe systemu Windows, więc będzie działać tylko wtedy, gdy ten program jest dostępny. Mogą wystąpić problemy w systemie Windows 2000 (gdzie shutdown.exe jest dostępny tylko w zestawie zasobów) lub w systemie XP Embedded .
źródło
Powinno działać.
W przypadku ponownego uruchomienia to / r
Spowoduje to bezpośrednie i czyste ponowne uruchomienie komputera bez okien dialogowych.
źródło
shutdown /s /t 0 //For shutdown
shutdown /r /t 0 //For restart
shutdown /h /t 0 //For hibernate
Spróbuj także wpisać je do CMD, aby uzyskać ten sam wynik.Możesz uruchomić proces zamykania:
shutdown -s -t 0
- Zamknąćshutdown -r -t 0
- Uruchom ponownieźródło
Zauważ, że
shutdown.exe
jest to tylko otokaInitiateSystemShutdownEx
, która zapewnia brakujące elementyExitWindowsEx
źródło
Miałem problem z użyciem metody WMI zaakceptowanej powyżej, ponieważ zawsze miałem uprawnienia nie posiadane wyjątki pomimo uruchamiania programu jako administrator.
Rozwiązanie polegało na tym, że proces zażądał uprawnienia dla siebie. Odpowiedź znalazłem pod adresem http://www.dotnet247.com/247reference/msgs/58/292150.aspx, napisaną przez gościa imieniem Richard Hill.
Poniżej wkleiłem moje podstawowe użycie jego rozwiązania na wypadek, gdyby ten link się zestarzał.
źródło
Aby dodać do odpowiedzi Pop Catalina, oto jedna linijka, która wyłącza komputer bez wyświetlania żadnych okien:
źródło
Wypróbowałem metodę WMI roomaroo, aby zamknąć Windows 2003 Server, ale nie zadziała, dopóki nie dodam `[STAThread] '(tj. Model wątków " Single Threaded Apartment ") do deklaracji Main ():
Następnie próbowałem zamknąć system z wątku i aby to zadziałało, musiałem również ustawić „Stan mieszkania” wątku na STA:
Jestem noobem C #, więc nie jestem do końca pewien, jakie znaczenie mają wątki STA w kontekście zamykania systemu (nawet po przeczytaniu linku, który zamieściłem powyżej). Może ktoś inny rozwiąże…?
źródło
Main()
nie trzeba[STAThread]
.** Rozszerzona odpowiedź ...
źródło
Użyj shutdown.exe. Aby uniknąć problemu z przekazywaniem argumentów, złożonym wykonywaniem, wykonywaniem z WindowForms użyj skryptu wykonywania PowerShell:
System.Management.Automation.dll powinien być zainstalowany w systemie operacyjnym i dostępny w GAC.
Przepraszam za mój angielski.
źródło
Nie ma macierzystej metody .net do wyłączania komputera. Musisz P / Wywołać wywołanie API ExitWindows lub ExitWindowsEx.
źródło
Jeśli chcesz zdalnie wyłączyć komputer, możesz użyć
po kliknięciu dowolnego przycisku
źródło