| // Copyright 2016 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package windows | |
| import ( | |
| "syscall" | |
| "unsafe" | |
| ) | |
| const ( | |
| SecurityAnonymous = 0 | |
| SecurityIdentification = 1 | |
| SecurityImpersonation = 2 | |
| SecurityDelegation = 3 | |
| ) | |
| //sys ImpersonateSelf(impersonationlevel uint32) (err error) = advapi32.ImpersonateSelf | |
| //sys RevertToSelf() (err error) = advapi32.RevertToSelf | |
| const ( | |
| TOKEN_ADJUST_PRIVILEGES = 0x0020 | |
| SE_PRIVILEGE_ENABLED = 0x00000002 | |
| ) | |
| type LUID struct { | |
| LowPart uint32 | |
| HighPart int32 | |
| } | |
| type LUID_AND_ATTRIBUTES struct { | |
| Luid LUID | |
| Attributes uint32 | |
| } | |
| type TOKEN_PRIVILEGES struct { | |
| PrivilegeCount uint32 | |
| Privileges [1]LUID_AND_ATTRIBUTES | |
| } | |
| //sys OpenThreadToken(h syscall.Handle, access uint32, openasself bool, token *syscall.Token) (err error) = advapi32.OpenThreadToken | |
| //sys LookupPrivilegeValue(systemname *uint16, name *uint16, luid *LUID) (err error) = advapi32.LookupPrivilegeValueW | |
| //sys adjustTokenPrivileges(token syscall.Token, disableAllPrivileges bool, newstate *TOKEN_PRIVILEGES, buflen uint32, prevstate *TOKEN_PRIVILEGES, returnlen *uint32) (ret uint32, err error) [true] = advapi32.AdjustTokenPrivileges | |
| func AdjustTokenPrivileges(token syscall.Token, disableAllPrivileges bool, newstate *TOKEN_PRIVILEGES, buflen uint32, prevstate *TOKEN_PRIVILEGES, returnlen *uint32) error { | |
| ret, err := adjustTokenPrivileges(token, disableAllPrivileges, newstate, buflen, prevstate, returnlen) | |
| if ret == 0 { | |
| // AdjustTokenPrivileges call failed | |
| return err | |
| } | |
| // AdjustTokenPrivileges call succeeded | |
| if err == syscall.EINVAL { | |
| // GetLastError returned ERROR_SUCCESS | |
| return nil | |
| } | |
| return err | |
| } | |
| //sys DuplicateTokenEx(hExistingToken syscall.Token, dwDesiredAccess uint32, lpTokenAttributes *syscall.SecurityAttributes, impersonationLevel uint32, tokenType TokenType, phNewToken *syscall.Token) (err error) = advapi32.DuplicateTokenEx | |
| //sys SetTokenInformation(tokenHandle syscall.Token, tokenInformationClass uint32, tokenInformation uintptr, tokenInformationLength uint32) (err error) = advapi32.SetTokenInformation | |
| type SID_AND_ATTRIBUTES struct { | |
| Sid *syscall.SID | |
| Attributes uint32 | |
| } | |
| type TOKEN_MANDATORY_LABEL struct { | |
| Label SID_AND_ATTRIBUTES | |
| } | |
| func (tml *TOKEN_MANDATORY_LABEL) Size() uint32 { | |
| return uint32(unsafe.Sizeof(TOKEN_MANDATORY_LABEL{})) + syscall.GetLengthSid(tml.Label.Sid) | |
| } | |
| const SE_GROUP_INTEGRITY = 0x00000020 | |
| type TokenType uint32 | |
| const ( | |
| TokenPrimary TokenType = 1 | |
| TokenImpersonation TokenType = 2 | |
| ) | |
| //sys GetProfilesDirectory(dir *uint16, dirLen *uint32) (err error) = userenv.GetProfilesDirectoryW | |
| const ( | |
| LG_INCLUDE_INDIRECT = 0x1 | |
| MAX_PREFERRED_LENGTH = 0xFFFFFFFF | |
| ) | |
| type LocalGroupUserInfo0 struct { | |
| Name *uint16 | |
| } | |
| type UserInfo4 struct { | |
| Name *uint16 | |
| Password *uint16 | |
| PasswordAge uint32 | |
| Priv uint32 | |
| HomeDir *uint16 | |
| Comment *uint16 | |
| Flags uint32 | |
| ScriptPath *uint16 | |
| AuthFlags uint32 | |
| FullName *uint16 | |
| UsrComment *uint16 | |
| Parms *uint16 | |
| Workstations *uint16 | |
| LastLogon uint32 | |
| LastLogoff uint32 | |
| AcctExpires uint32 | |
| MaxStorage uint32 | |
| UnitsPerWeek uint32 | |
| LogonHours *byte | |
| BadPwCount uint32 | |
| NumLogons uint32 | |
| LogonServer *uint16 | |
| CountryCode uint32 | |
| CodePage uint32 | |
| UserSid *syscall.SID | |
| PrimaryGroupID uint32 | |
| Profile *uint16 | |
| HomeDirDrive *uint16 | |
| PasswordExpired uint32 | |
| } | |
| //sys NetUserGetLocalGroups(serverName *uint16, userName *uint16, level uint32, flags uint32, buf **byte, prefMaxLen uint32, entriesRead *uint32, totalEntries *uint32) (neterr error) = netapi32.NetUserGetLocalGroups |