golang.zx2c4.com/wireguard/windows@v0.5.4-0.20230123132234-dcc0eb72a04b/elevate/membership.go (about) 1 /* SPDX-License-Identifier: MIT 2 * 3 * Copyright (C) 2019-2022 WireGuard LLC. All Rights Reserved. 4 */ 5 6 package elevate 7 8 import ( 9 "golang.org/x/sys/windows" 10 ) 11 12 func isAdmin(token windows.Token) bool { 13 builtinAdminsGroup, err := windows.CreateWellKnownSid(windows.WinBuiltinAdministratorsSid) 14 if err != nil { 15 return false 16 } 17 var checkableToken windows.Token 18 err = windows.DuplicateTokenEx(token, windows.TOKEN_QUERY|windows.TOKEN_IMPERSONATE, nil, windows.SecurityIdentification, windows.TokenImpersonation, &checkableToken) 19 if err != nil { 20 return false 21 } 22 defer checkableToken.Close() 23 isAdmin, err := checkableToken.IsMember(builtinAdminsGroup) 24 return isAdmin && err == nil 25 } 26 27 func TokenIsElevatedOrElevatable(token windows.Token) bool { 28 if token.IsElevated() && isAdmin(token) { 29 return true 30 } 31 linked, err := token.GetLinkedToken() 32 if err != nil { 33 return false 34 } 35 defer linked.Close() 36 return linked.IsElevated() && isAdmin(linked) 37 } 38 39 func IsAdminDesktop() (bool, error) { 40 hwnd := windows.GetShellWindow() 41 if hwnd == 0 { 42 return false, windows.ERROR_INVALID_WINDOW_HANDLE 43 } 44 var pid uint32 45 _, err := windows.GetWindowThreadProcessId(hwnd, &pid) 46 if err != nil { 47 return false, err 48 } 49 process, err := windows.OpenProcess(windows.PROCESS_QUERY_INFORMATION, false, pid) 50 if err != nil { 51 return false, err 52 } 53 defer windows.CloseHandle(process) 54 var token windows.Token 55 err = windows.OpenProcessToken(process, windows.TOKEN_QUERY|windows.TOKEN_DUPLICATE, &token) 56 if err != nil { 57 return false, err 58 } 59 defer token.Close() 60 return TokenIsElevatedOrElevatable(token), nil 61 } 62 63 func AdminGroupName() string { 64 builtinAdminsGroup, err := windows.CreateWellKnownSid(windows.WinBuiltinAdministratorsSid) 65 if err != nil { 66 return "Administrators" 67 } 68 name, _, _, err := builtinAdminsGroup.LookupAccount("") 69 if err != nil { 70 return "Administrators" 71 } 72 return name 73 }