golang 调用win32 api 实现windows注销、重启、关机

180it 2021-09-25 AM 100℃ 0条

golang 调用win32 api 实现windows注销、重启、关机

这是一个创建于 2016-07-02 19:00:01 的文章,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "flag"
    "fmt"
)

import (
    . "github.com/CodyGuo/win"
)

var (
    arg string
)

func init() {
    flag.StringVar(&arg, "uFlags", "", "shutdown logoff reboot")
}

func main() {
    flag.Parse()

    switch arg {
    case "logoff":
        logoff()
    case "reboot":
        reboot()
    case "shutdown":
        shutdown()
    default:
        fmt.Println("您输入的参数有误.")
    }
}

func logoff() {
    ExitWindowsEx(EWX_LOGOFF, 0)
}

func reboot() {
    getPrivileges()
    ExitWindowsEx(EWX_REBOOT, 0)
}

func shutdown() {
    getPrivileges()
    ExitWindowsEx(EWX_SHUTDOWN, 0)
}

func getPrivileges() {
    var hToken HANDLE
    var tkp TOKEN_PRIVILEGES

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken)
    LookupPrivilegeValueA(nil, StringToBytePtr(SE_SHUTDOWN_NAME), &tkp.Privileges[0].Luid)
    tkp.PrivilegeCount = 1
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED
    AdjustTokenPrivileges(hToken, false, &tkp, 0, nil, nil)
}
支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

golang 调用win32 api 实现windows注销、重启、关机