Blame vendor/golang.org/x/sys/windows/security_windows.go

Packit 63bb0d
// Copyright 2012 The Go Authors. All rights reserved.
Packit 63bb0d
// Use of this source code is governed by a BSD-style
Packit 63bb0d
// license that can be found in the LICENSE file.
Packit 63bb0d
Packit 63bb0d
package windows
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"syscall"
Packit 63bb0d
	"unsafe"
Packit Service 3a6627
Packit Service 3a6627
	"golang.org/x/sys/internal/unsafeheader"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	NameUnknown          = 0
Packit 63bb0d
	NameFullyQualifiedDN = 1
Packit 63bb0d
	NameSamCompatible    = 2
Packit 63bb0d
	NameDisplay          = 3
Packit 63bb0d
	NameUniqueId         = 6
Packit 63bb0d
	NameCanonical        = 7
Packit 63bb0d
	NameUserPrincipal    = 8
Packit 63bb0d
	NameCanonicalEx      = 9
Packit 63bb0d
	NameServicePrincipal = 10
Packit 63bb0d
	NameDnsDomain        = 12
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
Packit 63bb0d
// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx
Packit 63bb0d
//sys	TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW
Packit 63bb0d
//sys	GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW
Packit 63bb0d
Packit 63bb0d
// TranslateAccountName converts a directory service
Packit 63bb0d
// object name from one format to another.
Packit 63bb0d
func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) {
Packit 63bb0d
	u, e := UTF16PtrFromString(username)
Packit 63bb0d
	if e != nil {
Packit 63bb0d
		return "", e
Packit 63bb0d
	}
Packit 63bb0d
	n := uint32(50)
Packit 63bb0d
	for {
Packit 63bb0d
		b := make([]uint16, n)
Packit 63bb0d
		e = TranslateName(u, from, to, &b[0], &n)
Packit 63bb0d
		if e == nil {
Packit 63bb0d
			return UTF16ToString(b[:n]), nil
Packit 63bb0d
		}
Packit 63bb0d
		if e != ERROR_INSUFFICIENT_BUFFER {
Packit 63bb0d
			return "", e
Packit 63bb0d
		}
Packit 63bb0d
		if n <= uint32(len(b)) {
Packit 63bb0d
			return "", e
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	// do not reorder
Packit 63bb0d
	NetSetupUnknownStatus = iota
Packit 63bb0d
	NetSetupUnjoined
Packit 63bb0d
	NetSetupWorkgroupName
Packit 63bb0d
	NetSetupDomainName
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type UserInfo10 struct {
Packit 63bb0d
	Name       *uint16
Packit 63bb0d
	Comment    *uint16
Packit 63bb0d
	UsrComment *uint16
Packit 63bb0d
	FullName   *uint16
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sys	NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo
Packit 63bb0d
//sys	NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation
Packit 63bb0d
//sys	NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	// do not reorder
Packit 63bb0d
	SidTypeUser = 1 + iota
Packit 63bb0d
	SidTypeGroup
Packit 63bb0d
	SidTypeDomain
Packit 63bb0d
	SidTypeAlias
Packit 63bb0d
	SidTypeWellKnownGroup
Packit 63bb0d
	SidTypeDeletedAccount
Packit 63bb0d
	SidTypeInvalid
Packit 63bb0d
	SidTypeUnknown
Packit 63bb0d
	SidTypeComputer
Packit 63bb0d
	SidTypeLabel
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type SidIdentifierAuthority struct {
Packit 63bb0d
	Value [6]byte
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
var (
Packit 63bb0d
	SECURITY_NULL_SID_AUTHORITY        = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}}
Packit 63bb0d
	SECURITY_WORLD_SID_AUTHORITY       = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}}
Packit 63bb0d
	SECURITY_LOCAL_SID_AUTHORITY       = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}}
Packit 63bb0d
	SECURITY_CREATOR_SID_AUTHORITY     = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}}
Packit 63bb0d
	SECURITY_NON_UNIQUE_AUTHORITY      = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}}
Packit 63bb0d
	SECURITY_NT_AUTHORITY              = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}}
Packit 63bb0d
	SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}}
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	SECURITY_NULL_RID                   = 0
Packit 63bb0d
	SECURITY_WORLD_RID                  = 0
Packit 63bb0d
	SECURITY_LOCAL_RID                  = 0
Packit 63bb0d
	SECURITY_CREATOR_OWNER_RID          = 0
Packit 63bb0d
	SECURITY_CREATOR_GROUP_RID          = 1
Packit 63bb0d
	SECURITY_DIALUP_RID                 = 1
Packit 63bb0d
	SECURITY_NETWORK_RID                = 2
Packit 63bb0d
	SECURITY_BATCH_RID                  = 3
Packit 63bb0d
	SECURITY_INTERACTIVE_RID            = 4
Packit 63bb0d
	SECURITY_LOGON_IDS_RID              = 5
Packit 63bb0d
	SECURITY_SERVICE_RID                = 6
Packit 63bb0d
	SECURITY_LOCAL_SYSTEM_RID           = 18
Packit 63bb0d
	SECURITY_BUILTIN_DOMAIN_RID         = 32
Packit 63bb0d
	SECURITY_PRINCIPAL_SELF_RID         = 10
Packit 63bb0d
	SECURITY_CREATOR_OWNER_SERVER_RID   = 0x2
Packit 63bb0d
	SECURITY_CREATOR_GROUP_SERVER_RID   = 0x3
Packit 63bb0d
	SECURITY_LOGON_IDS_RID_COUNT        = 0x3
Packit 63bb0d
	SECURITY_ANONYMOUS_LOGON_RID        = 0x7
Packit 63bb0d
	SECURITY_PROXY_RID                  = 0x8
Packit 63bb0d
	SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9
Packit 63bb0d
	SECURITY_SERVER_LOGON_RID           = SECURITY_ENTERPRISE_CONTROLLERS_RID
Packit 63bb0d
	SECURITY_AUTHENTICATED_USER_RID     = 0xb
Packit 63bb0d
	SECURITY_RESTRICTED_CODE_RID        = 0xc
Packit 63bb0d
	SECURITY_NT_NON_UNIQUE_RID          = 0x15
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Predefined domain-relative RIDs for local groups.
Packit 63bb0d
// See https://msdn.microsoft.com/en-us/library/windows/desktop/aa379649(v=vs.85).aspx
Packit 63bb0d
const (
Packit 63bb0d
	DOMAIN_ALIAS_RID_ADMINS                         = 0x220
Packit 63bb0d
	DOMAIN_ALIAS_RID_USERS                          = 0x221
Packit 63bb0d
	DOMAIN_ALIAS_RID_GUESTS                         = 0x222
Packit 63bb0d
	DOMAIN_ALIAS_RID_POWER_USERS                    = 0x223
Packit 63bb0d
	DOMAIN_ALIAS_RID_ACCOUNT_OPS                    = 0x224
Packit 63bb0d
	DOMAIN_ALIAS_RID_SYSTEM_OPS                     = 0x225
Packit 63bb0d
	DOMAIN_ALIAS_RID_PRINT_OPS                      = 0x226
Packit 63bb0d
	DOMAIN_ALIAS_RID_BACKUP_OPS                     = 0x227
Packit 63bb0d
	DOMAIN_ALIAS_RID_REPLICATOR                     = 0x228
Packit 63bb0d
	DOMAIN_ALIAS_RID_RAS_SERVERS                    = 0x229
Packit 63bb0d
	DOMAIN_ALIAS_RID_PREW2KCOMPACCESS               = 0x22a
Packit 63bb0d
	DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS           = 0x22b
Packit 63bb0d
	DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS      = 0x22c
Packit 63bb0d
	DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS = 0x22d
Packit 63bb0d
	DOMAIN_ALIAS_RID_MONITORING_USERS               = 0x22e
Packit 63bb0d
	DOMAIN_ALIAS_RID_LOGGING_USERS                  = 0x22f
Packit 63bb0d
	DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS            = 0x230
Packit 63bb0d
	DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS             = 0x231
Packit 63bb0d
	DOMAIN_ALIAS_RID_DCOM_USERS                     = 0x232
Packit 63bb0d
	DOMAIN_ALIAS_RID_IUSERS                         = 0x238
Packit 63bb0d
	DOMAIN_ALIAS_RID_CRYPTO_OPERATORS               = 0x239
Packit 63bb0d
	DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP     = 0x23b
Packit 63bb0d
	DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP = 0x23c
Packit 63bb0d
	DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP        = 0x23d
Packit 63bb0d
	DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP      = 0x23e
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
//sys	LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW
Packit 63bb0d
//sys	LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW
Packit 63bb0d
//sys	ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW
Packit 63bb0d
//sys	ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW
Packit 63bb0d
//sys	GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid
Packit 63bb0d
//sys	CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid
Packit 63bb0d
//sys	AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid
Packit 63bb0d
//sys	createWellKnownSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID, sid *SID, sizeSid *uint32) (err error) = advapi32.CreateWellKnownSid
Packit 63bb0d
//sys	isWellKnownSid(sid *SID, sidType WELL_KNOWN_SID_TYPE) (isWellKnown bool) = advapi32.IsWellKnownSid
Packit 63bb0d
//sys	FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid
Packit 63bb0d
//sys	EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid
Packit 63bb0d
//sys	getSidIdentifierAuthority(sid *SID) (authority *SidIdentifierAuthority) = advapi32.GetSidIdentifierAuthority
Packit 63bb0d
//sys	getSidSubAuthorityCount(sid *SID) (count *uint8) = advapi32.GetSidSubAuthorityCount
Packit 63bb0d
//sys	getSidSubAuthority(sid *SID, index uint32) (subAuthority *uint32) = advapi32.GetSidSubAuthority
Packit 63bb0d
//sys	isValidSid(sid *SID) (isValid bool) = advapi32.IsValidSid
Packit 63bb0d
Packit 63bb0d
// The security identifier (SID) structure is a variable-length
Packit 63bb0d
// structure used to uniquely identify users or groups.
Packit 63bb0d
type SID struct{}
Packit 63bb0d
Packit 63bb0d
// StringToSid converts a string-format security identifier
Packit 63bb0d
// SID into a valid, functional SID.
Packit 63bb0d
func StringToSid(s string) (*SID, error) {
Packit 63bb0d
	var sid *SID
Packit 63bb0d
	p, e := UTF16PtrFromString(s)
Packit 63bb0d
	if e != nil {
Packit 63bb0d
		return nil, e
Packit 63bb0d
	}
Packit 63bb0d
	e = ConvertStringSidToSid(p, &sid)
Packit 63bb0d
	if e != nil {
Packit 63bb0d
		return nil, e
Packit 63bb0d
	}
Packit 63bb0d
	defer LocalFree((Handle)(unsafe.Pointer(sid)))
Packit 63bb0d
	return sid.Copy()
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// LookupSID retrieves a security identifier SID for the account
Packit 63bb0d
// and the name of the domain on which the account was found.
Packit 63bb0d
// System specify target computer to search.
Packit 63bb0d
func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) {
Packit 63bb0d
	if len(account) == 0 {
Packit 63bb0d
		return nil, "", 0, syscall.EINVAL
Packit 63bb0d
	}
Packit 63bb0d
	acc, e := UTF16PtrFromString(account)
Packit 63bb0d
	if e != nil {
Packit 63bb0d
		return nil, "", 0, e
Packit 63bb0d
	}
Packit 63bb0d
	var sys *uint16
Packit 63bb0d
	if len(system) > 0 {
Packit 63bb0d
		sys, e = UTF16PtrFromString(system)
Packit 63bb0d
		if e != nil {
Packit 63bb0d
			return nil, "", 0, e
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
	n := uint32(50)
Packit 63bb0d
	dn := uint32(50)
Packit 63bb0d
	for {
Packit 63bb0d
		b := make([]byte, n)
Packit 63bb0d
		db := make([]uint16, dn)
Packit 63bb0d
		sid = (*SID)(unsafe.Pointer(&b[0]))
Packit 63bb0d
		e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType)
Packit 63bb0d
		if e == nil {
Packit 63bb0d
			return sid, UTF16ToString(db), accType, nil
Packit 63bb0d
		}
Packit 63bb0d
		if e != ERROR_INSUFFICIENT_BUFFER {
Packit 63bb0d
			return nil, "", 0, e
Packit 63bb0d
		}
Packit 63bb0d
		if n <= uint32(len(b)) {
Packit 63bb0d
			return nil, "", 0, e
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// String converts SID to a string format suitable for display, storage, or transmission.
Packit 63bb0d
func (sid *SID) String() string {
Packit 63bb0d
	var s *uint16
Packit 63bb0d
	e := ConvertSidToStringSid(sid, &s)
Packit 63bb0d
	if e != nil {
Packit 63bb0d
		return ""
Packit 63bb0d
	}
Packit 63bb0d
	defer LocalFree((Handle)(unsafe.Pointer(s)))
Packit 63bb0d
	return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:])
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Len returns the length, in bytes, of a valid security identifier SID.
Packit 63bb0d
func (sid *SID) Len() int {
Packit 63bb0d
	return int(GetLengthSid(sid))
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Copy creates a duplicate of security identifier SID.
Packit 63bb0d
func (sid *SID) Copy() (*SID, error) {
Packit 63bb0d
	b := make([]byte, sid.Len())
Packit 63bb0d
	sid2 := (*SID)(unsafe.Pointer(&b[0]))
Packit 63bb0d
	e := CopySid(uint32(len(b)), sid2, sid)
Packit 63bb0d
	if e != nil {
Packit 63bb0d
		return nil, e
Packit 63bb0d
	}
Packit 63bb0d
	return sid2, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// IdentifierAuthority returns the identifier authority of the SID.
Packit 63bb0d
func (sid *SID) IdentifierAuthority() SidIdentifierAuthority {
Packit 63bb0d
	return *getSidIdentifierAuthority(sid)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SubAuthorityCount returns the number of sub-authorities in the SID.
Packit 63bb0d
func (sid *SID) SubAuthorityCount() uint8 {
Packit 63bb0d
	return *getSidSubAuthorityCount(sid)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SubAuthority returns the sub-authority of the SID as specified by
Packit 63bb0d
// the index, which must be less than sid.SubAuthorityCount().
Packit 63bb0d
func (sid *SID) SubAuthority(idx uint32) uint32 {
Packit 63bb0d
	if idx >= uint32(sid.SubAuthorityCount()) {
Packit 63bb0d
		panic("sub-authority index out of range")
Packit 63bb0d
	}
Packit 63bb0d
	return *getSidSubAuthority(sid, idx)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// IsValid returns whether the SID has a valid revision and length.
Packit 63bb0d
func (sid *SID) IsValid() bool {
Packit 63bb0d
	return isValidSid(sid)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Equals compares two SIDs for equality.
Packit 63bb0d
func (sid *SID) Equals(sid2 *SID) bool {
Packit 63bb0d
	return EqualSid(sid, sid2)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// IsWellKnown determines whether the SID matches the well-known sidType.
Packit 63bb0d
func (sid *SID) IsWellKnown(sidType WELL_KNOWN_SID_TYPE) bool {
Packit 63bb0d
	return isWellKnownSid(sid, sidType)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// LookupAccount retrieves the name of the account for this SID
Packit 63bb0d
// and the name of the first domain on which this SID is found.
Packit 63bb0d
// System specify target computer to search for.
Packit 63bb0d
func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) {
Packit 63bb0d
	var sys *uint16
Packit 63bb0d
	if len(system) > 0 {
Packit 63bb0d
		sys, err = UTF16PtrFromString(system)
Packit 63bb0d
		if err != nil {
Packit 63bb0d
			return "", "", 0, err
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
	n := uint32(50)
Packit 63bb0d
	dn := uint32(50)
Packit 63bb0d
	for {
Packit 63bb0d
		b := make([]uint16, n)
Packit 63bb0d
		db := make([]uint16, dn)
Packit 63bb0d
		e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType)
Packit 63bb0d
		if e == nil {
Packit 63bb0d
			return UTF16ToString(b), UTF16ToString(db), accType, nil
Packit 63bb0d
		}
Packit 63bb0d
		if e != ERROR_INSUFFICIENT_BUFFER {
Packit 63bb0d
			return "", "", 0, e
Packit 63bb0d
		}
Packit 63bb0d
		if n <= uint32(len(b)) {
Packit 63bb0d
			return "", "", 0, e
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Various types of pre-specified SIDs that can be synthesized and compared at runtime.
Packit 63bb0d
type WELL_KNOWN_SID_TYPE uint32
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	WinNullSid                                    = 0
Packit 63bb0d
	WinWorldSid                                   = 1
Packit 63bb0d
	WinLocalSid                                   = 2
Packit 63bb0d
	WinCreatorOwnerSid                            = 3
Packit 63bb0d
	WinCreatorGroupSid                            = 4
Packit 63bb0d
	WinCreatorOwnerServerSid                      = 5
Packit 63bb0d
	WinCreatorGroupServerSid                      = 6
Packit 63bb0d
	WinNtAuthoritySid                             = 7
Packit 63bb0d
	WinDialupSid                                  = 8
Packit 63bb0d
	WinNetworkSid                                 = 9
Packit 63bb0d
	WinBatchSid                                   = 10
Packit 63bb0d
	WinInteractiveSid                             = 11
Packit 63bb0d
	WinServiceSid                                 = 12
Packit 63bb0d
	WinAnonymousSid                               = 13
Packit 63bb0d
	WinProxySid                                   = 14
Packit 63bb0d
	WinEnterpriseControllersSid                   = 15
Packit 63bb0d
	WinSelfSid                                    = 16
Packit 63bb0d
	WinAuthenticatedUserSid                       = 17
Packit 63bb0d
	WinRestrictedCodeSid                          = 18
Packit 63bb0d
	WinTerminalServerSid                          = 19
Packit 63bb0d
	WinRemoteLogonIdSid                           = 20
Packit 63bb0d
	WinLogonIdsSid                                = 21
Packit 63bb0d
	WinLocalSystemSid                             = 22
Packit 63bb0d
	WinLocalServiceSid                            = 23
Packit 63bb0d
	WinNetworkServiceSid                          = 24
Packit 63bb0d
	WinBuiltinDomainSid                           = 25
Packit 63bb0d
	WinBuiltinAdministratorsSid                   = 26
Packit 63bb0d
	WinBuiltinUsersSid                            = 27
Packit 63bb0d
	WinBuiltinGuestsSid                           = 28
Packit 63bb0d
	WinBuiltinPowerUsersSid                       = 29
Packit 63bb0d
	WinBuiltinAccountOperatorsSid                 = 30
Packit 63bb0d
	WinBuiltinSystemOperatorsSid                  = 31
Packit 63bb0d
	WinBuiltinPrintOperatorsSid                   = 32
Packit 63bb0d
	WinBuiltinBackupOperatorsSid                  = 33
Packit 63bb0d
	WinBuiltinReplicatorSid                       = 34
Packit 63bb0d
	WinBuiltinPreWindows2000CompatibleAccessSid   = 35
Packit 63bb0d
	WinBuiltinRemoteDesktopUsersSid               = 36
Packit 63bb0d
	WinBuiltinNetworkConfigurationOperatorsSid    = 37
Packit 63bb0d
	WinAccountAdministratorSid                    = 38
Packit 63bb0d
	WinAccountGuestSid                            = 39
Packit 63bb0d
	WinAccountKrbtgtSid                           = 40
Packit 63bb0d
	WinAccountDomainAdminsSid                     = 41
Packit 63bb0d
	WinAccountDomainUsersSid                      = 42
Packit 63bb0d
	WinAccountDomainGuestsSid                     = 43
Packit 63bb0d
	WinAccountComputersSid                        = 44
Packit 63bb0d
	WinAccountControllersSid                      = 45
Packit 63bb0d
	WinAccountCertAdminsSid                       = 46
Packit 63bb0d
	WinAccountSchemaAdminsSid                     = 47
Packit 63bb0d
	WinAccountEnterpriseAdminsSid                 = 48
Packit 63bb0d
	WinAccountPolicyAdminsSid                     = 49
Packit 63bb0d
	WinAccountRasAndIasServersSid                 = 50
Packit 63bb0d
	WinNTLMAuthenticationSid                      = 51
Packit 63bb0d
	WinDigestAuthenticationSid                    = 52
Packit 63bb0d
	WinSChannelAuthenticationSid                  = 53
Packit 63bb0d
	WinThisOrganizationSid                        = 54
Packit 63bb0d
	WinOtherOrganizationSid                       = 55
Packit 63bb0d
	WinBuiltinIncomingForestTrustBuildersSid      = 56
Packit 63bb0d
	WinBuiltinPerfMonitoringUsersSid              = 57
Packit 63bb0d
	WinBuiltinPerfLoggingUsersSid                 = 58
Packit 63bb0d
	WinBuiltinAuthorizationAccessSid              = 59
Packit 63bb0d
	WinBuiltinTerminalServerLicenseServersSid     = 60
Packit 63bb0d
	WinBuiltinDCOMUsersSid                        = 61
Packit 63bb0d
	WinBuiltinIUsersSid                           = 62
Packit 63bb0d
	WinIUserSid                                   = 63
Packit 63bb0d
	WinBuiltinCryptoOperatorsSid                  = 64
Packit 63bb0d
	WinUntrustedLabelSid                          = 65
Packit 63bb0d
	WinLowLabelSid                                = 66
Packit 63bb0d
	WinMediumLabelSid                             = 67
Packit 63bb0d
	WinHighLabelSid                               = 68
Packit 63bb0d
	WinSystemLabelSid                             = 69
Packit 63bb0d
	WinWriteRestrictedCodeSid                     = 70
Packit 63bb0d
	WinCreatorOwnerRightsSid                      = 71
Packit 63bb0d
	WinCacheablePrincipalsGroupSid                = 72
Packit 63bb0d
	WinNonCacheablePrincipalsGroupSid             = 73
Packit 63bb0d
	WinEnterpriseReadonlyControllersSid           = 74
Packit 63bb0d
	WinAccountReadonlyControllersSid              = 75
Packit 63bb0d
	WinBuiltinEventLogReadersGroup                = 76
Packit 63bb0d
	WinNewEnterpriseReadonlyControllersSid        = 77
Packit 63bb0d
	WinBuiltinCertSvcDComAccessGroup              = 78
Packit 63bb0d
	WinMediumPlusLabelSid                         = 79
Packit 63bb0d
	WinLocalLogonSid                              = 80
Packit 63bb0d
	WinConsoleLogonSid                            = 81
Packit 63bb0d
	WinThisOrganizationCertificateSid             = 82
Packit 63bb0d
	WinApplicationPackageAuthoritySid             = 83
Packit 63bb0d
	WinBuiltinAnyPackageSid                       = 84
Packit 63bb0d
	WinCapabilityInternetClientSid                = 85
Packit 63bb0d
	WinCapabilityInternetClientServerSid          = 86
Packit 63bb0d
	WinCapabilityPrivateNetworkClientServerSid    = 87
Packit 63bb0d
	WinCapabilityPicturesLibrarySid               = 88
Packit 63bb0d
	WinCapabilityVideosLibrarySid                 = 89
Packit 63bb0d
	WinCapabilityMusicLibrarySid                  = 90
Packit 63bb0d
	WinCapabilityDocumentsLibrarySid              = 91
Packit 63bb0d
	WinCapabilitySharedUserCertificatesSid        = 92
Packit 63bb0d
	WinCapabilityEnterpriseAuthenticationSid      = 93
Packit 63bb0d
	WinCapabilityRemovableStorageSid              = 94
Packit 63bb0d
	WinBuiltinRDSRemoteAccessServersSid           = 95
Packit 63bb0d
	WinBuiltinRDSEndpointServersSid               = 96
Packit 63bb0d
	WinBuiltinRDSManagementServersSid             = 97
Packit 63bb0d
	WinUserModeDriversSid                         = 98
Packit 63bb0d
	WinBuiltinHyperVAdminsSid                     = 99
Packit 63bb0d
	WinAccountCloneableControllersSid             = 100
Packit 63bb0d
	WinBuiltinAccessControlAssistanceOperatorsSid = 101
Packit 63bb0d
	WinBuiltinRemoteManagementUsersSid            = 102
Packit 63bb0d
	WinAuthenticationAuthorityAssertedSid         = 103
Packit 63bb0d
	WinAuthenticationServiceAssertedSid           = 104
Packit 63bb0d
	WinLocalAccountSid                            = 105
Packit 63bb0d
	WinLocalAccountAndAdministratorSid            = 106
Packit 63bb0d
	WinAccountProtectedUsersSid                   = 107
Packit 63bb0d
	WinCapabilityAppointmentsSid                  = 108
Packit 63bb0d
	WinCapabilityContactsSid                      = 109
Packit 63bb0d
	WinAccountDefaultSystemManagedSid             = 110
Packit 63bb0d
	WinBuiltinDefaultSystemManagedGroupSid        = 111
Packit 63bb0d
	WinBuiltinStorageReplicaAdminsSid             = 112
Packit 63bb0d
	WinAccountKeyAdminsSid                        = 113
Packit 63bb0d
	WinAccountEnterpriseKeyAdminsSid              = 114
Packit 63bb0d
	WinAuthenticationKeyTrustSid                  = 115
Packit 63bb0d
	WinAuthenticationKeyPropertyMFASid            = 116
Packit 63bb0d
	WinAuthenticationKeyPropertyAttestationSid    = 117
Packit 63bb0d
	WinAuthenticationFreshKeyAuthSid              = 118
Packit 63bb0d
	WinBuiltinDeviceOwnersSid                     = 119
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Creates a SID for a well-known predefined alias, generally using the constants of the form
Packit 63bb0d
// Win*Sid, for the local machine.
Packit 63bb0d
func CreateWellKnownSid(sidType WELL_KNOWN_SID_TYPE) (*SID, error) {
Packit 63bb0d
	return CreateWellKnownDomainSid(sidType, nil)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Creates a SID for a well-known predefined alias, generally using the constants of the form
Packit 63bb0d
// Win*Sid, for the domain specified by the domainSid parameter.
Packit 63bb0d
func CreateWellKnownDomainSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID) (*SID, error) {
Packit 63bb0d
	n := uint32(50)
Packit 63bb0d
	for {
Packit 63bb0d
		b := make([]byte, n)
Packit 63bb0d
		sid := (*SID)(unsafe.Pointer(&b[0]))
Packit 63bb0d
		err := createWellKnownSid(sidType, domainSid, sid, &n)
Packit 63bb0d
		if err == nil {
Packit 63bb0d
			return sid, nil
Packit 63bb0d
		}
Packit 63bb0d
		if err != ERROR_INSUFFICIENT_BUFFER {
Packit 63bb0d
			return nil, err
Packit 63bb0d
		}
Packit 63bb0d
		if n <= uint32(len(b)) {
Packit 63bb0d
			return nil, err
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	// do not reorder
Packit 63bb0d
	TOKEN_ASSIGN_PRIMARY = 1 << iota
Packit 63bb0d
	TOKEN_DUPLICATE
Packit 63bb0d
	TOKEN_IMPERSONATE
Packit 63bb0d
	TOKEN_QUERY
Packit 63bb0d
	TOKEN_QUERY_SOURCE
Packit 63bb0d
	TOKEN_ADJUST_PRIVILEGES
Packit 63bb0d
	TOKEN_ADJUST_GROUPS
Packit 63bb0d
	TOKEN_ADJUST_DEFAULT
Packit 63bb0d
	TOKEN_ADJUST_SESSIONID
Packit 63bb0d
Packit 63bb0d
	TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |
Packit 63bb0d
		TOKEN_ASSIGN_PRIMARY |
Packit 63bb0d
		TOKEN_DUPLICATE |
Packit 63bb0d
		TOKEN_IMPERSONATE |
Packit 63bb0d
		TOKEN_QUERY |
Packit 63bb0d
		TOKEN_QUERY_SOURCE |
Packit 63bb0d
		TOKEN_ADJUST_PRIVILEGES |
Packit 63bb0d
		TOKEN_ADJUST_GROUPS |
Packit 63bb0d
		TOKEN_ADJUST_DEFAULT |
Packit 63bb0d
		TOKEN_ADJUST_SESSIONID
Packit 63bb0d
	TOKEN_READ  = STANDARD_RIGHTS_READ | TOKEN_QUERY
Packit 63bb0d
	TOKEN_WRITE = STANDARD_RIGHTS_WRITE |
Packit 63bb0d
		TOKEN_ADJUST_PRIVILEGES |
Packit 63bb0d
		TOKEN_ADJUST_GROUPS |
Packit 63bb0d
		TOKEN_ADJUST_DEFAULT
Packit 63bb0d
	TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	// do not reorder
Packit 63bb0d
	TokenUser = 1 + iota
Packit 63bb0d
	TokenGroups
Packit 63bb0d
	TokenPrivileges
Packit 63bb0d
	TokenOwner
Packit 63bb0d
	TokenPrimaryGroup
Packit 63bb0d
	TokenDefaultDacl
Packit 63bb0d
	TokenSource
Packit 63bb0d
	TokenType
Packit 63bb0d
	TokenImpersonationLevel
Packit 63bb0d
	TokenStatistics
Packit 63bb0d
	TokenRestrictedSids
Packit 63bb0d
	TokenSessionId
Packit 63bb0d
	TokenGroupsAndPrivileges
Packit 63bb0d
	TokenSessionReference
Packit 63bb0d
	TokenSandBoxInert
Packit 63bb0d
	TokenAuditPolicy
Packit 63bb0d
	TokenOrigin
Packit 63bb0d
	TokenElevationType
Packit 63bb0d
	TokenLinkedToken
Packit 63bb0d
	TokenElevation
Packit 63bb0d
	TokenHasRestrictions
Packit 63bb0d
	TokenAccessInformation
Packit 63bb0d
	TokenVirtualizationAllowed
Packit 63bb0d
	TokenVirtualizationEnabled
Packit 63bb0d
	TokenIntegrityLevel
Packit 63bb0d
	TokenUIAccess
Packit 63bb0d
	TokenMandatoryPolicy
Packit 63bb0d
	TokenLogonSid
Packit 63bb0d
	MaxTokenInfoClass
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Group attributes inside of Tokengroups.Groups[i].Attributes
Packit 63bb0d
const (
Packit 63bb0d
	SE_GROUP_MANDATORY          = 0x00000001
Packit 63bb0d
	SE_GROUP_ENABLED_BY_DEFAULT = 0x00000002
Packit 63bb0d
	SE_GROUP_ENABLED            = 0x00000004
Packit 63bb0d
	SE_GROUP_OWNER              = 0x00000008
Packit 63bb0d
	SE_GROUP_USE_FOR_DENY_ONLY  = 0x00000010
Packit 63bb0d
	SE_GROUP_INTEGRITY          = 0x00000020
Packit 63bb0d
	SE_GROUP_INTEGRITY_ENABLED  = 0x00000040
Packit 63bb0d
	SE_GROUP_LOGON_ID           = 0xC0000000
Packit 63bb0d
	SE_GROUP_RESOURCE           = 0x20000000
Packit 63bb0d
	SE_GROUP_VALID_ATTRIBUTES   = SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_ENABLED | SE_GROUP_OWNER | SE_GROUP_USE_FOR_DENY_ONLY | SE_GROUP_LOGON_ID | SE_GROUP_RESOURCE | SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Privilege attributes
Packit 63bb0d
const (
Packit 63bb0d
	SE_PRIVILEGE_ENABLED_BY_DEFAULT = 0x00000001
Packit 63bb0d
	SE_PRIVILEGE_ENABLED            = 0x00000002
Packit 63bb0d
	SE_PRIVILEGE_REMOVED            = 0x00000004
Packit 63bb0d
	SE_PRIVILEGE_USED_FOR_ACCESS    = 0x80000000
Packit 63bb0d
	SE_PRIVILEGE_VALID_ATTRIBUTES   = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_REMOVED | SE_PRIVILEGE_USED_FOR_ACCESS
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Token types
Packit 63bb0d
const (
Packit 63bb0d
	TokenPrimary       = 1
Packit 63bb0d
	TokenImpersonation = 2
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Impersonation levels
Packit 63bb0d
const (
Packit 63bb0d
	SecurityAnonymous      = 0
Packit 63bb0d
	SecurityIdentification = 1
Packit 63bb0d
	SecurityImpersonation  = 2
Packit 63bb0d
	SecurityDelegation     = 3
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type LUID struct {
Packit 63bb0d
	LowPart  uint32
Packit 63bb0d
	HighPart int32
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type LUIDAndAttributes struct {
Packit 63bb0d
	Luid       LUID
Packit 63bb0d
	Attributes uint32
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type SIDAndAttributes struct {
Packit 63bb0d
	Sid        *SID
Packit 63bb0d
	Attributes uint32
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type Tokenuser struct {
Packit 63bb0d
	User SIDAndAttributes
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type Tokenprimarygroup struct {
Packit 63bb0d
	PrimaryGroup *SID
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type Tokengroups struct {
Packit 63bb0d
	GroupCount uint32
Packit 63bb0d
	Groups     [1]SIDAndAttributes // Use AllGroups() for iterating.
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// AllGroups returns a slice that can be used to iterate over the groups in g.
Packit 63bb0d
func (g *Tokengroups) AllGroups() []SIDAndAttributes {
Packit 63bb0d
	return (*[(1 << 28) - 1]SIDAndAttributes)(unsafe.Pointer(&g.Groups[0]))[:g.GroupCount:g.GroupCount]
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type Tokenprivileges struct {
Packit 63bb0d
	PrivilegeCount uint32
Packit 63bb0d
	Privileges     [1]LUIDAndAttributes // Use AllPrivileges() for iterating.
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// AllPrivileges returns a slice that can be used to iterate over the privileges in p.
Packit 63bb0d
func (p *Tokenprivileges) AllPrivileges() []LUIDAndAttributes {
Packit 63bb0d
	return (*[(1 << 27) - 1]LUIDAndAttributes)(unsafe.Pointer(&p.Privileges[0]))[:p.PrivilegeCount:p.PrivilegeCount]
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type Tokenmandatorylabel struct {
Packit 63bb0d
	Label SIDAndAttributes
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (tml *Tokenmandatorylabel) Size() uint32 {
Packit 63bb0d
	return uint32(unsafe.Sizeof(Tokenmandatorylabel{})) + GetLengthSid(tml.Label.Sid)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Authorization Functions
Packit 63bb0d
//sys	checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) = advapi32.CheckTokenMembership
Packit 63bb0d
//sys	OpenProcessToken(process Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken
Packit 63bb0d
//sys	OpenThreadToken(thread Handle, access uint32, openAsSelf bool, token *Token) (err error) = advapi32.OpenThreadToken
Packit 63bb0d
//sys	ImpersonateSelf(impersonationlevel uint32) (err error) = advapi32.ImpersonateSelf
Packit 63bb0d
//sys	RevertToSelf() (err error) = advapi32.RevertToSelf
Packit 63bb0d
//sys	SetThreadToken(thread *Handle, token Token) (err error) = advapi32.SetThreadToken
Packit 63bb0d
//sys	LookupPrivilegeValue(systemname *uint16, name *uint16, luid *LUID) (err error) = advapi32.LookupPrivilegeValueW
Packit 63bb0d
//sys	AdjustTokenPrivileges(token Token, disableAllPrivileges bool, newstate *Tokenprivileges, buflen uint32, prevstate *Tokenprivileges, returnlen *uint32) (err error) = advapi32.AdjustTokenPrivileges
Packit 63bb0d
//sys	AdjustTokenGroups(token Token, resetToDefault bool, newstate *Tokengroups, buflen uint32, prevstate *Tokengroups, returnlen *uint32) (err error) = advapi32.AdjustTokenGroups
Packit 63bb0d
//sys	GetTokenInformation(token Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation
Packit 63bb0d
//sys	SetTokenInformation(token Token, infoClass uint32, info *byte, infoLen uint32) (err error) = advapi32.SetTokenInformation
Packit 63bb0d
//sys	DuplicateTokenEx(existingToken Token, desiredAccess uint32, tokenAttributes *SecurityAttributes, impersonationLevel uint32, tokenType uint32, newToken *Token) (err error) = advapi32.DuplicateTokenEx
Packit 63bb0d
//sys	GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW
Packit 63bb0d
//sys	getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW
Packit 63bb0d
//sys	getWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetWindowsDirectoryW
Packit 63bb0d
//sys	getSystemWindowsDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemWindowsDirectoryW
Packit 63bb0d
Packit 63bb0d
// An access token contains the security information for a logon session.
Packit 63bb0d
// The system creates an access token when a user logs on, and every
Packit 63bb0d
// process executed on behalf of the user has a copy of the token.
Packit 63bb0d
// The token identifies the user, the user's groups, and the user's
Packit 63bb0d
// privileges. The system uses the token to control access to securable
Packit 63bb0d
// objects and to control the ability of the user to perform various
Packit 63bb0d
// system-related operations on the local computer.
Packit 63bb0d
type Token Handle
Packit 63bb0d
Packit 63bb0d
// OpenCurrentProcessToken opens an access token associated with current
Packit 63bb0d
// process with TOKEN_QUERY access. It is a real token that needs to be closed.
Packit 63bb0d
//
Packit 63bb0d
// Deprecated: Explicitly call OpenProcessToken(CurrentProcess(), ...)
Packit 63bb0d
// with the desired access instead, or use GetCurrentProcessToken for a
Packit 63bb0d
// TOKEN_QUERY token.
Packit 63bb0d
func OpenCurrentProcessToken() (Token, error) {
Packit 63bb0d
	var token Token
Packit 63bb0d
	err := OpenProcessToken(CurrentProcess(), TOKEN_QUERY, &token)
Packit 63bb0d
	return token, err
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetCurrentProcessToken returns the access token associated with
Packit 63bb0d
// the current process. It is a pseudo token that does not need
Packit 63bb0d
// to be closed.
Packit 63bb0d
func GetCurrentProcessToken() Token {
Packit 63bb0d
	return Token(^uintptr(4 - 1))
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetCurrentThreadToken return the access token associated with
Packit 63bb0d
// the current thread. It is a pseudo token that does not need
Packit 63bb0d
// to be closed.
Packit 63bb0d
func GetCurrentThreadToken() Token {
Packit 63bb0d
	return Token(^uintptr(5 - 1))
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetCurrentThreadEffectiveToken returns the effective access token
Packit 63bb0d
// associated with the current thread. It is a pseudo token that does
Packit 63bb0d
// not need to be closed.
Packit 63bb0d
func GetCurrentThreadEffectiveToken() Token {
Packit 63bb0d
	return Token(^uintptr(6 - 1))
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Close releases access to access token.
Packit 63bb0d
func (t Token) Close() error {
Packit 63bb0d
	return CloseHandle(Handle(t))
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// getInfo retrieves a specified type of information about an access token.
Packit 63bb0d
func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) {
Packit 63bb0d
	n := uint32(initSize)
Packit 63bb0d
	for {
Packit 63bb0d
		b := make([]byte, n)
Packit 63bb0d
		e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n)
Packit 63bb0d
		if e == nil {
Packit 63bb0d
			return unsafe.Pointer(&b[0]), nil
Packit 63bb0d
		}
Packit 63bb0d
		if e != ERROR_INSUFFICIENT_BUFFER {
Packit 63bb0d
			return nil, e
Packit 63bb0d
		}
Packit 63bb0d
		if n <= uint32(len(b)) {
Packit 63bb0d
			return nil, e
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetTokenUser retrieves access token t user account information.
Packit 63bb0d
func (t Token) GetTokenUser() (*Tokenuser, error) {
Packit 63bb0d
	i, e := t.getInfo(TokenUser, 50)
Packit 63bb0d
	if e != nil {
Packit 63bb0d
		return nil, e
Packit 63bb0d
	}
Packit 63bb0d
	return (*Tokenuser)(i), nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetTokenGroups retrieves group accounts associated with access token t.
Packit 63bb0d
func (t Token) GetTokenGroups() (*Tokengroups, error) {
Packit 63bb0d
	i, e := t.getInfo(TokenGroups, 50)
Packit 63bb0d
	if e != nil {
Packit 63bb0d
		return nil, e
Packit 63bb0d
	}
Packit 63bb0d
	return (*Tokengroups)(i), nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetTokenPrimaryGroup retrieves access token t primary group information.
Packit 63bb0d
// A pointer to a SID structure representing a group that will become
Packit 63bb0d
// the primary group of any objects created by a process using this access token.
Packit 63bb0d
func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) {
Packit 63bb0d
	i, e := t.getInfo(TokenPrimaryGroup, 50)
Packit 63bb0d
	if e != nil {
Packit 63bb0d
		return nil, e
Packit 63bb0d
	}
Packit 63bb0d
	return (*Tokenprimarygroup)(i), nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetUserProfileDirectory retrieves path to the
Packit 63bb0d
// root directory of the access token t user's profile.
Packit 63bb0d
func (t Token) GetUserProfileDirectory() (string, error) {
Packit 63bb0d
	n := uint32(100)
Packit 63bb0d
	for {
Packit 63bb0d
		b := make([]uint16, n)
Packit 63bb0d
		e := GetUserProfileDirectory(t, &b[0], &n)
Packit 63bb0d
		if e == nil {
Packit 63bb0d
			return UTF16ToString(b), nil
Packit 63bb0d
		}
Packit 63bb0d
		if e != ERROR_INSUFFICIENT_BUFFER {
Packit 63bb0d
			return "", e
Packit 63bb0d
		}
Packit 63bb0d
		if n <= uint32(len(b)) {
Packit 63bb0d
			return "", e
Packit 63bb0d
		}
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// IsElevated returns whether the current token is elevated from a UAC perspective.
Packit 63bb0d
func (token Token) IsElevated() bool {
Packit 63bb0d
	var isElevated uint32
Packit 63bb0d
	var outLen uint32
Packit 63bb0d
	err := GetTokenInformation(token, TokenElevation, (*byte)(unsafe.Pointer(&isElevated)), uint32(unsafe.Sizeof(isElevated)), &outLen)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return false
Packit 63bb0d
	}
Packit 63bb0d
	return outLen == uint32(unsafe.Sizeof(isElevated)) && isElevated != 0
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetLinkedToken returns the linked token, which may be an elevated UAC token.
Packit 63bb0d
func (token Token) GetLinkedToken() (Token, error) {
Packit 63bb0d
	var linkedToken Token
Packit 63bb0d
	var outLen uint32
Packit 63bb0d
	err := GetTokenInformation(token, TokenLinkedToken, (*byte)(unsafe.Pointer(&linkedToken)), uint32(unsafe.Sizeof(linkedToken)), &outLen)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return Token(0), err
Packit 63bb0d
	}
Packit 63bb0d
	return linkedToken, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetSystemDirectory retrieves the path to current location of the system
Packit 63bb0d
// directory, which is typically, though not always, `C:\Windows\System32`.
Packit 63bb0d
func GetSystemDirectory() (string, error) {
Packit 63bb0d
	n := uint32(MAX_PATH)
Packit 63bb0d
	for {
Packit 63bb0d
		b := make([]uint16, n)
Packit 63bb0d
		l, e := getSystemDirectory(&b[0], n)
Packit 63bb0d
		if e != nil {
Packit 63bb0d
			return "", e
Packit 63bb0d
		}
Packit 63bb0d
		if l <= n {
Packit 63bb0d
			return UTF16ToString(b[:l]), nil
Packit 63bb0d
		}
Packit 63bb0d
		n = l
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetWindowsDirectory retrieves the path to current location of the Windows
Packit 63bb0d
// directory, which is typically, though not always, `C:\Windows`. This may
Packit 63bb0d
// be a private user directory in the case that the application is running
Packit 63bb0d
// under a terminal server.
Packit 63bb0d
func GetWindowsDirectory() (string, error) {
Packit 63bb0d
	n := uint32(MAX_PATH)
Packit 63bb0d
	for {
Packit 63bb0d
		b := make([]uint16, n)
Packit 63bb0d
		l, e := getWindowsDirectory(&b[0], n)
Packit 63bb0d
		if e != nil {
Packit 63bb0d
			return "", e
Packit 63bb0d
		}
Packit 63bb0d
		if l <= n {
Packit 63bb0d
			return UTF16ToString(b[:l]), nil
Packit 63bb0d
		}
Packit 63bb0d
		n = l
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetSystemWindowsDirectory retrieves the path to current location of the
Packit 63bb0d
// Windows directory, which is typically, though not always, `C:\Windows`.
Packit 63bb0d
func GetSystemWindowsDirectory() (string, error) {
Packit 63bb0d
	n := uint32(MAX_PATH)
Packit 63bb0d
	for {
Packit 63bb0d
		b := make([]uint16, n)
Packit 63bb0d
		l, e := getSystemWindowsDirectory(&b[0], n)
Packit 63bb0d
		if e != nil {
Packit 63bb0d
			return "", e
Packit 63bb0d
		}
Packit 63bb0d
		if l <= n {
Packit 63bb0d
			return UTF16ToString(b[:l]), nil
Packit 63bb0d
		}
Packit 63bb0d
		n = l
Packit 63bb0d
	}
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// IsMember reports whether the access token t is a member of the provided SID.
Packit 63bb0d
func (t Token) IsMember(sid *SID) (bool, error) {
Packit 63bb0d
	var b int32
Packit 63bb0d
	if e := checkTokenMembership(t, sid, &b); e != nil {
Packit 63bb0d
		return false, e
Packit 63bb0d
	}
Packit 63bb0d
	return b != 0, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	WTS_CONSOLE_CONNECT        = 0x1
Packit 63bb0d
	WTS_CONSOLE_DISCONNECT     = 0x2
Packit 63bb0d
	WTS_REMOTE_CONNECT         = 0x3
Packit 63bb0d
	WTS_REMOTE_DISCONNECT      = 0x4
Packit 63bb0d
	WTS_SESSION_LOGON          = 0x5
Packit 63bb0d
	WTS_SESSION_LOGOFF         = 0x6
Packit 63bb0d
	WTS_SESSION_LOCK           = 0x7
Packit 63bb0d
	WTS_SESSION_UNLOCK         = 0x8
Packit 63bb0d
	WTS_SESSION_REMOTE_CONTROL = 0x9
Packit 63bb0d
	WTS_SESSION_CREATE         = 0xa
Packit 63bb0d
	WTS_SESSION_TERMINATE      = 0xb
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
const (
Packit 63bb0d
	WTSActive       = 0
Packit 63bb0d
	WTSConnected    = 1
Packit 63bb0d
	WTSConnectQuery = 2
Packit 63bb0d
	WTSShadow       = 3
Packit 63bb0d
	WTSDisconnected = 4
Packit 63bb0d
	WTSIdle         = 5
Packit 63bb0d
	WTSListen       = 6
Packit 63bb0d
	WTSReset        = 7
Packit 63bb0d
	WTSDown         = 8
Packit 63bb0d
	WTSInit         = 9
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type WTSSESSION_NOTIFICATION struct {
Packit 63bb0d
	Size      uint32
Packit 63bb0d
	SessionID uint32
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type WTS_SESSION_INFO struct {
Packit 63bb0d
	SessionID         uint32
Packit 63bb0d
	WindowStationName *uint16
Packit 63bb0d
	State             uint32
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sys WTSQueryUserToken(session uint32, token *Token) (err error) = wtsapi32.WTSQueryUserToken
Packit 63bb0d
//sys WTSEnumerateSessions(handle Handle, reserved uint32, version uint32, sessions **WTS_SESSION_INFO, count *uint32) (err error) = wtsapi32.WTSEnumerateSessionsW
Packit 63bb0d
//sys WTSFreeMemory(ptr uintptr) = wtsapi32.WTSFreeMemory
Packit 63bb0d
Packit 63bb0d
type ACL struct {
Packit 63bb0d
	aclRevision byte
Packit 63bb0d
	sbz1        byte
Packit 63bb0d
	aclSize     uint16
Packit 63bb0d
	aceCount    uint16
Packit 63bb0d
	sbz2        uint16
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type SECURITY_DESCRIPTOR struct {
Packit 63bb0d
	revision byte
Packit 63bb0d
	sbz1     byte
Packit 63bb0d
	control  SECURITY_DESCRIPTOR_CONTROL
Packit 63bb0d
	owner    *SID
Packit 63bb0d
	group    *SID
Packit 63bb0d
	sacl     *ACL
Packit 63bb0d
	dacl     *ACL
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type SecurityAttributes struct {
Packit 63bb0d
	Length             uint32
Packit 63bb0d
	SecurityDescriptor *SECURITY_DESCRIPTOR
Packit 63bb0d
	InheritHandle      uint32
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type SE_OBJECT_TYPE uint32
Packit 63bb0d
Packit 63bb0d
// Constants for type SE_OBJECT_TYPE
Packit 63bb0d
const (
Packit 63bb0d
	SE_UNKNOWN_OBJECT_TYPE     = 0
Packit 63bb0d
	SE_FILE_OBJECT             = 1
Packit 63bb0d
	SE_SERVICE                 = 2
Packit 63bb0d
	SE_PRINTER                 = 3
Packit 63bb0d
	SE_REGISTRY_KEY            = 4
Packit 63bb0d
	SE_LMSHARE                 = 5
Packit 63bb0d
	SE_KERNEL_OBJECT           = 6
Packit 63bb0d
	SE_WINDOW_OBJECT           = 7
Packit 63bb0d
	SE_DS_OBJECT               = 8
Packit 63bb0d
	SE_DS_OBJECT_ALL           = 9
Packit 63bb0d
	SE_PROVIDER_DEFINED_OBJECT = 10
Packit 63bb0d
	SE_WMIGUID_OBJECT          = 11
Packit 63bb0d
	SE_REGISTRY_WOW64_32KEY    = 12
Packit 63bb0d
	SE_REGISTRY_WOW64_64KEY    = 13
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type SECURITY_INFORMATION uint32
Packit 63bb0d
Packit 63bb0d
// Constants for type SECURITY_INFORMATION
Packit 63bb0d
const (
Packit 63bb0d
	OWNER_SECURITY_INFORMATION            = 0x00000001
Packit 63bb0d
	GROUP_SECURITY_INFORMATION            = 0x00000002
Packit 63bb0d
	DACL_SECURITY_INFORMATION             = 0x00000004
Packit 63bb0d
	SACL_SECURITY_INFORMATION             = 0x00000008
Packit 63bb0d
	LABEL_SECURITY_INFORMATION            = 0x00000010
Packit 63bb0d
	ATTRIBUTE_SECURITY_INFORMATION        = 0x00000020
Packit 63bb0d
	SCOPE_SECURITY_INFORMATION            = 0x00000040
Packit 63bb0d
	BACKUP_SECURITY_INFORMATION           = 0x00010000
Packit 63bb0d
	PROTECTED_DACL_SECURITY_INFORMATION   = 0x80000000
Packit 63bb0d
	PROTECTED_SACL_SECURITY_INFORMATION   = 0x40000000
Packit 63bb0d
	UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000
Packit 63bb0d
	UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type SECURITY_DESCRIPTOR_CONTROL uint16
Packit 63bb0d
Packit 63bb0d
// Constants for type SECURITY_DESCRIPTOR_CONTROL
Packit 63bb0d
const (
Packit 63bb0d
	SE_OWNER_DEFAULTED       = 0x0001
Packit 63bb0d
	SE_GROUP_DEFAULTED       = 0x0002
Packit 63bb0d
	SE_DACL_PRESENT          = 0x0004
Packit 63bb0d
	SE_DACL_DEFAULTED        = 0x0008
Packit 63bb0d
	SE_SACL_PRESENT          = 0x0010
Packit 63bb0d
	SE_SACL_DEFAULTED        = 0x0020
Packit 63bb0d
	SE_DACL_AUTO_INHERIT_REQ = 0x0100
Packit 63bb0d
	SE_SACL_AUTO_INHERIT_REQ = 0x0200
Packit 63bb0d
	SE_DACL_AUTO_INHERITED   = 0x0400
Packit 63bb0d
	SE_SACL_AUTO_INHERITED   = 0x0800
Packit 63bb0d
	SE_DACL_PROTECTED        = 0x1000
Packit 63bb0d
	SE_SACL_PROTECTED        = 0x2000
Packit 63bb0d
	SE_RM_CONTROL_VALID      = 0x4000
Packit 63bb0d
	SE_SELF_RELATIVE         = 0x8000
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type ACCESS_MASK uint32
Packit 63bb0d
Packit 63bb0d
// Constants for type ACCESS_MASK
Packit 63bb0d
const (
Packit 63bb0d
	DELETE                   = 0x00010000
Packit 63bb0d
	READ_CONTROL             = 0x00020000
Packit 63bb0d
	WRITE_DAC                = 0x00040000
Packit 63bb0d
	WRITE_OWNER              = 0x00080000
Packit 63bb0d
	SYNCHRONIZE              = 0x00100000
Packit 63bb0d
	STANDARD_RIGHTS_REQUIRED = 0x000F0000
Packit 63bb0d
	STANDARD_RIGHTS_READ     = READ_CONTROL
Packit 63bb0d
	STANDARD_RIGHTS_WRITE    = READ_CONTROL
Packit 63bb0d
	STANDARD_RIGHTS_EXECUTE  = READ_CONTROL
Packit 63bb0d
	STANDARD_RIGHTS_ALL      = 0x001F0000
Packit 63bb0d
	SPECIFIC_RIGHTS_ALL      = 0x0000FFFF
Packit 63bb0d
	ACCESS_SYSTEM_SECURITY   = 0x01000000
Packit 63bb0d
	MAXIMUM_ALLOWED          = 0x02000000
Packit 63bb0d
	GENERIC_READ             = 0x80000000
Packit 63bb0d
	GENERIC_WRITE            = 0x40000000
Packit 63bb0d
	GENERIC_EXECUTE          = 0x20000000
Packit 63bb0d
	GENERIC_ALL              = 0x10000000
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type ACCESS_MODE uint32
Packit 63bb0d
Packit 63bb0d
// Constants for type ACCESS_MODE
Packit 63bb0d
const (
Packit 63bb0d
	NOT_USED_ACCESS   = 0
Packit 63bb0d
	GRANT_ACCESS      = 1
Packit 63bb0d
	SET_ACCESS        = 2
Packit 63bb0d
	DENY_ACCESS       = 3
Packit 63bb0d
	REVOKE_ACCESS     = 4
Packit 63bb0d
	SET_AUDIT_SUCCESS = 5
Packit 63bb0d
	SET_AUDIT_FAILURE = 6
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Constants for AceFlags and Inheritance fields
Packit 63bb0d
const (
Packit 63bb0d
	NO_INHERITANCE                     = 0x0
Packit 63bb0d
	SUB_OBJECTS_ONLY_INHERIT           = 0x1
Packit 63bb0d
	SUB_CONTAINERS_ONLY_INHERIT        = 0x2
Packit 63bb0d
	SUB_CONTAINERS_AND_OBJECTS_INHERIT = 0x3
Packit 63bb0d
	INHERIT_NO_PROPAGATE               = 0x4
Packit 63bb0d
	INHERIT_ONLY                       = 0x8
Packit 63bb0d
	INHERITED_ACCESS_ENTRY             = 0x10
Packit 63bb0d
	INHERITED_PARENT                   = 0x10000000
Packit 63bb0d
	INHERITED_GRANDPARENT              = 0x20000000
Packit 63bb0d
	OBJECT_INHERIT_ACE                 = 0x1
Packit 63bb0d
	CONTAINER_INHERIT_ACE              = 0x2
Packit 63bb0d
	NO_PROPAGATE_INHERIT_ACE           = 0x4
Packit 63bb0d
	INHERIT_ONLY_ACE                   = 0x8
Packit 63bb0d
	INHERITED_ACE                      = 0x10
Packit 63bb0d
	VALID_INHERIT_FLAGS                = 0x1F
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type MULTIPLE_TRUSTEE_OPERATION uint32
Packit 63bb0d
Packit 63bb0d
// Constants for MULTIPLE_TRUSTEE_OPERATION
Packit 63bb0d
const (
Packit 63bb0d
	NO_MULTIPLE_TRUSTEE    = 0
Packit 63bb0d
	TRUSTEE_IS_IMPERSONATE = 1
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type TRUSTEE_FORM uint32
Packit 63bb0d
Packit 63bb0d
// Constants for TRUSTEE_FORM
Packit 63bb0d
const (
Packit 63bb0d
	TRUSTEE_IS_SID              = 0
Packit 63bb0d
	TRUSTEE_IS_NAME             = 1
Packit 63bb0d
	TRUSTEE_BAD_FORM            = 2
Packit 63bb0d
	TRUSTEE_IS_OBJECTS_AND_SID  = 3
Packit 63bb0d
	TRUSTEE_IS_OBJECTS_AND_NAME = 4
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type TRUSTEE_TYPE uint32
Packit 63bb0d
Packit 63bb0d
// Constants for TRUSTEE_TYPE
Packit 63bb0d
const (
Packit 63bb0d
	TRUSTEE_IS_UNKNOWN          = 0
Packit 63bb0d
	TRUSTEE_IS_USER             = 1
Packit 63bb0d
	TRUSTEE_IS_GROUP            = 2
Packit 63bb0d
	TRUSTEE_IS_DOMAIN           = 3
Packit 63bb0d
	TRUSTEE_IS_ALIAS            = 4
Packit 63bb0d
	TRUSTEE_IS_WELL_KNOWN_GROUP = 5
Packit 63bb0d
	TRUSTEE_IS_DELETED          = 6
Packit 63bb0d
	TRUSTEE_IS_INVALID          = 7
Packit 63bb0d
	TRUSTEE_IS_COMPUTER         = 8
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// Constants for ObjectsPresent field
Packit 63bb0d
const (
Packit 63bb0d
	ACE_OBJECT_TYPE_PRESENT           = 0x1
Packit 63bb0d
	ACE_INHERITED_OBJECT_TYPE_PRESENT = 0x2
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type EXPLICIT_ACCESS struct {
Packit 63bb0d
	AccessPermissions ACCESS_MASK
Packit 63bb0d
	AccessMode        ACCESS_MODE
Packit 63bb0d
	Inheritance       uint32
Packit 63bb0d
	Trustee           TRUSTEE
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// This type is the union inside of TRUSTEE and must be created using one of the TrusteeValueFrom* functions.
Packit 63bb0d
type TrusteeValue uintptr
Packit 63bb0d
Packit 63bb0d
func TrusteeValueFromString(str string) TrusteeValue {
Packit 63bb0d
	return TrusteeValue(unsafe.Pointer(StringToUTF16Ptr(str)))
Packit 63bb0d
}
Packit 63bb0d
func TrusteeValueFromSID(sid *SID) TrusteeValue {
Packit 63bb0d
	return TrusteeValue(unsafe.Pointer(sid))
Packit 63bb0d
}
Packit 63bb0d
func TrusteeValueFromObjectsAndSid(objectsAndSid *OBJECTS_AND_SID) TrusteeValue {
Packit 63bb0d
	return TrusteeValue(unsafe.Pointer(objectsAndSid))
Packit 63bb0d
}
Packit 63bb0d
func TrusteeValueFromObjectsAndName(objectsAndName *OBJECTS_AND_NAME) TrusteeValue {
Packit 63bb0d
	return TrusteeValue(unsafe.Pointer(objectsAndName))
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type TRUSTEE struct {
Packit 63bb0d
	MultipleTrustee          *TRUSTEE
Packit 63bb0d
	MultipleTrusteeOperation MULTIPLE_TRUSTEE_OPERATION
Packit 63bb0d
	TrusteeForm              TRUSTEE_FORM
Packit 63bb0d
	TrusteeType              TRUSTEE_TYPE
Packit 63bb0d
	TrusteeValue             TrusteeValue
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type OBJECTS_AND_SID struct {
Packit 63bb0d
	ObjectsPresent          uint32
Packit 63bb0d
	ObjectTypeGuid          GUID
Packit 63bb0d
	InheritedObjectTypeGuid GUID
Packit 63bb0d
	Sid                     *SID
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
type OBJECTS_AND_NAME struct {
Packit 63bb0d
	ObjectsPresent          uint32
Packit 63bb0d
	ObjectType              SE_OBJECT_TYPE
Packit 63bb0d
	ObjectTypeName          *uint16
Packit 63bb0d
	InheritedObjectTypeName *uint16
Packit 63bb0d
	Name                    *uint16
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
//sys	getSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) = advapi32.GetSecurityInfo
Packit 63bb0d
//sys	SetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) = advapi32.SetSecurityInfo
Packit 63bb0d
//sys	getNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner **SID, group **SID, dacl **ACL, sacl **ACL, sd **SECURITY_DESCRIPTOR) (ret error) = advapi32.GetNamedSecurityInfoW
Packit 63bb0d
//sys	SetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION, owner *SID, group *SID, dacl *ACL, sacl *ACL) (ret error) = advapi32.SetNamedSecurityInfoW
Packit 63bb0d
Packit 63bb0d
//sys	buildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, countAccessEntries uint32, accessEntries *EXPLICIT_ACCESS, countAuditEntries uint32, auditEntries *EXPLICIT_ACCESS, oldSecurityDescriptor *SECURITY_DESCRIPTOR, sizeNewSecurityDescriptor *uint32, newSecurityDescriptor **SECURITY_DESCRIPTOR) (ret error) = advapi32.BuildSecurityDescriptorW
Packit 63bb0d
//sys	initializeSecurityDescriptor(absoluteSD *SECURITY_DESCRIPTOR, revision uint32) (err error) = advapi32.InitializeSecurityDescriptor
Packit 63bb0d
Packit 63bb0d
//sys	getSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, control *SECURITY_DESCRIPTOR_CONTROL, revision *uint32) (err error) = advapi32.GetSecurityDescriptorControl
Packit 63bb0d
//sys	getSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent *bool, dacl **ACL, daclDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorDacl
Packit 63bb0d
//sys	getSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent *bool, sacl **ACL, saclDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorSacl
Packit 63bb0d
//sys	getSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner **SID, ownerDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorOwner
Packit 63bb0d
//sys	getSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group **SID, groupDefaulted *bool) (err error) = advapi32.GetSecurityDescriptorGroup
Packit 63bb0d
//sys	getSecurityDescriptorLength(sd *SECURITY_DESCRIPTOR) (len uint32) = advapi32.GetSecurityDescriptorLength
Packit 63bb0d
//sys	getSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) (ret error) [failretval!=0] = advapi32.GetSecurityDescriptorRMControl
Packit 63bb0d
//sys	isValidSecurityDescriptor(sd *SECURITY_DESCRIPTOR) (isValid bool) = advapi32.IsValidSecurityDescriptor
Packit 63bb0d
Packit 63bb0d
//sys	setSecurityDescriptorControl(sd *SECURITY_DESCRIPTOR, controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) (err error) = advapi32.SetSecurityDescriptorControl
Packit 63bb0d
//sys	setSecurityDescriptorDacl(sd *SECURITY_DESCRIPTOR, daclPresent bool, dacl *ACL, daclDefaulted bool) (err error) = advapi32.SetSecurityDescriptorDacl
Packit 63bb0d
//sys	setSecurityDescriptorSacl(sd *SECURITY_DESCRIPTOR, saclPresent bool, sacl *ACL, saclDefaulted bool) (err error) = advapi32.SetSecurityDescriptorSacl
Packit 63bb0d
//sys	setSecurityDescriptorOwner(sd *SECURITY_DESCRIPTOR, owner *SID, ownerDefaulted bool) (err error) = advapi32.SetSecurityDescriptorOwner
Packit 63bb0d
//sys	setSecurityDescriptorGroup(sd *SECURITY_DESCRIPTOR, group *SID, groupDefaulted bool) (err error) = advapi32.SetSecurityDescriptorGroup
Packit 63bb0d
//sys	setSecurityDescriptorRMControl(sd *SECURITY_DESCRIPTOR, rmControl *uint8) = advapi32.SetSecurityDescriptorRMControl
Packit 63bb0d
Packit 63bb0d
//sys	convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd **SECURITY_DESCRIPTOR, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW
Packit 63bb0d
//sys	convertSecurityDescriptorToStringSecurityDescriptor(sd *SECURITY_DESCRIPTOR, revision uint32, securityInformation SECURITY_INFORMATION, str **uint16, strLen *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW
Packit 63bb0d
Packit 63bb0d
//sys	makeAbsoluteSD(selfRelativeSD *SECURITY_DESCRIPTOR, absoluteSD *SECURITY_DESCRIPTOR, absoluteSDSize *uint32, dacl *ACL, daclSize *uint32, sacl *ACL, saclSize *uint32, owner *SID, ownerSize *uint32, group *SID, groupSize *uint32) (err error) = advapi32.MakeAbsoluteSD
Packit 63bb0d
//sys	makeSelfRelativeSD(absoluteSD *SECURITY_DESCRIPTOR, selfRelativeSD *SECURITY_DESCRIPTOR, selfRelativeSDSize *uint32) (err error) = advapi32.MakeSelfRelativeSD
Packit 63bb0d
Packit 63bb0d
//sys	setEntriesInAcl(countExplicitEntries uint32, explicitEntries *EXPLICIT_ACCESS, oldACL *ACL, newACL **ACL) (ret error) = advapi32.SetEntriesInAclW
Packit 63bb0d
Packit 63bb0d
// Control returns the security descriptor control bits.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) Control() (control SECURITY_DESCRIPTOR_CONTROL, revision uint32, err error) {
Packit 63bb0d
	err = getSecurityDescriptorControl(sd, &control, &revision)
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SetControl sets the security descriptor control bits.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) SetControl(controlBitsOfInterest SECURITY_DESCRIPTOR_CONTROL, controlBitsToSet SECURITY_DESCRIPTOR_CONTROL) error {
Packit 63bb0d
	return setSecurityDescriptorControl(sd, controlBitsOfInterest, controlBitsToSet)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// RMControl returns the security descriptor resource manager control bits.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) RMControl() (control uint8, err error) {
Packit 63bb0d
	err = getSecurityDescriptorRMControl(sd, &control)
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SetRMControl sets the security descriptor resource manager control bits.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) SetRMControl(rmControl uint8) {
Packit 63bb0d
	setSecurityDescriptorRMControl(sd, &rmControl)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// DACL returns the security descriptor DACL and whether it was defaulted. The dacl return value may be nil
Packit 63bb0d
// if a DACL exists but is an "empty DACL", meaning fully permissive. If the DACL does not exist, err returns
Packit 63bb0d
// ERROR_OBJECT_NOT_FOUND.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) DACL() (dacl *ACL, defaulted bool, err error) {
Packit 63bb0d
	var present bool
Packit 63bb0d
	err = getSecurityDescriptorDacl(sd, &present, &dacl, &defaulted)
Packit 63bb0d
	if !present {
Packit 63bb0d
		err = ERROR_OBJECT_NOT_FOUND
Packit 63bb0d
	}
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SetDACL sets the absolute security descriptor DACL.
Packit 63bb0d
func (absoluteSD *SECURITY_DESCRIPTOR) SetDACL(dacl *ACL, present, defaulted bool) error {
Packit 63bb0d
	return setSecurityDescriptorDacl(absoluteSD, present, dacl, defaulted)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SACL returns the security descriptor SACL and whether it was defaulted. The sacl return value may be nil
Packit 63bb0d
// if a SACL exists but is an "empty SACL", meaning fully permissive. If the SACL does not exist, err returns
Packit 63bb0d
// ERROR_OBJECT_NOT_FOUND.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) SACL() (sacl *ACL, defaulted bool, err error) {
Packit 63bb0d
	var present bool
Packit 63bb0d
	err = getSecurityDescriptorSacl(sd, &present, &sacl, &defaulted)
Packit 63bb0d
	if !present {
Packit 63bb0d
		err = ERROR_OBJECT_NOT_FOUND
Packit 63bb0d
	}
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SetSACL sets the absolute security descriptor SACL.
Packit 63bb0d
func (absoluteSD *SECURITY_DESCRIPTOR) SetSACL(sacl *ACL, present, defaulted bool) error {
Packit 63bb0d
	return setSecurityDescriptorSacl(absoluteSD, present, sacl, defaulted)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Owner returns the security descriptor owner and whether it was defaulted.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) Owner() (owner *SID, defaulted bool, err error) {
Packit 63bb0d
	err = getSecurityDescriptorOwner(sd, &owner, &defaulted)
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SetOwner sets the absolute security descriptor owner.
Packit 63bb0d
func (absoluteSD *SECURITY_DESCRIPTOR) SetOwner(owner *SID, defaulted bool) error {
Packit 63bb0d
	return setSecurityDescriptorOwner(absoluteSD, owner, defaulted)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Group returns the security descriptor group and whether it was defaulted.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) Group() (group *SID, defaulted bool, err error) {
Packit 63bb0d
	err = getSecurityDescriptorGroup(sd, &group, &defaulted)
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SetGroup sets the absolute security descriptor owner.
Packit 63bb0d
func (absoluteSD *SECURITY_DESCRIPTOR) SetGroup(group *SID, defaulted bool) error {
Packit 63bb0d
	return setSecurityDescriptorGroup(absoluteSD, group, defaulted)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// Length returns the length of the security descriptor.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) Length() uint32 {
Packit 63bb0d
	return getSecurityDescriptorLength(sd)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// IsValid returns whether the security descriptor is valid.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) IsValid() bool {
Packit 63bb0d
	return isValidSecurityDescriptor(sd)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// String returns the SDDL form of the security descriptor, with a function signature that can be
Packit 63bb0d
// used with %v formatting directives.
Packit 63bb0d
func (sd *SECURITY_DESCRIPTOR) String() string {
Packit 63bb0d
	var sddl *uint16
Packit 63bb0d
	err := convertSecurityDescriptorToStringSecurityDescriptor(sd, 1, 0xff, &sddl, nil)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return ""
Packit 63bb0d
	}
Packit 63bb0d
	defer LocalFree(Handle(unsafe.Pointer(sddl)))
Packit Service 3a6627
	return UTF16PtrToString(sddl)
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// ToAbsolute converts a self-relative security descriptor into an absolute one.
Packit 63bb0d
func (selfRelativeSD *SECURITY_DESCRIPTOR) ToAbsolute() (absoluteSD *SECURITY_DESCRIPTOR, err error) {
Packit 63bb0d
	control, _, err := selfRelativeSD.Control()
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	if control&SE_SELF_RELATIVE == 0 {
Packit 63bb0d
		err = ERROR_INVALID_PARAMETER
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	var absoluteSDSize, daclSize, saclSize, ownerSize, groupSize uint32
Packit 63bb0d
	err = makeAbsoluteSD(selfRelativeSD, nil, &absoluteSDSize,
Packit 63bb0d
		nil, &daclSize, nil, &saclSize, nil, &ownerSize, nil, &groupSize)
Packit 63bb0d
	switch err {
Packit 63bb0d
	case ERROR_INSUFFICIENT_BUFFER:
Packit 63bb0d
	case nil:
Packit 63bb0d
		// makeAbsoluteSD is expected to fail, but it succeeds.
Packit 63bb0d
		return nil, ERROR_INTERNAL_ERROR
Packit 63bb0d
	default:
Packit 63bb0d
		return nil, err
Packit 63bb0d
	}
Packit 63bb0d
	if absoluteSDSize > 0 {
Packit 63bb0d
		absoluteSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, absoluteSDSize)[0]))
Packit 63bb0d
	}
Packit 63bb0d
	var (
Packit 63bb0d
		dacl  *ACL
Packit 63bb0d
		sacl  *ACL
Packit 63bb0d
		owner *SID
Packit 63bb0d
		group *SID
Packit 63bb0d
	)
Packit 63bb0d
	if daclSize > 0 {
Packit 63bb0d
		dacl = (*ACL)(unsafe.Pointer(&make([]byte, daclSize)[0]))
Packit 63bb0d
	}
Packit 63bb0d
	if saclSize > 0 {
Packit 63bb0d
		sacl = (*ACL)(unsafe.Pointer(&make([]byte, saclSize)[0]))
Packit 63bb0d
	}
Packit 63bb0d
	if ownerSize > 0 {
Packit 63bb0d
		owner = (*SID)(unsafe.Pointer(&make([]byte, ownerSize)[0]))
Packit 63bb0d
	}
Packit 63bb0d
	if groupSize > 0 {
Packit 63bb0d
		group = (*SID)(unsafe.Pointer(&make([]byte, groupSize)[0]))
Packit 63bb0d
	}
Packit 63bb0d
	err = makeAbsoluteSD(selfRelativeSD, absoluteSD, &absoluteSDSize,
Packit 63bb0d
		dacl, &daclSize, sacl, &saclSize, owner, &ownerSize, group, &groupSize)
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// ToSelfRelative converts an absolute security descriptor into a self-relative one.
Packit 63bb0d
func (absoluteSD *SECURITY_DESCRIPTOR) ToSelfRelative() (selfRelativeSD *SECURITY_DESCRIPTOR, err error) {
Packit 63bb0d
	control, _, err := absoluteSD.Control()
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	if control&SE_SELF_RELATIVE != 0 {
Packit 63bb0d
		err = ERROR_INVALID_PARAMETER
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	var selfRelativeSDSize uint32
Packit 63bb0d
	err = makeSelfRelativeSD(absoluteSD, nil, &selfRelativeSDSize)
Packit 63bb0d
	switch err {
Packit 63bb0d
	case ERROR_INSUFFICIENT_BUFFER:
Packit 63bb0d
	case nil:
Packit 63bb0d
		// makeSelfRelativeSD is expected to fail, but it succeeds.
Packit 63bb0d
		return nil, ERROR_INTERNAL_ERROR
Packit 63bb0d
	default:
Packit 63bb0d
		return nil, err
Packit 63bb0d
	}
Packit 63bb0d
	if selfRelativeSDSize > 0 {
Packit 63bb0d
		selfRelativeSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, selfRelativeSDSize)[0]))
Packit 63bb0d
	}
Packit 63bb0d
	err = makeSelfRelativeSD(absoluteSD, selfRelativeSD, &selfRelativeSDSize)
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (selfRelativeSD *SECURITY_DESCRIPTOR) copySelfRelativeSecurityDescriptor() *SECURITY_DESCRIPTOR {
Packit Service 3a6627
	sdLen := (int)(selfRelativeSD.Length())
Packit Service 3a6627
Packit Service 3a6627
	var src []byte
Packit Service 3a6627
	h := (*unsafeheader.Slice)(unsafe.Pointer(&src))
Packit Service 3a6627
	h.Data = unsafe.Pointer(selfRelativeSD)
Packit Service 3a6627
	h.Len = sdLen
Packit Service 3a6627
	h.Cap = sdLen
Packit Service 3a6627
Packit Service 3a6627
	dst := make([]byte, sdLen)
Packit Service 3a6627
	copy(dst, src)
Packit Service 3a6627
	return (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&dst[0]))
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// SecurityDescriptorFromString converts an SDDL string describing a security descriptor into a
Packit 63bb0d
// self-relative security descriptor object allocated on the Go heap.
Packit 63bb0d
func SecurityDescriptorFromString(sddl string) (sd *SECURITY_DESCRIPTOR, err error) {
Packit 63bb0d
	var winHeapSD *SECURITY_DESCRIPTOR
Packit 63bb0d
	err = convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &winHeapSD, nil)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	defer LocalFree(Handle(unsafe.Pointer(winHeapSD)))
Packit 63bb0d
	return winHeapSD.copySelfRelativeSecurityDescriptor(), nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetSecurityInfo queries the security information for a given handle and returns the self-relative security
Packit 63bb0d
// descriptor result on the Go heap.
Packit 63bb0d
func GetSecurityInfo(handle Handle, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION) (sd *SECURITY_DESCRIPTOR, err error) {
Packit 63bb0d
	var winHeapSD *SECURITY_DESCRIPTOR
Packit 63bb0d
	err = getSecurityInfo(handle, objectType, securityInformation, nil, nil, nil, nil, &winHeapSD)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	defer LocalFree(Handle(unsafe.Pointer(winHeapSD)))
Packit 63bb0d
	return winHeapSD.copySelfRelativeSecurityDescriptor(), nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// GetNamedSecurityInfo queries the security information for a given named object and returns the self-relative security
Packit 63bb0d
// descriptor result on the Go heap.
Packit 63bb0d
func GetNamedSecurityInfo(objectName string, objectType SE_OBJECT_TYPE, securityInformation SECURITY_INFORMATION) (sd *SECURITY_DESCRIPTOR, err error) {
Packit 63bb0d
	var winHeapSD *SECURITY_DESCRIPTOR
Packit 63bb0d
	err = getNamedSecurityInfo(objectName, objectType, securityInformation, nil, nil, nil, nil, &winHeapSD)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	defer LocalFree(Handle(unsafe.Pointer(winHeapSD)))
Packit 63bb0d
	return winHeapSD.copySelfRelativeSecurityDescriptor(), nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// BuildSecurityDescriptor makes a new security descriptor using the input trustees, explicit access lists, and
Packit 63bb0d
// prior security descriptor to be merged, any of which can be nil, returning the self-relative security descriptor
Packit 63bb0d
// result on the Go heap.
Packit 63bb0d
func BuildSecurityDescriptor(owner *TRUSTEE, group *TRUSTEE, accessEntries []EXPLICIT_ACCESS, auditEntries []EXPLICIT_ACCESS, mergedSecurityDescriptor *SECURITY_DESCRIPTOR) (sd *SECURITY_DESCRIPTOR, err error) {
Packit 63bb0d
	var winHeapSD *SECURITY_DESCRIPTOR
Packit 63bb0d
	var winHeapSDSize uint32
Packit 63bb0d
	var firstAccessEntry *EXPLICIT_ACCESS
Packit 63bb0d
	if len(accessEntries) > 0 {
Packit 63bb0d
		firstAccessEntry = &accessEntries[0]
Packit 63bb0d
	}
Packit 63bb0d
	var firstAuditEntry *EXPLICIT_ACCESS
Packit 63bb0d
	if len(auditEntries) > 0 {
Packit 63bb0d
		firstAuditEntry = &auditEntries[0]
Packit 63bb0d
	}
Packit 63bb0d
	err = buildSecurityDescriptor(owner, group, uint32(len(accessEntries)), firstAccessEntry, uint32(len(auditEntries)), firstAuditEntry, mergedSecurityDescriptor, &winHeapSDSize, &winHeapSD)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	defer LocalFree(Handle(unsafe.Pointer(winHeapSD)))
Packit 63bb0d
	return winHeapSD.copySelfRelativeSecurityDescriptor(), nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// NewSecurityDescriptor creates and initializes a new absolute security descriptor.
Packit 63bb0d
func NewSecurityDescriptor() (absoluteSD *SECURITY_DESCRIPTOR, err error) {
Packit 63bb0d
	absoluteSD = &SECURITY_DESCRIPTOR{}
Packit 63bb0d
	err = initializeSecurityDescriptor(absoluteSD, 1)
Packit 63bb0d
	return
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// ACLFromEntries returns a new ACL on the Go heap containing a list of explicit entries as well as those of another ACL.
Packit 63bb0d
// Both explicitEntries and mergedACL are optional and can be nil.
Packit 63bb0d
func ACLFromEntries(explicitEntries []EXPLICIT_ACCESS, mergedACL *ACL) (acl *ACL, err error) {
Packit 63bb0d
	var firstExplicitEntry *EXPLICIT_ACCESS
Packit 63bb0d
	if len(explicitEntries) > 0 {
Packit 63bb0d
		firstExplicitEntry = &explicitEntries[0]
Packit 63bb0d
	}
Packit 63bb0d
	var winHeapACL *ACL
Packit 63bb0d
	err = setEntriesInAcl(uint32(len(explicitEntries)), firstExplicitEntry, mergedACL, &winHeapACL)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		return
Packit 63bb0d
	}
Packit 63bb0d
	defer LocalFree(Handle(unsafe.Pointer(winHeapACL)))
Packit 63bb0d
	aclBytes := make([]byte, winHeapACL.aclSize)
Packit Service 3a6627
	copy(aclBytes, (*[(1 << 31) - 1]byte)(unsafe.Pointer(winHeapACL))[:len(aclBytes):len(aclBytes)])
Packit 63bb0d
	return (*ACL)(unsafe.Pointer(&aclBytes[0])), nil
Packit 63bb0d
}