util/os_windows.go

55 lines
1.4 KiB
Go

//go:build windows
// +build windows
package util
import (
"log"
"os"
"path/filepath"
"golang.org/x/sys/windows"
)
// IsSuperUser returns true, if the current user is a super user
// A.K.A root, Administrator etc
func IsSuperUser() bool {
var sid *windows.SID
// Although this looks scary, it is directly copied from the
// official windows documentation. The Go API for this is a
// direct wrap around the official C++ API.
// See https://docs.microsoft.com/en-us/windows/desktop/api/securitybaseapi/nf-securitybaseapi-checktokenmembership
err := windows.AllocateAndInitializeSid(
&windows.SECURITY_NT_AUTHORITY,
2,
windows.SECURITY_BUILTIN_DOMAIN_RID,
windows.DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&sid)
if err != nil {
log.Fatalf("SID Error: %s", err)
return false
}
defer windows.FreeSid(sid)
// This appears to cast a null pointer so I'm not sure why this
// works, but this guy says it does and it Works for Me™:
// https://github.com/golang/go/issues/28804#issuecomment-438838144
token := windows.Token(0)
member, err := token.IsMember(sid)
if err != nil {
log.Fatalf("Token Membership Error: %s", err)
return false
}
return member
}
// GetGlobalConfigurationDirectory returns OS specific location for putting
// global configuration files
func GetGlobalConfigurationDirectory(appname string) string {
return filepath.Join(os.Getenv("APPDATA"), appname)
}