package windows import ( "github.com/sirupsen/logrus" "golang.org/x/sys/windows" ) func HasAdminRights() bool { var sid *windows.SID // See: https://coolaj86.com/articles/golang-and-windows-and-admins-oh-my/ if 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); err != nil { logrus.Warnf("SID allocation error: %s", err) return false } defer func() { _ = windows.FreeSid(sid) }() // From MS docs: // "If TokenHandle is NULL, CheckTokenMembership uses the impersonation // token of the calling thread. If the thread is not impersonating, // the function duplicates the thread's primary token to create an // impersonation token." token := windows.Token(0) member, err := token.IsMember(sid) if err != nil { logrus.Warnf("Token Membership Error: %s", err) return false } return member || token.IsElevated() }