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 GetUserDacl(IN SAM_HANDLE UserHandle
,
258 PSECURITY_DESCRIPTOR SecurityDescriptor
= NULL
;
263 ACL_SIZE_INFORMATION AclSize
;
264 NET_API_STATUS ApiStatus
;
267 TRACE("(%p %p)\n", UserHandle
, Dacl
);
271 Status
= SamQuerySecurityObject(UserHandle
,
272 DACL_SECURITY_INFORMATION
,
273 &SecurityDescriptor
);
274 if (!NT_SUCCESS(Status
))
276 TRACE("SamQuerySecurityObject() failed (Status 0x%08lx)\n", Status
);
277 ApiStatus
= NetpNtStatusToApiStatus(Status
);
281 Status
= RtlGetDaclSecurityDescriptor(SecurityDescriptor
,
285 if (!NT_SUCCESS(Status
))
287 TRACE("RtlGetDaclSecurityDescriptor() failed (Status 0x%08lx)\n", Status
);
288 ApiStatus
= NERR_InternalError
;
292 if (Present
== FALSE
)
294 TRACE("No DACL present\n");
295 ApiStatus
= NERR_Success
;
299 Status
= RtlQueryInformationAcl(SamDacl
,
303 if (!NT_SUCCESS(Status
))
305 TRACE("RtlQueryInformationAcl() failed (Status 0x%08lx)\n", Status
);
306 ApiStatus
= NERR_InternalError
;
310 LocalDacl
= HeapAlloc(GetProcessHeap(), 0, AclSize
.AclBytesInUse
);
311 if (LocalDacl
== NULL
)
313 TRACE("Memory allocation failed\n");
314 ApiStatus
= ERROR_NOT_ENOUGH_MEMORY
;
318 RtlCopyMemory(LocalDacl
, SamDacl
, AclSize
.AclBytesInUse
);
322 ApiStatus
= NERR_Success
;
325 if (SecurityDescriptor
!= NULL
)
326 SamFreeMemory(SecurityDescriptor
);
328 TRACE("done (ApiStatus: 0x%08lx)\n", ApiStatus
);
336 FreeUserInfo(PUSER_ALL_INFORMATION UserInfo
)
338 if (UserInfo
->UserName
.Buffer
!= NULL
)
339 SamFreeMemory(UserInfo
->UserName
.Buffer
);
341 if (UserInfo
->FullName
.Buffer
!= NULL
)
342 SamFreeMemory(UserInfo
->FullName
.Buffer
);
344 if (UserInfo
->HomeDirectory
.Buffer
!= NULL
)
345 SamFreeMemory(UserInfo
->HomeDirectory
.Buffer
);
347 if (UserInfo
->HomeDirectoryDrive
.Buffer
!= NULL
)
348 SamFreeMemory(UserInfo
->HomeDirectoryDrive
.Buffer
);
350 if (UserInfo
->ScriptPath
.Buffer
!= NULL
)
351 SamFreeMemory(UserInfo
->ScriptPath
.Buffer
);
353 if (UserInfo
->ProfilePath
.Buffer
!= NULL
)
354 SamFreeMemory(UserInfo
->ProfilePath
.Buffer
);
356 if (UserInfo
->AdminComment
.Buffer
!= NULL
)
357 SamFreeMemory(UserInfo
->AdminComment
.Buffer
);
359 if (UserInfo
->WorkStations
.Buffer
!= NULL
)
360 SamFreeMemory(UserInfo
->WorkStations
.Buffer
);
362 if (UserInfo
->UserComment
.Buffer
!= NULL
)
363 SamFreeMemory(UserInfo
->UserComment
.Buffer
);
365 if (UserInfo
->Parameters
.Buffer
!= NULL
)
366 SamFreeMemory(UserInfo
->Parameters
.Buffer
);
368 if (UserInfo
->PrivateData
.Buffer
!= NULL
)
369 SamFreeMemory(UserInfo
->PrivateData
.Buffer
);
371 if (UserInfo
->LogonHours
.LogonHours
!= NULL
)
372 SamFreeMemory(UserInfo
->LogonHours
.LogonHours
);
374 SamFreeMemory(UserInfo
);
380 BuildUserInfoBuffer(SAM_HANDLE UserHandle
,
385 UNICODE_STRING LogonServer
= RTL_CONSTANT_STRING(L
"\\\\*");
386 PUSER_ALL_INFORMATION UserInfo
= NULL
;
387 LPVOID LocalBuffer
= NULL
;
389 PUSER_INFO_0 UserInfo0
;
390 PUSER_INFO_1 UserInfo1
;
391 PUSER_INFO_2 UserInfo2
;
392 PUSER_INFO_3 UserInfo3
;
393 PUSER_INFO_4 UserInfo4
;
394 PUSER_INFO_10 UserInfo10
;
395 PUSER_INFO_11 UserInfo11
;
396 PUSER_INFO_20 UserInfo20
;
397 PUSER_INFO_23 UserInfo23
;
401 NET_API_STATUS ApiStatus
= NERR_Success
;
405 Status
= SamQueryInformationUser(UserHandle
,
408 if (!NT_SUCCESS(Status
))
410 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
411 ApiStatus
= NetpNtStatusToApiStatus(Status
);
415 if ((level
== 1) || (level
== 2) || (level
== 3) ||
416 (level
== 4) || (level
== 20) || (level
== 23))
418 ApiStatus
= GetUserDacl(UserHandle
, &Dacl
);
419 if (ApiStatus
!= NERR_Success
)
426 Size
= sizeof(USER_INFO_0
) +
427 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
431 Size
= sizeof(USER_INFO_1
) +
432 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
434 if (UserInfo
->HomeDirectory
.Length
> 0)
435 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
437 if (UserInfo
->AdminComment
.Length
> 0)
438 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
440 if (UserInfo
->ScriptPath
.Length
> 0)
441 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
445 Size
= sizeof(USER_INFO_2
) +
446 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
448 if (UserInfo
->HomeDirectory
.Length
> 0)
449 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
451 if (UserInfo
->AdminComment
.Length
> 0)
452 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
454 if (UserInfo
->ScriptPath
.Length
> 0)
455 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
457 if (UserInfo
->FullName
.Length
> 0)
458 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
460 if (UserInfo
->UserComment
.Length
> 0)
461 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
463 if (UserInfo
->Parameters
.Length
> 0)
464 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
466 if (UserInfo
->WorkStations
.Length
> 0)
467 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
469 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
470 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
472 if (LogonServer
.Length
> 0)
473 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
477 Size
= sizeof(USER_INFO_3
) +
478 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
480 if (UserInfo
->HomeDirectory
.Length
> 0)
481 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
483 if (UserInfo
->AdminComment
.Length
> 0)
484 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
486 if (UserInfo
->ScriptPath
.Length
> 0)
487 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
489 if (UserInfo
->FullName
.Length
> 0)
490 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
492 if (UserInfo
->UserComment
.Length
> 0)
493 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
495 if (UserInfo
->Parameters
.Length
> 0)
496 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
498 if (UserInfo
->WorkStations
.Length
> 0)
499 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
501 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
502 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
504 if (LogonServer
.Length
> 0)
505 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
507 if (UserInfo
->ProfilePath
.Length
> 0)
508 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
510 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
511 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
515 Size
= sizeof(USER_INFO_4
) +
516 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
518 if (UserInfo
->HomeDirectory
.Length
> 0)
519 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
521 if (UserInfo
->AdminComment
.Length
> 0)
522 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
524 if (UserInfo
->ScriptPath
.Length
> 0)
525 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
527 if (UserInfo
->FullName
.Length
> 0)
528 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
530 if (UserInfo
->UserComment
.Length
> 0)
531 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
533 if (UserInfo
->Parameters
.Length
> 0)
534 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
536 if (UserInfo
->WorkStations
.Length
> 0)
537 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
539 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
540 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
542 if (LogonServer
.Length
> 0)
543 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
545 /* FIXME: usri4_user_sid */
547 if (UserInfo
->ProfilePath
.Length
> 0)
548 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
550 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
551 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
555 Size
= sizeof(USER_INFO_10
) +
556 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
558 if (UserInfo
->AdminComment
.Length
> 0)
559 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
561 if (UserInfo
->UserComment
.Length
> 0)
562 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
564 if (UserInfo
->FullName
.Length
> 0)
565 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
569 Size
= sizeof(USER_INFO_11
) +
570 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
572 if (UserInfo
->AdminComment
.Length
> 0)
573 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
575 if (UserInfo
->UserComment
.Length
> 0)
576 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
578 if (UserInfo
->FullName
.Length
> 0)
579 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
581 if (UserInfo
->HomeDirectory
.Length
> 0)
582 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
584 if (UserInfo
->Parameters
.Length
> 0)
585 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
587 if (LogonServer
.Length
> 0)
588 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
590 if (UserInfo
->WorkStations
.Length
> 0)
591 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
593 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
594 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
598 Size
= sizeof(USER_INFO_20
) +
599 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
601 if (UserInfo
->FullName
.Length
> 0)
602 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
604 if (UserInfo
->AdminComment
.Length
> 0)
605 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
609 Size
= sizeof(USER_INFO_23
) +
610 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
612 if (UserInfo
->FullName
.Length
> 0)
613 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
615 if (UserInfo
->AdminComment
.Length
> 0)
616 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
618 /* FIXME: usri23_user_sid */
622 ApiStatus
= ERROR_INVALID_LEVEL
;
626 ApiStatus
= NetApiBufferAllocate(Size
, &LocalBuffer
);
627 if (ApiStatus
!= NERR_Success
)
630 ZeroMemory(LocalBuffer
, Size
);
635 UserInfo0
= (PUSER_INFO_0
)LocalBuffer
;
637 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo0
+ sizeof(USER_INFO_0
));
638 UserInfo0
->usri0_name
= Ptr
;
640 memcpy(UserInfo0
->usri0_name
,
641 UserInfo
->UserName
.Buffer
,
642 UserInfo
->UserName
.Length
);
643 UserInfo0
->usri0_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
647 UserInfo1
= (PUSER_INFO_1
)LocalBuffer
;
649 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo1
+ sizeof(USER_INFO_1
));
651 UserInfo1
->usri1_name
= Ptr
;
653 memcpy(UserInfo1
->usri1_name
,
654 UserInfo
->UserName
.Buffer
,
655 UserInfo
->UserName
.Length
);
656 UserInfo1
->usri1_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
658 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
660 UserInfo1
->usri1_password
= NULL
;
662 UserInfo1
->usri1_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
664 /* FIXME: UserInfo1->usri1_priv */
666 if (UserInfo
->HomeDirectory
.Length
> 0)
668 UserInfo1
->usri1_home_dir
= Ptr
;
670 memcpy(UserInfo1
->usri1_home_dir
,
671 UserInfo
->HomeDirectory
.Buffer
,
672 UserInfo
->HomeDirectory
.Length
);
673 UserInfo1
->usri1_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
675 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
678 if (UserInfo
->AdminComment
.Length
> 0)
680 UserInfo1
->usri1_comment
= Ptr
;
682 memcpy(UserInfo1
->usri1_comment
,
683 UserInfo
->AdminComment
.Buffer
,
684 UserInfo
->AdminComment
.Length
);
685 UserInfo1
->usri1_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
687 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
690 UserInfo1
->usri1_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
693 if (UserInfo
->ScriptPath
.Length
> 0)
695 UserInfo1
->usri1_script_path
= Ptr
;
697 memcpy(UserInfo1
->usri1_script_path
,
698 UserInfo
->ScriptPath
.Buffer
,
699 UserInfo
->ScriptPath
.Length
);
700 UserInfo1
->usri1_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
705 UserInfo2
= (PUSER_INFO_2
)LocalBuffer
;
707 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo2
+ sizeof(USER_INFO_2
));
709 UserInfo2
->usri2_name
= Ptr
;
711 memcpy(UserInfo2
->usri2_name
,
712 UserInfo
->UserName
.Buffer
,
713 UserInfo
->UserName
.Length
);
714 UserInfo2
->usri2_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
716 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
718 UserInfo2
->usri2_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
720 /* FIXME: usri2_priv */
722 if (UserInfo
->HomeDirectory
.Length
> 0)
724 UserInfo2
->usri2_home_dir
= Ptr
;
726 memcpy(UserInfo2
->usri2_home_dir
,
727 UserInfo
->HomeDirectory
.Buffer
,
728 UserInfo
->HomeDirectory
.Length
);
729 UserInfo2
->usri2_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
731 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
734 if (UserInfo
->AdminComment
.Length
> 0)
736 UserInfo2
->usri2_comment
= Ptr
;
738 memcpy(UserInfo2
->usri2_comment
,
739 UserInfo
->AdminComment
.Buffer
,
740 UserInfo
->AdminComment
.Length
);
741 UserInfo2
->usri2_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
743 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
746 UserInfo2
->usri2_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
749 if (UserInfo
->ScriptPath
.Length
> 0)
751 UserInfo2
->usri2_script_path
= Ptr
;
753 memcpy(UserInfo2
->usri2_script_path
,
754 UserInfo
->ScriptPath
.Buffer
,
755 UserInfo
->ScriptPath
.Length
);
756 UserInfo2
->usri2_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
758 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
761 /* FIXME: usri2_auth_flags */
763 if (UserInfo
->FullName
.Length
> 0)
765 UserInfo2
->usri2_full_name
= Ptr
;
767 memcpy(UserInfo2
->usri2_full_name
,
768 UserInfo
->FullName
.Buffer
,
769 UserInfo
->FullName
.Length
);
770 UserInfo2
->usri2_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
772 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
775 if (UserInfo
->UserComment
.Length
> 0)
777 UserInfo2
->usri2_usr_comment
= Ptr
;
779 memcpy(UserInfo2
->usri2_usr_comment
,
780 UserInfo
->UserComment
.Buffer
,
781 UserInfo
->UserComment
.Length
);
782 UserInfo2
->usri2_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
784 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
787 if (UserInfo
->Parameters
.Length
> 0)
789 UserInfo2
->usri2_parms
= Ptr
;
791 memcpy(UserInfo2
->usri2_parms
,
792 UserInfo
->Parameters
.Buffer
,
793 UserInfo
->Parameters
.Length
);
794 UserInfo2
->usri2_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
796 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
799 if (UserInfo
->WorkStations
.Length
> 0)
801 UserInfo2
->usri2_workstations
= Ptr
;
803 memcpy(UserInfo2
->usri2_workstations
,
804 UserInfo
->WorkStations
.Buffer
,
805 UserInfo
->WorkStations
.Length
);
806 UserInfo2
->usri2_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
808 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
811 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
812 &UserInfo2
->usri2_last_logon
);
814 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
815 &UserInfo2
->usri2_last_logoff
);
817 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
818 &UserInfo2
->usri2_acct_expires
);
820 UserInfo2
->usri2_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
821 UserInfo2
->usri2_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
823 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
825 UserInfo2
->usri2_logon_hours
= (PVOID
)Ptr
;
827 memcpy(UserInfo2
->usri2_logon_hours
,
828 UserInfo
->LogonHours
.LogonHours
,
829 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
831 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
834 UserInfo2
->usri2_bad_pw_count
= UserInfo
->BadPasswordCount
;
835 UserInfo2
->usri2_num_logons
= UserInfo
->LogonCount
;
837 if (LogonServer
.Length
> 0)
839 UserInfo2
->usri2_logon_server
= Ptr
;
841 memcpy(UserInfo2
->usri2_logon_server
,
844 UserInfo2
->usri2_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
846 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
849 UserInfo2
->usri2_country_code
= UserInfo
->CountryCode
;
850 UserInfo2
->usri2_code_page
= UserInfo
->CodePage
;
854 UserInfo3
= (PUSER_INFO_3
)LocalBuffer
;
856 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo3
+ sizeof(USER_INFO_3
));
858 UserInfo3
->usri3_name
= Ptr
;
860 memcpy(UserInfo3
->usri3_name
,
861 UserInfo
->UserName
.Buffer
,
862 UserInfo
->UserName
.Length
);
863 UserInfo3
->usri3_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
865 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
867 UserInfo3
->usri3_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
869 /* FIXME: usri3_priv */
871 if (UserInfo
->HomeDirectory
.Length
> 0)
873 UserInfo3
->usri3_home_dir
= Ptr
;
875 memcpy(UserInfo3
->usri3_home_dir
,
876 UserInfo
->HomeDirectory
.Buffer
,
877 UserInfo
->HomeDirectory
.Length
);
878 UserInfo3
->usri3_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
880 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
883 if (UserInfo
->AdminComment
.Length
> 0)
885 UserInfo3
->usri3_comment
= Ptr
;
887 memcpy(UserInfo3
->usri3_comment
,
888 UserInfo
->AdminComment
.Buffer
,
889 UserInfo
->AdminComment
.Length
);
890 UserInfo3
->usri3_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
892 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
895 UserInfo3
->usri3_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
898 if (UserInfo
->ScriptPath
.Length
> 0)
900 UserInfo3
->usri3_script_path
= Ptr
;
902 memcpy(UserInfo3
->usri3_script_path
,
903 UserInfo
->ScriptPath
.Buffer
,
904 UserInfo
->ScriptPath
.Length
);
905 UserInfo3
->usri3_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
907 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
910 /* FIXME: usri3_auth_flags */
912 if (UserInfo
->FullName
.Length
> 0)
914 UserInfo3
->usri3_full_name
= Ptr
;
916 memcpy(UserInfo3
->usri3_full_name
,
917 UserInfo
->FullName
.Buffer
,
918 UserInfo
->FullName
.Length
);
919 UserInfo3
->usri3_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
921 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
924 if (UserInfo
->UserComment
.Length
> 0)
926 UserInfo3
->usri3_usr_comment
= Ptr
;
928 memcpy(UserInfo3
->usri3_usr_comment
,
929 UserInfo
->UserComment
.Buffer
,
930 UserInfo
->UserComment
.Length
);
931 UserInfo3
->usri3_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
933 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
936 if (UserInfo
->Parameters
.Length
> 0)
938 UserInfo3
->usri3_parms
= Ptr
;
940 memcpy(UserInfo3
->usri3_parms
,
941 UserInfo
->Parameters
.Buffer
,
942 UserInfo
->Parameters
.Length
);
943 UserInfo3
->usri3_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
945 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
948 if (UserInfo
->WorkStations
.Length
> 0)
950 UserInfo3
->usri3_workstations
= Ptr
;
952 memcpy(UserInfo3
->usri3_workstations
,
953 UserInfo
->WorkStations
.Buffer
,
954 UserInfo
->WorkStations
.Length
);
955 UserInfo3
->usri3_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
957 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
960 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
961 &UserInfo3
->usri3_last_logon
);
963 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
964 &UserInfo3
->usri3_last_logoff
);
966 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
967 &UserInfo3
->usri3_acct_expires
);
969 UserInfo3
->usri3_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
970 UserInfo3
->usri3_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
972 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
974 UserInfo3
->usri3_logon_hours
= (PVOID
)Ptr
;
976 memcpy(UserInfo3
->usri3_logon_hours
,
977 UserInfo
->LogonHours
.LogonHours
,
978 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
980 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
983 UserInfo3
->usri3_bad_pw_count
= UserInfo
->BadPasswordCount
;
984 UserInfo3
->usri3_num_logons
= UserInfo
->LogonCount
;
986 if (LogonServer
.Length
> 0)
988 UserInfo3
->usri3_logon_server
= Ptr
;
990 memcpy(UserInfo3
->usri3_logon_server
,
993 UserInfo3
->usri3_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
995 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
998 UserInfo3
->usri3_country_code
= UserInfo
->CountryCode
;
999 UserInfo3
->usri3_code_page
= UserInfo
->CodePage
;
1000 UserInfo3
->usri3_user_id
= RelativeId
;
1001 UserInfo3
->usri3_primary_group_id
= UserInfo
->PrimaryGroupId
;
1003 if (UserInfo
->ProfilePath
.Length
> 0)
1005 UserInfo3
->usri3_profile
= Ptr
;
1007 memcpy(UserInfo3
->usri3_profile
,
1008 UserInfo
->ProfilePath
.Buffer
,
1009 UserInfo
->ProfilePath
.Length
);
1010 UserInfo3
->usri3_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1012 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
1015 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
1017 UserInfo3
->usri3_home_dir_drive
= Ptr
;
1019 memcpy(UserInfo3
->usri3_home_dir_drive
,
1020 UserInfo
->HomeDirectoryDrive
.Buffer
,
1021 UserInfo
->HomeDirectoryDrive
.Length
);
1022 UserInfo3
->usri3_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1024 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
1027 UserInfo3
->usri3_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
1031 UserInfo4
= (PUSER_INFO_4
)LocalBuffer
;
1033 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo4
+ sizeof(USER_INFO_4
));
1035 UserInfo4
->usri4_name
= Ptr
;
1037 memcpy(UserInfo4
->usri4_name
,
1038 UserInfo
->UserName
.Buffer
,
1039 UserInfo
->UserName
.Length
);
1040 UserInfo4
->usri4_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1042 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1044 UserInfo4
->usri4_password
= NULL
;
1045 UserInfo4
->usri4_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
1047 /* FIXME: usri4_priv */
1049 if (UserInfo
->HomeDirectory
.Length
> 0)
1051 UserInfo4
->usri4_home_dir
= Ptr
;
1053 memcpy(UserInfo4
->usri4_home_dir
,
1054 UserInfo
->HomeDirectory
.Buffer
,
1055 UserInfo
->HomeDirectory
.Length
);
1056 UserInfo4
->usri4_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1058 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
1061 if (UserInfo
->AdminComment
.Length
> 0)
1063 UserInfo4
->usri4_comment
= Ptr
;
1065 memcpy(UserInfo4
->usri4_comment
,
1066 UserInfo
->AdminComment
.Buffer
,
1067 UserInfo
->AdminComment
.Length
);
1068 UserInfo4
->usri4_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1070 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1073 UserInfo4
->usri4_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
1076 if (UserInfo
->ScriptPath
.Length
> 0)
1078 UserInfo4
->usri4_script_path
= Ptr
;
1080 memcpy(UserInfo4
->usri4_script_path
,
1081 UserInfo
->ScriptPath
.Buffer
,
1082 UserInfo
->ScriptPath
.Length
);
1083 UserInfo4
->usri4_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1085 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
1088 /* FIXME: usri4_auth_flags */
1090 if (UserInfo
->FullName
.Length
> 0)
1092 UserInfo4
->usri4_full_name
= Ptr
;
1094 memcpy(UserInfo4
->usri4_full_name
,
1095 UserInfo
->FullName
.Buffer
,
1096 UserInfo
->FullName
.Length
);
1097 UserInfo4
->usri4_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1099 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1102 if (UserInfo
->UserComment
.Length
> 0)
1104 UserInfo4
->usri4_usr_comment
= Ptr
;
1106 memcpy(UserInfo4
->usri4_usr_comment
,
1107 UserInfo
->UserComment
.Buffer
,
1108 UserInfo
->UserComment
.Length
);
1109 UserInfo4
->usri4_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1111 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1114 if (UserInfo
->Parameters
.Length
> 0)
1116 UserInfo4
->usri4_parms
= Ptr
;
1118 memcpy(UserInfo4
->usri4_parms
,
1119 UserInfo
->Parameters
.Buffer
,
1120 UserInfo
->Parameters
.Length
);
1121 UserInfo4
->usri4_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1123 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
1126 if (UserInfo
->WorkStations
.Length
> 0)
1128 UserInfo4
->usri4_workstations
= Ptr
;
1130 memcpy(UserInfo4
->usri4_workstations
,
1131 UserInfo
->WorkStations
.Buffer
,
1132 UserInfo
->WorkStations
.Length
);
1133 UserInfo4
->usri4_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1135 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
1138 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
1139 &UserInfo4
->usri4_last_logon
);
1141 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
1142 &UserInfo4
->usri4_last_logoff
);
1144 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
1145 &UserInfo4
->usri4_acct_expires
);
1147 UserInfo4
->usri4_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
1148 UserInfo4
->usri4_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
1150 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
1152 UserInfo4
->usri4_logon_hours
= (PVOID
)Ptr
;
1154 memcpy(UserInfo4
->usri4_logon_hours
,
1155 UserInfo
->LogonHours
.LogonHours
,
1156 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1158 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1161 UserInfo4
->usri4_bad_pw_count
= UserInfo
->BadPasswordCount
;
1162 UserInfo4
->usri4_num_logons
= UserInfo
->LogonCount
;
1164 if (LogonServer
.Length
> 0)
1166 UserInfo4
->usri4_logon_server
= Ptr
;
1168 memcpy(UserInfo4
->usri4_logon_server
,
1170 LogonServer
.Length
);
1171 UserInfo4
->usri4_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1173 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
1176 UserInfo4
->usri4_country_code
= UserInfo
->CountryCode
;
1177 UserInfo4
->usri4_code_page
= UserInfo
->CodePage
;
1179 /* FIXME: usri4_user_sid */
1181 UserInfo4
->usri4_primary_group_id
= UserInfo
->PrimaryGroupId
;
1183 if (UserInfo
->ProfilePath
.Length
> 0)
1185 UserInfo4
->usri4_profile
= Ptr
;
1187 memcpy(UserInfo4
->usri4_profile
,
1188 UserInfo
->ProfilePath
.Buffer
,
1189 UserInfo
->ProfilePath
.Length
);
1190 UserInfo4
->usri4_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1192 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
1195 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
1197 UserInfo4
->usri4_home_dir_drive
= Ptr
;
1199 memcpy(UserInfo4
->usri4_home_dir_drive
,
1200 UserInfo
->HomeDirectoryDrive
.Buffer
,
1201 UserInfo
->HomeDirectoryDrive
.Length
);
1202 UserInfo4
->usri4_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1204 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
1207 UserInfo4
->usri4_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
1211 UserInfo10
= (PUSER_INFO_10
)LocalBuffer
;
1213 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo10
+ sizeof(USER_INFO_10
));
1215 UserInfo10
->usri10_name
= Ptr
;
1217 memcpy(UserInfo10
->usri10_name
,
1218 UserInfo
->UserName
.Buffer
,
1219 UserInfo
->UserName
.Length
);
1220 UserInfo10
->usri10_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1222 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1224 if (UserInfo
->AdminComment
.Length
> 0)
1226 UserInfo10
->usri10_comment
= Ptr
;
1228 memcpy(UserInfo10
->usri10_comment
,
1229 UserInfo
->AdminComment
.Buffer
,
1230 UserInfo
->AdminComment
.Length
);
1231 UserInfo10
->usri10_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1233 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1236 if (UserInfo
->UserComment
.Length
> 0)
1238 UserInfo10
->usri10_usr_comment
= Ptr
;
1240 memcpy(UserInfo10
->usri10_usr_comment
,
1241 UserInfo
->UserComment
.Buffer
,
1242 UserInfo
->UserComment
.Length
);
1243 UserInfo10
->usri10_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1245 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1248 if (UserInfo
->FullName
.Length
> 0)
1250 UserInfo10
->usri10_full_name
= Ptr
;
1252 memcpy(UserInfo10
->usri10_full_name
,
1253 UserInfo
->FullName
.Buffer
,
1254 UserInfo
->FullName
.Length
);
1255 UserInfo10
->usri10_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1257 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1262 UserInfo11
= (PUSER_INFO_11
)LocalBuffer
;
1264 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo11
+ sizeof(USER_INFO_11
));
1266 UserInfo11
->usri11_name
= Ptr
;
1268 memcpy(UserInfo11
->usri11_name
,
1269 UserInfo
->UserName
.Buffer
,
1270 UserInfo
->UserName
.Length
);
1271 UserInfo11
->usri11_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1273 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1275 if (UserInfo
->AdminComment
.Length
> 0)
1277 UserInfo11
->usri11_comment
= Ptr
;
1279 memcpy(UserInfo11
->usri11_comment
,
1280 UserInfo
->AdminComment
.Buffer
,
1281 UserInfo
->AdminComment
.Length
);
1282 UserInfo11
->usri11_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1284 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1287 if (UserInfo
->UserComment
.Length
> 0)
1289 UserInfo11
->usri11_usr_comment
= Ptr
;
1291 memcpy(UserInfo11
->usri11_usr_comment
,
1292 UserInfo
->UserComment
.Buffer
,
1293 UserInfo
->UserComment
.Length
);
1294 UserInfo11
->usri11_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1296 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1299 if (UserInfo
->FullName
.Length
> 0)
1301 UserInfo11
->usri11_full_name
= Ptr
;
1303 memcpy(UserInfo11
->usri11_full_name
,
1304 UserInfo
->FullName
.Buffer
,
1305 UserInfo
->FullName
.Length
);
1306 UserInfo11
->usri11_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1308 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1311 /* FIXME: usri11_priv */
1312 /* FIXME: usri11_auth_flags */
1314 UserInfo11
->usri11_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
1316 if (UserInfo
->HomeDirectory
.Length
> 0)
1318 UserInfo11
->usri11_home_dir
= Ptr
;
1320 memcpy(UserInfo11
->usri11_home_dir
,
1321 UserInfo
->HomeDirectory
.Buffer
,
1322 UserInfo
->HomeDirectory
.Length
);
1323 UserInfo11
->usri11_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1325 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
1328 if (UserInfo
->Parameters
.Length
> 0)
1330 UserInfo11
->usri11_parms
= Ptr
;
1332 memcpy(UserInfo11
->usri11_parms
,
1333 UserInfo
->Parameters
.Buffer
,
1334 UserInfo
->Parameters
.Length
);
1335 UserInfo11
->usri11_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1337 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
1340 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
1341 &UserInfo11
->usri11_last_logon
);
1343 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
1344 &UserInfo11
->usri11_last_logoff
);
1346 UserInfo11
->usri11_bad_pw_count
= UserInfo
->BadPasswordCount
;
1347 UserInfo11
->usri11_num_logons
= UserInfo
->LogonCount
;
1349 if (LogonServer
.Length
> 0)
1351 UserInfo11
->usri11_logon_server
= Ptr
;
1353 memcpy(UserInfo11
->usri11_logon_server
,
1355 LogonServer
.Length
);
1356 UserInfo11
->usri11_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1358 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
1361 UserInfo11
->usri11_country_code
= UserInfo
->CountryCode
;
1363 if (UserInfo
->WorkStations
.Length
> 0)
1365 UserInfo11
->usri11_workstations
= Ptr
;
1367 memcpy(UserInfo11
->usri11_workstations
,
1368 UserInfo
->WorkStations
.Buffer
,
1369 UserInfo
->WorkStations
.Length
);
1370 UserInfo11
->usri11_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1372 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
1375 UserInfo11
->usri11_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
1376 UserInfo11
->usri11_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
1378 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
1380 UserInfo11
->usri11_logon_hours
= (PVOID
)Ptr
;
1382 memcpy(UserInfo11
->usri11_logon_hours
,
1383 UserInfo
->LogonHours
.LogonHours
,
1384 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1386 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1389 UserInfo11
->usri11_code_page
= UserInfo
->CodePage
;
1393 UserInfo20
= (PUSER_INFO_20
)LocalBuffer
;
1395 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo20
+ sizeof(USER_INFO_20
));
1397 UserInfo20
->usri20_name
= Ptr
;
1399 memcpy(UserInfo20
->usri20_name
,
1400 UserInfo
->UserName
.Buffer
,
1401 UserInfo
->UserName
.Length
);
1402 UserInfo20
->usri20_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1404 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1406 if (UserInfo
->FullName
.Length
> 0)
1408 UserInfo20
->usri20_full_name
= Ptr
;
1410 memcpy(UserInfo20
->usri20_full_name
,
1411 UserInfo
->FullName
.Buffer
,
1412 UserInfo
->FullName
.Length
);
1413 UserInfo20
->usri20_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1415 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1418 if (UserInfo
->AdminComment
.Length
> 0)
1420 UserInfo20
->usri20_comment
= Ptr
;
1422 memcpy(UserInfo20
->usri20_comment
,
1423 UserInfo
->AdminComment
.Buffer
,
1424 UserInfo
->AdminComment
.Length
);
1425 UserInfo20
->usri20_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1427 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1430 UserInfo20
->usri20_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
1433 UserInfo20
->usri20_user_id
= RelativeId
;
1437 UserInfo23
= (PUSER_INFO_23
)LocalBuffer
;
1439 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo23
+ sizeof(USER_INFO_23
));
1441 UserInfo23
->usri23_name
= Ptr
;
1443 memcpy(UserInfo23
->usri23_name
,
1444 UserInfo
->UserName
.Buffer
,
1445 UserInfo
->UserName
.Length
);
1446 UserInfo23
->usri23_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1448 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1450 if (UserInfo
->FullName
.Length
> 0)
1452 UserInfo23
->usri23_full_name
= Ptr
;
1454 memcpy(UserInfo23
->usri23_full_name
,
1455 UserInfo
->FullName
.Buffer
,
1456 UserInfo
->FullName
.Length
);
1457 UserInfo23
->usri23_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1459 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1462 if (UserInfo
->AdminComment
.Length
> 0)
1464 UserInfo23
->usri23_comment
= Ptr
;
1466 memcpy(UserInfo23
->usri23_comment
,
1467 UserInfo
->AdminComment
.Buffer
,
1468 UserInfo
->AdminComment
.Length
);
1469 UserInfo23
->usri23_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1471 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1474 UserInfo23
->usri23_flags
= GetAccountFlags(UserInfo
->UserAccountControl
,
1477 /* FIXME: usri23_user_sid */
1482 if (UserInfo
!= NULL
)
1483 FreeUserInfo(UserInfo
);
1486 HeapFree(GetProcessHeap(), 0, Dacl
);
1488 if (ApiStatus
== NERR_Success
)
1490 *Buffer
= LocalBuffer
;
1494 if (LocalBuffer
!= NULL
)
1495 NetApiBufferFree(LocalBuffer
);
1504 SetUserInfo(SAM_HANDLE UserHandle
,
1508 USER_ALL_INFORMATION UserAllInfo
;
1509 PUSER_INFO_0 UserInfo0
;
1510 PUSER_INFO_1 UserInfo1
;
1511 PUSER_INFO_2 UserInfo2
;
1512 PUSER_INFO_3 UserInfo3
;
1513 PUSER_INFO_4 UserInfo4
;
1514 PUSER_INFO_1003 UserInfo1003
;
1515 PUSER_INFO_1006 UserInfo1006
;
1516 PUSER_INFO_1007 UserInfo1007
;
1517 PUSER_INFO_1008 UserInfo1008
;
1518 PUSER_INFO_1009 UserInfo1009
;
1519 PUSER_INFO_1011 UserInfo1011
;
1520 PUSER_INFO_1012 UserInfo1012
;
1521 PUSER_INFO_1013 UserInfo1013
;
1522 PUSER_INFO_1014 UserInfo1014
;
1523 PUSER_INFO_1017 UserInfo1017
;
1524 PUSER_INFO_1018 UserInfo1018
;
1525 PUSER_INFO_1024 UserInfo1024
;
1526 PUSER_INFO_1025 UserInfo1025
;
1527 PUSER_INFO_1051 UserInfo1051
;
1528 PUSER_INFO_1052 UserInfo1052
;
1529 PUSER_INFO_1053 UserInfo1053
;
1530 NET_API_STATUS ApiStatus
= NERR_Success
;
1531 NTSTATUS Status
= STATUS_SUCCESS
;
1533 ZeroMemory(&UserAllInfo
, sizeof(USER_ALL_INFORMATION
));
1538 UserInfo0
= (PUSER_INFO_0
)UserInfo
;
1540 RtlInitUnicodeString(&UserAllInfo
.UserName
,
1541 UserInfo0
->usri0_name
);
1543 UserAllInfo
.WhichFields
|= USER_ALL_USERNAME
;
1547 UserInfo1
= (PUSER_INFO_1
)UserInfo
;
1549 // usri1_name ignored
1551 if (UserInfo1
->usri1_password
!= NULL
)
1553 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1554 UserInfo1
->usri1_password
);
1555 UserAllInfo
.NtPasswordPresent
= TRUE
;
1556 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1559 // usri1_password_age ignored
1561 // UserInfo1->usri1_priv
1563 if (UserInfo1
->usri1_home_dir
!= NULL
)
1565 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1566 UserInfo1
->usri1_home_dir
);
1567 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1570 if (UserInfo1
->usri1_comment
!= NULL
)
1572 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1573 UserInfo1
->usri1_comment
);
1574 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1577 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1
->usri1_flags
);
1578 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1580 if (UserInfo1
->usri1_script_path
!= NULL
)
1582 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1583 UserInfo1
->usri1_script_path
);
1584 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1589 UserInfo2
= (PUSER_INFO_2
)UserInfo
;
1591 // usri2_name ignored
1593 if (UserInfo2
->usri2_password
!= NULL
)
1595 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1596 UserInfo2
->usri2_password
);
1597 UserAllInfo
.NtPasswordPresent
= TRUE
;
1598 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1601 // usri2_password_age ignored
1603 // UserInfo2->usri2_priv;
1605 if (UserInfo2
->usri2_home_dir
!= NULL
)
1607 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1608 UserInfo2
->usri2_home_dir
);
1609 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1612 if (UserInfo2
->usri2_comment
!= NULL
)
1614 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1615 UserInfo2
->usri2_comment
);
1616 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1619 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo2
->usri2_flags
);
1620 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1622 if (UserInfo2
->usri2_script_path
!= NULL
)
1624 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1625 UserInfo2
->usri2_script_path
);
1626 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1629 // UserInfo2->usri2_auth_flags;
1631 if (UserInfo2
->usri2_full_name
!= NULL
)
1633 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1634 UserInfo2
->usri2_full_name
);
1635 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1638 if (UserInfo2
->usri2_usr_comment
!= NULL
)
1640 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1641 UserInfo2
->usri2_usr_comment
);
1642 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1645 if (UserInfo2
->usri2_parms
!= NULL
)
1647 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1648 UserInfo2
->usri2_parms
);
1649 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1652 if (UserInfo2
->usri2_workstations
!= NULL
)
1654 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1655 UserInfo2
->usri2_workstations
);
1656 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1659 // usri2_last_logon ignored
1660 // usri2_last_logoff ignored
1662 if (UserInfo2
->usri2_acct_expires
== TIMEQ_FOREVER
)
1664 UserAllInfo
.AccountExpires
.LowPart
= 0;
1665 UserAllInfo
.AccountExpires
.HighPart
= 0;
1669 RtlSecondsSince1970ToTime(UserInfo2
->usri2_acct_expires
,
1670 &UserAllInfo
.AccountExpires
);
1672 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1674 // usri2_max_storage ignored
1676 // UserInfo2->usri2_units_per_week;
1677 // UserInfo2->usri2_logon_hours;
1679 // usri2_bad_pw_count ignored
1680 // usri2_num_logons ignored
1681 // usri2_logon_server ignored
1683 UserAllInfo
.CountryCode
= UserInfo2
->usri2_country_code
;
1684 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1686 UserAllInfo
.CodePage
= UserInfo2
->usri2_code_page
;
1687 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1691 UserInfo3
= (PUSER_INFO_3
)UserInfo
;
1693 // usri3_name ignored
1695 if (UserInfo3
->usri3_password
!= NULL
)
1697 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1698 UserInfo3
->usri3_password
);
1699 UserAllInfo
.NtPasswordPresent
= TRUE
;
1700 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1703 // usri3_password_age ignored
1705 // UserInfo3->usri3_priv;
1707 if (UserInfo3
->usri3_home_dir
!= NULL
)
1709 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1710 UserInfo3
->usri3_home_dir
);
1711 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1714 if (UserInfo3
->usri3_comment
!= NULL
)
1716 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1717 UserInfo3
->usri3_comment
);
1718 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1721 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo3
->usri3_flags
);
1722 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1724 if (UserInfo3
->usri3_script_path
!= NULL
)
1726 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1727 UserInfo3
->usri3_script_path
);
1728 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1731 // UserInfo3->usri3_auth_flags;
1733 if (UserInfo3
->usri3_full_name
!= NULL
)
1735 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1736 UserInfo3
->usri3_full_name
);
1737 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1740 if (UserInfo3
->usri3_usr_comment
!= NULL
)
1742 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1743 UserInfo3
->usri3_usr_comment
);
1744 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1747 if (UserInfo3
->usri3_parms
!= NULL
)
1749 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1750 UserInfo3
->usri3_parms
);
1751 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1754 if (UserInfo3
->usri3_workstations
!= NULL
)
1756 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1757 UserInfo3
->usri3_workstations
);
1758 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1761 // usri3_last_logon ignored
1762 // usri3_last_logoff ignored
1764 if (UserInfo3
->usri3_acct_expires
== TIMEQ_FOREVER
)
1766 UserAllInfo
.AccountExpires
.LowPart
= 0;
1767 UserAllInfo
.AccountExpires
.HighPart
= 0;
1771 RtlSecondsSince1970ToTime(UserInfo3
->usri3_acct_expires
,
1772 &UserAllInfo
.AccountExpires
);
1774 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1776 // usri3_max_storage ignored
1778 // UserInfo3->usri3_units_per_week;
1779 // UserInfo3->usri3_logon_hours;
1781 // usri3_bad_pw_count ignored
1782 // usri3_num_logons ignored
1783 // usri3_logon_server ignored
1785 UserAllInfo
.CountryCode
= UserInfo3
->usri3_country_code
;
1786 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1788 UserAllInfo
.CodePage
= UserInfo3
->usri3_code_page
;
1789 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1791 // usri3_user_id ignored
1793 UserAllInfo
.PrimaryGroupId
= UserInfo3
->usri3_primary_group_id
;
1794 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1796 if (UserInfo3
->usri3_profile
!= NULL
)
1798 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1799 UserInfo3
->usri3_profile
);
1800 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1803 if (UserInfo3
->usri3_home_dir_drive
!= NULL
)
1805 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1806 UserInfo3
->usri3_home_dir_drive
);
1807 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1810 UserAllInfo
.PasswordExpired
= (UserInfo3
->usri3_password_expired
!= 0);
1811 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1815 UserInfo4
= (PUSER_INFO_4
)UserInfo
;
1817 // usri4_name ignored
1819 if (UserInfo4
->usri4_password
!= NULL
)
1821 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1822 UserInfo4
->usri4_password
);
1823 UserAllInfo
.NtPasswordPresent
= TRUE
;
1824 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1827 // usri4_password_age ignored
1829 // UserInfo3->usri4_priv;
1831 if (UserInfo4
->usri4_home_dir
!= NULL
)
1833 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1834 UserInfo4
->usri4_home_dir
);
1835 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1838 if (UserInfo4
->usri4_comment
!= NULL
)
1840 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1841 UserInfo4
->usri4_comment
);
1842 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1845 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo4
->usri4_flags
);
1846 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1848 if (UserInfo4
->usri4_script_path
!= NULL
)
1850 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1851 UserInfo4
->usri4_script_path
);
1852 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1855 // UserInfo4->usri4_auth_flags;
1857 if (UserInfo4
->usri4_full_name
!= NULL
)
1859 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1860 UserInfo4
->usri4_full_name
);
1861 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1864 if (UserInfo4
->usri4_usr_comment
!= NULL
)
1866 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1867 UserInfo4
->usri4_usr_comment
);
1868 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1871 if (UserInfo4
->usri4_parms
!= NULL
)
1873 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1874 UserInfo4
->usri4_parms
);
1875 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1878 if (UserInfo4
->usri4_workstations
!= NULL
)
1880 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1881 UserInfo4
->usri4_workstations
);
1882 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1885 // usri4_last_logon ignored
1886 // usri4_last_logoff ignored
1888 if (UserInfo4
->usri4_acct_expires
== TIMEQ_FOREVER
)
1890 UserAllInfo
.AccountExpires
.LowPart
= 0;
1891 UserAllInfo
.AccountExpires
.HighPart
= 0;
1895 RtlSecondsSince1970ToTime(UserInfo4
->usri4_acct_expires
,
1896 &UserAllInfo
.AccountExpires
);
1898 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1900 // usri4_max_storage ignored
1902 // UserInfo3->usri4_units_per_week;
1903 // UserInfo3->usri4_logon_hours;
1905 // usri4_bad_pw_count ignored
1906 // usri4_num_logons ignored
1907 // usri4_logon_server ignored
1909 UserAllInfo
.CountryCode
= UserInfo4
->usri4_country_code
;
1910 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1912 UserAllInfo
.CodePage
= UserInfo4
->usri4_code_page
;
1913 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1915 // usri4_user_sid ignored
1917 UserAllInfo
.PrimaryGroupId
= UserInfo4
->usri4_primary_group_id
;
1918 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1920 if (UserInfo4
->usri4_profile
!= NULL
)
1922 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1923 UserInfo4
->usri4_profile
);
1924 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1927 if (UserInfo4
->usri4_home_dir_drive
!= NULL
)
1929 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1930 UserInfo4
->usri4_home_dir_drive
);
1931 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1934 UserAllInfo
.PasswordExpired
= (UserInfo4
->usri4_password_expired
!= 0);
1935 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1942 UserInfo1003
= (PUSER_INFO_1003
)UserInfo
;
1944 if (UserInfo1003
->usri1003_password
!= NULL
)
1946 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1947 UserInfo1003
->usri1003_password
);
1948 UserAllInfo
.NtPasswordPresent
= TRUE
;
1949 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1956 UserInfo1006
= (PUSER_INFO_1006
)UserInfo
;
1958 if (UserInfo1006
->usri1006_home_dir
!= NULL
)
1960 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1961 UserInfo1006
->usri1006_home_dir
);
1962 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1967 UserInfo1007
= (PUSER_INFO_1007
)UserInfo
;
1969 if (UserInfo1007
->usri1007_comment
!= NULL
)
1971 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1972 UserInfo1007
->usri1007_comment
);
1973 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1978 UserInfo1008
= (PUSER_INFO_1008
)UserInfo
;
1979 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1008
->usri1008_flags
);
1980 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1984 UserInfo1009
= (PUSER_INFO_1009
)UserInfo
;
1986 if (UserInfo1009
->usri1009_script_path
!= NULL
)
1988 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1989 UserInfo1009
->usri1009_script_path
);
1990 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1997 UserInfo1011
= (PUSER_INFO_1011
)UserInfo
;
1999 if (UserInfo1011
->usri1011_full_name
!= NULL
)
2001 RtlInitUnicodeString(&UserAllInfo
.FullName
,
2002 UserInfo1011
->usri1011_full_name
);
2003 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
2008 UserInfo1012
= (PUSER_INFO_1012
)UserInfo
;
2010 if (UserInfo1012
->usri1012_usr_comment
!= NULL
)
2012 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
2013 UserInfo1012
->usri1012_usr_comment
);
2014 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
2019 UserInfo1013
= (PUSER_INFO_1013
)UserInfo
;
2021 if (UserInfo1013
->usri1013_parms
!= NULL
)
2023 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
2024 UserInfo1013
->usri1013_parms
);
2025 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
2030 UserInfo1014
= (PUSER_INFO_1014
)UserInfo
;
2032 if (UserInfo1014
->usri1014_workstations
!= NULL
)
2034 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
2035 UserInfo1014
->usri1014_workstations
);
2036 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
2041 UserInfo1017
= (PUSER_INFO_1017
)UserInfo
;
2043 if (UserInfo1017
->usri1017_acct_expires
== TIMEQ_FOREVER
)
2045 UserAllInfo
.AccountExpires
.LowPart
= 0;
2046 UserAllInfo
.AccountExpires
.HighPart
= 0;
2050 RtlSecondsSince1970ToTime(UserInfo1017
->usri1017_acct_expires
,
2051 &UserAllInfo
.AccountExpires
);
2053 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
2057 UserInfo1018
= (PUSER_INFO_1018
)UserInfo
;
2059 if (UserInfo1018
->usri1018_max_storage
!= USER_MAXSTORAGE_UNLIMITED
)
2061 // FIXME: Report error
2062 return ERROR_INVALID_PARAMETER
;
2069 UserInfo1024
= (PUSER_INFO_1024
)UserInfo
;
2071 UserAllInfo
.CountryCode
= UserInfo1024
->usri1024_country_code
;
2072 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
2076 UserInfo1025
= (PUSER_INFO_1025
)UserInfo
;
2078 UserAllInfo
.CodePage
= UserInfo1025
->usri1025_code_page
;
2079 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
2083 UserInfo1051
= (PUSER_INFO_1051
)UserInfo
;
2085 UserAllInfo
.PrimaryGroupId
= UserInfo1051
->usri1051_primary_group_id
;
2086 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
2090 UserInfo1052
= (PUSER_INFO_1052
)UserInfo
;
2092 if (UserInfo1052
->usri1052_profile
!= NULL
)
2094 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
2095 UserInfo1052
->usri1052_profile
);
2096 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
2101 UserInfo1053
= (PUSER_INFO_1053
)UserInfo
;
2103 if (UserInfo1053
->usri1053_home_dir_drive
!= NULL
)
2105 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
2106 UserInfo1053
->usri1053_home_dir_drive
);
2107 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
2112 ERR("Unsupported level %lu!\n", Level
);
2113 return ERROR_INVALID_PARAMETER
;
2116 Status
= SamSetInformationUser(UserHandle
,
2119 if (!NT_SUCCESS(Status
))
2121 ERR("SamSetInformationUser failed (Status %08lx)\n", Status
);
2122 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2133 OpenUserByName(SAM_HANDLE DomainHandle
,
2134 PUNICODE_STRING UserName
,
2135 ULONG DesiredAccess
,
2136 PSAM_HANDLE UserHandle
)
2138 PULONG RelativeIds
= NULL
;
2139 PSID_NAME_USE Use
= NULL
;
2140 NET_API_STATUS ApiStatus
= NERR_Success
;
2141 NTSTATUS Status
= STATUS_SUCCESS
;
2143 /* Get the RID for the given user name */
2144 Status
= SamLookupNamesInDomain(DomainHandle
,
2149 if (!NT_SUCCESS(Status
))
2151 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2152 return NetpNtStatusToApiStatus(Status
);
2155 /* Fail, if it is not an alias account */
2156 if (Use
[0] != SidTypeUser
)
2158 ERR("Object is not a user!\n");
2159 ApiStatus
= NERR_GroupNotFound
;
2163 /* Open the alias account */
2164 Status
= SamOpenUser(DomainHandle
,
2168 if (!NT_SUCCESS(Status
))
2170 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2171 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2176 if (RelativeIds
!= NULL
)
2177 SamFreeMemory(RelativeIds
);
2186 /************************************************************
2187 * NetUserAdd (NETAPI32.@)
2191 NetUserAdd(LPCWSTR servername
,
2196 UNICODE_STRING ServerName
;
2197 UNICODE_STRING UserName
;
2198 SAM_HANDLE ServerHandle
= NULL
;
2199 SAM_HANDLE DomainHandle
= NULL
;
2200 SAM_HANDLE UserHandle
= NULL
;
2201 ULONG GrantedAccess
;
2203 NET_API_STATUS ApiStatus
= NERR_Success
;
2204 NTSTATUS Status
= STATUS_SUCCESS
;
2206 TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername
), level
, bufptr
, parm_err
);
2208 /* Check the info level */
2218 return ERROR_INVALID_LEVEL
;
2221 if (servername
!= NULL
)
2222 RtlInitUnicodeString(&ServerName
, servername
);
2224 /* Connect to the SAM Server */
2225 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2227 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2229 if (!NT_SUCCESS(Status
))
2231 ERR("SamConnect failed (Status %08lx)\n", Status
);
2232 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2236 /* Open the Account Domain */
2237 Status
= OpenAccountDomain(ServerHandle
,
2238 (servername
!= NULL
) ? &ServerName
: NULL
,
2239 DOMAIN_CREATE_USER
| DOMAIN_LOOKUP
| DOMAIN_READ_PASSWORD_PARAMETERS
,
2241 if (!NT_SUCCESS(Status
))
2243 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2244 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2248 /* Initialize the user name string */
2249 RtlInitUnicodeString(&UserName
,
2250 ((PUSER_INFO_1
)bufptr
)->usri1_name
);
2252 /* Create the user account */
2253 Status
= SamCreateUser2InDomain(DomainHandle
,
2255 USER_NORMAL_ACCOUNT
,
2256 USER_ALL_ACCESS
| DELETE
| WRITE_DAC
,
2260 if (!NT_SUCCESS(Status
))
2262 ERR("SamCreateUser2InDomain failed (Status %08lx)\n", Status
);
2263 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2267 /* Set user information */
2268 ApiStatus
= SetUserInfo(UserHandle
,
2271 if (ApiStatus
!= NERR_Success
)
2273 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
2278 if (UserHandle
!= NULL
)
2280 if (ApiStatus
!= NERR_Success
)
2281 SamDeleteUser(UserHandle
);
2283 SamCloseHandle(UserHandle
);
2286 if (DomainHandle
!= NULL
)
2287 SamCloseHandle(DomainHandle
);
2289 if (ServerHandle
!= NULL
)
2290 SamCloseHandle(ServerHandle
);
2296 /******************************************************************************
2297 * NetUserChangePassword (NETAPI32.@)
2299 * domainname [I] Optional. Domain on which the user resides or the logon
2300 * domain of the current user if NULL.
2301 * username [I] Optional. Username to change the password for or the name
2302 * of the current user if NULL.
2303 * oldpassword [I] The user's current password.
2304 * newpassword [I] The password that the user will be changed to using.
2307 * Success: NERR_Success.
2308 * Failure: NERR_* failure code or win error code.
2313 NetUserChangePassword(LPCWSTR domainname
,
2315 LPCWSTR oldpassword
,
2316 LPCWSTR newpassword
)
2318 PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer
= NULL
;
2319 PMSV1_0_CHANGEPASSWORD_RESPONSE ResponseBuffer
= NULL
;
2320 ULONG RequestBufferSize
;
2321 ULONG ResponseBufferSize
= 0;
2323 ANSI_STRING PackageName
;
2324 ULONG AuthenticationPackage
= 0;
2325 HANDLE LsaHandle
= NULL
;
2326 NET_API_STATUS ApiStatus
= NERR_Success
;
2327 NTSTATUS Status
= STATUS_SUCCESS
;
2328 NTSTATUS ProtocolStatus
;
2330 TRACE("(%s, %s, ..., ...)\n", debugstr_w(domainname
), debugstr_w(username
));
2332 /* FIXME: handle null domain or user name */
2334 /* Check the parameters */
2335 if ((oldpassword
== NULL
) ||
2336 (newpassword
== NULL
))
2337 return ERROR_INVALID_PARAMETER
;
2339 /* Connect to the LSA server */
2340 Status
= LsaConnectUntrusted(&LsaHandle
);
2341 if (!NT_SUCCESS(Status
))
2342 return NetpNtStatusToApiStatus(Status
);
2344 /* Get the authentication package ID */
2345 RtlInitAnsiString(&PackageName
,
2346 MSV1_0_PACKAGE_NAME
);
2348 Status
= LsaLookupAuthenticationPackage(LsaHandle
,
2350 &AuthenticationPackage
);
2351 if (!NT_SUCCESS(Status
))
2353 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2357 /* Calculate the request buffer size */
2358 RequestBufferSize
= sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
) +
2359 ((wcslen(domainname
) + 1) * sizeof(WCHAR
)) +
2360 ((wcslen(username
) + 1) * sizeof(WCHAR
)) +
2361 ((wcslen(oldpassword
) + 1) * sizeof(WCHAR
)) +
2362 ((wcslen(newpassword
) + 1) * sizeof(WCHAR
));
2364 /* Allocate the request buffer */
2365 ApiStatus
= NetApiBufferAllocate(RequestBufferSize
,
2366 (PVOID
*)&RequestBuffer
);
2367 if (ApiStatus
!= NERR_Success
)
2370 /* Initialize the request buffer */
2371 RequestBuffer
->MessageType
= MsV1_0ChangePassword
;
2372 RequestBuffer
->Impersonating
= TRUE
;
2374 Ptr
= (LPWSTR
)((ULONG_PTR
)RequestBuffer
+ sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
));
2376 /* Pack the domain name */
2377 RequestBuffer
->DomainName
.Length
= wcslen(domainname
) * sizeof(WCHAR
);
2378 RequestBuffer
->DomainName
.MaximumLength
= RequestBuffer
->DomainName
.Length
+ sizeof(WCHAR
);
2379 RequestBuffer
->DomainName
.Buffer
= Ptr
;
2381 RtlCopyMemory(RequestBuffer
->DomainName
.Buffer
,
2383 RequestBuffer
->DomainName
.MaximumLength
);
2385 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->DomainName
.MaximumLength
);
2387 /* Pack the user name */
2388 RequestBuffer
->AccountName
.Length
= wcslen(username
) * sizeof(WCHAR
);
2389 RequestBuffer
->AccountName
.MaximumLength
= RequestBuffer
->AccountName
.Length
+ sizeof(WCHAR
);
2390 RequestBuffer
->AccountName
.Buffer
= Ptr
;
2392 RtlCopyMemory(RequestBuffer
->AccountName
.Buffer
,
2394 RequestBuffer
->AccountName
.MaximumLength
);
2396 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->AccountName
.MaximumLength
);
2398 /* Pack the old password */
2399 RequestBuffer
->OldPassword
.Length
= wcslen(oldpassword
) * sizeof(WCHAR
);
2400 RequestBuffer
->OldPassword
.MaximumLength
= RequestBuffer
->OldPassword
.Length
+ sizeof(WCHAR
);
2401 RequestBuffer
->OldPassword
.Buffer
= Ptr
;
2403 RtlCopyMemory(RequestBuffer
->OldPassword
.Buffer
,
2405 RequestBuffer
->OldPassword
.MaximumLength
);
2407 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->OldPassword
.MaximumLength
);
2409 /* Pack the new password */
2410 RequestBuffer
->NewPassword
.Length
= wcslen(newpassword
) * sizeof(WCHAR
);
2411 RequestBuffer
->NewPassword
.MaximumLength
= RequestBuffer
->NewPassword
.Length
+ sizeof(WCHAR
);
2412 RequestBuffer
->NewPassword
.Buffer
= Ptr
;
2414 RtlCopyMemory(RequestBuffer
->NewPassword
.Buffer
,
2416 RequestBuffer
->NewPassword
.MaximumLength
);
2418 /* Call the authentication package */
2419 Status
= LsaCallAuthenticationPackage(LsaHandle
,
2420 AuthenticationPackage
,
2423 (PVOID
*)&ResponseBuffer
,
2424 &ResponseBufferSize
,
2426 if (!NT_SUCCESS(Status
))
2428 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2432 if (!NT_SUCCESS(ProtocolStatus
))
2434 ApiStatus
= NetpNtStatusToApiStatus(ProtocolStatus
);
2439 if (RequestBuffer
!= NULL
)
2440 NetApiBufferFree(RequestBuffer
);
2442 if (ResponseBuffer
!= NULL
)
2443 LsaFreeReturnBuffer(ResponseBuffer
);
2445 if (LsaHandle
!= NULL
)
2452 /************************************************************
2453 * NetUserDel (NETAPI32.@)
2457 NetUserDel(LPCWSTR servername
,
2460 UNICODE_STRING ServerName
;
2461 UNICODE_STRING UserName
;
2462 SAM_HANDLE ServerHandle
= NULL
;
2463 SAM_HANDLE DomainHandle
= NULL
;
2464 SAM_HANDLE UserHandle
= NULL
;
2465 NET_API_STATUS ApiStatus
= NERR_Success
;
2466 NTSTATUS Status
= STATUS_SUCCESS
;
2468 TRACE("(%s, %s)\n", debugstr_w(servername
), debugstr_w(username
));
2470 if (servername
!= NULL
)
2471 RtlInitUnicodeString(&ServerName
, servername
);
2473 RtlInitUnicodeString(&UserName
, username
);
2475 /* Connect to the SAM Server */
2476 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2478 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2480 if (!NT_SUCCESS(Status
))
2482 ERR("SamConnect failed (Status %08lx)\n", Status
);
2483 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2487 /* Open the Builtin Domain */
2488 Status
= OpenBuiltinDomain(ServerHandle
,
2491 if (!NT_SUCCESS(Status
))
2493 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2494 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2498 /* Open the user account in the builtin domain */
2499 ApiStatus
= OpenUserByName(DomainHandle
,
2503 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_NONE_MAPPED
)
2505 TRACE("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2509 if (UserHandle
== NULL
)
2511 if (DomainHandle
!= NULL
)
2513 SamCloseHandle(DomainHandle
);
2514 DomainHandle
= NULL
;
2517 /* Open the Acount Domain */
2518 Status
= OpenAccountDomain(ServerHandle
,
2519 (servername
!= NULL
) ? &ServerName
: NULL
,
2522 if (!NT_SUCCESS(Status
))
2524 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2525 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2529 /* Open the user account in the account domain */
2530 ApiStatus
= OpenUserByName(DomainHandle
,
2534 if (ApiStatus
!= NERR_Success
)
2536 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2537 if (ApiStatus
== ERROR_NONE_MAPPED
)
2538 ApiStatus
= NERR_UserNotFound
;
2543 /* Delete the user */
2544 Status
= SamDeleteUser(UserHandle
);
2545 if (!NT_SUCCESS(Status
))
2547 ERR("SamDeleteUser failed (Status %08lx)\n", Status
);
2548 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2553 if (UserHandle
!= NULL
)
2554 SamCloseHandle(UserHandle
);
2556 if (DomainHandle
!= NULL
)
2557 SamCloseHandle(DomainHandle
);
2559 if (ServerHandle
!= NULL
)
2560 SamCloseHandle(ServerHandle
);
2566 /************************************************************
2567 * NetUserEnum (NETAPI32.@)
2571 NetUserEnum(LPCWSTR servername
,
2576 LPDWORD entriesread
,
2577 LPDWORD totalentries
,
2578 LPDWORD resume_handle
)
2580 UNICODE_STRING ServerName
;
2581 PSAM_RID_ENUMERATION CurrentUser
;
2582 PENUM_CONTEXT EnumContext
= NULL
;
2583 LPVOID Buffer
= NULL
;
2585 SAM_HANDLE UserHandle
= NULL
;
2586 NET_API_STATUS ApiStatus
= NERR_Success
;
2587 NTSTATUS Status
= STATUS_SUCCESS
;
2589 TRACE("(%s %d 0x%d %p %d %p %p %p)\n", debugstr_w(servername
), level
,
2590 filter
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
2596 if (servername
!= NULL
)
2597 RtlInitUnicodeString(&ServerName
, servername
);
2599 if (resume_handle
!= NULL
&& *resume_handle
!= 0)
2601 EnumContext
= (PENUM_CONTEXT
)*resume_handle
;
2605 ApiStatus
= NetApiBufferAllocate(sizeof(ENUM_CONTEXT
), (PVOID
*)&EnumContext
);
2606 if (ApiStatus
!= NERR_Success
)
2609 EnumContext
->EnumerationContext
= 0;
2610 EnumContext
->Buffer
= NULL
;
2611 EnumContext
->Count
= 0;
2612 EnumContext
->Index
= 0;
2613 EnumContext
->BuiltinDone
= FALSE
;
2615 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2616 &EnumContext
->ServerHandle
,
2617 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2619 if (!NT_SUCCESS(Status
))
2621 ERR("SamConnect failed (Status %08lx)\n", Status
);
2622 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2626 Status
= OpenAccountDomain(EnumContext
->ServerHandle
,
2627 (servername
!= NULL
) ? &ServerName
: NULL
,
2628 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2629 &EnumContext
->AccountDomainHandle
);
2630 if (!NT_SUCCESS(Status
))
2632 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2633 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2637 Status
= OpenBuiltinDomain(EnumContext
->ServerHandle
,
2638 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2639 &EnumContext
->BuiltinDomainHandle
);
2640 if (!NT_SUCCESS(Status
))
2642 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2643 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2650 TRACE("EnumContext->Index: %lu\n", EnumContext
->Index
);
2651 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2653 if (EnumContext
->Index
>= EnumContext
->Count
)
2655 // if (EnumContext->BuiltinDone == TRUE)
2657 // ApiStatus = NERR_Success;
2661 TRACE("Calling SamEnumerateUsersInDomain\n");
2662 Status
= SamEnumerateUsersInDomain(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2663 &EnumContext
->EnumerationContext
,
2665 (PVOID
*)&EnumContext
->Buffer
,
2667 &EnumContext
->Count
);
2669 TRACE("SamEnumerateUsersInDomain returned (Status %08lx)\n", Status
);
2670 if (!NT_SUCCESS(Status
))
2672 ERR("SamEnumerateUsersInDomain failed (Status %08lx)\n", Status
);
2673 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2677 if (Status
== STATUS_MORE_ENTRIES
)
2679 ApiStatus
= NERR_BufTooSmall
;
2684 EnumContext
->BuiltinDone
= TRUE
;
2688 TRACE("EnumContext: %lu\n", EnumContext
);
2689 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2690 TRACE("EnumContext->Buffer: %p\n", EnumContext
->Buffer
);
2692 /* Get a pointer to the current user */
2693 CurrentUser
= &EnumContext
->Buffer
[EnumContext
->Index
];
2695 TRACE("RID: %lu\n", CurrentUser
->RelativeId
);
2697 Status
= SamOpenUser(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2698 READ_CONTROL
| USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2699 CurrentUser
->RelativeId
,
2701 if (!NT_SUCCESS(Status
))
2703 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2704 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2708 ApiStatus
= BuildUserInfoBuffer(UserHandle
,
2710 CurrentUser
->RelativeId
,
2712 if (ApiStatus
!= NERR_Success
)
2714 ERR("BuildUserInfoBuffer failed (ApiStatus %lu)\n", ApiStatus
);
2718 SamCloseHandle(UserHandle
);
2721 EnumContext
->Index
++;
2727 if (ApiStatus
== NERR_Success
&& EnumContext
->Index
< EnumContext
->Count
)
2728 ApiStatus
= ERROR_MORE_DATA
;
2730 if (EnumContext
!= NULL
)
2731 *totalentries
= EnumContext
->Count
;
2733 if (resume_handle
== NULL
|| ApiStatus
!= ERROR_MORE_DATA
)
2735 if (EnumContext
!= NULL
)
2737 if (EnumContext
->BuiltinDomainHandle
!= NULL
)
2738 SamCloseHandle(EnumContext
->BuiltinDomainHandle
);
2740 if (EnumContext
->AccountDomainHandle
!= NULL
)
2741 SamCloseHandle(EnumContext
->AccountDomainHandle
);
2743 if (EnumContext
->ServerHandle
!= NULL
)
2744 SamCloseHandle(EnumContext
->ServerHandle
);
2746 if (EnumContext
->Buffer
!= NULL
)
2748 for (i
= 0; i
< EnumContext
->Count
; i
++)
2750 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
2753 SamFreeMemory(EnumContext
->Buffer
);
2756 NetApiBufferFree(EnumContext
);
2761 if (UserHandle
!= NULL
)
2762 SamCloseHandle(UserHandle
);
2764 if (resume_handle
!= NULL
)
2765 *resume_handle
= (DWORD_PTR
)EnumContext
;
2767 *bufptr
= (LPBYTE
)Buffer
;
2769 TRACE("return %lu\n", ApiStatus
);
2775 /************************************************************
2776 * NetUserGetGroups (NETAPI32.@)
2780 NetUserGetGroups(LPCWSTR servername
,
2785 LPDWORD entriesread
,
2786 LPDWORD totalentries
)
2788 UNICODE_STRING ServerName
;
2789 UNICODE_STRING UserName
;
2790 SAM_HANDLE ServerHandle
= NULL
;
2791 SAM_HANDLE AccountDomainHandle
= NULL
;
2792 SAM_HANDLE UserHandle
= NULL
;
2793 PSID AccountDomainSid
= NULL
;
2794 PULONG RelativeIds
= NULL
;
2795 PSID_NAME_USE Use
= NULL
;
2796 PGROUP_MEMBERSHIP GroupMembership
= NULL
;
2799 NET_API_STATUS ApiStatus
= NERR_Success
;
2800 NTSTATUS Status
= STATUS_SUCCESS
;
2802 TRACE("%s %s %d %p %d %p %p stub\n", debugstr_w(servername
),
2803 debugstr_w(username
), level
, bufptr
, prefixmaxlen
, entriesread
,
2806 if (servername
!= NULL
)
2807 RtlInitUnicodeString(&ServerName
, servername
);
2809 RtlInitUnicodeString(&UserName
, username
);
2811 /* Connect to the SAM Server */
2812 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2814 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2816 if (!NT_SUCCESS(Status
))
2818 ERR("SamConnect failed (Status %08lx)\n", Status
);
2819 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2823 /* Get the Account Domain SID */
2824 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
2826 if (!NT_SUCCESS(Status
))
2828 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
2829 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2833 /* Open the Account Domain */
2834 Status
= SamOpenDomain(ServerHandle
,
2835 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2837 &AccountDomainHandle
);
2838 if (!NT_SUCCESS(Status
))
2840 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2841 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2845 /* Get the RID for the given user name */
2846 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2851 if (!NT_SUCCESS(Status
))
2853 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2854 if (Status
== STATUS_NONE_MAPPED
)
2855 ApiStatus
= NERR_UserNotFound
;
2857 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2861 /* Fail, if it is not a user account */
2862 if (Use
[0] != SidTypeUser
)
2864 ERR("Account is not a User!\n");
2865 ApiStatus
= NERR_UserNotFound
;
2869 /* Open the user object */
2870 Status
= SamOpenUser(AccountDomainHandle
,
2874 if (!NT_SUCCESS(Status
))
2876 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2877 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2881 /* Get the group memberships of this user */
2882 Status
= SamGetGroupsForUser(UserHandle
,
2885 if (!NT_SUCCESS(Status
))
2887 ERR("SamGetGroupsForUser failed (Status %08lx)\n", Status
);
2888 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2892 /* If there is no group membership, we're done */
2893 if (GroupCount
== 0)
2895 ApiStatus
= NERR_Success
;
2902 if (GroupMembership
!= NULL
)
2903 SamFreeMemory(GroupMembership
);
2905 if (UserHandle
!= NULL
)
2906 SamCloseHandle(UserHandle
);
2908 if (RelativeIds
!= NULL
)
2909 SamFreeMemory(RelativeIds
);
2914 if (AccountDomainSid
!= NULL
)
2915 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
2917 if (AccountDomainHandle
!= NULL
)
2918 SamCloseHandle(AccountDomainHandle
);
2920 if (ServerHandle
!= NULL
)
2921 SamCloseHandle(ServerHandle
);
2923 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
2930 // *entriesread = Count;
2931 // *totalentries = Count;
2934 // *bufptr = (LPBYTE)Buffer;
2943 return ERROR_INVALID_LEVEL
;
2948 /************************************************************
2949 * NetUserGetInfo (NETAPI32.@)
2953 NetUserGetInfo(LPCWSTR servername
,
2958 UNICODE_STRING ServerName
;
2959 UNICODE_STRING UserName
;
2960 SAM_HANDLE ServerHandle
= NULL
;
2961 SAM_HANDLE AccountDomainHandle
= NULL
;
2962 SAM_HANDLE UserHandle
= NULL
;
2963 PULONG RelativeIds
= NULL
;
2964 PSID_NAME_USE Use
= NULL
;
2965 LPVOID Buffer
= NULL
;
2966 NET_API_STATUS ApiStatus
= NERR_Success
;
2967 NTSTATUS Status
= STATUS_SUCCESS
;
2969 TRACE("(%s, %s, %d, %p)\n", debugstr_w(servername
),
2970 debugstr_w(username
), level
, bufptr
);
2972 if (servername
!= NULL
)
2973 RtlInitUnicodeString(&ServerName
, servername
);
2975 RtlInitUnicodeString(&UserName
, username
);
2977 /* Connect to the SAM Server */
2978 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2980 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2982 if (!NT_SUCCESS(Status
))
2984 ERR("SamConnect failed (Status %08lx)\n", Status
);
2985 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2989 /* Open the Account Domain */
2990 Status
= OpenAccountDomain(ServerHandle
,
2991 (servername
!= NULL
) ? &ServerName
: NULL
,
2992 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2993 &AccountDomainHandle
);
2994 if (!NT_SUCCESS(Status
))
2996 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2997 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3001 /* Get the RID for the given user name */
3002 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
3007 if (!NT_SUCCESS(Status
))
3009 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
3010 if (Status
== STATUS_NONE_MAPPED
)
3011 ApiStatus
= NERR_UserNotFound
;
3013 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3017 /* Check if the account is a user account */
3018 if (Use
[0] != SidTypeUser
)
3020 ERR("No user found!\n");
3021 ApiStatus
= NERR_UserNotFound
;
3025 TRACE("RID: %lu\n", RelativeIds
[0]);
3027 /* Open the user object */
3028 Status
= SamOpenUser(AccountDomainHandle
,
3029 READ_CONTROL
| USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
3032 if (!NT_SUCCESS(Status
))
3034 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
3035 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3039 ApiStatus
= BuildUserInfoBuffer(UserHandle
,
3043 if (ApiStatus
!= NERR_Success
)
3045 ERR("BuildUserInfoBuffer failed (ApiStatus %08lu)\n", ApiStatus
);
3050 if (UserHandle
!= NULL
)
3051 SamCloseHandle(UserHandle
);
3053 if (RelativeIds
!= NULL
)
3054 SamFreeMemory(RelativeIds
);
3059 if (AccountDomainHandle
!= NULL
)
3060 SamCloseHandle(AccountDomainHandle
);
3062 if (ServerHandle
!= NULL
)
3063 SamCloseHandle(ServerHandle
);
3065 *bufptr
= (LPBYTE
)Buffer
;
3071 /************************************************************
3072 * NetUserGetLocalGroups (NETAPI32.@)
3076 NetUserGetLocalGroups(LPCWSTR servername
,
3082 LPDWORD entriesread
,
3083 LPDWORD totalentries
)
3085 UNICODE_STRING ServerName
;
3086 UNICODE_STRING UserName
;
3087 SAM_HANDLE ServerHandle
= NULL
;
3088 SAM_HANDLE BuiltinDomainHandle
= NULL
;
3089 SAM_HANDLE AccountDomainHandle
= NULL
;
3090 PSID AccountDomainSid
= NULL
;
3091 PSID UserSid
= NULL
;
3092 PULONG RelativeIds
= NULL
;
3093 PSID_NAME_USE Use
= NULL
;
3094 ULONG BuiltinMemberCount
= 0;
3095 ULONG AccountMemberCount
= 0;
3096 PULONG BuiltinAliases
= NULL
;
3097 PULONG AccountAliases
= NULL
;
3098 PUNICODE_STRING BuiltinNames
= NULL
;
3099 PUNICODE_STRING AccountNames
= NULL
;
3100 PLOCALGROUP_USERS_INFO_0 Buffer
= NULL
;
3106 NET_API_STATUS ApiStatus
= NERR_Success
;
3107 NTSTATUS Status
= STATUS_SUCCESS
;
3109 TRACE("(%s, %s, %d, %08x, %p %d, %p, %p) stub!\n",
3110 debugstr_w(servername
), debugstr_w(username
), level
, flags
, bufptr
,
3111 prefmaxlen
, entriesread
, totalentries
);
3114 return ERROR_INVALID_LEVEL
;
3116 if (flags
& ~LG_INCLUDE_INDIRECT
)
3117 return ERROR_INVALID_PARAMETER
;
3119 if (flags
& LG_INCLUDE_INDIRECT
)
3121 WARN("The flag LG_INCLUDE_INDIRECT is not supported yet!\n");
3124 if (servername
!= NULL
)
3125 RtlInitUnicodeString(&ServerName
, servername
);
3127 RtlInitUnicodeString(&UserName
, username
);
3129 /* Connect to the SAM Server */
3130 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3132 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3134 if (!NT_SUCCESS(Status
))
3136 ERR("SamConnect failed (Status %08lx)\n", Status
);
3137 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3141 /* Open the Builtin Domain */
3142 Status
= OpenBuiltinDomain(ServerHandle
,
3143 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
3144 &BuiltinDomainHandle
);
3145 if (!NT_SUCCESS(Status
))
3147 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
3148 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3152 /* Get the Account Domain SID */
3153 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
3155 if (!NT_SUCCESS(Status
))
3157 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
3158 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3162 /* Open the Account Domain */
3163 Status
= SamOpenDomain(ServerHandle
,
3164 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
3166 &AccountDomainHandle
);
3167 if (!NT_SUCCESS(Status
))
3169 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3170 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3174 /* Get the RID for the given user name */
3175 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
3180 if (!NT_SUCCESS(Status
))
3182 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
3183 if (Status
== STATUS_NONE_MAPPED
)
3184 ApiStatus
= NERR_UserNotFound
;
3186 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3190 /* Fail, if it is not a user account */
3191 if (Use
[0] != SidTypeUser
)
3193 ERR("Account is not a User!\n");
3194 ApiStatus
= NERR_UserNotFound
;
3198 /* Build the User SID from the Account Domain SID and the users RID */
3199 ApiStatus
= BuildSidFromSidAndRid(AccountDomainSid
,
3202 if (ApiStatus
!= NERR_Success
)
3204 ERR("BuildSidFromSidAndRid failed!\n");
3208 /* Get alias memberships in the Builtin Domain */
3209 Status
= SamGetAliasMembership(BuiltinDomainHandle
,
3212 &BuiltinMemberCount
,
3214 if (!NT_SUCCESS(Status
))
3216 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
3217 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3221 if (BuiltinMemberCount
> 0)
3223 /* Get the Names of the builtin alias members */
3224 Status
= SamLookupIdsInDomain(BuiltinDomainHandle
,
3229 if (!NT_SUCCESS(Status
))
3231 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
3232 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3237 /* Get alias memberships in the Account Domain */
3238 Status
= SamGetAliasMembership(AccountDomainHandle
,
3241 &AccountMemberCount
,
3243 if (!NT_SUCCESS(Status
))
3245 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
3246 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3250 if (AccountMemberCount
> 0)
3252 /* Get the Names of the builtin alias members */
3253 Status
= SamLookupIdsInDomain(AccountDomainHandle
,
3258 if (!NT_SUCCESS(Status
))
3260 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
3261 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3266 /* Calculate the required buffer size */
3269 for (i
= 0; i
< BuiltinMemberCount
; i
++)
3271 if (BuiltinNames
[i
].Length
> 0)
3273 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3278 for (i
= 0; i
< AccountMemberCount
; i
++)
3280 if (AccountNames
[i
].Length
> 0)
3282 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3289 ApiStatus
= NERR_Success
;
3293 /* Allocate buffer */
3294 ApiStatus
= NetApiBufferAllocate(Size
, (LPVOID
*)&Buffer
);
3295 if (ApiStatus
!= NERR_Success
)
3298 ZeroMemory(Buffer
, Size
);
3300 StrPtr
= (LPWSTR
)((INT_PTR
)Buffer
+ Count
* sizeof(LOCALGROUP_USERS_INFO_0
));
3302 /* Copy data to the allocated buffer */
3304 for (i
= 0; i
< BuiltinMemberCount
; i
++)
3306 if (BuiltinNames
[i
].Length
> 0)
3309 BuiltinNames
[i
].Buffer
,
3310 BuiltinNames
[i
].Length
);
3311 Buffer
[Index
].lgrui0_name
= StrPtr
;
3313 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3318 for (i
= 0; i
< AccountMemberCount
; i
++)
3320 if (AccountNames
[i
].Length
> 0)
3323 AccountNames
[i
].Buffer
,
3324 AccountNames
[i
].Length
);
3325 Buffer
[Index
].lgrui0_name
= StrPtr
;
3327 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3333 if (AccountNames
!= NULL
)
3334 SamFreeMemory(AccountNames
);
3336 if (BuiltinNames
!= NULL
)
3337 SamFreeMemory(BuiltinNames
);
3339 if (AccountAliases
!= NULL
)
3340 SamFreeMemory(AccountAliases
);
3342 if (BuiltinAliases
!= NULL
)
3343 SamFreeMemory(BuiltinAliases
);
3345 if (RelativeIds
!= NULL
)
3346 SamFreeMemory(RelativeIds
);
3351 if (UserSid
!= NULL
)
3352 NetApiBufferFree(UserSid
);
3354 if (AccountDomainSid
!= NULL
)
3355 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
3357 if (AccountDomainHandle
!= NULL
)
3358 SamCloseHandle(AccountDomainHandle
);
3360 if (BuiltinDomainHandle
!= NULL
)
3361 SamCloseHandle(BuiltinDomainHandle
);
3363 if (ServerHandle
!= NULL
)
3364 SamCloseHandle(ServerHandle
);
3366 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
3373 *entriesread
= Count
;
3374 *totalentries
= Count
;
3377 *bufptr
= (LPBYTE
)Buffer
;
3383 /******************************************************************************
3384 * NetUserModalsGet (NETAPI32.@)
3386 * Retrieves global information for all users and global groups in the security
3390 * servername [I] Specifies the DNS or the NetBIOS name of the remote server
3391 * on which the function is to execute.
3392 * level [I] Information level of the data.
3393 * 0 Return global passwords parameters. bufptr points to a
3394 * USER_MODALS_INFO_0 struct.
3395 * 1 Return logon server and domain controller information. bufptr
3396 * points to a USER_MODALS_INFO_1 struct.
3397 * 2 Return domain name and identifier. bufptr points to a
3398 * USER_MODALS_INFO_2 struct.
3399 * 3 Return lockout information. bufptr points to a USER_MODALS_INFO_3
3401 * bufptr [O] Buffer that receives the data.
3404 * Success: NERR_Success.
3406 * ERROR_ACCESS_DENIED - the user does not have access to the info.
3407 * NERR_InvalidComputer - computer name is invalid.
3411 NetUserModalsGet(LPCWSTR servername
,
3415 UNICODE_STRING ServerName
;
3416 SAM_HANDLE ServerHandle
= NULL
;
3417 SAM_HANDLE DomainHandle
= NULL
;
3418 PSID DomainSid
= NULL
;
3419 PDOMAIN_PASSWORD_INFORMATION PasswordInfo
= NULL
;
3420 PDOMAIN_LOGOFF_INFORMATION LogoffInfo
= NULL
;
3421 PDOMAIN_SERVER_ROLE_INFORMATION ServerRoleInfo
= NULL
;
3422 PDOMAIN_REPLICATION_INFORMATION ReplicationInfo
= NULL
;
3423 PDOMAIN_NAME_INFORMATION NameInfo
= NULL
;
3424 PDOMAIN_LOCKOUT_INFORMATION LockoutInfo
= NULL
;
3425 ULONG DesiredAccess
;
3427 PUSER_MODALS_INFO_0 umi0
;
3428 PUSER_MODALS_INFO_1 umi1
;
3429 PUSER_MODALS_INFO_2 umi2
;
3430 PUSER_MODALS_INFO_3 umi3
;
3431 NET_API_STATUS ApiStatus
= NERR_Success
;
3432 NTSTATUS Status
= STATUS_SUCCESS
;
3434 TRACE("(%s %d %p)\n", debugstr_w(servername
), level
, bufptr
);
3438 if (servername
!= NULL
)
3439 RtlInitUnicodeString(&ServerName
, servername
);
3441 /* Connect to the SAM Server */
3442 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3444 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3446 if (!NT_SUCCESS(Status
))
3448 ERR("SamConnect failed (Status %08lx)\n", Status
);
3449 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3453 /* Get the Account Domain SID */
3454 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
3456 if (!NT_SUCCESS(Status
))
3458 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
3459 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3466 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
| DOMAIN_READ_PASSWORD_PARAMETERS
;
3470 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
3474 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
3478 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
3482 ApiStatus
= ERROR_INVALID_LEVEL
;
3486 /* Open the Account Domain */
3487 Status
= SamOpenDomain(ServerHandle
,
3491 if (!NT_SUCCESS(Status
))
3493 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3494 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3501 /* return global passwords parameters */
3502 Status
= SamQueryInformationDomain(DomainHandle
,
3503 DomainPasswordInformation
,
3504 (PVOID
*)&PasswordInfo
);
3505 if (!NT_SUCCESS(Status
))
3507 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3511 Status
= SamQueryInformationDomain(DomainHandle
,
3512 DomainLogoffInformation
,
3513 (PVOID
*)&LogoffInfo
);
3514 if (!NT_SUCCESS(Status
))
3516 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3520 BufferSize
= sizeof(USER_MODALS_INFO_0
);
3524 /* return logon server and domain controller info */
3525 Status
= SamQueryInformationDomain(DomainHandle
,
3526 DomainServerRoleInformation
,
3527 (PVOID
*)&ServerRoleInfo
);
3528 if (!NT_SUCCESS(Status
))
3530 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3534 Status
= SamQueryInformationDomain(DomainHandle
,
3535 DomainReplicationInformation
,
3536 (PVOID
*)&ReplicationInfo
);
3537 if (!NT_SUCCESS(Status
))
3539 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3543 BufferSize
= sizeof(USER_MODALS_INFO_1
) +
3544 ReplicationInfo
->ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
);
3548 /* return domain name and identifier */
3549 Status
= SamQueryInformationDomain(DomainHandle
,
3550 DomainNameInformation
,
3552 if (!NT_SUCCESS(Status
))
3554 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3558 BufferSize
= sizeof( USER_MODALS_INFO_2
) +
3559 NameInfo
->DomainName
.Length
+ sizeof(WCHAR
) +
3560 RtlLengthSid(DomainSid
);
3564 /* return lockout information */
3565 Status
= SamQueryInformationDomain(DomainHandle
,
3566 DomainLockoutInformation
,
3567 (PVOID
*)&LockoutInfo
);
3568 if (!NT_SUCCESS(Status
))
3570 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3574 BufferSize
= sizeof(USER_MODALS_INFO_3
);
3578 TRACE("Invalid level %d is specified\n", level
);
3579 ApiStatus
= ERROR_INVALID_LEVEL
;
3584 ApiStatus
= NetApiBufferAllocate(BufferSize
,
3586 if (ApiStatus
!= NERR_Success
)
3588 WARN("NetApiBufferAllocate() failed\n");
3595 umi0
= (PUSER_MODALS_INFO_0
)*bufptr
;
3597 umi0
->usrmod0_min_passwd_len
= PasswordInfo
->MinPasswordLength
;
3598 umi0
->usrmod0_max_passwd_age
= (ULONG
)(PasswordInfo
->MaxPasswordAge
.QuadPart
/ 10000000);
3599 umi0
->usrmod0_min_passwd_age
=
3600 DeltaTimeToSeconds(PasswordInfo
->MinPasswordAge
);
3601 umi0
->usrmod0_force_logoff
=
3602 DeltaTimeToSeconds(LogoffInfo
->ForceLogoff
);
3603 umi0
->usrmod0_password_hist_len
= PasswordInfo
->PasswordHistoryLength
;
3607 umi1
= (PUSER_MODALS_INFO_1
)*bufptr
;
3609 switch (ServerRoleInfo
->DomainServerRole
)
3612 umi1
->usrmod1_role
= UAS_ROLE_STANDALONE
;
3613 umi1
->usrmod1_role
= UAS_ROLE_MEMBER
;
3615 case DomainServerRolePrimary
:
3616 umi1
->usrmod1_role
= UAS_ROLE_PRIMARY
;
3619 case DomainServerRoleBackup
:
3620 umi1
->usrmod1_role
= UAS_ROLE_BACKUP
;
3624 ApiStatus
= NERR_InternalError
;
3628 umi1
->usrmod1_primary
= (LPWSTR
)(*bufptr
+ sizeof(USER_MODALS_INFO_1
));
3629 RtlCopyMemory(umi1
->usrmod1_primary
,
3630 ReplicationInfo
->ReplicaSourceNodeName
.Buffer
,
3631 ReplicationInfo
->ReplicaSourceNodeName
.Length
);
3632 umi1
->usrmod1_primary
[ReplicationInfo
->ReplicaSourceNodeName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
3636 umi2
= (PUSER_MODALS_INFO_2
)*bufptr
;
3638 umi2
->usrmod2_domain_name
= (LPWSTR
)(*bufptr
+ sizeof(USER_MODALS_INFO_2
));
3639 RtlCopyMemory(umi2
->usrmod2_domain_name
,
3640 NameInfo
->DomainName
.Buffer
,
3641 NameInfo
->DomainName
.Length
);
3642 umi2
->usrmod2_domain_name
[NameInfo
->DomainName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
3644 umi2
->usrmod2_domain_id
= *bufptr
+
3645 sizeof(USER_MODALS_INFO_2
) +
3646 NameInfo
->DomainName
.Length
+ sizeof(WCHAR
);
3647 RtlCopyMemory(umi2
->usrmod2_domain_id
,
3649 RtlLengthSid(DomainSid
));
3653 umi3
= (PUSER_MODALS_INFO_3
)*bufptr
;
3654 umi3
->usrmod3_lockout_duration
=
3655 DeltaTimeToSeconds(LockoutInfo
->LockoutDuration
);
3656 umi3
->usrmod3_lockout_observation_window
=
3657 DeltaTimeToSeconds(LockoutInfo
->LockoutObservationWindow
);
3658 umi3
->usrmod3_lockout_threshold
= LockoutInfo
->LockoutThreshold
;
3663 if (LockoutInfo
!= NULL
)
3664 SamFreeMemory(LockoutInfo
);
3666 if (NameInfo
!= NULL
)
3667 SamFreeMemory(NameInfo
);
3669 if (ReplicationInfo
!= NULL
)
3670 SamFreeMemory(ReplicationInfo
);
3672 if (ServerRoleInfo
!= NULL
)
3673 SamFreeMemory(ServerRoleInfo
);
3675 if (LogoffInfo
!= NULL
)
3676 SamFreeMemory(LogoffInfo
);
3678 if (PasswordInfo
!= NULL
)
3679 SamFreeMemory(PasswordInfo
);
3681 if (DomainSid
!= NULL
)
3682 RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid
);
3684 if (DomainHandle
!= NULL
)
3685 SamCloseHandle(DomainHandle
);
3687 if (ServerHandle
!= NULL
)
3688 SamCloseHandle(ServerHandle
);
3694 /******************************************************************************
3695 * NetUserModalsSet (NETAPI32.@)
3699 NetUserModalsSet(IN LPCWSTR servername
,
3702 OUT LPDWORD parm_err
)
3704 FIXME("(%s %d %p %p)\n", debugstr_w(servername
), level
, buf
, parm_err
);
3705 return ERROR_ACCESS_DENIED
;
3709 /******************************************************************************
3710 * NetUserSetGroups (NETAPI32.@)
3714 NetUserSetGroups(LPCWSTR servername
,
3720 FIXME("(%s %s %lu %p %lu)\n",
3721 debugstr_w(servername
), debugstr_w(username
), level
, buf
, num_entries
);
3722 return ERROR_ACCESS_DENIED
;
3726 /******************************************************************************
3727 * NetUserSetInfo (NETAPI32.@)
3731 NetUserSetInfo(LPCWSTR servername
,
3737 UNICODE_STRING ServerName
;
3738 UNICODE_STRING UserName
;
3739 SAM_HANDLE ServerHandle
= NULL
;
3740 SAM_HANDLE AccountDomainHandle
= NULL
;
3741 SAM_HANDLE UserHandle
= NULL
;
3742 NET_API_STATUS ApiStatus
= NERR_Success
;
3743 NTSTATUS Status
= STATUS_SUCCESS
;
3745 TRACE("(%s %s %lu %p %p)\n",
3746 debugstr_w(servername
), debugstr_w(username
), level
, buf
, parm_err
);
3748 if (parm_err
!= NULL
)
3749 *parm_err
= PARM_ERROR_NONE
;
3751 /* Check the info level */
3783 return ERROR_INVALID_LEVEL
;
3786 if (servername
!= NULL
)
3787 RtlInitUnicodeString(&ServerName
, servername
);
3789 RtlInitUnicodeString(&UserName
, username
);
3791 /* Connect to the SAM Server */
3792 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3794 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3796 if (!NT_SUCCESS(Status
))
3798 ERR("SamConnect failed (Status %08lx)\n", Status
);
3799 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3803 /* Open the Account Domain */
3804 Status
= OpenAccountDomain(ServerHandle
,
3805 (servername
!= NULL
) ? &ServerName
: NULL
,
3806 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
| DOMAIN_READ_PASSWORD_PARAMETERS
,
3807 &AccountDomainHandle
);
3808 if (!NT_SUCCESS(Status
))
3810 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3811 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3815 /* Open the User Account */
3816 ApiStatus
= OpenUserByName(AccountDomainHandle
,
3820 if (ApiStatus
!= NERR_Success
)
3822 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
3826 /* Set user information */
3827 ApiStatus
= SetUserInfo(UserHandle
,
3830 if (ApiStatus
!= NERR_Success
)
3832 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
3836 if (UserHandle
!= NULL
)
3837 SamCloseHandle(UserHandle
);
3839 if (AccountDomainHandle
!= NULL
)
3840 SamCloseHandle(AccountDomainHandle
);
3842 if (ServerHandle
!= NULL
)
3843 SamCloseHandle(ServerHandle
);