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  }