1
2
3
4
5 package windows
6
7 import (
8 "runtime"
9 "syscall"
10 "unsafe"
11 )
12
13 const (
14 SecurityAnonymous = 0
15 SecurityIdentification = 1
16 SecurityImpersonation = 2
17 SecurityDelegation = 3
18 )
19
20
21
22
23
24
25 const (
26 TOKEN_ADJUST_PRIVILEGES = 0x0020
27 SE_PRIVILEGE_ENABLED = 0x00000002
28 )
29
30 type LUID struct {
31 LowPart uint32
32 HighPart int32
33 }
34
35 type LUID_AND_ATTRIBUTES struct {
36 Luid LUID
37 Attributes uint32
38 }
39
40 type TOKEN_PRIVILEGES struct {
41 PrivilegeCount uint32
42 Privileges [1]LUID_AND_ATTRIBUTES
43 }
44
45
46
47
48
49 func AdjustTokenPrivileges(token syscall.Token, disableAllPrivileges bool, newstate *TOKEN_PRIVILEGES, buflen uint32, prevstate *TOKEN_PRIVILEGES, returnlen *uint32) error {
50 ret, err := adjustTokenPrivileges(token, disableAllPrivileges, newstate, buflen, prevstate, returnlen)
51 if ret == 0 {
52
53 return err
54 }
55
56 if err == syscall.EINVAL {
57
58 return nil
59 }
60 return err
61 }
62
63
64
65
66 type SID_AND_ATTRIBUTES struct {
67 Sid *syscall.SID
68 Attributes uint32
69 }
70
71 type TOKEN_MANDATORY_LABEL struct {
72 Label SID_AND_ATTRIBUTES
73 }
74
75 func (tml *TOKEN_MANDATORY_LABEL) Size() uint32 {
76 return uint32(unsafe.Sizeof(TOKEN_MANDATORY_LABEL{})) + syscall.GetLengthSid(tml.Label.Sid)
77 }
78
79 const SE_GROUP_INTEGRITY = 0x00000020
80
81 type TokenType uint32
82
83 const (
84 TokenPrimary TokenType = 1
85 TokenImpersonation TokenType = 2
86 )
87
88
89
90 const (
91 LG_INCLUDE_INDIRECT = 0x1
92 MAX_PREFERRED_LENGTH = 0xFFFFFFFF
93 )
94
95 type LocalGroupUserInfo0 struct {
96 Name *uint16
97 }
98
99 const (
100 NERR_UserNotFound syscall.Errno = 2221
101 NERR_UserExists syscall.Errno = 2224
102 )
103
104 const (
105 USER_PRIV_USER = 1
106 )
107
108 type UserInfo1 struct {
109 Name *uint16
110 Password *uint16
111 PasswordAge uint32
112 Priv uint32
113 HomeDir *uint16
114 Comment *uint16
115 Flags uint32
116 ScriptPath *uint16
117 }
118
119 type UserInfo4 struct {
120 Name *uint16
121 Password *uint16
122 PasswordAge uint32
123 Priv uint32
124 HomeDir *uint16
125 Comment *uint16
126 Flags uint32
127 ScriptPath *uint16
128 AuthFlags uint32
129 FullName *uint16
130 UsrComment *uint16
131 Parms *uint16
132 Workstations *uint16
133 LastLogon uint32
134 LastLogoff uint32
135 AcctExpires uint32
136 MaxStorage uint32
137 UnitsPerWeek uint32
138 LogonHours *byte
139 BadPwCount uint32
140 NumLogons uint32
141 LogonServer *uint16
142 CountryCode uint32
143 CodePage uint32
144 UserSid *syscall.SID
145 PrimaryGroupID uint32
146 Profile *uint16
147 HomeDirDrive *uint16
148 PasswordExpired uint32
149 }
150
151
152
153
154
155
156
157
158
159 func GetSystemDirectory() string
160
161
162
163 func GetUserName(format uint32) (string, error) {
164 n := uint32(50)
165 for {
166 b := make([]uint16, n)
167 e := syscall.GetUserNameEx(format, &b[0], &n)
168 if e == nil {
169 return syscall.UTF16ToString(b[:n]), nil
170 }
171 if e != syscall.ERROR_MORE_DATA {
172 return "", e
173 }
174 if n <= uint32(len(b)) {
175 return "", e
176 }
177 }
178 }
179
180
181 func getTokenInfo(t syscall.Token, class uint32, initSize int) (unsafe.Pointer, error) {
182 n := uint32(initSize)
183 for {
184 b := make([]byte, n)
185 e := syscall.GetTokenInformation(t, class, &b[0], uint32(len(b)), &n)
186 if e == nil {
187 return unsafe.Pointer(&b[0]), nil
188 }
189 if e != syscall.ERROR_INSUFFICIENT_BUFFER {
190 return nil, e
191 }
192 if n <= uint32(len(b)) {
193 return nil, e
194 }
195 }
196 }
197
198 type TOKEN_GROUPS struct {
199 GroupCount uint32
200 Groups [1]SID_AND_ATTRIBUTES
201 }
202
203 func (g *TOKEN_GROUPS) AllGroups() []SID_AND_ATTRIBUTES {
204 return (*[(1 << 28) - 1]SID_AND_ATTRIBUTES)(unsafe.Pointer(&g.Groups[0]))[:g.GroupCount:g.GroupCount]
205 }
206
207 func GetTokenGroups(t syscall.Token) (*TOKEN_GROUPS, error) {
208 i, e := getTokenInfo(t, syscall.TokenGroups, 50)
209 if e != nil {
210 return nil, e
211 }
212 return (*TOKEN_GROUPS)(i), nil
213 }
214
215
216 type SID_IDENTIFIER_AUTHORITY struct {
217 Value [6]byte
218 }
219
220 const (
221 SID_REVISION = 1
222
223 SECURITY_LOCAL_SYSTEM_RID = 18
224
225 SECURITY_LOCAL_SERVICE_RID = 19
226
227 SECURITY_NETWORK_SERVICE_RID = 20
228 )
229
230 var SECURITY_NT_AUTHORITY = SID_IDENTIFIER_AUTHORITY{
231 Value: [6]byte{0, 0, 0, 0, 0, 5},
232 }
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249 func GetSidIdentifierAuthority(sid *syscall.SID) SID_IDENTIFIER_AUTHORITY {
250 defer runtime.KeepAlive(sid)
251 return *(*SID_IDENTIFIER_AUTHORITY)(unsafe.Pointer(getSidIdentifierAuthority(sid)))
252 }
253
254
255 func GetSidSubAuthority(sid *syscall.SID, subAuthorityIdx uint32) uint32 {
256 defer runtime.KeepAlive(sid)
257 return *(*uint32)(unsafe.Pointer(getSidSubAuthority(sid, subAuthorityIdx)))
258 }
259
260
261 func GetSidSubAuthorityCount(sid *syscall.SID) uint8 {
262 defer runtime.KeepAlive(sid)
263 return *(*uint8)(unsafe.Pointer(getSidSubAuthorityCount(sid)))
264 }
265
View as plain text