superuser_windows.go 921 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. // Copyright (C) 2017 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package syncthing
  7. import "syscall"
  8. // https://docs.microsoft.com/windows/win32/secauthz/well-known-sids
  9. const securityLocalSystemRID = "S-1-5-18"
  10. func isSuperUser() bool {
  11. tok, err := syscall.OpenCurrentProcessToken()
  12. if err != nil {
  13. l.Debugln("OpenCurrentProcessToken:", err)
  14. return false
  15. }
  16. defer tok.Close()
  17. user, err := tok.GetTokenUser()
  18. if err != nil {
  19. l.Debugln("GetTokenUser:", err)
  20. return false
  21. }
  22. if user.User.Sid == nil {
  23. l.Debugln("sid is nil")
  24. return false
  25. }
  26. sid, err := user.User.Sid.String()
  27. if err != nil {
  28. l.Debugln("Sid.String():", err)
  29. return false
  30. }
  31. l.Debugf("SID: %q", sid)
  32. return sid == securityLocalSystemRID
  33. }