2 * Copyright 2002 Andriy Palamarchuk
4 * netapi32 user functions
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 * Implement NetUserChangePassword
24 * Implement NetUserGetGroups
25 * Implement NetUserSetGroups
26 * NetUserGetLocalGroups does not support LG_INCLUDE_INDIRECT yet.
27 * Add missing information levels.
33 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
36 typedef struct _ENUM_CONTEXT
38 SAM_HANDLE ServerHandle
;
39 SAM_HANDLE BuiltinDomainHandle
;
40 SAM_HANDLE AccountDomainHandle
;
42 SAM_ENUMERATE_HANDLE EnumerationContext
;
43 PSAM_RID_ENUMERATION Buffer
;
48 } ENUM_CONTEXT
, *PENUM_CONTEXT
;
53 GetAccountFlags(ULONG AccountControl
)
55 ULONG Flags
= UF_SCRIPT
;
57 if (AccountControl
& USER_ACCOUNT_DISABLED
)
58 Flags
|= UF_ACCOUNTDISABLE
;
60 if (AccountControl
& USER_HOME_DIRECTORY_REQUIRED
)
61 Flags
|= UF_HOMEDIR_REQUIRED
;
63 if (AccountControl
& USER_PASSWORD_NOT_REQUIRED
)
64 Flags
|= UF_PASSWD_NOTREQD
;
66 // UF_PASSWD_CANT_CHANGE
68 if (AccountControl
& USER_ACCOUNT_AUTO_LOCKED
)
71 if (AccountControl
& USER_DONT_EXPIRE_PASSWORD
)
72 Flags
|= UF_DONT_EXPIRE_PASSWD
;
75 if (AccountControl & USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED)
76 Flags |= UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED;
78 if (AccountControl & USER_SMARTCARD_REQUIRED)
79 Flags |= UF_SMARTCARD_REQUIRED;
81 if (AccountControl & USER_TRUSTED_FOR_DELEGATION)
82 Flags |= UF_TRUSTED_FOR_DELEGATION;
84 if (AccountControl & USER_NOT_DELEGATED)
85 Flags |= UF_NOT_DELEGATED;
87 if (AccountControl & USER_USE_DES_KEY_ONLY)
88 Flags |= UF_USE_DES_KEY_ONLY;
90 if (AccountControl & USER_DONT_REQUIRE_PREAUTH)
91 Flags |= UF_DONT_REQUIRE_PREAUTH;
93 if (AccountControl & USER_PASSWORD_EXPIRED)
94 Flags |= UF_PASSWORD_EXPIRED;
97 /* Set account type flags */
98 if (AccountControl
& USER_TEMP_DUPLICATE_ACCOUNT
)
99 Flags
|= UF_TEMP_DUPLICATE_ACCOUNT
;
100 else if (AccountControl
& USER_NORMAL_ACCOUNT
)
101 Flags
|= UF_NORMAL_ACCOUNT
;
102 else if (AccountControl
& USER_INTERDOMAIN_TRUST_ACCOUNT
)
103 Flags
|= UF_INTERDOMAIN_TRUST_ACCOUNT
;
104 else if (AccountControl
& USER_WORKSTATION_TRUST_ACCOUNT
)
105 Flags
|= UF_WORKSTATION_TRUST_ACCOUNT
;
106 else if (AccountControl
& USER_SERVER_TRUST_ACCOUNT
)
107 Flags
|= UF_SERVER_TRUST_ACCOUNT
;
115 GetAccountControl(ULONG Flags
)
117 ULONG AccountControl
= 0;
119 if (Flags
& UF_ACCOUNTDISABLE
)
120 AccountControl
|= USER_ACCOUNT_DISABLED
;
122 if (Flags
& UF_HOMEDIR_REQUIRED
)
123 AccountControl
|= USER_HOME_DIRECTORY_REQUIRED
;
125 if (Flags
& UF_PASSWD_NOTREQD
)
126 AccountControl
|= USER_PASSWORD_NOT_REQUIRED
;
128 if (Flags
& UF_LOCKOUT
)
129 AccountControl
|= USER_ACCOUNT_AUTO_LOCKED
;
131 if (Flags
& UF_DONT_EXPIRE_PASSWD
)
132 AccountControl
|= USER_DONT_EXPIRE_PASSWORD
;
134 /* Set account type flags */
135 if (Flags
& UF_TEMP_DUPLICATE_ACCOUNT
)
136 AccountControl
|= USER_TEMP_DUPLICATE_ACCOUNT
;
137 else if (Flags
& UF_NORMAL_ACCOUNT
)
138 AccountControl
|= USER_NORMAL_ACCOUNT
;
139 else if (Flags
& UF_INTERDOMAIN_TRUST_ACCOUNT
)
140 AccountControl
|= USER_INTERDOMAIN_TRUST_ACCOUNT
;
141 else if (Flags
& UF_WORKSTATION_TRUST_ACCOUNT
)
142 AccountControl
|= USER_WORKSTATION_TRUST_ACCOUNT
;
143 else if (Flags
& UF_SERVER_TRUST_ACCOUNT
)
144 AccountControl
|= USER_SERVER_TRUST_ACCOUNT
;
146 return AccountControl
;
152 GetPasswordAge(IN PLARGE_INTEGER PasswordLastSet
)
154 LARGE_INTEGER SystemTime
;
155 ULONG SystemSecondsSince1970
;
156 ULONG PasswordSecondsSince1970
;
159 Status
= NtQuerySystemTime(&SystemTime
);
160 if (!NT_SUCCESS(Status
))
163 RtlTimeToSecondsSince1970(&SystemTime
, &SystemSecondsSince1970
);
164 RtlTimeToSecondsSince1970(PasswordLastSet
, &PasswordSecondsSince1970
);
166 return SystemSecondsSince1970
- PasswordSecondsSince1970
;
172 BuildUserInfoBuffer(PUSER_ALL_INFORMATION UserInfo
,
177 UNICODE_STRING LogonServer
= RTL_CONSTANT_STRING(L
"\\\\*");
178 LPVOID LocalBuffer
= NULL
;
179 PUSER_INFO_0 UserInfo0
;
180 PUSER_INFO_1 UserInfo1
;
181 PUSER_INFO_2 UserInfo2
;
182 PUSER_INFO_3 UserInfo3
;
183 PUSER_INFO_10 UserInfo10
;
184 PUSER_INFO_20 UserInfo20
;
185 PUSER_INFO_23 UserInfo23
;
188 NET_API_STATUS ApiStatus
= NERR_Success
;
195 Size
= sizeof(USER_INFO_0
) +
196 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
200 Size
= sizeof(USER_INFO_1
) +
201 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
203 if (UserInfo
->HomeDirectory
.Length
> 0)
204 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
206 if (UserInfo
->AdminComment
.Length
> 0)
207 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
209 if (UserInfo
->ScriptPath
.Length
> 0)
210 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
214 Size
= sizeof(USER_INFO_2
) +
215 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
217 if (UserInfo
->HomeDirectory
.Length
> 0)
218 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
220 if (UserInfo
->AdminComment
.Length
> 0)
221 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
223 if (UserInfo
->ScriptPath
.Length
> 0)
224 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
226 if (UserInfo
->FullName
.Length
> 0)
227 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
229 if (UserInfo
->UserComment
.Length
> 0)
230 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
232 if (UserInfo
->Parameters
.Length
> 0)
233 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
235 if (UserInfo
->WorkStations
.Length
> 0)
236 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
238 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
239 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
241 if (LogonServer
.Length
> 0)
242 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
246 Size
= sizeof(USER_INFO_3
) +
247 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
249 if (UserInfo
->HomeDirectory
.Length
> 0)
250 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
252 if (UserInfo
->AdminComment
.Length
> 0)
253 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
255 if (UserInfo
->ScriptPath
.Length
> 0)
256 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
258 if (UserInfo
->FullName
.Length
> 0)
259 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
261 if (UserInfo
->UserComment
.Length
> 0)
262 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
264 if (UserInfo
->Parameters
.Length
> 0)
265 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
267 if (UserInfo
->WorkStations
.Length
> 0)
268 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
270 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
271 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
273 if (LogonServer
.Length
> 0)
274 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
276 if (UserInfo
->ProfilePath
.Length
> 0)
277 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
279 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
280 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
286 Size
= sizeof(USER_INFO_10
) +
287 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
289 if (UserInfo
->AdminComment
.Length
> 0)
290 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
292 if (UserInfo
->UserComment
.Length
> 0)
293 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
295 if (UserInfo
->FullName
.Length
> 0)
296 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
302 Size
= sizeof(USER_INFO_20
) +
303 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
305 if (UserInfo
->FullName
.Length
> 0)
306 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
308 if (UserInfo
->AdminComment
.Length
> 0)
309 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
313 Size
= sizeof(USER_INFO_23
) +
314 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
316 if (UserInfo
->FullName
.Length
> 0)
317 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
319 if (UserInfo
->AdminComment
.Length
> 0)
320 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
322 /* FIXME: usri23_user_sid */
326 ApiStatus
= ERROR_INVALID_LEVEL
;
330 ApiStatus
= NetApiBufferAllocate(Size
, &LocalBuffer
);
331 if (ApiStatus
!= NERR_Success
)
334 ZeroMemory(LocalBuffer
, Size
);
339 UserInfo0
= (PUSER_INFO_0
)LocalBuffer
;
341 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo0
+ sizeof(USER_INFO_0
));
342 UserInfo0
->usri0_name
= Ptr
;
344 memcpy(UserInfo0
->usri0_name
,
345 UserInfo
->UserName
.Buffer
,
346 UserInfo
->UserName
.Length
);
347 UserInfo0
->usri0_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
351 UserInfo1
= (PUSER_INFO_1
)LocalBuffer
;
353 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo1
+ sizeof(USER_INFO_1
));
355 UserInfo1
->usri1_name
= Ptr
;
357 memcpy(UserInfo1
->usri1_name
,
358 UserInfo
->UserName
.Buffer
,
359 UserInfo
->UserName
.Length
);
360 UserInfo1
->usri1_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
362 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
364 UserInfo1
->usri1_password
= NULL
;
366 UserInfo1
->usri1_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
368 /* FIXME: UserInfo1->usri1_priv */
370 if (UserInfo
->HomeDirectory
.Length
> 0)
372 UserInfo1
->usri1_home_dir
= Ptr
;
374 memcpy(UserInfo1
->usri1_home_dir
,
375 UserInfo
->HomeDirectory
.Buffer
,
376 UserInfo
->HomeDirectory
.Length
);
377 UserInfo1
->usri1_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
379 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
382 if (UserInfo
->AdminComment
.Length
> 0)
384 UserInfo1
->usri1_comment
= Ptr
;
386 memcpy(UserInfo1
->usri1_comment
,
387 UserInfo
->AdminComment
.Buffer
,
388 UserInfo
->AdminComment
.Length
);
389 UserInfo1
->usri1_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
391 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
394 UserInfo1
->usri1_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
396 if (UserInfo
->ScriptPath
.Length
> 0)
398 UserInfo1
->usri1_script_path
= Ptr
;
400 memcpy(UserInfo1
->usri1_script_path
,
401 UserInfo
->ScriptPath
.Buffer
,
402 UserInfo
->ScriptPath
.Length
);
403 UserInfo1
->usri1_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
408 UserInfo2
= (PUSER_INFO_2
)LocalBuffer
;
410 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo2
+ sizeof(USER_INFO_2
));
412 UserInfo2
->usri2_name
= Ptr
;
414 memcpy(UserInfo2
->usri2_name
,
415 UserInfo
->UserName
.Buffer
,
416 UserInfo
->UserName
.Length
);
417 UserInfo2
->usri2_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
419 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
421 UserInfo2
->usri2_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
423 /* FIXME: usri2_priv */
425 if (UserInfo
->HomeDirectory
.Length
> 0)
427 UserInfo2
->usri2_home_dir
= Ptr
;
429 memcpy(UserInfo2
->usri2_home_dir
,
430 UserInfo
->HomeDirectory
.Buffer
,
431 UserInfo
->HomeDirectory
.Length
);
432 UserInfo2
->usri2_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
434 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
437 if (UserInfo
->AdminComment
.Length
> 0)
439 UserInfo2
->usri2_comment
= Ptr
;
441 memcpy(UserInfo2
->usri2_comment
,
442 UserInfo
->AdminComment
.Buffer
,
443 UserInfo
->AdminComment
.Length
);
444 UserInfo2
->usri2_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
446 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
449 UserInfo2
->usri2_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
451 if (UserInfo
->ScriptPath
.Length
> 0)
453 UserInfo2
->usri2_script_path
= Ptr
;
455 memcpy(UserInfo2
->usri2_script_path
,
456 UserInfo
->ScriptPath
.Buffer
,
457 UserInfo
->ScriptPath
.Length
);
458 UserInfo2
->usri2_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
460 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
463 /* FIXME: usri2_auth_flags */
465 if (UserInfo
->FullName
.Length
> 0)
467 UserInfo2
->usri2_full_name
= Ptr
;
469 memcpy(UserInfo2
->usri2_full_name
,
470 UserInfo
->FullName
.Buffer
,
471 UserInfo
->FullName
.Length
);
472 UserInfo2
->usri2_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
474 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
477 if (UserInfo
->UserComment
.Length
> 0)
479 UserInfo2
->usri2_usr_comment
= Ptr
;
481 memcpy(UserInfo2
->usri2_usr_comment
,
482 UserInfo
->UserComment
.Buffer
,
483 UserInfo
->UserComment
.Length
);
484 UserInfo2
->usri2_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
486 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
489 if (UserInfo
->Parameters
.Length
> 0)
491 UserInfo2
->usri2_parms
= Ptr
;
493 memcpy(UserInfo2
->usri2_parms
,
494 UserInfo
->Parameters
.Buffer
,
495 UserInfo
->Parameters
.Length
);
496 UserInfo2
->usri2_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
498 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
501 if (UserInfo
->WorkStations
.Length
> 0)
503 UserInfo2
->usri2_workstations
= Ptr
;
505 memcpy(UserInfo2
->usri2_workstations
,
506 UserInfo
->WorkStations
.Buffer
,
507 UserInfo
->WorkStations
.Length
);
508 UserInfo2
->usri2_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
510 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
513 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
514 &UserInfo2
->usri2_last_logon
);
516 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
517 &UserInfo2
->usri2_last_logoff
);
519 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
520 &UserInfo2
->usri2_acct_expires
);
522 UserInfo2
->usri2_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
523 UserInfo2
->usri2_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
525 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
527 UserInfo2
->usri2_logon_hours
= (PVOID
)Ptr
;
529 memcpy(UserInfo2
->usri2_logon_hours
,
530 UserInfo
->LogonHours
.LogonHours
,
531 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
533 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
536 UserInfo2
->usri2_bad_pw_count
= UserInfo
->BadPasswordCount
;
537 UserInfo2
->usri2_num_logons
= UserInfo
->LogonCount
;
539 if (LogonServer
.Length
> 0)
541 UserInfo2
->usri2_logon_server
= Ptr
;
543 memcpy(UserInfo2
->usri2_logon_server
,
546 UserInfo2
->usri2_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
548 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
551 UserInfo2
->usri2_country_code
= UserInfo
->CountryCode
;
552 UserInfo2
->usri2_code_page
= UserInfo
->CodePage
;
556 UserInfo3
= (PUSER_INFO_3
)LocalBuffer
;
558 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo3
+ sizeof(USER_INFO_3
));
560 UserInfo3
->usri3_name
= Ptr
;
562 memcpy(UserInfo3
->usri3_name
,
563 UserInfo
->UserName
.Buffer
,
564 UserInfo
->UserName
.Length
);
565 UserInfo3
->usri3_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
567 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
569 UserInfo3
->usri3_password_age
= GetPasswordAge(&UserInfo
->PasswordLastSet
);
571 /* FIXME: usri3_priv */
573 if (UserInfo
->HomeDirectory
.Length
> 0)
575 UserInfo3
->usri3_home_dir
= Ptr
;
577 memcpy(UserInfo3
->usri3_home_dir
,
578 UserInfo
->HomeDirectory
.Buffer
,
579 UserInfo
->HomeDirectory
.Length
);
580 UserInfo3
->usri3_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
582 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
585 if (UserInfo
->AdminComment
.Length
> 0)
587 UserInfo3
->usri3_comment
= Ptr
;
589 memcpy(UserInfo3
->usri3_comment
,
590 UserInfo
->AdminComment
.Buffer
,
591 UserInfo
->AdminComment
.Length
);
592 UserInfo3
->usri3_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
594 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
597 UserInfo3
->usri3_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
599 if (UserInfo
->ScriptPath
.Length
> 0)
601 UserInfo3
->usri3_script_path
= Ptr
;
603 memcpy(UserInfo3
->usri3_script_path
,
604 UserInfo
->ScriptPath
.Buffer
,
605 UserInfo
->ScriptPath
.Length
);
606 UserInfo3
->usri3_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
608 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
611 /* FIXME: usri3_auth_flags */
613 if (UserInfo
->FullName
.Length
> 0)
615 UserInfo3
->usri3_full_name
= Ptr
;
617 memcpy(UserInfo3
->usri3_full_name
,
618 UserInfo
->FullName
.Buffer
,
619 UserInfo
->FullName
.Length
);
620 UserInfo3
->usri3_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
622 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
625 if (UserInfo
->UserComment
.Length
> 0)
627 UserInfo3
->usri3_usr_comment
= Ptr
;
629 memcpy(UserInfo3
->usri3_usr_comment
,
630 UserInfo
->UserComment
.Buffer
,
631 UserInfo
->UserComment
.Length
);
632 UserInfo3
->usri3_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
634 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
637 if (UserInfo
->Parameters
.Length
> 0)
639 UserInfo3
->usri3_parms
= Ptr
;
641 memcpy(UserInfo3
->usri3_parms
,
642 UserInfo
->Parameters
.Buffer
,
643 UserInfo
->Parameters
.Length
);
644 UserInfo3
->usri3_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
646 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
649 if (UserInfo
->WorkStations
.Length
> 0)
651 UserInfo3
->usri3_workstations
= Ptr
;
653 memcpy(UserInfo3
->usri3_workstations
,
654 UserInfo
->WorkStations
.Buffer
,
655 UserInfo
->WorkStations
.Length
);
656 UserInfo3
->usri3_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
658 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
661 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
662 &UserInfo3
->usri3_last_logon
);
664 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
665 &UserInfo3
->usri3_last_logoff
);
667 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
668 &UserInfo3
->usri3_acct_expires
);
670 UserInfo3
->usri3_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
671 UserInfo3
->usri3_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
673 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
675 UserInfo3
->usri3_logon_hours
= (PVOID
)Ptr
;
677 memcpy(UserInfo3
->usri3_logon_hours
,
678 UserInfo
->LogonHours
.LogonHours
,
679 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
681 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
684 UserInfo3
->usri3_bad_pw_count
= UserInfo
->BadPasswordCount
;
685 UserInfo3
->usri3_num_logons
= UserInfo
->LogonCount
;
687 if (LogonServer
.Length
> 0)
689 UserInfo3
->usri3_logon_server
= Ptr
;
691 memcpy(UserInfo3
->usri3_logon_server
,
694 UserInfo3
->usri3_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
696 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
699 UserInfo3
->usri3_country_code
= UserInfo
->CountryCode
;
700 UserInfo3
->usri3_code_page
= UserInfo
->CodePage
;
701 UserInfo3
->usri3_user_id
= RelativeId
;
702 UserInfo3
->usri3_primary_group_id
= UserInfo
->PrimaryGroupId
;
704 if (UserInfo
->ProfilePath
.Length
> 0)
706 UserInfo3
->usri3_profile
= Ptr
;
708 memcpy(UserInfo3
->usri3_profile
,
709 UserInfo
->ProfilePath
.Buffer
,
710 UserInfo
->ProfilePath
.Length
);
711 UserInfo3
->usri3_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
713 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
716 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
718 UserInfo3
->usri3_home_dir_drive
= Ptr
;
720 memcpy(UserInfo3
->usri3_home_dir_drive
,
721 UserInfo
->HomeDirectoryDrive
.Buffer
,
722 UserInfo
->HomeDirectoryDrive
.Length
);
723 UserInfo3
->usri3_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
725 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
728 UserInfo3
->usri3_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
734 UserInfo10
= (PUSER_INFO_10
)LocalBuffer
;
736 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo10
+ sizeof(USER_INFO_10
));
738 UserInfo10
->usri10_name
= Ptr
;
740 memcpy(UserInfo10
->usri10_name
,
741 UserInfo
->UserName
.Buffer
,
742 UserInfo
->UserName
.Length
);
743 UserInfo10
->usri10_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
745 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
747 if (UserInfo
->AdminComment
.Length
> 0)
749 UserInfo10
->usri10_comment
= Ptr
;
751 memcpy(UserInfo10
->usri10_comment
,
752 UserInfo
->AdminComment
.Buffer
,
753 UserInfo
->AdminComment
.Length
);
754 UserInfo10
->usri10_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
756 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
759 if (UserInfo
->UserComment
.Length
> 0)
761 UserInfo10
->usri10_usr_comment
= Ptr
;
763 memcpy(UserInfo10
->usri10_usr_comment
,
764 UserInfo
->UserComment
.Buffer
,
765 UserInfo
->UserComment
.Length
);
766 UserInfo10
->usri10_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
768 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
771 if (UserInfo
->FullName
.Length
> 0)
773 UserInfo10
->usri10_full_name
= Ptr
;
775 memcpy(UserInfo10
->usri10_full_name
,
776 UserInfo
->FullName
.Buffer
,
777 UserInfo
->FullName
.Length
);
778 UserInfo10
->usri10_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
780 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
787 UserInfo20
= (PUSER_INFO_20
)LocalBuffer
;
789 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo20
+ sizeof(USER_INFO_20
));
791 UserInfo20
->usri20_name
= Ptr
;
793 memcpy(UserInfo20
->usri20_name
,
794 UserInfo
->UserName
.Buffer
,
795 UserInfo
->UserName
.Length
);
796 UserInfo20
->usri20_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
798 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
800 if (UserInfo
->FullName
.Length
> 0)
802 UserInfo20
->usri20_full_name
= Ptr
;
804 memcpy(UserInfo20
->usri20_full_name
,
805 UserInfo
->FullName
.Buffer
,
806 UserInfo
->FullName
.Length
);
807 UserInfo20
->usri20_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
809 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
812 if (UserInfo
->AdminComment
.Length
> 0)
814 UserInfo20
->usri20_comment
= Ptr
;
816 memcpy(UserInfo20
->usri20_comment
,
817 UserInfo
->AdminComment
.Buffer
,
818 UserInfo
->AdminComment
.Length
);
819 UserInfo20
->usri20_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
821 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
824 UserInfo20
->usri20_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
826 UserInfo20
->usri20_user_id
= RelativeId
;
830 UserInfo23
= (PUSER_INFO_23
)LocalBuffer
;
832 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo23
+ sizeof(USER_INFO_23
));
834 UserInfo23
->usri23_name
= Ptr
;
836 memcpy(UserInfo23
->usri23_name
,
837 UserInfo
->UserName
.Buffer
,
838 UserInfo
->UserName
.Length
);
839 UserInfo23
->usri23_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
841 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
843 if (UserInfo
->FullName
.Length
> 0)
845 UserInfo23
->usri23_full_name
= Ptr
;
847 memcpy(UserInfo23
->usri23_full_name
,
848 UserInfo
->FullName
.Buffer
,
849 UserInfo
->FullName
.Length
);
850 UserInfo23
->usri23_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
852 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
855 if (UserInfo
->AdminComment
.Length
> 0)
857 UserInfo23
->usri23_comment
= Ptr
;
859 memcpy(UserInfo23
->usri23_comment
,
860 UserInfo
->AdminComment
.Buffer
,
861 UserInfo
->AdminComment
.Length
);
862 UserInfo23
->usri23_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
864 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
867 UserInfo23
->usri23_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
869 /* FIXME: usri23_user_sid */
874 if (ApiStatus
== NERR_Success
)
876 *Buffer
= LocalBuffer
;
880 if (LocalBuffer
!= NULL
)
881 NetApiBufferFree(LocalBuffer
);
890 FreeUserInfo(PUSER_ALL_INFORMATION UserInfo
)
892 if (UserInfo
->UserName
.Buffer
!= NULL
)
893 SamFreeMemory(UserInfo
->UserName
.Buffer
);
895 if (UserInfo
->FullName
.Buffer
!= NULL
)
896 SamFreeMemory(UserInfo
->FullName
.Buffer
);
898 if (UserInfo
->HomeDirectory
.Buffer
!= NULL
)
899 SamFreeMemory(UserInfo
->HomeDirectory
.Buffer
);
901 if (UserInfo
->HomeDirectoryDrive
.Buffer
!= NULL
)
902 SamFreeMemory(UserInfo
->HomeDirectoryDrive
.Buffer
);
904 if (UserInfo
->ScriptPath
.Buffer
!= NULL
)
905 SamFreeMemory(UserInfo
->ScriptPath
.Buffer
);
907 if (UserInfo
->ProfilePath
.Buffer
!= NULL
)
908 SamFreeMemory(UserInfo
->ProfilePath
.Buffer
);
910 if (UserInfo
->AdminComment
.Buffer
!= NULL
)
911 SamFreeMemory(UserInfo
->AdminComment
.Buffer
);
913 if (UserInfo
->WorkStations
.Buffer
!= NULL
)
914 SamFreeMemory(UserInfo
->WorkStations
.Buffer
);
916 if (UserInfo
->UserComment
.Buffer
!= NULL
)
917 SamFreeMemory(UserInfo
->UserComment
.Buffer
);
919 if (UserInfo
->Parameters
.Buffer
!= NULL
)
920 SamFreeMemory(UserInfo
->Parameters
.Buffer
);
922 if (UserInfo
->PrivateData
.Buffer
!= NULL
)
923 SamFreeMemory(UserInfo
->PrivateData
.Buffer
);
925 if (UserInfo
->LogonHours
.LogonHours
!= NULL
)
926 SamFreeMemory(UserInfo
->LogonHours
.LogonHours
);
928 SamFreeMemory(UserInfo
);
934 SetUserInfo(SAM_HANDLE UserHandle
,
938 USER_ALL_INFORMATION UserAllInfo
;
939 PUSER_INFO_0 UserInfo0
;
940 PUSER_INFO_1 UserInfo1
;
941 PUSER_INFO_2 UserInfo2
;
942 PUSER_INFO_3 UserInfo3
;
943 PUSER_INFO_1003 UserInfo1003
;
944 PUSER_INFO_1006 UserInfo1006
;
945 PUSER_INFO_1007 UserInfo1007
;
946 PUSER_INFO_1008 UserInfo1008
;
947 PUSER_INFO_1009 UserInfo1009
;
948 PUSER_INFO_1011 UserInfo1011
;
949 PUSER_INFO_1012 UserInfo1012
;
950 PUSER_INFO_1013 UserInfo1013
;
951 PUSER_INFO_1014 UserInfo1014
;
952 PUSER_INFO_1052 UserInfo1052
;
953 PUSER_INFO_1053 UserInfo1053
;
954 NET_API_STATUS ApiStatus
= NERR_Success
;
955 NTSTATUS Status
= STATUS_SUCCESS
;
957 ZeroMemory(&UserAllInfo
, sizeof(USER_ALL_INFORMATION
));
962 UserInfo0
= (PUSER_INFO_0
)UserInfo
;
964 RtlInitUnicodeString(&UserAllInfo
.UserName
,
965 UserInfo0
->usri0_name
);
967 UserAllInfo
.WhichFields
|= USER_ALL_USERNAME
;
971 UserInfo1
= (PUSER_INFO_1
)UserInfo
;
973 // usri1_name ignored
975 if (UserInfo1
->usri1_password
!= NULL
)
977 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
978 UserInfo1
->usri1_password
);
979 UserAllInfo
.NtPasswordPresent
= TRUE
;
980 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
983 // usri1_password_age ignored
985 // UserInfo1->usri1_priv
987 if (UserInfo1
->usri1_home_dir
!= NULL
)
989 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
990 UserInfo1
->usri1_home_dir
);
991 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
994 if (UserInfo1
->usri1_comment
!= NULL
)
996 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
997 UserInfo1
->usri1_comment
);
998 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1001 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1
->usri1_flags
);
1002 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1004 if (UserInfo1
->usri1_script_path
!= NULL
)
1006 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1007 UserInfo1
->usri1_script_path
);
1008 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1013 UserInfo2
= (PUSER_INFO_2
)UserInfo
;
1015 // usri2_name ignored
1017 if (UserInfo2
->usri2_password
!= NULL
)
1019 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1020 UserInfo2
->usri2_password
);
1021 UserAllInfo
.NtPasswordPresent
= TRUE
;
1022 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1025 // usri2_password_age ignored
1027 // UserInfo2->usri2_priv;
1029 if (UserInfo2
->usri2_home_dir
!= NULL
)
1031 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1032 UserInfo2
->usri2_home_dir
);
1033 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1036 if (UserInfo2
->usri2_comment
!= NULL
)
1038 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1039 UserInfo2
->usri2_comment
);
1040 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1043 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo2
->usri2_flags
);
1044 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1046 if (UserInfo2
->usri2_script_path
!= NULL
)
1048 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1049 UserInfo2
->usri2_script_path
);
1050 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1053 // UserInfo2->usri2_auth_flags;
1055 if (UserInfo2
->usri2_full_name
!= NULL
)
1057 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1058 UserInfo2
->usri2_full_name
);
1059 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1062 if (UserInfo2
->usri2_usr_comment
!= NULL
)
1064 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1065 UserInfo2
->usri2_usr_comment
);
1066 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1069 if (UserInfo2
->usri2_parms
!= NULL
)
1071 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1072 UserInfo2
->usri2_parms
);
1073 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1076 if (UserInfo2
->usri2_workstations
!= NULL
)
1078 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1079 UserInfo2
->usri2_workstations
);
1080 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1083 // usri2_last_logon ignored
1084 // usri2_last_logoff ignored
1086 // UserInfo2->usri2_acct_expires;
1087 // UserInfo2->usri2_max_storage;
1088 // UserInfo2->usri2_units_per_week;
1089 // UserInfo2->usri2_logon_hours;
1091 // usri2_bad_pw_count ignored
1092 // usri2_num_logons ignored
1093 // usri2_logon_server ignored
1095 // UserInfo2->usri2_country_code;
1096 // UserInfo2->usri2_code_page;
1100 UserInfo3
= (PUSER_INFO_3
)UserInfo
;
1102 // usri3_name ignored
1104 if (UserInfo3
->usri3_password
!= NULL
)
1106 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1107 UserInfo3
->usri3_password
);
1108 UserAllInfo
.NtPasswordPresent
= TRUE
;
1109 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1112 // usri3_password_age ignored
1114 // UserInfo3->usri3_priv;
1116 if (UserInfo3
->usri3_home_dir
!= NULL
)
1118 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1119 UserInfo3
->usri3_home_dir
);
1120 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1123 if (UserInfo3
->usri3_comment
!= NULL
)
1125 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1126 UserInfo3
->usri3_comment
);
1127 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1130 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo3
->usri3_flags
);
1131 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1133 if (UserInfo3
->usri3_script_path
!= NULL
)
1135 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1136 UserInfo3
->usri3_script_path
);
1137 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1140 // UserInfo3->usri3_auth_flags;
1142 if (UserInfo3
->usri3_full_name
!= NULL
)
1144 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1145 UserInfo3
->usri3_full_name
);
1146 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1149 if (UserInfo3
->usri3_usr_comment
!= NULL
)
1151 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1152 UserInfo3
->usri3_usr_comment
);
1153 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1156 if (UserInfo3
->usri3_parms
!= NULL
)
1158 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1159 UserInfo3
->usri3_parms
);
1160 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1163 if (UserInfo3
->usri3_workstations
!= NULL
)
1165 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1166 UserInfo3
->usri3_workstations
);
1167 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1170 // usri3_last_logon ignored
1171 // usri3_last_logoff ignored
1173 // UserInfo3->usri3_acct_expires;
1174 // UserInfo3->usri3_max_storage;
1175 // UserInfo3->usri3_units_per_week;
1176 // UserInfo3->usri3_logon_hours;
1178 // usri3_bad_pw_count ignored
1179 // usri3_num_logons ignored
1180 // usri3_logon_server ignored
1182 // UserInfo3->usri3_country_code;
1183 // UserInfo3->usri3_code_page;
1185 // usri3_user_id ignored
1187 // UserInfo3->usri3_primary_group_id;
1189 if (UserInfo3
->usri3_profile
!= NULL
)
1191 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1192 UserInfo3
->usri3_profile
);
1193 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1196 if (UserInfo3
->usri3_home_dir_drive
!= NULL
)
1198 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1199 UserInfo3
->usri3_home_dir_drive
);
1200 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1203 // UserInfo3->usri3_password_expired;
1211 UserInfo1003
= (PUSER_INFO_1003
)UserInfo
;
1213 if (UserInfo1003
->usri1003_password
!= NULL
)
1215 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1216 UserInfo1003
->usri1003_password
);
1217 UserAllInfo
.NtPasswordPresent
= TRUE
;
1218 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1225 UserInfo1006
= (PUSER_INFO_1006
)UserInfo
;
1227 if (UserInfo1006
->usri1006_home_dir
!= NULL
)
1229 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1230 UserInfo1006
->usri1006_home_dir
);
1231 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1236 UserInfo1007
= (PUSER_INFO_1007
)UserInfo
;
1238 if (UserInfo1007
->usri1007_comment
!= NULL
)
1240 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1241 UserInfo1007
->usri1007_comment
);
1242 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1247 UserInfo1008
= (PUSER_INFO_1008
)UserInfo
;
1248 UserAllInfo
.UserAccountControl
= GetAccountControl(UserInfo1008
->usri1008_flags
);
1249 UserAllInfo
.WhichFields
|= USER_ALL_USERACCOUNTCONTROL
;
1253 UserInfo1009
= (PUSER_INFO_1009
)UserInfo
;
1255 if (UserInfo1009
->usri1009_script_path
!= NULL
)
1257 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1258 UserInfo1009
->usri1009_script_path
);
1259 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1266 UserInfo1011
= (PUSER_INFO_1011
)UserInfo
;
1268 if (UserInfo1011
->usri1011_full_name
!= NULL
)
1270 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1271 UserInfo1011
->usri1011_full_name
);
1272 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1277 UserInfo1012
= (PUSER_INFO_1012
)UserInfo
;
1279 if (UserInfo1012
->usri1012_usr_comment
!= NULL
)
1281 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1282 UserInfo1012
->usri1012_usr_comment
);
1283 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1288 UserInfo1013
= (PUSER_INFO_1013
)UserInfo
;
1290 if (UserInfo1013
->usri1013_parms
!= NULL
)
1292 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1293 UserInfo1013
->usri1013_parms
);
1294 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1299 UserInfo1014
= (PUSER_INFO_1014
)UserInfo
;
1301 if (UserInfo1014
->usri1014_workstations
!= NULL
)
1303 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1304 UserInfo1014
->usri1014_workstations
);
1305 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1315 UserInfo1052
= (PUSER_INFO_1052
)UserInfo
;
1317 if (UserInfo1052
->usri1052_profile
!= NULL
)
1319 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1320 UserInfo1052
->usri1052_profile
);
1321 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1326 UserInfo1053
= (PUSER_INFO_1053
)UserInfo
;
1328 if (UserInfo1053
->usri1053_home_dir_drive
!= NULL
)
1330 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1331 UserInfo1053
->usri1053_home_dir_drive
);
1332 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1337 ERR("Unsupported level %lu!\n", Level
);
1338 return ERROR_INVALID_PARAMETER
;
1341 Status
= SamSetInformationUser(UserHandle
,
1344 if (!NT_SUCCESS(Status
))
1346 ERR("SamSetInformationUser failed (Status %08lx)\n", Status
);
1347 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1358 OpenUserByName(SAM_HANDLE DomainHandle
,
1359 PUNICODE_STRING UserName
,
1360 ULONG DesiredAccess
,
1361 PSAM_HANDLE UserHandle
)
1363 PULONG RelativeIds
= NULL
;
1364 PSID_NAME_USE Use
= NULL
;
1365 NET_API_STATUS ApiStatus
= NERR_Success
;
1366 NTSTATUS Status
= STATUS_SUCCESS
;
1368 /* Get the RID for the given user name */
1369 Status
= SamLookupNamesInDomain(DomainHandle
,
1374 if (!NT_SUCCESS(Status
))
1376 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
1377 return NetpNtStatusToApiStatus(Status
);
1380 /* Fail, if it is not an alias account */
1381 if (Use
[0] != SidTypeUser
)
1383 ERR("Object is not a user!\n");
1384 ApiStatus
= NERR_GroupNotFound
;
1388 /* Open the alias account */
1389 Status
= SamOpenUser(DomainHandle
,
1393 if (!NT_SUCCESS(Status
))
1395 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1396 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1401 if (RelativeIds
!= NULL
)
1402 SamFreeMemory(RelativeIds
);
1411 /************************************************************
1412 * NetUserAdd (NETAPI32.@)
1416 NetUserAdd(LPCWSTR servername
,
1421 UNICODE_STRING ServerName
;
1422 UNICODE_STRING UserName
;
1423 SAM_HANDLE ServerHandle
= NULL
;
1424 SAM_HANDLE DomainHandle
= NULL
;
1425 SAM_HANDLE UserHandle
= NULL
;
1426 ULONG GrantedAccess
;
1428 NET_API_STATUS ApiStatus
= NERR_Success
;
1429 NTSTATUS Status
= STATUS_SUCCESS
;
1431 TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername
), level
, bufptr
, parm_err
);
1433 /* Check the info level */
1443 return ERROR_INVALID_LEVEL
;
1446 if (servername
!= NULL
)
1447 RtlInitUnicodeString(&ServerName
, servername
);
1449 /* Connect to the SAM Server */
1450 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
1452 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1454 if (!NT_SUCCESS(Status
))
1456 ERR("SamConnect failed (Status %08lx)\n", Status
);
1457 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1461 /* Open the Account Domain */
1462 Status
= OpenAccountDomain(ServerHandle
,
1463 (servername
!= NULL
) ? &ServerName
: NULL
,
1464 DOMAIN_CREATE_USER
| DOMAIN_LOOKUP
,
1466 if (!NT_SUCCESS(Status
))
1468 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
1469 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1473 /* Initialize the user name string */
1474 RtlInitUnicodeString(&UserName
,
1475 ((PUSER_INFO_1
)bufptr
)->usri1_name
);
1477 /* Create the user account */
1478 Status
= SamCreateUser2InDomain(DomainHandle
,
1480 USER_NORMAL_ACCOUNT
,
1481 USER_ALL_ACCESS
| DELETE
| WRITE_DAC
,
1485 if (!NT_SUCCESS(Status
))
1487 ERR("SamCreateUser2InDomain failed (Status %08lx)\n", Status
);
1488 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1492 /* Set user information */
1493 ApiStatus
= SetUserInfo(UserHandle
,
1496 if (ApiStatus
!= NERR_Success
)
1498 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
1503 if (UserHandle
!= NULL
)
1504 SamCloseHandle(UserHandle
);
1506 if (DomainHandle
!= NULL
)
1507 SamCloseHandle(DomainHandle
);
1509 if (ServerHandle
!= NULL
)
1510 SamCloseHandle(ServerHandle
);
1516 /******************************************************************************
1517 * NetUserChangePassword (NETAPI32.@)
1519 * domainname [I] Optional. Domain on which the user resides or the logon
1520 * domain of the current user if NULL.
1521 * username [I] Optional. Username to change the password for or the name
1522 * of the current user if NULL.
1523 * oldpassword [I] The user's current password.
1524 * newpassword [I] The password that the user will be changed to using.
1527 * Success: NERR_Success.
1528 * Failure: NERR_* failure code or win error code.
1533 NetUserChangePassword(LPCWSTR domainname
,
1535 LPCWSTR oldpassword
,
1536 LPCWSTR newpassword
)
1538 TRACE("(%s, %s, ..., ...)\n", debugstr_w(domainname
), debugstr_w(username
));
1539 return NERR_Success
;
1543 /************************************************************
1544 * NetUserDel (NETAPI32.@)
1548 NetUserDel(LPCWSTR servername
,
1551 UNICODE_STRING ServerName
;
1552 UNICODE_STRING UserName
;
1553 SAM_HANDLE ServerHandle
= NULL
;
1554 SAM_HANDLE DomainHandle
= NULL
;
1555 SAM_HANDLE UserHandle
= NULL
;
1556 NET_API_STATUS ApiStatus
= NERR_Success
;
1557 NTSTATUS Status
= STATUS_SUCCESS
;
1559 TRACE("(%s, %s)\n", debugstr_w(servername
), debugstr_w(username
));
1561 if (servername
!= NULL
)
1562 RtlInitUnicodeString(&ServerName
, servername
);
1564 RtlInitUnicodeString(&UserName
, username
);
1566 /* Connect to the SAM Server */
1567 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
1569 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1571 if (!NT_SUCCESS(Status
))
1573 ERR("SamConnect failed (Status %08lx)\n", Status
);
1574 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1578 /* Open the Builtin Domain */
1579 Status
= OpenBuiltinDomain(ServerHandle
,
1582 if (!NT_SUCCESS(Status
))
1584 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
1585 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1589 /* Open the user account in the builtin domain */
1590 ApiStatus
= OpenUserByName(DomainHandle
,
1594 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_NONE_MAPPED
)
1596 TRACE("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
1600 if (UserHandle
== NULL
)
1602 if (DomainHandle
!= NULL
)
1604 SamCloseHandle(DomainHandle
);
1605 DomainHandle
= NULL
;
1608 /* Open the Acount Domain */
1609 Status
= OpenAccountDomain(ServerHandle
,
1610 (servername
!= NULL
) ? &ServerName
: NULL
,
1613 if (!NT_SUCCESS(Status
))
1615 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
1616 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1620 /* Open the user account in the account domain */
1621 ApiStatus
= OpenUserByName(DomainHandle
,
1625 if (ApiStatus
!= NERR_Success
)
1627 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
1628 if (ApiStatus
== ERROR_NONE_MAPPED
)
1629 ApiStatus
= NERR_GroupNotFound
;
1634 /* Delete the user */
1635 Status
= SamDeleteUser(UserHandle
);
1636 if (!NT_SUCCESS(Status
))
1638 ERR("SamDeleteUser failed (Status %08lx)\n", Status
);
1639 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1644 if (UserHandle
!= NULL
)
1645 SamCloseHandle(UserHandle
);
1647 if (DomainHandle
!= NULL
)
1648 SamCloseHandle(DomainHandle
);
1650 if (ServerHandle
!= NULL
)
1651 SamCloseHandle(ServerHandle
);
1657 /************************************************************
1658 * NetUserEnum (NETAPI32.@)
1662 NetUserEnum(LPCWSTR servername
,
1667 LPDWORD entriesread
,
1668 LPDWORD totalentries
,
1669 LPDWORD resume_handle
)
1671 UNICODE_STRING ServerName
;
1672 PSAM_RID_ENUMERATION CurrentUser
;
1673 PENUM_CONTEXT EnumContext
= NULL
;
1674 LPVOID Buffer
= NULL
;
1676 SAM_HANDLE UserHandle
= NULL
;
1677 PUSER_ALL_INFORMATION UserInfo
= NULL
;
1679 NET_API_STATUS ApiStatus
= NERR_Success
;
1680 NTSTATUS Status
= STATUS_SUCCESS
;
1682 TRACE("(%s %d 0x%d %p %d %p %p %p)\n", debugstr_w(servername
), level
,
1683 filter
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
1689 if (servername
!= NULL
)
1690 RtlInitUnicodeString(&ServerName
, servername
);
1692 if (resume_handle
!= NULL
&& *resume_handle
!= 0)
1694 EnumContext
= (PENUM_CONTEXT
)*resume_handle
;
1698 ApiStatus
= NetApiBufferAllocate(sizeof(ENUM_CONTEXT
), (PVOID
*)&EnumContext
);
1699 if (ApiStatus
!= NERR_Success
)
1702 EnumContext
->EnumerationContext
= 0;
1703 EnumContext
->Buffer
= NULL
;
1704 EnumContext
->Count
= 0;
1705 EnumContext
->Index
= 0;
1706 EnumContext
->BuiltinDone
= FALSE
;
1708 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
1709 &EnumContext
->ServerHandle
,
1710 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1712 if (!NT_SUCCESS(Status
))
1714 ERR("SamConnect failed (Status %08lx)\n", Status
);
1715 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1719 Status
= OpenAccountDomain(EnumContext
->ServerHandle
,
1720 (servername
!= NULL
) ? &ServerName
: NULL
,
1721 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
1722 &EnumContext
->AccountDomainHandle
);
1723 if (!NT_SUCCESS(Status
))
1725 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
1726 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1730 Status
= OpenBuiltinDomain(EnumContext
->ServerHandle
,
1731 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
1732 &EnumContext
->BuiltinDomainHandle
);
1733 if (!NT_SUCCESS(Status
))
1735 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
1736 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1743 TRACE("EnumContext->Index: %lu\n", EnumContext
->Index
);
1744 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
1746 if (EnumContext
->Index
>= EnumContext
->Count
)
1748 // if (EnumContext->BuiltinDone == TRUE)
1750 // ApiStatus = NERR_Success;
1754 TRACE("Calling SamEnumerateUsersInDomain\n");
1755 Status
= SamEnumerateUsersInDomain(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
1756 &EnumContext
->EnumerationContext
,
1758 (PVOID
*)&EnumContext
->Buffer
,
1760 &EnumContext
->Count
);
1762 TRACE("SamEnumerateUsersInDomain returned (Status %08lx)\n", Status
);
1763 if (!NT_SUCCESS(Status
))
1765 ERR("SamEnumerateUsersInDomain failed (Status %08lx)\n", Status
);
1766 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1770 if (Status
== STATUS_MORE_ENTRIES
)
1772 ApiStatus
= NERR_BufTooSmall
;
1777 EnumContext
->BuiltinDone
= TRUE
;
1781 TRACE("EnumContext: %lu\n", EnumContext
);
1782 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
1783 TRACE("EnumContext->Buffer: %p\n", EnumContext
->Buffer
);
1785 /* Get a pointer to the current user */
1786 CurrentUser
= &EnumContext
->Buffer
[EnumContext
->Index
];
1788 TRACE("RID: %lu\n", CurrentUser
->RelativeId
);
1790 Status
= SamOpenUser(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
1791 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
1792 CurrentUser
->RelativeId
,
1794 if (!NT_SUCCESS(Status
))
1796 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1797 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1801 Status
= SamQueryInformationUser(UserHandle
,
1803 (PVOID
*)&UserInfo
);
1804 if (!NT_SUCCESS(Status
))
1806 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
1807 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1811 SamCloseHandle(UserHandle
);
1814 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
1816 CurrentUser
->RelativeId
,
1818 if (ApiStatus
!= NERR_Success
)
1820 ERR("BuildUserInfoBuffer failed (ApiStatus %lu)\n", ApiStatus
);
1824 if (UserInfo
!= NULL
)
1826 FreeUserInfo(UserInfo
);
1830 EnumContext
->Index
++;
1836 if (ApiStatus
== NERR_Success
&& EnumContext
->Index
< EnumContext
->Count
)
1837 ApiStatus
= ERROR_MORE_DATA
;
1839 if (EnumContext
!= NULL
)
1840 *totalentries
= EnumContext
->Count
;
1842 if (resume_handle
== NULL
|| ApiStatus
!= ERROR_MORE_DATA
)
1844 if (EnumContext
!= NULL
)
1846 if (EnumContext
->BuiltinDomainHandle
!= NULL
)
1847 SamCloseHandle(EnumContext
->BuiltinDomainHandle
);
1849 if (EnumContext
->AccountDomainHandle
!= NULL
)
1850 SamCloseHandle(EnumContext
->AccountDomainHandle
);
1852 if (EnumContext
->ServerHandle
!= NULL
)
1853 SamCloseHandle(EnumContext
->ServerHandle
);
1855 if (EnumContext
->Buffer
!= NULL
)
1857 for (i
= 0; i
< EnumContext
->Count
; i
++)
1859 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
1862 SamFreeMemory(EnumContext
->Buffer
);
1865 NetApiBufferFree(EnumContext
);
1870 if (UserHandle
!= NULL
)
1871 SamCloseHandle(UserHandle
);
1873 if (UserInfo
!= NULL
)
1874 FreeUserInfo(UserInfo
);
1876 if (resume_handle
!= NULL
)
1877 *resume_handle
= (DWORD_PTR
)EnumContext
;
1879 *bufptr
= (LPBYTE
)Buffer
;
1881 TRACE("return %lu\n", ApiStatus
);
1887 /************************************************************
1888 * NetUserGetGroups (NETAPI32.@)
1892 NetUserGetGroups(LPCWSTR servername
,
1897 LPDWORD entriesread
,
1898 LPDWORD totalentries
)
1900 FIXME("%s %s %d %p %d %p %p stub\n", debugstr_w(servername
),
1901 debugstr_w(username
), level
, bufptr
, prefixmaxlen
, entriesread
,
1908 return ERROR_INVALID_LEVEL
;
1912 /************************************************************
1913 * NetUserGetInfo (NETAPI32.@)
1917 NetUserGetInfo(LPCWSTR servername
,
1922 UNICODE_STRING ServerName
;
1923 UNICODE_STRING UserName
;
1924 SAM_HANDLE ServerHandle
= NULL
;
1925 SAM_HANDLE AccountDomainHandle
= NULL
;
1926 SAM_HANDLE UserHandle
= NULL
;
1927 PULONG RelativeIds
= NULL
;
1928 PSID_NAME_USE Use
= NULL
;
1929 PUSER_ALL_INFORMATION UserInfo
= NULL
;
1930 LPVOID Buffer
= NULL
;
1931 NET_API_STATUS ApiStatus
= NERR_Success
;
1932 NTSTATUS Status
= STATUS_SUCCESS
;
1934 TRACE("(%s, %s, %d, %p)\n", debugstr_w(servername
),
1935 debugstr_w(username
), level
, bufptr
);
1937 if (servername
!= NULL
)
1938 RtlInitUnicodeString(&ServerName
, servername
);
1940 RtlInitUnicodeString(&UserName
, username
);
1942 /* Connect to the SAM Server */
1943 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
1945 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1947 if (!NT_SUCCESS(Status
))
1949 ERR("SamConnect failed (Status %08lx)\n", Status
);
1950 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1954 /* Open the Account Domain */
1955 Status
= OpenAccountDomain(ServerHandle
,
1956 (servername
!= NULL
) ? &ServerName
: NULL
,
1957 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
1958 &AccountDomainHandle
);
1959 if (!NT_SUCCESS(Status
))
1961 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
1962 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1966 /* Get the RID for the given user name */
1967 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
1972 if (!NT_SUCCESS(Status
))
1974 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
1975 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1979 /* Check if the account is a user account */
1980 if (Use
[0] != SidTypeUser
)
1982 ERR("No user found!\n");
1983 ApiStatus
= NERR_UserNotFound
;
1987 TRACE("RID: %lu\n", RelativeIds
[0]);
1989 /* Open the user object */
1990 Status
= SamOpenUser(AccountDomainHandle
,
1991 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
1994 if (!NT_SUCCESS(Status
))
1996 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1997 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2001 Status
= SamQueryInformationUser(UserHandle
,
2003 (PVOID
*)&UserInfo
);
2004 if (!NT_SUCCESS(Status
))
2006 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
2007 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2011 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
2015 if (ApiStatus
!= NERR_Success
)
2017 ERR("BuildUserInfoBuffer failed (ApiStatus %08lu)\n", ApiStatus
);
2022 if (UserInfo
!= NULL
)
2023 FreeUserInfo(UserInfo
);
2025 if (UserHandle
!= NULL
)
2026 SamCloseHandle(UserHandle
);
2028 if (RelativeIds
!= NULL
)
2029 SamFreeMemory(RelativeIds
);
2034 if (AccountDomainHandle
!= NULL
)
2035 SamCloseHandle(AccountDomainHandle
);
2037 if (ServerHandle
!= NULL
)
2038 SamCloseHandle(ServerHandle
);
2040 *bufptr
= (LPBYTE
)Buffer
;
2046 /************************************************************
2047 * NetUserGetLocalGroups (NETAPI32.@)
2051 NetUserGetLocalGroups(LPCWSTR servername
,
2057 LPDWORD entriesread
,
2058 LPDWORD totalentries
)
2060 UNICODE_STRING ServerName
;
2061 UNICODE_STRING UserName
;
2062 SAM_HANDLE ServerHandle
= NULL
;
2063 SAM_HANDLE BuiltinDomainHandle
= NULL
;
2064 SAM_HANDLE AccountDomainHandle
= NULL
;
2065 PSID AccountDomainSid
= NULL
;
2066 PSID UserSid
= NULL
;
2067 PULONG RelativeIds
= NULL
;
2068 PSID_NAME_USE Use
= NULL
;
2069 ULONG BuiltinMemberCount
= 0;
2070 ULONG AccountMemberCount
= 0;
2071 PULONG BuiltinAliases
= NULL
;
2072 PULONG AccountAliases
= NULL
;
2073 PUNICODE_STRING BuiltinNames
= NULL
;
2074 PUNICODE_STRING AccountNames
= NULL
;
2075 PLOCALGROUP_USERS_INFO_0 Buffer
= NULL
;
2081 NET_API_STATUS ApiStatus
= NERR_Success
;
2082 NTSTATUS Status
= STATUS_SUCCESS
;
2084 TRACE("(%s, %s, %d, %08x, %p %d, %p, %p) stub!\n",
2085 debugstr_w(servername
), debugstr_w(username
), level
, flags
, bufptr
,
2086 prefmaxlen
, entriesread
, totalentries
);
2089 return ERROR_INVALID_LEVEL
;
2091 if (flags
& ~LG_INCLUDE_INDIRECT
)
2092 return ERROR_INVALID_PARAMETER
;
2094 if (flags
& LG_INCLUDE_INDIRECT
)
2096 WARN("The flag LG_INCLUDE_INDIRECT is not supported yet!\n");
2099 if (servername
!= NULL
)
2100 RtlInitUnicodeString(&ServerName
, servername
);
2102 RtlInitUnicodeString(&UserName
, username
);
2104 /* Connect to the SAM Server */
2105 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2107 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2109 if (!NT_SUCCESS(Status
))
2111 ERR("SamConnect failed (Status %08lx)\n", Status
);
2112 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2116 /* Open the Builtin Domain */
2117 Status
= OpenBuiltinDomain(ServerHandle
,
2118 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2119 &BuiltinDomainHandle
);
2120 if (!NT_SUCCESS(Status
))
2122 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2123 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2127 /* Get the Account Domain SID */
2128 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
2130 if (!NT_SUCCESS(Status
))
2132 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
2133 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2137 /* Open the Account Domain */
2138 Status
= SamOpenDomain(ServerHandle
,
2139 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2141 &AccountDomainHandle
);
2142 if (!NT_SUCCESS(Status
))
2144 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2145 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2149 /* Get the RID for the given user name */
2150 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2155 if (!NT_SUCCESS(Status
))
2157 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2158 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2162 /* Fail, if it is not a user account */
2163 if (Use
[0] != SidTypeUser
)
2165 ERR("Account is not a User!\n");
2166 ApiStatus
= NERR_UserNotFound
;
2170 /* Build the User SID from the Account Domain SID and the users RID */
2171 ApiStatus
= BuildSidFromSidAndRid(AccountDomainSid
,
2174 if (ApiStatus
!= NERR_Success
)
2176 ERR("BuildSidFromSidAndRid failed!\n");
2180 /* Get alias memberships in the Builtin Domain */
2181 Status
= SamGetAliasMembership(BuiltinDomainHandle
,
2184 &BuiltinMemberCount
,
2186 if (!NT_SUCCESS(Status
))
2188 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2189 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2193 if (BuiltinMemberCount
> 0)
2195 /* Get the Names of the builtin alias members */
2196 Status
= SamLookupIdsInDomain(BuiltinDomainHandle
,
2201 if (!NT_SUCCESS(Status
))
2203 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2204 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2209 /* Get alias memberships in the Account Domain */
2210 Status
= SamGetAliasMembership(AccountDomainHandle
,
2213 &AccountMemberCount
,
2215 if (!NT_SUCCESS(Status
))
2217 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2218 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2222 if (AccountMemberCount
> 0)
2224 /* Get the Names of the builtin alias members */
2225 Status
= SamLookupIdsInDomain(AccountDomainHandle
,
2230 if (!NT_SUCCESS(Status
))
2232 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2233 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2238 /* Calculate the required buffer size */
2241 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2243 if (BuiltinNames
[i
].Length
> 0)
2245 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2250 for (i
= 0; i
< AccountMemberCount
; i
++)
2252 if (BuiltinNames
[i
].Length
> 0)
2254 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2261 ApiStatus
= NERR_Success
;
2265 /* Allocate buffer */
2266 ApiStatus
= NetApiBufferAllocate(Size
, (LPVOID
*)&Buffer
);
2267 if (ApiStatus
!= NERR_Success
)
2270 ZeroMemory(Buffer
, Size
);
2272 StrPtr
= (LPWSTR
)((INT_PTR
)Buffer
+ Count
* sizeof(LOCALGROUP_USERS_INFO_0
));
2274 /* Copy data to the allocated buffer */
2276 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2278 if (BuiltinNames
[i
].Length
> 0)
2281 BuiltinNames
[i
].Buffer
,
2282 BuiltinNames
[i
].Length
);
2283 Buffer
[Index
].lgrui0_name
= StrPtr
;
2285 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2290 for (i
= 0; i
< AccountMemberCount
; i
++)
2292 if (AccountNames
[i
].Length
> 0)
2295 AccountNames
[i
].Buffer
,
2296 AccountNames
[i
].Length
);
2297 Buffer
[Index
].lgrui0_name
= StrPtr
;
2299 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2305 if (AccountNames
!= NULL
)
2306 SamFreeMemory(AccountNames
);
2308 if (BuiltinNames
!= NULL
)
2309 SamFreeMemory(BuiltinNames
);
2311 if (AccountAliases
!= NULL
)
2312 SamFreeMemory(AccountAliases
);
2314 if (BuiltinAliases
!= NULL
)
2315 SamFreeMemory(BuiltinAliases
);
2317 if (RelativeIds
!= NULL
)
2318 SamFreeMemory(RelativeIds
);
2323 if (UserSid
!= NULL
)
2324 NetApiBufferFree(UserSid
);
2326 if (AccountDomainSid
!= NULL
)
2327 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
2329 if (AccountDomainHandle
!= NULL
)
2330 SamCloseHandle(AccountDomainHandle
);
2332 if (BuiltinDomainHandle
!= NULL
)
2333 SamCloseHandle(BuiltinDomainHandle
);
2335 if (ServerHandle
!= NULL
)
2336 SamCloseHandle(ServerHandle
);
2338 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
2345 *entriesread
= Count
;
2346 *totalentries
= Count
;
2349 *bufptr
= (LPBYTE
)Buffer
;
2355 /******************************************************************************
2356 * NetUserSetGroups (NETAPI32.@)
2360 NetUserSetGroups(LPCWSTR servername
,
2366 FIXME("(%s %s %lu %p %lu)\n",
2367 debugstr_w(servername
), debugstr_w(username
), level
, buf
, num_entries
);
2368 return ERROR_ACCESS_DENIED
;
2372 /******************************************************************************
2373 * NetUserSetInfo (NETAPI32.@)
2377 NetUserSetInfo(LPCWSTR servername
,
2383 UNICODE_STRING ServerName
;
2384 UNICODE_STRING UserName
;
2385 SAM_HANDLE ServerHandle
= NULL
;
2386 SAM_HANDLE AccountDomainHandle
= NULL
;
2387 SAM_HANDLE UserHandle
= NULL
;
2388 NET_API_STATUS ApiStatus
= NERR_Success
;
2389 NTSTATUS Status
= STATUS_SUCCESS
;
2391 TRACE("(%s %s %lu %p %p)\n",
2392 debugstr_w(servername
), debugstr_w(username
), level
, buf
, parm_err
);
2394 if (parm_err
!= NULL
)
2395 *parm_err
= PARM_ERROR_NONE
;
2397 /* Check the info level */
2427 return ERROR_INVALID_LEVEL
;
2430 if (servername
!= NULL
)
2431 RtlInitUnicodeString(&ServerName
, servername
);
2433 RtlInitUnicodeString(&UserName
, username
);
2435 /* Connect to the SAM Server */
2436 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2438 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2440 if (!NT_SUCCESS(Status
))
2442 ERR("SamConnect failed (Status %08lx)\n", Status
);
2443 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2447 /* Open the Account Domain */
2448 Status
= OpenAccountDomain(ServerHandle
,
2449 (servername
!= NULL
) ? &ServerName
: NULL
,
2450 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2451 &AccountDomainHandle
);
2452 if (!NT_SUCCESS(Status
))
2454 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2455 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2459 /* Open the User Account */
2460 ApiStatus
= OpenUserByName(AccountDomainHandle
,
2464 if (ApiStatus
!= NERR_Success
)
2466 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2470 /* Set user information */
2471 ApiStatus
= SetUserInfo(UserHandle
,
2474 if (ApiStatus
!= NERR_Success
)
2476 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
2480 if (UserHandle
!= NULL
)
2481 SamCloseHandle(UserHandle
);
2483 if (AccountDomainHandle
!= NULL
)
2484 SamCloseHandle(AccountDomainHandle
);
2486 if (ServerHandle
!= NULL
)
2487 SamCloseHandle(ServerHandle
);