2021-02-27 04:42:00 +00:00
|
|
|
// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
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"
|
|
|
|
)
|
|
|
|
|
2022-02-02 17:55:32 +00:00
|
|
|
// 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.
|
|
|
|
const RegBase = regBase
|
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
|
|
|
|
// system policies, or returns the given default if it can't.
|
|
|
|
// 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
|
|
|
|
// OS will always return the default value.
|
|
|
|
func GetPolicyString(name, defval string) string {
|
|
|
|
return getPolicyString(name, defval)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetPolicyInteger looks up a registry value in the local machine's path for
|
|
|
|
// system policies, or returns the given default if it can't.
|
|
|
|
// 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
|
|
|
|
// OS will always return the default value.
|
|
|
|
func GetPolicyInteger(name string, defval uint64) uint64 {
|
|
|
|
return getPolicyInteger(name, defval)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetRegString looks up a registry path in the local machine path, or returns
|
2021-03-18 17:23:56 +00:00
|
|
|
// the given default if it can't.
|
|
|
|
//
|
|
|
|
// This function will only work on GOOS=windows. Trying to run it on any other
|
|
|
|
// OS will always return the default value.
|
|
|
|
func GetRegString(name, defval string) string {
|
2022-02-02 17:55:32 +00:00
|
|
|
return getRegString(name, defval)
|
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
|
2021-09-28 22:29:47 +00:00
|
|
|
// the given default if it can't.
|
|
|
|
//
|
|
|
|
// This function will only work on GOOS=windows. Trying to run it on any other
|
|
|
|
// OS will always return the default value.
|
|
|
|
func GetRegInteger(name string, defval uint64) uint64 {
|
2022-02-02 17:55:32 +00:00
|
|
|
return getRegInteger(name, defval)
|
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)
|
|
|
|
}
|