I am making a program that automates some tedious tasks for me, after the program is done I want to shutdown windows. I know this can be done in for example C#
How can I shutdown window using golang?
There is no "Shutdown OS" function in the syscall
package, because there is no common interface provided for that by all operating systems.
Note: there is a syscall.Shutdown()
function, but that is to shutdown a socket, and not to shutdown the operating system.
The easiest would be to just execute the shutdown
command using the os/exec
package, e.g.
if err := exec.Command("cmd", "/C", "shutdown", "/s").Run(); err != nil {
fmt.Println("Failed to initiate shutdown:", err)
}
The above command initiates a shutdown sequence which usually takes 1 minute to really shut down the system (and there's room to abort it with shutdown /a
). You may provide different arguments to the shutdown
command to not wait 1 minute but proceed immediately: shutdown /t 0 /s
(execute shutdown /?
to get a list of all options).
There is also a Windows API call to shutdown the system: ExitWindowsEx()
. It has 2 parameters, first is the flags to define the shutdown type (0x08
means Shuts down the system and turns off the power.
), second is to provide a reason for the shutdown. To call this from Go, you can do that like this:
user32 := syscall.MustLoadDLL("user32")
defer user32.Release()
exitwin := user32.MustFindProc("ExitWindowsEx")
r1, _, err := exitwin.Call(0x08, 0)
if r1 != 1 {
fmt.Println("Failed to initiate shutdown:", err)
}
But know that you need SE_SHUTDOWN_NAME
privilege to call ExitWindowsEx()
, else you get an error message like:
Failed to initiate shutdown: A required privilege is not held by the client.
See this example how to acquire the required privilege.