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 (WIP)
24 * Implement NetUserSetGroups
25 * NetUserGetLocalGroups does not support LG_INCLUDE_INDIRECT yet.
26 * Add missing information levels.
32 #include <ndk/kefuncs.h>
33 #include <ndk/obfuncs.h>
35 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
37 typedef struct _ENUM_CONTEXT
39 SAM_HANDLE ServerHandle
;
40 SAM_HANDLE BuiltinDomainHandle
;
41 SAM_HANDLE AccountDomainHandle
;
43 SAM_ENUMERATE_HANDLE EnumerationContext
;
44 PSAM_RID_ENUMERATION Buffer
;
49 } ENUM_CONTEXT
, *PENUM_CONTEXT
;
54 DeltaTimeToSeconds(LARGE_INTEGER DeltaTime
)
56 LARGE_INTEGER Seconds
;
58 if (DeltaTime
.QuadPart
== 0)
61 Seconds
.QuadPart
= -DeltaTime
.QuadPart
/ 10000000;
63 if (Seconds
.HighPart
!= 0)
66 return Seconds
.LowPart
;
72 GetAllowedWorldAce(IN PACL Acl
,
73 OUT PACCESS_ALLOWED_ACE
*Ace
)
75 SID_IDENTIFIER_AUTHORITY WorldAuthority
= {SECURITY_WORLD_SID_AUTHORITY
};
76 ULONG WorldSid
[sizeof(SID
) / sizeof(ULONG
) + SID_MAX_SUB_AUTHORITIES
];
77 ACL_SIZE_INFORMATION AclSize
;
78 PVOID LocalAce
= NULL
;
84 RtlInitializeSid((PSID
)WorldSid
,
87 *(RtlSubAuthoritySid((PSID
)WorldSid
, 0)) = SECURITY_WORLD_RID
;
89 Status
= RtlQueryInformationAcl(Acl
,
93 if (!NT_SUCCESS(Status
))
96 for (i
= 0; i
< AclSize
.AceCount
; i
++)
98 Status
= RtlGetAce(Acl
, i
, &LocalAce
);
99 if (!NT_SUCCESS(Status
))
102 if (((PACE_HEADER
)LocalAce
)->AceType
!= ACCESS_ALLOWED_ACE_TYPE
)
105 if (RtlEqualSid((PSID
)WorldSid
,
106 (PSID
)&((PACCESS_ALLOWED_ACE
)LocalAce
)->SidStart
))
108 *Ace
= (PACCESS_ALLOWED_ACE
)LocalAce
;
109 return STATUS_SUCCESS
;
113 return STATUS_SUCCESS
;
119 GetAccountFlags(ULONG AccountControl
,
122 PACCESS_ALLOWED_ACE Ace
= NULL
;
123 ULONG Flags
= UF_SCRIPT
;
128 Status
= GetAllowedWorldAce(Dacl
, &Ace
);
129 if (NT_SUCCESS(Status
))
133 Flags
|= UF_PASSWD_CANT_CHANGE
;
135 else if ((Ace
->Mask
& USER_CHANGE_PASSWORD
) == 0)
137 Flags
|= UF_PASSWD_CANT_CHANGE
;
142 if (AccountControl
& USER_ACCOUNT_DISABLED
)
143 Flags
|= UF_ACCOUNTDISABLE
;
145 if (AccountControl
& USER_HOME_DIRECTORY_REQUIRED
)
146 Flags
|= UF_HOMEDIR_REQUIRED
;
148 if (AccountControl
& USER_PASSWORD_NOT_REQUIRED
)
149 Flags
|= UF_PASSWD_NOTREQD
;
151 if (AccountControl
& USER_ACCOUNT_AUTO_LOCKED
)
154 if (AccountControl
& USER_DONT_EXPIRE_PASSWORD
)
155 Flags
|= UF_DONT_EXPIRE_PASSWD
;
158 if (AccountControl & USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED)
159 Flags |= UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED;
161 if (AccountControl & USER_SMARTCARD_REQUIRED)
162 Flags |= UF_SMARTCARD_REQUIRED;
164 if (AccountControl & USER_TRUSTED_FOR_DELEGATION)
165 Flags |= UF_TRUSTED_FOR_DELEGATION;
167 if (AccountControl & USER_NOT_DELEGATED)
168 Flags |= UF_NOT_DELEGATED;
170 if (AccountControl & USER_USE_DES_KEY_ONLY)
171 Flags |= UF_USE_DES_KEY_ONLY;
173 if (AccountControl & USER_DONT_REQUIRE_PREAUTH)
174 Flags |= UF_DONT_REQUIRE_PREAUTH;
176 if (AccountControl & USER_PASSWORD_EXPIRED)
177 Flags |= UF_PASSWORD_EXPIRED;
180 /* Set account type flags */
181 if (AccountControl
& USER_TEMP_DUPLICATE_ACCOUNT
)
182 Flags
|= UF_TEMP_DUPLICATE_ACCOUNT
;
183 else if (AccountControl
& USER_NORMAL_ACCOUNT
)
184 Flags
|= UF_NORMAL_ACCOUNT
;
185 else if (AccountControl
& USER_INTERDOMAIN_TRUST_ACCOUNT
)
186 Flags
|= UF_INTERDOMAIN_TRUST_ACCOUNT
;
187 else if (AccountControl
& USER_WORKSTATION_TRUST_ACCOUNT
)
188 Flags
|= UF_WORKSTATION_TRUST_ACCOUNT
;
189 else if (AccountControl
& USER_SERVER_TRUST_ACCOUNT
)
190 Flags
|= UF_SERVER_TRUST_ACCOUNT
;
198 GetAccountControl(ULONG Flags
)
200 ULONG AccountControl
= 0;
202 if (Flags
& UF_ACCOUNTDISABLE
)
203 AccountControl
|= USER_ACCOUNT_DISABLED
;
205 if (Flags
& UF_HOMEDIR_REQUIRED
)
206 AccountControl
|= USER_HOME_DIRECTORY_REQUIRED
;
208 if (Flags
& UF_PASSWD_NOTREQD
)
209 AccountControl
|= USER_PASSWORD_NOT_REQUIRED
;
211 if (Flags
& UF_LOCKOUT
)
212 AccountControl
|= USER_ACCOUNT_AUTO_LOCKED
;
214 if (Flags
& UF_DONT_EXPIRE_PASSWD
)
215 AccountControl
|= USER_DONT_EXPIRE_PASSWORD
;
217 /* Set account type flags */
218 if (Flags
& UF_TEMP_DUPLICATE_ACCOUNT
)
219 AccountControl
|= USER_TEMP_DUPLICATE_ACCOUNT
;
220 else if (Flags
& UF_NORMAL_ACCOUNT
)
221 AccountControl
|= USER_NORMAL_ACCOUNT
;
222 else if (Flags
& UF_INTERDOMAIN_TRUST_ACCOUNT
)
223 AccountControl
|= USER_INTERDOMAIN_TRUST_ACCOUNT
;
224 else if (Flags
& UF_WORKSTATION_TRUST_ACCOUNT
)
225 AccountControl
|= USER_WORKSTATION_TRUST_ACCOUNT
;
226 else if (Flags
& UF_SERVER_TRUST_ACCOUNT
)
227 AccountControl
|= USER_SERVER_TRUST_ACCOUNT
;
229 return AccountControl
;
235 GetPasswordAge(IN PLARGE_INTEGER PasswordLastSet
)
237 LARGE_INTEGER SystemTime
;
238 ULONG SystemSecondsSince1970
;
239 ULONG PasswordSecondsSince1970
;
242 Status
= NtQuerySystemTime(&SystemTime
);
243 if (!NT_SUCCESS(Status
))
246 RtlTimeToSecondsSince1970(&SystemTime
, &SystemSecondsSince1970
);
247 RtlTimeToSecondsSince1970(PasswordLastSet
, &PasswordSecondsSince1970
);
249 return SystemSecondsSince1970
- PasswordSecondsSince1970
;
255 ChangeUserDacl(IN PACL Dacl
,
258 PACCESS_ALLOWED_ACE Ace
= NULL
;
264 Status
= GetAllowedWorldAce(Dacl
, &Ace
);
265 if (!NT_SUCCESS(Status
))
268 if (Flags
& UF_PASSWD_CANT_CHANGE
)
269 Ace
->Mask
&= ~USER_CHANGE_PASSWORD
;
271 Ace
->Mask
|= USER_CHANGE_PASSWORD
;
277 GetUserDacl(IN SAM_HANDLE UserHandle
,
280 PSECURITY_DESCRIPTOR SecurityDescriptor
= NULL
;
285 ACL_SIZE_INFORMATION AclSize
;
286 NET_API_STATUS ApiStatus
;
289 TRACE("(%p %p)\n", UserHandle
, Dacl
);
293 Status
= SamQuerySecurityObject(UserHandle
,
294 DACL_SECURITY_INFORMATION
,
295 &SecurityDescriptor
);
296 if (!NT_SUCCESS(Status
))
298 TRACE("SamQuerySecurityObject() failed (Status 0x%08lx)\n", Status
);
299 ApiStatus
= NetpNtStatusToApiStatus(Status
);
303 Status
= RtlGetDaclSecurityDescriptor(SecurityDescriptor
,
307 if (!NT_SUCCESS(Status
))
309 TRACE("RtlGetDaclSecurityDescriptor() failed (Status 0x%08lx)\n", Status
);
310 ApiStatus
= NERR_InternalError
;
314 if (Present
== FALSE
)
316 TRACE("No DACL present\n");
317 ApiStatus
= NERR_Success
;
321 Status
= RtlQueryInformationAcl(SamDacl
,
325 if (!NT_SUCCESS(Status
))
327 TRACE("RtlQueryInformationAcl() failed (Status 0x%08lx)\n", Status
);
328 ApiStatus
= NERR_InternalError
;
332 LocalDacl
= HeapAlloc(GetProcessHeap(), 0, AclSize
.AclBytesInUse
);
333 if (LocalDacl
== NULL
)
335 TRACE("Memory allocation failed\n");
336 ApiStatus
= ERROR_NOT_ENOUGH_MEMORY
;
340 RtlCopyMemory(LocalDacl
, SamDacl
, AclSize
.AclBytesInUse
);
344 ApiStatus
= NERR_Success
;
347 if (SecurityDescriptor
!= NULL
)
348 SamFreeMemory(SecurityDescriptor
);
350 TRACE("done (ApiStatus: 0x%08lx)\n", ApiStatus
);
358 FreeUserInfo(PUSER_ALL_INFORMATION UserInfo
)
360 if (UserInfo
->UserName
.Buffer
!= NULL
)
361 SamFreeMemory(UserInfo
->UserName
.Buffer
);
363 if (UserInfo
->FullName
.Buffer
!= NULL
)
364 SamFreeMemory(UserInfo
->FullName
.Buffer
);
366 if (UserInfo
->HomeDirectory
.Buffer
!= NULL
)
367 SamFreeMemory(UserInfo
->HomeDirectory
.Buffer
);
369 if (UserInfo
->HomeDirectoryDrive
.Buffer
!= NULL
)
370 SamFreeMemory(UserInfo
->HomeDirectoryDrive
.Buffer
);
372 if (UserInfo
->ScriptPath
.Buffer
!= NULL
)
373 SamFreeMemory(UserInfo
->ScriptPath
.Buffer
);
375 if (UserInfo
->ProfilePath
.Buffer
!= NULL
)
376 SamFreeMemory(UserInfo
->ProfilePath
.Buffer
);
378 if (UserInfo
->AdminComment
.Buffer
!= NULL
)
379 SamFreeMemory(UserInfo
->AdminComment
.Buffer
);
381 if (UserInfo
->WorkStations
.Buffer
!= NULL
)
382 SamFreeMemory(UserInfo
->WorkStations
.Buffer
);
384 if (UserInfo
->UserComment
.Buffer
!= NULL
)
385 SamFreeMemory(UserInfo
->UserComment
.Buffer
);
387 if (UserInfo
->Parameters
.Buffer
!= NULL
)
388 SamFreeMemory(UserInfo
->Parameters
.Buffer
);
390 if (UserInfo
->PrivateData
.Buffer
!= NULL
)
391 SamFreeMemory(UserInfo
->PrivateData
.Buffer
);
393 if (UserInfo
->LogonHours
.LogonHours
!= NULL
)
394 SamFreeMemory(UserInfo
->LogonHours
.LogonHours
);
396 SamFreeMemory(UserInfo
);
402 BuildUserInfoBuffer(SAM_HANDLE UserHandle
,
407 UNICODE_STRING LogonServer
= RTL_CONSTANT_STRING(L
"\\\\*");
408 PUSER_ALL_INFORMATION UserInfo
= NULL
;
409 LPVOID LocalBuffer
= NULL
;
411 PUSER_INFO_0 UserInfo0
;
412 PUSER_INFO_1 UserInfo1
;
413 PUSER_INFO_2 UserInfo2
;
414 PUSER_INFO_3 UserInfo3
;
415 PUSER_INFO_4 UserInfo4
;
416 PUSER_INFO_10 UserInfo10
;
417 PUSER_INFO_11 UserInfo11
;
418 PUSER_INFO_20 UserInfo20
;
419 PUSER_INFO_23 UserInfo23
;
423 NET_API_STATUS ApiStatus
= NERR_Success
;
427 Status
= SamQueryInformationUser(UserHandle
,
430 if (!NT_SUCCESS(Status
))
432 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
433 ApiStatus
= NetpNtStatusToApiStatus(Status
);
437 if ((level
== 1) || (level
== 2) || (level
== 3) ||
438 (level
== 4) || (level
== 20) || (level
== 23))
440 ApiStatus
= GetUserDacl(UserHandle
, &Dacl
);
441 if (ApiStatus
!= NERR_Success
)
448 Size
= sizeof(USER_INFO_0
) +
449 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
453 Size
= sizeof(USER_INFO_1
) +
454 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
456 if (UserInfo
->HomeDirectory
.Length
> 0)
457 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
459 if (UserInfo
->AdminComment
.Length
> 0)
460 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
462 if (UserInfo
->ScriptPath
.Length
> 0)
463 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
467 Size
= sizeof(USER_INFO_2
) +
468 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
470 if (UserInfo
->HomeDirectory
.Length
> 0)
471 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
473 if (UserInfo
->AdminComment
.Length
> 0)
474 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
476 if (UserInfo
->ScriptPath
.Length
> 0)
477 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
479 if (UserInfo
->FullName
.Length
> 0)
480 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
482 if (UserInfo
->UserComment
.Length
> 0)
483 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
485 if (UserInfo
->Parameters
.Length
> 0)
486 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
488 if (UserInfo
->WorkStations
.Length
> 0)
489 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
491 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
492 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
494 if (LogonServer
.Length
> 0)
495 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
499 Size
= sizeof(USER_INFO_3
) +
500 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
502 if (UserInfo
->HomeDirectory
.Length
> 0)
503 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
505 if (UserInfo
->AdminComment
.Length
> 0)
506 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
508 if (UserInfo
->ScriptPath
.Length
> 0)
509 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
511 if (UserInfo
->FullName
.Length
> 0)
512 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
514 if (UserInfo
->UserComment
.Length
> 0)
515 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
517 if (UserInfo
->Parameters
.Length
> 0)
518 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
520 if (UserInfo
->WorkStations
.Length
> 0)
521 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
523 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
524 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
526 if (LogonServer
.Length
> 0)
527 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
529 if (UserInfo
->ProfilePath
.Length
> 0)
530 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
532 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
533 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
537 Size
= sizeof(USER_INFO_4
) +
538 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
540 if (UserInfo
->HomeDirectory
.Length
> 0)
541 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
543 if (UserInfo
->AdminComment
.Length
> 0)
544 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
546 if (UserInfo
->ScriptPath
.Length
> 0)
547 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
549 if (UserInfo
->FullName
.Length
> 0)
550 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
552 if (UserInfo
->UserComment
.Length
> 0)
553 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
555 if (UserInfo
->Parameters
.Length
> 0)
556 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
558 if (UserInfo
->WorkStations
.Length
> 0)
559 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
561 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
562 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
564 if (LogonServer
.Length
> 0)
565 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
567 /* FIXME: usri4_user_sid */
569 if (UserInfo
->ProfilePath
.Length
> 0)
570 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
572 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
573 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
577 Size
= sizeof(USER_INFO_10
) +
578 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
580 if (UserInfo
->AdminComment
.Length
> 0)
581 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
583 if (UserInfo
->UserComment
.Length
> 0)
584 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
586 if (UserInfo
->FullName
.Length
> 0)
587 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
591 Size
= sizeof(USER_INFO_11
) +
592 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
594 if (UserInfo
->AdminComment
.Length
> 0)
595 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
597 if (UserInfo
->UserComment
.Length
> 0)
598 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
600 if (UserInfo
->FullName
.Length
> 0)
601 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
603 if (UserInfo
->HomeDirectory
.Length
> 0)
604 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
606 if (UserInfo
->Parameters
.Length
> 0)
607 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
609 if (LogonServer
.Length
> 0)
610 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
612 if (UserInfo
->WorkStations
.Length
> 0)
613 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
615 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
616 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
620 Size
= sizeof(USER_INFO_20
) +
621 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
623 if (UserInfo
->FullName
.Length
> 0)
624 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
626 if (UserInfo
->AdminComment
.Length
> 0)
627 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
631 Size
= sizeof(USER_INFO_23
) +
632 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
634 if (UserInfo
->FullName
.Length
> 0)
635 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
637 if (UserInfo
->AdminComment
.Length
> 0)
638 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
640 /* FIXME: usri23_user_sid */
644 ApiStatus
= ERROR_INVALID_LEVEL
;
648 ApiStatus
= NetApiBufferAllocate(Size
, &LocalBuffer
);
649 if (ApiStatus
!= NERR_Success
)
652 ZeroMemory(LocalBuffer
, Size
);
657 UserInfo0
= (PUSER_INFO_0
)LocalBuffer
;
659 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo0
+ sizeof(USER_INFO_0
));
660 UserInfo0
->usri0_name
= Ptr
;
662 memcpy(UserInfo0
->usri0_name
,
663 UserInfo
->UserName
.Buffer
,
664 UserInfo
->UserName
.Length
);
665 UserInfo0
->usri0_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
669 UserInfo1
= (PUSER_INFO_1
)LocalBuffer
;
671 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo1
+ sizeof(USER_INFO_1
));
673 UserInfo1
->usri1_name
= Ptr
;
675 memcpy(UserInfo1
->usri1_name
,
676 UserInfo
->UserName
.Buffer
,
677 UserInfo
->UserName
.Length
);
678 UserInfo1
->usri1_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
680 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
682 UserInfo1
->usri1_password
= NULL
;
684 UserInfo1
->usri1_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
686 /* FIXME: UserInfo1->usri1_priv */
688 if (UserInfo
->HomeDirectory
.Length
> 0)
690 UserInfo1
->usri1_home_dir
= Ptr
;
692 memcpy(UserInfo1
->usri1_home_dir
,
693 UserInfo
->HomeDirectory
.Buffer
,
694 UserInfo
->HomeDirectory
.Length
);
695 UserInfo1
->usri1_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
697 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
700 if (UserInfo
->AdminComment
.Length
> 0)
702 UserInfo1
->usri1_comment
= Ptr
;
704 memcpy(UserInfo1
->usri1_comment
,
705 UserInfo
->AdminComment
.Buffer
,
706 UserInfo
->AdminComment
.Length
);
707 UserInfo1
->usri1_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
709 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
712 UserInfo1
->usri1_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
715 if (UserInfo
->ScriptPath
.Length
> 0)
717 UserInfo1
->usri1_script_path
= Ptr
;
719 memcpy(UserInfo1
->usri1_script_path
,
720 UserInfo
->ScriptPath
.Buffer
,
721 UserInfo
->ScriptPath
.Length
);
722 UserInfo1
->usri1_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
727 UserInfo2
= (PUSER_INFO_2
)LocalBuffer
;
729 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo2
+ sizeof(USER_INFO_2
));
731 UserInfo2
->usri2_name
= Ptr
;
733 memcpy(UserInfo2
->usri2_name
,
734 UserInfo
->UserName
.Buffer
,
735 UserInfo
->UserName
.Length
);
736 UserInfo2
->usri2_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
738 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
740 UserInfo2
->usri2_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
742 /* FIXME: usri2_priv */
744 if (UserInfo
->HomeDirectory
.Length
> 0)
746 UserInfo2
->usri2_home_dir
= Ptr
;
748 memcpy(UserInfo2
->usri2_home_dir
,
749 UserInfo
->HomeDirectory
.Buffer
,
750 UserInfo
->HomeDirectory
.Length
);
751 UserInfo2
->usri2_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
753 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
756 if (UserInfo
->AdminComment
.Length
> 0)
758 UserInfo2
->usri2_comment
= Ptr
;
760 memcpy(UserInfo2
->usri2_comment
,
761 UserInfo
->AdminComment
.Buffer
,
762 UserInfo
->AdminComment
.Length
);
763 UserInfo2
->usri2_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
765 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
768 UserInfo2
->usri2_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
771 if (UserInfo
->ScriptPath
.Length
> 0)
773 UserInfo2
->usri2_script_path
= Ptr
;
775 memcpy(UserInfo2
->usri2_script_path
,
776 UserInfo
->ScriptPath
.Buffer
,
777 UserInfo
->ScriptPath
.Length
);
778 UserInfo2
->usri2_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
780 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
783 /* FIXME: usri2_auth_flags */
785 if (UserInfo
->FullName
.Length
> 0)
787 UserInfo2
->usri2_full_name
= Ptr
;
789 memcpy(UserInfo2
->usri2_full_name
,
790 UserInfo
->FullName
.Buffer
,
791 UserInfo
->FullName
.Length
);
792 UserInfo2
->usri2_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
794 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
797 if (UserInfo
->UserComment
.Length
> 0)
799 UserInfo2
->usri2_usr_comment
= Ptr
;
801 memcpy(UserInfo2
->usri2_usr_comment
,
802 UserInfo
->UserComment
.Buffer
,
803 UserInfo
->UserComment
.Length
);
804 UserInfo2
->usri2_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
806 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
809 if (UserInfo
->Parameters
.Length
> 0)
811 UserInfo2
->usri2_parms
= Ptr
;
813 memcpy(UserInfo2
->usri2_parms
,
814 UserInfo
->Parameters
.Buffer
,
815 UserInfo
->Parameters
.Length
);
816 UserInfo2
->usri2_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
818 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
821 if (UserInfo
->WorkStations
.Length
> 0)
823 UserInfo2
->usri2_workstations
= Ptr
;
825 memcpy(UserInfo2
->usri2_workstations
,
826 UserInfo
->WorkStations
.Buffer
,
827 UserInfo
->WorkStations
.Length
);
828 UserInfo2
->usri2_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
830 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
833 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
834 &UserInfo2
->usri2_last_logon
);
836 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
837 &UserInfo2
->usri2_last_logoff
);
839 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
840 &UserInfo2
->usri2_acct_expires
);
842 UserInfo2
->usri2_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
843 UserInfo2
->usri2_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
845 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
847 UserInfo2
->usri2_logon_hours
= (PVOID
)Ptr
;
849 memcpy(UserInfo2
->usri2_logon_hours
,
850 UserInfo
->LogonHours
.LogonHours
,
851 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
853 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
856 UserInfo2
->usri2_bad_pw_count
= UserInfo
->BadPasswordCount
;
857 UserInfo2
->usri2_num_logons
= UserInfo
->LogonCount
;
859 if (LogonServer
.Length
> 0)
861 UserInfo2
->usri2_logon_server
= Ptr
;
863 memcpy(UserInfo2
->usri2_logon_server
,
866 UserInfo2
->usri2_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
868 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
871 UserInfo2
->usri2_country_code
= UserInfo
->CountryCode
;
872 UserInfo2
->usri2_code_page
= UserInfo
->CodePage
;
876 UserInfo3
= (PUSER_INFO_3
)LocalBuffer
;
878 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo3
+ sizeof(USER_INFO_3
));
880 UserInfo3
->usri3_name
= Ptr
;
882 memcpy(UserInfo3
->usri3_name
,
883 UserInfo
->UserName
.Buffer
,
884 UserInfo
->UserName
.Length
);
885 UserInfo3
->usri3_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
887 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
889 UserInfo3
->usri3_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
891 /* FIXME: usri3_priv */
893 if (UserInfo
->HomeDirectory
.Length
> 0)
895 UserInfo3
->usri3_home_dir
= Ptr
;
897 memcpy(UserInfo3
->usri3_home_dir
,
898 UserInfo
->HomeDirectory
.Buffer
,
899 UserInfo
->HomeDirectory
.Length
);
900 UserInfo3
->usri3_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
902 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
905 if (UserInfo
->AdminComment
.Length
> 0)
907 UserInfo3
->usri3_comment
= Ptr
;
909 memcpy(UserInfo3
->usri3_comment
,
910 UserInfo
->AdminComment
.Buffer
,
911 UserInfo
->AdminComment
.Length
);
912 UserInfo3
->usri3_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
914 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
917 UserInfo3
->usri3_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
920 if (UserInfo
->ScriptPath
.Length
> 0)
922 UserInfo3
->usri3_script_path
= Ptr
;
924 memcpy(UserInfo3
->usri3_script_path
,
925 UserInfo
->ScriptPath
.Buffer
,
926 UserInfo
->ScriptPath
.Length
);
927 UserInfo3
->usri3_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
929 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
932 /* FIXME: usri3_auth_flags */
934 if (UserInfo
->FullName
.Length
> 0)
936 UserInfo3
->usri3_full_name
= Ptr
;
938 memcpy(UserInfo3
->usri3_full_name
,
939 UserInfo
->FullName
.Buffer
,
940 UserInfo
->FullName
.Length
);
941 UserInfo3
->usri3_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
943 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
946 if (UserInfo
->UserComment
.Length
> 0)
948 UserInfo3
->usri3_usr_comment
= Ptr
;
950 memcpy(UserInfo3
->usri3_usr_comment
,
951 UserInfo
->UserComment
.Buffer
,
952 UserInfo
->UserComment
.Length
);
953 UserInfo3
->usri3_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
955 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
958 if (UserInfo
->Parameters
.Length
> 0)
960 UserInfo3
->usri3_parms
= Ptr
;
962 memcpy(UserInfo3
->usri3_parms
,
963 UserInfo
->Parameters
.Buffer
,
964 UserInfo
->Parameters
.Length
);
965 UserInfo3
->usri3_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
967 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
970 if (UserInfo
->WorkStations
.Length
> 0)
972 UserInfo3
->usri3_workstations
= Ptr
;
974 memcpy(UserInfo3
->usri3_workstations
,
975 UserInfo
->WorkStations
.Buffer
,
976 UserInfo
->WorkStations
.Length
);
977 UserInfo3
->usri3_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
979 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
982 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
983 &UserInfo3
->usri3_last_logon
);
985 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
986 &UserInfo3
->usri3_last_logoff
);
988 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
989 &UserInfo3
->usri3_acct_expires
);
991 UserInfo3
->usri3_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
992 UserInfo3
->usri3_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
994 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
996 UserInfo3
->usri3_logon_hours
= (PVOID
)Ptr
;
998 memcpy(UserInfo3
->usri3_logon_hours
,
999 UserInfo
->LogonHours
.LogonHours
,
1000 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1002 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1005 UserInfo3
->usri3_bad_pw_count
= UserInfo
->BadPasswordCount
;
1006 UserInfo3
->usri3_num_logons
= UserInfo
->LogonCount
;
1008 if (LogonServer
.Length
> 0)
1010 UserInfo3
->usri3_logon_server
= Ptr
;
1012 memcpy(UserInfo3
->usri3_logon_server
,
1014 LogonServer
.Length
);
1015 UserInfo3
->usri3_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1017 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
1020 UserInfo3
->usri3_country_code
= UserInfo
->CountryCode
;
1021 UserInfo3
->usri3_code_page
= UserInfo
->CodePage
;
1022 UserInfo3
->usri3_user_id
= RelativeId
;
1023 UserInfo3
->usri3_primary_group_id
= UserInfo
->PrimaryGroupId
;
1025 if (UserInfo
->ProfilePath
.Length
> 0)
1027 UserInfo3
->usri3_profile
= Ptr
;
1029 memcpy(UserInfo3
->usri3_profile
,
1030 UserInfo
->ProfilePath
.Buffer
,
1031 UserInfo
->ProfilePath
.Length
);
1032 UserInfo3
->usri3_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1034 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
1037 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
1039 UserInfo3
->usri3_home_dir_drive
= Ptr
;
1041 memcpy(UserInfo3
->usri3_home_dir_drive
,
1042 UserInfo
->HomeDirectoryDrive
.Buffer
,
1043 UserInfo
->HomeDirectoryDrive
.Length
);
1044 UserInfo3
->usri3_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1046 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
1049 UserInfo3
->usri3_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
1053 UserInfo4
= (PUSER_INFO_4
)LocalBuffer
;
1055 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo4
+ sizeof(USER_INFO_4
));
1057 UserInfo4
->usri4_name
= Ptr
;
1059 memcpy(UserInfo4
->usri4_name
,
1060 UserInfo
->UserName
.Buffer
,
1061 UserInfo
->UserName
.Length
);
1062 UserInfo4
->usri4_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1064 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1066 UserInfo4
->usri4_password
= NULL
;
1067 UserInfo4
->usri4_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
1069 /* FIXME: usri4_priv */
1071 if (UserInfo
->HomeDirectory
.Length
> 0)
1073 UserInfo4
->usri4_home_dir
= Ptr
;
1075 memcpy(UserInfo4
->usri4_home_dir
,
1076 UserInfo
->HomeDirectory
.Buffer
,
1077 UserInfo
->HomeDirectory
.Length
);
1078 UserInfo4
->usri4_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1080 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
1083 if (UserInfo
->AdminComment
.Length
> 0)
1085 UserInfo4
->usri4_comment
= Ptr
;
1087 memcpy(UserInfo4
->usri4_comment
,
1088 UserInfo
->AdminComment
.Buffer
,
1089 UserInfo
->AdminComment
.Length
);
1090 UserInfo4
->usri4_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1092 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1095 UserInfo4
->usri4_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
1098 if (UserInfo
->ScriptPath
.Length
> 0)
1100 UserInfo4
->usri4_script_path
= Ptr
;
1102 memcpy(UserInfo4
->usri4_script_path
,
1103 UserInfo
->ScriptPath
.Buffer
,
1104 UserInfo
->ScriptPath
.Length
);
1105 UserInfo4
->usri4_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1107 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
1110 /* FIXME: usri4_auth_flags */
1112 if (UserInfo
->FullName
.Length
> 0)
1114 UserInfo4
->usri4_full_name
= Ptr
;
1116 memcpy(UserInfo4
->usri4_full_name
,
1117 UserInfo
->FullName
.Buffer
,
1118 UserInfo
->FullName
.Length
);
1119 UserInfo4
->usri4_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1121 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1124 if (UserInfo
->UserComment
.Length
> 0)
1126 UserInfo4
->usri4_usr_comment
= Ptr
;
1128 memcpy(UserInfo4
->usri4_usr_comment
,
1129 UserInfo
->UserComment
.Buffer
,
1130 UserInfo
->UserComment
.Length
);
1131 UserInfo4
->usri4_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1133 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1136 if (UserInfo
->Parameters
.Length
> 0)
1138 UserInfo4
->usri4_parms
= Ptr
;
1140 memcpy(UserInfo4
->usri4_parms
,
1141 UserInfo
->Parameters
.Buffer
,
1142 UserInfo
->Parameters
.Length
);
1143 UserInfo4
->usri4_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1145 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
1148 if (UserInfo
->WorkStations
.Length
> 0)
1150 UserInfo4
->usri4_workstations
= Ptr
;
1152 memcpy(UserInfo4
->usri4_workstations
,
1153 UserInfo
->WorkStations
.Buffer
,
1154 UserInfo
->WorkStations
.Length
);
1155 UserInfo4
->usri4_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1157 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
1160 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
1161 &UserInfo4
->usri4_last_logon
);
1163 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
1164 &UserInfo4
->usri4_last_logoff
);
1166 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
1167 &UserInfo4
->usri4_acct_expires
);
1169 UserInfo4
->usri4_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
1170 UserInfo4
->usri4_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
1172 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
1174 UserInfo4
->usri4_logon_hours
= (PVOID
)Ptr
;
1176 memcpy(UserInfo4
->usri4_logon_hours
,
1177 UserInfo
->LogonHours
.LogonHours
,
1178 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1180 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1183 UserInfo4
->usri4_bad_pw_count
= UserInfo
->BadPasswordCount
;
1184 UserInfo4
->usri4_num_logons
= UserInfo
->LogonCount
;
1186 if (LogonServer
.Length
> 0)
1188 UserInfo4
->usri4_logon_server
= Ptr
;
1190 memcpy(UserInfo4
->usri4_logon_server
,
1192 LogonServer
.Length
);
1193 UserInfo4
->usri4_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1195 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
1198 UserInfo4
->usri4_country_code
= UserInfo
->CountryCode
;
1199 UserInfo4
->usri4_code_page
= UserInfo
->CodePage
;
1201 /* FIXME: usri4_user_sid */
1203 UserInfo4
->usri4_primary_group_id
= UserInfo
->PrimaryGroupId
;
1205 if (UserInfo
->ProfilePath
.Length
> 0)
1207 UserInfo4
->usri4_profile
= Ptr
;
1209 memcpy(UserInfo4
->usri4_profile
,
1210 UserInfo
->ProfilePath
.Buffer
,
1211 UserInfo
->ProfilePath
.Length
);
1212 UserInfo4
->usri4_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1214 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
1217 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
1219 UserInfo4
->usri4_home_dir_drive
= Ptr
;
1221 memcpy(UserInfo4
->usri4_home_dir_drive
,
1222 UserInfo
->HomeDirectoryDrive
.Buffer
,
1223 UserInfo
->HomeDirectoryDrive
.Length
);
1224 UserInfo4
->usri4_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1226 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
1229 UserInfo4
->usri4_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
1233 UserInfo10
= (PUSER_INFO_10
)LocalBuffer
;
1235 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo10
+ sizeof(USER_INFO_10
));
1237 UserInfo10
->usri10_name
= Ptr
;
1239 memcpy(UserInfo10
->usri10_name
,
1240 UserInfo
->UserName
.Buffer
,
1241 UserInfo
->UserName
.Length
);
1242 UserInfo10
->usri10_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1244 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1246 if (UserInfo
->AdminComment
.Length
> 0)
1248 UserInfo10
->usri10_comment
= Ptr
;
1250 memcpy(UserInfo10
->usri10_comment
,
1251 UserInfo
->AdminComment
.Buffer
,
1252 UserInfo
->AdminComment
.Length
);
1253 UserInfo10
->usri10_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1255 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1258 if (UserInfo
->UserComment
.Length
> 0)
1260 UserInfo10
->usri10_usr_comment
= Ptr
;
1262 memcpy(UserInfo10
->usri10_usr_comment
,
1263 UserInfo
->UserComment
.Buffer
,
1264 UserInfo
->UserComment
.Length
);
1265 UserInfo10
->usri10_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1267 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1270 if (UserInfo
->FullName
.Length
> 0)
1272 UserInfo10
->usri10_full_name
= Ptr
;
1274 memcpy(UserInfo10
->usri10_full_name
,
1275 UserInfo
->FullName
.Buffer
,
1276 UserInfo
->FullName
.Length
);
1277 UserInfo10
->usri10_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1279 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1284 UserInfo11
= (PUSER_INFO_11
)LocalBuffer
;
1286 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo11
+ sizeof(USER_INFO_11
));
1288 UserInfo11
->usri11_name
= Ptr
;
1290 memcpy(UserInfo11
->usri11_name
,
1291 UserInfo
->UserName
.Buffer
,
1292 UserInfo
->UserName
.Length
);
1293 UserInfo11
->usri11_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1295 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1297 if (UserInfo
->AdminComment
.Length
> 0)
1299 UserInfo11
->usri11_comment
= Ptr
;
1301 memcpy(UserInfo11
->usri11_comment
,
1302 UserInfo
->AdminComment
.Buffer
,
1303 UserInfo
->AdminComment
.Length
);
1304 UserInfo11
->usri11_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1306 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1309 if (UserInfo
->UserComment
.Length
> 0)
1311 UserInfo11
->usri11_usr_comment
= Ptr
;
1313 memcpy(UserInfo11
->usri11_usr_comment
,
1314 UserInfo
->UserComment
.Buffer
,
1315 UserInfo
->UserComment
.Length
);
1316 UserInfo11
->usri11_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1318 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1321 if (UserInfo
->FullName
.Length
> 0)
1323 UserInfo11
->usri11_full_name
= Ptr
;
1325 memcpy(UserInfo11
->usri11_full_name
,
1326 UserInfo
->FullName
.Buffer
,
1327 UserInfo
->FullName
.Length
);
1328 UserInfo11
->usri11_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1330 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1333 /* FIXME: usri11_priv */
1334 /* FIXME: usri11_auth_flags */
1336 UserInfo11
->usri11_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
1338 if (UserInfo
->HomeDirectory
.Length
> 0)
1340 UserInfo11
->usri11_home_dir
= Ptr
;
1342 memcpy(UserInfo11
->usri11_home_dir
,
1343 UserInfo
->HomeDirectory
.Buffer
,
1344 UserInfo
->HomeDirectory
.Length
);
1345 UserInfo11
->usri11_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1347 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
1350 if (UserInfo
->Parameters
.Length
> 0)
1352 UserInfo11
->usri11_parms
= Ptr
;
1354 memcpy(UserInfo11
->usri11_parms
,
1355 UserInfo
->Parameters
.Buffer
,
1356 UserInfo
->Parameters
.Length
);
1357 UserInfo11
->usri11_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1359 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
1362 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
1363 &UserInfo11
->usri11_last_logon
);
1365 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
1366 &UserInfo11
->usri11_last_logoff
);
1368 UserInfo11
->usri11_bad_pw_count
= UserInfo
->BadPasswordCount
;
1369 UserInfo11
->usri11_num_logons
= UserInfo
->LogonCount
;
1371 if (LogonServer
.Length
> 0)
1373 UserInfo11
->usri11_logon_server
= Ptr
;
1375 memcpy(UserInfo11
->usri11_logon_server
,
1377 LogonServer
.Length
);
1378 UserInfo11
->usri11_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1380 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
1383 UserInfo11
->usri11_country_code
= UserInfo
->CountryCode
;
1385 if (UserInfo
->WorkStations
.Length
> 0)
1387 UserInfo11
->usri11_workstations
= Ptr
;
1389 memcpy(UserInfo11
->usri11_workstations
,
1390 UserInfo
->WorkStations
.Buffer
,
1391 UserInfo
->WorkStations
.Length
);
1392 UserInfo11
->usri11_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1394 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
1397 UserInfo11
->usri11_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
1398 UserInfo11
->usri11_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
1400 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
1402 UserInfo11
->usri11_logon_hours
= (PVOID
)Ptr
;
1404 memcpy(UserInfo11
->usri11_logon_hours
,
1405 UserInfo
->LogonHours
.LogonHours
,
1406 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1408 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1411 UserInfo11
->usri11_code_page
= UserInfo
->CodePage
;
1415 UserInfo20
= (PUSER_INFO_20
)LocalBuffer
;
1417 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo20
+ sizeof(USER_INFO_20
));
1419 UserInfo20
->usri20_name
= Ptr
;
1421 memcpy(UserInfo20
->usri20_name
,
1422 UserInfo
->UserName
.Buffer
,
1423 UserInfo
->UserName
.Length
);
1424 UserInfo20
->usri20_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1426 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1428 if (UserInfo
->FullName
.Length
> 0)
1430 UserInfo20
->usri20_full_name
= Ptr
;
1432 memcpy(UserInfo20
->usri20_full_name
,
1433 UserInfo
->FullName
.Buffer
,
1434 UserInfo
->FullName
.Length
);
1435 UserInfo20
->usri20_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1437 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1440 if (UserInfo
->AdminComment
.Length
> 0)
1442 UserInfo20
->usri20_comment
= Ptr
;
1444 memcpy(UserInfo20
->usri20_comment
,
1445 UserInfo
->AdminComment
.Buffer
,
1446 UserInfo
->AdminComment
.Length
);
1447 UserInfo20
->usri20_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1449 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1452 UserInfo20
->usri20_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
1455 UserInfo20
->usri20_user_id
= RelativeId
;
1459 UserInfo23
= (PUSER_INFO_23
)LocalBuffer
;
1461 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo23
+ sizeof(USER_INFO_23
));
1463 UserInfo23
->usri23_name
= Ptr
;
1465 memcpy(UserInfo23
->usri23_name
,
1466 UserInfo
->UserName
.Buffer
,
1467 UserInfo
->UserName
.Length
);
1468 UserInfo23
->usri23_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1470 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1472 if (UserInfo
->FullName
.Length
> 0)
1474 UserInfo23
->usri23_full_name
= Ptr
;
1476 memcpy(UserInfo23
->usri23_full_name
,
1477 UserInfo
->FullName
.Buffer
,
1478 UserInfo
->FullName
.Length
);
1479 UserInfo23
->usri23_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1481 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1484 if (UserInfo
->AdminComment
.Length
> 0)
1486 UserInfo23
->usri23_comment
= Ptr
;
1488 memcpy(UserInfo23
->usri23_comment
,
1489 UserInfo
->AdminComment
.Buffer
,
1490 UserInfo
->AdminComment
.Length
);
1491 UserInfo23
->usri23_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1493 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1496 UserInfo23
->usri23_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
1499 /* FIXME: usri23_user_sid */
1504 if (UserInfo
!= NULL
)
1505 FreeUserInfo(UserInfo
);
1508 HeapFree(GetProcessHeap(), 0, Dacl
);
1510 if (ApiStatus
== NERR_Success
)
1512 *Buffer
= LocalBuffer
;
1516 if (LocalBuffer
!= NULL
)
1517 NetApiBufferFree(LocalBuffer
);
1526 SetUserInfo(SAM_HANDLE UserHandle
,
1530 USER_ALL_INFORMATION UserAllInfo
;
1531 PUSER_INFO_0 UserInfo0
;
1532 PUSER_INFO_1 UserInfo1
;
1533 PUSER_INFO_2 UserInfo2
;
1534 PUSER_INFO_3 UserInfo3
;
1535 PUSER_INFO_4 UserInfo4
;
1536 PUSER_INFO_22 UserInfo22
;
1537 PUSER_INFO_1003 UserInfo1003
;
1538 PUSER_INFO_1006 UserInfo1006
;
1539 PUSER_INFO_1007 UserInfo1007
;
1540 PUSER_INFO_1008 UserInfo1008
;
1541 PUSER_INFO_1009 UserInfo1009
;
1542 PUSER_INFO_1011 UserInfo1011
;
1543 PUSER_INFO_1012 UserInfo1012
;
1544 PUSER_INFO_1013 UserInfo1013
;
1545 PUSER_INFO_1014 UserInfo1014
;
1546 PUSER_INFO_1017 UserInfo1017
;
1547 PUSER_INFO_1018 UserInfo1018
;
1548 PUSER_INFO_1024 UserInfo1024
;
1549 PUSER_INFO_1025 UserInfo1025
;
1550 PUSER_INFO_1051 UserInfo1051
;
1551 PUSER_INFO_1052 UserInfo1052
;
1552 PUSER_INFO_1053 UserInfo1053
;
1554 NET_API_STATUS ApiStatus
= NERR_Success
;
1555 NTSTATUS Status
= STATUS_SUCCESS
;
1557 ZeroMemory(&UserAllInfo
, sizeof(USER_ALL_INFORMATION
));
1559 if ((Level
== 1) || (Level
== 2) || (Level
== 3) ||
1560 (Level
== 4) || (Level
== 22) || (Level
== 1008))
1562 ApiStatus
= GetUserDacl(UserHandle
, &Dacl
);
1563 if (ApiStatus
!= NERR_Success
)
1570 UserInfo0
= (PUSER_INFO_0
)UserInfo
;
1572 RtlInitUnicodeString(&UserAllInfo
.UserName
,
1573 UserInfo0
->usri0_name
);
1575 UserAllInfo
.WhichFields
|= USER_ALL_USERNAME
;
1579 UserInfo1
= (PUSER_INFO_1
)UserInfo
;
1581 // usri1_name ignored
1583 if (UserInfo1
->usri1_password
!= NULL
)
1585 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1586 UserInfo1
->usri1_password
);
1587 UserAllInfo
.NtPasswordPresent
= TRUE
;
1588 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1591 // usri1_password_age ignored
1593 // UserInfo1->usri1_priv
1595 if (UserInfo1
->usri1_home_dir
!= NULL
)
1597 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1598 UserInfo1
->usri1_home_dir
);
1599 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1602 if (UserInfo1
->usri1_comment
!= NULL
)
1604 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1605 UserInfo1
->usri1_comment
);
1606 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1609 ChangeUserDacl(Dacl
, UserInfo1
->usri1_flags
);
1610 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1
->usri1_flags
);
1611 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1613 if (UserInfo1
->usri1_script_path
!= NULL
)
1615 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1616 UserInfo1
->usri1_script_path
);
1617 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1622 UserInfo2
= (PUSER_INFO_2
)UserInfo
;
1624 // usri2_name ignored
1626 if (UserInfo2
->usri2_password
!= NULL
)
1628 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1629 UserInfo2
->usri2_password
);
1630 UserAllInfo
.NtPasswordPresent
= TRUE
;
1631 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1634 // usri2_password_age ignored
1636 // UserInfo2->usri2_priv;
1638 if (UserInfo2
->usri2_home_dir
!= NULL
)
1640 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1641 UserInfo2
->usri2_home_dir
);
1642 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1645 if (UserInfo2
->usri2_comment
!= NULL
)
1647 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1648 UserInfo2
->usri2_comment
);
1649 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1652 ChangeUserDacl(Dacl
, UserInfo2
->usri2_flags
);
1653 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo2
->usri2_flags
);
1654 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1656 if (UserInfo2
->usri2_script_path
!= NULL
)
1658 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1659 UserInfo2
->usri2_script_path
);
1660 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1663 // UserInfo2->usri2_auth_flags;
1665 if (UserInfo2
->usri2_full_name
!= NULL
)
1667 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1668 UserInfo2
->usri2_full_name
);
1669 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1672 if (UserInfo2
->usri2_usr_comment
!= NULL
)
1674 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1675 UserInfo2
->usri2_usr_comment
);
1676 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1679 if (UserInfo2
->usri2_parms
!= NULL
)
1681 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1682 UserInfo2
->usri2_parms
);
1683 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1686 if (UserInfo2
->usri2_workstations
!= NULL
)
1688 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1689 UserInfo2
->usri2_workstations
);
1690 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1693 // usri2_last_logon ignored
1694 // usri2_last_logoff ignored
1696 if (UserInfo2
->usri2_acct_expires
== TIMEQ_FOREVER
)
1698 UserAllInfo
.AccountExpires
.LowPart
= 0;
1699 UserAllInfo
.AccountExpires
.HighPart
= 0;
1703 RtlSecondsSince1970ToTime(UserInfo2
->usri2_acct_expires
,
1704 &UserAllInfo
.AccountExpires
);
1706 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1708 // usri2_max_storage ignored
1710 // UserInfo2->usri2_units_per_week;
1711 // UserInfo2->usri2_logon_hours;
1713 // usri2_bad_pw_count ignored
1714 // usri2_num_logons ignored
1715 // usri2_logon_server ignored
1717 UserAllInfo
.CountryCode
= UserInfo2
->usri2_country_code
;
1718 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1720 UserAllInfo
.CodePage
= UserInfo2
->usri2_code_page
;
1721 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1725 UserInfo3
= (PUSER_INFO_3
)UserInfo
;
1727 // usri3_name ignored
1729 if (UserInfo3
->usri3_password
!= NULL
)
1731 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1732 UserInfo3
->usri3_password
);
1733 UserAllInfo
.NtPasswordPresent
= TRUE
;
1734 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1737 // usri3_password_age ignored
1739 // UserInfo3->usri3_priv;
1741 if (UserInfo3
->usri3_home_dir
!= NULL
)
1743 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1744 UserInfo3
->usri3_home_dir
);
1745 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1748 if (UserInfo3
->usri3_comment
!= NULL
)
1750 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1751 UserInfo3
->usri3_comment
);
1752 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1755 ChangeUserDacl(Dacl
, UserInfo3
->usri3_flags
);
1756 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo3
->usri3_flags
);
1757 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1759 if (UserInfo3
->usri3_script_path
!= NULL
)
1761 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1762 UserInfo3
->usri3_script_path
);
1763 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1766 // UserInfo3->usri3_auth_flags;
1768 if (UserInfo3
->usri3_full_name
!= NULL
)
1770 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1771 UserInfo3
->usri3_full_name
);
1772 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1775 if (UserInfo3
->usri3_usr_comment
!= NULL
)
1777 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1778 UserInfo3
->usri3_usr_comment
);
1779 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1782 if (UserInfo3
->usri3_parms
!= NULL
)
1784 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1785 UserInfo3
->usri3_parms
);
1786 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1789 if (UserInfo3
->usri3_workstations
!= NULL
)
1791 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1792 UserInfo3
->usri3_workstations
);
1793 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1796 // usri3_last_logon ignored
1797 // usri3_last_logoff ignored
1799 if (UserInfo3
->usri3_acct_expires
== TIMEQ_FOREVER
)
1801 UserAllInfo
.AccountExpires
.LowPart
= 0;
1802 UserAllInfo
.AccountExpires
.HighPart
= 0;
1806 RtlSecondsSince1970ToTime(UserInfo3
->usri3_acct_expires
,
1807 &UserAllInfo
.AccountExpires
);
1809 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1811 // usri3_max_storage ignored
1813 // UserInfo3->usri3_units_per_week;
1814 // UserInfo3->usri3_logon_hours;
1816 // usri3_bad_pw_count ignored
1817 // usri3_num_logons ignored
1818 // usri3_logon_server ignored
1820 UserAllInfo
.CountryCode
= UserInfo3
->usri3_country_code
;
1821 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1823 UserAllInfo
.CodePage
= UserInfo3
->usri3_code_page
;
1824 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1826 // usri3_user_id ignored
1828 UserAllInfo
.PrimaryGroupId
= UserInfo3
->usri3_primary_group_id
;
1829 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1831 if (UserInfo3
->usri3_profile
!= NULL
)
1833 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1834 UserInfo3
->usri3_profile
);
1835 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1838 if (UserInfo3
->usri3_home_dir_drive
!= NULL
)
1840 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1841 UserInfo3
->usri3_home_dir_drive
);
1842 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1845 UserAllInfo
.PasswordExpired
= (UserInfo3
->usri3_password_expired
!= 0);
1846 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1850 UserInfo4
= (PUSER_INFO_4
)UserInfo
;
1852 // usri4_name ignored
1854 if (UserInfo4
->usri4_password
!= NULL
)
1856 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1857 UserInfo4
->usri4_password
);
1858 UserAllInfo
.NtPasswordPresent
= TRUE
;
1859 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1862 // usri4_password_age ignored
1864 // UserInfo3->usri4_priv;
1866 if (UserInfo4
->usri4_home_dir
!= NULL
)
1868 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1869 UserInfo4
->usri4_home_dir
);
1870 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1873 if (UserInfo4
->usri4_comment
!= NULL
)
1875 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1876 UserInfo4
->usri4_comment
);
1877 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1880 ChangeUserDacl(Dacl
, UserInfo4
->usri4_flags
);
1881 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo4
->usri4_flags
);
1882 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1884 if (UserInfo4
->usri4_script_path
!= NULL
)
1886 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1887 UserInfo4
->usri4_script_path
);
1888 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1891 // UserInfo4->usri4_auth_flags;
1893 if (UserInfo4
->usri4_full_name
!= NULL
)
1895 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1896 UserInfo4
->usri4_full_name
);
1897 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1900 if (UserInfo4
->usri4_usr_comment
!= NULL
)
1902 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1903 UserInfo4
->usri4_usr_comment
);
1904 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1907 if (UserInfo4
->usri4_parms
!= NULL
)
1909 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1910 UserInfo4
->usri4_parms
);
1911 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1914 if (UserInfo4
->usri4_workstations
!= NULL
)
1916 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1917 UserInfo4
->usri4_workstations
);
1918 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1921 // usri4_last_logon ignored
1922 // usri4_last_logoff ignored
1924 if (UserInfo4
->usri4_acct_expires
== TIMEQ_FOREVER
)
1926 UserAllInfo
.AccountExpires
.LowPart
= 0;
1927 UserAllInfo
.AccountExpires
.HighPart
= 0;
1931 RtlSecondsSince1970ToTime(UserInfo4
->usri4_acct_expires
,
1932 &UserAllInfo
.AccountExpires
);
1934 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1936 // usri4_max_storage ignored
1938 // UserInfo4->usri4_units_per_week;
1939 // UserInfo4->usri4_logon_hours;
1941 // usri4_bad_pw_count ignored
1942 // usri4_num_logons ignored
1943 // usri4_logon_server ignored
1945 UserAllInfo
.CountryCode
= UserInfo4
->usri4_country_code
;
1946 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1948 UserAllInfo
.CodePage
= UserInfo4
->usri4_code_page
;
1949 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1951 // usri4_user_sid ignored
1953 UserAllInfo
.PrimaryGroupId
= UserInfo4
->usri4_primary_group_id
;
1954 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1956 if (UserInfo4
->usri4_profile
!= NULL
)
1958 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1959 UserInfo4
->usri4_profile
);
1960 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1963 if (UserInfo4
->usri4_home_dir_drive
!= NULL
)
1965 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1966 UserInfo4
->usri4_home_dir_drive
);
1967 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1970 UserAllInfo
.PasswordExpired
= (UserInfo4
->usri4_password_expired
!= 0);
1971 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1978 UserInfo22
= (PUSER_INFO_22
)UserInfo
;
1980 // usri22_name ignored
1982 // UserInfo22->usri22_password[ENCRYPTED_PWLEN];
1984 // usri22_password_age ignored
1986 // UserInfo3->usri3_priv;
1988 if (UserInfo22
->usri22_home_dir
!= NULL
)
1990 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1991 UserInfo22
->usri22_home_dir
);
1992 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1995 if (UserInfo22
->usri22_comment
!= NULL
)
1997 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1998 UserInfo22
->usri22_comment
);
1999 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
2002 ChangeUserDacl(Dacl
, UserInfo22
->usri22_flags
);
2003 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo22
->usri22_flags
);
2004 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
2006 if (UserInfo22
->usri22_script_path
!= NULL
)
2008 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
2009 UserInfo22
->usri22_script_path
);
2010 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
2013 // UserInfo22->usri22_auth_flags;
2015 if (UserInfo22
->usri22_full_name
!= NULL
)
2017 RtlInitUnicodeString(&UserAllInfo
.FullName
,
2018 UserInfo22
->usri22_full_name
);
2019 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
2022 if (UserInfo22
->usri22_usr_comment
!= NULL
)
2024 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
2025 UserInfo22
->usri22_usr_comment
);
2026 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
2029 if (UserInfo22
->usri22_parms
!= NULL
)
2031 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
2032 UserInfo22
->usri22_parms
);
2033 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
2036 if (UserInfo22
->usri22_workstations
!= NULL
)
2038 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
2039 UserInfo22
->usri22_workstations
);
2040 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
2043 // usri22_last_logon ignored
2044 // usri22_last_logoff ignored
2046 if (UserInfo22
->usri22_acct_expires
== TIMEQ_FOREVER
)
2048 UserAllInfo
.AccountExpires
.LowPart
= 0;
2049 UserAllInfo
.AccountExpires
.HighPart
= 0;
2053 RtlSecondsSince1970ToTime(UserInfo22
->usri22_acct_expires
,
2054 &UserAllInfo
.AccountExpires
);
2056 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
2058 // usri22_max_storage ignored
2060 // UserInfo22->usri22_units_per_week;
2061 // UserInfo22->usri22_logon_hours;
2063 // usri22_bad_pw_count ignored
2064 // usri22_num_logons ignored
2065 // usri22_logon_server ignored
2067 UserAllInfo
.CountryCode
= UserInfo22
->usri22_country_code
;
2068 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
2070 UserAllInfo
.CodePage
= UserInfo22
->usri22_code_page
;
2071 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
2075 UserInfo1003
= (PUSER_INFO_1003
)UserInfo
;
2077 if (UserInfo1003
->usri1003_password
!= NULL
)
2079 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
2080 UserInfo1003
->usri1003_password
);
2081 UserAllInfo
.NtPasswordPresent
= TRUE
;
2082 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
2090 UserInfo1006
= (PUSER_INFO_1006
)UserInfo
;
2092 if (UserInfo1006
->usri1006_home_dir
!= NULL
)
2094 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
2095 UserInfo1006
->usri1006_home_dir
);
2096 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
2101 UserInfo1007
= (PUSER_INFO_1007
)UserInfo
;
2103 if (UserInfo1007
->usri1007_comment
!= NULL
)
2105 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
2106 UserInfo1007
->usri1007_comment
);
2107 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
2112 UserInfo1008
= (PUSER_INFO_1008
)UserInfo
;
2113 ChangeUserDacl(Dacl
, UserInfo1008
->usri1008_flags
);
2114 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1008
->usri1008_flags
);
2115 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
2119 UserInfo1009
= (PUSER_INFO_1009
)UserInfo
;
2121 if (UserInfo1009
->usri1009_script_path
!= NULL
)
2123 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
2124 UserInfo1009
->usri1009_script_path
);
2125 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
2133 UserInfo1011
= (PUSER_INFO_1011
)UserInfo
;
2135 if (UserInfo1011
->usri1011_full_name
!= NULL
)
2137 RtlInitUnicodeString(&UserAllInfo
.FullName
,
2138 UserInfo1011
->usri1011_full_name
);
2139 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
2144 UserInfo1012
= (PUSER_INFO_1012
)UserInfo
;
2146 if (UserInfo1012
->usri1012_usr_comment
!= NULL
)
2148 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
2149 UserInfo1012
->usri1012_usr_comment
);
2150 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
2155 UserInfo1013
= (PUSER_INFO_1013
)UserInfo
;
2157 if (UserInfo1013
->usri1013_parms
!= NULL
)
2159 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
2160 UserInfo1013
->usri1013_parms
);
2161 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
2166 UserInfo1014
= (PUSER_INFO_1014
)UserInfo
;
2168 if (UserInfo1014
->usri1014_workstations
!= NULL
)
2170 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
2171 UserInfo1014
->usri1014_workstations
);
2172 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
2177 UserInfo1017
= (PUSER_INFO_1017
)UserInfo
;
2179 if (UserInfo1017
->usri1017_acct_expires
== TIMEQ_FOREVER
)
2181 UserAllInfo
.AccountExpires
.LowPart
= 0;
2182 UserAllInfo
.AccountExpires
.HighPart
= 0;
2186 RtlSecondsSince1970ToTime(UserInfo1017
->usri1017_acct_expires
,
2187 &UserAllInfo
.AccountExpires
);
2189 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
2193 UserInfo1018
= (PUSER_INFO_1018
)UserInfo
;
2195 if (UserInfo1018
->usri1018_max_storage
!= USER_MAXSTORAGE_UNLIMITED
)
2197 // FIXME: Report error
2198 return ERROR_INVALID_PARAMETER
;
2206 UserInfo1024
= (PUSER_INFO_1024
)UserInfo
;
2208 UserAllInfo
.CountryCode
= UserInfo1024
->usri1024_country_code
;
2209 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
2213 UserInfo1025
= (PUSER_INFO_1025
)UserInfo
;
2215 UserAllInfo
.CodePage
= UserInfo1025
->usri1025_code_page
;
2216 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
2220 UserInfo1051
= (PUSER_INFO_1051
)UserInfo
;
2222 UserAllInfo
.PrimaryGroupId
= UserInfo1051
->usri1051_primary_group_id
;
2223 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
2227 UserInfo1052
= (PUSER_INFO_1052
)UserInfo
;
2229 if (UserInfo1052
->usri1052_profile
!= NULL
)
2231 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
2232 UserInfo1052
->usri1052_profile
);
2233 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
2238 UserInfo1053
= (PUSER_INFO_1053
)UserInfo
;
2240 if (UserInfo1053
->usri1053_home_dir_drive
!= NULL
)
2242 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
2243 UserInfo1053
->usri1053_home_dir_drive
);
2244 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
2249 ERR("Unsupported level %lu!\n", Level
);
2250 return ERROR_INVALID_PARAMETER
;
2253 Status
= SamSetInformationUser(UserHandle
,
2256 if (!NT_SUCCESS(Status
))
2258 ERR("SamSetInformationUser failed (Status %08lx)\n", Status
);
2259 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2265 HeapFree(GetProcessHeap(), 0, Dacl
);
2273 OpenUserByName(SAM_HANDLE DomainHandle
,
2274 PUNICODE_STRING UserName
,
2275 ULONG DesiredAccess
,
2276 PSAM_HANDLE UserHandle
)
2278 PULONG RelativeIds
= NULL
;
2279 PSID_NAME_USE Use
= NULL
;
2280 NET_API_STATUS ApiStatus
= NERR_Success
;
2281 NTSTATUS Status
= STATUS_SUCCESS
;
2283 /* Get the RID for the given user name */
2284 Status
= SamLookupNamesInDomain(DomainHandle
,
2289 if (!NT_SUCCESS(Status
))
2291 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2292 return NetpNtStatusToApiStatus(Status
);
2295 /* Fail, if it is not an alias account */
2296 if (Use
[0] != SidTypeUser
)
2298 ERR("Object is not a user!\n");
2299 ApiStatus
= NERR_GroupNotFound
;
2303 /* Open the alias account */
2304 Status
= SamOpenUser(DomainHandle
,
2308 if (!NT_SUCCESS(Status
))
2310 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2311 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2316 if (RelativeIds
!= NULL
)
2317 SamFreeMemory(RelativeIds
);
2326 /************************************************************
2327 * NetUserAdd (NETAPI32.@)
2331 NetUserAdd(LPCWSTR servername
,
2336 UNICODE_STRING ServerName
;
2337 UNICODE_STRING UserName
;
2338 SAM_HANDLE ServerHandle
= NULL
;
2339 SAM_HANDLE DomainHandle
= NULL
;
2340 SAM_HANDLE UserHandle
= NULL
;
2341 ULONG GrantedAccess
;
2343 NET_API_STATUS ApiStatus
= NERR_Success
;
2344 NTSTATUS Status
= STATUS_SUCCESS
;
2346 TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername
), level
, bufptr
, parm_err
);
2348 /* Check the info level */
2358 return ERROR_INVALID_LEVEL
;
2361 if (servername
!= NULL
)
2362 RtlInitUnicodeString(&ServerName
, servername
);
2364 /* Connect to the SAM Server */
2365 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2367 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2369 if (!NT_SUCCESS(Status
))
2371 ERR("SamConnect failed (Status %08lx)\n", Status
);
2372 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2376 /* Open the Account Domain */
2377 Status
= OpenAccountDomain(ServerHandle
,
2378 (servername
!= NULL
) ? &ServerName
: NULL
,
2379 DOMAIN_CREATE_USER
| DOMAIN_LOOKUP
| DOMAIN_READ_PASSWORD_PARAMETERS
,
2381 if (!NT_SUCCESS(Status
))
2383 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2384 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2388 /* Initialize the user name string */
2389 RtlInitUnicodeString(&UserName
,
2390 ((PUSER_INFO_1
)bufptr
)->usri1_name
);
2392 /* Create the user account */
2393 Status
= SamCreateUser2InDomain(DomainHandle
,
2395 USER_NORMAL_ACCOUNT
,
2396 USER_ALL_ACCESS
| DELETE
| WRITE_DAC
,
2400 if (!NT_SUCCESS(Status
))
2402 ERR("SamCreateUser2InDomain failed (Status %08lx)\n", Status
);
2403 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2407 /* Set user information */
2408 ApiStatus
= SetUserInfo(UserHandle
,
2411 if (ApiStatus
!= NERR_Success
)
2413 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
2418 if (UserHandle
!= NULL
)
2420 if (ApiStatus
!= NERR_Success
)
2421 SamDeleteUser(UserHandle
);
2423 SamCloseHandle(UserHandle
);
2426 if (DomainHandle
!= NULL
)
2427 SamCloseHandle(DomainHandle
);
2429 if (ServerHandle
!= NULL
)
2430 SamCloseHandle(ServerHandle
);
2436 /******************************************************************************
2437 * NetUserChangePassword (NETAPI32.@)
2439 * domainname [I] Optional. Domain on which the user resides or the logon
2440 * domain of the current user if NULL.
2441 * username [I] Optional. Username to change the password for or the name
2442 * of the current user if NULL.
2443 * oldpassword [I] The user's current password.
2444 * newpassword [I] The password that the user will be changed to using.
2447 * Success: NERR_Success.
2448 * Failure: NERR_* failure code or win error code.
2453 NetUserChangePassword(LPCWSTR domainname
,
2455 LPCWSTR oldpassword
,
2456 LPCWSTR newpassword
)
2458 PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer
= NULL
;
2459 PMSV1_0_CHANGEPASSWORD_RESPONSE ResponseBuffer
= NULL
;
2460 ULONG RequestBufferSize
;
2461 ULONG ResponseBufferSize
= 0;
2463 ANSI_STRING PackageName
;
2464 ULONG AuthenticationPackage
= 0;
2465 HANDLE LsaHandle
= NULL
;
2466 NET_API_STATUS ApiStatus
= NERR_Success
;
2467 NTSTATUS Status
= STATUS_SUCCESS
;
2468 NTSTATUS ProtocolStatus
;
2470 TRACE("(%s, %s, ..., ...)\n", debugstr_w(domainname
), debugstr_w(username
));
2472 /* FIXME: handle null domain or user name */
2474 /* Check the parameters */
2475 if ((oldpassword
== NULL
) ||
2476 (newpassword
== NULL
))
2477 return ERROR_INVALID_PARAMETER
;
2479 /* Connect to the LSA server */
2480 Status
= LsaConnectUntrusted(&LsaHandle
);
2481 if (!NT_SUCCESS(Status
))
2482 return NetpNtStatusToApiStatus(Status
);
2484 /* Get the authentication package ID */
2485 RtlInitAnsiString(&PackageName
,
2486 MSV1_0_PACKAGE_NAME
);
2488 Status
= LsaLookupAuthenticationPackage(LsaHandle
,
2490 &AuthenticationPackage
);
2491 if (!NT_SUCCESS(Status
))
2493 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2497 /* Calculate the request buffer size */
2498 RequestBufferSize
= sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
) +
2499 ((wcslen(domainname
) + 1) * sizeof(WCHAR
)) +
2500 ((wcslen(username
) + 1) * sizeof(WCHAR
)) +
2501 ((wcslen(oldpassword
) + 1) * sizeof(WCHAR
)) +
2502 ((wcslen(newpassword
) + 1) * sizeof(WCHAR
));
2504 /* Allocate the request buffer */
2505 ApiStatus
= NetApiBufferAllocate(RequestBufferSize
,
2506 (PVOID
*)&RequestBuffer
);
2507 if (ApiStatus
!= NERR_Success
)
2510 /* Initialize the request buffer */
2511 RequestBuffer
->MessageType
= MsV1_0ChangePassword
;
2512 RequestBuffer
->Impersonating
= TRUE
;
2514 Ptr
= (LPWSTR
)((ULONG_PTR
)RequestBuffer
+ sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
));
2516 /* Pack the domain name */
2517 RequestBuffer
->DomainName
.Length
= wcslen(domainname
) * sizeof(WCHAR
);
2518 RequestBuffer
->DomainName
.MaximumLength
= RequestBuffer
->DomainName
.Length
+ sizeof(WCHAR
);
2519 RequestBuffer
->DomainName
.Buffer
= Ptr
;
2521 RtlCopyMemory(RequestBuffer
->DomainName
.Buffer
,
2523 RequestBuffer
->DomainName
.MaximumLength
);
2525 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->DomainName
.MaximumLength
);
2527 /* Pack the user name */
2528 RequestBuffer
->AccountName
.Length
= wcslen(username
) * sizeof(WCHAR
);
2529 RequestBuffer
->AccountName
.MaximumLength
= RequestBuffer
->AccountName
.Length
+ sizeof(WCHAR
);
2530 RequestBuffer
->AccountName
.Buffer
= Ptr
;
2532 RtlCopyMemory(RequestBuffer
->AccountName
.Buffer
,
2534 RequestBuffer
->AccountName
.MaximumLength
);
2536 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->AccountName
.MaximumLength
);
2538 /* Pack the old password */
2539 RequestBuffer
->OldPassword
.Length
= wcslen(oldpassword
) * sizeof(WCHAR
);
2540 RequestBuffer
->OldPassword
.MaximumLength
= RequestBuffer
->OldPassword
.Length
+ sizeof(WCHAR
);
2541 RequestBuffer
->OldPassword
.Buffer
= Ptr
;
2543 RtlCopyMemory(RequestBuffer
->OldPassword
.Buffer
,
2545 RequestBuffer
->OldPassword
.MaximumLength
);
2547 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->OldPassword
.MaximumLength
);
2549 /* Pack the new password */
2550 RequestBuffer
->NewPassword
.Length
= wcslen(newpassword
) * sizeof(WCHAR
);
2551 RequestBuffer
->NewPassword
.MaximumLength
= RequestBuffer
->NewPassword
.Length
+ sizeof(WCHAR
);
2552 RequestBuffer
->NewPassword
.Buffer
= Ptr
;
2554 RtlCopyMemory(RequestBuffer
->NewPassword
.Buffer
,
2556 RequestBuffer
->NewPassword
.MaximumLength
);
2558 /* Call the authentication package */
2559 Status
= LsaCallAuthenticationPackage(LsaHandle
,
2560 AuthenticationPackage
,
2563 (PVOID
*)&ResponseBuffer
,
2564 &ResponseBufferSize
,
2566 if (!NT_SUCCESS(Status
))
2568 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2572 if (!NT_SUCCESS(ProtocolStatus
))
2574 ApiStatus
= NetpNtStatusToApiStatus(ProtocolStatus
);
2579 if (RequestBuffer
!= NULL
)
2580 NetApiBufferFree(RequestBuffer
);
2582 if (ResponseBuffer
!= NULL
)
2583 LsaFreeReturnBuffer(ResponseBuffer
);
2585 if (LsaHandle
!= NULL
)
2592 /************************************************************
2593 * NetUserDel (NETAPI32.@)
2597 NetUserDel(LPCWSTR servername
,
2600 UNICODE_STRING ServerName
;
2601 UNICODE_STRING UserName
;
2602 SAM_HANDLE ServerHandle
= NULL
;
2603 SAM_HANDLE DomainHandle
= NULL
;
2604 SAM_HANDLE UserHandle
= NULL
;
2605 NET_API_STATUS ApiStatus
= NERR_Success
;
2606 NTSTATUS Status
= STATUS_SUCCESS
;
2608 TRACE("(%s, %s)\n", debugstr_w(servername
), debugstr_w(username
));
2610 if (servername
!= NULL
)
2611 RtlInitUnicodeString(&ServerName
, servername
);
2613 RtlInitUnicodeString(&UserName
, username
);
2615 /* Connect to the SAM Server */
2616 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2618 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2620 if (!NT_SUCCESS(Status
))
2622 ERR("SamConnect failed (Status %08lx)\n", Status
);
2623 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2627 /* Open the Builtin Domain */
2628 Status
= OpenBuiltinDomain(ServerHandle
,
2631 if (!NT_SUCCESS(Status
))
2633 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2634 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2638 /* Open the user account in the builtin domain */
2639 ApiStatus
= OpenUserByName(DomainHandle
,
2643 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_NONE_MAPPED
)
2645 TRACE("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2649 if (UserHandle
== NULL
)
2651 if (DomainHandle
!= NULL
)
2653 SamCloseHandle(DomainHandle
);
2654 DomainHandle
= NULL
;
2657 /* Open the Acount Domain */
2658 Status
= OpenAccountDomain(ServerHandle
,
2659 (servername
!= NULL
) ? &ServerName
: NULL
,
2662 if (!NT_SUCCESS(Status
))
2664 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2665 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2669 /* Open the user account in the account domain */
2670 ApiStatus
= OpenUserByName(DomainHandle
,
2674 if (ApiStatus
!= NERR_Success
)
2676 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2677 if (ApiStatus
== ERROR_NONE_MAPPED
)
2678 ApiStatus
= NERR_UserNotFound
;
2683 /* Delete the user */
2684 Status
= SamDeleteUser(UserHandle
);
2685 if (!NT_SUCCESS(Status
))
2687 ERR("SamDeleteUser failed (Status %08lx)\n", Status
);
2688 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2693 if (UserHandle
!= NULL
)
2694 SamCloseHandle(UserHandle
);
2696 if (DomainHandle
!= NULL
)
2697 SamCloseHandle(DomainHandle
);
2699 if (ServerHandle
!= NULL
)
2700 SamCloseHandle(ServerHandle
);
2706 /************************************************************
2707 * NetUserEnum (NETAPI32.@)
2711 NetUserEnum(LPCWSTR servername
,
2716 LPDWORD entriesread
,
2717 LPDWORD totalentries
,
2718 LPDWORD resume_handle
)
2720 UNICODE_STRING ServerName
;
2721 PSAM_RID_ENUMERATION CurrentUser
;
2722 PENUM_CONTEXT EnumContext
= NULL
;
2723 LPVOID Buffer
= NULL
;
2725 SAM_HANDLE UserHandle
= NULL
;
2726 NET_API_STATUS ApiStatus
= NERR_Success
;
2727 NTSTATUS Status
= STATUS_SUCCESS
;
2729 TRACE("(%s %d 0x%d %p %d %p %p %p)\n", debugstr_w(servername
), level
,
2730 filter
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
2736 if (servername
!= NULL
)
2737 RtlInitUnicodeString(&ServerName
, servername
);
2739 if (resume_handle
!= NULL
&& *resume_handle
!= 0)
2741 EnumContext
= (PENUM_CONTEXT
)*resume_handle
;
2745 ApiStatus
= NetApiBufferAllocate(sizeof(ENUM_CONTEXT
), (PVOID
*)&EnumContext
);
2746 if (ApiStatus
!= NERR_Success
)
2749 EnumContext
->EnumerationContext
= 0;
2750 EnumContext
->Buffer
= NULL
;
2751 EnumContext
->Count
= 0;
2752 EnumContext
->Index
= 0;
2753 EnumContext
->BuiltinDone
= FALSE
;
2755 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2756 &EnumContext
->ServerHandle
,
2757 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2759 if (!NT_SUCCESS(Status
))
2761 ERR("SamConnect failed (Status %08lx)\n", Status
);
2762 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2766 Status
= OpenAccountDomain(EnumContext
->ServerHandle
,
2767 (servername
!= NULL
) ? &ServerName
: NULL
,
2768 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2769 &EnumContext
->AccountDomainHandle
);
2770 if (!NT_SUCCESS(Status
))
2772 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2773 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2777 Status
= OpenBuiltinDomain(EnumContext
->ServerHandle
,
2778 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2779 &EnumContext
->BuiltinDomainHandle
);
2780 if (!NT_SUCCESS(Status
))
2782 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2783 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2790 TRACE("EnumContext->Index: %lu\n", EnumContext
->Index
);
2791 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2793 if (EnumContext
->Index
>= EnumContext
->Count
)
2795 // if (EnumContext->BuiltinDone == TRUE)
2797 // ApiStatus = NERR_Success;
2801 TRACE("Calling SamEnumerateUsersInDomain\n");
2802 Status
= SamEnumerateUsersInDomain(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2803 &EnumContext
->EnumerationContext
,
2805 (PVOID
*)&EnumContext
->Buffer
,
2807 &EnumContext
->Count
);
2809 TRACE("SamEnumerateUsersInDomain returned (Status %08lx)\n", Status
);
2810 if (!NT_SUCCESS(Status
))
2812 ERR("SamEnumerateUsersInDomain failed (Status %08lx)\n", Status
);
2813 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2817 if (Status
== STATUS_MORE_ENTRIES
)
2819 ApiStatus
= NERR_BufTooSmall
;
2824 EnumContext
->BuiltinDone
= TRUE
;
2828 TRACE("EnumContext: %lu\n", EnumContext
);
2829 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2830 TRACE("EnumContext->Buffer: %p\n", EnumContext
->Buffer
);
2832 /* Get a pointer to the current user */
2833 CurrentUser
= &EnumContext
->Buffer
[EnumContext
->Index
];
2835 TRACE("RID: %lu\n", CurrentUser
->RelativeId
);
2837 Status
= SamOpenUser(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2838 READ_CONTROL
| USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2839 CurrentUser
->RelativeId
,
2841 if (!NT_SUCCESS(Status
))
2843 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2844 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2848 ApiStatus
= BuildUserInfoBuffer(UserHandle
,
2850 CurrentUser
->RelativeId
,
2852 if (ApiStatus
!= NERR_Success
)
2854 ERR("BuildUserInfoBuffer failed (ApiStatus %lu)\n", ApiStatus
);
2858 SamCloseHandle(UserHandle
);
2861 EnumContext
->Index
++;
2867 if (ApiStatus
== NERR_Success
&& EnumContext
->Index
< EnumContext
->Count
)
2868 ApiStatus
= ERROR_MORE_DATA
;
2870 if (EnumContext
!= NULL
)
2871 *totalentries
= EnumContext
->Count
;
2873 if (resume_handle
== NULL
|| ApiStatus
!= ERROR_MORE_DATA
)
2875 if (EnumContext
!= NULL
)
2877 if (EnumContext
->BuiltinDomainHandle
!= NULL
)
2878 SamCloseHandle(EnumContext
->BuiltinDomainHandle
);
2880 if (EnumContext
->AccountDomainHandle
!= NULL
)
2881 SamCloseHandle(EnumContext
->AccountDomainHandle
);
2883 if (EnumContext
->ServerHandle
!= NULL
)
2884 SamCloseHandle(EnumContext
->ServerHandle
);
2886 if (EnumContext
->Buffer
!= NULL
)
2888 for (i
= 0; i
< EnumContext
->Count
; i
++)
2890 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
2893 SamFreeMemory(EnumContext
->Buffer
);
2896 NetApiBufferFree(EnumContext
);
2901 if (UserHandle
!= NULL
)
2902 SamCloseHandle(UserHandle
);
2904 if (resume_handle
!= NULL
)
2905 *resume_handle
= (DWORD_PTR
)EnumContext
;
2907 *bufptr
= (LPBYTE
)Buffer
;
2909 TRACE("return %lu\n", ApiStatus
);
2915 /************************************************************
2916 * NetUserGetGroups (NETAPI32.@)
2920 NetUserGetGroups(LPCWSTR servername
,
2925 LPDWORD entriesread
,
2926 LPDWORD totalentries
)
2928 UNICODE_STRING ServerName
;
2929 UNICODE_STRING UserName
;
2930 SAM_HANDLE ServerHandle
= NULL
;
2931 SAM_HANDLE AccountDomainHandle
= NULL
;
2932 SAM_HANDLE UserHandle
= NULL
;
2933 PSID AccountDomainSid
= NULL
;
2934 PULONG RelativeIds
= NULL
;
2935 PSID_NAME_USE Use
= NULL
;
2936 PGROUP_MEMBERSHIP GroupMembership
= NULL
;
2939 NET_API_STATUS ApiStatus
= NERR_Success
;
2940 NTSTATUS Status
= STATUS_SUCCESS
;
2942 TRACE("%s %s %d %p %d %p %p stub\n", debugstr_w(servername
),
2943 debugstr_w(username
), level
, bufptr
, prefixmaxlen
, entriesread
,
2946 if (servername
!= NULL
)
2947 RtlInitUnicodeString(&ServerName
, servername
);
2949 RtlInitUnicodeString(&UserName
, username
);
2951 /* Connect to the SAM Server */
2952 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2954 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2956 if (!NT_SUCCESS(Status
))
2958 ERR("SamConnect failed (Status %08lx)\n", Status
);
2959 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2963 /* Get the Account Domain SID */
2964 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
2966 if (!NT_SUCCESS(Status
))
2968 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
2969 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2973 /* Open the Account Domain */
2974 Status
= SamOpenDomain(ServerHandle
,
2975 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2977 &AccountDomainHandle
);
2978 if (!NT_SUCCESS(Status
))
2980 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2981 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2985 /* Get the RID for the given user name */
2986 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2991 if (!NT_SUCCESS(Status
))
2993 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2994 if (Status
== STATUS_NONE_MAPPED
)
2995 ApiStatus
= NERR_UserNotFound
;
2997 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3001 /* Fail, if it is not a user account */
3002 if (Use
[0] != SidTypeUser
)
3004 ERR("Account is not a User!\n");
3005 ApiStatus
= NERR_UserNotFound
;
3009 /* Open the user object */
3010 Status
= SamOpenUser(AccountDomainHandle
,
3014 if (!NT_SUCCESS(Status
))
3016 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
3017 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3021 /* Get the group memberships of this user */
3022 Status
= SamGetGroupsForUser(UserHandle
,
3025 if (!NT_SUCCESS(Status
))
3027 ERR("SamGetGroupsForUser failed (Status %08lx)\n", Status
);
3028 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3032 /* If there is no group membership, we're done */
3033 if (GroupCount
== 0)
3035 ApiStatus
= NERR_Success
;
3042 if (GroupMembership
!= NULL
)
3043 SamFreeMemory(GroupMembership
);
3045 if (UserHandle
!= NULL
)
3046 SamCloseHandle(UserHandle
);
3048 if (RelativeIds
!= NULL
)
3049 SamFreeMemory(RelativeIds
);
3054 if (AccountDomainSid
!= NULL
)
3055 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
3057 if (AccountDomainHandle
!= NULL
)
3058 SamCloseHandle(AccountDomainHandle
);
3060 if (ServerHandle
!= NULL
)
3061 SamCloseHandle(ServerHandle
);
3063 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
3070 // *entriesread = Count;
3071 // *totalentries = Count;
3074 // *bufptr = (LPBYTE)Buffer;
3080 /************************************************************
3081 * NetUserGetInfo (NETAPI32.@)
3085 NetUserGetInfo(LPCWSTR servername
,
3090 UNICODE_STRING ServerName
;
3091 UNICODE_STRING UserName
;
3092 SAM_HANDLE ServerHandle
= NULL
;
3093 SAM_HANDLE AccountDomainHandle
= NULL
;
3094 SAM_HANDLE UserHandle
= NULL
;
3095 PULONG RelativeIds
= NULL
;
3096 PSID_NAME_USE Use
= NULL
;
3097 LPVOID Buffer
= NULL
;
3098 NET_API_STATUS ApiStatus
= NERR_Success
;
3099 NTSTATUS Status
= STATUS_SUCCESS
;
3101 TRACE("(%s, %s, %d, %p)\n", debugstr_w(servername
),
3102 debugstr_w(username
), level
, bufptr
);
3104 if (servername
!= NULL
)
3105 RtlInitUnicodeString(&ServerName
, servername
);
3107 RtlInitUnicodeString(&UserName
, username
);
3109 /* Connect to the SAM Server */
3110 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3112 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3114 if (!NT_SUCCESS(Status
))
3116 ERR("SamConnect failed (Status %08lx)\n", Status
);
3117 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3121 /* Open the Account Domain */
3122 Status
= OpenAccountDomain(ServerHandle
,
3123 (servername
!= NULL
) ? &ServerName
: NULL
,
3124 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
3125 &AccountDomainHandle
);
3126 if (!NT_SUCCESS(Status
))
3128 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3129 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3133 /* Get the RID for the given user name */
3134 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
3139 if (!NT_SUCCESS(Status
))
3141 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
3142 if (Status
== STATUS_NONE_MAPPED
)
3143 ApiStatus
= NERR_UserNotFound
;
3145 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3149 /* Check if the account is a user account */
3150 if (Use
[0] != SidTypeUser
)
3152 ERR("No user found!\n");
3153 ApiStatus
= NERR_UserNotFound
;
3157 TRACE("RID: %lu\n", RelativeIds
[0]);
3159 /* Open the user object */
3160 Status
= SamOpenUser(AccountDomainHandle
,
3161 READ_CONTROL
| USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
3164 if (!NT_SUCCESS(Status
))
3166 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
3167 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3171 ApiStatus
= BuildUserInfoBuffer(UserHandle
,
3175 if (ApiStatus
!= NERR_Success
)
3177 ERR("BuildUserInfoBuffer failed (ApiStatus %08lu)\n", ApiStatus
);
3182 if (UserHandle
!= NULL
)
3183 SamCloseHandle(UserHandle
);
3185 if (RelativeIds
!= NULL
)
3186 SamFreeMemory(RelativeIds
);
3191 if (AccountDomainHandle
!= NULL
)
3192 SamCloseHandle(AccountDomainHandle
);
3194 if (ServerHandle
!= NULL
)
3195 SamCloseHandle(ServerHandle
);
3197 *bufptr
= (LPBYTE
)Buffer
;
3203 /************************************************************
3204 * NetUserGetLocalGroups (NETAPI32.@)
3208 NetUserGetLocalGroups(LPCWSTR servername
,
3214 LPDWORD entriesread
,
3215 LPDWORD totalentries
)
3217 UNICODE_STRING ServerName
;
3218 UNICODE_STRING UserName
;
3219 SAM_HANDLE ServerHandle
= NULL
;
3220 SAM_HANDLE BuiltinDomainHandle
= NULL
;
3221 SAM_HANDLE AccountDomainHandle
= NULL
;
3222 PSID AccountDomainSid
= NULL
;
3223 PSID UserSid
= NULL
;
3224 PULONG RelativeIds
= NULL
;
3225 PSID_NAME_USE Use
= NULL
;
3226 ULONG BuiltinMemberCount
= 0;
3227 ULONG AccountMemberCount
= 0;
3228 PULONG BuiltinAliases
= NULL
;
3229 PULONG AccountAliases
= NULL
;
3230 PUNICODE_STRING BuiltinNames
= NULL
;
3231 PUNICODE_STRING AccountNames
= NULL
;
3232 PLOCALGROUP_USERS_INFO_0 Buffer
= NULL
;
3238 NET_API_STATUS ApiStatus
= NERR_Success
;
3239 NTSTATUS Status
= STATUS_SUCCESS
;
3241 TRACE("(%s, %s, %d, %08x, %p %d, %p, %p) stub!\n",
3242 debugstr_w(servername
), debugstr_w(username
), level
, flags
, bufptr
,
3243 prefmaxlen
, entriesread
, totalentries
);
3246 return ERROR_INVALID_LEVEL
;
3248 if (flags
& ~LG_INCLUDE_INDIRECT
)
3249 return ERROR_INVALID_PARAMETER
;
3251 if (flags
& LG_INCLUDE_INDIRECT
)
3253 WARN("The flag LG_INCLUDE_INDIRECT is not supported yet!\n");
3256 if (servername
!= NULL
)
3257 RtlInitUnicodeString(&ServerName
, servername
);
3259 RtlInitUnicodeString(&UserName
, username
);
3261 /* Connect to the SAM Server */
3262 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3264 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3266 if (!NT_SUCCESS(Status
))
3268 ERR("SamConnect failed (Status %08lx)\n", Status
);
3269 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3273 /* Open the Builtin Domain */
3274 Status
= OpenBuiltinDomain(ServerHandle
,
3275 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
3276 &BuiltinDomainHandle
);
3277 if (!NT_SUCCESS(Status
))
3279 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
3280 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3284 /* Get the Account Domain SID */
3285 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
3287 if (!NT_SUCCESS(Status
))
3289 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
3290 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3294 /* Open the Account Domain */
3295 Status
= SamOpenDomain(ServerHandle
,
3296 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
3298 &AccountDomainHandle
);
3299 if (!NT_SUCCESS(Status
))
3301 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3302 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3306 /* Get the RID for the given user name */
3307 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
3312 if (!NT_SUCCESS(Status
))
3314 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
3315 if (Status
== STATUS_NONE_MAPPED
)
3316 ApiStatus
= NERR_UserNotFound
;
3318 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3322 /* Fail, if it is not a user account */
3323 if (Use
[0] != SidTypeUser
)
3325 ERR("Account is not a User!\n");
3326 ApiStatus
= NERR_UserNotFound
;
3330 /* Build the User SID from the Account Domain SID and the users RID */
3331 ApiStatus
= BuildSidFromSidAndRid(AccountDomainSid
,
3334 if (ApiStatus
!= NERR_Success
)
3336 ERR("BuildSidFromSidAndRid failed!\n");
3340 /* Get alias memberships in the Builtin Domain */
3341 Status
= SamGetAliasMembership(BuiltinDomainHandle
,
3344 &BuiltinMemberCount
,
3346 if (!NT_SUCCESS(Status
))
3348 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
3349 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3353 if (BuiltinMemberCount
> 0)
3355 /* Get the Names of the builtin alias members */
3356 Status
= SamLookupIdsInDomain(BuiltinDomainHandle
,
3361 if (!NT_SUCCESS(Status
))
3363 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
3364 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3369 /* Get alias memberships in the Account Domain */
3370 Status
= SamGetAliasMembership(AccountDomainHandle
,
3373 &AccountMemberCount
,
3375 if (!NT_SUCCESS(Status
))
3377 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
3378 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3382 if (AccountMemberCount
> 0)
3384 /* Get the Names of the builtin alias members */
3385 Status
= SamLookupIdsInDomain(AccountDomainHandle
,
3390 if (!NT_SUCCESS(Status
))
3392 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
3393 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3398 /* Calculate the required buffer size */
3401 for (i
= 0; i
< BuiltinMemberCount
; i
++)
3403 if (BuiltinNames
[i
].Length
> 0)
3405 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3410 for (i
= 0; i
< AccountMemberCount
; i
++)
3412 if (AccountNames
[i
].Length
> 0)
3414 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3421 ApiStatus
= NERR_Success
;
3425 /* Allocate buffer */
3426 ApiStatus
= NetApiBufferAllocate(Size
, (LPVOID
*)&Buffer
);
3427 if (ApiStatus
!= NERR_Success
)
3430 ZeroMemory(Buffer
, Size
);
3432 StrPtr
= (LPWSTR
)((INT_PTR
)Buffer
+ Count
* sizeof(LOCALGROUP_USERS_INFO_0
));
3434 /* Copy data to the allocated buffer */
3436 for (i
= 0; i
< BuiltinMemberCount
; i
++)
3438 if (BuiltinNames
[i
].Length
> 0)
3441 BuiltinNames
[i
].Buffer
,
3442 BuiltinNames
[i
].Length
);
3443 Buffer
[Index
].lgrui0_name
= StrPtr
;
3445 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3450 for (i
= 0; i
< AccountMemberCount
; i
++)
3452 if (AccountNames
[i
].Length
> 0)
3455 AccountNames
[i
].Buffer
,
3456 AccountNames
[i
].Length
);
3457 Buffer
[Index
].lgrui0_name
= StrPtr
;
3459 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3465 if (AccountNames
!= NULL
)
3466 SamFreeMemory(AccountNames
);
3468 if (BuiltinNames
!= NULL
)
3469 SamFreeMemory(BuiltinNames
);
3471 if (AccountAliases
!= NULL
)
3472 SamFreeMemory(AccountAliases
);
3474 if (BuiltinAliases
!= NULL
)
3475 SamFreeMemory(BuiltinAliases
);
3477 if (RelativeIds
!= NULL
)
3478 SamFreeMemory(RelativeIds
);
3483 if (UserSid
!= NULL
)
3484 NetApiBufferFree(UserSid
);
3486 if (AccountDomainSid
!= NULL
)
3487 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
3489 if (AccountDomainHandle
!= NULL
)
3490 SamCloseHandle(AccountDomainHandle
);
3492 if (BuiltinDomainHandle
!= NULL
)
3493 SamCloseHandle(BuiltinDomainHandle
);
3495 if (ServerHandle
!= NULL
)
3496 SamCloseHandle(ServerHandle
);
3498 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
3505 *entriesread
= Count
;
3506 *totalentries
= Count
;
3509 *bufptr
= (LPBYTE
)Buffer
;
3515 /******************************************************************************
3516 * NetUserModalsGet (NETAPI32.@)
3518 * Retrieves global information for all users and global groups in the security
3522 * servername [I] Specifies the DNS or the NetBIOS name of the remote server
3523 * on which the function is to execute.
3524 * level [I] Information level of the data.
3525 * 0 Return global passwords parameters. bufptr points to a
3526 * USER_MODALS_INFO_0 struct.
3527 * 1 Return logon server and domain controller information. bufptr
3528 * points to a USER_MODALS_INFO_1 struct.
3529 * 2 Return domain name and identifier. bufptr points to a
3530 * USER_MODALS_INFO_2 struct.
3531 * 3 Return lockout information. bufptr points to a USER_MODALS_INFO_3
3533 * bufptr [O] Buffer that receives the data.
3536 * Success: NERR_Success.
3538 * ERROR_ACCESS_DENIED - the user does not have access to the info.
3539 * NERR_InvalidComputer - computer name is invalid.
3543 NetUserModalsGet(LPCWSTR servername
,
3547 UNICODE_STRING ServerName
;
3548 SAM_HANDLE ServerHandle
= NULL
;
3549 SAM_HANDLE DomainHandle
= NULL
;
3550 PSID DomainSid
= NULL
;
3551 PDOMAIN_PASSWORD_INFORMATION PasswordInfo
= NULL
;
3552 PDOMAIN_LOGOFF_INFORMATION LogoffInfo
= NULL
;
3553 PDOMAIN_SERVER_ROLE_INFORMATION ServerRoleInfo
= NULL
;
3554 PDOMAIN_REPLICATION_INFORMATION ReplicationInfo
= NULL
;
3555 PDOMAIN_NAME_INFORMATION NameInfo
= NULL
;
3556 PDOMAIN_LOCKOUT_INFORMATION LockoutInfo
= NULL
;
3557 ULONG DesiredAccess
;
3559 PUSER_MODALS_INFO_0 umi0
;
3560 PUSER_MODALS_INFO_1 umi1
;
3561 PUSER_MODALS_INFO_2 umi2
;
3562 PUSER_MODALS_INFO_3 umi3
;
3563 NET_API_STATUS ApiStatus
= NERR_Success
;
3564 NTSTATUS Status
= STATUS_SUCCESS
;
3566 TRACE("(%s %d %p)\n", debugstr_w(servername
), level
, bufptr
);
3570 if (servername
!= NULL
)
3571 RtlInitUnicodeString(&ServerName
, servername
);
3573 /* Connect to the SAM Server */
3574 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3576 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3578 if (!NT_SUCCESS(Status
))
3580 ERR("SamConnect failed (Status %08lx)\n", Status
);
3581 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3585 /* Get the Account Domain SID */
3586 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
3588 if (!NT_SUCCESS(Status
))
3590 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
3591 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3598 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
| DOMAIN_READ_PASSWORD_PARAMETERS
;
3602 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
3606 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
3610 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
3614 ApiStatus
= ERROR_INVALID_LEVEL
;
3618 /* Open the Account Domain */
3619 Status
= SamOpenDomain(ServerHandle
,
3623 if (!NT_SUCCESS(Status
))
3625 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3626 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3633 /* return global passwords parameters */
3634 Status
= SamQueryInformationDomain(DomainHandle
,
3635 DomainPasswordInformation
,
3636 (PVOID
*)&PasswordInfo
);
3637 if (!NT_SUCCESS(Status
))
3639 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3643 Status
= SamQueryInformationDomain(DomainHandle
,
3644 DomainLogoffInformation
,
3645 (PVOID
*)&LogoffInfo
);
3646 if (!NT_SUCCESS(Status
))
3648 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3652 BufferSize
= sizeof(USER_MODALS_INFO_0
);
3656 /* return logon server and domain controller info */
3657 Status
= SamQueryInformationDomain(DomainHandle
,
3658 DomainServerRoleInformation
,
3659 (PVOID
*)&ServerRoleInfo
);
3660 if (!NT_SUCCESS(Status
))
3662 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3666 Status
= SamQueryInformationDomain(DomainHandle
,
3667 DomainReplicationInformation
,
3668 (PVOID
*)&ReplicationInfo
);
3669 if (!NT_SUCCESS(Status
))
3671 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3675 BufferSize
= sizeof(USER_MODALS_INFO_1
) +
3676 ReplicationInfo
->ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
);
3680 /* return domain name and identifier */
3681 Status
= SamQueryInformationDomain(DomainHandle
,
3682 DomainNameInformation
,
3684 if (!NT_SUCCESS(Status
))
3686 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3690 BufferSize
= sizeof( USER_MODALS_INFO_2
) +
3691 NameInfo
->DomainName
.Length
+ sizeof(WCHAR
) +
3692 RtlLengthSid(DomainSid
);
3696 /* return lockout information */
3697 Status
= SamQueryInformationDomain(DomainHandle
,
3698 DomainLockoutInformation
,
3699 (PVOID
*)&LockoutInfo
);
3700 if (!NT_SUCCESS(Status
))
3702 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3706 BufferSize
= sizeof(USER_MODALS_INFO_3
);
3710 TRACE("Invalid level %d is specified\n", level
);
3711 ApiStatus
= ERROR_INVALID_LEVEL
;
3716 ApiStatus
= NetApiBufferAllocate(BufferSize
,
3718 if (ApiStatus
!= NERR_Success
)
3720 WARN("NetApiBufferAllocate() failed\n");
3727 umi0
= (PUSER_MODALS_INFO_0
)*bufptr
;
3729 umi0
->usrmod0_min_passwd_len
= PasswordInfo
->MinPasswordLength
;
3730 umi0
->usrmod0_max_passwd_age
= (ULONG
)(PasswordInfo
->MaxPasswordAge
.QuadPart
/ 10000000);
3731 umi0
->usrmod0_min_passwd_age
=
3732 DeltaTimeToSeconds(PasswordInfo
->MinPasswordAge
);
3733 umi0
->usrmod0_force_logoff
=
3734 DeltaTimeToSeconds(LogoffInfo
->ForceLogoff
);
3735 umi0
->usrmod0_password_hist_len
= PasswordInfo
->PasswordHistoryLength
;
3739 umi1
= (PUSER_MODALS_INFO_1
)*bufptr
;
3741 switch (ServerRoleInfo
->DomainServerRole
)
3744 umi1
->usrmod1_role
= UAS_ROLE_STANDALONE
;
3745 umi1
->usrmod1_role
= UAS_ROLE_MEMBER
;
3747 case DomainServerRolePrimary
:
3748 umi1
->usrmod1_role
= UAS_ROLE_PRIMARY
;
3751 case DomainServerRoleBackup
:
3752 umi1
->usrmod1_role
= UAS_ROLE_BACKUP
;
3756 ApiStatus
= NERR_InternalError
;
3760 umi1
->usrmod1_primary
= (LPWSTR
)(*bufptr
+ sizeof(USER_MODALS_INFO_1
));
3761 RtlCopyMemory(umi1
->usrmod1_primary
,
3762 ReplicationInfo
->ReplicaSourceNodeName
.Buffer
,
3763 ReplicationInfo
->ReplicaSourceNodeName
.Length
);
3764 umi1
->usrmod1_primary
[ReplicationInfo
->ReplicaSourceNodeName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
3768 umi2
= (PUSER_MODALS_INFO_2
)*bufptr
;
3770 umi2
->usrmod2_domain_name
= (LPWSTR
)(*bufptr
+ sizeof(USER_MODALS_INFO_2
));
3771 RtlCopyMemory(umi2
->usrmod2_domain_name
,
3772 NameInfo
->DomainName
.Buffer
,
3773 NameInfo
->DomainName
.Length
);
3774 umi2
->usrmod2_domain_name
[NameInfo
->DomainName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
3776 umi2
->usrmod2_domain_id
= *bufptr
+
3777 sizeof(USER_MODALS_INFO_2
) +
3778 NameInfo
->DomainName
.Length
+ sizeof(WCHAR
);
3779 RtlCopyMemory(umi2
->usrmod2_domain_id
,
3781 RtlLengthSid(DomainSid
));
3785 umi3
= (PUSER_MODALS_INFO_3
)*bufptr
;
3786 umi3
->usrmod3_lockout_duration
=
3787 DeltaTimeToSeconds(LockoutInfo
->LockoutDuration
);
3788 umi3
->usrmod3_lockout_observation_window
=
3789 DeltaTimeToSeconds(LockoutInfo
->LockoutObservationWindow
);
3790 umi3
->usrmod3_lockout_threshold
= LockoutInfo
->LockoutThreshold
;
3795 if (LockoutInfo
!= NULL
)
3796 SamFreeMemory(LockoutInfo
);
3798 if (NameInfo
!= NULL
)
3799 SamFreeMemory(NameInfo
);
3801 if (ReplicationInfo
!= NULL
)
3802 SamFreeMemory(ReplicationInfo
);
3804 if (ServerRoleInfo
!= NULL
)
3805 SamFreeMemory(ServerRoleInfo
);
3807 if (LogoffInfo
!= NULL
)
3808 SamFreeMemory(LogoffInfo
);
3810 if (PasswordInfo
!= NULL
)
3811 SamFreeMemory(PasswordInfo
);
3813 if (DomainSid
!= NULL
)
3814 RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid
);
3816 if (DomainHandle
!= NULL
)
3817 SamCloseHandle(DomainHandle
);
3819 if (ServerHandle
!= NULL
)
3820 SamCloseHandle(ServerHandle
);
3826 /******************************************************************************
3827 * NetUserModalsSet (NETAPI32.@)
3831 NetUserModalsSet(IN LPCWSTR servername
,
3834 OUT LPDWORD parm_err
)
3836 FIXME("(%s %d %p %p)\n", debugstr_w(servername
), level
, buf
, parm_err
);
3837 return ERROR_ACCESS_DENIED
;
3841 /******************************************************************************
3842 * NetUserSetGroups (NETAPI32.@)
3846 NetUserSetGroups(LPCWSTR servername
,
3852 FIXME("(%s %s %lu %p %lu)\n",
3853 debugstr_w(servername
), debugstr_w(username
), level
, buf
, num_entries
);
3854 return ERROR_ACCESS_DENIED
;
3858 /******************************************************************************
3859 * NetUserSetInfo (NETAPI32.@)
3863 NetUserSetInfo(LPCWSTR servername
,
3869 UNICODE_STRING ServerName
;
3870 UNICODE_STRING UserName
;
3871 SAM_HANDLE ServerHandle
= NULL
;
3872 SAM_HANDLE AccountDomainHandle
= NULL
;
3873 SAM_HANDLE UserHandle
= NULL
;
3874 NET_API_STATUS ApiStatus
= NERR_Success
;
3875 NTSTATUS Status
= STATUS_SUCCESS
;
3877 TRACE("(%s %s %lu %p %p)\n",
3878 debugstr_w(servername
), debugstr_w(username
), level
, buf
, parm_err
);
3880 if (parm_err
!= NULL
)
3881 *parm_err
= PARM_ERROR_NONE
;
3883 /* Check the info level */
3915 return ERROR_INVALID_LEVEL
;
3918 if (servername
!= NULL
)
3919 RtlInitUnicodeString(&ServerName
, servername
);
3921 RtlInitUnicodeString(&UserName
, username
);
3923 /* Connect to the SAM Server */
3924 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3926 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3928 if (!NT_SUCCESS(Status
))
3930 ERR("SamConnect failed (Status %08lx)\n", Status
);
3931 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3935 /* Open the Account Domain */
3936 Status
= OpenAccountDomain(ServerHandle
,
3937 (servername
!= NULL
) ? &ServerName
: NULL
,
3938 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
| DOMAIN_READ_PASSWORD_PARAMETERS
,
3939 &AccountDomainHandle
);
3940 if (!NT_SUCCESS(Status
))
3942 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3943 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3947 /* Open the User Account */
3948 ApiStatus
= OpenUserByName(AccountDomainHandle
,
3952 if (ApiStatus
!= NERR_Success
)
3954 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
3958 /* Set user information */
3959 ApiStatus
= SetUserInfo(UserHandle
,
3962 if (ApiStatus
!= NERR_Success
)
3964 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
3968 if (UserHandle
!= NULL
)
3969 SamCloseHandle(UserHandle
);
3971 if (AccountDomainHandle
!= NULL
)
3972 SamCloseHandle(AccountDomainHandle
);
3974 if (ServerHandle
!= NULL
)
3975 SamCloseHandle(ServerHandle
);