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 NetUserChangePassword
24 * Implement NetUserGetGroups
25 * Implement NetUserSetGroups
26 * NetUserGetLocalGroups does not support LG_INCLUDE_INDIRECT yet.
27 * Add missing information levels.
33 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
36 typedef struct _ENUM_CONTEXT
38 SAM_HANDLE ServerHandle
;
39 SAM_HANDLE BuiltinDomainHandle
;
40 SAM_HANDLE AccountDomainHandle
;
42 SAM_ENUMERATE_HANDLE EnumerationContext
;
43 PSAM_RID_ENUMERATION Buffer
;
48 } ENUM_CONTEXT
, *PENUM_CONTEXT
;
53 GetAccountFlags(ULONG AccountControl
)
55 ULONG Flags
= UF_SCRIPT
;
57 if (AccountControl
& USER_ACCOUNT_DISABLED
)
58 Flags
|= UF_ACCOUNTDISABLE
;
60 if (AccountControl
& USER_HOME_DIRECTORY_REQUIRED
)
61 Flags
|= UF_HOMEDIR_REQUIRED
;
63 if (AccountControl
& USER_PASSWORD_NOT_REQUIRED
)
64 Flags
|= UF_PASSWD_NOTREQD
;
66 // UF_PASSWD_CANT_CHANGE
68 if (AccountControl
& USER_ACCOUNT_AUTO_LOCKED
)
71 if (AccountControl
& USER_DONT_EXPIRE_PASSWORD
)
72 Flags
|= UF_DONT_EXPIRE_PASSWD
;
75 if (AccountControl & USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED)
76 Flags |= UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED;
78 if (AccountControl & USER_SMARTCARD_REQUIRED)
79 Flags |= UF_SMARTCARD_REQUIRED;
81 if (AccountControl & USER_TRUSTED_FOR_DELEGATION)
82 Flags |= UF_TRUSTED_FOR_DELEGATION;
84 if (AccountControl & USER_NOT_DELEGATED)
85 Flags |= UF_NOT_DELEGATED;
87 if (AccountControl & USER_USE_DES_KEY_ONLY)
88 Flags |= UF_USE_DES_KEY_ONLY;
90 if (AccountControl & USER_DONT_REQUIRE_PREAUTH)
91 Flags |= UF_DONT_REQUIRE_PREAUTH;
93 if (AccountControl & USER_PASSWORD_EXPIRED)
94 Flags |= UF_PASSWORD_EXPIRED;
97 /* Set account type flags */
98 if (AccountControl
& USER_TEMP_DUPLICATE_ACCOUNT
)
99 Flags
|= UF_TEMP_DUPLICATE_ACCOUNT
;
100 else if (AccountControl
& USER_NORMAL_ACCOUNT
)
101 Flags
|= UF_NORMAL_ACCOUNT
;
102 else if (AccountControl
& USER_INTERDOMAIN_TRUST_ACCOUNT
)
103 Flags
|= UF_INTERDOMAIN_TRUST_ACCOUNT
;
104 else if (AccountControl
& USER_WORKSTATION_TRUST_ACCOUNT
)
105 Flags
|= UF_WORKSTATION_TRUST_ACCOUNT
;
106 else if (AccountControl
& USER_SERVER_TRUST_ACCOUNT
)
107 Flags
|= UF_SERVER_TRUST_ACCOUNT
;
115 GetAccountControl(ULONG Flags
)
117 ULONG AccountControl
= 0;
119 if (Flags
& UF_ACCOUNTDISABLE
)
120 AccountControl
|= USER_ACCOUNT_DISABLED
;
122 if (Flags
& UF_HOMEDIR_REQUIRED
)
123 AccountControl
|= USER_HOME_DIRECTORY_REQUIRED
;
125 if (Flags
& UF_PASSWD_NOTREQD
)
126 AccountControl
|= USER_PASSWORD_NOT_REQUIRED
;
128 if (Flags
& UF_LOCKOUT
)
129 AccountControl
|= USER_ACCOUNT_AUTO_LOCKED
;
131 if (Flags
& UF_DONT_EXPIRE_PASSWD
)
132 AccountControl
|= USER_DONT_EXPIRE_PASSWORD
;
134 /* Set account type flags */
135 if (Flags
& UF_TEMP_DUPLICATE_ACCOUNT
)
136 AccountControl
|= USER_TEMP_DUPLICATE_ACCOUNT
;
137 else if (Flags
& UF_NORMAL_ACCOUNT
)
138 AccountControl
|= USER_NORMAL_ACCOUNT
;
139 else if (Flags
& UF_INTERDOMAIN_TRUST_ACCOUNT
)
140 AccountControl
|= USER_INTERDOMAIN_TRUST_ACCOUNT
;
141 else if (Flags
& UF_WORKSTATION_TRUST_ACCOUNT
)
142 AccountControl
|= USER_WORKSTATION_TRUST_ACCOUNT
;
143 else if (Flags
& UF_SERVER_TRUST_ACCOUNT
)
144 AccountControl
|= USER_SERVER_TRUST_ACCOUNT
;
146 return AccountControl
;
152 GetPasswordAge(IN PLARGE_INTEGER PasswordLastSet
)
154 LARGE_INTEGER SystemTime
;
155 ULONG SystemSecondsSince1970
;
156 ULONG PasswordSecondsSince1970
;
159 Status
= NtQuerySystemTime(&SystemTime
);
160 if (!NT_SUCCESS(Status
))
163 RtlTimeToSecondsSince1970(&SystemTime
, &SystemSecondsSince1970
);
164 RtlTimeToSecondsSince1970(PasswordLastSet
, &PasswordSecondsSince1970
);
166 return SystemSecondsSince1970
- PasswordSecondsSince1970
;
172 BuildUserInfoBuffer(PUSER_ALL_INFORMATION UserInfo
,
177 UNICODE_STRING LogonServer
= RTL_CONSTANT_STRING(L
"\\\\*");
178 LPVOID LocalBuffer
= NULL
;
179 PUSER_INFO_0 UserInfo0
;
180 PUSER_INFO_1 UserInfo1
;
181 PUSER_INFO_2 UserInfo2
;
182 PUSER_INFO_3 UserInfo3
;
183 PUSER_INFO_4 UserInfo4
;
184 PUSER_INFO_10 UserInfo10
;
185 PUSER_INFO_11 UserInfo11
;
186 PUSER_INFO_20 UserInfo20
;
187 PUSER_INFO_23 UserInfo23
;
190 NET_API_STATUS ApiStatus
= NERR_Success
;
197 Size
= sizeof(USER_INFO_0
) +
198 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
202 Size
= sizeof(USER_INFO_1
) +
203 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
205 if (UserInfo
->HomeDirectory
.Length
> 0)
206 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
208 if (UserInfo
->AdminComment
.Length
> 0)
209 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
211 if (UserInfo
->ScriptPath
.Length
> 0)
212 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
216 Size
= sizeof(USER_INFO_2
) +
217 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
219 if (UserInfo
->HomeDirectory
.Length
> 0)
220 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
222 if (UserInfo
->AdminComment
.Length
> 0)
223 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
225 if (UserInfo
->ScriptPath
.Length
> 0)
226 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
228 if (UserInfo
->FullName
.Length
> 0)
229 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
231 if (UserInfo
->UserComment
.Length
> 0)
232 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
234 if (UserInfo
->Parameters
.Length
> 0)
235 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
237 if (UserInfo
->WorkStations
.Length
> 0)
238 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
240 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
241 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
243 if (LogonServer
.Length
> 0)
244 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
248 Size
= sizeof(USER_INFO_3
) +
249 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
251 if (UserInfo
->HomeDirectory
.Length
> 0)
252 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
254 if (UserInfo
->AdminComment
.Length
> 0)
255 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
257 if (UserInfo
->ScriptPath
.Length
> 0)
258 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
260 if (UserInfo
->FullName
.Length
> 0)
261 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
263 if (UserInfo
->UserComment
.Length
> 0)
264 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
266 if (UserInfo
->Parameters
.Length
> 0)
267 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
269 if (UserInfo
->WorkStations
.Length
> 0)
270 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
272 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
273 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
275 if (LogonServer
.Length
> 0)
276 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
278 if (UserInfo
->ProfilePath
.Length
> 0)
279 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
281 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
282 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
286 Size
= sizeof(USER_INFO_4
) +
287 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
289 if (UserInfo
->HomeDirectory
.Length
> 0)
290 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
292 if (UserInfo
->AdminComment
.Length
> 0)
293 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
295 if (UserInfo
->ScriptPath
.Length
> 0)
296 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
298 if (UserInfo
->FullName
.Length
> 0)
299 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
301 if (UserInfo
->UserComment
.Length
> 0)
302 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
304 if (UserInfo
->Parameters
.Length
> 0)
305 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
307 if (UserInfo
->WorkStations
.Length
> 0)
308 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
310 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
311 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
313 if (LogonServer
.Length
> 0)
314 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
316 /* FIXME: usri4_user_sid */
318 if (UserInfo
->ProfilePath
.Length
> 0)
319 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
321 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
322 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
326 Size
= sizeof(USER_INFO_10
) +
327 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
329 if (UserInfo
->AdminComment
.Length
> 0)
330 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
332 if (UserInfo
->UserComment
.Length
> 0)
333 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
335 if (UserInfo
->FullName
.Length
> 0)
336 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
340 Size
= sizeof(USER_INFO_11
) +
341 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
343 if (UserInfo
->AdminComment
.Length
> 0)
344 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
346 if (UserInfo
->UserComment
.Length
> 0)
347 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
349 if (UserInfo
->FullName
.Length
> 0)
350 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
352 if (UserInfo
->HomeDirectory
.Length
> 0)
353 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
355 if (UserInfo
->Parameters
.Length
> 0)
356 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
358 if (LogonServer
.Length
> 0)
359 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
361 if (UserInfo
->WorkStations
.Length
> 0)
362 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
364 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
365 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
369 Size
= sizeof(USER_INFO_20
) +
370 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
372 if (UserInfo
->FullName
.Length
> 0)
373 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
375 if (UserInfo
->AdminComment
.Length
> 0)
376 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
380 Size
= sizeof(USER_INFO_23
) +
381 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
383 if (UserInfo
->FullName
.Length
> 0)
384 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
386 if (UserInfo
->AdminComment
.Length
> 0)
387 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
389 /* FIXME: usri23_user_sid */
393 ApiStatus
= ERROR_INVALID_LEVEL
;
397 ApiStatus
= NetApiBufferAllocate(Size
, &LocalBuffer
);
398 if (ApiStatus
!= NERR_Success
)
401 ZeroMemory(LocalBuffer
, Size
);
406 UserInfo0
= (PUSER_INFO_0
)LocalBuffer
;
408 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo0
+ sizeof(USER_INFO_0
));
409 UserInfo0
->usri0_name
= Ptr
;
411 memcpy(UserInfo0
->usri0_name
,
412 UserInfo
->UserName
.Buffer
,
413 UserInfo
->UserName
.Length
);
414 UserInfo0
->usri0_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
418 UserInfo1
= (PUSER_INFO_1
)LocalBuffer
;
420 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo1
+ sizeof(USER_INFO_1
));
422 UserInfo1
->usri1_name
= Ptr
;
424 memcpy(UserInfo1
->usri1_name
,
425 UserInfo
->UserName
.Buffer
,
426 UserInfo
->UserName
.Length
);
427 UserInfo1
->usri1_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
429 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
431 UserInfo1
->usri1_password
= NULL
;
433 UserInfo1
->usri1_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
435 /* FIXME: UserInfo1->usri1_priv */
437 if (UserInfo
->HomeDirectory
.Length
> 0)
439 UserInfo1
->usri1_home_dir
= Ptr
;
441 memcpy(UserInfo1
->usri1_home_dir
,
442 UserInfo
->HomeDirectory
.Buffer
,
443 UserInfo
->HomeDirectory
.Length
);
444 UserInfo1
->usri1_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
446 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
449 if (UserInfo
->AdminComment
.Length
> 0)
451 UserInfo1
->usri1_comment
= Ptr
;
453 memcpy(UserInfo1
->usri1_comment
,
454 UserInfo
->AdminComment
.Buffer
,
455 UserInfo
->AdminComment
.Length
);
456 UserInfo1
->usri1_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
458 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
461 UserInfo1
->usri1_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
463 if (UserInfo
->ScriptPath
.Length
> 0)
465 UserInfo1
->usri1_script_path
= Ptr
;
467 memcpy(UserInfo1
->usri1_script_path
,
468 UserInfo
->ScriptPath
.Buffer
,
469 UserInfo
->ScriptPath
.Length
);
470 UserInfo1
->usri1_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
475 UserInfo2
= (PUSER_INFO_2
)LocalBuffer
;
477 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo2
+ sizeof(USER_INFO_2
));
479 UserInfo2
->usri2_name
= Ptr
;
481 memcpy(UserInfo2
->usri2_name
,
482 UserInfo
->UserName
.Buffer
,
483 UserInfo
->UserName
.Length
);
484 UserInfo2
->usri2_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
486 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
488 UserInfo2
->usri2_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
490 /* FIXME: usri2_priv */
492 if (UserInfo
->HomeDirectory
.Length
> 0)
494 UserInfo2
->usri2_home_dir
= Ptr
;
496 memcpy(UserInfo2
->usri2_home_dir
,
497 UserInfo
->HomeDirectory
.Buffer
,
498 UserInfo
->HomeDirectory
.Length
);
499 UserInfo2
->usri2_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
501 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
504 if (UserInfo
->AdminComment
.Length
> 0)
506 UserInfo2
->usri2_comment
= Ptr
;
508 memcpy(UserInfo2
->usri2_comment
,
509 UserInfo
->AdminComment
.Buffer
,
510 UserInfo
->AdminComment
.Length
);
511 UserInfo2
->usri2_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
513 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
516 UserInfo2
->usri2_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
518 if (UserInfo
->ScriptPath
.Length
> 0)
520 UserInfo2
->usri2_script_path
= Ptr
;
522 memcpy(UserInfo2
->usri2_script_path
,
523 UserInfo
->ScriptPath
.Buffer
,
524 UserInfo
->ScriptPath
.Length
);
525 UserInfo2
->usri2_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
527 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
530 /* FIXME: usri2_auth_flags */
532 if (UserInfo
->FullName
.Length
> 0)
534 UserInfo2
->usri2_full_name
= Ptr
;
536 memcpy(UserInfo2
->usri2_full_name
,
537 UserInfo
->FullName
.Buffer
,
538 UserInfo
->FullName
.Length
);
539 UserInfo2
->usri2_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
541 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
544 if (UserInfo
->UserComment
.Length
> 0)
546 UserInfo2
->usri2_usr_comment
= Ptr
;
548 memcpy(UserInfo2
->usri2_usr_comment
,
549 UserInfo
->UserComment
.Buffer
,
550 UserInfo
->UserComment
.Length
);
551 UserInfo2
->usri2_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
553 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
556 if (UserInfo
->Parameters
.Length
> 0)
558 UserInfo2
->usri2_parms
= Ptr
;
560 memcpy(UserInfo2
->usri2_parms
,
561 UserInfo
->Parameters
.Buffer
,
562 UserInfo
->Parameters
.Length
);
563 UserInfo2
->usri2_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
565 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
568 if (UserInfo
->WorkStations
.Length
> 0)
570 UserInfo2
->usri2_workstations
= Ptr
;
572 memcpy(UserInfo2
->usri2_workstations
,
573 UserInfo
->WorkStations
.Buffer
,
574 UserInfo
->WorkStations
.Length
);
575 UserInfo2
->usri2_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
577 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
580 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
581 &UserInfo2
->usri2_last_logon
);
583 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
584 &UserInfo2
->usri2_last_logoff
);
586 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
587 &UserInfo2
->usri2_acct_expires
);
589 UserInfo2
->usri2_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
590 UserInfo2
->usri2_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
592 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
594 UserInfo2
->usri2_logon_hours
= (PVOID
)Ptr
;
596 memcpy(UserInfo2
->usri2_logon_hours
,
597 UserInfo
->LogonHours
.LogonHours
,
598 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
600 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
603 UserInfo2
->usri2_bad_pw_count
= UserInfo
->BadPasswordCount
;
604 UserInfo2
->usri2_num_logons
= UserInfo
->LogonCount
;
606 if (LogonServer
.Length
> 0)
608 UserInfo2
->usri2_logon_server
= Ptr
;
610 memcpy(UserInfo2
->usri2_logon_server
,
613 UserInfo2
->usri2_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
615 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
618 UserInfo2
->usri2_country_code
= UserInfo
->CountryCode
;
619 UserInfo2
->usri2_code_page
= UserInfo
->CodePage
;
623 UserInfo3
= (PUSER_INFO_3
)LocalBuffer
;
625 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo3
+ sizeof(USER_INFO_3
));
627 UserInfo3
->usri3_name
= Ptr
;
629 memcpy(UserInfo3
->usri3_name
,
630 UserInfo
->UserName
.Buffer
,
631 UserInfo
->UserName
.Length
);
632 UserInfo3
->usri3_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
634 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
636 UserInfo3
->usri3_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
638 /* FIXME: usri3_priv */
640 if (UserInfo
->HomeDirectory
.Length
> 0)
642 UserInfo3
->usri3_home_dir
= Ptr
;
644 memcpy(UserInfo3
->usri3_home_dir
,
645 UserInfo
->HomeDirectory
.Buffer
,
646 UserInfo
->HomeDirectory
.Length
);
647 UserInfo3
->usri3_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
649 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
652 if (UserInfo
->AdminComment
.Length
> 0)
654 UserInfo3
->usri3_comment
= Ptr
;
656 memcpy(UserInfo3
->usri3_comment
,
657 UserInfo
->AdminComment
.Buffer
,
658 UserInfo
->AdminComment
.Length
);
659 UserInfo3
->usri3_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
661 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
664 UserInfo3
->usri3_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
666 if (UserInfo
->ScriptPath
.Length
> 0)
668 UserInfo3
->usri3_script_path
= Ptr
;
670 memcpy(UserInfo3
->usri3_script_path
,
671 UserInfo
->ScriptPath
.Buffer
,
672 UserInfo
->ScriptPath
.Length
);
673 UserInfo3
->usri3_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
675 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
678 /* FIXME: usri3_auth_flags */
680 if (UserInfo
->FullName
.Length
> 0)
682 UserInfo3
->usri3_full_name
= Ptr
;
684 memcpy(UserInfo3
->usri3_full_name
,
685 UserInfo
->FullName
.Buffer
,
686 UserInfo
->FullName
.Length
);
687 UserInfo3
->usri3_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
689 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
692 if (UserInfo
->UserComment
.Length
> 0)
694 UserInfo3
->usri3_usr_comment
= Ptr
;
696 memcpy(UserInfo3
->usri3_usr_comment
,
697 UserInfo
->UserComment
.Buffer
,
698 UserInfo
->UserComment
.Length
);
699 UserInfo3
->usri3_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
701 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
704 if (UserInfo
->Parameters
.Length
> 0)
706 UserInfo3
->usri3_parms
= Ptr
;
708 memcpy(UserInfo3
->usri3_parms
,
709 UserInfo
->Parameters
.Buffer
,
710 UserInfo
->Parameters
.Length
);
711 UserInfo3
->usri3_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
713 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
716 if (UserInfo
->WorkStations
.Length
> 0)
718 UserInfo3
->usri3_workstations
= Ptr
;
720 memcpy(UserInfo3
->usri3_workstations
,
721 UserInfo
->WorkStations
.Buffer
,
722 UserInfo
->WorkStations
.Length
);
723 UserInfo3
->usri3_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
725 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
728 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
729 &UserInfo3
->usri3_last_logon
);
731 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
732 &UserInfo3
->usri3_last_logoff
);
734 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
735 &UserInfo3
->usri3_acct_expires
);
737 UserInfo3
->usri3_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
738 UserInfo3
->usri3_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
740 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
742 UserInfo3
->usri3_logon_hours
= (PVOID
)Ptr
;
744 memcpy(UserInfo3
->usri3_logon_hours
,
745 UserInfo
->LogonHours
.LogonHours
,
746 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
748 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
751 UserInfo3
->usri3_bad_pw_count
= UserInfo
->BadPasswordCount
;
752 UserInfo3
->usri3_num_logons
= UserInfo
->LogonCount
;
754 if (LogonServer
.Length
> 0)
756 UserInfo3
->usri3_logon_server
= Ptr
;
758 memcpy(UserInfo3
->usri3_logon_server
,
761 UserInfo3
->usri3_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
763 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
766 UserInfo3
->usri3_country_code
= UserInfo
->CountryCode
;
767 UserInfo3
->usri3_code_page
= UserInfo
->CodePage
;
768 UserInfo3
->usri3_user_id
= RelativeId
;
769 UserInfo3
->usri3_primary_group_id
= UserInfo
->PrimaryGroupId
;
771 if (UserInfo
->ProfilePath
.Length
> 0)
773 UserInfo3
->usri3_profile
= Ptr
;
775 memcpy(UserInfo3
->usri3_profile
,
776 UserInfo
->ProfilePath
.Buffer
,
777 UserInfo
->ProfilePath
.Length
);
778 UserInfo3
->usri3_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
780 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
783 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
785 UserInfo3
->usri3_home_dir_drive
= Ptr
;
787 memcpy(UserInfo3
->usri3_home_dir_drive
,
788 UserInfo
->HomeDirectoryDrive
.Buffer
,
789 UserInfo
->HomeDirectoryDrive
.Length
);
790 UserInfo3
->usri3_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
792 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
795 UserInfo3
->usri3_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
799 UserInfo4
= (PUSER_INFO_4
)LocalBuffer
;
801 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo4
+ sizeof(USER_INFO_4
));
803 UserInfo4
->usri4_name
= Ptr
;
805 memcpy(UserInfo4
->usri4_name
,
806 UserInfo
->UserName
.Buffer
,
807 UserInfo
->UserName
.Length
);
808 UserInfo4
->usri4_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
810 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
812 UserInfo4
->usri4_password
= NULL
;
813 UserInfo4
->usri4_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
815 /* FIXME: usri4_priv */
817 if (UserInfo
->HomeDirectory
.Length
> 0)
819 UserInfo4
->usri4_home_dir
= Ptr
;
821 memcpy(UserInfo4
->usri4_home_dir
,
822 UserInfo
->HomeDirectory
.Buffer
,
823 UserInfo
->HomeDirectory
.Length
);
824 UserInfo4
->usri4_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
826 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
829 if (UserInfo
->AdminComment
.Length
> 0)
831 UserInfo4
->usri4_comment
= Ptr
;
833 memcpy(UserInfo4
->usri4_comment
,
834 UserInfo
->AdminComment
.Buffer
,
835 UserInfo
->AdminComment
.Length
);
836 UserInfo4
->usri4_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
838 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
841 UserInfo4
->usri4_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
843 if (UserInfo
->ScriptPath
.Length
> 0)
845 UserInfo4
->usri4_script_path
= Ptr
;
847 memcpy(UserInfo4
->usri4_script_path
,
848 UserInfo
->ScriptPath
.Buffer
,
849 UserInfo
->ScriptPath
.Length
);
850 UserInfo4
->usri4_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
852 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
855 /* FIXME: usri4_auth_flags */
857 if (UserInfo
->FullName
.Length
> 0)
859 UserInfo4
->usri4_full_name
= Ptr
;
861 memcpy(UserInfo4
->usri4_full_name
,
862 UserInfo
->FullName
.Buffer
,
863 UserInfo
->FullName
.Length
);
864 UserInfo4
->usri4_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
866 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
869 if (UserInfo
->UserComment
.Length
> 0)
871 UserInfo4
->usri4_usr_comment
= Ptr
;
873 memcpy(UserInfo4
->usri4_usr_comment
,
874 UserInfo
->UserComment
.Buffer
,
875 UserInfo
->UserComment
.Length
);
876 UserInfo4
->usri4_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
878 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
881 if (UserInfo
->Parameters
.Length
> 0)
883 UserInfo4
->usri4_parms
= Ptr
;
885 memcpy(UserInfo4
->usri4_parms
,
886 UserInfo
->Parameters
.Buffer
,
887 UserInfo
->Parameters
.Length
);
888 UserInfo4
->usri4_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
890 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
893 if (UserInfo
->WorkStations
.Length
> 0)
895 UserInfo4
->usri4_workstations
= Ptr
;
897 memcpy(UserInfo4
->usri4_workstations
,
898 UserInfo
->WorkStations
.Buffer
,
899 UserInfo
->WorkStations
.Length
);
900 UserInfo4
->usri4_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
902 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
905 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
906 &UserInfo4
->usri4_last_logon
);
908 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
909 &UserInfo4
->usri4_last_logoff
);
911 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
912 &UserInfo4
->usri4_acct_expires
);
914 UserInfo4
->usri4_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
915 UserInfo4
->usri4_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
917 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
919 UserInfo4
->usri4_logon_hours
= (PVOID
)Ptr
;
921 memcpy(UserInfo4
->usri4_logon_hours
,
922 UserInfo
->LogonHours
.LogonHours
,
923 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
925 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
928 UserInfo4
->usri4_bad_pw_count
= UserInfo
->BadPasswordCount
;
929 UserInfo4
->usri4_num_logons
= UserInfo
->LogonCount
;
931 if (LogonServer
.Length
> 0)
933 UserInfo4
->usri4_logon_server
= Ptr
;
935 memcpy(UserInfo4
->usri4_logon_server
,
938 UserInfo4
->usri4_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
940 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
943 UserInfo4
->usri4_country_code
= UserInfo
->CountryCode
;
944 UserInfo4
->usri4_code_page
= UserInfo
->CodePage
;
946 /* FIXME: usri4_user_sid */
948 UserInfo4
->usri4_primary_group_id
= UserInfo
->PrimaryGroupId
;
950 if (UserInfo
->ProfilePath
.Length
> 0)
952 UserInfo4
->usri4_profile
= Ptr
;
954 memcpy(UserInfo4
->usri4_profile
,
955 UserInfo
->ProfilePath
.Buffer
,
956 UserInfo
->ProfilePath
.Length
);
957 UserInfo4
->usri4_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
959 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
962 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
964 UserInfo4
->usri4_home_dir_drive
= Ptr
;
966 memcpy(UserInfo4
->usri4_home_dir_drive
,
967 UserInfo
->HomeDirectoryDrive
.Buffer
,
968 UserInfo
->HomeDirectoryDrive
.Length
);
969 UserInfo4
->usri4_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
971 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
974 UserInfo4
->usri4_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
978 UserInfo10
= (PUSER_INFO_10
)LocalBuffer
;
980 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo10
+ sizeof(USER_INFO_10
));
982 UserInfo10
->usri10_name
= Ptr
;
984 memcpy(UserInfo10
->usri10_name
,
985 UserInfo
->UserName
.Buffer
,
986 UserInfo
->UserName
.Length
);
987 UserInfo10
->usri10_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
989 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
991 if (UserInfo
->AdminComment
.Length
> 0)
993 UserInfo10
->usri10_comment
= Ptr
;
995 memcpy(UserInfo10
->usri10_comment
,
996 UserInfo
->AdminComment
.Buffer
,
997 UserInfo
->AdminComment
.Length
);
998 UserInfo10
->usri10_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1000 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1003 if (UserInfo
->UserComment
.Length
> 0)
1005 UserInfo10
->usri10_usr_comment
= Ptr
;
1007 memcpy(UserInfo10
->usri10_usr_comment
,
1008 UserInfo
->UserComment
.Buffer
,
1009 UserInfo
->UserComment
.Length
);
1010 UserInfo10
->usri10_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1012 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1015 if (UserInfo
->FullName
.Length
> 0)
1017 UserInfo10
->usri10_full_name
= Ptr
;
1019 memcpy(UserInfo10
->usri10_full_name
,
1020 UserInfo
->FullName
.Buffer
,
1021 UserInfo
->FullName
.Length
);
1022 UserInfo10
->usri10_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1024 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1029 UserInfo11
= (PUSER_INFO_11
)LocalBuffer
;
1031 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo11
+ sizeof(USER_INFO_11
));
1033 UserInfo11
->usri11_name
= Ptr
;
1035 memcpy(UserInfo11
->usri11_name
,
1036 UserInfo
->UserName
.Buffer
,
1037 UserInfo
->UserName
.Length
);
1038 UserInfo11
->usri11_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1040 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1042 if (UserInfo
->AdminComment
.Length
> 0)
1044 UserInfo11
->usri11_comment
= Ptr
;
1046 memcpy(UserInfo11
->usri11_comment
,
1047 UserInfo
->AdminComment
.Buffer
,
1048 UserInfo
->AdminComment
.Length
);
1049 UserInfo11
->usri11_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1051 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1054 if (UserInfo
->UserComment
.Length
> 0)
1056 UserInfo11
->usri11_usr_comment
= Ptr
;
1058 memcpy(UserInfo11
->usri11_usr_comment
,
1059 UserInfo
->UserComment
.Buffer
,
1060 UserInfo
->UserComment
.Length
);
1061 UserInfo11
->usri11_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1063 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1066 if (UserInfo
->FullName
.Length
> 0)
1068 UserInfo11
->usri11_full_name
= Ptr
;
1070 memcpy(UserInfo11
->usri11_full_name
,
1071 UserInfo
->FullName
.Buffer
,
1072 UserInfo
->FullName
.Length
);
1073 UserInfo11
->usri11_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1075 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1078 /* FIXME: usri11_priv */
1079 /* FIXME: usri11_auth_flags */
1081 UserInfo11
->usri11_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
1083 if (UserInfo
->HomeDirectory
.Length
> 0)
1085 UserInfo11
->usri11_home_dir
= Ptr
;
1087 memcpy(UserInfo11
->usri11_home_dir
,
1088 UserInfo
->HomeDirectory
.Buffer
,
1089 UserInfo
->HomeDirectory
.Length
);
1090 UserInfo11
->usri11_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1092 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
1095 if (UserInfo
->Parameters
.Length
> 0)
1097 UserInfo11
->usri11_parms
= Ptr
;
1099 memcpy(UserInfo11
->usri11_parms
,
1100 UserInfo
->Parameters
.Buffer
,
1101 UserInfo
->Parameters
.Length
);
1102 UserInfo11
->usri11_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1104 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
1107 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
1108 &UserInfo11
->usri11_last_logon
);
1110 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
1111 &UserInfo11
->usri11_last_logoff
);
1113 UserInfo11
->usri11_bad_pw_count
= UserInfo
->BadPasswordCount
;
1114 UserInfo11
->usri11_num_logons
= UserInfo
->LogonCount
;
1116 if (LogonServer
.Length
> 0)
1118 UserInfo11
->usri11_logon_server
= Ptr
;
1120 memcpy(UserInfo11
->usri11_logon_server
,
1122 LogonServer
.Length
);
1123 UserInfo11
->usri11_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1125 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
1128 UserInfo11
->usri11_country_code
= UserInfo
->CountryCode
;
1130 if (UserInfo
->WorkStations
.Length
> 0)
1132 UserInfo11
->usri11_workstations
= Ptr
;
1134 memcpy(UserInfo11
->usri11_workstations
,
1135 UserInfo
->WorkStations
.Buffer
,
1136 UserInfo
->WorkStations
.Length
);
1137 UserInfo11
->usri11_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1139 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
1142 UserInfo11
->usri11_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
1143 UserInfo11
->usri11_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
1145 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
1147 UserInfo11
->usri11_logon_hours
= (PVOID
)Ptr
;
1149 memcpy(UserInfo11
->usri11_logon_hours
,
1150 UserInfo
->LogonHours
.LogonHours
,
1151 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1153 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1156 UserInfo11
->usri11_code_page
= UserInfo
->CodePage
;
1160 UserInfo20
= (PUSER_INFO_20
)LocalBuffer
;
1162 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo20
+ sizeof(USER_INFO_20
));
1164 UserInfo20
->usri20_name
= Ptr
;
1166 memcpy(UserInfo20
->usri20_name
,
1167 UserInfo
->UserName
.Buffer
,
1168 UserInfo
->UserName
.Length
);
1169 UserInfo20
->usri20_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1171 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1173 if (UserInfo
->FullName
.Length
> 0)
1175 UserInfo20
->usri20_full_name
= Ptr
;
1177 memcpy(UserInfo20
->usri20_full_name
,
1178 UserInfo
->FullName
.Buffer
,
1179 UserInfo
->FullName
.Length
);
1180 UserInfo20
->usri20_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1182 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1185 if (UserInfo
->AdminComment
.Length
> 0)
1187 UserInfo20
->usri20_comment
= Ptr
;
1189 memcpy(UserInfo20
->usri20_comment
,
1190 UserInfo
->AdminComment
.Buffer
,
1191 UserInfo
->AdminComment
.Length
);
1192 UserInfo20
->usri20_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1194 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1197 UserInfo20
->usri20_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
1199 UserInfo20
->usri20_user_id
= RelativeId
;
1203 UserInfo23
= (PUSER_INFO_23
)LocalBuffer
;
1205 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo23
+ sizeof(USER_INFO_23
));
1207 UserInfo23
->usri23_name
= Ptr
;
1209 memcpy(UserInfo23
->usri23_name
,
1210 UserInfo
->UserName
.Buffer
,
1211 UserInfo
->UserName
.Length
);
1212 UserInfo23
->usri23_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1214 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1216 if (UserInfo
->FullName
.Length
> 0)
1218 UserInfo23
->usri23_full_name
= Ptr
;
1220 memcpy(UserInfo23
->usri23_full_name
,
1221 UserInfo
->FullName
.Buffer
,
1222 UserInfo
->FullName
.Length
);
1223 UserInfo23
->usri23_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1225 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1228 if (UserInfo
->AdminComment
.Length
> 0)
1230 UserInfo23
->usri23_comment
= Ptr
;
1232 memcpy(UserInfo23
->usri23_comment
,
1233 UserInfo
->AdminComment
.Buffer
,
1234 UserInfo
->AdminComment
.Length
);
1235 UserInfo23
->usri23_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1237 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1240 UserInfo23
->usri23_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
1242 /* FIXME: usri23_user_sid */
1247 if (ApiStatus
== NERR_Success
)
1249 *Buffer
= LocalBuffer
;
1253 if (LocalBuffer
!= NULL
)
1254 NetApiBufferFree(LocalBuffer
);
1263 FreeUserInfo(PUSER_ALL_INFORMATION UserInfo
)
1265 if (UserInfo
->UserName
.Buffer
!= NULL
)
1266 SamFreeMemory(UserInfo
->UserName
.Buffer
);
1268 if (UserInfo
->FullName
.Buffer
!= NULL
)
1269 SamFreeMemory(UserInfo
->FullName
.Buffer
);
1271 if (UserInfo
->HomeDirectory
.Buffer
!= NULL
)
1272 SamFreeMemory(UserInfo
->HomeDirectory
.Buffer
);
1274 if (UserInfo
->HomeDirectoryDrive
.Buffer
!= NULL
)
1275 SamFreeMemory(UserInfo
->HomeDirectoryDrive
.Buffer
);
1277 if (UserInfo
->ScriptPath
.Buffer
!= NULL
)
1278 SamFreeMemory(UserInfo
->ScriptPath
.Buffer
);
1280 if (UserInfo
->ProfilePath
.Buffer
!= NULL
)
1281 SamFreeMemory(UserInfo
->ProfilePath
.Buffer
);
1283 if (UserInfo
->AdminComment
.Buffer
!= NULL
)
1284 SamFreeMemory(UserInfo
->AdminComment
.Buffer
);
1286 if (UserInfo
->WorkStations
.Buffer
!= NULL
)
1287 SamFreeMemory(UserInfo
->WorkStations
.Buffer
);
1289 if (UserInfo
->UserComment
.Buffer
!= NULL
)
1290 SamFreeMemory(UserInfo
->UserComment
.Buffer
);
1292 if (UserInfo
->Parameters
.Buffer
!= NULL
)
1293 SamFreeMemory(UserInfo
->Parameters
.Buffer
);
1295 if (UserInfo
->PrivateData
.Buffer
!= NULL
)
1296 SamFreeMemory(UserInfo
->PrivateData
.Buffer
);
1298 if (UserInfo
->LogonHours
.LogonHours
!= NULL
)
1299 SamFreeMemory(UserInfo
->LogonHours
.LogonHours
);
1301 SamFreeMemory(UserInfo
);
1307 SetUserInfo(SAM_HANDLE UserHandle
,
1311 USER_ALL_INFORMATION UserAllInfo
;
1312 PUSER_INFO_0 UserInfo0
;
1313 PUSER_INFO_1 UserInfo1
;
1314 PUSER_INFO_2 UserInfo2
;
1315 PUSER_INFO_3 UserInfo3
;
1316 PUSER_INFO_4 UserInfo4
;
1317 PUSER_INFO_1003 UserInfo1003
;
1318 PUSER_INFO_1006 UserInfo1006
;
1319 PUSER_INFO_1007 UserInfo1007
;
1320 PUSER_INFO_1008 UserInfo1008
;
1321 PUSER_INFO_1009 UserInfo1009
;
1322 PUSER_INFO_1011 UserInfo1011
;
1323 PUSER_INFO_1012 UserInfo1012
;
1324 PUSER_INFO_1013 UserInfo1013
;
1325 PUSER_INFO_1014 UserInfo1014
;
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 // UserInfo2->usri2_acct_expires;
1464 // UserInfo2->usri2_max_storage;
1465 // UserInfo2->usri2_units_per_week;
1466 // UserInfo2->usri2_logon_hours;
1468 // usri2_bad_pw_count ignored
1469 // usri2_num_logons ignored
1470 // usri2_logon_server ignored
1472 UserAllInfo
.CountryCode
= UserInfo2
->usri2_country_code
;
1473 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1475 UserAllInfo
.CodePage
= UserInfo2
->usri2_code_page
;
1476 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1480 UserInfo3
= (PUSER_INFO_3
)UserInfo
;
1482 // usri3_name ignored
1484 if (UserInfo3
->usri3_password
!= NULL
)
1486 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1487 UserInfo3
->usri3_password
);
1488 UserAllInfo
.NtPasswordPresent
= TRUE
;
1489 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1492 // usri3_password_age ignored
1494 // UserInfo3->usri3_priv;
1496 if (UserInfo3
->usri3_home_dir
!= NULL
)
1498 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1499 UserInfo3
->usri3_home_dir
);
1500 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1503 if (UserInfo3
->usri3_comment
!= NULL
)
1505 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1506 UserInfo3
->usri3_comment
);
1507 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1510 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo3
->usri3_flags
);
1511 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1513 if (UserInfo3
->usri3_script_path
!= NULL
)
1515 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1516 UserInfo3
->usri3_script_path
);
1517 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1520 // UserInfo3->usri3_auth_flags;
1522 if (UserInfo3
->usri3_full_name
!= NULL
)
1524 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1525 UserInfo3
->usri3_full_name
);
1526 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1529 if (UserInfo3
->usri3_usr_comment
!= NULL
)
1531 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1532 UserInfo3
->usri3_usr_comment
);
1533 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1536 if (UserInfo3
->usri3_parms
!= NULL
)
1538 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1539 UserInfo3
->usri3_parms
);
1540 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1543 if (UserInfo3
->usri3_workstations
!= NULL
)
1545 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1546 UserInfo3
->usri3_workstations
);
1547 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1550 // usri3_last_logon ignored
1551 // usri3_last_logoff ignored
1553 // UserInfo3->usri3_acct_expires;
1554 // UserInfo3->usri3_max_storage;
1555 // UserInfo3->usri3_units_per_week;
1556 // UserInfo3->usri3_logon_hours;
1558 // usri3_bad_pw_count ignored
1559 // usri3_num_logons ignored
1560 // usri3_logon_server ignored
1562 UserAllInfo
.CountryCode
= UserInfo3
->usri3_country_code
;
1563 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1565 UserAllInfo
.CodePage
= UserInfo3
->usri3_code_page
;
1566 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1568 // usri3_user_id ignored
1570 UserAllInfo
.PrimaryGroupId
= UserInfo3
->usri3_primary_group_id
;
1571 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1573 if (UserInfo3
->usri3_profile
!= NULL
)
1575 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1576 UserInfo3
->usri3_profile
);
1577 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1580 if (UserInfo3
->usri3_home_dir_drive
!= NULL
)
1582 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1583 UserInfo3
->usri3_home_dir_drive
);
1584 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1587 UserAllInfo
.PasswordExpired
= (UserInfo3
->usri3_password_expired
!= 0);
1588 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1592 UserInfo4
= (PUSER_INFO_4
)UserInfo
;
1594 // usri4_name ignored
1596 if (UserInfo4
->usri4_password
!= NULL
)
1598 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1599 UserInfo4
->usri4_password
);
1600 UserAllInfo
.NtPasswordPresent
= TRUE
;
1601 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1604 // usri4_password_age ignored
1606 // UserInfo3->usri4_priv;
1608 if (UserInfo4
->usri4_home_dir
!= NULL
)
1610 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1611 UserInfo4
->usri4_home_dir
);
1612 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1615 if (UserInfo4
->usri4_comment
!= NULL
)
1617 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1618 UserInfo4
->usri4_comment
);
1619 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1622 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo4
->usri4_flags
);
1623 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1625 if (UserInfo4
->usri4_script_path
!= NULL
)
1627 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1628 UserInfo4
->usri4_script_path
);
1629 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1632 // UserInfo4->usri4_auth_flags;
1634 if (UserInfo4
->usri4_full_name
!= NULL
)
1636 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1637 UserInfo4
->usri4_full_name
);
1638 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1641 if (UserInfo4
->usri4_usr_comment
!= NULL
)
1643 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1644 UserInfo4
->usri4_usr_comment
);
1645 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1648 if (UserInfo4
->usri4_parms
!= NULL
)
1650 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1651 UserInfo4
->usri4_parms
);
1652 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1655 if (UserInfo4
->usri4_workstations
!= NULL
)
1657 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1658 UserInfo4
->usri4_workstations
);
1659 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1662 // usri4_last_logon ignored
1663 // usri4_last_logoff ignored
1665 // UserInfo3->usri4_acct_expires;
1666 // UserInfo3->usri4_max_storage;
1667 // UserInfo3->usri4_units_per_week;
1668 // UserInfo3->usri4_logon_hours;
1670 // usri4_bad_pw_count ignored
1671 // usri4_num_logons ignored
1672 // usri4_logon_server ignored
1674 UserAllInfo
.CountryCode
= UserInfo4
->usri4_country_code
;
1675 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1677 UserAllInfo
.CodePage
= UserInfo4
->usri4_code_page
;
1678 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1680 // usri4_user_sid ignored
1682 UserAllInfo
.PrimaryGroupId
= UserInfo4
->usri4_primary_group_id
;
1683 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1685 if (UserInfo4
->usri4_profile
!= NULL
)
1687 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1688 UserInfo4
->usri4_profile
);
1689 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1692 if (UserInfo4
->usri4_home_dir_drive
!= NULL
)
1694 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1695 UserInfo4
->usri4_home_dir_drive
);
1696 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1699 UserAllInfo
.PasswordExpired
= (UserInfo4
->usri4_password_expired
!= 0);
1700 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1707 UserInfo1003
= (PUSER_INFO_1003
)UserInfo
;
1709 if (UserInfo1003
->usri1003_password
!= NULL
)
1711 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1712 UserInfo1003
->usri1003_password
);
1713 UserAllInfo
.NtPasswordPresent
= TRUE
;
1714 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1721 UserInfo1006
= (PUSER_INFO_1006
)UserInfo
;
1723 if (UserInfo1006
->usri1006_home_dir
!= NULL
)
1725 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1726 UserInfo1006
->usri1006_home_dir
);
1727 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1732 UserInfo1007
= (PUSER_INFO_1007
)UserInfo
;
1734 if (UserInfo1007
->usri1007_comment
!= NULL
)
1736 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1737 UserInfo1007
->usri1007_comment
);
1738 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1743 UserInfo1008
= (PUSER_INFO_1008
)UserInfo
;
1744 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1008
->usri1008_flags
);
1745 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1749 UserInfo1009
= (PUSER_INFO_1009
)UserInfo
;
1751 if (UserInfo1009
->usri1009_script_path
!= NULL
)
1753 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1754 UserInfo1009
->usri1009_script_path
);
1755 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1762 UserInfo1011
= (PUSER_INFO_1011
)UserInfo
;
1764 if (UserInfo1011
->usri1011_full_name
!= NULL
)
1766 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1767 UserInfo1011
->usri1011_full_name
);
1768 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1773 UserInfo1012
= (PUSER_INFO_1012
)UserInfo
;
1775 if (UserInfo1012
->usri1012_usr_comment
!= NULL
)
1777 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1778 UserInfo1012
->usri1012_usr_comment
);
1779 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1784 UserInfo1013
= (PUSER_INFO_1013
)UserInfo
;
1786 if (UserInfo1013
->usri1013_parms
!= NULL
)
1788 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1789 UserInfo1013
->usri1013_parms
);
1790 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1795 UserInfo1014
= (PUSER_INFO_1014
)UserInfo
;
1797 if (UserInfo1014
->usri1014_workstations
!= NULL
)
1799 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1800 UserInfo1014
->usri1014_workstations
);
1801 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1810 UserInfo1024
= (PUSER_INFO_1024
)UserInfo
;
1812 UserAllInfo
.CountryCode
= UserInfo1024
->usri1024_country_code
;
1813 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1817 UserInfo1025
= (PUSER_INFO_1025
)UserInfo
;
1819 UserAllInfo
.CodePage
= UserInfo1025
->usri1025_code_page
;
1820 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1824 UserInfo1051
= (PUSER_INFO_1051
)UserInfo
;
1826 UserAllInfo
.PrimaryGroupId
= UserInfo1051
->usri1051_primary_group_id
;
1827 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1831 UserInfo1052
= (PUSER_INFO_1052
)UserInfo
;
1833 if (UserInfo1052
->usri1052_profile
!= NULL
)
1835 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1836 UserInfo1052
->usri1052_profile
);
1837 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1842 UserInfo1053
= (PUSER_INFO_1053
)UserInfo
;
1844 if (UserInfo1053
->usri1053_home_dir_drive
!= NULL
)
1846 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1847 UserInfo1053
->usri1053_home_dir_drive
);
1848 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1853 ERR("Unsupported level %lu!\n", Level
);
1854 return ERROR_INVALID_PARAMETER
;
1857 Status
= SamSetInformationUser(UserHandle
,
1860 if (!NT_SUCCESS(Status
))
1862 ERR("SamSetInformationUser failed (Status %08lx)\n", Status
);
1863 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1874 OpenUserByName(SAM_HANDLE DomainHandle
,
1875 PUNICODE_STRING UserName
,
1876 ULONG DesiredAccess
,
1877 PSAM_HANDLE UserHandle
)
1879 PULONG RelativeIds
= NULL
;
1880 PSID_NAME_USE Use
= NULL
;
1881 NET_API_STATUS ApiStatus
= NERR_Success
;
1882 NTSTATUS Status
= STATUS_SUCCESS
;
1884 /* Get the RID for the given user name */
1885 Status
= SamLookupNamesInDomain(DomainHandle
,
1890 if (!NT_SUCCESS(Status
))
1892 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
1893 return NetpNtStatusToApiStatus(Status
);
1896 /* Fail, if it is not an alias account */
1897 if (Use
[0] != SidTypeUser
)
1899 ERR("Object is not a user!\n");
1900 ApiStatus
= NERR_GroupNotFound
;
1904 /* Open the alias account */
1905 Status
= SamOpenUser(DomainHandle
,
1909 if (!NT_SUCCESS(Status
))
1911 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1912 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1917 if (RelativeIds
!= NULL
)
1918 SamFreeMemory(RelativeIds
);
1927 /************************************************************
1928 * NetUserAdd (NETAPI32.@)
1932 NetUserAdd(LPCWSTR servername
,
1937 UNICODE_STRING ServerName
;
1938 UNICODE_STRING UserName
;
1939 SAM_HANDLE ServerHandle
= NULL
;
1940 SAM_HANDLE DomainHandle
= NULL
;
1941 SAM_HANDLE UserHandle
= NULL
;
1942 ULONG GrantedAccess
;
1944 NET_API_STATUS ApiStatus
= NERR_Success
;
1945 NTSTATUS Status
= STATUS_SUCCESS
;
1947 TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername
), level
, bufptr
, parm_err
);
1949 /* Check the info level */
1959 return ERROR_INVALID_LEVEL
;
1962 if (servername
!= NULL
)
1963 RtlInitUnicodeString(&ServerName
, servername
);
1965 /* Connect to the SAM Server */
1966 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
1968 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1970 if (!NT_SUCCESS(Status
))
1972 ERR("SamConnect failed (Status %08lx)\n", Status
);
1973 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1977 /* Open the Account Domain */
1978 Status
= OpenAccountDomain(ServerHandle
,
1979 (servername
!= NULL
) ? &ServerName
: NULL
,
1980 DOMAIN_CREATE_USER
| DOMAIN_LOOKUP
,
1982 if (!NT_SUCCESS(Status
))
1984 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
1985 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1989 /* Initialize the user name string */
1990 RtlInitUnicodeString(&UserName
,
1991 ((PUSER_INFO_1
)bufptr
)->usri1_name
);
1993 /* Create the user account */
1994 Status
= SamCreateUser2InDomain(DomainHandle
,
1996 USER_NORMAL_ACCOUNT
,
1997 USER_ALL_ACCESS
| DELETE
| WRITE_DAC
,
2001 if (!NT_SUCCESS(Status
))
2003 ERR("SamCreateUser2InDomain failed (Status %08lx)\n", Status
);
2004 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2008 /* Set user information */
2009 ApiStatus
= SetUserInfo(UserHandle
,
2012 if (ApiStatus
!= NERR_Success
)
2014 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
2019 if (UserHandle
!= NULL
)
2020 SamCloseHandle(UserHandle
);
2022 if (DomainHandle
!= NULL
)
2023 SamCloseHandle(DomainHandle
);
2025 if (ServerHandle
!= NULL
)
2026 SamCloseHandle(ServerHandle
);
2032 /******************************************************************************
2033 * NetUserChangePassword (NETAPI32.@)
2035 * domainname [I] Optional. Domain on which the user resides or the logon
2036 * domain of the current user if NULL.
2037 * username [I] Optional. Username to change the password for or the name
2038 * of the current user if NULL.
2039 * oldpassword [I] The user's current password.
2040 * newpassword [I] The password that the user will be changed to using.
2043 * Success: NERR_Success.
2044 * Failure: NERR_* failure code or win error code.
2049 NetUserChangePassword(LPCWSTR domainname
,
2051 LPCWSTR oldpassword
,
2052 LPCWSTR newpassword
)
2054 TRACE("(%s, %s, ..., ...)\n", debugstr_w(domainname
), debugstr_w(username
));
2055 return NERR_Success
;
2059 /************************************************************
2060 * NetUserDel (NETAPI32.@)
2064 NetUserDel(LPCWSTR servername
,
2067 UNICODE_STRING ServerName
;
2068 UNICODE_STRING UserName
;
2069 SAM_HANDLE ServerHandle
= NULL
;
2070 SAM_HANDLE DomainHandle
= NULL
;
2071 SAM_HANDLE UserHandle
= NULL
;
2072 NET_API_STATUS ApiStatus
= NERR_Success
;
2073 NTSTATUS Status
= STATUS_SUCCESS
;
2075 TRACE("(%s, %s)\n", debugstr_w(servername
), debugstr_w(username
));
2077 if (servername
!= NULL
)
2078 RtlInitUnicodeString(&ServerName
, servername
);
2080 RtlInitUnicodeString(&UserName
, username
);
2082 /* Connect to the SAM Server */
2083 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2085 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2087 if (!NT_SUCCESS(Status
))
2089 ERR("SamConnect failed (Status %08lx)\n", Status
);
2090 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2094 /* Open the Builtin Domain */
2095 Status
= OpenBuiltinDomain(ServerHandle
,
2098 if (!NT_SUCCESS(Status
))
2100 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2101 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2105 /* Open the user account in the builtin domain */
2106 ApiStatus
= OpenUserByName(DomainHandle
,
2110 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_NONE_MAPPED
)
2112 TRACE("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2116 if (UserHandle
== NULL
)
2118 if (DomainHandle
!= NULL
)
2120 SamCloseHandle(DomainHandle
);
2121 DomainHandle
= NULL
;
2124 /* Open the Acount Domain */
2125 Status
= OpenAccountDomain(ServerHandle
,
2126 (servername
!= NULL
) ? &ServerName
: NULL
,
2129 if (!NT_SUCCESS(Status
))
2131 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2132 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2136 /* Open the user account in the account domain */
2137 ApiStatus
= OpenUserByName(DomainHandle
,
2141 if (ApiStatus
!= NERR_Success
)
2143 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2144 if (ApiStatus
== ERROR_NONE_MAPPED
)
2145 ApiStatus
= NERR_GroupNotFound
;
2150 /* Delete the user */
2151 Status
= SamDeleteUser(UserHandle
);
2152 if (!NT_SUCCESS(Status
))
2154 ERR("SamDeleteUser failed (Status %08lx)\n", Status
);
2155 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2160 if (UserHandle
!= NULL
)
2161 SamCloseHandle(UserHandle
);
2163 if (DomainHandle
!= NULL
)
2164 SamCloseHandle(DomainHandle
);
2166 if (ServerHandle
!= NULL
)
2167 SamCloseHandle(ServerHandle
);
2173 /************************************************************
2174 * NetUserEnum (NETAPI32.@)
2178 NetUserEnum(LPCWSTR servername
,
2183 LPDWORD entriesread
,
2184 LPDWORD totalentries
,
2185 LPDWORD resume_handle
)
2187 UNICODE_STRING ServerName
;
2188 PSAM_RID_ENUMERATION CurrentUser
;
2189 PENUM_CONTEXT EnumContext
= NULL
;
2190 LPVOID Buffer
= NULL
;
2192 SAM_HANDLE UserHandle
= NULL
;
2193 PUSER_ALL_INFORMATION UserInfo
= NULL
;
2195 NET_API_STATUS ApiStatus
= NERR_Success
;
2196 NTSTATUS Status
= STATUS_SUCCESS
;
2198 TRACE("(%s %d 0x%d %p %d %p %p %p)\n", debugstr_w(servername
), level
,
2199 filter
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
2205 if (servername
!= NULL
)
2206 RtlInitUnicodeString(&ServerName
, servername
);
2208 if (resume_handle
!= NULL
&& *resume_handle
!= 0)
2210 EnumContext
= (PENUM_CONTEXT
)*resume_handle
;
2214 ApiStatus
= NetApiBufferAllocate(sizeof(ENUM_CONTEXT
), (PVOID
*)&EnumContext
);
2215 if (ApiStatus
!= NERR_Success
)
2218 EnumContext
->EnumerationContext
= 0;
2219 EnumContext
->Buffer
= NULL
;
2220 EnumContext
->Count
= 0;
2221 EnumContext
->Index
= 0;
2222 EnumContext
->BuiltinDone
= FALSE
;
2224 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2225 &EnumContext
->ServerHandle
,
2226 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2228 if (!NT_SUCCESS(Status
))
2230 ERR("SamConnect failed (Status %08lx)\n", Status
);
2231 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2235 Status
= OpenAccountDomain(EnumContext
->ServerHandle
,
2236 (servername
!= NULL
) ? &ServerName
: NULL
,
2237 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2238 &EnumContext
->AccountDomainHandle
);
2239 if (!NT_SUCCESS(Status
))
2241 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2242 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2246 Status
= OpenBuiltinDomain(EnumContext
->ServerHandle
,
2247 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2248 &EnumContext
->BuiltinDomainHandle
);
2249 if (!NT_SUCCESS(Status
))
2251 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2252 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2259 TRACE("EnumContext->Index: %lu\n", EnumContext
->Index
);
2260 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2262 if (EnumContext
->Index
>= EnumContext
->Count
)
2264 // if (EnumContext->BuiltinDone == TRUE)
2266 // ApiStatus = NERR_Success;
2270 TRACE("Calling SamEnumerateUsersInDomain\n");
2271 Status
= SamEnumerateUsersInDomain(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2272 &EnumContext
->EnumerationContext
,
2274 (PVOID
*)&EnumContext
->Buffer
,
2276 &EnumContext
->Count
);
2278 TRACE("SamEnumerateUsersInDomain returned (Status %08lx)\n", Status
);
2279 if (!NT_SUCCESS(Status
))
2281 ERR("SamEnumerateUsersInDomain failed (Status %08lx)\n", Status
);
2282 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2286 if (Status
== STATUS_MORE_ENTRIES
)
2288 ApiStatus
= NERR_BufTooSmall
;
2293 EnumContext
->BuiltinDone
= TRUE
;
2297 TRACE("EnumContext: %lu\n", EnumContext
);
2298 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2299 TRACE("EnumContext->Buffer: %p\n", EnumContext
->Buffer
);
2301 /* Get a pointer to the current user */
2302 CurrentUser
= &EnumContext
->Buffer
[EnumContext
->Index
];
2304 TRACE("RID: %lu\n", CurrentUser
->RelativeId
);
2306 Status
= SamOpenUser(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2307 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2308 CurrentUser
->RelativeId
,
2310 if (!NT_SUCCESS(Status
))
2312 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2313 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2317 Status
= SamQueryInformationUser(UserHandle
,
2319 (PVOID
*)&UserInfo
);
2320 if (!NT_SUCCESS(Status
))
2322 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
2323 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2327 SamCloseHandle(UserHandle
);
2330 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
2332 CurrentUser
->RelativeId
,
2334 if (ApiStatus
!= NERR_Success
)
2336 ERR("BuildUserInfoBuffer failed (ApiStatus %lu)\n", ApiStatus
);
2340 if (UserInfo
!= NULL
)
2342 FreeUserInfo(UserInfo
);
2346 EnumContext
->Index
++;
2352 if (ApiStatus
== NERR_Success
&& EnumContext
->Index
< EnumContext
->Count
)
2353 ApiStatus
= ERROR_MORE_DATA
;
2355 if (EnumContext
!= NULL
)
2356 *totalentries
= EnumContext
->Count
;
2358 if (resume_handle
== NULL
|| ApiStatus
!= ERROR_MORE_DATA
)
2360 if (EnumContext
!= NULL
)
2362 if (EnumContext
->BuiltinDomainHandle
!= NULL
)
2363 SamCloseHandle(EnumContext
->BuiltinDomainHandle
);
2365 if (EnumContext
->AccountDomainHandle
!= NULL
)
2366 SamCloseHandle(EnumContext
->AccountDomainHandle
);
2368 if (EnumContext
->ServerHandle
!= NULL
)
2369 SamCloseHandle(EnumContext
->ServerHandle
);
2371 if (EnumContext
->Buffer
!= NULL
)
2373 for (i
= 0; i
< EnumContext
->Count
; i
++)
2375 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
2378 SamFreeMemory(EnumContext
->Buffer
);
2381 NetApiBufferFree(EnumContext
);
2386 if (UserHandle
!= NULL
)
2387 SamCloseHandle(UserHandle
);
2389 if (UserInfo
!= NULL
)
2390 FreeUserInfo(UserInfo
);
2392 if (resume_handle
!= NULL
)
2393 *resume_handle
= (DWORD_PTR
)EnumContext
;
2395 *bufptr
= (LPBYTE
)Buffer
;
2397 TRACE("return %lu\n", ApiStatus
);
2403 /************************************************************
2404 * NetUserGetGroups (NETAPI32.@)
2408 NetUserGetGroups(LPCWSTR servername
,
2413 LPDWORD entriesread
,
2414 LPDWORD totalentries
)
2416 FIXME("%s %s %d %p %d %p %p stub\n", debugstr_w(servername
),
2417 debugstr_w(username
), level
, bufptr
, prefixmaxlen
, entriesread
,
2424 return ERROR_INVALID_LEVEL
;
2428 /************************************************************
2429 * NetUserGetInfo (NETAPI32.@)
2433 NetUserGetInfo(LPCWSTR servername
,
2438 UNICODE_STRING ServerName
;
2439 UNICODE_STRING UserName
;
2440 SAM_HANDLE ServerHandle
= NULL
;
2441 SAM_HANDLE AccountDomainHandle
= NULL
;
2442 SAM_HANDLE UserHandle
= NULL
;
2443 PULONG RelativeIds
= NULL
;
2444 PSID_NAME_USE Use
= NULL
;
2445 PUSER_ALL_INFORMATION UserInfo
= NULL
;
2446 LPVOID Buffer
= NULL
;
2447 NET_API_STATUS ApiStatus
= NERR_Success
;
2448 NTSTATUS Status
= STATUS_SUCCESS
;
2450 TRACE("(%s, %s, %d, %p)\n", debugstr_w(servername
),
2451 debugstr_w(username
), level
, bufptr
);
2453 if (servername
!= NULL
)
2454 RtlInitUnicodeString(&ServerName
, servername
);
2456 RtlInitUnicodeString(&UserName
, username
);
2458 /* Connect to the SAM Server */
2459 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2461 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2463 if (!NT_SUCCESS(Status
))
2465 ERR("SamConnect failed (Status %08lx)\n", Status
);
2466 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2470 /* Open the Account Domain */
2471 Status
= OpenAccountDomain(ServerHandle
,
2472 (servername
!= NULL
) ? &ServerName
: NULL
,
2473 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2474 &AccountDomainHandle
);
2475 if (!NT_SUCCESS(Status
))
2477 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2478 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2482 /* Get the RID for the given user name */
2483 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2488 if (!NT_SUCCESS(Status
))
2490 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
2491 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2495 /* Check if the account is a user account */
2496 if (Use
[0] != SidTypeUser
)
2498 ERR("No user found!\n");
2499 ApiStatus
= NERR_UserNotFound
;
2503 TRACE("RID: %lu\n", RelativeIds
[0]);
2505 /* Open the user object */
2506 Status
= SamOpenUser(AccountDomainHandle
,
2507 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2510 if (!NT_SUCCESS(Status
))
2512 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2513 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2517 Status
= SamQueryInformationUser(UserHandle
,
2519 (PVOID
*)&UserInfo
);
2520 if (!NT_SUCCESS(Status
))
2522 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
2523 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2527 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
2531 if (ApiStatus
!= NERR_Success
)
2533 ERR("BuildUserInfoBuffer failed (ApiStatus %08lu)\n", ApiStatus
);
2538 if (UserInfo
!= NULL
)
2539 FreeUserInfo(UserInfo
);
2541 if (UserHandle
!= NULL
)
2542 SamCloseHandle(UserHandle
);
2544 if (RelativeIds
!= NULL
)
2545 SamFreeMemory(RelativeIds
);
2550 if (AccountDomainHandle
!= NULL
)
2551 SamCloseHandle(AccountDomainHandle
);
2553 if (ServerHandle
!= NULL
)
2554 SamCloseHandle(ServerHandle
);
2556 *bufptr
= (LPBYTE
)Buffer
;
2562 /************************************************************
2563 * NetUserGetLocalGroups (NETAPI32.@)
2567 NetUserGetLocalGroups(LPCWSTR servername
,
2573 LPDWORD entriesread
,
2574 LPDWORD totalentries
)
2576 UNICODE_STRING ServerName
;
2577 UNICODE_STRING UserName
;
2578 SAM_HANDLE ServerHandle
= NULL
;
2579 SAM_HANDLE BuiltinDomainHandle
= NULL
;
2580 SAM_HANDLE AccountDomainHandle
= NULL
;
2581 PSID AccountDomainSid
= NULL
;
2582 PSID UserSid
= NULL
;
2583 PULONG RelativeIds
= NULL
;
2584 PSID_NAME_USE Use
= NULL
;
2585 ULONG BuiltinMemberCount
= 0;
2586 ULONG AccountMemberCount
= 0;
2587 PULONG BuiltinAliases
= NULL
;
2588 PULONG AccountAliases
= NULL
;
2589 PUNICODE_STRING BuiltinNames
= NULL
;
2590 PUNICODE_STRING AccountNames
= NULL
;
2591 PLOCALGROUP_USERS_INFO_0 Buffer
= NULL
;
2597 NET_API_STATUS ApiStatus
= NERR_Success
;
2598 NTSTATUS Status
= STATUS_SUCCESS
;
2600 TRACE("(%s, %s, %d, %08x, %p %d, %p, %p) stub!\n",
2601 debugstr_w(servername
), debugstr_w(username
), level
, flags
, bufptr
,
2602 prefmaxlen
, entriesread
, totalentries
);
2605 return ERROR_INVALID_LEVEL
;
2607 if (flags
& ~LG_INCLUDE_INDIRECT
)
2608 return ERROR_INVALID_PARAMETER
;
2610 if (flags
& LG_INCLUDE_INDIRECT
)
2612 WARN("The flag LG_INCLUDE_INDIRECT is not supported yet!\n");
2615 if (servername
!= NULL
)
2616 RtlInitUnicodeString(&ServerName
, servername
);
2618 RtlInitUnicodeString(&UserName
, username
);
2620 /* Connect to the SAM Server */
2621 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2623 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2625 if (!NT_SUCCESS(Status
))
2627 ERR("SamConnect failed (Status %08lx)\n", Status
);
2628 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2632 /* Open the Builtin Domain */
2633 Status
= OpenBuiltinDomain(ServerHandle
,
2634 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2635 &BuiltinDomainHandle
);
2636 if (!NT_SUCCESS(Status
))
2638 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2639 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2643 /* Get the Account Domain SID */
2644 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
2646 if (!NT_SUCCESS(Status
))
2648 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
2649 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2653 /* Open the Account Domain */
2654 Status
= SamOpenDomain(ServerHandle
,
2655 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2657 &AccountDomainHandle
);
2658 if (!NT_SUCCESS(Status
))
2660 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2661 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2665 /* Get the RID for the given user name */
2666 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2671 if (!NT_SUCCESS(Status
))
2673 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2674 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2678 /* Fail, if it is not a user account */
2679 if (Use
[0] != SidTypeUser
)
2681 ERR("Account is not a User!\n");
2682 ApiStatus
= NERR_UserNotFound
;
2686 /* Build the User SID from the Account Domain SID and the users RID */
2687 ApiStatus
= BuildSidFromSidAndRid(AccountDomainSid
,
2690 if (ApiStatus
!= NERR_Success
)
2692 ERR("BuildSidFromSidAndRid failed!\n");
2696 /* Get alias memberships in the Builtin Domain */
2697 Status
= SamGetAliasMembership(BuiltinDomainHandle
,
2700 &BuiltinMemberCount
,
2702 if (!NT_SUCCESS(Status
))
2704 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2705 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2709 if (BuiltinMemberCount
> 0)
2711 /* Get the Names of the builtin alias members */
2712 Status
= SamLookupIdsInDomain(BuiltinDomainHandle
,
2717 if (!NT_SUCCESS(Status
))
2719 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2720 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2725 /* Get alias memberships in the Account Domain */
2726 Status
= SamGetAliasMembership(AccountDomainHandle
,
2729 &AccountMemberCount
,
2731 if (!NT_SUCCESS(Status
))
2733 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2734 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2738 if (AccountMemberCount
> 0)
2740 /* Get the Names of the builtin alias members */
2741 Status
= SamLookupIdsInDomain(AccountDomainHandle
,
2746 if (!NT_SUCCESS(Status
))
2748 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2749 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2754 /* Calculate the required buffer size */
2757 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2759 if (BuiltinNames
[i
].Length
> 0)
2761 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2766 for (i
= 0; i
< AccountMemberCount
; i
++)
2768 if (BuiltinNames
[i
].Length
> 0)
2770 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2777 ApiStatus
= NERR_Success
;
2781 /* Allocate buffer */
2782 ApiStatus
= NetApiBufferAllocate(Size
, (LPVOID
*)&Buffer
);
2783 if (ApiStatus
!= NERR_Success
)
2786 ZeroMemory(Buffer
, Size
);
2788 StrPtr
= (LPWSTR
)((INT_PTR
)Buffer
+ Count
* sizeof(LOCALGROUP_USERS_INFO_0
));
2790 /* Copy data to the allocated buffer */
2792 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2794 if (BuiltinNames
[i
].Length
> 0)
2797 BuiltinNames
[i
].Buffer
,
2798 BuiltinNames
[i
].Length
);
2799 Buffer
[Index
].lgrui0_name
= StrPtr
;
2801 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2806 for (i
= 0; i
< AccountMemberCount
; i
++)
2808 if (AccountNames
[i
].Length
> 0)
2811 AccountNames
[i
].Buffer
,
2812 AccountNames
[i
].Length
);
2813 Buffer
[Index
].lgrui0_name
= StrPtr
;
2815 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2821 if (AccountNames
!= NULL
)
2822 SamFreeMemory(AccountNames
);
2824 if (BuiltinNames
!= NULL
)
2825 SamFreeMemory(BuiltinNames
);
2827 if (AccountAliases
!= NULL
)
2828 SamFreeMemory(AccountAliases
);
2830 if (BuiltinAliases
!= NULL
)
2831 SamFreeMemory(BuiltinAliases
);
2833 if (RelativeIds
!= NULL
)
2834 SamFreeMemory(RelativeIds
);
2839 if (UserSid
!= NULL
)
2840 NetApiBufferFree(UserSid
);
2842 if (AccountDomainSid
!= NULL
)
2843 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
2845 if (AccountDomainHandle
!= NULL
)
2846 SamCloseHandle(AccountDomainHandle
);
2848 if (BuiltinDomainHandle
!= NULL
)
2849 SamCloseHandle(BuiltinDomainHandle
);
2851 if (ServerHandle
!= NULL
)
2852 SamCloseHandle(ServerHandle
);
2854 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
2861 *entriesread
= Count
;
2862 *totalentries
= Count
;
2865 *bufptr
= (LPBYTE
)Buffer
;
2871 /******************************************************************************
2872 * NetUserSetGroups (NETAPI32.@)
2876 NetUserSetGroups(LPCWSTR servername
,
2882 FIXME("(%s %s %lu %p %lu)\n",
2883 debugstr_w(servername
), debugstr_w(username
), level
, buf
, num_entries
);
2884 return ERROR_ACCESS_DENIED
;
2888 /******************************************************************************
2889 * NetUserSetInfo (NETAPI32.@)
2893 NetUserSetInfo(LPCWSTR servername
,
2899 UNICODE_STRING ServerName
;
2900 UNICODE_STRING UserName
;
2901 SAM_HANDLE ServerHandle
= NULL
;
2902 SAM_HANDLE AccountDomainHandle
= NULL
;
2903 SAM_HANDLE UserHandle
= NULL
;
2904 NET_API_STATUS ApiStatus
= NERR_Success
;
2905 NTSTATUS Status
= STATUS_SUCCESS
;
2907 TRACE("(%s %s %lu %p %p)\n",
2908 debugstr_w(servername
), debugstr_w(username
), level
, buf
, parm_err
);
2910 if (parm_err
!= NULL
)
2911 *parm_err
= PARM_ERROR_NONE
;
2913 /* Check the info level */
2945 return ERROR_INVALID_LEVEL
;
2948 if (servername
!= NULL
)
2949 RtlInitUnicodeString(&ServerName
, servername
);
2951 RtlInitUnicodeString(&UserName
, username
);
2953 /* Connect to the SAM Server */
2954 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2956 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2958 if (!NT_SUCCESS(Status
))
2960 ERR("SamConnect failed (Status %08lx)\n", Status
);
2961 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2965 /* Open the Account Domain */
2966 Status
= OpenAccountDomain(ServerHandle
,
2967 (servername
!= NULL
) ? &ServerName
: NULL
,
2968 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2969 &AccountDomainHandle
);
2970 if (!NT_SUCCESS(Status
))
2972 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2973 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2977 /* Open the User Account */
2978 ApiStatus
= OpenUserByName(AccountDomainHandle
,
2982 if (ApiStatus
!= NERR_Success
)
2984 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2988 /* Set user information */
2989 ApiStatus
= SetUserInfo(UserHandle
,
2992 if (ApiStatus
!= NERR_Success
)
2994 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
2998 if (UserHandle
!= NULL
)
2999 SamCloseHandle(UserHandle
);
3001 if (AccountDomainHandle
!= NULL
)
3002 SamCloseHandle(AccountDomainHandle
);
3004 if (ServerHandle
!= NULL
)
3005 SamCloseHandle(ServerHandle
);