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_1018 UserInfo1018
;
1327 PUSER_INFO_1024 UserInfo1024
;
1328 PUSER_INFO_1025 UserInfo1025
;
1329 PUSER_INFO_1051 UserInfo1051
;
1330 PUSER_INFO_1052 UserInfo1052
;
1331 PUSER_INFO_1053 UserInfo1053
;
1332 NET_API_STATUS ApiStatus
= NERR_Success
;
1333 NTSTATUS Status
= STATUS_SUCCESS
;
1335 ZeroMemory(&UserAllInfo
, sizeof(USER_ALL_INFORMATION
));
1340 UserInfo0
= (PUSER_INFO_0
)UserInfo
;
1342 RtlInitUnicodeString(&UserAllInfo
.UserName
,
1343 UserInfo0
->usri0_name
);
1345 UserAllInfo
.WhichFields
|= USER_ALL_USERNAME
;
1349 UserInfo1
= (PUSER_INFO_1
)UserInfo
;
1351 // usri1_name ignored
1353 if (UserInfo1
->usri1_password
!= NULL
)
1355 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1356 UserInfo1
->usri1_password
);
1357 UserAllInfo
.NtPasswordPresent
= TRUE
;
1358 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1361 // usri1_password_age ignored
1363 // UserInfo1->usri1_priv
1365 if (UserInfo1
->usri1_home_dir
!= NULL
)
1367 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1368 UserInfo1
->usri1_home_dir
);
1369 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1372 if (UserInfo1
->usri1_comment
!= NULL
)
1374 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1375 UserInfo1
->usri1_comment
);
1376 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1379 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1
->usri1_flags
);
1380 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1382 if (UserInfo1
->usri1_script_path
!= NULL
)
1384 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1385 UserInfo1
->usri1_script_path
);
1386 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1391 UserInfo2
= (PUSER_INFO_2
)UserInfo
;
1393 // usri2_name ignored
1395 if (UserInfo2
->usri2_password
!= NULL
)
1397 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1398 UserInfo2
->usri2_password
);
1399 UserAllInfo
.NtPasswordPresent
= TRUE
;
1400 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1403 // usri2_password_age ignored
1405 // UserInfo2->usri2_priv;
1407 if (UserInfo2
->usri2_home_dir
!= NULL
)
1409 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1410 UserInfo2
->usri2_home_dir
);
1411 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1414 if (UserInfo2
->usri2_comment
!= NULL
)
1416 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1417 UserInfo2
->usri2_comment
);
1418 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1421 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo2
->usri2_flags
);
1422 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1424 if (UserInfo2
->usri2_script_path
!= NULL
)
1426 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1427 UserInfo2
->usri2_script_path
);
1428 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1431 // UserInfo2->usri2_auth_flags;
1433 if (UserInfo2
->usri2_full_name
!= NULL
)
1435 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1436 UserInfo2
->usri2_full_name
);
1437 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1440 if (UserInfo2
->usri2_usr_comment
!= NULL
)
1442 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1443 UserInfo2
->usri2_usr_comment
);
1444 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1447 if (UserInfo2
->usri2_parms
!= NULL
)
1449 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1450 UserInfo2
->usri2_parms
);
1451 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1454 if (UserInfo2
->usri2_workstations
!= NULL
)
1456 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1457 UserInfo2
->usri2_workstations
);
1458 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1461 // usri2_last_logon ignored
1462 // usri2_last_logoff ignored
1464 if (UserInfo2
->usri2_acct_expires
== TIMEQ_FOREVER
)
1466 UserAllInfo
.AccountExpires
.LowPart
= 0;
1467 UserAllInfo
.AccountExpires
.HighPart
= 0;
1471 RtlSecondsSince1970ToTime(UserInfo2
->usri2_acct_expires
,
1472 &UserAllInfo
.AccountExpires
);
1474 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1476 // usri2_max_storage ignored
1478 // UserInfo2->usri2_units_per_week;
1479 // UserInfo2->usri2_logon_hours;
1481 // usri2_bad_pw_count ignored
1482 // usri2_num_logons ignored
1483 // usri2_logon_server ignored
1485 UserAllInfo
.CountryCode
= UserInfo2
->usri2_country_code
;
1486 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1488 UserAllInfo
.CodePage
= UserInfo2
->usri2_code_page
;
1489 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1493 UserInfo3
= (PUSER_INFO_3
)UserInfo
;
1495 // usri3_name ignored
1497 if (UserInfo3
->usri3_password
!= NULL
)
1499 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1500 UserInfo3
->usri3_password
);
1501 UserAllInfo
.NtPasswordPresent
= TRUE
;
1502 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1505 // usri3_password_age ignored
1507 // UserInfo3->usri3_priv;
1509 if (UserInfo3
->usri3_home_dir
!= NULL
)
1511 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1512 UserInfo3
->usri3_home_dir
);
1513 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1516 if (UserInfo3
->usri3_comment
!= NULL
)
1518 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1519 UserInfo3
->usri3_comment
);
1520 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1523 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo3
->usri3_flags
);
1524 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1526 if (UserInfo3
->usri3_script_path
!= NULL
)
1528 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1529 UserInfo3
->usri3_script_path
);
1530 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1533 // UserInfo3->usri3_auth_flags;
1535 if (UserInfo3
->usri3_full_name
!= NULL
)
1537 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1538 UserInfo3
->usri3_full_name
);
1539 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1542 if (UserInfo3
->usri3_usr_comment
!= NULL
)
1544 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1545 UserInfo3
->usri3_usr_comment
);
1546 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1549 if (UserInfo3
->usri3_parms
!= NULL
)
1551 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1552 UserInfo3
->usri3_parms
);
1553 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1556 if (UserInfo3
->usri3_workstations
!= NULL
)
1558 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1559 UserInfo3
->usri3_workstations
);
1560 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1563 // usri3_last_logon ignored
1564 // usri3_last_logoff ignored
1566 if (UserInfo3
->usri3_acct_expires
== TIMEQ_FOREVER
)
1568 UserAllInfo
.AccountExpires
.LowPart
= 0;
1569 UserAllInfo
.AccountExpires
.HighPart
= 0;
1573 RtlSecondsSince1970ToTime(UserInfo3
->usri3_acct_expires
,
1574 &UserAllInfo
.AccountExpires
);
1576 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1578 // usri3_max_storage ignored
1580 // UserInfo3->usri3_units_per_week;
1581 // UserInfo3->usri3_logon_hours;
1583 // usri3_bad_pw_count ignored
1584 // usri3_num_logons ignored
1585 // usri3_logon_server ignored
1587 UserAllInfo
.CountryCode
= UserInfo3
->usri3_country_code
;
1588 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1590 UserAllInfo
.CodePage
= UserInfo3
->usri3_code_page
;
1591 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1593 // usri3_user_id ignored
1595 UserAllInfo
.PrimaryGroupId
= UserInfo3
->usri3_primary_group_id
;
1596 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1598 if (UserInfo3
->usri3_profile
!= NULL
)
1600 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1601 UserInfo3
->usri3_profile
);
1602 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1605 if (UserInfo3
->usri3_home_dir_drive
!= NULL
)
1607 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1608 UserInfo3
->usri3_home_dir_drive
);
1609 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1612 UserAllInfo
.PasswordExpired
= (UserInfo3
->usri3_password_expired
!= 0);
1613 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1617 UserInfo4
= (PUSER_INFO_4
)UserInfo
;
1619 // usri4_name ignored
1621 if (UserInfo4
->usri4_password
!= NULL
)
1623 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1624 UserInfo4
->usri4_password
);
1625 UserAllInfo
.NtPasswordPresent
= TRUE
;
1626 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1629 // usri4_password_age ignored
1631 // UserInfo3->usri4_priv;
1633 if (UserInfo4
->usri4_home_dir
!= NULL
)
1635 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1636 UserInfo4
->usri4_home_dir
);
1637 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1640 if (UserInfo4
->usri4_comment
!= NULL
)
1642 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1643 UserInfo4
->usri4_comment
);
1644 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1647 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo4
->usri4_flags
);
1648 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1650 if (UserInfo4
->usri4_script_path
!= NULL
)
1652 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1653 UserInfo4
->usri4_script_path
);
1654 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1657 // UserInfo4->usri4_auth_flags;
1659 if (UserInfo4
->usri4_full_name
!= NULL
)
1661 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1662 UserInfo4
->usri4_full_name
);
1663 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1666 if (UserInfo4
->usri4_usr_comment
!= NULL
)
1668 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1669 UserInfo4
->usri4_usr_comment
);
1670 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1673 if (UserInfo4
->usri4_parms
!= NULL
)
1675 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1676 UserInfo4
->usri4_parms
);
1677 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1680 if (UserInfo4
->usri4_workstations
!= NULL
)
1682 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1683 UserInfo4
->usri4_workstations
);
1684 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1687 // usri4_last_logon ignored
1688 // usri4_last_logoff ignored
1690 if (UserInfo4
->usri4_acct_expires
== TIMEQ_FOREVER
)
1692 UserAllInfo
.AccountExpires
.LowPart
= 0;
1693 UserAllInfo
.AccountExpires
.HighPart
= 0;
1697 RtlSecondsSince1970ToTime(UserInfo4
->usri4_acct_expires
,
1698 &UserAllInfo
.AccountExpires
);
1700 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1702 // usri4_max_storage ignored
1704 // UserInfo3->usri4_units_per_week;
1705 // UserInfo3->usri4_logon_hours;
1707 // usri4_bad_pw_count ignored
1708 // usri4_num_logons ignored
1709 // usri4_logon_server ignored
1711 UserAllInfo
.CountryCode
= UserInfo4
->usri4_country_code
;
1712 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1714 UserAllInfo
.CodePage
= UserInfo4
->usri4_code_page
;
1715 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1717 // usri4_user_sid ignored
1719 UserAllInfo
.PrimaryGroupId
= UserInfo4
->usri4_primary_group_id
;
1720 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1722 if (UserInfo4
->usri4_profile
!= NULL
)
1724 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1725 UserInfo4
->usri4_profile
);
1726 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1729 if (UserInfo4
->usri4_home_dir_drive
!= NULL
)
1731 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1732 UserInfo4
->usri4_home_dir_drive
);
1733 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1736 UserAllInfo
.PasswordExpired
= (UserInfo4
->usri4_password_expired
!= 0);
1737 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1744 UserInfo1003
= (PUSER_INFO_1003
)UserInfo
;
1746 if (UserInfo1003
->usri1003_password
!= NULL
)
1748 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1749 UserInfo1003
->usri1003_password
);
1750 UserAllInfo
.NtPasswordPresent
= TRUE
;
1751 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1758 UserInfo1006
= (PUSER_INFO_1006
)UserInfo
;
1760 if (UserInfo1006
->usri1006_home_dir
!= NULL
)
1762 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1763 UserInfo1006
->usri1006_home_dir
);
1764 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1769 UserInfo1007
= (PUSER_INFO_1007
)UserInfo
;
1771 if (UserInfo1007
->usri1007_comment
!= NULL
)
1773 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1774 UserInfo1007
->usri1007_comment
);
1775 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1780 UserInfo1008
= (PUSER_INFO_1008
)UserInfo
;
1781 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1008
->usri1008_flags
);
1782 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1786 UserInfo1009
= (PUSER_INFO_1009
)UserInfo
;
1788 if (UserInfo1009
->usri1009_script_path
!= NULL
)
1790 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1791 UserInfo1009
->usri1009_script_path
);
1792 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1799 UserInfo1011
= (PUSER_INFO_1011
)UserInfo
;
1801 if (UserInfo1011
->usri1011_full_name
!= NULL
)
1803 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1804 UserInfo1011
->usri1011_full_name
);
1805 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1810 UserInfo1012
= (PUSER_INFO_1012
)UserInfo
;
1812 if (UserInfo1012
->usri1012_usr_comment
!= NULL
)
1814 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1815 UserInfo1012
->usri1012_usr_comment
);
1816 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1821 UserInfo1013
= (PUSER_INFO_1013
)UserInfo
;
1823 if (UserInfo1013
->usri1013_parms
!= NULL
)
1825 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1826 UserInfo1013
->usri1013_parms
);
1827 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1832 UserInfo1014
= (PUSER_INFO_1014
)UserInfo
;
1834 if (UserInfo1014
->usri1014_workstations
!= NULL
)
1836 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1837 UserInfo1014
->usri1014_workstations
);
1838 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1843 UserInfo1017
= (PUSER_INFO_1017
)UserInfo
;
1845 if (UserInfo1017
->usri1017_acct_expires
== TIMEQ_FOREVER
)
1847 UserAllInfo
.AccountExpires
.LowPart
= 0;
1848 UserAllInfo
.AccountExpires
.HighPart
= 0;
1852 RtlSecondsSince1970ToTime(UserInfo1017
->usri1017_acct_expires
,
1853 &UserAllInfo
.AccountExpires
);
1855 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1859 UserInfo1018
= (PUSER_INFO_1018
)UserInfo
;
1861 if (UserInfo1018
->usri1018_max_storage
!= USER_MAXSTORAGE_UNLIMITED
)
1863 // FIXME: Report error
1864 return ERROR_INVALID_PARAMETER
;
1871 UserInfo1024
= (PUSER_INFO_1024
)UserInfo
;
1873 UserAllInfo
.CountryCode
= UserInfo1024
->usri1024_country_code
;
1874 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1878 UserInfo1025
= (PUSER_INFO_1025
)UserInfo
;
1880 UserAllInfo
.CodePage
= UserInfo1025
->usri1025_code_page
;
1881 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1885 UserInfo1051
= (PUSER_INFO_1051
)UserInfo
;
1887 UserAllInfo
.PrimaryGroupId
= UserInfo1051
->usri1051_primary_group_id
;
1888 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1892 UserInfo1052
= (PUSER_INFO_1052
)UserInfo
;
1894 if (UserInfo1052
->usri1052_profile
!= NULL
)
1896 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1897 UserInfo1052
->usri1052_profile
);
1898 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1903 UserInfo1053
= (PUSER_INFO_1053
)UserInfo
;
1905 if (UserInfo1053
->usri1053_home_dir_drive
!= NULL
)
1907 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1908 UserInfo1053
->usri1053_home_dir_drive
);
1909 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1914 ERR("Unsupported level %lu!\n", Level
);
1915 return ERROR_INVALID_PARAMETER
;
1918 Status
= SamSetInformationUser(UserHandle
,
1921 if (!NT_SUCCESS(Status
))
1923 ERR("SamSetInformationUser failed (Status %08lx)\n", Status
);
1924 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1935 OpenUserByName(SAM_HANDLE DomainHandle
,
1936 PUNICODE_STRING UserName
,
1937 ULONG DesiredAccess
,
1938 PSAM_HANDLE UserHandle
)
1940 PULONG RelativeIds
= NULL
;
1941 PSID_NAME_USE Use
= NULL
;
1942 NET_API_STATUS ApiStatus
= NERR_Success
;
1943 NTSTATUS Status
= STATUS_SUCCESS
;
1945 /* Get the RID for the given user name */
1946 Status
= SamLookupNamesInDomain(DomainHandle
,
1951 if (!NT_SUCCESS(Status
))
1953 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
1954 return NetpNtStatusToApiStatus(Status
);
1957 /* Fail, if it is not an alias account */
1958 if (Use
[0] != SidTypeUser
)
1960 ERR("Object is not a user!\n");
1961 ApiStatus
= NERR_GroupNotFound
;
1965 /* Open the alias account */
1966 Status
= SamOpenUser(DomainHandle
,
1970 if (!NT_SUCCESS(Status
))
1972 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1973 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1978 if (RelativeIds
!= NULL
)
1979 SamFreeMemory(RelativeIds
);
1988 /************************************************************
1989 * NetUserAdd (NETAPI32.@)
1993 NetUserAdd(LPCWSTR servername
,
1998 UNICODE_STRING ServerName
;
1999 UNICODE_STRING UserName
;
2000 SAM_HANDLE ServerHandle
= NULL
;
2001 SAM_HANDLE DomainHandle
= NULL
;
2002 SAM_HANDLE UserHandle
= NULL
;
2003 ULONG GrantedAccess
;
2005 NET_API_STATUS ApiStatus
= NERR_Success
;
2006 NTSTATUS Status
= STATUS_SUCCESS
;
2008 TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername
), level
, bufptr
, parm_err
);
2010 /* Check the info level */
2020 return ERROR_INVALID_LEVEL
;
2023 if (servername
!= NULL
)
2024 RtlInitUnicodeString(&ServerName
, servername
);
2026 /* Connect to the SAM Server */
2027 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2029 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2031 if (!NT_SUCCESS(Status
))
2033 ERR("SamConnect failed (Status %08lx)\n", Status
);
2034 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2038 /* Open the Account Domain */
2039 Status
= OpenAccountDomain(ServerHandle
,
2040 (servername
!= NULL
) ? &ServerName
: NULL
,
2041 DOMAIN_CREATE_USER
| DOMAIN_LOOKUP
,
2043 if (!NT_SUCCESS(Status
))
2045 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2046 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2050 /* Initialize the user name string */
2051 RtlInitUnicodeString(&UserName
,
2052 ((PUSER_INFO_1
)bufptr
)->usri1_name
);
2054 /* Create the user account */
2055 Status
= SamCreateUser2InDomain(DomainHandle
,
2057 USER_NORMAL_ACCOUNT
,
2058 USER_ALL_ACCESS
| DELETE
| WRITE_DAC
,
2062 if (!NT_SUCCESS(Status
))
2064 ERR("SamCreateUser2InDomain failed (Status %08lx)\n", Status
);
2065 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2069 /* Set user information */
2070 ApiStatus
= SetUserInfo(UserHandle
,
2073 if (ApiStatus
!= NERR_Success
)
2075 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
2080 if (UserHandle
!= NULL
)
2081 SamCloseHandle(UserHandle
);
2083 if (DomainHandle
!= NULL
)
2084 SamCloseHandle(DomainHandle
);
2086 if (ServerHandle
!= NULL
)
2087 SamCloseHandle(ServerHandle
);
2093 /******************************************************************************
2094 * NetUserChangePassword (NETAPI32.@)
2096 * domainname [I] Optional. Domain on which the user resides or the logon
2097 * domain of the current user if NULL.
2098 * username [I] Optional. Username to change the password for or the name
2099 * of the current user if NULL.
2100 * oldpassword [I] The user's current password.
2101 * newpassword [I] The password that the user will be changed to using.
2104 * Success: NERR_Success.
2105 * Failure: NERR_* failure code or win error code.
2110 NetUserChangePassword(LPCWSTR domainname
,
2112 LPCWSTR oldpassword
,
2113 LPCWSTR newpassword
)
2115 PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer
= NULL
;
2116 PMSV1_0_CHANGEPASSWORD_RESPONSE ResponseBuffer
= NULL
;
2117 ULONG RequestBufferSize
;
2118 ULONG ResponseBufferSize
= 0;
2120 ANSI_STRING PackageName
;
2121 ULONG AuthenticationPackage
= 0;
2122 HANDLE LsaHandle
= NULL
;
2123 NET_API_STATUS ApiStatus
= NERR_Success
;
2124 NTSTATUS Status
= STATUS_SUCCESS
;
2125 NTSTATUS ProtocolStatus
;
2127 TRACE("(%s, %s, ..., ...)\n", debugstr_w(domainname
), debugstr_w(username
));
2129 /* FIXME: handle null domain or user name */
2131 /* Check the parameters */
2132 if ((oldpassword
== NULL
) ||
2133 (newpassword
== NULL
))
2134 return ERROR_INVALID_PARAMETER
;
2136 /* Connect to the LSA server */
2137 Status
= LsaConnectUntrusted(&LsaHandle
);
2138 if (!NT_SUCCESS(Status
))
2139 return NetpNtStatusToApiStatus(Status
);
2141 /* Get the authentication package ID */
2142 RtlInitAnsiString(&PackageName
,
2143 MSV1_0_PACKAGE_NAME
);
2145 Status
= LsaLookupAuthenticationPackage(LsaHandle
,
2147 &AuthenticationPackage
);
2148 if (!NT_SUCCESS(Status
))
2150 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2154 /* Calculate the request buffer size */
2155 RequestBufferSize
= sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
) +
2156 ((wcslen(domainname
) + 1) * sizeof(WCHAR
)) +
2157 ((wcslen(username
) + 1) * sizeof(WCHAR
)) +
2158 ((wcslen(oldpassword
) + 1) * sizeof(WCHAR
)) +
2159 ((wcslen(newpassword
) + 1) * sizeof(WCHAR
));
2161 /* Allocate the request buffer */
2162 ApiStatus
= NetApiBufferAllocate(RequestBufferSize
,
2163 (PVOID
*)&RequestBuffer
);
2164 if (ApiStatus
!= NERR_Success
)
2167 /* Initialize the request buffer */
2168 RequestBuffer
->MessageType
= MsV1_0ChangePassword
;
2169 RequestBuffer
->Impersonating
= TRUE
;
2171 Ptr
= (LPWSTR
)((ULONG_PTR
)RequestBuffer
+ sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
));
2173 /* Pack the domain name */
2174 RequestBuffer
->DomainName
.Length
= wcslen(domainname
) * sizeof(WCHAR
);
2175 RequestBuffer
->DomainName
.MaximumLength
= RequestBuffer
->DomainName
.Length
+ sizeof(WCHAR
);
2176 RequestBuffer
->DomainName
.Buffer
= Ptr
;
2178 RtlCopyMemory(RequestBuffer
->DomainName
.Buffer
,
2180 RequestBuffer
->DomainName
.MaximumLength
);
2182 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->DomainName
.MaximumLength
);
2184 /* Pack the user name */
2185 RequestBuffer
->AccountName
.Length
= wcslen(username
) * sizeof(WCHAR
);
2186 RequestBuffer
->AccountName
.MaximumLength
= RequestBuffer
->AccountName
.Length
+ sizeof(WCHAR
);
2187 RequestBuffer
->AccountName
.Buffer
= Ptr
;
2189 RtlCopyMemory(RequestBuffer
->AccountName
.Buffer
,
2191 RequestBuffer
->AccountName
.MaximumLength
);
2193 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->AccountName
.MaximumLength
);
2195 /* Pack the old password */
2196 RequestBuffer
->OldPassword
.Length
= wcslen(oldpassword
) * sizeof(WCHAR
);
2197 RequestBuffer
->OldPassword
.MaximumLength
= RequestBuffer
->OldPassword
.Length
+ sizeof(WCHAR
);
2198 RequestBuffer
->OldPassword
.Buffer
= Ptr
;
2200 RtlCopyMemory(RequestBuffer
->OldPassword
.Buffer
,
2202 RequestBuffer
->OldPassword
.MaximumLength
);
2204 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->OldPassword
.MaximumLength
);
2206 /* Pack the new password */
2207 RequestBuffer
->NewPassword
.Length
= wcslen(newpassword
) * sizeof(WCHAR
);
2208 RequestBuffer
->NewPassword
.MaximumLength
= RequestBuffer
->NewPassword
.Length
+ sizeof(WCHAR
);
2209 RequestBuffer
->NewPassword
.Buffer
= Ptr
;
2211 RtlCopyMemory(RequestBuffer
->NewPassword
.Buffer
,
2213 RequestBuffer
->NewPassword
.MaximumLength
);
2215 /* Call the authentication package */
2216 Status
= LsaCallAuthenticationPackage(LsaHandle
,
2217 AuthenticationPackage
,
2220 (PVOID
*)&ResponseBuffer
,
2221 &ResponseBufferSize
,
2223 if (!NT_SUCCESS(Status
))
2225 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2229 if (!NT_SUCCESS(ProtocolStatus
))
2231 ApiStatus
= NetpNtStatusToApiStatus(ProtocolStatus
);
2236 if (RequestBuffer
!= NULL
)
2237 NetApiBufferFree(RequestBuffer
);
2239 if (ResponseBuffer
!= NULL
)
2240 LsaFreeReturnBuffer(ResponseBuffer
);
2242 if (LsaHandle
!= NULL
)
2249 /************************************************************
2250 * NetUserDel (NETAPI32.@)
2254 NetUserDel(LPCWSTR servername
,
2257 UNICODE_STRING ServerName
;
2258 UNICODE_STRING UserName
;
2259 SAM_HANDLE ServerHandle
= NULL
;
2260 SAM_HANDLE DomainHandle
= NULL
;
2261 SAM_HANDLE UserHandle
= NULL
;
2262 NET_API_STATUS ApiStatus
= NERR_Success
;
2263 NTSTATUS Status
= STATUS_SUCCESS
;
2265 TRACE("(%s, %s)\n", debugstr_w(servername
), debugstr_w(username
));
2267 if (servername
!= NULL
)
2268 RtlInitUnicodeString(&ServerName
, servername
);
2270 RtlInitUnicodeString(&UserName
, username
);
2272 /* Connect to the SAM Server */
2273 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2275 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2277 if (!NT_SUCCESS(Status
))
2279 ERR("SamConnect failed (Status %08lx)\n", Status
);
2280 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2284 /* Open the Builtin Domain */
2285 Status
= OpenBuiltinDomain(ServerHandle
,
2288 if (!NT_SUCCESS(Status
))
2290 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2291 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2295 /* Open the user account in the builtin domain */
2296 ApiStatus
= OpenUserByName(DomainHandle
,
2300 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_NONE_MAPPED
)
2302 TRACE("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2306 if (UserHandle
== NULL
)
2308 if (DomainHandle
!= NULL
)
2310 SamCloseHandle(DomainHandle
);
2311 DomainHandle
= NULL
;
2314 /* Open the Acount Domain */
2315 Status
= OpenAccountDomain(ServerHandle
,
2316 (servername
!= NULL
) ? &ServerName
: NULL
,
2319 if (!NT_SUCCESS(Status
))
2321 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2322 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2326 /* Open the user account in the account domain */
2327 ApiStatus
= OpenUserByName(DomainHandle
,
2331 if (ApiStatus
!= NERR_Success
)
2333 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2334 if (ApiStatus
== ERROR_NONE_MAPPED
)
2335 ApiStatus
= NERR_GroupNotFound
;
2340 /* Delete the user */
2341 Status
= SamDeleteUser(UserHandle
);
2342 if (!NT_SUCCESS(Status
))
2344 ERR("SamDeleteUser failed (Status %08lx)\n", Status
);
2345 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2350 if (UserHandle
!= NULL
)
2351 SamCloseHandle(UserHandle
);
2353 if (DomainHandle
!= NULL
)
2354 SamCloseHandle(DomainHandle
);
2356 if (ServerHandle
!= NULL
)
2357 SamCloseHandle(ServerHandle
);
2363 /************************************************************
2364 * NetUserEnum (NETAPI32.@)
2368 NetUserEnum(LPCWSTR servername
,
2373 LPDWORD entriesread
,
2374 LPDWORD totalentries
,
2375 LPDWORD resume_handle
)
2377 UNICODE_STRING ServerName
;
2378 PSAM_RID_ENUMERATION CurrentUser
;
2379 PENUM_CONTEXT EnumContext
= NULL
;
2380 LPVOID Buffer
= NULL
;
2382 SAM_HANDLE UserHandle
= NULL
;
2383 PUSER_ALL_INFORMATION UserInfo
= NULL
;
2385 NET_API_STATUS ApiStatus
= NERR_Success
;
2386 NTSTATUS Status
= STATUS_SUCCESS
;
2388 TRACE("(%s %d 0x%d %p %d %p %p %p)\n", debugstr_w(servername
), level
,
2389 filter
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
2395 if (servername
!= NULL
)
2396 RtlInitUnicodeString(&ServerName
, servername
);
2398 if (resume_handle
!= NULL
&& *resume_handle
!= 0)
2400 EnumContext
= (PENUM_CONTEXT
)*resume_handle
;
2404 ApiStatus
= NetApiBufferAllocate(sizeof(ENUM_CONTEXT
), (PVOID
*)&EnumContext
);
2405 if (ApiStatus
!= NERR_Success
)
2408 EnumContext
->EnumerationContext
= 0;
2409 EnumContext
->Buffer
= NULL
;
2410 EnumContext
->Count
= 0;
2411 EnumContext
->Index
= 0;
2412 EnumContext
->BuiltinDone
= FALSE
;
2414 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2415 &EnumContext
->ServerHandle
,
2416 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2418 if (!NT_SUCCESS(Status
))
2420 ERR("SamConnect failed (Status %08lx)\n", Status
);
2421 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2425 Status
= OpenAccountDomain(EnumContext
->ServerHandle
,
2426 (servername
!= NULL
) ? &ServerName
: NULL
,
2427 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2428 &EnumContext
->AccountDomainHandle
);
2429 if (!NT_SUCCESS(Status
))
2431 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2432 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2436 Status
= OpenBuiltinDomain(EnumContext
->ServerHandle
,
2437 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2438 &EnumContext
->BuiltinDomainHandle
);
2439 if (!NT_SUCCESS(Status
))
2441 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2442 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2449 TRACE("EnumContext->Index: %lu\n", EnumContext
->Index
);
2450 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2452 if (EnumContext
->Index
>= EnumContext
->Count
)
2454 // if (EnumContext->BuiltinDone == TRUE)
2456 // ApiStatus = NERR_Success;
2460 TRACE("Calling SamEnumerateUsersInDomain\n");
2461 Status
= SamEnumerateUsersInDomain(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2462 &EnumContext
->EnumerationContext
,
2464 (PVOID
*)&EnumContext
->Buffer
,
2466 &EnumContext
->Count
);
2468 TRACE("SamEnumerateUsersInDomain returned (Status %08lx)\n", Status
);
2469 if (!NT_SUCCESS(Status
))
2471 ERR("SamEnumerateUsersInDomain failed (Status %08lx)\n", Status
);
2472 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2476 if (Status
== STATUS_MORE_ENTRIES
)
2478 ApiStatus
= NERR_BufTooSmall
;
2483 EnumContext
->BuiltinDone
= TRUE
;
2487 TRACE("EnumContext: %lu\n", EnumContext
);
2488 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2489 TRACE("EnumContext->Buffer: %p\n", EnumContext
->Buffer
);
2491 /* Get a pointer to the current user */
2492 CurrentUser
= &EnumContext
->Buffer
[EnumContext
->Index
];
2494 TRACE("RID: %lu\n", CurrentUser
->RelativeId
);
2496 Status
= SamOpenUser(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2497 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2498 CurrentUser
->RelativeId
,
2500 if (!NT_SUCCESS(Status
))
2502 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2503 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2507 Status
= SamQueryInformationUser(UserHandle
,
2509 (PVOID
*)&UserInfo
);
2510 if (!NT_SUCCESS(Status
))
2512 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
2513 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2517 SamCloseHandle(UserHandle
);
2520 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
2522 CurrentUser
->RelativeId
,
2524 if (ApiStatus
!= NERR_Success
)
2526 ERR("BuildUserInfoBuffer failed (ApiStatus %lu)\n", ApiStatus
);
2530 if (UserInfo
!= NULL
)
2532 FreeUserInfo(UserInfo
);
2536 EnumContext
->Index
++;
2542 if (ApiStatus
== NERR_Success
&& EnumContext
->Index
< EnumContext
->Count
)
2543 ApiStatus
= ERROR_MORE_DATA
;
2545 if (EnumContext
!= NULL
)
2546 *totalentries
= EnumContext
->Count
;
2548 if (resume_handle
== NULL
|| ApiStatus
!= ERROR_MORE_DATA
)
2550 if (EnumContext
!= NULL
)
2552 if (EnumContext
->BuiltinDomainHandle
!= NULL
)
2553 SamCloseHandle(EnumContext
->BuiltinDomainHandle
);
2555 if (EnumContext
->AccountDomainHandle
!= NULL
)
2556 SamCloseHandle(EnumContext
->AccountDomainHandle
);
2558 if (EnumContext
->ServerHandle
!= NULL
)
2559 SamCloseHandle(EnumContext
->ServerHandle
);
2561 if (EnumContext
->Buffer
!= NULL
)
2563 for (i
= 0; i
< EnumContext
->Count
; i
++)
2565 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
2568 SamFreeMemory(EnumContext
->Buffer
);
2571 NetApiBufferFree(EnumContext
);
2576 if (UserHandle
!= NULL
)
2577 SamCloseHandle(UserHandle
);
2579 if (UserInfo
!= NULL
)
2580 FreeUserInfo(UserInfo
);
2582 if (resume_handle
!= NULL
)
2583 *resume_handle
= (DWORD_PTR
)EnumContext
;
2585 *bufptr
= (LPBYTE
)Buffer
;
2587 TRACE("return %lu\n", ApiStatus
);
2593 /************************************************************
2594 * NetUserGetGroups (NETAPI32.@)
2598 NetUserGetGroups(LPCWSTR servername
,
2603 LPDWORD entriesread
,
2604 LPDWORD totalentries
)
2606 FIXME("%s %s %d %p %d %p %p stub\n", debugstr_w(servername
),
2607 debugstr_w(username
), level
, bufptr
, prefixmaxlen
, entriesread
,
2614 return ERROR_INVALID_LEVEL
;
2618 /************************************************************
2619 * NetUserGetInfo (NETAPI32.@)
2623 NetUserGetInfo(LPCWSTR servername
,
2628 UNICODE_STRING ServerName
;
2629 UNICODE_STRING UserName
;
2630 SAM_HANDLE ServerHandle
= NULL
;
2631 SAM_HANDLE AccountDomainHandle
= NULL
;
2632 SAM_HANDLE UserHandle
= NULL
;
2633 PULONG RelativeIds
= NULL
;
2634 PSID_NAME_USE Use
= NULL
;
2635 PUSER_ALL_INFORMATION UserInfo
= NULL
;
2636 LPVOID Buffer
= NULL
;
2637 NET_API_STATUS ApiStatus
= NERR_Success
;
2638 NTSTATUS Status
= STATUS_SUCCESS
;
2640 TRACE("(%s, %s, %d, %p)\n", debugstr_w(servername
),
2641 debugstr_w(username
), level
, bufptr
);
2643 if (servername
!= NULL
)
2644 RtlInitUnicodeString(&ServerName
, servername
);
2646 RtlInitUnicodeString(&UserName
, username
);
2648 /* Connect to the SAM Server */
2649 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2651 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2653 if (!NT_SUCCESS(Status
))
2655 ERR("SamConnect failed (Status %08lx)\n", Status
);
2656 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2660 /* Open the Account Domain */
2661 Status
= OpenAccountDomain(ServerHandle
,
2662 (servername
!= NULL
) ? &ServerName
: NULL
,
2663 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2664 &AccountDomainHandle
);
2665 if (!NT_SUCCESS(Status
))
2667 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2668 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2672 /* Get the RID for the given user name */
2673 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2678 if (!NT_SUCCESS(Status
))
2680 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
2681 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2685 /* Check if the account is a user account */
2686 if (Use
[0] != SidTypeUser
)
2688 ERR("No user found!\n");
2689 ApiStatus
= NERR_UserNotFound
;
2693 TRACE("RID: %lu\n", RelativeIds
[0]);
2695 /* Open the user object */
2696 Status
= SamOpenUser(AccountDomainHandle
,
2697 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2700 if (!NT_SUCCESS(Status
))
2702 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2703 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2707 Status
= SamQueryInformationUser(UserHandle
,
2709 (PVOID
*)&UserInfo
);
2710 if (!NT_SUCCESS(Status
))
2712 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
2713 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2717 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
2721 if (ApiStatus
!= NERR_Success
)
2723 ERR("BuildUserInfoBuffer failed (ApiStatus %08lu)\n", ApiStatus
);
2728 if (UserInfo
!= NULL
)
2729 FreeUserInfo(UserInfo
);
2731 if (UserHandle
!= NULL
)
2732 SamCloseHandle(UserHandle
);
2734 if (RelativeIds
!= NULL
)
2735 SamFreeMemory(RelativeIds
);
2740 if (AccountDomainHandle
!= NULL
)
2741 SamCloseHandle(AccountDomainHandle
);
2743 if (ServerHandle
!= NULL
)
2744 SamCloseHandle(ServerHandle
);
2746 *bufptr
= (LPBYTE
)Buffer
;
2752 /************************************************************
2753 * NetUserGetLocalGroups (NETAPI32.@)
2757 NetUserGetLocalGroups(LPCWSTR servername
,
2763 LPDWORD entriesread
,
2764 LPDWORD totalentries
)
2766 UNICODE_STRING ServerName
;
2767 UNICODE_STRING UserName
;
2768 SAM_HANDLE ServerHandle
= NULL
;
2769 SAM_HANDLE BuiltinDomainHandle
= NULL
;
2770 SAM_HANDLE AccountDomainHandle
= NULL
;
2771 PSID AccountDomainSid
= NULL
;
2772 PSID UserSid
= NULL
;
2773 PULONG RelativeIds
= NULL
;
2774 PSID_NAME_USE Use
= NULL
;
2775 ULONG BuiltinMemberCount
= 0;
2776 ULONG AccountMemberCount
= 0;
2777 PULONG BuiltinAliases
= NULL
;
2778 PULONG AccountAliases
= NULL
;
2779 PUNICODE_STRING BuiltinNames
= NULL
;
2780 PUNICODE_STRING AccountNames
= NULL
;
2781 PLOCALGROUP_USERS_INFO_0 Buffer
= NULL
;
2787 NET_API_STATUS ApiStatus
= NERR_Success
;
2788 NTSTATUS Status
= STATUS_SUCCESS
;
2790 TRACE("(%s, %s, %d, %08x, %p %d, %p, %p) stub!\n",
2791 debugstr_w(servername
), debugstr_w(username
), level
, flags
, bufptr
,
2792 prefmaxlen
, entriesread
, totalentries
);
2795 return ERROR_INVALID_LEVEL
;
2797 if (flags
& ~LG_INCLUDE_INDIRECT
)
2798 return ERROR_INVALID_PARAMETER
;
2800 if (flags
& LG_INCLUDE_INDIRECT
)
2802 WARN("The flag LG_INCLUDE_INDIRECT is not supported yet!\n");
2805 if (servername
!= NULL
)
2806 RtlInitUnicodeString(&ServerName
, servername
);
2808 RtlInitUnicodeString(&UserName
, username
);
2810 /* Connect to the SAM Server */
2811 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2813 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2815 if (!NT_SUCCESS(Status
))
2817 ERR("SamConnect failed (Status %08lx)\n", Status
);
2818 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2822 /* Open the Builtin Domain */
2823 Status
= OpenBuiltinDomain(ServerHandle
,
2824 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2825 &BuiltinDomainHandle
);
2826 if (!NT_SUCCESS(Status
))
2828 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2829 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2833 /* Get the Account Domain SID */
2834 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
2836 if (!NT_SUCCESS(Status
))
2838 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
2839 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2843 /* Open the Account Domain */
2844 Status
= SamOpenDomain(ServerHandle
,
2845 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2847 &AccountDomainHandle
);
2848 if (!NT_SUCCESS(Status
))
2850 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2851 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2855 /* Get the RID for the given user name */
2856 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2861 if (!NT_SUCCESS(Status
))
2863 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2864 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2868 /* Fail, if it is not a user account */
2869 if (Use
[0] != SidTypeUser
)
2871 ERR("Account is not a User!\n");
2872 ApiStatus
= NERR_UserNotFound
;
2876 /* Build the User SID from the Account Domain SID and the users RID */
2877 ApiStatus
= BuildSidFromSidAndRid(AccountDomainSid
,
2880 if (ApiStatus
!= NERR_Success
)
2882 ERR("BuildSidFromSidAndRid failed!\n");
2886 /* Get alias memberships in the Builtin Domain */
2887 Status
= SamGetAliasMembership(BuiltinDomainHandle
,
2890 &BuiltinMemberCount
,
2892 if (!NT_SUCCESS(Status
))
2894 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2895 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2899 if (BuiltinMemberCount
> 0)
2901 /* Get the Names of the builtin alias members */
2902 Status
= SamLookupIdsInDomain(BuiltinDomainHandle
,
2907 if (!NT_SUCCESS(Status
))
2909 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2910 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2915 /* Get alias memberships in the Account Domain */
2916 Status
= SamGetAliasMembership(AccountDomainHandle
,
2919 &AccountMemberCount
,
2921 if (!NT_SUCCESS(Status
))
2923 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2924 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2928 if (AccountMemberCount
> 0)
2930 /* Get the Names of the builtin alias members */
2931 Status
= SamLookupIdsInDomain(AccountDomainHandle
,
2936 if (!NT_SUCCESS(Status
))
2938 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2939 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2944 /* Calculate the required buffer size */
2947 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2949 if (BuiltinNames
[i
].Length
> 0)
2951 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2956 for (i
= 0; i
< AccountMemberCount
; i
++)
2958 if (BuiltinNames
[i
].Length
> 0)
2960 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2967 ApiStatus
= NERR_Success
;
2971 /* Allocate buffer */
2972 ApiStatus
= NetApiBufferAllocate(Size
, (LPVOID
*)&Buffer
);
2973 if (ApiStatus
!= NERR_Success
)
2976 ZeroMemory(Buffer
, Size
);
2978 StrPtr
= (LPWSTR
)((INT_PTR
)Buffer
+ Count
* sizeof(LOCALGROUP_USERS_INFO_0
));
2980 /* Copy data to the allocated buffer */
2982 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2984 if (BuiltinNames
[i
].Length
> 0)
2987 BuiltinNames
[i
].Buffer
,
2988 BuiltinNames
[i
].Length
);
2989 Buffer
[Index
].lgrui0_name
= StrPtr
;
2991 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2996 for (i
= 0; i
< AccountMemberCount
; i
++)
2998 if (AccountNames
[i
].Length
> 0)
3001 AccountNames
[i
].Buffer
,
3002 AccountNames
[i
].Length
);
3003 Buffer
[Index
].lgrui0_name
= StrPtr
;
3005 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3011 if (AccountNames
!= NULL
)
3012 SamFreeMemory(AccountNames
);
3014 if (BuiltinNames
!= NULL
)
3015 SamFreeMemory(BuiltinNames
);
3017 if (AccountAliases
!= NULL
)
3018 SamFreeMemory(AccountAliases
);
3020 if (BuiltinAliases
!= NULL
)
3021 SamFreeMemory(BuiltinAliases
);
3023 if (RelativeIds
!= NULL
)
3024 SamFreeMemory(RelativeIds
);
3029 if (UserSid
!= NULL
)
3030 NetApiBufferFree(UserSid
);
3032 if (AccountDomainSid
!= NULL
)
3033 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
3035 if (AccountDomainHandle
!= NULL
)
3036 SamCloseHandle(AccountDomainHandle
);
3038 if (BuiltinDomainHandle
!= NULL
)
3039 SamCloseHandle(BuiltinDomainHandle
);
3041 if (ServerHandle
!= NULL
)
3042 SamCloseHandle(ServerHandle
);
3044 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
3051 *entriesread
= Count
;
3052 *totalentries
= Count
;
3055 *bufptr
= (LPBYTE
)Buffer
;
3061 /******************************************************************************
3062 * NetUserSetGroups (NETAPI32.@)
3066 NetUserSetGroups(LPCWSTR servername
,
3072 FIXME("(%s %s %lu %p %lu)\n",
3073 debugstr_w(servername
), debugstr_w(username
), level
, buf
, num_entries
);
3074 return ERROR_ACCESS_DENIED
;
3078 /******************************************************************************
3079 * NetUserSetInfo (NETAPI32.@)
3083 NetUserSetInfo(LPCWSTR servername
,
3089 UNICODE_STRING ServerName
;
3090 UNICODE_STRING UserName
;
3091 SAM_HANDLE ServerHandle
= NULL
;
3092 SAM_HANDLE AccountDomainHandle
= NULL
;
3093 SAM_HANDLE UserHandle
= NULL
;
3094 NET_API_STATUS ApiStatus
= NERR_Success
;
3095 NTSTATUS Status
= STATUS_SUCCESS
;
3097 TRACE("(%s %s %lu %p %p)\n",
3098 debugstr_w(servername
), debugstr_w(username
), level
, buf
, parm_err
);
3100 if (parm_err
!= NULL
)
3101 *parm_err
= PARM_ERROR_NONE
;
3103 /* Check the info level */
3135 return ERROR_INVALID_LEVEL
;
3138 if (servername
!= NULL
)
3139 RtlInitUnicodeString(&ServerName
, servername
);
3141 RtlInitUnicodeString(&UserName
, username
);
3143 /* Connect to the SAM Server */
3144 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3146 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3148 if (!NT_SUCCESS(Status
))
3150 ERR("SamConnect failed (Status %08lx)\n", Status
);
3151 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3155 /* Open the Account Domain */
3156 Status
= OpenAccountDomain(ServerHandle
,
3157 (servername
!= NULL
) ? &ServerName
: NULL
,
3158 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
3159 &AccountDomainHandle
);
3160 if (!NT_SUCCESS(Status
))
3162 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3163 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3167 /* Open the User Account */
3168 ApiStatus
= OpenUserByName(AccountDomainHandle
,
3172 if (ApiStatus
!= NERR_Success
)
3174 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
3178 /* Set user information */
3179 ApiStatus
= SetUserInfo(UserHandle
,
3182 if (ApiStatus
!= NERR_Success
)
3184 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
3188 if (UserHandle
!= NULL
)
3189 SamCloseHandle(UserHandle
);
3191 if (AccountDomainHandle
!= NULL
)
3192 SamCloseHandle(AccountDomainHandle
);
3194 if (ServerHandle
!= NULL
)
3195 SamCloseHandle(ServerHandle
);