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 BuildUserInfoBuffer(PUSER_ALL_INFORMATION UserInfo
,
120 UNICODE_STRING LogonServer
= RTL_CONSTANT_STRING(L
"\\\\*");
121 LPVOID LocalBuffer
= NULL
;
122 PUSER_INFO_0 UserInfo0
;
123 PUSER_INFO_1 UserInfo1
;
124 PUSER_INFO_2 UserInfo2
;
125 PUSER_INFO_3 UserInfo3
;
126 PUSER_INFO_10 UserInfo10
;
127 PUSER_INFO_20 UserInfo20
;
128 PUSER_INFO_23 UserInfo23
;
131 NET_API_STATUS ApiStatus
= NERR_Success
;
138 Size
= sizeof(USER_INFO_0
) +
139 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
143 Size
= sizeof(USER_INFO_1
) +
144 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
146 if (UserInfo
->HomeDirectory
.Length
> 0)
147 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
149 if (UserInfo
->AdminComment
.Length
> 0)
150 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
152 if (UserInfo
->ScriptPath
.Length
> 0)
153 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
157 Size
= sizeof(USER_INFO_2
) +
158 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
160 if (UserInfo
->HomeDirectory
.Length
> 0)
161 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
163 if (UserInfo
->AdminComment
.Length
> 0)
164 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
166 if (UserInfo
->ScriptPath
.Length
> 0)
167 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
169 if (UserInfo
->FullName
.Length
> 0)
170 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
172 if (UserInfo
->UserComment
.Length
> 0)
173 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
175 if (UserInfo
->Parameters
.Length
> 0)
176 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
178 if (UserInfo
->WorkStations
.Length
> 0)
179 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
181 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
182 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
184 if (LogonServer
.Length
> 0)
185 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
189 Size
= sizeof(USER_INFO_3
) +
190 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
192 if (UserInfo
->HomeDirectory
.Length
> 0)
193 Size
+= UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
);
195 if (UserInfo
->AdminComment
.Length
> 0)
196 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
198 if (UserInfo
->ScriptPath
.Length
> 0)
199 Size
+= UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
);
201 if (UserInfo
->FullName
.Length
> 0)
202 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
204 if (UserInfo
->UserComment
.Length
> 0)
205 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
207 if (UserInfo
->Parameters
.Length
> 0)
208 Size
+= UserInfo
->Parameters
.Length
+ sizeof(WCHAR
);
210 if (UserInfo
->WorkStations
.Length
> 0)
211 Size
+= UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
);
213 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
214 Size
+= (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8;
216 if (LogonServer
.Length
> 0)
217 Size
+= LogonServer
.Length
+ sizeof(WCHAR
);
219 if (UserInfo
->ProfilePath
.Length
> 0)
220 Size
+= UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
);
222 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
223 Size
+= UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
);
229 Size
= sizeof(USER_INFO_10
) +
230 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
232 if (UserInfo
->AdminComment
.Length
> 0)
233 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
235 if (UserInfo
->UserComment
.Length
> 0)
236 Size
+= UserInfo
->UserComment
.Length
+ sizeof(WCHAR
);
238 if (UserInfo
->FullName
.Length
> 0)
239 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
245 Size
= sizeof(USER_INFO_20
) +
246 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
248 if (UserInfo
->FullName
.Length
> 0)
249 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
251 if (UserInfo
->AdminComment
.Length
> 0)
252 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
256 Size
= sizeof(USER_INFO_23
) +
257 UserInfo
->UserName
.Length
+ sizeof(WCHAR
);
259 if (UserInfo
->FullName
.Length
> 0)
260 Size
+= UserInfo
->FullName
.Length
+ sizeof(WCHAR
);
262 if (UserInfo
->AdminComment
.Length
> 0)
263 Size
+= UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
265 /* FIXME: usri23_user_sid */
269 ApiStatus
= ERROR_INVALID_LEVEL
;
273 ApiStatus
= NetApiBufferAllocate(Size
, &LocalBuffer
);
274 if (ApiStatus
!= NERR_Success
)
277 ZeroMemory(LocalBuffer
, Size
);
282 UserInfo0
= (PUSER_INFO_0
)LocalBuffer
;
284 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo0
+ sizeof(USER_INFO_0
));
285 UserInfo0
->usri0_name
= Ptr
;
287 memcpy(UserInfo0
->usri0_name
,
288 UserInfo
->UserName
.Buffer
,
289 UserInfo
->UserName
.Length
);
290 UserInfo0
->usri0_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
294 UserInfo1
= (PUSER_INFO_1
)LocalBuffer
;
296 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo1
+ sizeof(USER_INFO_1
));
298 UserInfo1
->usri1_name
= Ptr
;
300 memcpy(UserInfo1
->usri1_name
,
301 UserInfo
->UserName
.Buffer
,
302 UserInfo
->UserName
.Length
);
303 UserInfo1
->usri1_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
305 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
307 UserInfo1
->usri1_password
= NULL
;
309 /* FIXME: UserInfo1->usri1_password_age */
310 /* FIXME: UserInfo1->usri1_priv */
312 if (UserInfo
->HomeDirectory
.Length
> 0)
314 UserInfo1
->usri1_home_dir
= Ptr
;
316 memcpy(UserInfo1
->usri1_home_dir
,
317 UserInfo
->HomeDirectory
.Buffer
,
318 UserInfo
->HomeDirectory
.Length
);
319 UserInfo1
->usri1_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
321 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
324 if (UserInfo
->AdminComment
.Length
> 0)
326 UserInfo1
->usri1_comment
= Ptr
;
328 memcpy(UserInfo1
->usri1_comment
,
329 UserInfo
->AdminComment
.Buffer
,
330 UserInfo
->AdminComment
.Length
);
331 UserInfo1
->usri1_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
333 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
336 UserInfo1
->usri1_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
338 if (UserInfo
->ScriptPath
.Length
> 0)
340 UserInfo1
->usri1_script_path
= Ptr
;
342 memcpy(UserInfo1
->usri1_script_path
,
343 UserInfo
->ScriptPath
.Buffer
,
344 UserInfo
->ScriptPath
.Length
);
345 UserInfo1
->usri1_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
350 UserInfo2
= (PUSER_INFO_2
)LocalBuffer
;
352 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo2
+ sizeof(USER_INFO_2
));
354 UserInfo2
->usri2_name
= Ptr
;
356 memcpy(UserInfo2
->usri2_name
,
357 UserInfo
->UserName
.Buffer
,
358 UserInfo
->UserName
.Length
);
359 UserInfo2
->usri2_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
361 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
363 /* FIXME: usri2_password_age */
364 /* FIXME: usri2_priv */
366 if (UserInfo
->HomeDirectory
.Length
> 0)
368 UserInfo2
->usri2_home_dir
= Ptr
;
370 memcpy(UserInfo2
->usri2_home_dir
,
371 UserInfo
->HomeDirectory
.Buffer
,
372 UserInfo
->HomeDirectory
.Length
);
373 UserInfo2
->usri2_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
375 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
378 if (UserInfo
->AdminComment
.Length
> 0)
380 UserInfo2
->usri2_comment
= Ptr
;
382 memcpy(UserInfo2
->usri2_comment
,
383 UserInfo
->AdminComment
.Buffer
,
384 UserInfo
->AdminComment
.Length
);
385 UserInfo2
->usri2_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
387 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
390 UserInfo2
->usri2_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
392 if (UserInfo
->ScriptPath
.Length
> 0)
394 UserInfo2
->usri2_script_path
= Ptr
;
396 memcpy(UserInfo2
->usri2_script_path
,
397 UserInfo
->ScriptPath
.Buffer
,
398 UserInfo
->ScriptPath
.Length
);
399 UserInfo2
->usri2_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
401 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
404 /* FIXME: usri2_auth_flags */
406 if (UserInfo
->FullName
.Length
> 0)
408 UserInfo2
->usri2_full_name
= Ptr
;
410 memcpy(UserInfo2
->usri2_full_name
,
411 UserInfo
->FullName
.Buffer
,
412 UserInfo
->FullName
.Length
);
413 UserInfo2
->usri2_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
415 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
418 if (UserInfo
->UserComment
.Length
> 0)
420 UserInfo2
->usri2_usr_comment
= Ptr
;
422 memcpy(UserInfo2
->usri2_usr_comment
,
423 UserInfo
->UserComment
.Buffer
,
424 UserInfo
->UserComment
.Length
);
425 UserInfo2
->usri2_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
427 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
430 if (UserInfo
->Parameters
.Length
> 0)
432 UserInfo2
->usri2_parms
= Ptr
;
434 memcpy(UserInfo2
->usri2_parms
,
435 UserInfo
->Parameters
.Buffer
,
436 UserInfo
->Parameters
.Length
);
437 UserInfo2
->usri2_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
439 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
442 if (UserInfo
->WorkStations
.Length
> 0)
444 UserInfo2
->usri2_workstations
= Ptr
;
446 memcpy(UserInfo2
->usri2_workstations
,
447 UserInfo
->WorkStations
.Buffer
,
448 UserInfo
->WorkStations
.Length
);
449 UserInfo2
->usri2_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
451 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
454 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
455 &UserInfo2
->usri2_last_logon
);
457 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
458 &UserInfo2
->usri2_last_logoff
);
460 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
461 &UserInfo2
->usri2_acct_expires
);
463 UserInfo2
->usri2_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
464 UserInfo2
->usri2_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
466 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
468 UserInfo2
->usri2_logon_hours
= (PVOID
)Ptr
;
470 memcpy(UserInfo2
->usri2_logon_hours
,
471 UserInfo
->LogonHours
.LogonHours
,
472 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
474 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
477 UserInfo2
->usri2_bad_pw_count
= UserInfo
->BadPasswordCount
;
478 UserInfo2
->usri2_num_logons
= UserInfo
->LogonCount
;
480 if (LogonServer
.Length
> 0)
482 UserInfo2
->usri2_logon_server
= Ptr
;
484 memcpy(UserInfo2
->usri2_logon_server
,
487 UserInfo2
->usri2_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
489 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
492 UserInfo2
->usri2_country_code
= UserInfo
->CountryCode
;
493 UserInfo2
->usri2_code_page
= UserInfo
->CodePage
;
497 UserInfo3
= (PUSER_INFO_3
)LocalBuffer
;
499 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo3
+ sizeof(USER_INFO_3
));
501 UserInfo3
->usri3_name
= Ptr
;
503 memcpy(UserInfo3
->usri3_name
,
504 UserInfo
->UserName
.Buffer
,
505 UserInfo
->UserName
.Length
);
506 UserInfo3
->usri3_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
508 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
510 /* FIXME: usri3_password_age */
511 /* FIXME: usri3_priv */
513 if (UserInfo
->HomeDirectory
.Length
> 0)
515 UserInfo3
->usri3_home_dir
= Ptr
;
517 memcpy(UserInfo3
->usri3_home_dir
,
518 UserInfo
->HomeDirectory
.Buffer
,
519 UserInfo
->HomeDirectory
.Length
);
520 UserInfo3
->usri3_home_dir
[UserInfo
->HomeDirectory
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
522 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectory
.Length
+ sizeof(WCHAR
));
525 if (UserInfo
->AdminComment
.Length
> 0)
527 UserInfo3
->usri3_comment
= Ptr
;
529 memcpy(UserInfo3
->usri3_comment
,
530 UserInfo
->AdminComment
.Buffer
,
531 UserInfo
->AdminComment
.Length
);
532 UserInfo3
->usri3_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
534 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
537 UserInfo3
->usri3_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
539 if (UserInfo
->ScriptPath
.Length
> 0)
541 UserInfo3
->usri3_script_path
= Ptr
;
543 memcpy(UserInfo3
->usri3_script_path
,
544 UserInfo
->ScriptPath
.Buffer
,
545 UserInfo
->ScriptPath
.Length
);
546 UserInfo3
->usri3_script_path
[UserInfo
->ScriptPath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
548 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ScriptPath
.Length
+ sizeof(WCHAR
));
551 /* FIXME: usri3_auth_flags */
553 if (UserInfo
->FullName
.Length
> 0)
555 UserInfo3
->usri3_full_name
= Ptr
;
557 memcpy(UserInfo3
->usri3_full_name
,
558 UserInfo
->FullName
.Buffer
,
559 UserInfo
->FullName
.Length
);
560 UserInfo3
->usri3_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
562 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
565 if (UserInfo
->UserComment
.Length
> 0)
567 UserInfo3
->usri3_usr_comment
= Ptr
;
569 memcpy(UserInfo3
->usri3_usr_comment
,
570 UserInfo
->UserComment
.Buffer
,
571 UserInfo
->UserComment
.Length
);
572 UserInfo3
->usri3_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
574 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
577 if (UserInfo
->Parameters
.Length
> 0)
579 UserInfo3
->usri3_parms
= Ptr
;
581 memcpy(UserInfo3
->usri3_parms
,
582 UserInfo
->Parameters
.Buffer
,
583 UserInfo
->Parameters
.Length
);
584 UserInfo3
->usri3_parms
[UserInfo
->Parameters
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
586 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->Parameters
.Length
+ sizeof(WCHAR
));
589 if (UserInfo
->WorkStations
.Length
> 0)
591 UserInfo3
->usri3_workstations
= Ptr
;
593 memcpy(UserInfo3
->usri3_workstations
,
594 UserInfo
->WorkStations
.Buffer
,
595 UserInfo
->WorkStations
.Length
);
596 UserInfo3
->usri3_workstations
[UserInfo
->WorkStations
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
598 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->WorkStations
.Length
+ sizeof(WCHAR
));
601 RtlTimeToSecondsSince1970(&UserInfo
->LastLogon
,
602 &UserInfo3
->usri3_last_logon
);
604 RtlTimeToSecondsSince1970(&UserInfo
->LastLogoff
,
605 &UserInfo3
->usri3_last_logoff
);
607 RtlTimeToSecondsSince1970(&UserInfo
->AccountExpires
,
608 &UserInfo3
->usri3_acct_expires
);
610 UserInfo3
->usri3_max_storage
= USER_MAXSTORAGE_UNLIMITED
;
611 UserInfo3
->usri3_units_per_week
= UserInfo
->LogonHours
.UnitsPerWeek
;
613 if (UserInfo
->LogonHours
.UnitsPerWeek
> 0)
615 UserInfo3
->usri3_logon_hours
= (PVOID
)Ptr
;
617 memcpy(UserInfo3
->usri3_logon_hours
,
618 UserInfo
->LogonHours
.LogonHours
,
619 (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
621 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ (((ULONG
)UserInfo
->LogonHours
.UnitsPerWeek
) + 7) / 8);
624 UserInfo3
->usri3_bad_pw_count
= UserInfo
->BadPasswordCount
;
625 UserInfo3
->usri3_num_logons
= UserInfo
->LogonCount
;
627 if (LogonServer
.Length
> 0)
629 UserInfo3
->usri3_logon_server
= Ptr
;
631 memcpy(UserInfo3
->usri3_logon_server
,
634 UserInfo3
->usri3_logon_server
[LogonServer
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
636 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ LogonServer
.Length
+ sizeof(WCHAR
));
639 UserInfo3
->usri3_country_code
= UserInfo
->CountryCode
;
640 UserInfo3
->usri3_code_page
= UserInfo
->CodePage
;
641 UserInfo3
->usri3_user_id
= RelativeId
;
642 UserInfo3
->usri3_primary_group_id
= UserInfo
->PrimaryGroupId
;
644 if (UserInfo
->ProfilePath
.Length
> 0)
646 UserInfo3
->usri3_profile
= Ptr
;
648 memcpy(UserInfo3
->usri3_profile
,
649 UserInfo
->ProfilePath
.Buffer
,
650 UserInfo
->ProfilePath
.Length
);
651 UserInfo3
->usri3_profile
[UserInfo
->ProfilePath
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
653 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->ProfilePath
.Length
+ sizeof(WCHAR
));
656 if (UserInfo
->HomeDirectoryDrive
.Length
> 0)
658 UserInfo3
->usri3_home_dir_drive
= Ptr
;
660 memcpy(UserInfo3
->usri3_home_dir_drive
,
661 UserInfo
->HomeDirectoryDrive
.Buffer
,
662 UserInfo
->HomeDirectoryDrive
.Length
);
663 UserInfo3
->usri3_home_dir_drive
[UserInfo
->HomeDirectoryDrive
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
665 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->HomeDirectoryDrive
.Length
+ sizeof(WCHAR
));
668 UserInfo3
->usri3_password_expired
= (UserInfo
->UserAccountControl
& USER_PASSWORD_EXPIRED
);
674 UserInfo10
= (PUSER_INFO_10
)LocalBuffer
;
676 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo10
+ sizeof(USER_INFO_10
));
678 UserInfo10
->usri10_name
= Ptr
;
680 memcpy(UserInfo10
->usri10_name
,
681 UserInfo
->UserName
.Buffer
,
682 UserInfo
->UserName
.Length
);
683 UserInfo10
->usri10_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
685 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
687 if (UserInfo
->AdminComment
.Length
> 0)
689 UserInfo10
->usri10_comment
= Ptr
;
691 memcpy(UserInfo10
->usri10_comment
,
692 UserInfo
->AdminComment
.Buffer
,
693 UserInfo
->AdminComment
.Length
);
694 UserInfo10
->usri10_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
696 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
699 if (UserInfo
->UserComment
.Length
> 0)
701 UserInfo10
->usri10_usr_comment
= Ptr
;
703 memcpy(UserInfo10
->usri10_usr_comment
,
704 UserInfo
->UserComment
.Buffer
,
705 UserInfo
->UserComment
.Length
);
706 UserInfo10
->usri10_usr_comment
[UserInfo
->UserComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
708 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserComment
.Length
+ sizeof(WCHAR
));
711 if (UserInfo
->FullName
.Length
> 0)
713 UserInfo10
->usri10_full_name
= Ptr
;
715 memcpy(UserInfo10
->usri10_full_name
,
716 UserInfo
->FullName
.Buffer
,
717 UserInfo
->FullName
.Length
);
718 UserInfo10
->usri10_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
720 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
727 UserInfo20
= (PUSER_INFO_20
)LocalBuffer
;
729 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo20
+ sizeof(USER_INFO_20
));
731 UserInfo20
->usri20_name
= Ptr
;
733 memcpy(UserInfo20
->usri20_name
,
734 UserInfo
->UserName
.Buffer
,
735 UserInfo
->UserName
.Length
);
736 UserInfo20
->usri20_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
738 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
740 if (UserInfo
->FullName
.Length
> 0)
742 UserInfo20
->usri20_full_name
= Ptr
;
744 memcpy(UserInfo20
->usri20_full_name
,
745 UserInfo
->FullName
.Buffer
,
746 UserInfo
->FullName
.Length
);
747 UserInfo20
->usri20_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
749 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
752 if (UserInfo
->AdminComment
.Length
> 0)
754 UserInfo20
->usri20_comment
= Ptr
;
756 memcpy(UserInfo20
->usri20_comment
,
757 UserInfo
->AdminComment
.Buffer
,
758 UserInfo
->AdminComment
.Length
);
759 UserInfo20
->usri20_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
761 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
764 UserInfo20
->usri20_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
766 UserInfo20
->usri20_user_id
= RelativeId
;
770 UserInfo23
= (PUSER_INFO_23
)LocalBuffer
;
772 Ptr
= (LPWSTR
)((ULONG_PTR
)UserInfo23
+ sizeof(USER_INFO_23
));
774 UserInfo23
->usri23_name
= Ptr
;
776 memcpy(UserInfo23
->usri23_name
,
777 UserInfo
->UserName
.Buffer
,
778 UserInfo
->UserName
.Length
);
779 UserInfo23
->usri23_name
[UserInfo
->UserName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
781 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->UserName
.Length
+ sizeof(WCHAR
));
783 if (UserInfo
->FullName
.Length
> 0)
785 UserInfo23
->usri23_full_name
= Ptr
;
787 memcpy(UserInfo23
->usri23_full_name
,
788 UserInfo
->FullName
.Buffer
,
789 UserInfo
->FullName
.Length
);
790 UserInfo23
->usri23_full_name
[UserInfo
->FullName
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
792 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->FullName
.Length
+ sizeof(WCHAR
));
795 if (UserInfo
->AdminComment
.Length
> 0)
797 UserInfo23
->usri23_comment
= Ptr
;
799 memcpy(UserInfo23
->usri23_comment
,
800 UserInfo
->AdminComment
.Buffer
,
801 UserInfo
->AdminComment
.Length
);
802 UserInfo23
->usri23_comment
[UserInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
804 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ UserInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
807 UserInfo23
->usri23_flags
= GetAccountFlags(UserInfo
->UserAccountControl
);
809 /* FIXME: usri23_user_sid */
814 if (ApiStatus
== NERR_Success
)
816 *Buffer
= LocalBuffer
;
820 if (LocalBuffer
!= NULL
)
821 NetApiBufferFree(LocalBuffer
);
830 FreeUserInfo(PUSER_ALL_INFORMATION UserInfo
)
832 if (UserInfo
->UserName
.Buffer
!= NULL
)
833 SamFreeMemory(UserInfo
->UserName
.Buffer
);
835 if (UserInfo
->FullName
.Buffer
!= NULL
)
836 SamFreeMemory(UserInfo
->FullName
.Buffer
);
838 if (UserInfo
->HomeDirectory
.Buffer
!= NULL
)
839 SamFreeMemory(UserInfo
->HomeDirectory
.Buffer
);
841 if (UserInfo
->HomeDirectoryDrive
.Buffer
!= NULL
)
842 SamFreeMemory(UserInfo
->HomeDirectoryDrive
.Buffer
);
844 if (UserInfo
->ScriptPath
.Buffer
!= NULL
)
845 SamFreeMemory(UserInfo
->ScriptPath
.Buffer
);
847 if (UserInfo
->ProfilePath
.Buffer
!= NULL
)
848 SamFreeMemory(UserInfo
->ProfilePath
.Buffer
);
850 if (UserInfo
->AdminComment
.Buffer
!= NULL
)
851 SamFreeMemory(UserInfo
->AdminComment
.Buffer
);
853 if (UserInfo
->WorkStations
.Buffer
!= NULL
)
854 SamFreeMemory(UserInfo
->WorkStations
.Buffer
);
856 if (UserInfo
->UserComment
.Buffer
!= NULL
)
857 SamFreeMemory(UserInfo
->UserComment
.Buffer
);
859 if (UserInfo
->Parameters
.Buffer
!= NULL
)
860 SamFreeMemory(UserInfo
->Parameters
.Buffer
);
862 if (UserInfo
->PrivateData
.Buffer
!= NULL
)
863 SamFreeMemory(UserInfo
->PrivateData
.Buffer
);
865 if (UserInfo
->LogonHours
.LogonHours
!= NULL
)
866 SamFreeMemory(UserInfo
->LogonHours
.LogonHours
);
868 SamFreeMemory(UserInfo
);
874 SetUserInfo(SAM_HANDLE UserHandle
,
878 USER_ALL_INFORMATION UserAllInfo
;
879 PUSER_INFO_0 UserInfo0
;
880 PUSER_INFO_1 UserInfo1
;
881 PUSER_INFO_2 UserInfo2
;
882 PUSER_INFO_3 UserInfo3
;
883 PUSER_INFO_1003 UserInfo1003
;
884 PUSER_INFO_1006 UserInfo1006
;
885 PUSER_INFO_1007 UserInfo1007
;
886 PUSER_INFO_1009 UserInfo1009
;
887 PUSER_INFO_1011 UserInfo1011
;
888 PUSER_INFO_1012 UserInfo1012
;
889 PUSER_INFO_1013 UserInfo1013
;
890 PUSER_INFO_1014 UserInfo1014
;
891 PUSER_INFO_1052 UserInfo1052
;
892 PUSER_INFO_1053 UserInfo1053
;
893 NET_API_STATUS ApiStatus
= NERR_Success
;
894 NTSTATUS Status
= STATUS_SUCCESS
;
896 ZeroMemory(&UserAllInfo
, sizeof(USER_ALL_INFORMATION
));
901 UserInfo0
= (PUSER_INFO_0
)UserInfo
;
903 RtlInitUnicodeString(&UserAllInfo
.UserName
,
904 UserInfo0
->usri0_name
);
906 UserAllInfo
.WhichFields
|= USER_ALL_USERNAME
;
910 UserInfo1
= (PUSER_INFO_1
)UserInfo
;
912 // usri1_name ignored
914 if (UserInfo1
->usri1_password
!= NULL
)
916 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
917 UserInfo1
->usri1_password
);
918 UserAllInfo
.NtPasswordPresent
= TRUE
;
919 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
922 // usri1_password_age ignored
924 // UserInfo1->usri1_priv
926 if (UserInfo1
->usri1_home_dir
!= NULL
)
928 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
929 UserInfo1
->usri1_home_dir
);
930 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
933 if (UserInfo1
->usri1_comment
!= NULL
)
935 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
936 UserInfo1
->usri1_comment
);
937 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
940 // UserInfo1->usri1_flags
941 // UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
943 if (UserInfo1
->usri1_script_path
!= NULL
)
945 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
946 UserInfo1
->usri1_script_path
);
947 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
952 UserInfo2
= (PUSER_INFO_2
)UserInfo
;
954 // usri2_name ignored
956 if (UserInfo2
->usri2_password
!= NULL
)
958 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
959 UserInfo2
->usri2_password
);
960 UserAllInfo
.NtPasswordPresent
= TRUE
;
961 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
964 // usri2_password_age ignored
966 // UserInfo2->usri2_priv;
968 if (UserInfo2
->usri2_home_dir
!= NULL
)
970 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
971 UserInfo2
->usri2_home_dir
);
972 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
975 if (UserInfo2
->usri2_comment
!= NULL
)
977 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
978 UserInfo2
->usri2_comment
);
979 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
982 // UserInfo2->usri2_flags;
984 if (UserInfo2
->usri2_script_path
!= NULL
)
986 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
987 UserInfo2
->usri2_script_path
);
988 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
991 // UserInfo2->usri2_auth_flags;
993 if (UserInfo2
->usri2_full_name
!= NULL
)
995 RtlInitUnicodeString(&UserAllInfo
.FullName
,
996 UserInfo2
->usri2_full_name
);
997 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1000 if (UserInfo2
->usri2_usr_comment
!= NULL
)
1002 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1003 UserInfo2
->usri2_usr_comment
);
1004 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1007 if (UserInfo2
->usri2_parms
!= NULL
)
1009 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1010 UserInfo2
->usri2_parms
);
1011 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1014 if (UserInfo2
->usri2_workstations
!= NULL
)
1016 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1017 UserInfo2
->usri2_workstations
);
1018 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1021 // usri2_last_logon ignored
1022 // usri2_last_logoff ignored
1024 // UserInfo2->usri2_acct_expires;
1025 // UserInfo2->usri2_max_storage;
1026 // UserInfo2->usri2_units_per_week;
1027 // UserInfo2->usri2_logon_hours;
1029 // usri2_bad_pw_count ignored
1030 // usri2_num_logons ignored
1031 // usri2_logon_server ignored
1033 // UserInfo2->usri2_country_code;
1034 // UserInfo2->usri2_code_page;
1038 UserInfo3
= (PUSER_INFO_3
)UserInfo
;
1040 // usri3_name ignored
1042 if (UserInfo3
->usri3_password
!= NULL
)
1044 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1045 UserInfo3
->usri3_password
);
1046 UserAllInfo
.NtPasswordPresent
= TRUE
;
1047 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1050 // usri3_password_age ignored
1052 // UserInfo3->usri3_priv;
1054 if (UserInfo3
->usri3_home_dir
!= NULL
)
1056 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1057 UserInfo3
->usri3_home_dir
);
1058 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1061 if (UserInfo3
->usri3_comment
!= NULL
)
1063 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1064 UserInfo3
->usri3_comment
);
1065 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1068 // UserInfo3->usri3_flags;
1069 // UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
1071 if (UserInfo3
->usri3_script_path
!= NULL
)
1073 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1074 UserInfo3
->usri3_script_path
);
1075 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1078 // UserInfo3->usri3_auth_flags;
1080 if (UserInfo3
->usri3_full_name
!= NULL
)
1082 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1083 UserInfo3
->usri3_full_name
);
1084 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1087 if (UserInfo3
->usri3_usr_comment
!= NULL
)
1089 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1090 UserInfo3
->usri3_usr_comment
);
1091 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1094 if (UserInfo3
->usri3_parms
!= NULL
)
1096 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1097 UserInfo3
->usri3_parms
);
1098 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1101 if (UserInfo3
->usri3_workstations
!= NULL
)
1103 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1104 UserInfo3
->usri3_workstations
);
1105 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1108 // usri3_last_logon ignored
1109 // usri3_last_logoff ignored
1111 // UserInfo3->usri3_acct_expires;
1112 // UserInfo3->usri3_max_storage;
1113 // UserInfo3->usri3_units_per_week;
1114 // UserInfo3->usri3_logon_hours;
1116 // usri3_bad_pw_count ignored
1117 // usri3_num_logons ignored
1118 // usri3_logon_server ignored
1120 // UserInfo3->usri3_country_code;
1121 // UserInfo3->usri3_code_page;
1123 // usri3_user_id ignored
1125 // UserInfo3->usri3_primary_group_id;
1127 if (UserInfo3
->usri3_profile
!= NULL
)
1129 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1130 UserInfo3
->usri3_profile
);
1131 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1134 if (UserInfo3
->usri3_home_dir_drive
!= NULL
)
1136 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1137 UserInfo3
->usri3_home_dir_drive
);
1138 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1141 // UserInfo3->usri3_password_expired;
1149 UserInfo1003
= (PUSER_INFO_1003
)UserInfo
;
1151 if (UserInfo1003
->usri1003_password
!= NULL
)
1153 RtlInitUnicodeString(&UserAllInfo
.NtPassword
,
1154 UserInfo1003
->usri1003_password
);
1155 UserAllInfo
.NtPasswordPresent
= TRUE
;
1156 UserAllInfo
.WhichFields
|= USER_ALL_NTPASSWORDPRESENT
;
1163 UserInfo1006
= (PUSER_INFO_1006
)UserInfo
;
1165 if (UserInfo1006
->usri1006_home_dir
!= NULL
)
1167 RtlInitUnicodeString(&UserAllInfo
.HomeDirectory
,
1168 UserInfo1006
->usri1006_home_dir
);
1169 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORY
;
1174 UserInfo1007
= (PUSER_INFO_1007
)UserInfo
;
1176 if (UserInfo1007
->usri1007_comment
!= NULL
)
1178 RtlInitUnicodeString(&UserAllInfo
.AdminComment
,
1179 UserInfo1007
->usri1007_comment
);
1180 UserAllInfo
.WhichFields
|= USER_ALL_ADMINCOMMENT
;
1187 UserInfo1009
= (PUSER_INFO_1009
)UserInfo
;
1189 if (UserInfo1009
->usri1009_script_path
!= NULL
)
1191 RtlInitUnicodeString(&UserAllInfo
.ScriptPath
,
1192 UserInfo1009
->usri1009_script_path
);
1193 UserAllInfo
.WhichFields
|= USER_ALL_SCRIPTPATH
;
1200 UserInfo1011
= (PUSER_INFO_1011
)UserInfo
;
1202 if (UserInfo1011
->usri1011_full_name
!= NULL
)
1204 RtlInitUnicodeString(&UserAllInfo
.FullName
,
1205 UserInfo1011
->usri1011_full_name
);
1206 UserAllInfo
.WhichFields
|= USER_ALL_FULLNAME
;
1211 UserInfo1012
= (PUSER_INFO_1012
)UserInfo
;
1213 if (UserInfo1012
->usri1012_usr_comment
!= NULL
)
1215 RtlInitUnicodeString(&UserAllInfo
.UserComment
,
1216 UserInfo1012
->usri1012_usr_comment
);
1217 UserAllInfo
.WhichFields
|= USER_ALL_USERCOMMENT
;
1222 UserInfo1013
= (PUSER_INFO_1013
)UserInfo
;
1224 if (UserInfo1013
->usri1013_parms
!= NULL
)
1226 RtlInitUnicodeString(&UserAllInfo
.Parameters
,
1227 UserInfo1013
->usri1013_parms
);
1228 UserAllInfo
.WhichFields
|= USER_ALL_PARAMETERS
;
1233 UserInfo1014
= (PUSER_INFO_1014
)UserInfo
;
1235 if (UserInfo1014
->usri1014_workstations
!= NULL
)
1237 RtlInitUnicodeString(&UserAllInfo
.WorkStations
,
1238 UserInfo1014
->usri1014_workstations
);
1239 UserAllInfo
.WhichFields
|= USER_ALL_WORKSTATIONS
;
1249 UserInfo1052
= (PUSER_INFO_1052
)UserInfo
;
1251 if (UserInfo1052
->usri1052_profile
!= NULL
)
1253 RtlInitUnicodeString(&UserAllInfo
.ProfilePath
,
1254 UserInfo1052
->usri1052_profile
);
1255 UserAllInfo
.WhichFields
|= USER_ALL_PROFILEPATH
;
1260 UserInfo1053
= (PUSER_INFO_1053
)UserInfo
;
1262 if (UserInfo1053
->usri1053_home_dir_drive
!= NULL
)
1264 RtlInitUnicodeString(&UserAllInfo
.HomeDirectoryDrive
,
1265 UserInfo1053
->usri1053_home_dir_drive
);
1266 UserAllInfo
.WhichFields
|= USER_ALL_HOMEDIRECTORYDRIVE
;
1271 ERR("Unsupported level %lu!\n", Level
);
1272 return ERROR_INVALID_PARAMETER
;
1275 Status
= SamSetInformationUser(UserHandle
,
1278 if (!NT_SUCCESS(Status
))
1280 ERR("SamSetInformationUser failed (Status %08lx)\n", Status
);
1281 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1292 OpenUserByName(SAM_HANDLE DomainHandle
,
1293 PUNICODE_STRING UserName
,
1294 ULONG DesiredAccess
,
1295 PSAM_HANDLE UserHandle
)
1297 PULONG RelativeIds
= NULL
;
1298 PSID_NAME_USE Use
= NULL
;
1299 NET_API_STATUS ApiStatus
= NERR_Success
;
1300 NTSTATUS Status
= STATUS_SUCCESS
;
1302 /* Get the RID for the given user name */
1303 Status
= SamLookupNamesInDomain(DomainHandle
,
1308 if (!NT_SUCCESS(Status
))
1310 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
1311 return NetpNtStatusToApiStatus(Status
);
1314 /* Fail, if it is not an alias account */
1315 if (Use
[0] != SidTypeUser
)
1317 ERR("Object is not a user!\n");
1318 ApiStatus
= NERR_GroupNotFound
;
1322 /* Open the alias account */
1323 Status
= SamOpenUser(DomainHandle
,
1327 if (!NT_SUCCESS(Status
))
1329 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1330 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1335 if (RelativeIds
!= NULL
)
1336 SamFreeMemory(RelativeIds
);
1345 /************************************************************
1346 * NetUserAdd (NETAPI32.@)
1350 NetUserAdd(LPCWSTR servername
,
1355 UNICODE_STRING ServerName
;
1356 UNICODE_STRING UserName
;
1357 SAM_HANDLE ServerHandle
= NULL
;
1358 SAM_HANDLE DomainHandle
= NULL
;
1359 SAM_HANDLE UserHandle
= NULL
;
1360 ULONG GrantedAccess
;
1362 NET_API_STATUS ApiStatus
= NERR_Success
;
1363 NTSTATUS Status
= STATUS_SUCCESS
;
1365 TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername
), level
, bufptr
, parm_err
);
1367 /* Check the info level */
1377 return ERROR_INVALID_LEVEL
;
1380 if (servername
!= NULL
)
1381 RtlInitUnicodeString(&ServerName
, servername
);
1383 /* Connect to the SAM Server */
1384 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
1386 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1388 if (!NT_SUCCESS(Status
))
1390 ERR("SamConnect failed (Status %08lx)\n", Status
);
1391 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1395 /* Open the Account Domain */
1396 Status
= OpenAccountDomain(ServerHandle
,
1397 (servername
!= NULL
) ? &ServerName
: NULL
,
1398 DOMAIN_CREATE_USER
| DOMAIN_LOOKUP
,
1400 if (!NT_SUCCESS(Status
))
1402 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
1403 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1407 /* Initialize the user name string */
1408 RtlInitUnicodeString(&UserName
,
1409 ((PUSER_INFO_1
)bufptr
)->usri1_name
);
1411 /* Create the user account */
1412 Status
= SamCreateUser2InDomain(DomainHandle
,
1414 USER_NORMAL_ACCOUNT
,
1415 USER_ALL_ACCESS
| DELETE
| WRITE_DAC
,
1419 if (!NT_SUCCESS(Status
))
1421 ERR("SamCreateUser2InDomain failed (Status %08lx)\n", Status
);
1422 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1426 /* Set user information */
1427 ApiStatus
= SetUserInfo(UserHandle
,
1430 if (ApiStatus
!= NERR_Success
)
1432 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
1437 if (UserHandle
!= NULL
)
1438 SamCloseHandle(UserHandle
);
1440 if (DomainHandle
!= NULL
)
1441 SamCloseHandle(DomainHandle
);
1443 if (ServerHandle
!= NULL
)
1444 SamCloseHandle(ServerHandle
);
1450 /******************************************************************************
1451 * NetUserChangePassword (NETAPI32.@)
1453 * domainname [I] Optional. Domain on which the user resides or the logon
1454 * domain of the current user if NULL.
1455 * username [I] Optional. Username to change the password for or the name
1456 * of the current user if NULL.
1457 * oldpassword [I] The user's current password.
1458 * newpassword [I] The password that the user will be changed to using.
1461 * Success: NERR_Success.
1462 * Failure: NERR_* failure code or win error code.
1467 NetUserChangePassword(LPCWSTR domainname
,
1469 LPCWSTR oldpassword
,
1470 LPCWSTR newpassword
)
1472 TRACE("(%s, %s, ..., ...)\n", debugstr_w(domainname
), debugstr_w(username
));
1473 return NERR_Success
;
1477 /************************************************************
1478 * NetUserDel (NETAPI32.@)
1482 NetUserDel(LPCWSTR servername
,
1485 UNICODE_STRING ServerName
;
1486 UNICODE_STRING UserName
;
1487 SAM_HANDLE ServerHandle
= NULL
;
1488 SAM_HANDLE DomainHandle
= NULL
;
1489 SAM_HANDLE UserHandle
= NULL
;
1490 NET_API_STATUS ApiStatus
= NERR_Success
;
1491 NTSTATUS Status
= STATUS_SUCCESS
;
1493 TRACE("(%s, %s)\n", debugstr_w(servername
), debugstr_w(username
));
1495 if (servername
!= NULL
)
1496 RtlInitUnicodeString(&ServerName
, servername
);
1498 RtlInitUnicodeString(&UserName
, username
);
1500 /* Connect to the SAM Server */
1501 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
1503 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1505 if (!NT_SUCCESS(Status
))
1507 ERR("SamConnect failed (Status %08lx)\n", Status
);
1508 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1512 /* Open the Builtin Domain */
1513 Status
= OpenBuiltinDomain(ServerHandle
,
1516 if (!NT_SUCCESS(Status
))
1518 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
1519 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1523 /* Open the user account in the builtin domain */
1524 ApiStatus
= OpenUserByName(DomainHandle
,
1528 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_NONE_MAPPED
)
1530 TRACE("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
1534 if (UserHandle
== NULL
)
1536 if (DomainHandle
!= NULL
)
1538 SamCloseHandle(DomainHandle
);
1539 DomainHandle
= NULL
;
1542 /* Open the Acount Domain */
1543 Status
= OpenAccountDomain(ServerHandle
,
1544 (servername
!= NULL
) ? &ServerName
: NULL
,
1547 if (!NT_SUCCESS(Status
))
1549 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
1550 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1554 /* Open the user account in the account domain */
1555 ApiStatus
= OpenUserByName(DomainHandle
,
1559 if (ApiStatus
!= NERR_Success
)
1561 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
1562 if (ApiStatus
== ERROR_NONE_MAPPED
)
1563 ApiStatus
= NERR_GroupNotFound
;
1568 /* Delete the user */
1569 Status
= SamDeleteUser(UserHandle
);
1570 if (!NT_SUCCESS(Status
))
1572 ERR("SamDeleteUser failed (Status %08lx)\n", Status
);
1573 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1578 if (UserHandle
!= NULL
)
1579 SamCloseHandle(UserHandle
);
1581 if (DomainHandle
!= NULL
)
1582 SamCloseHandle(DomainHandle
);
1584 if (ServerHandle
!= NULL
)
1585 SamCloseHandle(ServerHandle
);
1591 /************************************************************
1592 * NetUserEnum (NETAPI32.@)
1596 NetUserEnum(LPCWSTR servername
,
1601 LPDWORD entriesread
,
1602 LPDWORD totalentries
,
1603 LPDWORD resume_handle
)
1605 UNICODE_STRING ServerName
;
1606 PSAM_RID_ENUMERATION CurrentUser
;
1607 PENUM_CONTEXT EnumContext
= NULL
;
1608 LPVOID Buffer
= NULL
;
1610 SAM_HANDLE UserHandle
= NULL
;
1611 PUSER_ALL_INFORMATION UserInfo
= NULL
;
1613 NET_API_STATUS ApiStatus
= NERR_Success
;
1614 NTSTATUS Status
= STATUS_SUCCESS
;
1616 TRACE("(%s %d 0x%d %p %d %p %p %p)\n", debugstr_w(servername
), level
,
1617 filter
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resume_handle
);
1623 if (servername
!= NULL
)
1624 RtlInitUnicodeString(&ServerName
, servername
);
1626 if (resume_handle
!= NULL
&& *resume_handle
!= 0)
1628 EnumContext
= (PENUM_CONTEXT
)*resume_handle
;
1632 ApiStatus
= NetApiBufferAllocate(sizeof(ENUM_CONTEXT
), (PVOID
*)&EnumContext
);
1633 if (ApiStatus
!= NERR_Success
)
1636 EnumContext
->EnumerationContext
= 0;
1637 EnumContext
->Buffer
= NULL
;
1638 EnumContext
->Count
= 0;
1639 EnumContext
->Index
= 0;
1640 EnumContext
->BuiltinDone
= FALSE
;
1642 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
1643 &EnumContext
->ServerHandle
,
1644 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1646 if (!NT_SUCCESS(Status
))
1648 ERR("SamConnect failed (Status %08lx)\n", Status
);
1649 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1653 Status
= OpenAccountDomain(EnumContext
->ServerHandle
,
1654 (servername
!= NULL
) ? &ServerName
: NULL
,
1655 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
1656 &EnumContext
->AccountDomainHandle
);
1657 if (!NT_SUCCESS(Status
))
1659 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
1660 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1664 Status
= OpenBuiltinDomain(EnumContext
->ServerHandle
,
1665 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
1666 &EnumContext
->BuiltinDomainHandle
);
1667 if (!NT_SUCCESS(Status
))
1669 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
1670 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1677 TRACE("EnumContext->Index: %lu\n", EnumContext
->Index
);
1678 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
1680 if (EnumContext
->Index
>= EnumContext
->Count
)
1682 // if (EnumContext->BuiltinDone == TRUE)
1684 // ApiStatus = NERR_Success;
1688 TRACE("Calling SamEnumerateUsersInDomain\n");
1689 Status
= SamEnumerateUsersInDomain(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
1690 &EnumContext
->EnumerationContext
,
1692 (PVOID
*)&EnumContext
->Buffer
,
1694 &EnumContext
->Count
);
1696 TRACE("SamEnumerateUsersInDomain returned (Status %08lx)\n", Status
);
1697 if (!NT_SUCCESS(Status
))
1699 ERR("SamEnumerateUsersInDomain failed (Status %08lx)\n", Status
);
1700 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1704 if (Status
== STATUS_MORE_ENTRIES
)
1706 ApiStatus
= NERR_BufTooSmall
;
1711 EnumContext
->BuiltinDone
= TRUE
;
1715 TRACE("EnumContext: %lu\n", EnumContext
);
1716 TRACE("EnumContext->Count: %lu\n", EnumContext
->Count
);
1717 TRACE("EnumContext->Buffer: %p\n", EnumContext
->Buffer
);
1719 /* Get a pointer to the current user */
1720 CurrentUser
= &EnumContext
->Buffer
[EnumContext
->Index
];
1722 TRACE("RID: %lu\n", CurrentUser
->RelativeId
);
1724 Status
= SamOpenUser(EnumContext
->AccountDomainHandle
, //BuiltinDomainHandle,
1725 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
1726 CurrentUser
->RelativeId
,
1728 if (!NT_SUCCESS(Status
))
1730 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1731 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1735 Status
= SamQueryInformationUser(UserHandle
,
1737 (PVOID
*)&UserInfo
);
1738 if (!NT_SUCCESS(Status
))
1740 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
1741 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1745 SamCloseHandle(UserHandle
);
1748 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
1750 CurrentUser
->RelativeId
,
1752 if (ApiStatus
!= NERR_Success
)
1754 ERR("BuildUserInfoBuffer failed (ApiStatus %lu)\n", ApiStatus
);
1758 if (UserInfo
!= NULL
)
1760 FreeUserInfo(UserInfo
);
1764 EnumContext
->Index
++;
1770 if (ApiStatus
== NERR_Success
&& EnumContext
->Index
< EnumContext
->Count
)
1771 ApiStatus
= ERROR_MORE_DATA
;
1773 if (EnumContext
!= NULL
)
1774 *totalentries
= EnumContext
->Count
;
1776 if (resume_handle
== NULL
|| ApiStatus
!= ERROR_MORE_DATA
)
1778 if (EnumContext
!= NULL
)
1780 if (EnumContext
->BuiltinDomainHandle
!= NULL
)
1781 SamCloseHandle(EnumContext
->BuiltinDomainHandle
);
1783 if (EnumContext
->AccountDomainHandle
!= NULL
)
1784 SamCloseHandle(EnumContext
->AccountDomainHandle
);
1786 if (EnumContext
->ServerHandle
!= NULL
)
1787 SamCloseHandle(EnumContext
->ServerHandle
);
1789 if (EnumContext
->Buffer
!= NULL
)
1791 for (i
= 0; i
< EnumContext
->Count
; i
++)
1793 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
1796 SamFreeMemory(EnumContext
->Buffer
);
1799 NetApiBufferFree(EnumContext
);
1804 if (UserHandle
!= NULL
)
1805 SamCloseHandle(UserHandle
);
1807 if (UserInfo
!= NULL
)
1808 FreeUserInfo(UserInfo
);
1810 if (resume_handle
!= NULL
)
1811 *resume_handle
= (DWORD_PTR
)EnumContext
;
1813 *bufptr
= (LPBYTE
)Buffer
;
1815 TRACE("return %lu\n", ApiStatus
);
1821 /************************************************************
1822 * NetUserGetGroups (NETAPI32.@)
1826 NetUserGetGroups(LPCWSTR servername
,
1831 LPDWORD entriesread
,
1832 LPDWORD totalentries
)
1834 FIXME("%s %s %d %p %d %p %p stub\n", debugstr_w(servername
),
1835 debugstr_w(username
), level
, bufptr
, prefixmaxlen
, entriesread
,
1842 return ERROR_INVALID_LEVEL
;
1846 /************************************************************
1847 * NetUserGetInfo (NETAPI32.@)
1851 NetUserGetInfo(LPCWSTR servername
,
1856 UNICODE_STRING ServerName
;
1857 UNICODE_STRING UserName
;
1858 SAM_HANDLE ServerHandle
= NULL
;
1859 SAM_HANDLE AccountDomainHandle
= NULL
;
1860 SAM_HANDLE UserHandle
= NULL
;
1861 PULONG RelativeIds
= NULL
;
1862 PSID_NAME_USE Use
= NULL
;
1863 PUSER_ALL_INFORMATION UserInfo
= NULL
;
1864 LPVOID Buffer
= NULL
;
1865 NET_API_STATUS ApiStatus
= NERR_Success
;
1866 NTSTATUS Status
= STATUS_SUCCESS
;
1868 TRACE("(%s, %s, %d, %p)\n", debugstr_w(servername
),
1869 debugstr_w(username
), level
, bufptr
);
1871 if (servername
!= NULL
)
1872 RtlInitUnicodeString(&ServerName
, servername
);
1874 RtlInitUnicodeString(&UserName
, username
);
1876 /* Connect to the SAM Server */
1877 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
1879 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
1881 if (!NT_SUCCESS(Status
))
1883 ERR("SamConnect failed (Status %08lx)\n", Status
);
1884 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1888 /* Open the Account Domain */
1889 Status
= OpenAccountDomain(ServerHandle
,
1890 (servername
!= NULL
) ? &ServerName
: NULL
,
1891 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
1892 &AccountDomainHandle
);
1893 if (!NT_SUCCESS(Status
))
1895 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
1896 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1900 /* Get the RID for the given user name */
1901 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
1906 if (!NT_SUCCESS(Status
))
1908 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
1909 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1913 /* Check if the account is a user account */
1914 if (Use
[0] != SidTypeUser
)
1916 ERR("No user found!\n");
1917 ApiStatus
= NERR_UserNotFound
;
1921 TRACE("RID: %lu\n", RelativeIds
[0]);
1923 /* Open the user object */
1924 Status
= SamOpenUser(AccountDomainHandle
,
1925 USER_READ_GENERAL
| USER_READ_PREFERENCES
| USER_READ_LOGON
| USER_READ_ACCOUNT
,
1928 if (!NT_SUCCESS(Status
))
1930 ERR("SamOpenUser failed (Status %08lx)\n", Status
);
1931 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1935 Status
= SamQueryInformationUser(UserHandle
,
1937 (PVOID
*)&UserInfo
);
1938 if (!NT_SUCCESS(Status
))
1940 ERR("SamQueryInformationUser failed (Status %08lx)\n", Status
);
1941 ApiStatus
= NetpNtStatusToApiStatus(Status
);
1945 ApiStatus
= BuildUserInfoBuffer(UserInfo
,
1949 if (ApiStatus
!= NERR_Success
)
1951 ERR("BuildUserInfoBuffer failed (ApiStatus %08lu)\n", ApiStatus
);
1956 if (UserInfo
!= NULL
)
1957 FreeUserInfo(UserInfo
);
1959 if (UserHandle
!= NULL
)
1960 SamCloseHandle(UserHandle
);
1962 if (RelativeIds
!= NULL
)
1963 SamFreeMemory(RelativeIds
);
1968 if (AccountDomainHandle
!= NULL
)
1969 SamCloseHandle(AccountDomainHandle
);
1971 if (ServerHandle
!= NULL
)
1972 SamCloseHandle(ServerHandle
);
1974 *bufptr
= (LPBYTE
)Buffer
;
1980 /************************************************************
1981 * NetUserGetLocalGroups (NETAPI32.@)
1985 NetUserGetLocalGroups(LPCWSTR servername
,
1991 LPDWORD entriesread
,
1992 LPDWORD totalentries
)
1994 UNICODE_STRING ServerName
;
1995 UNICODE_STRING UserName
;
1996 SAM_HANDLE ServerHandle
= NULL
;
1997 SAM_HANDLE BuiltinDomainHandle
= NULL
;
1998 SAM_HANDLE AccountDomainHandle
= NULL
;
1999 PSID AccountDomainSid
= NULL
;
2000 PSID UserSid
= NULL
;
2001 PULONG RelativeIds
= NULL
;
2002 PSID_NAME_USE Use
= NULL
;
2003 ULONG BuiltinMemberCount
= 0;
2004 ULONG AccountMemberCount
= 0;
2005 PULONG BuiltinAliases
= NULL
;
2006 PULONG AccountAliases
= NULL
;
2007 PUNICODE_STRING BuiltinNames
= NULL
;
2008 PUNICODE_STRING AccountNames
= NULL
;
2009 PLOCALGROUP_USERS_INFO_0 Buffer
= NULL
;
2015 NET_API_STATUS ApiStatus
= NERR_Success
;
2016 NTSTATUS Status
= STATUS_SUCCESS
;
2018 TRACE("(%s, %s, %d, %08x, %p %d, %p, %p) stub!\n",
2019 debugstr_w(servername
), debugstr_w(username
), level
, flags
, bufptr
,
2020 prefmaxlen
, entriesread
, totalentries
);
2023 return ERROR_INVALID_LEVEL
;
2025 if (flags
& ~LG_INCLUDE_INDIRECT
)
2026 return ERROR_INVALID_PARAMETER
;
2028 if (flags
& LG_INCLUDE_INDIRECT
)
2030 WARN("The flag LG_INCLUDE_INDIRECT is not supported yet!\n");
2033 if (servername
!= NULL
)
2034 RtlInitUnicodeString(&ServerName
, servername
);
2036 RtlInitUnicodeString(&UserName
, username
);
2038 /* Connect to the SAM Server */
2039 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2041 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2043 if (!NT_SUCCESS(Status
))
2045 ERR("SamConnect failed (Status %08lx)\n", Status
);
2046 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2050 /* Open the Builtin Domain */
2051 Status
= OpenBuiltinDomain(ServerHandle
,
2052 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2053 &BuiltinDomainHandle
);
2054 if (!NT_SUCCESS(Status
))
2056 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
2057 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2061 /* Get the Account Domain SID */
2062 Status
= GetAccountDomainSid((servername
!= NULL
) ? &ServerName
: NULL
,
2064 if (!NT_SUCCESS(Status
))
2066 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
2067 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2071 /* Open the Account Domain */
2072 Status
= SamOpenDomain(ServerHandle
,
2073 DOMAIN_LOOKUP
| DOMAIN_GET_ALIAS_MEMBERSHIP
,
2075 &AccountDomainHandle
);
2076 if (!NT_SUCCESS(Status
))
2078 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2079 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2083 /* Get the RID for the given user name */
2084 Status
= SamLookupNamesInDomain(AccountDomainHandle
,
2089 if (!NT_SUCCESS(Status
))
2091 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
2092 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2096 /* Fail, if it is not a user account */
2097 if (Use
[0] != SidTypeUser
)
2099 ERR("Account is not a User!\n");
2100 ApiStatus
= NERR_UserNotFound
;
2104 /* Build the User SID from the Account Domain SID and the users RID */
2105 ApiStatus
= BuildSidFromSidAndRid(AccountDomainSid
,
2108 if (ApiStatus
!= NERR_Success
)
2110 ERR("BuildSidFromSidAndRid failed!\n");
2114 /* Get alias memberships in the Builtin Domain */
2115 Status
= SamGetAliasMembership(BuiltinDomainHandle
,
2118 &BuiltinMemberCount
,
2120 if (!NT_SUCCESS(Status
))
2122 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2123 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2127 if (BuiltinMemberCount
> 0)
2129 /* Get the Names of the builtin alias members */
2130 Status
= SamLookupIdsInDomain(BuiltinDomainHandle
,
2135 if (!NT_SUCCESS(Status
))
2137 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2138 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2143 /* Get alias memberships in the Account Domain */
2144 Status
= SamGetAliasMembership(AccountDomainHandle
,
2147 &AccountMemberCount
,
2149 if (!NT_SUCCESS(Status
))
2151 ERR("SamGetAliasMembership failed (Status %08lx)\n", Status
);
2152 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2156 if (AccountMemberCount
> 0)
2158 /* Get the Names of the builtin alias members */
2159 Status
= SamLookupIdsInDomain(AccountDomainHandle
,
2164 if (!NT_SUCCESS(Status
))
2166 ERR("SamLookupIdsInDomain failed (Status %08lx)\n", Status
);
2167 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2172 /* Calculate the required buffer size */
2175 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2177 if (BuiltinNames
[i
].Length
> 0)
2179 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2184 for (i
= 0; i
< AccountMemberCount
; i
++)
2186 if (BuiltinNames
[i
].Length
> 0)
2188 Size
+= (sizeof(LOCALGROUP_USERS_INFO_0
) + AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2195 ApiStatus
= NERR_Success
;
2199 /* Allocate buffer */
2200 ApiStatus
= NetApiBufferAllocate(Size
, (LPVOID
*)&Buffer
);
2201 if (ApiStatus
!= NERR_Success
)
2204 ZeroMemory(Buffer
, Size
);
2206 StrPtr
= (LPWSTR
)((INT_PTR
)Buffer
+ Count
* sizeof(LOCALGROUP_USERS_INFO_0
));
2208 /* Copy data to the allocated buffer */
2210 for (i
= 0; i
< BuiltinMemberCount
; i
++)
2212 if (BuiltinNames
[i
].Length
> 0)
2215 BuiltinNames
[i
].Buffer
,
2216 BuiltinNames
[i
].Length
);
2217 Buffer
[Index
].lgrui0_name
= StrPtr
;
2219 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ BuiltinNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2224 for (i
= 0; i
< AccountMemberCount
; i
++)
2226 if (AccountNames
[i
].Length
> 0)
2229 AccountNames
[i
].Buffer
,
2230 AccountNames
[i
].Length
);
2231 Buffer
[Index
].lgrui0_name
= StrPtr
;
2233 StrPtr
= (LPWSTR
)((INT_PTR
)StrPtr
+ AccountNames
[i
].Length
+ sizeof(UNICODE_NULL
));
2239 if (AccountNames
!= NULL
)
2240 SamFreeMemory(AccountNames
);
2242 if (BuiltinNames
!= NULL
)
2243 SamFreeMemory(BuiltinNames
);
2245 if (AccountAliases
!= NULL
)
2246 SamFreeMemory(AccountAliases
);
2248 if (BuiltinAliases
!= NULL
)
2249 SamFreeMemory(BuiltinAliases
);
2251 if (RelativeIds
!= NULL
)
2252 SamFreeMemory(RelativeIds
);
2257 if (UserSid
!= NULL
)
2258 NetApiBufferFree(UserSid
);
2260 if (AccountDomainSid
!= NULL
)
2261 RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid
);
2263 if (AccountDomainHandle
!= NULL
)
2264 SamCloseHandle(AccountDomainHandle
);
2266 if (BuiltinDomainHandle
!= NULL
)
2267 SamCloseHandle(BuiltinDomainHandle
);
2269 if (ServerHandle
!= NULL
)
2270 SamCloseHandle(ServerHandle
);
2272 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_MORE_DATA
)
2279 *entriesread
= Count
;
2280 *totalentries
= Count
;
2283 *bufptr
= (LPBYTE
)Buffer
;
2289 /******************************************************************************
2290 * NetUserSetGroups (NETAPI32.@)
2294 NetUserSetGroups(LPCWSTR servername
,
2300 FIXME("(%s %s %lu %p %lu)\n",
2301 debugstr_w(servername
), debugstr_w(username
), level
, buf
, num_entries
);
2302 return ERROR_ACCESS_DENIED
;
2306 /******************************************************************************
2307 * NetUserSetInfo (NETAPI32.@)
2311 NetUserSetInfo(LPCWSTR servername
,
2317 UNICODE_STRING ServerName
;
2318 UNICODE_STRING UserName
;
2319 SAM_HANDLE ServerHandle
= NULL
;
2320 SAM_HANDLE AccountDomainHandle
= NULL
;
2321 SAM_HANDLE UserHandle
= NULL
;
2322 NET_API_STATUS ApiStatus
= NERR_Success
;
2323 NTSTATUS Status
= STATUS_SUCCESS
;
2325 TRACE("(%s %s %lu %p %p)\n",
2326 debugstr_w(servername
), debugstr_w(username
), level
, buf
, parm_err
);
2328 if (parm_err
!= NULL
)
2329 *parm_err
= PARM_ERROR_NONE
;
2331 /* Check the info level */
2361 return ERROR_INVALID_LEVEL
;
2364 if (servername
!= NULL
)
2365 RtlInitUnicodeString(&ServerName
, servername
);
2367 RtlInitUnicodeString(&UserName
, username
);
2369 /* Connect to the SAM Server */
2370 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
2372 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
2374 if (!NT_SUCCESS(Status
))
2376 ERR("SamConnect failed (Status %08lx)\n", Status
);
2377 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2381 /* Open the Account Domain */
2382 Status
= OpenAccountDomain(ServerHandle
,
2383 (servername
!= NULL
) ? &ServerName
: NULL
,
2384 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
2385 &AccountDomainHandle
);
2386 if (!NT_SUCCESS(Status
))
2388 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
2389 ApiStatus
= NetpNtStatusToApiStatus(Status
);
2393 /* Open the User Account */
2394 ApiStatus
= OpenUserByName(AccountDomainHandle
,
2398 if (ApiStatus
!= NERR_Success
)
2400 ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus
);
2404 /* Set user information */
2405 ApiStatus
= SetUserInfo(UserHandle
,
2408 if (ApiStatus
!= NERR_Success
)
2410 ERR("SetUserInfo failed (Status %lu)\n", ApiStatus
);
2414 if (UserHandle
!= NULL
)
2415 SamCloseHandle(UserHandle
);
2417 if (AccountDomainHandle
!= NULL
)
2418 SamCloseHandle(AccountDomainHandle
);
2420 if (ServerHandle
!= NULL
)
2421 SamCloseHandle(ServerHandle
);