2 * Copyright 2002 Andriy Palamarchuk
4 * netapi32 user functions
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 * Implement NetUserGetGroups
24 * Implement NetUserSetGroups
25 * NetUserGetLocalGroups does not support LG_INCLUDE_INDIRECT yet.
26 * Add missing information levels.
32 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
35 typedef struct _ENUM_CONTEXT
37 SAM_HANDLE ServerHandle
;
38 SAM_HANDLE BuiltinDomainHandle
;
39 SAM_HANDLE AccountDomainHandle
;
41 SAM_ENUMERATE_HANDLE EnumerationContext
;
42 PSAM_RID_ENUMERATION Buffer
;
47 } ENUM_CONTEXT
, *PENUM_CONTEXT
;
52 GetAccountFlags(ULONG AccountControl
)
54 ULONG Flags
= UF_SCRIPT
;
56 if (AccountControl
& USER_ACCOUNT_DISABLED
)
57 Flags
|= UF_ACCOUNTDISABLE
;
59 if (AccountControl
& USER_HOME_DIRECTORY_REQUIRED
)
60 Flags
|= UF_HOMEDIR_REQUIRED
;
62 if (AccountControl
& USER_PASSWORD_NOT_REQUIRED
)
63 Flags
|= UF_PASSWD_NOTREQD
;
65 // UF_PASSWD_CANT_CHANGE
67 if (AccountControl
& USER_ACCOUNT_AUTO_LOCKED
)
70 if (AccountControl
& USER_DONT_EXPIRE_PASSWORD
)
71 Flags
|= UF_DONT_EXPIRE_PASSWD
;
74 if (AccountControl & USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED)
75 Flags |= UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED;
77 if (AccountControl & USER_SMARTCARD_REQUIRED)
78 Flags |= UF_SMARTCARD_REQUIRED;
80 if (AccountControl & USER_TRUSTED_FOR_DELEGATION)
81 Flags |= UF_TRUSTED_FOR_DELEGATION;
83 if (AccountControl & USER_NOT_DELEGATED)
84 Flags |= UF_NOT_DELEGATED;
86 if (AccountControl & USER_USE_DES_KEY_ONLY)
87 Flags |= UF_USE_DES_KEY_ONLY;
89 if (AccountControl & USER_DONT_REQUIRE_PREAUTH)
90 Flags |= UF_DONT_REQUIRE_PREAUTH;
92 if (AccountControl & USER_PASSWORD_EXPIRED)
93 Flags |= UF_PASSWORD_EXPIRED;
96 /* Set account type flags */
97 if (AccountControl
& USER_TEMP_DUPLICATE_ACCOUNT
)
98 Flags
|= UF_TEMP_DUPLICATE_ACCOUNT
;
99 else if (AccountControl
& USER_NORMAL_ACCOUNT
)
100 Flags
|= UF_NORMAL_ACCOUNT
;
101 else if (AccountControl
& USER_INTERDOMAIN_TRUST_ACCOUNT
)
102 Flags
|= UF_INTERDOMAIN_TRUST_ACCOUNT
;
103 else if (AccountControl
& USER_WORKSTATION_TRUST_ACCOUNT
)
104 Flags
|= UF_WORKSTATION_TRUST_ACCOUNT
;
105 else if (AccountControl
& USER_SERVER_TRUST_ACCOUNT
)
106 Flags
|= UF_SERVER_TRUST_ACCOUNT
;
114 GetAccountControl(ULONG Flags
)
116 ULONG AccountControl
= 0;
118 if (Flags
& UF_ACCOUNTDISABLE
)
119 AccountControl
|= USER_ACCOUNT_DISABLED
;
121 if (Flags
& UF_HOMEDIR_REQUIRED
)
122 AccountControl
|= USER_HOME_DIRECTORY_REQUIRED
;
124 if (Flags
& UF_PASSWD_NOTREQD
)
125 AccountControl
|= USER_PASSWORD_NOT_REQUIRED
;
127 if (Flags
& UF_LOCKOUT
)
128 AccountControl
|= USER_ACCOUNT_AUTO_LOCKED
;
130 if (Flags
& UF_DONT_EXPIRE_PASSWD
)
131 AccountControl
|= USER_DONT_EXPIRE_PASSWORD
;
133 /* Set account type flags */
134 if (Flags
& UF_TEMP_DUPLICATE_ACCOUNT
)
135 AccountControl
|= USER_TEMP_DUPLICATE_ACCOUNT
;
136 else if (Flags
& UF_NORMAL_ACCOUNT
)
137 AccountControl
|= USER_NORMAL_ACCOUNT
;
138 else if (Flags
& UF_INTERDOMAIN_TRUST_ACCOUNT
)
139 AccountControl
|= USER_INTERDOMAIN_TRUST_ACCOUNT
;
140 else if (Flags
& UF_WORKSTATION_TRUST_ACCOUNT
)
141 AccountControl
|= USER_WORKSTATION_TRUST_ACCOUNT
;
142 else if (Flags
& UF_SERVER_TRUST_ACCOUNT
)
143 AccountControl
|= USER_SERVER_TRUST_ACCOUNT
;
145 return AccountControl
;
151 GetPasswordAge(IN PLARGE_INTEGER PasswordLastSet
)
153 LARGE_INTEGER SystemTime
;
154 ULONG SystemSecondsSince1970
;
155 ULONG PasswordSecondsSince1970
;
158 Status
= NtQuerySystemTime(&SystemTime
);
159 if (!NT_SUCCESS(Status
))
162 RtlTimeToSecondsSince1970(&SystemTime
, &SystemSecondsSince1970
);
163 RtlTimeToSecondsSince1970(PasswordLastSet
, &PasswordSecondsSince1970
);
165 return SystemSecondsSince1970
- PasswordSecondsSince1970
;
171 BuildUserInfoBuffer(PUSER_ALL_INFORMATION UserInfo
,
176 UNICODE_STRING LogonServer
= RTL_CONSTANT_STRING(L
"\\\\*");
177 LPVOID LocalBuffer
= NULL
;
178 PUSER_INFO_0 UserInfo0
;
179 PUSER_INFO_1 UserInfo1
;
180 PUSER_INFO_2 UserInfo2
;
181 PUSER_INFO_3 UserInfo3
;
182 PUSER_INFO_4 UserInfo4
;
183 PUSER_INFO_10 UserInfo10
;
184 PUSER_INFO_11 UserInfo11
;
185 PUSER_INFO_20 UserInfo20
;
186 PUSER_INFO_23 UserInfo23
;
189 NET_API_STATUS ApiStatus
= NERR_Success
;
196 Size
= sizeof(USER_INFO_0
) +
197 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
201 Size
= sizeof(USER_INFO_1
) +
202 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
204 if (UserInfo
->HomeDirectory
.Length
> 0)
205 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
207 if (UserInfo
->AdminComment
.Length
> 0)
208 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
210 if (UserInfo
->ScriptPath
.Length
> 0)
211 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
215 Size
= sizeof(USER_INFO_2
) +
216 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
218 if (UserInfo
->HomeDirectory
.Length
> 0)
219 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
221 if (UserInfo
->AdminComment
.Length
> 0)
222 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
224 if (UserInfo
->ScriptPath
.Length
> 0)
225 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
227 if (UserInfo
->FullName
.Length
> 0)
228 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
230 if (UserInfo
->UserComment
.Length
> 0)
231 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
233 if (UserInfo
->Parameters
.Length
> 0)
234 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
236 if (UserInfo
->WorkStations
.Length
> 0)
237 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
239 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
240 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
242 if (LogonServer
.Length
> 0)
243 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
247 Size
= sizeof(USER_INFO_3
) +
248 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
250 if (UserInfo
->HomeDirectory
.Length
> 0)
251 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
253 if (UserInfo
->AdminComment
.Length
> 0)
254 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
256 if (UserInfo
->ScriptPath
.Length
> 0)
257 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
259 if (UserInfo
->FullName
.Length
> 0)
260 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
262 if (UserInfo
->UserComment
.Length
> 0)
263 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
265 if (UserInfo
->Parameters
.Length
> 0)
266 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
268 if (UserInfo
->WorkStations
.Length
> 0)
269 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
271 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
272 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
274 if (LogonServer
.Length
> 0)
275 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
277 if (UserInfo
->ProfilePath
.Length
> 0)
278 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
280 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
281 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
285 Size
= sizeof(USER_INFO_4
) +
286 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
288 if (UserInfo
->HomeDirectory
.Length
> 0)
289 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
291 if (UserInfo
->AdminComment
.Length
> 0)
292 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
294 if (UserInfo
->ScriptPath
.Length
> 0)
295 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
297 if (UserInfo
->FullName
.Length
> 0)
298 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
300 if (UserInfo
->UserComment
.Length
> 0)
301 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
303 if (UserInfo
->Parameters
.Length
> 0)
304 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
306 if (UserInfo
->WorkStations
.Length
> 0)
307 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
309 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
310 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
312 if (LogonServer
.Length
> 0)
313 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
315 /* FIXME: usri4_user_sid */
317 if (UserInfo
->ProfilePath
.Length
> 0)
318 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
320 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
321 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
325 Size
= sizeof(USER_INFO_10
) +
326 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
328 if (UserInfo
->AdminComment
.Length
> 0)
329 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
331 if (UserInfo
->UserComment
.Length
> 0)
332 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
334 if (UserInfo
->FullName
.Length
> 0)
335 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
339 Size
= sizeof(USER_INFO_11
) +
340 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
342 if (UserInfo
->AdminComment
.Length
> 0)
343 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
345 if (UserInfo
->UserComment
.Length
> 0)
346 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
348 if (UserInfo
->FullName
.Length
> 0)
349 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
351 if (UserInfo
->HomeDirectory
.Length
> 0)
352 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
354 if (UserInfo
->Parameters
.Length
> 0)
355 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
357 if (LogonServer
.Length
> 0)
358 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
360 if (UserInfo
->WorkStations
.Length
> 0)
361 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
363 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
364 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
368 Size
= sizeof(USER_INFO_20
) +
369 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
371 if (UserInfo
->FullName
.Length
> 0)
372 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
374 if (UserInfo
->AdminComment
.Length
> 0)
375 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
379 Size
= sizeof(USER_INFO_23
) +
380 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
382 if (UserInfo
->FullName
.Length
> 0)
383 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
385 if (UserInfo
->AdminComment
.Length
> 0)
386 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
388 /* FIXME: usri23_user_sid */
392 ApiStatus
= ERROR_INVALID_LEVEL
;
396 ApiStatus
= NetApiBufferAllocate(Size
, &LocalBuffer
);
397 if (ApiStatus
!= NERR_Success
)
400 ZeroMemory(LocalBuffer
, Size
);
405 UserInfo0
= (PUSER_INFO_0
)LocalBuffer
;
407 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo0
+ sizeof(USER_INFO_0
));
408 UserInfo0
->usri0_name
= Ptr
;
410 memcpy(UserInfo0
->usri0_name
,
411 UserInfo
->UserName
.Buffer
,
412 UserInfo
->UserName
.Length
);
413 UserInfo0
->usri0_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
417 UserInfo1
= (PUSER_INFO_1
)LocalBuffer
;
419 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo1
+ sizeof(USER_INFO_1
));
421 UserInfo1
->usri1_name
= Ptr
;
423 memcpy(UserInfo1
->usri1_name
,
424 UserInfo
->UserName
.Buffer
,
425 UserInfo
->UserName
.Length
);
426 UserInfo1
->usri1_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
428 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
430 UserInfo1
->usri1_password
= NULL
;
432 UserInfo1
->usri1_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
434 /* FIXME: UserInfo1->usri1_priv */
436 if (UserInfo
->HomeDirectory
.Length
> 0)
438 UserInfo1
->usri1_home_dir
= Ptr
;
440 memcpy(UserInfo1
->usri1_home_dir
,
441 UserInfo
->HomeDirectory
.Buffer
,
442 UserInfo
->HomeDirectory
.Length
);
443 UserInfo1
->usri1_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
445 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
448 if (UserInfo
->AdminComment
.Length
> 0)
450 UserInfo1
->usri1_comment
= Ptr
;
452 memcpy(UserInfo1
->usri1_comment
,
453 UserInfo
->AdminComment
.Buffer
,
454 UserInfo
->AdminComment
.Length
);
455 UserInfo1
->usri1_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
457 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
460 UserInfo1
->usri1_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
462 if (UserInfo
->ScriptPath
.Length
> 0)
464 UserInfo1
->usri1_script_path
= Ptr
;
466 memcpy(UserInfo1
->usri1_script_path
,
467 UserInfo
->ScriptPath
.Buffer
,
468 UserInfo
->ScriptPath
.Length
);
469 UserInfo1
->usri1_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
474 UserInfo2
= (PUSER_INFO_2
)LocalBuffer
;
476 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo2
+ sizeof(USER_INFO_2
));
478 UserInfo2
->usri2_name
= Ptr
;
480 memcpy(UserInfo2
->usri2_name
,
481 UserInfo
->UserName
.Buffer
,
482 UserInfo
->UserName
.Length
);
483 UserInfo2
->usri2_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
485 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
487 UserInfo2
->usri2_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
489 /* FIXME: usri2_priv */
491 if (UserInfo
->HomeDirectory
.Length
> 0)
493 UserInfo2
->usri2_home_dir
= Ptr
;
495 memcpy(UserInfo2
->usri2_home_dir
,
496 UserInfo
->HomeDirectory
.Buffer
,
497 UserInfo
->HomeDirectory
.Length
);
498 UserInfo2
->usri2_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
500 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
503 if (UserInfo
->AdminComment
.Length
> 0)
505 UserInfo2
->usri2_comment
= Ptr
;
507 memcpy(UserInfo2
->usri2_comment
,
508 UserInfo
->AdminComment
.Buffer
,
509 UserInfo
->AdminComment
.Length
);
510 UserInfo2
->usri2_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
512 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
515 UserInfo2
->usri2_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
517 if (UserInfo
->ScriptPath
.Length
> 0)
519 UserInfo2
->usri2_script_path
= Ptr
;
521 memcpy(UserInfo2
->usri2_script_path
,
522 UserInfo
->ScriptPath
.Buffer
,
523 UserInfo
->ScriptPath
.Length
);
524 UserInfo2
->usri2_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
526 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
529 /* FIXME: usri2_auth_flags */
531 if (UserInfo
->FullName
.Length
> 0)
533 UserInfo2
->usri2_full_name
= Ptr
;
535 memcpy(UserInfo2
->usri2_full_name
,
536 UserInfo
->FullName
.Buffer
,
537 UserInfo
->FullName
.Length
);
538 UserInfo2
->usri2_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
540 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
543 if (UserInfo
->UserComment
.Length
> 0)
545 UserInfo2
->usri2_usr_comment
= Ptr
;
547 memcpy(UserInfo2
->usri2_usr_comment
,
548 UserInfo
->UserComment
.Buffer
,
549 UserInfo
->UserComment
.Length
);
550 UserInfo2
->usri2_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
552 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
555 if (UserInfo
->Parameters
.Length
> 0)
557 UserInfo2
->usri2_parms
= Ptr
;
559 memcpy(UserInfo2
->usri2_parms
,
560 UserInfo
->Parameters
.Buffer
,
561 UserInfo
->Parameters
.Length
);
562 UserInfo2
->usri2_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
564 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
567 if (UserInfo
->WorkStations
.Length
> 0)
569 UserInfo2
->usri2_workstations
= Ptr
;
571 memcpy(UserInfo2
->usri2_workstations
,
572 UserInfo
->WorkStations
.Buffer
,
573 UserInfo
->WorkStations
.Length
);
574 UserInfo2
->usri2_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
576 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
579 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
580 &UserInfo2
->usri2_last_logon
);
582 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
583 &UserInfo2
->usri2_last_logoff
);
585 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
586 &UserInfo2
->usri2_acct_expires
);
588 UserInfo2
->usri2_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
589 UserInfo2
->usri2_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
591 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
593 UserInfo2
->usri2_logon_hours
= (PVOID
)Ptr
;
595 memcpy(UserInfo2
->usri2_logon_hours
,
596 UserInfo
->LogonHours
.LogonHours
,
597 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
599 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
602 UserInfo2
->usri2_bad_pw_count
= UserInfo
->BadPasswordCount
;
603 UserInfo2
->usri2_num_logons
= UserInfo
->LogonCount
;
605 if (LogonServer
.Length
> 0)
607 UserInfo2
->usri2_logon_server
= Ptr
;
609 memcpy(UserInfo2
->usri2_logon_server
,
612 UserInfo2
->usri2_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
614 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
617 UserInfo2
->usri2_country_code
= UserInfo
->CountryCode
;
618 UserInfo2
->usri2_code_page
= UserInfo
->CodePage
;
622 UserInfo3
= (PUSER_INFO_3
)LocalBuffer
;
624 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo3
+ sizeof(USER_INFO_3
));
626 UserInfo3
->usri3_name
= Ptr
;
628 memcpy(UserInfo3
->usri3_name
,
629 UserInfo
->UserName
.Buffer
,
630 UserInfo
->UserName
.Length
);
631 UserInfo3
->usri3_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
633 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
635 UserInfo3
->usri3_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
637 /* FIXME: usri3_priv */
639 if (UserInfo
->HomeDirectory
.Length
> 0)
641 UserInfo3
->usri3_home_dir
= Ptr
;
643 memcpy(UserInfo3
->usri3_home_dir
,
644 UserInfo
->HomeDirectory
.Buffer
,
645 UserInfo
->HomeDirectory
.Length
);
646 UserInfo3
->usri3_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
648 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
651 if (UserInfo
->AdminComment
.Length
> 0)
653 UserInfo3
->usri3_comment
= Ptr
;
655 memcpy(UserInfo3
->usri3_comment
,
656 UserInfo
->AdminComment
.Buffer
,
657 UserInfo
->AdminComment
.Length
);
658 UserInfo3
->usri3_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
660 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
663 UserInfo3
->usri3_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
665 if (UserInfo
->ScriptPath
.Length
> 0)
667 UserInfo3
->usri3_script_path
= Ptr
;
669 memcpy(UserInfo3
->usri3_script_path
,
670 UserInfo
->ScriptPath
.Buffer
,
671 UserInfo
->ScriptPath
.Length
);
672 UserInfo3
->usri3_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
674 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
677 /* FIXME: usri3_auth_flags */
679 if (UserInfo
->FullName
.Length
> 0)
681 UserInfo3
->usri3_full_name
= Ptr
;
683 memcpy(UserInfo3
->usri3_full_name
,
684 UserInfo
->FullName
.Buffer
,
685 UserInfo
->FullName
.Length
);
686 UserInfo3
->usri3_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
688 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
691 if (UserInfo
->UserComment
.Length
> 0)
693 UserInfo3
->usri3_usr_comment
= Ptr
;
695 memcpy(UserInfo3
->usri3_usr_comment
,
696 UserInfo
->UserComment
.Buffer
,
697 UserInfo
->UserComment
.Length
);
698 UserInfo3
->usri3_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
700 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
703 if (UserInfo
->Parameters
.Length
> 0)
705 UserInfo3
->usri3_parms
= Ptr
;
707 memcpy(UserInfo3
->usri3_parms
,
708 UserInfo
->Parameters
.Buffer
,
709 UserInfo
->Parameters
.Length
);
710 UserInfo3
->usri3_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
712 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
715 if (UserInfo
->WorkStations
.Length
> 0)
717 UserInfo3
->usri3_workstations
= Ptr
;
719 memcpy(UserInfo3
->usri3_workstations
,
720 UserInfo
->WorkStations
.Buffer
,
721 UserInfo
->WorkStations
.Length
);
722 UserInfo3
->usri3_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
724 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
727 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
728 &UserInfo3
->usri3_last_logon
);
730 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
731 &UserInfo3
->usri3_last_logoff
);
733 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
734 &UserInfo3
->usri3_acct_expires
);
736 UserInfo3
->usri3_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
737 UserInfo3
->usri3_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
739 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
741 UserInfo3
->usri3_logon_hours
= (PVOID
)Ptr
;
743 memcpy(UserInfo3
->usri3_logon_hours
,
744 UserInfo
->LogonHours
.LogonHours
,
745 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
747 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
750 UserInfo3
->usri3_bad_pw_count
= UserInfo
->BadPasswordCount
;
751 UserInfo3
->usri3_num_logons
= UserInfo
->LogonCount
;
753 if (LogonServer
.Length
> 0)
755 UserInfo3
->usri3_logon_server
= Ptr
;
757 memcpy(UserInfo3
->usri3_logon_server
,
760 UserInfo3
->usri3_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
762 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
765 UserInfo3
->usri3_country_code
= UserInfo
->CountryCode
;
766 UserInfo3
->usri3_code_page
= UserInfo
->CodePage
;
767 UserInfo3
->usri3_user_id
= RelativeId
;
768 UserInfo3
->usri3_primary_group_id
= UserInfo
->PrimaryGroupId
;
770 if (UserInfo
->ProfilePath
.Length
> 0)
772 UserInfo3
->usri3_profile
= Ptr
;
774 memcpy(UserInfo3
->usri3_profile
,
775 UserInfo
->ProfilePath
.Buffer
,
776 UserInfo
->ProfilePath
.Length
);
777 UserInfo3
->usri3_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
779 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
782 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
784 UserInfo3
->usri3_home_dir_drive
= Ptr
;
786 memcpy(UserInfo3
->usri3_home_dir_drive
,
787 UserInfo
->HomeDirectoryDrive
.Buffer
,
788 UserInfo
->HomeDirectoryDrive
.Length
);
789 UserInfo3
->usri3_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
791 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
794 UserInfo3
->usri3_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
798 UserInfo4
= (PUSER_INFO_4
)LocalBuffer
;
800 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo4
+ sizeof(USER_INFO_4
));
802 UserInfo4
->usri4_name
= Ptr
;
804 memcpy(UserInfo4
->usri4_name
,
805 UserInfo
->UserName
.Buffer
,
806 UserInfo
->UserName
.Length
);
807 UserInfo4
->usri4_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
809 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
811 UserInfo4
->usri4_password
= NULL
;
812 UserInfo4
->usri4_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
814 /* FIXME: usri4_priv */
816 if (UserInfo
->HomeDirectory
.Length
> 0)
818 UserInfo4
->usri4_home_dir
= Ptr
;
820 memcpy(UserInfo4
->usri4_home_dir
,
821 UserInfo
->HomeDirectory
.Buffer
,
822 UserInfo
->HomeDirectory
.Length
);
823 UserInfo4
->usri4_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
825 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
828 if (UserInfo
->AdminComment
.Length
> 0)
830 UserInfo4
->usri4_comment
= Ptr
;
832 memcpy(UserInfo4
->usri4_comment
,
833 UserInfo
->AdminComment
.Buffer
,
834 UserInfo
->AdminComment
.Length
);
835 UserInfo4
->usri4_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
837 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
840 UserInfo4
->usri4_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
842 if (UserInfo
->ScriptPath
.Length
> 0)
844 UserInfo4
->usri4_script_path
= Ptr
;
846 memcpy(UserInfo4
->usri4_script_path
,
847 UserInfo
->ScriptPath
.Buffer
,
848 UserInfo
->ScriptPath
.Length
);
849 UserInfo4
->usri4_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
851 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
854 /* FIXME: usri4_auth_flags */
856 if (UserInfo
->FullName
.Length
> 0)
858 UserInfo4
->usri4_full_name
= Ptr
;
860 memcpy(UserInfo4
->usri4_full_name
,
861 UserInfo
->FullName
.Buffer
,
862 UserInfo
->FullName
.Length
);
863 UserInfo4
->usri4_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
865 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
868 if (UserInfo
->UserComment
.Length
> 0)
870 UserInfo4
->usri4_usr_comment
= Ptr
;
872 memcpy(UserInfo4
->usri4_usr_comment
,
873 UserInfo
->UserComment
.Buffer
,
874 UserInfo
->UserComment
.Length
);
875 UserInfo4
->usri4_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
877 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
880 if (UserInfo
->Parameters
.Length
> 0)
882 UserInfo4
->usri4_parms
= Ptr
;
884 memcpy(UserInfo4
->usri4_parms
,
885 UserInfo
->Parameters
.Buffer
,
886 UserInfo
->Parameters
.Length
);
887 UserInfo4
->usri4_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
889 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
892 if (UserInfo
->WorkStations
.Length
> 0)
894 UserInfo4
->usri4_workstations
= Ptr
;
896 memcpy(UserInfo4
->usri4_workstations
,
897 UserInfo
->WorkStations
.Buffer
,
898 UserInfo
->WorkStations
.Length
);
899 UserInfo4
->usri4_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
901 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
904 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
905 &UserInfo4
->usri4_last_logon
);
907 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
908 &UserInfo4
->usri4_last_logoff
);
910 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
911 &UserInfo4
->usri4_acct_expires
);
913 UserInfo4
->usri4_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
914 UserInfo4
->usri4_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
916 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
918 UserInfo4
->usri4_logon_hours
= (PVOID
)Ptr
;
920 memcpy(UserInfo4
->usri4_logon_hours
,
921 UserInfo
->LogonHours
.LogonHours
,
922 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
924 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
927 UserInfo4
->usri4_bad_pw_count
= UserInfo
->BadPasswordCount
;
928 UserInfo4
->usri4_num_logons
= UserInfo
->LogonCount
;
930 if (LogonServer
.Length
> 0)
932 UserInfo4
->usri4_logon_server
= Ptr
;
934 memcpy(UserInfo4
->usri4_logon_server
,
937 UserInfo4
->usri4_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
939 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
942 UserInfo4
->usri4_country_code
= UserInfo
->CountryCode
;
943 UserInfo4
->usri4_code_page
= UserInfo
->CodePage
;
945 /* FIXME: usri4_user_sid */
947 UserInfo4
->usri4_primary_group_id
= UserInfo
->PrimaryGroupId
;
949 if (UserInfo
->ProfilePath
.Length
> 0)
951 UserInfo4
->usri4_profile
= Ptr
;
953 memcpy(UserInfo4
->usri4_profile
,
954 UserInfo
->ProfilePath
.Buffer
,
955 UserInfo
->ProfilePath
.Length
);
956 UserInfo4
->usri4_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
958 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
961 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
963 UserInfo4
->usri4_home_dir_drive
= Ptr
;
965 memcpy(UserInfo4
->usri4_home_dir_drive
,
966 UserInfo
->HomeDirectoryDrive
.Buffer
,
967 UserInfo
->HomeDirectoryDrive
.Length
);
968 UserInfo4
->usri4_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
970 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
973 UserInfo4
->usri4_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
977 UserInfo10
= (PUSER_INFO_10
)LocalBuffer
;
979 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo10
+ sizeof(USER_INFO_10
));
981 UserInfo10
->usri10_name
= Ptr
;
983 memcpy(UserInfo10
->usri10_name
,
984 UserInfo
->UserName
.Buffer
,
985 UserInfo
->UserName
.Length
);
986 UserInfo10
->usri10_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
988 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
990 if (UserInfo
->AdminComment
.Length
> 0)
992 UserInfo10
->usri10_comment
= Ptr
;
994 memcpy(UserInfo10
->usri10_comment
,
995 UserInfo
->AdminComment
.Buffer
,
996 UserInfo
->AdminComment
.Length
);
997 UserInfo10
->usri10_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
999 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1002 if (UserInfo
->UserComment
.Length
> 0)
1004 UserInfo10
->usri10_usr_comment
= Ptr
;
1006 memcpy(UserInfo10
->usri10_usr_comment
,
1007 UserInfo
->UserComment
.Buffer
,
1008 UserInfo
->UserComment
.Length
);
1009 UserInfo10
->usri10_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1011 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1014 if (UserInfo
->FullName
.Length
> 0)
1016 UserInfo10
->usri10_full_name
= Ptr
;
1018 memcpy(UserInfo10
->usri10_full_name
,
1019 UserInfo
->FullName
.Buffer
,
1020 UserInfo
->FullName
.Length
);
1021 UserInfo10
->usri10_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1023 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1028 UserInfo11
= (PUSER_INFO_11
)LocalBuffer
;
1030 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo11
+ sizeof(USER_INFO_11
));
1032 UserInfo11
->usri11_name
= Ptr
;
1034 memcpy(UserInfo11
->usri11_name
,
1035 UserInfo
->UserName
.Buffer
,
1036 UserInfo
->UserName
.Length
);
1037 UserInfo11
->usri11_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1039 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1041 if (UserInfo
->AdminComment
.Length
> 0)
1043 UserInfo11
->usri11_comment
= Ptr
;
1045 memcpy(UserInfo11
->usri11_comment
,
1046 UserInfo
->AdminComment
.Buffer
,
1047 UserInfo
->AdminComment
.Length
);
1048 UserInfo11
->usri11_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1050 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1053 if (UserInfo
->UserComment
.Length
> 0)
1055 UserInfo11
->usri11_usr_comment
= Ptr
;
1057 memcpy(UserInfo11
->usri11_usr_comment
,
1058 UserInfo
->UserComment
.Buffer
,
1059 UserInfo
->UserComment
.Length
);
1060 UserInfo11
->usri11_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1062 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1065 if (UserInfo
->FullName
.Length
> 0)
1067 UserInfo11
->usri11_full_name
= Ptr
;
1069 memcpy(UserInfo11
->usri11_full_name
,
1070 UserInfo
->FullName
.Buffer
,
1071 UserInfo
->FullName
.Length
);
1072 UserInfo11
->usri11_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1074 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1077 /* FIXME: usri11_priv */
1078 /* FIXME: usri11_auth_flags */
1080 UserInfo11
->usri11_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
1082 if (UserInfo
->HomeDirectory
.Length
> 0)
1084 UserInfo11
->usri11_home_dir
= Ptr
;
1086 memcpy(UserInfo11
->usri11_home_dir
,
1087 UserInfo
->HomeDirectory
.Buffer
,
1088 UserInfo
->HomeDirectory
.Length
);
1089 UserInfo11
->usri11_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1091 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
1094 if (UserInfo
->Parameters
.Length
> 0)
1096 UserInfo11
->usri11_parms
= Ptr
;
1098 memcpy(UserInfo11
->usri11_parms
,
1099 UserInfo
->Parameters
.Buffer
,
1100 UserInfo
->Parameters
.Length
);
1101 UserInfo11
->usri11_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1103 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
1106 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
1107 &UserInfo11
->usri11_last_logon
);
1109 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
1110 &UserInfo11
->usri11_last_logoff
);
1112 UserInfo11
->usri11_bad_pw_count
= UserInfo
->BadPasswordCount
;
1113 UserInfo11
->usri11_num_logons
= UserInfo
->LogonCount
;
1115 if (LogonServer
.Length
> 0)
1117 UserInfo11
->usri11_logon_server
= Ptr
;
1119 memcpy(UserInfo11
->usri11_logon_server
,
1121 LogonServer
.Length
);
1122 UserInfo11
->usri11_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1124 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
1127 UserInfo11
->usri11_country_code
= UserInfo
->CountryCode
;
1129 if (UserInfo
->WorkStations
.Length
> 0)
1131 UserInfo11
->usri11_workstations
= Ptr
;
1133 memcpy(UserInfo11
->usri11_workstations
,
1134 UserInfo
->WorkStations
.Buffer
,
1135 UserInfo
->WorkStations
.Length
);
1136 UserInfo11
->usri11_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1138 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
1141 UserInfo11
->usri11_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
1142 UserInfo11
->usri11_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
1144 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
1146 UserInfo11
->usri11_logon_hours
= (PVOID
)Ptr
;
1148 memcpy(UserInfo11
->usri11_logon_hours
,
1149 UserInfo
->LogonHours
.LogonHours
,
1150 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1152 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1155 UserInfo11
->usri11_code_page
= UserInfo
->CodePage
;
1159 UserInfo20
= (PUSER_INFO_20
)LocalBuffer
;
1161 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo20
+ sizeof(USER_INFO_20
));
1163 UserInfo20
->usri20_name
= Ptr
;
1165 memcpy(UserInfo20
->usri20_name
,
1166 UserInfo
->UserName
.Buffer
,
1167 UserInfo
->UserName
.Length
);
1168 UserInfo20
->usri20_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1170 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1172 if (UserInfo
->FullName
.Length
> 0)
1174 UserInfo20
->usri20_full_name
= Ptr
;
1176 memcpy(UserInfo20
->usri20_full_name
,
1177 UserInfo
->FullName
.Buffer
,
1178 UserInfo
->FullName
.Length
);
1179 UserInfo20
->usri20_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1181 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1184 if (UserInfo
->AdminComment
.Length
> 0)
1186 UserInfo20
->usri20_comment
= Ptr
;
1188 memcpy(UserInfo20
->usri20_comment
,
1189 UserInfo
->AdminComment
.Buffer
,
1190 UserInfo
->AdminComment
.Length
);
1191 UserInfo20
->usri20_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1193 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1196 UserInfo20
->usri20_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
1198 UserInfo20
->usri20_user_id
= RelativeId
;
1202 UserInfo23
= (PUSER_INFO_23
)LocalBuffer
;
1204 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo23
+ sizeof(USER_INFO_23
));
1206 UserInfo23
->usri23_name
= Ptr
;
1208 memcpy(UserInfo23
->usri23_name
,
1209 UserInfo
->UserName
.Buffer
,
1210 UserInfo
->UserName
.Length
);
1211 UserInfo23
->usri23_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1213 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1215 if (UserInfo
->FullName
.Length
> 0)
1217 UserInfo23
->usri23_full_name
= Ptr
;
1219 memcpy(UserInfo23
->usri23_full_name
,
1220 UserInfo
->FullName
.Buffer
,
1221 UserInfo
->FullName
.Length
);
1222 UserInfo23
->usri23_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1224 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1227 if (UserInfo
->AdminComment
.Length
> 0)
1229 UserInfo23
->usri23_comment
= Ptr
;
1231 memcpy(UserInfo23
->usri23_comment
,
1232 UserInfo
->AdminComment
.Buffer
,
1233 UserInfo
->AdminComment
.Length
);
1234 UserInfo23
->usri23_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1236 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1239 UserInfo23
->usri23_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
1241 /* FIXME: usri23_user_sid */
1246 if (ApiStatus
== NERR_Success
)
1248 *Buffer
= LocalBuffer
;
1252 if (LocalBuffer
!= NULL
)
1253 NetApiBufferFree(LocalBuffer
);
1262 FreeUserInfo(PUSER_ALL_INFORMATION UserInfo
)
1264 if (UserInfo
->UserName
.Buffer
!= NULL
)
1265 SamFreeMemory(UserInfo
->UserName
.Buffer
);
1267 if (UserInfo
->FullName
.Buffer
!= NULL
)
1268 SamFreeMemory(UserInfo
->FullName
.Buffer
);
1270 if (UserInfo
->HomeDirectory
.Buffer
!= NULL
)
1271 SamFreeMemory(UserInfo
->HomeDirectory
.Buffer
);
1273 if (UserInfo
->HomeDirectoryDrive
.Buffer
!= NULL
)
1274 SamFreeMemory(UserInfo
->HomeDirectoryDrive
.Buffer
);
1276 if (UserInfo
->ScriptPath
.Buffer
!= NULL
)
1277 SamFreeMemory(UserInfo
->ScriptPath
.Buffer
);
1279 if (UserInfo
->ProfilePath
.Buffer
!= NULL
)
1280 SamFreeMemory(UserInfo
->ProfilePath
.Buffer
);
1282 if (UserInfo
->AdminComment
.Buffer
!= NULL
)
1283 SamFreeMemory(UserInfo
->AdminComment
.Buffer
);
1285 if (UserInfo
->WorkStations
.Buffer
!= NULL
)
1286 SamFreeMemory(UserInfo
->WorkStations
.Buffer
);
1288 if (UserInfo
->UserComment
.Buffer
!= NULL
)
1289 SamFreeMemory(UserInfo
->UserComment
.Buffer
);
1291 if (UserInfo
->Parameters
.Buffer
!= NULL
)
1292 SamFreeMemory(UserInfo
->Parameters
.Buffer
);
1294 if (UserInfo
->PrivateData
.Buffer
!= NULL
)
1295 SamFreeMemory(UserInfo
->PrivateData
.Buffer
);
1297 if (UserInfo
->LogonHours
.LogonHours
!= NULL
)
1298 SamFreeMemory(UserInfo
->LogonHours
.LogonHours
);
1300 SamFreeMemory(UserInfo
);
1306 SetUserInfo(SAM_HANDLE UserHandle
,
1310 USER_ALL_INFORMATION UserAllInfo
;
1311 PUSER_INFO_0 UserInfo0
;
1312 PUSER_INFO_1 UserInfo1
;
1313 PUSER_INFO_2 UserInfo2
;
1314 PUSER_INFO_3 UserInfo3
;
1315 PUSER_INFO_4 UserInfo4
;
1316 PUSER_INFO_1003 UserInfo1003
;
1317 PUSER_INFO_1006 UserInfo1006
;
1318 PUSER_INFO_1007 UserInfo1007
;
1319 PUSER_INFO_1008 UserInfo1008
;
1320 PUSER_INFO_1009 UserInfo1009
;
1321 PUSER_INFO_1011 UserInfo1011
;
1322 PUSER_INFO_1012 UserInfo1012
;
1323 PUSER_INFO_1013 UserInfo1013
;
1324 PUSER_INFO_1014 UserInfo1014
;
1325 PUSER_INFO_1017 UserInfo1017
;
1326 PUSER_INFO_1024 UserInfo1024
;
1327 PUSER_INFO_1025 UserInfo1025
;
1328 PUSER_INFO_1051 UserInfo1051
;
1329 PUSER_INFO_1052 UserInfo1052
;
1330 PUSER_INFO_1053 UserInfo1053
;
1331 NET_API_STATUS ApiStatus
= NERR_Success
;
1332 NTSTATUS Status
= STATUS_SUCCESS
;
1334 ZeroMemory(&UserAllInfo
, sizeof(USER_ALL_INFORMATION
));
1339 UserInfo0
= (PUSER_INFO_0
)UserInfo
;
1341 RtlInitUnicodeString(&UserAllInfo
.UserName
,
1342 UserInfo0
->usri0_name
);
1344 UserAllInfo
.WhichFields
|= USER_ALL_USERNAME
;
1348 UserInfo1
= (PUSER_INFO_1
)UserInfo
;
1350 // usri1_name ignored
1352 if (UserInfo1
->usri1_password
!= NULL
)
1354 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1355 UserInfo1
->usri1_password
);
1356 UserAllInfo
.NtPasswordPresent
= TRUE
;
1357 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1360 // usri1_password_age ignored
1362 // UserInfo1->usri1_priv
1364 if (UserInfo1
->usri1_home_dir
!= NULL
)
1366 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1367 UserInfo1
->usri1_home_dir
);
1368 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1371 if (UserInfo1
->usri1_comment
!= NULL
)
1373 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1374 UserInfo1
->usri1_comment
);
1375 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1378 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1
->usri1_flags
);
1379 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1381 if (UserInfo1
->usri1_script_path
!= NULL
)
1383 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1384 UserInfo1
->usri1_script_path
);
1385 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1390 UserInfo2
= (PUSER_INFO_2
)UserInfo
;
1392 // usri2_name ignored
1394 if (UserInfo2
->usri2_password
!= NULL
)
1396 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1397 UserInfo2
->usri2_password
);
1398 UserAllInfo
.NtPasswordPresent
= TRUE
;
1399 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1402 // usri2_password_age ignored
1404 // UserInfo2->usri2_priv;
1406 if (UserInfo2
->usri2_home_dir
!= NULL
)
1408 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1409 UserInfo2
->usri2_home_dir
);
1410 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1413 if (UserInfo2
->usri2_comment
!= NULL
)
1415 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1416 UserInfo2
->usri2_comment
);
1417 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1420 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo2
->usri2_flags
);
1421 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1423 if (UserInfo2
->usri2_script_path
!= NULL
)
1425 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1426 UserInfo2
->usri2_script_path
);
1427 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1430 // UserInfo2->usri2_auth_flags;
1432 if (UserInfo2
->usri2_full_name
!= NULL
)
1434 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1435 UserInfo2
->usri2_full_name
);
1436 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1439 if (UserInfo2
->usri2_usr_comment
!= NULL
)
1441 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1442 UserInfo2
->usri2_usr_comment
);
1443 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1446 if (UserInfo2
->usri2_parms
!= NULL
)
1448 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1449 UserInfo2
->usri2_parms
);
1450 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1453 if (UserInfo2
->usri2_workstations
!= NULL
)
1455 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1456 UserInfo2
->usri2_workstations
);
1457 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1460 // usri2_last_logon ignored
1461 // usri2_last_logoff ignored
1463 if (UserInfo2
->usri2_acct_expires
== TIMEQ_FOREVER
)
1465 UserAllInfo
.AccountExpires
.LowPart
= 0;
1466 UserAllInfo
.AccountExpires
.HighPart
= 0;
1470 RtlSecondsSince1970ToTime(UserInfo2
->usri2_acct_expires
,
1471 &UserAllInfo
.AccountExpires
);
1473 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1475 // UserInfo2->usri2_max_storage;
1476 // UserInfo2->usri2_units_per_week;
1477 // UserInfo2->usri2_logon_hours;
1479 // usri2_bad_pw_count ignored
1480 // usri2_num_logons ignored
1481 // usri2_logon_server ignored
1483 UserAllInfo
.CountryCode
= UserInfo2
->usri2_country_code
;
1484 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1486 UserAllInfo
.CodePage
= UserInfo2
->usri2_code_page
;
1487 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1491 UserInfo3
= (PUSER_INFO_3
)UserInfo
;
1493 // usri3_name ignored
1495 if (UserInfo3
->usri3_password
!= NULL
)
1497 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1498 UserInfo3
->usri3_password
);
1499 UserAllInfo
.NtPasswordPresent
= TRUE
;
1500 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1503 // usri3_password_age ignored
1505 // UserInfo3->usri3_priv;
1507 if (UserInfo3
->usri3_home_dir
!= NULL
)
1509 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1510 UserInfo3
->usri3_home_dir
);
1511 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1514 if (UserInfo3
->usri3_comment
!= NULL
)
1516 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1517 UserInfo3
->usri3_comment
);
1518 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1521 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo3
->usri3_flags
);
1522 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1524 if (UserInfo3
->usri3_script_path
!= NULL
)
1526 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1527 UserInfo3
->usri3_script_path
);
1528 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1531 // UserInfo3->usri3_auth_flags;
1533 if (UserInfo3
->usri3_full_name
!= NULL
)
1535 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1536 UserInfo3
->usri3_full_name
);
1537 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1540 if (UserInfo3
->usri3_usr_comment
!= NULL
)
1542 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1543 UserInfo3
->usri3_usr_comment
);
1544 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1547 if (UserInfo3
->usri3_parms
!= NULL
)
1549 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1550 UserInfo3
->usri3_parms
);
1551 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1554 if (UserInfo3
->usri3_workstations
!= NULL
)
1556 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1557 UserInfo3
->usri3_workstations
);
1558 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1561 // usri3_last_logon ignored
1562 // usri3_last_logoff ignored
1564 if (UserInfo3
->usri3_acct_expires
== TIMEQ_FOREVER
)
1566 UserAllInfo
.AccountExpires
.LowPart
= 0;
1567 UserAllInfo
.AccountExpires
.HighPart
= 0;
1571 RtlSecondsSince1970ToTime(UserInfo3
->usri3_acct_expires
,
1572 &UserAllInfo
.AccountExpires
);
1574 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1576 // UserInfo3->usri3_max_storage;
1577 // UserInfo3->usri3_units_per_week;
1578 // UserInfo3->usri3_logon_hours;
1580 // usri3_bad_pw_count ignored
1581 // usri3_num_logons ignored
1582 // usri3_logon_server ignored
1584 UserAllInfo
.CountryCode
= UserInfo3
->usri3_country_code
;
1585 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1587 UserAllInfo
.CodePage
= UserInfo3
->usri3_code_page
;
1588 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1590 // usri3_user_id ignored
1592 UserAllInfo
.PrimaryGroupId
= UserInfo3
->usri3_primary_group_id
;
1593 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1595 if (UserInfo3
->usri3_profile
!= NULL
)
1597 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1598 UserInfo3
->usri3_profile
);
1599 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1602 if (UserInfo3
->usri3_home_dir_drive
!= NULL
)
1604 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1605 UserInfo3
->usri3_home_dir_drive
);
1606 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1609 UserAllInfo
.PasswordExpired
= (UserInfo3
->usri3_password_expired
!= 0);
1610 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1614 UserInfo4
= (PUSER_INFO_4
)UserInfo
;
1616 // usri4_name ignored
1618 if (UserInfo4
->usri4_password
!= NULL
)
1620 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1621 UserInfo4
->usri4_password
);
1622 UserAllInfo
.NtPasswordPresent
= TRUE
;
1623 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1626 // usri4_password_age ignored
1628 // UserInfo3->usri4_priv;
1630 if (UserInfo4
->usri4_home_dir
!= NULL
)
1632 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1633 UserInfo4
->usri4_home_dir
);
1634 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1637 if (UserInfo4
->usri4_comment
!= NULL
)
1639 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1640 UserInfo4
->usri4_comment
);
1641 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1644 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo4
->usri4_flags
);
1645 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1647 if (UserInfo4
->usri4_script_path
!= NULL
)
1649 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1650 UserInfo4
->usri4_script_path
);
1651 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1654 // UserInfo4->usri4_auth_flags;
1656 if (UserInfo4
->usri4_full_name
!= NULL
)
1658 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1659 UserInfo4
->usri4_full_name
);
1660 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1663 if (UserInfo4
->usri4_usr_comment
!= NULL
)
1665 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1666 UserInfo4
->usri4_usr_comment
);
1667 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1670 if (UserInfo4
->usri4_parms
!= NULL
)
1672 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1673 UserInfo4
->usri4_parms
);
1674 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1677 if (UserInfo4
->usri4_workstations
!= NULL
)
1679 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1680 UserInfo4
->usri4_workstations
);
1681 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1684 // usri4_last_logon ignored
1685 // usri4_last_logoff ignored
1687 if (UserInfo4
->usri4_acct_expires
== TIMEQ_FOREVER
)
1689 UserAllInfo
.AccountExpires
.LowPart
= 0;
1690 UserAllInfo
.AccountExpires
.HighPart
= 0;
1694 RtlSecondsSince1970ToTime(UserInfo4
->usri4_acct_expires
,
1695 &UserAllInfo
.AccountExpires
);
1697 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1699 // UserInfo3->usri4_max_storage;
1700 // UserInfo3->usri4_units_per_week;
1701 // UserInfo3->usri4_logon_hours;
1703 // usri4_bad_pw_count ignored
1704 // usri4_num_logons ignored
1705 // usri4_logon_server ignored
1707 UserAllInfo
.CountryCode
= UserInfo4
->usri4_country_code
;
1708 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1710 UserAllInfo
.CodePage
= UserInfo4
->usri4_code_page
;
1711 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1713 // usri4_user_sid ignored
1715 UserAllInfo
.PrimaryGroupId
= UserInfo4
->usri4_primary_group_id
;
1716 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1718 if (UserInfo4
->usri4_profile
!= NULL
)
1720 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1721 UserInfo4
->usri4_profile
);
1722 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1725 if (UserInfo4
->usri4_home_dir_drive
!= NULL
)
1727 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1728 UserInfo4
->usri4_home_dir_drive
);
1729 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1732 UserAllInfo
.PasswordExpired
= (UserInfo4
->usri4_password_expired
!= 0);
1733 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1740 UserInfo1003
= (PUSER_INFO_1003
)UserInfo
;
1742 if (UserInfo1003
->usri1003_password
!= NULL
)
1744 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1745 UserInfo1003
->usri1003_password
);
1746 UserAllInfo
.NtPasswordPresent
= TRUE
;
1747 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1754 UserInfo1006
= (PUSER_INFO_1006
)UserInfo
;
1756 if (UserInfo1006
->usri1006_home_dir
!= NULL
)
1758 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1759 UserInfo1006
->usri1006_home_dir
);
1760 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1765 UserInfo1007
= (PUSER_INFO_1007
)UserInfo
;
1767 if (UserInfo1007
->usri1007_comment
!= NULL
)
1769 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1770 UserInfo1007
->usri1007_comment
);
1771 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1776 UserInfo1008
= (PUSER_INFO_1008
)UserInfo
;
1777 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1008
->usri1008_flags
);
1778 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1782 UserInfo1009
= (PUSER_INFO_1009
)UserInfo
;
1784 if (UserInfo1009
->usri1009_script_path
!= NULL
)
1786 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1787 UserInfo1009
->usri1009_script_path
);
1788 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1795 UserInfo1011
= (PUSER_INFO_1011
)UserInfo
;
1797 if (UserInfo1011
->usri1011_full_name
!= NULL
)
1799 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1800 UserInfo1011
->usri1011_full_name
);
1801 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1806 UserInfo1012
= (PUSER_INFO_1012
)UserInfo
;
1808 if (UserInfo1012
->usri1012_usr_comment
!= NULL
)
1810 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1811 UserInfo1012
->usri1012_usr_comment
);
1812 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1817 UserInfo1013
= (PUSER_INFO_1013
)UserInfo
;
1819 if (UserInfo1013
->usri1013_parms
!= NULL
)
1821 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1822 UserInfo1013
->usri1013_parms
);
1823 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1828 UserInfo1014
= (PUSER_INFO_1014
)UserInfo
;
1830 if (UserInfo1014
->usri1014_workstations
!= NULL
)
1832 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1833 UserInfo1014
->usri1014_workstations
);
1834 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1839 UserInfo1017
= (PUSER_INFO_1017
)UserInfo
;
1841 if (UserInfo1017
->usri1017_acct_expires
== TIMEQ_FOREVER
)
1843 UserAllInfo
.AccountExpires
.LowPart
= 0;
1844 UserAllInfo
.AccountExpires
.HighPart
= 0;
1848 RtlSecondsSince1970ToTime(UserInfo1017
->usri1017_acct_expires
,
1849 &UserAllInfo
.AccountExpires
);
1851 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1858 UserInfo1024
= (PUSER_INFO_1024
)UserInfo
;
1860 UserAllInfo
.CountryCode
= UserInfo1024
->usri1024_country_code
;
1861 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1865 UserInfo1025
= (PUSER_INFO_1025
)UserInfo
;
1867 UserAllInfo
.CodePage
= UserInfo1025
->usri1025_code_page
;
1868 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1872 UserInfo1051
= (PUSER_INFO_1051
)UserInfo
;
1874 UserAllInfo
.PrimaryGroupId
= UserInfo1051
->usri1051_primary_group_id
;
1875 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1879 UserInfo1052
= (PUSER_INFO_1052
)UserInfo
;
1881 if (UserInfo1052
->usri1052_profile
!= NULL
)
1883 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1884 UserInfo1052
->usri1052_profile
);
1885 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1890 UserInfo1053
= (PUSER_INFO_1053
)UserInfo
;
1892 if (UserInfo1053
->usri1053_home_dir_drive
!= NULL
)
1894 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1895 UserInfo1053
->usri1053_home_dir_drive
);
1896 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1901 ERR("Unsupported level %lu!\n", Level
);
1902 return ERROR_INVALID_PARAMETER
;
1905 Status
= SamSetInformationUser(UserHandle
,
1908 if (!NT_SUCCESS(Status
))
1910 ERR("SamSetInformationUser failed (Status %08lx)\n", Status
);
1911 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1922 OpenUserByName(SAM_HANDLE DomainHandle
,
1923 PUNICODE_STRING UserName
,
1924 ULONG DesiredAccess
,
1925 PSAM_HANDLE UserHandle
)
1927 PULONG RelativeIds
= NULL
;
1928 PSID_NAME_USE Use
= NULL
;
1929 NET_API_STATUS ApiStatus
= NERR_Success
;
1930 NTSTATUS Status
= STATUS_SUCCESS
;
1932 /* Get the RID for the given user name */
1933 Status
= SamLookupNamesInDomain(DomainHandle
,
1938 if (!NT_SUCCESS(Status
))
1940 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
1941 return NetpNtStatusToApiStatus(Status
);
1944 /* Fail, if it is not an alias account */
1945 if (Use
[0] != SidTypeUser
)
1947 ERR("Object is not a user!\n");
1948 ApiStatus
= NERR_GroupNotFound
;
1952 /* Open the alias account */
1953 Status
= SamOpenUser(DomainHandle
,
1957 if (!NT_SUCCESS(Status
))
1959 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1960 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1965 if (RelativeIds
!= NULL
)
1966 SamFreeMemory(RelativeIds
);
1975 /************************************************************
1976 * NetUserAdd (NETAPI32.@)
1980 NetUserAdd(LPCWSTR servername
,
1985 UNICODE_STRING ServerName
;
1986 UNICODE_STRING UserName
;
1987 SAM_HANDLE ServerHandle
= NULL
;
1988 SAM_HANDLE DomainHandle
= NULL
;
1989 SAM_HANDLE UserHandle
= NULL
;
1990 ULONG GrantedAccess
;
1992 NET_API_STATUS ApiStatus
= NERR_Success
;
1993 NTSTATUS Status
= STATUS_SUCCESS
;
1995 TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername
), level
, bufptr
, parm_err
);
1997 /* Check the info level */
2007 return ERROR_INVALID_LEVEL
;
2010 if (servername
!= NULL
)
2011 RtlInitUnicodeString(&ServerName
, servername
);
2013 /* Connect to the SAM Server */
2014 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2016 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2018 if (!NT_SUCCESS(Status
))
2020 ERR("SamConnect failed (Status %08lx)\n", Status
);
2021 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2025 /* Open the Account Domain */
2026 Status
= OpenAccountDomain(ServerHandle
,
2027 (servername
!= NULL
) ? &ServerName
: NULL
,
2028 DOMAIN_CREATE_USER
| DOMAIN_LOOKUP
,
2030 if (!NT_SUCCESS(Status
))
2032 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2033 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2037 /* Initialize the user name string */
2038 RtlInitUnicodeString(&UserName
,
2039 ((PUSER_INFO_1
)bufptr
)->usri1_name
);
2041 /* Create the user account */
2042 Status
= SamCreateUser2InDomain(DomainHandle
,
2044 USER_NORMAL_ACCOUNT
,
2045 USER_ALL_ACCESS
| DELETE
| WRITE_DAC
,
2049 if (!NT_SUCCESS(Status
))
2051 ERR("SamCreateUser2InDomain failed (Status %08lx)\n", Status
);
2052 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2056 /* Set user information */
2057 ApiStatus
= SetUserInfo(UserHandle
,
2060 if (ApiStatus
!= NERR_Success
)
2062 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
2067 if (UserHandle
!= NULL
)
2068 SamCloseHandle(UserHandle
);
2070 if (DomainHandle
!= NULL
)
2071 SamCloseHandle(DomainHandle
);
2073 if (ServerHandle
!= NULL
)
2074 SamCloseHandle(ServerHandle
);
2080 /******************************************************************************
2081 * NetUserChangePassword (NETAPI32.@)
2083 * domainname [I] Optional. Domain on which the user resides or the logon
2084 * domain of the current user if NULL.
2085 * username [I] Optional. Username to change the password for or the name
2086 * of the current user if NULL.
2087 * oldpassword [I] The user's current password.
2088 * newpassword [I] The password that the user will be changed to using.
2091 * Success: NERR_Success.
2092 * Failure: NERR_* failure code or win error code.
2097 NetUserChangePassword(LPCWSTR domainname
,
2099 LPCWSTR oldpassword
,
2100 LPCWSTR newpassword
)
2102 PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer
= NULL
;
2103 PMSV1_0_CHANGEPASSWORD_RESPONSE ResponseBuffer
= NULL
;
2104 ULONG RequestBufferSize
;
2105 ULONG ResponseBufferSize
= 0;
2107 ANSI_STRING PackageName
;
2108 ULONG AuthenticationPackage
= 0;
2109 HANDLE LsaHandle
= NULL
;
2110 NET_API_STATUS ApiStatus
= NERR_Success
;
2111 NTSTATUS Status
= STATUS_SUCCESS
;
2112 NTSTATUS ProtocolStatus
;
2114 TRACE("(%s, %s, ..., ...)\n", debugstr_w(domainname
), debugstr_w(username
));
2116 /* FIXME: handle null domain or user name */
2118 /* Check the parameters */
2119 if ((oldpassword
== NULL
) ||
2120 (newpassword
== NULL
))
2121 return ERROR_INVALID_PARAMETER
;
2123 /* Connect to the LSA server */
2124 Status
= LsaConnectUntrusted(&LsaHandle
);
2125 if (!NT_SUCCESS(Status
))
2126 return NetpNtStatusToApiStatus(Status
);
2128 /* Get the authentication package ID */
2129 RtlInitAnsiString(&PackageName
,
2130 MSV1_0_PACKAGE_NAME
);
2132 Status
= LsaLookupAuthenticationPackage(LsaHandle
,
2134 &AuthenticationPackage
);
2135 if (!NT_SUCCESS(Status
))
2137 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2141 /* Calculate the request buffer size */
2142 RequestBufferSize
= sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
) +
2143 ((wcslen(domainname
) + 1) * sizeof(WCHAR
)) +
2144 ((wcslen(username
) + 1) * sizeof(WCHAR
)) +
2145 ((wcslen(oldpassword
) + 1) * sizeof(WCHAR
)) +
2146 ((wcslen(newpassword
) + 1) * sizeof(WCHAR
));
2148 /* Allocate the request buffer */
2149 ApiStatus
= NetApiBufferAllocate(RequestBufferSize
,
2150 (PVOID
*)&RequestBuffer
);
2151 if (ApiStatus
!= NERR_Success
)
2154 /* Initialize the request buffer */
2155 RequestBuffer
->MessageType
= MsV1_0ChangePassword
;
2156 RequestBuffer
->Impersonating
= TRUE
;
2158 Ptr
= (LPWSTR
)((ULONG_PTR
)RequestBuffer
+ sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
));
2160 /* Pack the domain name */
2161 RequestBuffer
->DomainName
.Length
= wcslen(domainname
) * sizeof(WCHAR
);
2162 RequestBuffer
->DomainName
.MaximumLength
= RequestBuffer
->DomainName
.Length
+ sizeof(WCHAR
);
2163 RequestBuffer
->DomainName
.Buffer
= Ptr
;
2165 RtlCopyMemory(RequestBuffer
->DomainName
.Buffer
,
2167 RequestBuffer
->DomainName
.MaximumLength
);
2169 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->DomainName
.MaximumLength
);
2171 /* Pack the user name */
2172 RequestBuffer
->AccountName
.Length
= wcslen(username
) * sizeof(WCHAR
);
2173 RequestBuffer
->AccountName
.MaximumLength
= RequestBuffer
->AccountName
.Length
+ sizeof(WCHAR
);
2174 RequestBuffer
->AccountName
.Buffer
= Ptr
;
2176 RtlCopyMemory(RequestBuffer
->AccountName
.Buffer
,
2178 RequestBuffer
->AccountName
.MaximumLength
);
2180 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->AccountName
.MaximumLength
);
2182 /* Pack the old password */
2183 RequestBuffer
->OldPassword
.Length
= wcslen(oldpassword
) * sizeof(WCHAR
);
2184 RequestBuffer
->OldPassword
.MaximumLength
= RequestBuffer
->OldPassword
.Length
+ sizeof(WCHAR
);
2185 RequestBuffer
->OldPassword
.Buffer
= Ptr
;
2187 RtlCopyMemory(RequestBuffer
->OldPassword
.Buffer
,
2189 RequestBuffer
->OldPassword
.MaximumLength
);
2191 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->OldPassword
.MaximumLength
);
2193 /* Pack the new password */
2194 RequestBuffer
->NewPassword
.Length
= wcslen(newpassword
) * sizeof(WCHAR
);
2195 RequestBuffer
->NewPassword
.MaximumLength
= RequestBuffer
->NewPassword
.Length
+ sizeof(WCHAR
);
2196 RequestBuffer
->NewPassword
.Buffer
= Ptr
;
2198 RtlCopyMemory(RequestBuffer
->NewPassword
.Buffer
,
2200 RequestBuffer
->NewPassword
.MaximumLength
);
2202 /* Call the authentication package */
2203 Status
= LsaCallAuthenticationPackage(LsaHandle
,
2204 AuthenticationPackage
,
2207 (PVOID
*)&ResponseBuffer
,
2208 &ResponseBufferSize
,
2210 if (!NT_SUCCESS(Status
))
2212 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2216 if (!NT_SUCCESS(ProtocolStatus
))
2218 ApiStatus
= NetpNtStatusToApiStatus(ProtocolStatus
);
2223 if (RequestBuffer
!= NULL
)
2224 NetApiBufferFree(RequestBuffer
);
2226 if (ResponseBuffer
!= NULL
)
2227 LsaFreeReturnBuffer(ResponseBuffer
);
2229 if (LsaHandle
!= NULL
)
2236 /************************************************************
2237 * NetUserDel (NETAPI32.@)
2241 NetUserDel(LPCWSTR servername
,
2244 UNICODE_STRING ServerName
;
2245 UNICODE_STRING UserName
;
2246 SAM_HANDLE ServerHandle
= NULL
;
2247 SAM_HANDLE DomainHandle
= NULL
;
2248 SAM_HANDLE UserHandle
= NULL
;
2249 NET_API_STATUS ApiStatus
= NERR_Success
;
2250 NTSTATUS Status
= STATUS_SUCCESS
;
2252 TRACE("(%s, %s)\n", debugstr_w(servername
), debugstr_w(username
));
2254 if (servername
!= NULL
)
2255 RtlInitUnicodeString(&ServerName
, servername
);
2257 RtlInitUnicodeString(&UserName
, username
);
2259 /* Connect to the SAM Server */
2260 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2262 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2264 if (!NT_SUCCESS(Status
))
2266 ERR("SamConnect failed (Status %08lx)\n", Status
);
2267 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2271 /* Open the Builtin Domain */
2272 Status
= OpenBuiltinDomain(ServerHandle
,
2275 if (!NT_SUCCESS(Status
))
2277 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2278 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2282 /* Open the user account in the builtin domain */
2283 ApiStatus
= OpenUserByName(DomainHandle
,
2287 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_NONE_MAPPED
)
2289 TRACE("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2293 if (UserHandle
== NULL
)
2295 if (DomainHandle
!= NULL
)
2297 SamCloseHandle(DomainHandle
);
2298 DomainHandle
= NULL
;
2301 /* Open the Acount Domain */
2302 Status
= OpenAccountDomain(ServerHandle
,
2303 (servername
!= NULL
) ? &ServerName
: NULL
,
2306 if (!NT_SUCCESS(Status
))
2308 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2309 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2313 /* Open the user account in the account domain */
2314 ApiStatus
= OpenUserByName(DomainHandle
,
2318 if (ApiStatus
!= NERR_Success
)
2320 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2321 if (ApiStatus
== ERROR_NONE_MAPPED
)
2322 ApiStatus
= NERR_GroupNotFound
;
2327 /* Delete the user */
2328 Status
= SamDeleteUser(UserHandle
);
2329 if (!NT_SUCCESS(Status
))
2331 ERR("SamDeleteUser failed (Status %08lx)\n", Status
);
2332 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2337 if (UserHandle
!= NULL
)
2338 SamCloseHandle(UserHandle
);
2340 if (DomainHandle
!= NULL
)
2341 SamCloseHandle(DomainHandle
);
2343 if (ServerHandle
!= NULL
)
2344 SamCloseHandle(ServerHandle
);
2350 /************************************************************
2351 * NetUserEnum (NETAPI32.@)
2355 NetUserEnum(LPCWSTR servername
,
2360 LPDWORD entriesread
,
2361 LPDWORD totalentries
,
2362 LPDWORD resume_handle
)
2364 UNICODE_STRING ServerName
;
2365 PSAM_RID_ENUMERATION CurrentUser
;
2366 PENUM_CONTEXT EnumContext
= NULL
;
2367 LPVOID Buffer
= NULL
;
2369 SAM_HANDLE UserHandle
= NULL
;
2370 PUSER_ALL_INFORMATION UserInfo
= NULL
;
2372 NET_API_STATUS ApiStatus
= NERR_Success
;
2373 NTSTATUS Status
= STATUS_SUCCESS
;
2375 TRACE("(%s %d 0x%d %p %d %p %p %p)\n", debugstr_w(servername
), level
,
2376 filter
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
2382 if (servername
!= NULL
)
2383 RtlInitUnicodeString(&ServerName
, servername
);
2385 if (resume_handle
!= NULL
&& *resume_handle
!= 0)
2387 EnumContext
= (PENUM_CONTEXT
)*resume_handle
;
2391 ApiStatus
= NetApiBufferAllocate(sizeof(ENUM_CONTEXT
), (PVOID
*)&EnumContext
);
2392 if (ApiStatus
!= NERR_Success
)
2395 EnumContext
->EnumerationContext
= 0;
2396 EnumContext
->Buffer
= NULL
;
2397 EnumContext
->Count
= 0;
2398 EnumContext
->Index
= 0;
2399 EnumContext
->BuiltinDone
= FALSE
;
2401 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2402 &EnumContext
->ServerHandle
,
2403 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2405 if (!NT_SUCCESS(Status
))
2407 ERR("SamConnect failed (Status %08lx)\n", Status
);
2408 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2412 Status
= OpenAccountDomain(EnumContext
->ServerHandle
,
2413 (servername
!= NULL
) ? &ServerName
: NULL
,
2414 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2415 &EnumContext
->AccountDomainHandle
);
2416 if (!NT_SUCCESS(Status
))
2418 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2419 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2423 Status
= OpenBuiltinDomain(EnumContext
->ServerHandle
,
2424 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2425 &EnumContext
->BuiltinDomainHandle
);
2426 if (!NT_SUCCESS(Status
))
2428 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2429 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2436 TRACE("EnumContext->Index: %lu\n", EnumContext
->Index
);
2437 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2439 if (EnumContext
->Index
>= EnumContext
->Count
)
2441 // if (EnumContext->BuiltinDone == TRUE)
2443 // ApiStatus = NERR_Success;
2447 TRACE("Calling SamEnumerateUsersInDomain\n");
2448 Status
= SamEnumerateUsersInDomain(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2449 &EnumContext
->EnumerationContext
,
2451 (PVOID
*)&EnumContext
->Buffer
,
2453 &EnumContext
->Count
);
2455 TRACE("SamEnumerateUsersInDomain returned (Status %08lx)\n", Status
);
2456 if (!NT_SUCCESS(Status
))
2458 ERR("SamEnumerateUsersInDomain failed (Status %08lx)\n", Status
);
2459 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2463 if (Status
== STATUS_MORE_ENTRIES
)
2465 ApiStatus
= NERR_BufTooSmall
;
2470 EnumContext
->BuiltinDone
= TRUE
;
2474 TRACE("EnumContext: %lu\n", EnumContext
);
2475 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2476 TRACE("EnumContext->Buffer: %p\n", EnumContext
->Buffer
);
2478 /* Get a pointer to the current user */
2479 CurrentUser
= &EnumContext
->Buffer
[EnumContext
->Index
];
2481 TRACE("RID: %lu\n", CurrentUser
->RelativeId
);
2483 Status
= SamOpenUser(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2484 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2485 CurrentUser
->RelativeId
,
2487 if (!NT_SUCCESS(Status
))
2489 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2490 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2494 Status
= SamQueryInformationUser(UserHandle
,
2496 (PVOID
*)&UserInfo
);
2497 if (!NT_SUCCESS(Status
))
2499 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
2500 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2504 SamCloseHandle(UserHandle
);
2507 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
2509 CurrentUser
->RelativeId
,
2511 if (ApiStatus
!= NERR_Success
)
2513 ERR("BuildUserInfoBuffer failed (ApiStatus %lu)\n", ApiStatus
);
2517 if (UserInfo
!= NULL
)
2519 FreeUserInfo(UserInfo
);
2523 EnumContext
->Index
++;
2529 if (ApiStatus
== NERR_Success
&& EnumContext
->Index
< EnumContext
->Count
)
2530 ApiStatus
= ERROR_MORE_DATA
;
2532 if (EnumContext
!= NULL
)
2533 *totalentries
= EnumContext
->Count
;
2535 if (resume_handle
== NULL
|| ApiStatus
!= ERROR_MORE_DATA
)
2537 if (EnumContext
!= NULL
)
2539 if (EnumContext
->BuiltinDomainHandle
!= NULL
)
2540 SamCloseHandle(EnumContext
->BuiltinDomainHandle
);
2542 if (EnumContext
->AccountDomainHandle
!= NULL
)
2543 SamCloseHandle(EnumContext
->AccountDomainHandle
);
2545 if (EnumContext
->ServerHandle
!= NULL
)
2546 SamCloseHandle(EnumContext
->ServerHandle
);
2548 if (EnumContext
->Buffer
!= NULL
)
2550 for (i
= 0; i
< EnumContext
->Count
; i
++)
2552 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
2555 SamFreeMemory(EnumContext
->Buffer
);
2558 NetApiBufferFree(EnumContext
);
2563 if (UserHandle
!= NULL
)
2564 SamCloseHandle(UserHandle
);
2566 if (UserInfo
!= NULL
)
2567 FreeUserInfo(UserInfo
);
2569 if (resume_handle
!= NULL
)
2570 *resume_handle
= (DWORD_PTR
)EnumContext
;
2572 *bufptr
= (LPBYTE
)Buffer
;
2574 TRACE("return %lu\n", ApiStatus
);
2580 /************************************************************
2581 * NetUserGetGroups (NETAPI32.@)
2585 NetUserGetGroups(LPCWSTR servername
,
2590 LPDWORD entriesread
,
2591 LPDWORD totalentries
)
2593 FIXME("%s %s %d %p %d %p %p stub\n", debugstr_w(servername
),
2594 debugstr_w(username
), level
, bufptr
, prefixmaxlen
, entriesread
,
2601 return ERROR_INVALID_LEVEL
;
2605 /************************************************************
2606 * NetUserGetInfo (NETAPI32.@)
2610 NetUserGetInfo(LPCWSTR servername
,
2615 UNICODE_STRING ServerName
;
2616 UNICODE_STRING UserName
;
2617 SAM_HANDLE ServerHandle
= NULL
;
2618 SAM_HANDLE AccountDomainHandle
= NULL
;
2619 SAM_HANDLE UserHandle
= NULL
;
2620 PULONG RelativeIds
= NULL
;
2621 PSID_NAME_USE Use
= NULL
;
2622 PUSER_ALL_INFORMATION UserInfo
= NULL
;
2623 LPVOID Buffer
= NULL
;
2624 NET_API_STATUS ApiStatus
= NERR_Success
;
2625 NTSTATUS Status
= STATUS_SUCCESS
;
2627 TRACE("(%s, %s, %d, %p)\n", debugstr_w(servername
),
2628 debugstr_w(username
), level
, bufptr
);
2630 if (servername
!= NULL
)
2631 RtlInitUnicodeString(&ServerName
, servername
);
2633 RtlInitUnicodeString(&UserName
, username
);
2635 /* Connect to the SAM Server */
2636 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2638 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2640 if (!NT_SUCCESS(Status
))
2642 ERR("SamConnect failed (Status %08lx)\n", Status
);
2643 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2647 /* Open the Account Domain */
2648 Status
= OpenAccountDomain(ServerHandle
,
2649 (servername
!= NULL
) ? &ServerName
: NULL
,
2650 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2651 &AccountDomainHandle
);
2652 if (!NT_SUCCESS(Status
))
2654 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2655 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2659 /* Get the RID for the given user name */
2660 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2665 if (!NT_SUCCESS(Status
))
2667 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
2668 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2672 /* Check if the account is a user account */
2673 if (Use
[0] != SidTypeUser
)
2675 ERR("No user found!\n");
2676 ApiStatus
= NERR_UserNotFound
;
2680 TRACE("RID: %lu\n", RelativeIds
[0]);
2682 /* Open the user object */
2683 Status
= SamOpenUser(AccountDomainHandle
,
2684 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2687 if (!NT_SUCCESS(Status
))
2689 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2690 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2694 Status
= SamQueryInformationUser(UserHandle
,
2696 (PVOID
*)&UserInfo
);
2697 if (!NT_SUCCESS(Status
))
2699 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
2700 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2704 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
2708 if (ApiStatus
!= NERR_Success
)
2710 ERR("BuildUserInfoBuffer failed (ApiStatus %08lu)\n", ApiStatus
);
2715 if (UserInfo
!= NULL
)
2716 FreeUserInfo(UserInfo
);
2718 if (UserHandle
!= NULL
)
2719 SamCloseHandle(UserHandle
);
2721 if (RelativeIds
!= NULL
)
2722 SamFreeMemory(RelativeIds
);
2727 if (AccountDomainHandle
!= NULL
)
2728 SamCloseHandle(AccountDomainHandle
);
2730 if (ServerHandle
!= NULL
)
2731 SamCloseHandle(ServerHandle
);
2733 *bufptr
= (LPBYTE
)Buffer
;
2739 /************************************************************
2740 * NetUserGetLocalGroups (NETAPI32.@)
2744 NetUserGetLocalGroups(LPCWSTR servername
,
2750 LPDWORD entriesread
,
2751 LPDWORD totalentries
)
2753 UNICODE_STRING ServerName
;
2754 UNICODE_STRING UserName
;
2755 SAM_HANDLE ServerHandle
= NULL
;
2756 SAM_HANDLE BuiltinDomainHandle
= NULL
;
2757 SAM_HANDLE AccountDomainHandle
= NULL
;
2758 PSID AccountDomainSid
= NULL
;
2759 PSID UserSid
= NULL
;
2760 PULONG RelativeIds
= NULL
;
2761 PSID_NAME_USE Use
= NULL
;
2762 ULONG BuiltinMemberCount
= 0;
2763 ULONG AccountMemberCount
= 0;
2764 PULONG BuiltinAliases
= NULL
;
2765 PULONG AccountAliases
= NULL
;
2766 PUNICODE_STRING BuiltinNames
= NULL
;
2767 PUNICODE_STRING AccountNames
= NULL
;
2768 PLOCALGROUP_USERS_INFO_0 Buffer
= NULL
;
2774 NET_API_STATUS ApiStatus
= NERR_Success
;
2775 NTSTATUS Status
= STATUS_SUCCESS
;
2777 TRACE("(%s, %s, %d, %08x, %p %d, %p, %p) stub!\n",
2778 debugstr_w(servername
), debugstr_w(username
), level
, flags
, bufptr
,
2779 prefmaxlen
, entriesread
, totalentries
);
2782 return ERROR_INVALID_LEVEL
;
2784 if (flags
& ~LG_INCLUDE_INDIRECT
)
2785 return ERROR_INVALID_PARAMETER
;
2787 if (flags
& LG_INCLUDE_INDIRECT
)
2789 WARN("The flag LG_INCLUDE_INDIRECT is not supported yet!\n");
2792 if (servername
!= NULL
)
2793 RtlInitUnicodeString(&ServerName
, servername
);
2795 RtlInitUnicodeString(&UserName
, username
);
2797 /* Connect to the SAM Server */
2798 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2800 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2802 if (!NT_SUCCESS(Status
))
2804 ERR("SamConnect failed (Status %08lx)\n", Status
);
2805 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2809 /* Open the Builtin Domain */
2810 Status
= OpenBuiltinDomain(ServerHandle
,
2811 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2812 &BuiltinDomainHandle
);
2813 if (!NT_SUCCESS(Status
))
2815 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2816 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2820 /* Get the Account Domain SID */
2821 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
2823 if (!NT_SUCCESS(Status
))
2825 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
2826 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2830 /* Open the Account Domain */
2831 Status
= SamOpenDomain(ServerHandle
,
2832 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2834 &AccountDomainHandle
);
2835 if (!NT_SUCCESS(Status
))
2837 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2838 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2842 /* Get the RID for the given user name */
2843 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2848 if (!NT_SUCCESS(Status
))
2850 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2851 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2855 /* Fail, if it is not a user account */
2856 if (Use
[0] != SidTypeUser
)
2858 ERR("Account is not a User!\n");
2859 ApiStatus
= NERR_UserNotFound
;
2863 /* Build the User SID from the Account Domain SID and the users RID */
2864 ApiStatus
= BuildSidFromSidAndRid(AccountDomainSid
,
2867 if (ApiStatus
!= NERR_Success
)
2869 ERR("BuildSidFromSidAndRid failed!\n");
2873 /* Get alias memberships in the Builtin Domain */
2874 Status
= SamGetAliasMembership(BuiltinDomainHandle
,
2877 &BuiltinMemberCount
,
2879 if (!NT_SUCCESS(Status
))
2881 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2882 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2886 if (BuiltinMemberCount
> 0)
2888 /* Get the Names of the builtin alias members */
2889 Status
= SamLookupIdsInDomain(BuiltinDomainHandle
,
2894 if (!NT_SUCCESS(Status
))
2896 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2897 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2902 /* Get alias memberships in the Account Domain */
2903 Status
= SamGetAliasMembership(AccountDomainHandle
,
2906 &AccountMemberCount
,
2908 if (!NT_SUCCESS(Status
))
2910 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2911 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2915 if (AccountMemberCount
> 0)
2917 /* Get the Names of the builtin alias members */
2918 Status
= SamLookupIdsInDomain(AccountDomainHandle
,
2923 if (!NT_SUCCESS(Status
))
2925 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2926 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2931 /* Calculate the required buffer size */
2934 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2936 if (BuiltinNames
[i
].Length
> 0)
2938 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2943 for (i
= 0; i
< AccountMemberCount
; i
++)
2945 if (BuiltinNames
[i
].Length
> 0)
2947 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2954 ApiStatus
= NERR_Success
;
2958 /* Allocate buffer */
2959 ApiStatus
= NetApiBufferAllocate(Size
, (LPVOID
*)&Buffer
);
2960 if (ApiStatus
!= NERR_Success
)
2963 ZeroMemory(Buffer
, Size
);
2965 StrPtr
= (LPWSTR
)((INT_PTR
)Buffer
+ Count
* sizeof(LOCALGROUP_USERS_INFO_0
));
2967 /* Copy data to the allocated buffer */
2969 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2971 if (BuiltinNames
[i
].Length
> 0)
2974 BuiltinNames
[i
].Buffer
,
2975 BuiltinNames
[i
].Length
);
2976 Buffer
[Index
].lgrui0_name
= StrPtr
;
2978 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2983 for (i
= 0; i
< AccountMemberCount
; i
++)
2985 if (AccountNames
[i
].Length
> 0)
2988 AccountNames
[i
].Buffer
,
2989 AccountNames
[i
].Length
);
2990 Buffer
[Index
].lgrui0_name
= StrPtr
;
2992 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2998 if (AccountNames
!= NULL
)
2999 SamFreeMemory(AccountNames
);
3001 if (BuiltinNames
!= NULL
)
3002 SamFreeMemory(BuiltinNames
);
3004 if (AccountAliases
!= NULL
)
3005 SamFreeMemory(AccountAliases
);
3007 if (BuiltinAliases
!= NULL
)
3008 SamFreeMemory(BuiltinAliases
);
3010 if (RelativeIds
!= NULL
)
3011 SamFreeMemory(RelativeIds
);
3016 if (UserSid
!= NULL
)
3017 NetApiBufferFree(UserSid
);
3019 if (AccountDomainSid
!= NULL
)
3020 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
3022 if (AccountDomainHandle
!= NULL
)
3023 SamCloseHandle(AccountDomainHandle
);
3025 if (BuiltinDomainHandle
!= NULL
)
3026 SamCloseHandle(BuiltinDomainHandle
);
3028 if (ServerHandle
!= NULL
)
3029 SamCloseHandle(ServerHandle
);
3031 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
3038 *entriesread
= Count
;
3039 *totalentries
= Count
;
3042 *bufptr
= (LPBYTE
)Buffer
;
3048 /******************************************************************************
3049 * NetUserSetGroups (NETAPI32.@)
3053 NetUserSetGroups(LPCWSTR servername
,
3059 FIXME("(%s %s %lu %p %lu)\n",
3060 debugstr_w(servername
), debugstr_w(username
), level
, buf
, num_entries
);
3061 return ERROR_ACCESS_DENIED
;
3065 /******************************************************************************
3066 * NetUserSetInfo (NETAPI32.@)
3070 NetUserSetInfo(LPCWSTR servername
,
3076 UNICODE_STRING ServerName
;
3077 UNICODE_STRING UserName
;
3078 SAM_HANDLE ServerHandle
= NULL
;
3079 SAM_HANDLE AccountDomainHandle
= NULL
;
3080 SAM_HANDLE UserHandle
= NULL
;
3081 NET_API_STATUS ApiStatus
= NERR_Success
;
3082 NTSTATUS Status
= STATUS_SUCCESS
;
3084 TRACE("(%s %s %lu %p %p)\n",
3085 debugstr_w(servername
), debugstr_w(username
), level
, buf
, parm_err
);
3087 if (parm_err
!= NULL
)
3088 *parm_err
= PARM_ERROR_NONE
;
3090 /* Check the info level */
3122 return ERROR_INVALID_LEVEL
;
3125 if (servername
!= NULL
)
3126 RtlInitUnicodeString(&ServerName
, servername
);
3128 RtlInitUnicodeString(&UserName
, username
);
3130 /* Connect to the SAM Server */
3131 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3133 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3135 if (!NT_SUCCESS(Status
))
3137 ERR("SamConnect failed (Status %08lx)\n", Status
);
3138 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3142 /* Open the Account Domain */
3143 Status
= OpenAccountDomain(ServerHandle
,
3144 (servername
!= NULL
) ? &ServerName
: NULL
,
3145 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
3146 &AccountDomainHandle
);
3147 if (!NT_SUCCESS(Status
))
3149 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3150 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3154 /* Open the User Account */
3155 ApiStatus
= OpenUserByName(AccountDomainHandle
,
3159 if (ApiStatus
!= NERR_Success
)
3161 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
3165 /* Set user information */
3166 ApiStatus
= SetUserInfo(UserHandle
,
3169 if (ApiStatus
!= NERR_Success
)
3171 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
3175 if (UserHandle
!= NULL
)
3176 SamCloseHandle(UserHandle
);
3178 if (AccountDomainHandle
!= NULL
)
3179 SamCloseHandle(AccountDomainHandle
);
3181 if (ServerHandle
!= NULL
)
3182 SamCloseHandle(ServerHandle
);