2 * Copyright 2002 Andriy Palamarchuk
4 * netapi32 user functions
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 * Implement NetUserGetGroups
24 * Implement NetUserSetGroups
25 * NetUserGetLocalGroups does not support LG_INCLUDE_INDIRECT yet.
26 * Add missing information levels.
32 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
35 typedef struct _ENUM_CONTEXT
37 SAM_HANDLE ServerHandle
;
38 SAM_HANDLE BuiltinDomainHandle
;
39 SAM_HANDLE AccountDomainHandle
;
41 SAM_ENUMERATE_HANDLE EnumerationContext
;
42 PSAM_RID_ENUMERATION Buffer
;
47 } ENUM_CONTEXT
, *PENUM_CONTEXT
;
52 DeltaTimeToSeconds(LARGE_INTEGER DeltaTime
)
54 LARGE_INTEGER Seconds
;
56 if (DeltaTime
.QuadPart
== 0)
59 Seconds
.QuadPart
= -DeltaTime
.QuadPart
/ 10000000;
61 if (Seconds
.HighPart
!= 0)
64 return Seconds
.LowPart
;
70 GetAccountFlags(ULONG AccountControl
)
72 ULONG Flags
= UF_SCRIPT
;
74 if (AccountControl
& USER_ACCOUNT_DISABLED
)
75 Flags
|= UF_ACCOUNTDISABLE
;
77 if (AccountControl
& USER_HOME_DIRECTORY_REQUIRED
)
78 Flags
|= UF_HOMEDIR_REQUIRED
;
80 if (AccountControl
& USER_PASSWORD_NOT_REQUIRED
)
81 Flags
|= UF_PASSWD_NOTREQD
;
83 // UF_PASSWD_CANT_CHANGE
85 if (AccountControl
& USER_ACCOUNT_AUTO_LOCKED
)
88 if (AccountControl
& USER_DONT_EXPIRE_PASSWORD
)
89 Flags
|= UF_DONT_EXPIRE_PASSWD
;
92 if (AccountControl & USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED)
93 Flags |= UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED;
95 if (AccountControl & USER_SMARTCARD_REQUIRED)
96 Flags |= UF_SMARTCARD_REQUIRED;
98 if (AccountControl & USER_TRUSTED_FOR_DELEGATION)
99 Flags |= UF_TRUSTED_FOR_DELEGATION;
101 if (AccountControl & USER_NOT_DELEGATED)
102 Flags |= UF_NOT_DELEGATED;
104 if (AccountControl & USER_USE_DES_KEY_ONLY)
105 Flags |= UF_USE_DES_KEY_ONLY;
107 if (AccountControl & USER_DONT_REQUIRE_PREAUTH)
108 Flags |= UF_DONT_REQUIRE_PREAUTH;
110 if (AccountControl & USER_PASSWORD_EXPIRED)
111 Flags |= UF_PASSWORD_EXPIRED;
114 /* Set account type flags */
115 if (AccountControl
& USER_TEMP_DUPLICATE_ACCOUNT
)
116 Flags
|= UF_TEMP_DUPLICATE_ACCOUNT
;
117 else if (AccountControl
& USER_NORMAL_ACCOUNT
)
118 Flags
|= UF_NORMAL_ACCOUNT
;
119 else if (AccountControl
& USER_INTERDOMAIN_TRUST_ACCOUNT
)
120 Flags
|= UF_INTERDOMAIN_TRUST_ACCOUNT
;
121 else if (AccountControl
& USER_WORKSTATION_TRUST_ACCOUNT
)
122 Flags
|= UF_WORKSTATION_TRUST_ACCOUNT
;
123 else if (AccountControl
& USER_SERVER_TRUST_ACCOUNT
)
124 Flags
|= UF_SERVER_TRUST_ACCOUNT
;
132 GetAccountControl(ULONG Flags
)
134 ULONG AccountControl
= 0;
136 if (Flags
& UF_ACCOUNTDISABLE
)
137 AccountControl
|= USER_ACCOUNT_DISABLED
;
139 if (Flags
& UF_HOMEDIR_REQUIRED
)
140 AccountControl
|= USER_HOME_DIRECTORY_REQUIRED
;
142 if (Flags
& UF_PASSWD_NOTREQD
)
143 AccountControl
|= USER_PASSWORD_NOT_REQUIRED
;
145 if (Flags
& UF_LOCKOUT
)
146 AccountControl
|= USER_ACCOUNT_AUTO_LOCKED
;
148 if (Flags
& UF_DONT_EXPIRE_PASSWD
)
149 AccountControl
|= USER_DONT_EXPIRE_PASSWORD
;
151 /* Set account type flags */
152 if (Flags
& UF_TEMP_DUPLICATE_ACCOUNT
)
153 AccountControl
|= USER_TEMP_DUPLICATE_ACCOUNT
;
154 else if (Flags
& UF_NORMAL_ACCOUNT
)
155 AccountControl
|= USER_NORMAL_ACCOUNT
;
156 else if (Flags
& UF_INTERDOMAIN_TRUST_ACCOUNT
)
157 AccountControl
|= USER_INTERDOMAIN_TRUST_ACCOUNT
;
158 else if (Flags
& UF_WORKSTATION_TRUST_ACCOUNT
)
159 AccountControl
|= USER_WORKSTATION_TRUST_ACCOUNT
;
160 else if (Flags
& UF_SERVER_TRUST_ACCOUNT
)
161 AccountControl
|= USER_SERVER_TRUST_ACCOUNT
;
163 return AccountControl
;
169 GetPasswordAge(IN PLARGE_INTEGER PasswordLastSet
)
171 LARGE_INTEGER SystemTime
;
172 ULONG SystemSecondsSince1970
;
173 ULONG PasswordSecondsSince1970
;
176 Status
= NtQuerySystemTime(&SystemTime
);
177 if (!NT_SUCCESS(Status
))
180 RtlTimeToSecondsSince1970(&SystemTime
, &SystemSecondsSince1970
);
181 RtlTimeToSecondsSince1970(PasswordLastSet
, &PasswordSecondsSince1970
);
183 return SystemSecondsSince1970
- PasswordSecondsSince1970
;
189 BuildUserInfoBuffer(PUSER_ALL_INFORMATION UserInfo
,
194 UNICODE_STRING LogonServer
= RTL_CONSTANT_STRING(L
"\\\\*");
195 LPVOID LocalBuffer
= NULL
;
196 PUSER_INFO_0 UserInfo0
;
197 PUSER_INFO_1 UserInfo1
;
198 PUSER_INFO_2 UserInfo2
;
199 PUSER_INFO_3 UserInfo3
;
200 PUSER_INFO_4 UserInfo4
;
201 PUSER_INFO_10 UserInfo10
;
202 PUSER_INFO_11 UserInfo11
;
203 PUSER_INFO_20 UserInfo20
;
204 PUSER_INFO_23 UserInfo23
;
207 NET_API_STATUS ApiStatus
= NERR_Success
;
214 Size
= sizeof(USER_INFO_0
) +
215 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
219 Size
= sizeof(USER_INFO_1
) +
220 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
222 if (UserInfo
->HomeDirectory
.Length
> 0)
223 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
225 if (UserInfo
->AdminComment
.Length
> 0)
226 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
228 if (UserInfo
->ScriptPath
.Length
> 0)
229 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
233 Size
= sizeof(USER_INFO_2
) +
234 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
236 if (UserInfo
->HomeDirectory
.Length
> 0)
237 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
239 if (UserInfo
->AdminComment
.Length
> 0)
240 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
242 if (UserInfo
->ScriptPath
.Length
> 0)
243 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
245 if (UserInfo
->FullName
.Length
> 0)
246 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
248 if (UserInfo
->UserComment
.Length
> 0)
249 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
251 if (UserInfo
->Parameters
.Length
> 0)
252 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
254 if (UserInfo
->WorkStations
.Length
> 0)
255 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
257 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
258 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
260 if (LogonServer
.Length
> 0)
261 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
265 Size
= sizeof(USER_INFO_3
) +
266 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
268 if (UserInfo
->HomeDirectory
.Length
> 0)
269 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
271 if (UserInfo
->AdminComment
.Length
> 0)
272 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
274 if (UserInfo
->ScriptPath
.Length
> 0)
275 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
277 if (UserInfo
->FullName
.Length
> 0)
278 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
280 if (UserInfo
->UserComment
.Length
> 0)
281 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
283 if (UserInfo
->Parameters
.Length
> 0)
284 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
286 if (UserInfo
->WorkStations
.Length
> 0)
287 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
289 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
290 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
292 if (LogonServer
.Length
> 0)
293 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
295 if (UserInfo
->ProfilePath
.Length
> 0)
296 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
298 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
299 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
303 Size
= sizeof(USER_INFO_4
) +
304 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
306 if (UserInfo
->HomeDirectory
.Length
> 0)
307 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
309 if (UserInfo
->AdminComment
.Length
> 0)
310 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
312 if (UserInfo
->ScriptPath
.Length
> 0)
313 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
315 if (UserInfo
->FullName
.Length
> 0)
316 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
318 if (UserInfo
->UserComment
.Length
> 0)
319 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
321 if (UserInfo
->Parameters
.Length
> 0)
322 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
324 if (UserInfo
->WorkStations
.Length
> 0)
325 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
327 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
328 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
330 if (LogonServer
.Length
> 0)
331 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
333 /* FIXME: usri4_user_sid */
335 if (UserInfo
->ProfilePath
.Length
> 0)
336 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
338 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
339 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
343 Size
= sizeof(USER_INFO_10
) +
344 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
346 if (UserInfo
->AdminComment
.Length
> 0)
347 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
349 if (UserInfo
->UserComment
.Length
> 0)
350 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
352 if (UserInfo
->FullName
.Length
> 0)
353 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
357 Size
= sizeof(USER_INFO_11
) +
358 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
360 if (UserInfo
->AdminComment
.Length
> 0)
361 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
363 if (UserInfo
->UserComment
.Length
> 0)
364 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
366 if (UserInfo
->FullName
.Length
> 0)
367 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
369 if (UserInfo
->HomeDirectory
.Length
> 0)
370 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
372 if (UserInfo
->Parameters
.Length
> 0)
373 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
375 if (LogonServer
.Length
> 0)
376 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
378 if (UserInfo
->WorkStations
.Length
> 0)
379 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
381 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
382 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
386 Size
= sizeof(USER_INFO_20
) +
387 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
389 if (UserInfo
->FullName
.Length
> 0)
390 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
392 if (UserInfo
->AdminComment
.Length
> 0)
393 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
397 Size
= sizeof(USER_INFO_23
) +
398 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
400 if (UserInfo
->FullName
.Length
> 0)
401 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
403 if (UserInfo
->AdminComment
.Length
> 0)
404 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
406 /* FIXME: usri23_user_sid */
410 ApiStatus
= ERROR_INVALID_LEVEL
;
414 ApiStatus
= NetApiBufferAllocate(Size
, &LocalBuffer
);
415 if (ApiStatus
!= NERR_Success
)
418 ZeroMemory(LocalBuffer
, Size
);
423 UserInfo0
= (PUSER_INFO_0
)LocalBuffer
;
425 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo0
+ sizeof(USER_INFO_0
));
426 UserInfo0
->usri0_name
= Ptr
;
428 memcpy(UserInfo0
->usri0_name
,
429 UserInfo
->UserName
.Buffer
,
430 UserInfo
->UserName
.Length
);
431 UserInfo0
->usri0_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
435 UserInfo1
= (PUSER_INFO_1
)LocalBuffer
;
437 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo1
+ sizeof(USER_INFO_1
));
439 UserInfo1
->usri1_name
= Ptr
;
441 memcpy(UserInfo1
->usri1_name
,
442 UserInfo
->UserName
.Buffer
,
443 UserInfo
->UserName
.Length
);
444 UserInfo1
->usri1_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
446 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
448 UserInfo1
->usri1_password
= NULL
;
450 UserInfo1
->usri1_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
452 /* FIXME: UserInfo1->usri1_priv */
454 if (UserInfo
->HomeDirectory
.Length
> 0)
456 UserInfo1
->usri1_home_dir
= Ptr
;
458 memcpy(UserInfo1
->usri1_home_dir
,
459 UserInfo
->HomeDirectory
.Buffer
,
460 UserInfo
->HomeDirectory
.Length
);
461 UserInfo1
->usri1_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
463 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
466 if (UserInfo
->AdminComment
.Length
> 0)
468 UserInfo1
->usri1_comment
= Ptr
;
470 memcpy(UserInfo1
->usri1_comment
,
471 UserInfo
->AdminComment
.Buffer
,
472 UserInfo
->AdminComment
.Length
);
473 UserInfo1
->usri1_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
475 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
478 UserInfo1
->usri1_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
480 if (UserInfo
->ScriptPath
.Length
> 0)
482 UserInfo1
->usri1_script_path
= Ptr
;
484 memcpy(UserInfo1
->usri1_script_path
,
485 UserInfo
->ScriptPath
.Buffer
,
486 UserInfo
->ScriptPath
.Length
);
487 UserInfo1
->usri1_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
492 UserInfo2
= (PUSER_INFO_2
)LocalBuffer
;
494 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo2
+ sizeof(USER_INFO_2
));
496 UserInfo2
->usri2_name
= Ptr
;
498 memcpy(UserInfo2
->usri2_name
,
499 UserInfo
->UserName
.Buffer
,
500 UserInfo
->UserName
.Length
);
501 UserInfo2
->usri2_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
503 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
505 UserInfo2
->usri2_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
507 /* FIXME: usri2_priv */
509 if (UserInfo
->HomeDirectory
.Length
> 0)
511 UserInfo2
->usri2_home_dir
= Ptr
;
513 memcpy(UserInfo2
->usri2_home_dir
,
514 UserInfo
->HomeDirectory
.Buffer
,
515 UserInfo
->HomeDirectory
.Length
);
516 UserInfo2
->usri2_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
518 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
521 if (UserInfo
->AdminComment
.Length
> 0)
523 UserInfo2
->usri2_comment
= Ptr
;
525 memcpy(UserInfo2
->usri2_comment
,
526 UserInfo
->AdminComment
.Buffer
,
527 UserInfo
->AdminComment
.Length
);
528 UserInfo2
->usri2_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
530 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
533 UserInfo2
->usri2_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
535 if (UserInfo
->ScriptPath
.Length
> 0)
537 UserInfo2
->usri2_script_path
= Ptr
;
539 memcpy(UserInfo2
->usri2_script_path
,
540 UserInfo
->ScriptPath
.Buffer
,
541 UserInfo
->ScriptPath
.Length
);
542 UserInfo2
->usri2_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
544 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
547 /* FIXME: usri2_auth_flags */
549 if (UserInfo
->FullName
.Length
> 0)
551 UserInfo2
->usri2_full_name
= Ptr
;
553 memcpy(UserInfo2
->usri2_full_name
,
554 UserInfo
->FullName
.Buffer
,
555 UserInfo
->FullName
.Length
);
556 UserInfo2
->usri2_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
558 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
561 if (UserInfo
->UserComment
.Length
> 0)
563 UserInfo2
->usri2_usr_comment
= Ptr
;
565 memcpy(UserInfo2
->usri2_usr_comment
,
566 UserInfo
->UserComment
.Buffer
,
567 UserInfo
->UserComment
.Length
);
568 UserInfo2
->usri2_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
570 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
573 if (UserInfo
->Parameters
.Length
> 0)
575 UserInfo2
->usri2_parms
= Ptr
;
577 memcpy(UserInfo2
->usri2_parms
,
578 UserInfo
->Parameters
.Buffer
,
579 UserInfo
->Parameters
.Length
);
580 UserInfo2
->usri2_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
582 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
585 if (UserInfo
->WorkStations
.Length
> 0)
587 UserInfo2
->usri2_workstations
= Ptr
;
589 memcpy(UserInfo2
->usri2_workstations
,
590 UserInfo
->WorkStations
.Buffer
,
591 UserInfo
->WorkStations
.Length
);
592 UserInfo2
->usri2_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
594 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
597 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
598 &UserInfo2
->usri2_last_logon
);
600 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
601 &UserInfo2
->usri2_last_logoff
);
603 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
604 &UserInfo2
->usri2_acct_expires
);
606 UserInfo2
->usri2_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
607 UserInfo2
->usri2_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
609 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
611 UserInfo2
->usri2_logon_hours
= (PVOID
)Ptr
;
613 memcpy(UserInfo2
->usri2_logon_hours
,
614 UserInfo
->LogonHours
.LogonHours
,
615 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
617 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
620 UserInfo2
->usri2_bad_pw_count
= UserInfo
->BadPasswordCount
;
621 UserInfo2
->usri2_num_logons
= UserInfo
->LogonCount
;
623 if (LogonServer
.Length
> 0)
625 UserInfo2
->usri2_logon_server
= Ptr
;
627 memcpy(UserInfo2
->usri2_logon_server
,
630 UserInfo2
->usri2_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
632 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
635 UserInfo2
->usri2_country_code
= UserInfo
->CountryCode
;
636 UserInfo2
->usri2_code_page
= UserInfo
->CodePage
;
640 UserInfo3
= (PUSER_INFO_3
)LocalBuffer
;
642 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo3
+ sizeof(USER_INFO_3
));
644 UserInfo3
->usri3_name
= Ptr
;
646 memcpy(UserInfo3
->usri3_name
,
647 UserInfo
->UserName
.Buffer
,
648 UserInfo
->UserName
.Length
);
649 UserInfo3
->usri3_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
651 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
653 UserInfo3
->usri3_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
655 /* FIXME: usri3_priv */
657 if (UserInfo
->HomeDirectory
.Length
> 0)
659 UserInfo3
->usri3_home_dir
= Ptr
;
661 memcpy(UserInfo3
->usri3_home_dir
,
662 UserInfo
->HomeDirectory
.Buffer
,
663 UserInfo
->HomeDirectory
.Length
);
664 UserInfo3
->usri3_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
666 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
669 if (UserInfo
->AdminComment
.Length
> 0)
671 UserInfo3
->usri3_comment
= Ptr
;
673 memcpy(UserInfo3
->usri3_comment
,
674 UserInfo
->AdminComment
.Buffer
,
675 UserInfo
->AdminComment
.Length
);
676 UserInfo3
->usri3_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
678 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
681 UserInfo3
->usri3_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
683 if (UserInfo
->ScriptPath
.Length
> 0)
685 UserInfo3
->usri3_script_path
= Ptr
;
687 memcpy(UserInfo3
->usri3_script_path
,
688 UserInfo
->ScriptPath
.Buffer
,
689 UserInfo
->ScriptPath
.Length
);
690 UserInfo3
->usri3_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
692 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
695 /* FIXME: usri3_auth_flags */
697 if (UserInfo
->FullName
.Length
> 0)
699 UserInfo3
->usri3_full_name
= Ptr
;
701 memcpy(UserInfo3
->usri3_full_name
,
702 UserInfo
->FullName
.Buffer
,
703 UserInfo
->FullName
.Length
);
704 UserInfo3
->usri3_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
706 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
709 if (UserInfo
->UserComment
.Length
> 0)
711 UserInfo3
->usri3_usr_comment
= Ptr
;
713 memcpy(UserInfo3
->usri3_usr_comment
,
714 UserInfo
->UserComment
.Buffer
,
715 UserInfo
->UserComment
.Length
);
716 UserInfo3
->usri3_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
718 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
721 if (UserInfo
->Parameters
.Length
> 0)
723 UserInfo3
->usri3_parms
= Ptr
;
725 memcpy(UserInfo3
->usri3_parms
,
726 UserInfo
->Parameters
.Buffer
,
727 UserInfo
->Parameters
.Length
);
728 UserInfo3
->usri3_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
730 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
733 if (UserInfo
->WorkStations
.Length
> 0)
735 UserInfo3
->usri3_workstations
= Ptr
;
737 memcpy(UserInfo3
->usri3_workstations
,
738 UserInfo
->WorkStations
.Buffer
,
739 UserInfo
->WorkStations
.Length
);
740 UserInfo3
->usri3_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
742 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
745 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
746 &UserInfo3
->usri3_last_logon
);
748 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
749 &UserInfo3
->usri3_last_logoff
);
751 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
752 &UserInfo3
->usri3_acct_expires
);
754 UserInfo3
->usri3_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
755 UserInfo3
->usri3_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
757 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
759 UserInfo3
->usri3_logon_hours
= (PVOID
)Ptr
;
761 memcpy(UserInfo3
->usri3_logon_hours
,
762 UserInfo
->LogonHours
.LogonHours
,
763 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
765 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
768 UserInfo3
->usri3_bad_pw_count
= UserInfo
->BadPasswordCount
;
769 UserInfo3
->usri3_num_logons
= UserInfo
->LogonCount
;
771 if (LogonServer
.Length
> 0)
773 UserInfo3
->usri3_logon_server
= Ptr
;
775 memcpy(UserInfo3
->usri3_logon_server
,
778 UserInfo3
->usri3_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
780 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
783 UserInfo3
->usri3_country_code
= UserInfo
->CountryCode
;
784 UserInfo3
->usri3_code_page
= UserInfo
->CodePage
;
785 UserInfo3
->usri3_user_id
= RelativeId
;
786 UserInfo3
->usri3_primary_group_id
= UserInfo
->PrimaryGroupId
;
788 if (UserInfo
->ProfilePath
.Length
> 0)
790 UserInfo3
->usri3_profile
= Ptr
;
792 memcpy(UserInfo3
->usri3_profile
,
793 UserInfo
->ProfilePath
.Buffer
,
794 UserInfo
->ProfilePath
.Length
);
795 UserInfo3
->usri3_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
797 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
800 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
802 UserInfo3
->usri3_home_dir_drive
= Ptr
;
804 memcpy(UserInfo3
->usri3_home_dir_drive
,
805 UserInfo
->HomeDirectoryDrive
.Buffer
,
806 UserInfo
->HomeDirectoryDrive
.Length
);
807 UserInfo3
->usri3_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
809 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
812 UserInfo3
->usri3_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
816 UserInfo4
= (PUSER_INFO_4
)LocalBuffer
;
818 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo4
+ sizeof(USER_INFO_4
));
820 UserInfo4
->usri4_name
= Ptr
;
822 memcpy(UserInfo4
->usri4_name
,
823 UserInfo
->UserName
.Buffer
,
824 UserInfo
->UserName
.Length
);
825 UserInfo4
->usri4_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
827 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
829 UserInfo4
->usri4_password
= NULL
;
830 UserInfo4
->usri4_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
832 /* FIXME: usri4_priv */
834 if (UserInfo
->HomeDirectory
.Length
> 0)
836 UserInfo4
->usri4_home_dir
= Ptr
;
838 memcpy(UserInfo4
->usri4_home_dir
,
839 UserInfo
->HomeDirectory
.Buffer
,
840 UserInfo
->HomeDirectory
.Length
);
841 UserInfo4
->usri4_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
843 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
846 if (UserInfo
->AdminComment
.Length
> 0)
848 UserInfo4
->usri4_comment
= Ptr
;
850 memcpy(UserInfo4
->usri4_comment
,
851 UserInfo
->AdminComment
.Buffer
,
852 UserInfo
->AdminComment
.Length
);
853 UserInfo4
->usri4_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
855 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
858 UserInfo4
->usri4_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
860 if (UserInfo
->ScriptPath
.Length
> 0)
862 UserInfo4
->usri4_script_path
= Ptr
;
864 memcpy(UserInfo4
->usri4_script_path
,
865 UserInfo
->ScriptPath
.Buffer
,
866 UserInfo
->ScriptPath
.Length
);
867 UserInfo4
->usri4_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
869 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
872 /* FIXME: usri4_auth_flags */
874 if (UserInfo
->FullName
.Length
> 0)
876 UserInfo4
->usri4_full_name
= Ptr
;
878 memcpy(UserInfo4
->usri4_full_name
,
879 UserInfo
->FullName
.Buffer
,
880 UserInfo
->FullName
.Length
);
881 UserInfo4
->usri4_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
883 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
886 if (UserInfo
->UserComment
.Length
> 0)
888 UserInfo4
->usri4_usr_comment
= Ptr
;
890 memcpy(UserInfo4
->usri4_usr_comment
,
891 UserInfo
->UserComment
.Buffer
,
892 UserInfo
->UserComment
.Length
);
893 UserInfo4
->usri4_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
895 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
898 if (UserInfo
->Parameters
.Length
> 0)
900 UserInfo4
->usri4_parms
= Ptr
;
902 memcpy(UserInfo4
->usri4_parms
,
903 UserInfo
->Parameters
.Buffer
,
904 UserInfo
->Parameters
.Length
);
905 UserInfo4
->usri4_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
907 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
910 if (UserInfo
->WorkStations
.Length
> 0)
912 UserInfo4
->usri4_workstations
= Ptr
;
914 memcpy(UserInfo4
->usri4_workstations
,
915 UserInfo
->WorkStations
.Buffer
,
916 UserInfo
->WorkStations
.Length
);
917 UserInfo4
->usri4_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
919 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
922 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
923 &UserInfo4
->usri4_last_logon
);
925 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
926 &UserInfo4
->usri4_last_logoff
);
928 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
929 &UserInfo4
->usri4_acct_expires
);
931 UserInfo4
->usri4_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
932 UserInfo4
->usri4_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
934 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
936 UserInfo4
->usri4_logon_hours
= (PVOID
)Ptr
;
938 memcpy(UserInfo4
->usri4_logon_hours
,
939 UserInfo
->LogonHours
.LogonHours
,
940 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
942 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
945 UserInfo4
->usri4_bad_pw_count
= UserInfo
->BadPasswordCount
;
946 UserInfo4
->usri4_num_logons
= UserInfo
->LogonCount
;
948 if (LogonServer
.Length
> 0)
950 UserInfo4
->usri4_logon_server
= Ptr
;
952 memcpy(UserInfo4
->usri4_logon_server
,
955 UserInfo4
->usri4_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
957 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
960 UserInfo4
->usri4_country_code
= UserInfo
->CountryCode
;
961 UserInfo4
->usri4_code_page
= UserInfo
->CodePage
;
963 /* FIXME: usri4_user_sid */
965 UserInfo4
->usri4_primary_group_id
= UserInfo
->PrimaryGroupId
;
967 if (UserInfo
->ProfilePath
.Length
> 0)
969 UserInfo4
->usri4_profile
= Ptr
;
971 memcpy(UserInfo4
->usri4_profile
,
972 UserInfo
->ProfilePath
.Buffer
,
973 UserInfo
->ProfilePath
.Length
);
974 UserInfo4
->usri4_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
976 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
979 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
981 UserInfo4
->usri4_home_dir_drive
= Ptr
;
983 memcpy(UserInfo4
->usri4_home_dir_drive
,
984 UserInfo
->HomeDirectoryDrive
.Buffer
,
985 UserInfo
->HomeDirectoryDrive
.Length
);
986 UserInfo4
->usri4_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
988 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
991 UserInfo4
->usri4_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
995 UserInfo10
= (PUSER_INFO_10
)LocalBuffer
;
997 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo10
+ sizeof(USER_INFO_10
));
999 UserInfo10
->usri10_name
= Ptr
;
1001 memcpy(UserInfo10
->usri10_name
,
1002 UserInfo
->UserName
.Buffer
,
1003 UserInfo
->UserName
.Length
);
1004 UserInfo10
->usri10_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1006 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1008 if (UserInfo
->AdminComment
.Length
> 0)
1010 UserInfo10
->usri10_comment
= Ptr
;
1012 memcpy(UserInfo10
->usri10_comment
,
1013 UserInfo
->AdminComment
.Buffer
,
1014 UserInfo
->AdminComment
.Length
);
1015 UserInfo10
->usri10_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1017 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1020 if (UserInfo
->UserComment
.Length
> 0)
1022 UserInfo10
->usri10_usr_comment
= Ptr
;
1024 memcpy(UserInfo10
->usri10_usr_comment
,
1025 UserInfo
->UserComment
.Buffer
,
1026 UserInfo
->UserComment
.Length
);
1027 UserInfo10
->usri10_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1029 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1032 if (UserInfo
->FullName
.Length
> 0)
1034 UserInfo10
->usri10_full_name
= Ptr
;
1036 memcpy(UserInfo10
->usri10_full_name
,
1037 UserInfo
->FullName
.Buffer
,
1038 UserInfo
->FullName
.Length
);
1039 UserInfo10
->usri10_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1041 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1046 UserInfo11
= (PUSER_INFO_11
)LocalBuffer
;
1048 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo11
+ sizeof(USER_INFO_11
));
1050 UserInfo11
->usri11_name
= Ptr
;
1052 memcpy(UserInfo11
->usri11_name
,
1053 UserInfo
->UserName
.Buffer
,
1054 UserInfo
->UserName
.Length
);
1055 UserInfo11
->usri11_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1057 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1059 if (UserInfo
->AdminComment
.Length
> 0)
1061 UserInfo11
->usri11_comment
= Ptr
;
1063 memcpy(UserInfo11
->usri11_comment
,
1064 UserInfo
->AdminComment
.Buffer
,
1065 UserInfo
->AdminComment
.Length
);
1066 UserInfo11
->usri11_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1068 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1071 if (UserInfo
->UserComment
.Length
> 0)
1073 UserInfo11
->usri11_usr_comment
= Ptr
;
1075 memcpy(UserInfo11
->usri11_usr_comment
,
1076 UserInfo
->UserComment
.Buffer
,
1077 UserInfo
->UserComment
.Length
);
1078 UserInfo11
->usri11_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1080 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
1083 if (UserInfo
->FullName
.Length
> 0)
1085 UserInfo11
->usri11_full_name
= Ptr
;
1087 memcpy(UserInfo11
->usri11_full_name
,
1088 UserInfo
->FullName
.Buffer
,
1089 UserInfo
->FullName
.Length
);
1090 UserInfo11
->usri11_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1092 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1095 /* FIXME: usri11_priv */
1096 /* FIXME: usri11_auth_flags */
1098 UserInfo11
->usri11_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
1100 if (UserInfo
->HomeDirectory
.Length
> 0)
1102 UserInfo11
->usri11_home_dir
= Ptr
;
1104 memcpy(UserInfo11
->usri11_home_dir
,
1105 UserInfo
->HomeDirectory
.Buffer
,
1106 UserInfo
->HomeDirectory
.Length
);
1107 UserInfo11
->usri11_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1109 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
1112 if (UserInfo
->Parameters
.Length
> 0)
1114 UserInfo11
->usri11_parms
= Ptr
;
1116 memcpy(UserInfo11
->usri11_parms
,
1117 UserInfo
->Parameters
.Buffer
,
1118 UserInfo
->Parameters
.Length
);
1119 UserInfo11
->usri11_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1121 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
1124 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
1125 &UserInfo11
->usri11_last_logon
);
1127 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
1128 &UserInfo11
->usri11_last_logoff
);
1130 UserInfo11
->usri11_bad_pw_count
= UserInfo
->BadPasswordCount
;
1131 UserInfo11
->usri11_num_logons
= UserInfo
->LogonCount
;
1133 if (LogonServer
.Length
> 0)
1135 UserInfo11
->usri11_logon_server
= Ptr
;
1137 memcpy(UserInfo11
->usri11_logon_server
,
1139 LogonServer
.Length
);
1140 UserInfo11
->usri11_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1142 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
1145 UserInfo11
->usri11_country_code
= UserInfo
->CountryCode
;
1147 if (UserInfo
->WorkStations
.Length
> 0)
1149 UserInfo11
->usri11_workstations
= Ptr
;
1151 memcpy(UserInfo11
->usri11_workstations
,
1152 UserInfo
->WorkStations
.Buffer
,
1153 UserInfo
->WorkStations
.Length
);
1154 UserInfo11
->usri11_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1156 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
1159 UserInfo11
->usri11_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
1160 UserInfo11
->usri11_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
1162 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
1164 UserInfo11
->usri11_logon_hours
= (PVOID
)Ptr
;
1166 memcpy(UserInfo11
->usri11_logon_hours
,
1167 UserInfo
->LogonHours
.LogonHours
,
1168 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1170 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
1173 UserInfo11
->usri11_code_page
= UserInfo
->CodePage
;
1177 UserInfo20
= (PUSER_INFO_20
)LocalBuffer
;
1179 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo20
+ sizeof(USER_INFO_20
));
1181 UserInfo20
->usri20_name
= Ptr
;
1183 memcpy(UserInfo20
->usri20_name
,
1184 UserInfo
->UserName
.Buffer
,
1185 UserInfo
->UserName
.Length
);
1186 UserInfo20
->usri20_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1188 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1190 if (UserInfo
->FullName
.Length
> 0)
1192 UserInfo20
->usri20_full_name
= Ptr
;
1194 memcpy(UserInfo20
->usri20_full_name
,
1195 UserInfo
->FullName
.Buffer
,
1196 UserInfo
->FullName
.Length
);
1197 UserInfo20
->usri20_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1199 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1202 if (UserInfo
->AdminComment
.Length
> 0)
1204 UserInfo20
->usri20_comment
= Ptr
;
1206 memcpy(UserInfo20
->usri20_comment
,
1207 UserInfo
->AdminComment
.Buffer
,
1208 UserInfo
->AdminComment
.Length
);
1209 UserInfo20
->usri20_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1211 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1214 UserInfo20
->usri20_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
1216 UserInfo20
->usri20_user_id
= RelativeId
;
1220 UserInfo23
= (PUSER_INFO_23
)LocalBuffer
;
1222 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo23
+ sizeof(USER_INFO_23
));
1224 UserInfo23
->usri23_name
= Ptr
;
1226 memcpy(UserInfo23
->usri23_name
,
1227 UserInfo
->UserName
.Buffer
,
1228 UserInfo
->UserName
.Length
);
1229 UserInfo23
->usri23_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1231 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
1233 if (UserInfo
->FullName
.Length
> 0)
1235 UserInfo23
->usri23_full_name
= Ptr
;
1237 memcpy(UserInfo23
->usri23_full_name
,
1238 UserInfo
->FullName
.Buffer
,
1239 UserInfo
->FullName
.Length
);
1240 UserInfo23
->usri23_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1242 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
1245 if (UserInfo
->AdminComment
.Length
> 0)
1247 UserInfo23
->usri23_comment
= Ptr
;
1249 memcpy(UserInfo23
->usri23_comment
,
1250 UserInfo
->AdminComment
.Buffer
,
1251 UserInfo
->AdminComment
.Length
);
1252 UserInfo23
->usri23_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
1254 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1257 UserInfo23
->usri23_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
1259 /* FIXME: usri23_user_sid */
1264 if (ApiStatus
== NERR_Success
)
1266 *Buffer
= LocalBuffer
;
1270 if (LocalBuffer
!= NULL
)
1271 NetApiBufferFree(LocalBuffer
);
1280 FreeUserInfo(PUSER_ALL_INFORMATION UserInfo
)
1282 if (UserInfo
->UserName
.Buffer
!= NULL
)
1283 SamFreeMemory(UserInfo
->UserName
.Buffer
);
1285 if (UserInfo
->FullName
.Buffer
!= NULL
)
1286 SamFreeMemory(UserInfo
->FullName
.Buffer
);
1288 if (UserInfo
->HomeDirectory
.Buffer
!= NULL
)
1289 SamFreeMemory(UserInfo
->HomeDirectory
.Buffer
);
1291 if (UserInfo
->HomeDirectoryDrive
.Buffer
!= NULL
)
1292 SamFreeMemory(UserInfo
->HomeDirectoryDrive
.Buffer
);
1294 if (UserInfo
->ScriptPath
.Buffer
!= NULL
)
1295 SamFreeMemory(UserInfo
->ScriptPath
.Buffer
);
1297 if (UserInfo
->ProfilePath
.Buffer
!= NULL
)
1298 SamFreeMemory(UserInfo
->ProfilePath
.Buffer
);
1300 if (UserInfo
->AdminComment
.Buffer
!= NULL
)
1301 SamFreeMemory(UserInfo
->AdminComment
.Buffer
);
1303 if (UserInfo
->WorkStations
.Buffer
!= NULL
)
1304 SamFreeMemory(UserInfo
->WorkStations
.Buffer
);
1306 if (UserInfo
->UserComment
.Buffer
!= NULL
)
1307 SamFreeMemory(UserInfo
->UserComment
.Buffer
);
1309 if (UserInfo
->Parameters
.Buffer
!= NULL
)
1310 SamFreeMemory(UserInfo
->Parameters
.Buffer
);
1312 if (UserInfo
->PrivateData
.Buffer
!= NULL
)
1313 SamFreeMemory(UserInfo
->PrivateData
.Buffer
);
1315 if (UserInfo
->LogonHours
.LogonHours
!= NULL
)
1316 SamFreeMemory(UserInfo
->LogonHours
.LogonHours
);
1318 SamFreeMemory(UserInfo
);
1324 SetUserInfo(SAM_HANDLE UserHandle
,
1328 USER_ALL_INFORMATION UserAllInfo
;
1329 PUSER_INFO_0 UserInfo0
;
1330 PUSER_INFO_1 UserInfo1
;
1331 PUSER_INFO_2 UserInfo2
;
1332 PUSER_INFO_3 UserInfo3
;
1333 PUSER_INFO_4 UserInfo4
;
1334 PUSER_INFO_1003 UserInfo1003
;
1335 PUSER_INFO_1006 UserInfo1006
;
1336 PUSER_INFO_1007 UserInfo1007
;
1337 PUSER_INFO_1008 UserInfo1008
;
1338 PUSER_INFO_1009 UserInfo1009
;
1339 PUSER_INFO_1011 UserInfo1011
;
1340 PUSER_INFO_1012 UserInfo1012
;
1341 PUSER_INFO_1013 UserInfo1013
;
1342 PUSER_INFO_1014 UserInfo1014
;
1343 PUSER_INFO_1017 UserInfo1017
;
1344 PUSER_INFO_1018 UserInfo1018
;
1345 PUSER_INFO_1024 UserInfo1024
;
1346 PUSER_INFO_1025 UserInfo1025
;
1347 PUSER_INFO_1051 UserInfo1051
;
1348 PUSER_INFO_1052 UserInfo1052
;
1349 PUSER_INFO_1053 UserInfo1053
;
1350 NET_API_STATUS ApiStatus
= NERR_Success
;
1351 NTSTATUS Status
= STATUS_SUCCESS
;
1353 ZeroMemory(&UserAllInfo
, sizeof(USER_ALL_INFORMATION
));
1358 UserInfo0
= (PUSER_INFO_0
)UserInfo
;
1360 RtlInitUnicodeString(&UserAllInfo
.UserName
,
1361 UserInfo0
->usri0_name
);
1363 UserAllInfo
.WhichFields
|= USER_ALL_USERNAME
;
1367 UserInfo1
= (PUSER_INFO_1
)UserInfo
;
1369 // usri1_name ignored
1371 if (UserInfo1
->usri1_password
!= NULL
)
1373 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1374 UserInfo1
->usri1_password
);
1375 UserAllInfo
.NtPasswordPresent
= TRUE
;
1376 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1379 // usri1_password_age ignored
1381 // UserInfo1->usri1_priv
1383 if (UserInfo1
->usri1_home_dir
!= NULL
)
1385 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1386 UserInfo1
->usri1_home_dir
);
1387 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1390 if (UserInfo1
->usri1_comment
!= NULL
)
1392 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1393 UserInfo1
->usri1_comment
);
1394 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1397 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1
->usri1_flags
);
1398 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1400 if (UserInfo1
->usri1_script_path
!= NULL
)
1402 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1403 UserInfo1
->usri1_script_path
);
1404 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1409 UserInfo2
= (PUSER_INFO_2
)UserInfo
;
1411 // usri2_name ignored
1413 if (UserInfo2
->usri2_password
!= NULL
)
1415 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1416 UserInfo2
->usri2_password
);
1417 UserAllInfo
.NtPasswordPresent
= TRUE
;
1418 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1421 // usri2_password_age ignored
1423 // UserInfo2->usri2_priv;
1425 if (UserInfo2
->usri2_home_dir
!= NULL
)
1427 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1428 UserInfo2
->usri2_home_dir
);
1429 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1432 if (UserInfo2
->usri2_comment
!= NULL
)
1434 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1435 UserInfo2
->usri2_comment
);
1436 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1439 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo2
->usri2_flags
);
1440 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1442 if (UserInfo2
->usri2_script_path
!= NULL
)
1444 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1445 UserInfo2
->usri2_script_path
);
1446 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1449 // UserInfo2->usri2_auth_flags;
1451 if (UserInfo2
->usri2_full_name
!= NULL
)
1453 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1454 UserInfo2
->usri2_full_name
);
1455 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1458 if (UserInfo2
->usri2_usr_comment
!= NULL
)
1460 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1461 UserInfo2
->usri2_usr_comment
);
1462 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1465 if (UserInfo2
->usri2_parms
!= NULL
)
1467 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1468 UserInfo2
->usri2_parms
);
1469 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1472 if (UserInfo2
->usri2_workstations
!= NULL
)
1474 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1475 UserInfo2
->usri2_workstations
);
1476 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1479 // usri2_last_logon ignored
1480 // usri2_last_logoff ignored
1482 if (UserInfo2
->usri2_acct_expires
== TIMEQ_FOREVER
)
1484 UserAllInfo
.AccountExpires
.LowPart
= 0;
1485 UserAllInfo
.AccountExpires
.HighPart
= 0;
1489 RtlSecondsSince1970ToTime(UserInfo2
->usri2_acct_expires
,
1490 &UserAllInfo
.AccountExpires
);
1492 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1494 // usri2_max_storage ignored
1496 // UserInfo2->usri2_units_per_week;
1497 // UserInfo2->usri2_logon_hours;
1499 // usri2_bad_pw_count ignored
1500 // usri2_num_logons ignored
1501 // usri2_logon_server ignored
1503 UserAllInfo
.CountryCode
= UserInfo2
->usri2_country_code
;
1504 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1506 UserAllInfo
.CodePage
= UserInfo2
->usri2_code_page
;
1507 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1511 UserInfo3
= (PUSER_INFO_3
)UserInfo
;
1513 // usri3_name ignored
1515 if (UserInfo3
->usri3_password
!= NULL
)
1517 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1518 UserInfo3
->usri3_password
);
1519 UserAllInfo
.NtPasswordPresent
= TRUE
;
1520 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1523 // usri3_password_age ignored
1525 // UserInfo3->usri3_priv;
1527 if (UserInfo3
->usri3_home_dir
!= NULL
)
1529 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1530 UserInfo3
->usri3_home_dir
);
1531 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1534 if (UserInfo3
->usri3_comment
!= NULL
)
1536 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1537 UserInfo3
->usri3_comment
);
1538 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1541 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo3
->usri3_flags
);
1542 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1544 if (UserInfo3
->usri3_script_path
!= NULL
)
1546 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1547 UserInfo3
->usri3_script_path
);
1548 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1551 // UserInfo3->usri3_auth_flags;
1553 if (UserInfo3
->usri3_full_name
!= NULL
)
1555 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1556 UserInfo3
->usri3_full_name
);
1557 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1560 if (UserInfo3
->usri3_usr_comment
!= NULL
)
1562 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1563 UserInfo3
->usri3_usr_comment
);
1564 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1567 if (UserInfo3
->usri3_parms
!= NULL
)
1569 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1570 UserInfo3
->usri3_parms
);
1571 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1574 if (UserInfo3
->usri3_workstations
!= NULL
)
1576 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1577 UserInfo3
->usri3_workstations
);
1578 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1581 // usri3_last_logon ignored
1582 // usri3_last_logoff ignored
1584 if (UserInfo3
->usri3_acct_expires
== TIMEQ_FOREVER
)
1586 UserAllInfo
.AccountExpires
.LowPart
= 0;
1587 UserAllInfo
.AccountExpires
.HighPart
= 0;
1591 RtlSecondsSince1970ToTime(UserInfo3
->usri3_acct_expires
,
1592 &UserAllInfo
.AccountExpires
);
1594 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1596 // usri3_max_storage ignored
1598 // UserInfo3->usri3_units_per_week;
1599 // UserInfo3->usri3_logon_hours;
1601 // usri3_bad_pw_count ignored
1602 // usri3_num_logons ignored
1603 // usri3_logon_server ignored
1605 UserAllInfo
.CountryCode
= UserInfo3
->usri3_country_code
;
1606 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1608 UserAllInfo
.CodePage
= UserInfo3
->usri3_code_page
;
1609 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1611 // usri3_user_id ignored
1613 UserAllInfo
.PrimaryGroupId
= UserInfo3
->usri3_primary_group_id
;
1614 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1616 if (UserInfo3
->usri3_profile
!= NULL
)
1618 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1619 UserInfo3
->usri3_profile
);
1620 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1623 if (UserInfo3
->usri3_home_dir_drive
!= NULL
)
1625 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1626 UserInfo3
->usri3_home_dir_drive
);
1627 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1630 UserAllInfo
.PasswordExpired
= (UserInfo3
->usri3_password_expired
!= 0);
1631 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1635 UserInfo4
= (PUSER_INFO_4
)UserInfo
;
1637 // usri4_name ignored
1639 if (UserInfo4
->usri4_password
!= NULL
)
1641 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1642 UserInfo4
->usri4_password
);
1643 UserAllInfo
.NtPasswordPresent
= TRUE
;
1644 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1647 // usri4_password_age ignored
1649 // UserInfo3->usri4_priv;
1651 if (UserInfo4
->usri4_home_dir
!= NULL
)
1653 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1654 UserInfo4
->usri4_home_dir
);
1655 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1658 if (UserInfo4
->usri4_comment
!= NULL
)
1660 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1661 UserInfo4
->usri4_comment
);
1662 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1665 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo4
->usri4_flags
);
1666 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1668 if (UserInfo4
->usri4_script_path
!= NULL
)
1670 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1671 UserInfo4
->usri4_script_path
);
1672 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1675 // UserInfo4->usri4_auth_flags;
1677 if (UserInfo4
->usri4_full_name
!= NULL
)
1679 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1680 UserInfo4
->usri4_full_name
);
1681 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1684 if (UserInfo4
->usri4_usr_comment
!= NULL
)
1686 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1687 UserInfo4
->usri4_usr_comment
);
1688 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1691 if (UserInfo4
->usri4_parms
!= NULL
)
1693 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1694 UserInfo4
->usri4_parms
);
1695 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1698 if (UserInfo4
->usri4_workstations
!= NULL
)
1700 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1701 UserInfo4
->usri4_workstations
);
1702 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1705 // usri4_last_logon ignored
1706 // usri4_last_logoff ignored
1708 if (UserInfo4
->usri4_acct_expires
== TIMEQ_FOREVER
)
1710 UserAllInfo
.AccountExpires
.LowPart
= 0;
1711 UserAllInfo
.AccountExpires
.HighPart
= 0;
1715 RtlSecondsSince1970ToTime(UserInfo4
->usri4_acct_expires
,
1716 &UserAllInfo
.AccountExpires
);
1718 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1720 // usri4_max_storage ignored
1722 // UserInfo3->usri4_units_per_week;
1723 // UserInfo3->usri4_logon_hours;
1725 // usri4_bad_pw_count ignored
1726 // usri4_num_logons ignored
1727 // usri4_logon_server ignored
1729 UserAllInfo
.CountryCode
= UserInfo4
->usri4_country_code
;
1730 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1732 UserAllInfo
.CodePage
= UserInfo4
->usri4_code_page
;
1733 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1735 // usri4_user_sid ignored
1737 UserAllInfo
.PrimaryGroupId
= UserInfo4
->usri4_primary_group_id
;
1738 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1740 if (UserInfo4
->usri4_profile
!= NULL
)
1742 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1743 UserInfo4
->usri4_profile
);
1744 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1747 if (UserInfo4
->usri4_home_dir_drive
!= NULL
)
1749 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1750 UserInfo4
->usri4_home_dir_drive
);
1751 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1754 UserAllInfo
.PasswordExpired
= (UserInfo4
->usri4_password_expired
!= 0);
1755 UserAllInfo
.WhichFields
|= USER_ALL_PASSWORDEXPIRED
;
1762 UserInfo1003
= (PUSER_INFO_1003
)UserInfo
;
1764 if (UserInfo1003
->usri1003_password
!= NULL
)
1766 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1767 UserInfo1003
->usri1003_password
);
1768 UserAllInfo
.NtPasswordPresent
= TRUE
;
1769 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1776 UserInfo1006
= (PUSER_INFO_1006
)UserInfo
;
1778 if (UserInfo1006
->usri1006_home_dir
!= NULL
)
1780 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1781 UserInfo1006
->usri1006_home_dir
);
1782 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1787 UserInfo1007
= (PUSER_INFO_1007
)UserInfo
;
1789 if (UserInfo1007
->usri1007_comment
!= NULL
)
1791 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1792 UserInfo1007
->usri1007_comment
);
1793 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1798 UserInfo1008
= (PUSER_INFO_1008
)UserInfo
;
1799 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1008
->usri1008_flags
);
1800 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1804 UserInfo1009
= (PUSER_INFO_1009
)UserInfo
;
1806 if (UserInfo1009
->usri1009_script_path
!= NULL
)
1808 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1809 UserInfo1009
->usri1009_script_path
);
1810 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1817 UserInfo1011
= (PUSER_INFO_1011
)UserInfo
;
1819 if (UserInfo1011
->usri1011_full_name
!= NULL
)
1821 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1822 UserInfo1011
->usri1011_full_name
);
1823 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1828 UserInfo1012
= (PUSER_INFO_1012
)UserInfo
;
1830 if (UserInfo1012
->usri1012_usr_comment
!= NULL
)
1832 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1833 UserInfo1012
->usri1012_usr_comment
);
1834 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1839 UserInfo1013
= (PUSER_INFO_1013
)UserInfo
;
1841 if (UserInfo1013
->usri1013_parms
!= NULL
)
1843 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1844 UserInfo1013
->usri1013_parms
);
1845 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1850 UserInfo1014
= (PUSER_INFO_1014
)UserInfo
;
1852 if (UserInfo1014
->usri1014_workstations
!= NULL
)
1854 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1855 UserInfo1014
->usri1014_workstations
);
1856 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1861 UserInfo1017
= (PUSER_INFO_1017
)UserInfo
;
1863 if (UserInfo1017
->usri1017_acct_expires
== TIMEQ_FOREVER
)
1865 UserAllInfo
.AccountExpires
.LowPart
= 0;
1866 UserAllInfo
.AccountExpires
.HighPart
= 0;
1870 RtlSecondsSince1970ToTime(UserInfo1017
->usri1017_acct_expires
,
1871 &UserAllInfo
.AccountExpires
);
1873 UserAllInfo
.WhichFields
|= USER_ALL_ACCOUNTEXPIRES
;
1877 UserInfo1018
= (PUSER_INFO_1018
)UserInfo
;
1879 if (UserInfo1018
->usri1018_max_storage
!= USER_MAXSTORAGE_UNLIMITED
)
1881 // FIXME: Report error
1882 return ERROR_INVALID_PARAMETER
;
1889 UserInfo1024
= (PUSER_INFO_1024
)UserInfo
;
1891 UserAllInfo
.CountryCode
= UserInfo1024
->usri1024_country_code
;
1892 UserAllInfo
.WhichFields
|= USER_ALL_COUNTRYCODE
;
1896 UserInfo1025
= (PUSER_INFO_1025
)UserInfo
;
1898 UserAllInfo
.CodePage
= UserInfo1025
->usri1025_code_page
;
1899 UserAllInfo
.WhichFields
|= USER_ALL_CODEPAGE
;
1903 UserInfo1051
= (PUSER_INFO_1051
)UserInfo
;
1905 UserAllInfo
.PrimaryGroupId
= UserInfo1051
->usri1051_primary_group_id
;
1906 UserAllInfo
.WhichFields
|= USER_ALL_PRIMARYGROUPID
;
1910 UserInfo1052
= (PUSER_INFO_1052
)UserInfo
;
1912 if (UserInfo1052
->usri1052_profile
!= NULL
)
1914 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1915 UserInfo1052
->usri1052_profile
);
1916 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1921 UserInfo1053
= (PUSER_INFO_1053
)UserInfo
;
1923 if (UserInfo1053
->usri1053_home_dir_drive
!= NULL
)
1925 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1926 UserInfo1053
->usri1053_home_dir_drive
);
1927 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1932 ERR("Unsupported level %lu!\n", Level
);
1933 return ERROR_INVALID_PARAMETER
;
1936 Status
= SamSetInformationUser(UserHandle
,
1939 if (!NT_SUCCESS(Status
))
1941 ERR("SamSetInformationUser failed (Status %08lx)\n", Status
);
1942 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1953 OpenUserByName(SAM_HANDLE DomainHandle
,
1954 PUNICODE_STRING UserName
,
1955 ULONG DesiredAccess
,
1956 PSAM_HANDLE UserHandle
)
1958 PULONG RelativeIds
= NULL
;
1959 PSID_NAME_USE Use
= NULL
;
1960 NET_API_STATUS ApiStatus
= NERR_Success
;
1961 NTSTATUS Status
= STATUS_SUCCESS
;
1963 /* Get the RID for the given user name */
1964 Status
= SamLookupNamesInDomain(DomainHandle
,
1969 if (!NT_SUCCESS(Status
))
1971 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
1972 return NetpNtStatusToApiStatus(Status
);
1975 /* Fail, if it is not an alias account */
1976 if (Use
[0] != SidTypeUser
)
1978 ERR("Object is not a user!\n");
1979 ApiStatus
= NERR_GroupNotFound
;
1983 /* Open the alias account */
1984 Status
= SamOpenUser(DomainHandle
,
1988 if (!NT_SUCCESS(Status
))
1990 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1991 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1996 if (RelativeIds
!= NULL
)
1997 SamFreeMemory(RelativeIds
);
2006 /************************************************************
2007 * NetUserAdd (NETAPI32.@)
2011 NetUserAdd(LPCWSTR servername
,
2016 UNICODE_STRING ServerName
;
2017 UNICODE_STRING UserName
;
2018 SAM_HANDLE ServerHandle
= NULL
;
2019 SAM_HANDLE DomainHandle
= NULL
;
2020 SAM_HANDLE UserHandle
= NULL
;
2021 ULONG GrantedAccess
;
2023 NET_API_STATUS ApiStatus
= NERR_Success
;
2024 NTSTATUS Status
= STATUS_SUCCESS
;
2026 TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername
), level
, bufptr
, parm_err
);
2028 /* Check the info level */
2038 return ERROR_INVALID_LEVEL
;
2041 if (servername
!= NULL
)
2042 RtlInitUnicodeString(&ServerName
, servername
);
2044 /* Connect to the SAM Server */
2045 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2047 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2049 if (!NT_SUCCESS(Status
))
2051 ERR("SamConnect failed (Status %08lx)\n", Status
);
2052 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2056 /* Open the Account Domain */
2057 Status
= OpenAccountDomain(ServerHandle
,
2058 (servername
!= NULL
) ? &ServerName
: NULL
,
2059 DOMAIN_CREATE_USER
| DOMAIN_LOOKUP
,
2061 if (!NT_SUCCESS(Status
))
2063 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2064 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2068 /* Initialize the user name string */
2069 RtlInitUnicodeString(&UserName
,
2070 ((PUSER_INFO_1
)bufptr
)->usri1_name
);
2072 /* Create the user account */
2073 Status
= SamCreateUser2InDomain(DomainHandle
,
2075 USER_NORMAL_ACCOUNT
,
2076 USER_ALL_ACCESS
| DELETE
| WRITE_DAC
,
2080 if (!NT_SUCCESS(Status
))
2082 ERR("SamCreateUser2InDomain failed (Status %08lx)\n", Status
);
2083 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2087 /* Set user information */
2088 ApiStatus
= SetUserInfo(UserHandle
,
2091 if (ApiStatus
!= NERR_Success
)
2093 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
2098 if (UserHandle
!= NULL
)
2099 SamCloseHandle(UserHandle
);
2101 if (DomainHandle
!= NULL
)
2102 SamCloseHandle(DomainHandle
);
2104 if (ServerHandle
!= NULL
)
2105 SamCloseHandle(ServerHandle
);
2111 /******************************************************************************
2112 * NetUserChangePassword (NETAPI32.@)
2114 * domainname [I] Optional. Domain on which the user resides or the logon
2115 * domain of the current user if NULL.
2116 * username [I] Optional. Username to change the password for or the name
2117 * of the current user if NULL.
2118 * oldpassword [I] The user's current password.
2119 * newpassword [I] The password that the user will be changed to using.
2122 * Success: NERR_Success.
2123 * Failure: NERR_* failure code or win error code.
2128 NetUserChangePassword(LPCWSTR domainname
,
2130 LPCWSTR oldpassword
,
2131 LPCWSTR newpassword
)
2133 PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer
= NULL
;
2134 PMSV1_0_CHANGEPASSWORD_RESPONSE ResponseBuffer
= NULL
;
2135 ULONG RequestBufferSize
;
2136 ULONG ResponseBufferSize
= 0;
2138 ANSI_STRING PackageName
;
2139 ULONG AuthenticationPackage
= 0;
2140 HANDLE LsaHandle
= NULL
;
2141 NET_API_STATUS ApiStatus
= NERR_Success
;
2142 NTSTATUS Status
= STATUS_SUCCESS
;
2143 NTSTATUS ProtocolStatus
;
2145 TRACE("(%s, %s, ..., ...)\n", debugstr_w(domainname
), debugstr_w(username
));
2147 /* FIXME: handle null domain or user name */
2149 /* Check the parameters */
2150 if ((oldpassword
== NULL
) ||
2151 (newpassword
== NULL
))
2152 return ERROR_INVALID_PARAMETER
;
2154 /* Connect to the LSA server */
2155 Status
= LsaConnectUntrusted(&LsaHandle
);
2156 if (!NT_SUCCESS(Status
))
2157 return NetpNtStatusToApiStatus(Status
);
2159 /* Get the authentication package ID */
2160 RtlInitAnsiString(&PackageName
,
2161 MSV1_0_PACKAGE_NAME
);
2163 Status
= LsaLookupAuthenticationPackage(LsaHandle
,
2165 &AuthenticationPackage
);
2166 if (!NT_SUCCESS(Status
))
2168 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2172 /* Calculate the request buffer size */
2173 RequestBufferSize
= sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
) +
2174 ((wcslen(domainname
) + 1) * sizeof(WCHAR
)) +
2175 ((wcslen(username
) + 1) * sizeof(WCHAR
)) +
2176 ((wcslen(oldpassword
) + 1) * sizeof(WCHAR
)) +
2177 ((wcslen(newpassword
) + 1) * sizeof(WCHAR
));
2179 /* Allocate the request buffer */
2180 ApiStatus
= NetApiBufferAllocate(RequestBufferSize
,
2181 (PVOID
*)&RequestBuffer
);
2182 if (ApiStatus
!= NERR_Success
)
2185 /* Initialize the request buffer */
2186 RequestBuffer
->MessageType
= MsV1_0ChangePassword
;
2187 RequestBuffer
->Impersonating
= TRUE
;
2189 Ptr
= (LPWSTR
)((ULONG_PTR
)RequestBuffer
+ sizeof(MSV1_0_CHANGEPASSWORD_REQUEST
));
2191 /* Pack the domain name */
2192 RequestBuffer
->DomainName
.Length
= wcslen(domainname
) * sizeof(WCHAR
);
2193 RequestBuffer
->DomainName
.MaximumLength
= RequestBuffer
->DomainName
.Length
+ sizeof(WCHAR
);
2194 RequestBuffer
->DomainName
.Buffer
= Ptr
;
2196 RtlCopyMemory(RequestBuffer
->DomainName
.Buffer
,
2198 RequestBuffer
->DomainName
.MaximumLength
);
2200 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->DomainName
.MaximumLength
);
2202 /* Pack the user name */
2203 RequestBuffer
->AccountName
.Length
= wcslen(username
) * sizeof(WCHAR
);
2204 RequestBuffer
->AccountName
.MaximumLength
= RequestBuffer
->AccountName
.Length
+ sizeof(WCHAR
);
2205 RequestBuffer
->AccountName
.Buffer
= Ptr
;
2207 RtlCopyMemory(RequestBuffer
->AccountName
.Buffer
,
2209 RequestBuffer
->AccountName
.MaximumLength
);
2211 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->AccountName
.MaximumLength
);
2213 /* Pack the old password */
2214 RequestBuffer
->OldPassword
.Length
= wcslen(oldpassword
) * sizeof(WCHAR
);
2215 RequestBuffer
->OldPassword
.MaximumLength
= RequestBuffer
->OldPassword
.Length
+ sizeof(WCHAR
);
2216 RequestBuffer
->OldPassword
.Buffer
= Ptr
;
2218 RtlCopyMemory(RequestBuffer
->OldPassword
.Buffer
,
2220 RequestBuffer
->OldPassword
.MaximumLength
);
2222 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ RequestBuffer
->OldPassword
.MaximumLength
);
2224 /* Pack the new password */
2225 RequestBuffer
->NewPassword
.Length
= wcslen(newpassword
) * sizeof(WCHAR
);
2226 RequestBuffer
->NewPassword
.MaximumLength
= RequestBuffer
->NewPassword
.Length
+ sizeof(WCHAR
);
2227 RequestBuffer
->NewPassword
.Buffer
= Ptr
;
2229 RtlCopyMemory(RequestBuffer
->NewPassword
.Buffer
,
2231 RequestBuffer
->NewPassword
.MaximumLength
);
2233 /* Call the authentication package */
2234 Status
= LsaCallAuthenticationPackage(LsaHandle
,
2235 AuthenticationPackage
,
2238 (PVOID
*)&ResponseBuffer
,
2239 &ResponseBufferSize
,
2241 if (!NT_SUCCESS(Status
))
2243 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2247 if (!NT_SUCCESS(ProtocolStatus
))
2249 ApiStatus
= NetpNtStatusToApiStatus(ProtocolStatus
);
2254 if (RequestBuffer
!= NULL
)
2255 NetApiBufferFree(RequestBuffer
);
2257 if (ResponseBuffer
!= NULL
)
2258 LsaFreeReturnBuffer(ResponseBuffer
);
2260 if (LsaHandle
!= NULL
)
2267 /************************************************************
2268 * NetUserDel (NETAPI32.@)
2272 NetUserDel(LPCWSTR servername
,
2275 UNICODE_STRING ServerName
;
2276 UNICODE_STRING UserName
;
2277 SAM_HANDLE ServerHandle
= NULL
;
2278 SAM_HANDLE DomainHandle
= NULL
;
2279 SAM_HANDLE UserHandle
= NULL
;
2280 NET_API_STATUS ApiStatus
= NERR_Success
;
2281 NTSTATUS Status
= STATUS_SUCCESS
;
2283 TRACE("(%s, %s)\n", debugstr_w(servername
), debugstr_w(username
));
2285 if (servername
!= NULL
)
2286 RtlInitUnicodeString(&ServerName
, servername
);
2288 RtlInitUnicodeString(&UserName
, username
);
2290 /* Connect to the SAM Server */
2291 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2293 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2295 if (!NT_SUCCESS(Status
))
2297 ERR("SamConnect failed (Status %08lx)\n", Status
);
2298 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2302 /* Open the Builtin Domain */
2303 Status
= OpenBuiltinDomain(ServerHandle
,
2306 if (!NT_SUCCESS(Status
))
2308 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2309 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2313 /* Open the user account in the builtin domain */
2314 ApiStatus
= OpenUserByName(DomainHandle
,
2318 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_NONE_MAPPED
)
2320 TRACE("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2324 if (UserHandle
== NULL
)
2326 if (DomainHandle
!= NULL
)
2328 SamCloseHandle(DomainHandle
);
2329 DomainHandle
= NULL
;
2332 /* Open the Acount Domain */
2333 Status
= OpenAccountDomain(ServerHandle
,
2334 (servername
!= NULL
) ? &ServerName
: NULL
,
2337 if (!NT_SUCCESS(Status
))
2339 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2340 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2344 /* Open the user account in the account domain */
2345 ApiStatus
= OpenUserByName(DomainHandle
,
2349 if (ApiStatus
!= NERR_Success
)
2351 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2352 if (ApiStatus
== ERROR_NONE_MAPPED
)
2353 ApiStatus
= NERR_GroupNotFound
;
2358 /* Delete the user */
2359 Status
= SamDeleteUser(UserHandle
);
2360 if (!NT_SUCCESS(Status
))
2362 ERR("SamDeleteUser failed (Status %08lx)\n", Status
);
2363 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2368 if (UserHandle
!= NULL
)
2369 SamCloseHandle(UserHandle
);
2371 if (DomainHandle
!= NULL
)
2372 SamCloseHandle(DomainHandle
);
2374 if (ServerHandle
!= NULL
)
2375 SamCloseHandle(ServerHandle
);
2381 /************************************************************
2382 * NetUserEnum (NETAPI32.@)
2386 NetUserEnum(LPCWSTR servername
,
2391 LPDWORD entriesread
,
2392 LPDWORD totalentries
,
2393 LPDWORD resume_handle
)
2395 UNICODE_STRING ServerName
;
2396 PSAM_RID_ENUMERATION CurrentUser
;
2397 PENUM_CONTEXT EnumContext
= NULL
;
2398 LPVOID Buffer
= NULL
;
2400 SAM_HANDLE UserHandle
= NULL
;
2401 PUSER_ALL_INFORMATION UserInfo
= NULL
;
2403 NET_API_STATUS ApiStatus
= NERR_Success
;
2404 NTSTATUS Status
= STATUS_SUCCESS
;
2406 TRACE("(%s %d 0x%d %p %d %p %p %p)\n", debugstr_w(servername
), level
,
2407 filter
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
2413 if (servername
!= NULL
)
2414 RtlInitUnicodeString(&ServerName
, servername
);
2416 if (resume_handle
!= NULL
&& *resume_handle
!= 0)
2418 EnumContext
= (PENUM_CONTEXT
)*resume_handle
;
2422 ApiStatus
= NetApiBufferAllocate(sizeof(ENUM_CONTEXT
), (PVOID
*)&EnumContext
);
2423 if (ApiStatus
!= NERR_Success
)
2426 EnumContext
->EnumerationContext
= 0;
2427 EnumContext
->Buffer
= NULL
;
2428 EnumContext
->Count
= 0;
2429 EnumContext
->Index
= 0;
2430 EnumContext
->BuiltinDone
= FALSE
;
2432 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2433 &EnumContext
->ServerHandle
,
2434 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2436 if (!NT_SUCCESS(Status
))
2438 ERR("SamConnect failed (Status %08lx)\n", Status
);
2439 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2443 Status
= OpenAccountDomain(EnumContext
->ServerHandle
,
2444 (servername
!= NULL
) ? &ServerName
: NULL
,
2445 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2446 &EnumContext
->AccountDomainHandle
);
2447 if (!NT_SUCCESS(Status
))
2449 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2450 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2454 Status
= OpenBuiltinDomain(EnumContext
->ServerHandle
,
2455 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2456 &EnumContext
->BuiltinDomainHandle
);
2457 if (!NT_SUCCESS(Status
))
2459 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2460 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2467 TRACE("EnumContext->Index: %lu\n", EnumContext
->Index
);
2468 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2470 if (EnumContext
->Index
>= EnumContext
->Count
)
2472 // if (EnumContext->BuiltinDone == TRUE)
2474 // ApiStatus = NERR_Success;
2478 TRACE("Calling SamEnumerateUsersInDomain\n");
2479 Status
= SamEnumerateUsersInDomain(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2480 &EnumContext
->EnumerationContext
,
2482 (PVOID
*)&EnumContext
->Buffer
,
2484 &EnumContext
->Count
);
2486 TRACE("SamEnumerateUsersInDomain returned (Status %08lx)\n", Status
);
2487 if (!NT_SUCCESS(Status
))
2489 ERR("SamEnumerateUsersInDomain failed (Status %08lx)\n", Status
);
2490 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2494 if (Status
== STATUS_MORE_ENTRIES
)
2496 ApiStatus
= NERR_BufTooSmall
;
2501 EnumContext
->BuiltinDone
= TRUE
;
2505 TRACE("EnumContext: %lu\n", EnumContext
);
2506 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
2507 TRACE("EnumContext->Buffer: %p\n", EnumContext
->Buffer
);
2509 /* Get a pointer to the current user */
2510 CurrentUser
= &EnumContext
->Buffer
[EnumContext
->Index
];
2512 TRACE("RID: %lu\n", CurrentUser
->RelativeId
);
2514 Status
= SamOpenUser(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
2515 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2516 CurrentUser
->RelativeId
,
2518 if (!NT_SUCCESS(Status
))
2520 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2521 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2525 Status
= SamQueryInformationUser(UserHandle
,
2527 (PVOID
*)&UserInfo
);
2528 if (!NT_SUCCESS(Status
))
2530 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
2531 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2535 SamCloseHandle(UserHandle
);
2538 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
2540 CurrentUser
->RelativeId
,
2542 if (ApiStatus
!= NERR_Success
)
2544 ERR("BuildUserInfoBuffer failed (ApiStatus %lu)\n", ApiStatus
);
2548 if (UserInfo
!= NULL
)
2550 FreeUserInfo(UserInfo
);
2554 EnumContext
->Index
++;
2560 if (ApiStatus
== NERR_Success
&& EnumContext
->Index
< EnumContext
->Count
)
2561 ApiStatus
= ERROR_MORE_DATA
;
2563 if (EnumContext
!= NULL
)
2564 *totalentries
= EnumContext
->Count
;
2566 if (resume_handle
== NULL
|| ApiStatus
!= ERROR_MORE_DATA
)
2568 if (EnumContext
!= NULL
)
2570 if (EnumContext
->BuiltinDomainHandle
!= NULL
)
2571 SamCloseHandle(EnumContext
->BuiltinDomainHandle
);
2573 if (EnumContext
->AccountDomainHandle
!= NULL
)
2574 SamCloseHandle(EnumContext
->AccountDomainHandle
);
2576 if (EnumContext
->ServerHandle
!= NULL
)
2577 SamCloseHandle(EnumContext
->ServerHandle
);
2579 if (EnumContext
->Buffer
!= NULL
)
2581 for (i
= 0; i
< EnumContext
->Count
; i
++)
2583 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
2586 SamFreeMemory(EnumContext
->Buffer
);
2589 NetApiBufferFree(EnumContext
);
2594 if (UserHandle
!= NULL
)
2595 SamCloseHandle(UserHandle
);
2597 if (UserInfo
!= NULL
)
2598 FreeUserInfo(UserInfo
);
2600 if (resume_handle
!= NULL
)
2601 *resume_handle
= (DWORD_PTR
)EnumContext
;
2603 *bufptr
= (LPBYTE
)Buffer
;
2605 TRACE("return %lu\n", ApiStatus
);
2611 /************************************************************
2612 * NetUserGetGroups (NETAPI32.@)
2616 NetUserGetGroups(LPCWSTR servername
,
2621 LPDWORD entriesread
,
2622 LPDWORD totalentries
)
2624 FIXME("%s %s %d %p %d %p %p stub\n", debugstr_w(servername
),
2625 debugstr_w(username
), level
, bufptr
, prefixmaxlen
, entriesread
,
2632 return ERROR_INVALID_LEVEL
;
2636 /************************************************************
2637 * NetUserGetInfo (NETAPI32.@)
2641 NetUserGetInfo(LPCWSTR servername
,
2646 UNICODE_STRING ServerName
;
2647 UNICODE_STRING UserName
;
2648 SAM_HANDLE ServerHandle
= NULL
;
2649 SAM_HANDLE AccountDomainHandle
= NULL
;
2650 SAM_HANDLE UserHandle
= NULL
;
2651 PULONG RelativeIds
= NULL
;
2652 PSID_NAME_USE Use
= NULL
;
2653 PUSER_ALL_INFORMATION UserInfo
= NULL
;
2654 LPVOID Buffer
= NULL
;
2655 NET_API_STATUS ApiStatus
= NERR_Success
;
2656 NTSTATUS Status
= STATUS_SUCCESS
;
2658 TRACE("(%s, %s, %d, %p)\n", debugstr_w(servername
),
2659 debugstr_w(username
), level
, bufptr
);
2661 if (servername
!= NULL
)
2662 RtlInitUnicodeString(&ServerName
, servername
);
2664 RtlInitUnicodeString(&UserName
, username
);
2666 /* Connect to the SAM Server */
2667 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2669 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2671 if (!NT_SUCCESS(Status
))
2673 ERR("SamConnect failed (Status %08lx)\n", Status
);
2674 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2678 /* Open the Account Domain */
2679 Status
= OpenAccountDomain(ServerHandle
,
2680 (servername
!= NULL
) ? &ServerName
: NULL
,
2681 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2682 &AccountDomainHandle
);
2683 if (!NT_SUCCESS(Status
))
2685 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2686 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2690 /* Get the RID for the given user name */
2691 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2696 if (!NT_SUCCESS(Status
))
2698 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
2699 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2703 /* Check if the account is a user account */
2704 if (Use
[0] != SidTypeUser
)
2706 ERR("No user found!\n");
2707 ApiStatus
= NERR_UserNotFound
;
2711 TRACE("RID: %lu\n", RelativeIds
[0]);
2713 /* Open the user object */
2714 Status
= SamOpenUser(AccountDomainHandle
,
2715 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
2718 if (!NT_SUCCESS(Status
))
2720 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
2721 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2725 Status
= SamQueryInformationUser(UserHandle
,
2727 (PVOID
*)&UserInfo
);
2728 if (!NT_SUCCESS(Status
))
2730 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
2731 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2735 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
2739 if (ApiStatus
!= NERR_Success
)
2741 ERR("BuildUserInfoBuffer failed (ApiStatus %08lu)\n", ApiStatus
);
2746 if (UserInfo
!= NULL
)
2747 FreeUserInfo(UserInfo
);
2749 if (UserHandle
!= NULL
)
2750 SamCloseHandle(UserHandle
);
2752 if (RelativeIds
!= NULL
)
2753 SamFreeMemory(RelativeIds
);
2758 if (AccountDomainHandle
!= NULL
)
2759 SamCloseHandle(AccountDomainHandle
);
2761 if (ServerHandle
!= NULL
)
2762 SamCloseHandle(ServerHandle
);
2764 *bufptr
= (LPBYTE
)Buffer
;
2770 /************************************************************
2771 * NetUserGetLocalGroups (NETAPI32.@)
2775 NetUserGetLocalGroups(LPCWSTR servername
,
2781 LPDWORD entriesread
,
2782 LPDWORD totalentries
)
2784 UNICODE_STRING ServerName
;
2785 UNICODE_STRING UserName
;
2786 SAM_HANDLE ServerHandle
= NULL
;
2787 SAM_HANDLE BuiltinDomainHandle
= NULL
;
2788 SAM_HANDLE AccountDomainHandle
= NULL
;
2789 PSID AccountDomainSid
= NULL
;
2790 PSID UserSid
= NULL
;
2791 PULONG RelativeIds
= NULL
;
2792 PSID_NAME_USE Use
= NULL
;
2793 ULONG BuiltinMemberCount
= 0;
2794 ULONG AccountMemberCount
= 0;
2795 PULONG BuiltinAliases
= NULL
;
2796 PULONG AccountAliases
= NULL
;
2797 PUNICODE_STRING BuiltinNames
= NULL
;
2798 PUNICODE_STRING AccountNames
= NULL
;
2799 PLOCALGROUP_USERS_INFO_0 Buffer
= NULL
;
2805 NET_API_STATUS ApiStatus
= NERR_Success
;
2806 NTSTATUS Status
= STATUS_SUCCESS
;
2808 TRACE("(%s, %s, %d, %08x, %p %d, %p, %p) stub!\n",
2809 debugstr_w(servername
), debugstr_w(username
), level
, flags
, bufptr
,
2810 prefmaxlen
, entriesread
, totalentries
);
2813 return ERROR_INVALID_LEVEL
;
2815 if (flags
& ~LG_INCLUDE_INDIRECT
)
2816 return ERROR_INVALID_PARAMETER
;
2818 if (flags
& LG_INCLUDE_INDIRECT
)
2820 WARN("The flag LG_INCLUDE_INDIRECT is not supported yet!\n");
2823 if (servername
!= NULL
)
2824 RtlInitUnicodeString(&ServerName
, servername
);
2826 RtlInitUnicodeString(&UserName
, username
);
2828 /* Connect to the SAM Server */
2829 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2831 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2833 if (!NT_SUCCESS(Status
))
2835 ERR("SamConnect failed (Status %08lx)\n", Status
);
2836 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2840 /* Open the Builtin Domain */
2841 Status
= OpenBuiltinDomain(ServerHandle
,
2842 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2843 &BuiltinDomainHandle
);
2844 if (!NT_SUCCESS(Status
))
2846 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2847 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2851 /* Get the Account Domain SID */
2852 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
2854 if (!NT_SUCCESS(Status
))
2856 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
2857 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2861 /* Open the Account Domain */
2862 Status
= SamOpenDomain(ServerHandle
,
2863 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2865 &AccountDomainHandle
);
2866 if (!NT_SUCCESS(Status
))
2868 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2869 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2873 /* Get the RID for the given user name */
2874 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2879 if (!NT_SUCCESS(Status
))
2881 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2882 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2886 /* Fail, if it is not a user account */
2887 if (Use
[0] != SidTypeUser
)
2889 ERR("Account is not a User!\n");
2890 ApiStatus
= NERR_UserNotFound
;
2894 /* Build the User SID from the Account Domain SID and the users RID */
2895 ApiStatus
= BuildSidFromSidAndRid(AccountDomainSid
,
2898 if (ApiStatus
!= NERR_Success
)
2900 ERR("BuildSidFromSidAndRid failed!\n");
2904 /* Get alias memberships in the Builtin Domain */
2905 Status
= SamGetAliasMembership(BuiltinDomainHandle
,
2908 &BuiltinMemberCount
,
2910 if (!NT_SUCCESS(Status
))
2912 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2913 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2917 if (BuiltinMemberCount
> 0)
2919 /* Get the Names of the builtin alias members */
2920 Status
= SamLookupIdsInDomain(BuiltinDomainHandle
,
2925 if (!NT_SUCCESS(Status
))
2927 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2928 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2933 /* Get alias memberships in the Account Domain */
2934 Status
= SamGetAliasMembership(AccountDomainHandle
,
2937 &AccountMemberCount
,
2939 if (!NT_SUCCESS(Status
))
2941 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2942 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2946 if (AccountMemberCount
> 0)
2948 /* Get the Names of the builtin alias members */
2949 Status
= SamLookupIdsInDomain(AccountDomainHandle
,
2954 if (!NT_SUCCESS(Status
))
2956 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2957 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2962 /* Calculate the required buffer size */
2965 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2967 if (BuiltinNames
[i
].Length
> 0)
2969 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2974 for (i
= 0; i
< AccountMemberCount
; i
++)
2976 if (BuiltinNames
[i
].Length
> 0)
2978 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2985 ApiStatus
= NERR_Success
;
2989 /* Allocate buffer */
2990 ApiStatus
= NetApiBufferAllocate(Size
, (LPVOID
*)&Buffer
);
2991 if (ApiStatus
!= NERR_Success
)
2994 ZeroMemory(Buffer
, Size
);
2996 StrPtr
= (LPWSTR
)((INT_PTR
)Buffer
+ Count
* sizeof(LOCALGROUP_USERS_INFO_0
));
2998 /* Copy data to the allocated buffer */
3000 for (i
= 0; i
< BuiltinMemberCount
; i
++)
3002 if (BuiltinNames
[i
].Length
> 0)
3005 BuiltinNames
[i
].Buffer
,
3006 BuiltinNames
[i
].Length
);
3007 Buffer
[Index
].lgrui0_name
= StrPtr
;
3009 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3014 for (i
= 0; i
< AccountMemberCount
; i
++)
3016 if (AccountNames
[i
].Length
> 0)
3019 AccountNames
[i
].Buffer
,
3020 AccountNames
[i
].Length
);
3021 Buffer
[Index
].lgrui0_name
= StrPtr
;
3023 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
3029 if (AccountNames
!= NULL
)
3030 SamFreeMemory(AccountNames
);
3032 if (BuiltinNames
!= NULL
)
3033 SamFreeMemory(BuiltinNames
);
3035 if (AccountAliases
!= NULL
)
3036 SamFreeMemory(AccountAliases
);
3038 if (BuiltinAliases
!= NULL
)
3039 SamFreeMemory(BuiltinAliases
);
3041 if (RelativeIds
!= NULL
)
3042 SamFreeMemory(RelativeIds
);
3047 if (UserSid
!= NULL
)
3048 NetApiBufferFree(UserSid
);
3050 if (AccountDomainSid
!= NULL
)
3051 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
3053 if (AccountDomainHandle
!= NULL
)
3054 SamCloseHandle(AccountDomainHandle
);
3056 if (BuiltinDomainHandle
!= NULL
)
3057 SamCloseHandle(BuiltinDomainHandle
);
3059 if (ServerHandle
!= NULL
)
3060 SamCloseHandle(ServerHandle
);
3062 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
3069 *entriesread
= Count
;
3070 *totalentries
= Count
;
3073 *bufptr
= (LPBYTE
)Buffer
;
3079 /******************************************************************************
3080 * NetUserModalsGet (NETAPI32.@)
3082 * Retrieves global information for all users and global groups in the security
3086 * servername [I] Specifies the DNS or the NetBIOS name of the remote server
3087 * on which the function is to execute.
3088 * level [I] Information level of the data.
3089 * 0 Return global passwords parameters. bufptr points to a
3090 * USER_MODALS_INFO_0 struct.
3091 * 1 Return logon server and domain controller information. bufptr
3092 * points to a USER_MODALS_INFO_1 struct.
3093 * 2 Return domain name and identifier. bufptr points to a
3094 * USER_MODALS_INFO_2 struct.
3095 * 3 Return lockout information. bufptr points to a USER_MODALS_INFO_3
3097 * bufptr [O] Buffer that receives the data.
3100 * Success: NERR_Success.
3102 * ERROR_ACCESS_DENIED - the user does not have access to the info.
3103 * NERR_InvalidComputer - computer name is invalid.
3107 NetUserModalsGet(LPCWSTR servername
,
3111 UNICODE_STRING ServerName
;
3112 SAM_HANDLE ServerHandle
= NULL
;
3113 SAM_HANDLE DomainHandle
= NULL
;
3114 PSID DomainSid
= NULL
;
3115 PDOMAIN_PASSWORD_INFORMATION PasswordInfo
= NULL
;
3116 PDOMAIN_LOGOFF_INFORMATION LogoffInfo
= NULL
;
3117 PDOMAIN_SERVER_ROLE_INFORMATION ServerRoleInfo
= NULL
;
3118 PDOMAIN_REPLICATION_INFORMATION ReplicationInfo
= NULL
;
3119 PDOMAIN_NAME_INFORMATION NameInfo
= NULL
;
3120 PDOMAIN_LOCKOUT_INFORMATION LockoutInfo
= NULL
;
3121 ULONG DesiredAccess
;
3123 PUSER_MODALS_INFO_0 umi0
;
3124 PUSER_MODALS_INFO_1 umi1
;
3125 PUSER_MODALS_INFO_2 umi2
;
3126 PUSER_MODALS_INFO_3 umi3
;
3127 NET_API_STATUS ApiStatus
= NERR_Success
;
3128 NTSTATUS Status
= STATUS_SUCCESS
;
3130 TRACE("(%s %d %p)\n", debugstr_w(servername
), level
, bufptr
);
3134 if (servername
!= NULL
)
3135 RtlInitUnicodeString(&ServerName
, servername
);
3137 /* Connect to the SAM Server */
3138 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
3140 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
3142 if (!NT_SUCCESS(Status
))
3144 ERR("SamConnect failed (Status %08lx)\n", Status
);
3145 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3149 /* Get the Account Domain SID */
3150 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
3152 if (!NT_SUCCESS(Status
))
3154 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
3155 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3162 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
| DOMAIN_READ_PASSWORD_PARAMETERS
;
3166 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
3170 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
3174 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
3178 ApiStatus
= ERROR_INVALID_LEVEL
;
3182 /* Open the Account Domain */
3183 Status
= SamOpenDomain(ServerHandle
,
3187 if (!NT_SUCCESS(Status
))
3189 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
3190 ApiStatus
= NetpNtStatusToApiStatus(Status
);
3197 /* return global passwords parameters */
3198 Status
= SamQueryInformationDomain(