2023-01-27 21:37:20 +00:00
// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
2021-02-27 04:42:00 +00:00
2022-02-02 17:55:32 +00:00
// Package winutil contains misc Windows/Win32 helper functions.
2021-02-27 04:42:00 +00:00
package winutil
2022-11-24 22:51:19 +00:00
import (
"os/user"
)
2023-10-23 17:54:53 +00:00
const (
// RegBase is the registry path inside HKEY_LOCAL_MACHINE where registry settings
// are stored. This constant is a non-empty string only when GOOS=windows.
RegBase = regBase
// RegPolicyBase is the registry path inside HKEY_LOCAL_MACHINE where registry
// policies are stored. This constant is a non-empty string only when
// GOOS=windows.
RegPolicyBase = regPolicyBase
)
2021-03-18 17:23:56 +00:00
2022-01-10 20:10:02 +00:00
// GetPolicyString looks up a registry value in the local machine's path for
2023-09-26 17:15:11 +00:00
// system policies, or returns empty string and the error.
2022-01-10 20:10:02 +00:00
// Use this function to read values that may be set by sysadmins via the MSI
// installer or via GPO. For registry settings that you do *not* want to be
// visible to sysadmin tools, use GetRegString instead.
//
// This function will only work on GOOS=windows. Trying to run it on any other
2023-09-26 17:15:11 +00:00
// OS will always return an empty string and ErrNoValue.
// If value does not exist or another error happens, returns empty string and error.
func GetPolicyString ( name string ) ( string , error ) {
return getPolicyString ( name )
2022-01-10 20:10:02 +00:00
}
// GetPolicyInteger looks up a registry value in the local machine's path for
2023-09-26 17:15:11 +00:00
// system policies, or returns 0 and the associated error.
2022-01-10 20:10:02 +00:00
// Use this function to read values that may be set by sysadmins via the MSI
// installer or via GPO. For registry settings that you do *not* want to be
// visible to sysadmin tools, use GetRegInteger instead.
//
// This function will only work on GOOS=windows. Trying to run it on any other
2023-09-26 17:15:11 +00:00
// OS will always return 0 and ErrNoValue.
// If value does not exist or another error happens, returns 0 and error.
func GetPolicyInteger ( name string ) ( uint64 , error ) {
return getPolicyInteger ( name )
2022-01-10 20:10:02 +00:00
}
// GetRegString looks up a registry path in the local machine path, or returns
2023-09-26 17:15:11 +00:00
// an empty string and error.
2021-03-18 17:23:56 +00:00
//
// This function will only work on GOOS=windows. Trying to run it on any other
2023-09-26 17:15:11 +00:00
// OS will always return an empty string and ErrNoValue.
// If value does not exist or another error happens, returns empty string and error.
func GetRegString ( name string ) ( string , error ) {
return getRegString ( name )
2021-03-18 17:23:56 +00:00
}
2021-06-30 00:33:17 +00:00
2022-01-10 20:10:02 +00:00
// GetRegInteger looks up a registry path in the local machine path, or returns
2023-09-26 17:15:11 +00:00
// 0 and the error.
2021-09-28 22:29:47 +00:00
//
// This function will only work on GOOS=windows. Trying to run it on any other
2023-09-26 17:15:11 +00:00
// OS will always return 0 and ErrNoValue.
// If value does not exist or another error happens, returns 0 and error.
func GetRegInteger ( name string ) ( uint64 , error ) {
return getRegInteger ( name )
2021-09-28 22:29:47 +00:00
}
2022-02-02 17:55:32 +00:00
// IsSIDValidPrincipal determines whether the SID contained in uid represents a
// type that is a valid security principal under Windows. This check helps us
// work around a bug in the standard library's Windows implementation of
// LookupId in os/user.
// See https://github.com/tailscale/tailscale/issues/869
//
// This function will only work on GOOS=windows. Trying to run it on any other
// OS will always return false.
func IsSIDValidPrincipal ( uid string ) bool {
return isSIDValidPrincipal ( uid )
2021-06-30 00:33:17 +00:00
}
2022-11-24 22:51:19 +00:00
// LookupPseudoUser attempts to resolve the user specified by uid by checking
// against well-known pseudo-users on Windows. This is a temporary workaround
// until https://github.com/golang/go/issues/49509 is resolved and shipped.
//
// This function will only work on GOOS=windows. Trying to run it on any other
// OS will always return an error.
func LookupPseudoUser ( uid string ) ( * user . User , error ) {
return lookupPseudoUser ( uid )
}
2023-08-17 20:47:01 +00:00
// RegisterForRestartOpts supplies options to RegisterForRestart.
type RegisterForRestartOpts struct {
RestartOnCrash bool // When true, this program will be restarted after a crash.
RestartOnHang bool // When true, this program will be restarted after a hang.
RestartOnUpgrade bool // When true, this program will be restarted after an upgrade.
RestartOnReboot bool // When true, this program will be restarted after a reboot.
UseCmdLineArgs bool // When true, CmdLineArgs will be used as the program's arguments upon restart. Otherwise no arguments will be provided.
CmdLineArgs [ ] string // When UseCmdLineArgs == true, contains the command line arguments, excluding the executable name itself. If nil or empty, the arguments from the current process will be re-used.
}
// RegisterForRestart registers the current process' restart preferences with
// the Windows Restart Manager. This enables the OS to intelligently restart
// the calling executable as requested via opts. This should be called by any
// programs which need to be restarted by the installer post-update.
//
// This function may be called multiple times; the opts from the most recent
// call will override those from any previous invocations.
//
// This function will only work on GOOS=windows. Trying to run it on any other
// OS will always return nil.
func RegisterForRestart ( opts RegisterForRestartOpts ) error {
return registerForRestart ( opts )
}