3 * Copyright (C) 2004 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS system libraries
22 * PURPOSE: SAM interface library
23 * FILE: lib/samlib/samlib.c
24 * PROGRAMER: Eric Kohl
29 #define NTOS_MODE_USER
30 #include <ndk/rtlfuncs.h>
34 #include <wine/debug.h>
36 WINE_DEFAULT_DEBUG_CHANNEL(samlib
);
40 SystemFunction006(LPCSTR password
,
45 SystemFunction007(PUNICODE_STRING string
,
50 SystemFunction012(const BYTE
*in
,
54 /* GLOBALS *******************************************************************/
57 /* FUNCTIONS *****************************************************************/
59 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
61 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
65 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
67 HeapFree(GetProcessHeap(), 0, ptr
);
72 PSAMPR_SERVER_NAME_bind(PSAMPR_SERVER_NAME pszSystemName
)
74 handle_t hBinding
= NULL
;
75 LPWSTR pszStringBinding
;
78 TRACE("PSAMPR_SERVER_NAME_bind() called\n");
80 status
= RpcStringBindingComposeW(NULL
,
88 TRACE("RpcStringBindingCompose returned 0x%x\n", status
);
92 /* Set the binding handle that will be used to bind to the server. */
93 status
= RpcBindingFromStringBindingW(pszStringBinding
,
97 TRACE("RpcBindingFromStringBinding returned 0x%x\n", status
);
100 status
= RpcStringFreeW(&pszStringBinding
);
103 // TRACE("RpcStringFree returned 0x%x\n", status);
111 PSAMPR_SERVER_NAME_unbind(PSAMPR_SERVER_NAME pszSystemName
,
116 TRACE("PSAMPR_SERVER_NAME_unbind() called\n");
118 status
= RpcBindingFree(&hBinding
);
121 TRACE("RpcBindingFree returned 0x%x\n", status
);
127 SampCheckPassword(IN SAMPR_HANDLE UserHandle
,
128 IN PUNICODE_STRING Password
)
130 USER_DOMAIN_PASSWORD_INFORMATION DomainPasswordInformation
;
131 LPWORD CharTypeBuffer
= NULL
;
132 ULONG PasswordLength
;
134 ULONG Upper
= 0, Lower
= 0, Digit
= 0, Punct
= 0, Alpha
= 0;
135 NTSTATUS Status
= STATUS_SUCCESS
;
137 TRACE("(%p %p)\n", UserHandle
, Password
);
139 /* Get the domain password information */
140 Status
= SamrGetUserDomainPasswordInformation(UserHandle
,
141 &DomainPasswordInformation
);
142 if (!NT_SUCCESS(Status
))
144 TRACE("SamrGetUserDomainPasswordInformation failed (Status 0x%08lx)\n", Status
);
148 PasswordLength
= (ULONG
)(Password
->Length
/ sizeof(WCHAR
));
150 /* Fail if the password is too short or too long */
151 if ((PasswordLength
< DomainPasswordInformation
.MinPasswordLength
) ||
152 (PasswordLength
> 256))
153 return STATUS_PASSWORD_RESTRICTION
;
155 /* Check the password complexity */
156 if (DomainPasswordInformation
.PasswordProperties
& DOMAIN_PASSWORD_COMPLEX
)
158 CharTypeBuffer
= midl_user_allocate(PasswordLength
* sizeof(WORD
));
159 if (CharTypeBuffer
== NULL
)
160 return STATUS_INSUFFICIENT_RESOURCES
;
162 GetStringTypeW(CT_CTYPE1
,
167 for (i
= 0; i
< PasswordLength
; i
++)
169 TRACE("%lu: %C %s %s %s %s\n", i
, Password
->Buffer
[i
],
170 (CharTypeBuffer
[i
] & C1_UPPER
) ? "C1_UPPER" : " ",
171 (CharTypeBuffer
[i
] & C1_LOWER
) ? "C1_LOWER" : " ",
172 (CharTypeBuffer
[i
] & C1_DIGIT
) ? "C1_DIGIT" : " ",
173 (CharTypeBuffer
[i
] & C1_PUNCT
) ? "C1_PUNCT" : " ",
174 (CharTypeBuffer
[i
] & C1_ALPHA
) ? "C1_ALPHA" : " ");
176 if (CharTypeBuffer
[i
] & C1_UPPER
)
179 if (CharTypeBuffer
[i
] & C1_LOWER
)
182 if (CharTypeBuffer
[i
] & C1_DIGIT
)
185 if (CharTypeBuffer
[i
] & C1_PUNCT
)
188 if ((CharTypeBuffer
[i
] & C1_ALPHA
) &&
189 !(CharTypeBuffer
[i
] & C1_UPPER
) &&
190 !(CharTypeBuffer
[i
] & C1_LOWER
))
194 TRACE("Upper: %lu\n", Upper
);
195 TRACE("Lower: %lu\n", Lower
);
196 TRACE("Digit: %lu\n", Digit
);
197 TRACE("Punct: %lu\n", Punct
);
198 TRACE("Alpha: %lu\n", Alpha
);
200 TRACE("Total: %lu\n", Upper
+ Lower
+ Digit
+ Punct
+ Alpha
);
201 if (Upper
+ Lower
+ Digit
+ Punct
+ Alpha
< 3)
202 Status
= STATUS_PASSWORD_RESTRICTION
;
205 if (CharTypeBuffer
!= NULL
)
206 midl_user_free(CharTypeBuffer
);
214 SamAddMemberToAlias(IN SAM_HANDLE AliasHandle
,
219 TRACE("SamAddMemberToAlias(%p %p)\n",
220 AliasHandle
, MemberId
);
224 Status
= SamrAddMemberToAlias((SAMPR_HANDLE
)AliasHandle
,
227 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
229 Status
= I_RpcMapWin32Status(RpcExceptionCode());
239 SamAddMemberToGroup(IN SAM_HANDLE GroupHandle
,
245 TRACE("SamAddMemberToGroup(%p %lu %lx)\n",
246 GroupHandle
, MemberId
, Attributes
);
250 Status
= SamrAddMemberToGroup((SAMPR_HANDLE
)GroupHandle
,
254 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
256 Status
= I_RpcMapWin32Status(RpcExceptionCode());
266 SamAddMultipleMembersToAlias(IN SAM_HANDLE AliasHandle
,
268 IN ULONG MemberCount
)
270 SAMPR_PSID_ARRAY Buffer
;
273 TRACE("SamAddMultipleMembersToAlias(%p %p %lu)\n",
274 AliasHandle
, MemberIds
, MemberCount
);
276 if (MemberIds
== NULL
)
277 return STATUS_INVALID_PARAMETER_2
;
279 Buffer
.Count
= MemberCount
;
280 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
284 Status
= SamrAddMultipleMembersToAlias((SAMPR_HANDLE
)AliasHandle
,
287 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
289 Status
= I_RpcMapWin32Status(RpcExceptionCode());
299 SamChangePasswordUser(IN SAM_HANDLE UserHandle
,
300 IN PUNICODE_STRING OldPassword
,
301 IN PUNICODE_STRING NewPassword
)
303 ENCRYPTED_NT_OWF_PASSWORD OldNtPassword
;
304 ENCRYPTED_NT_OWF_PASSWORD NewNtPassword
;
305 ENCRYPTED_LM_OWF_PASSWORD OldLmPassword
;
306 ENCRYPTED_LM_OWF_PASSWORD NewLmPassword
;
307 OEM_STRING LmPwdString
;
308 CHAR LmPwdBuffer
[15];
309 BOOLEAN OldLmPasswordPresent
= FALSE
;
310 BOOLEAN NewLmPasswordPresent
= FALSE
;
313 ENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
;
314 ENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
;
315 ENCRYPTED_LM_OWF_PASSWORD OldNtEncryptedWithNewNt
;
316 ENCRYPTED_LM_OWF_PASSWORD NewNtEncryptedWithOldNt
;
317 PENCRYPTED_LM_OWF_PASSWORD pOldLmEncryptedWithNewLm
= NULL
;
318 PENCRYPTED_LM_OWF_PASSWORD pNewLmEncryptedWithOldLm
= NULL
;
320 /* Calculate the NT hash for the old password */
321 Status
= SystemFunction007(OldPassword
,
322 (LPBYTE
)&OldNtPassword
);
323 if (!NT_SUCCESS(Status
))
325 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
329 /* Calculate the NT hash for the new password */
330 Status
= SystemFunction007(NewPassword
,
331 (LPBYTE
)&NewNtPassword
);
332 if (!NT_SUCCESS(Status
))
334 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
338 /* Calculate the LM password and hash for the old password */
339 LmPwdString
.Length
= 15;
340 LmPwdString
.MaximumLength
= 15;
341 LmPwdString
.Buffer
= LmPwdBuffer
;
342 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
344 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
347 if (NT_SUCCESS(Status
))
349 /* Calculate the LM hash value of the password */
350 Status
= SystemFunction006(LmPwdString
.Buffer
,
351 (LPSTR
)&OldLmPassword
);
352 if (NT_SUCCESS(Status
))
354 OldLmPasswordPresent
= TRUE
;
358 /* Calculate the LM password and hash for the new password */
359 LmPwdString
.Length
= 15;
360 LmPwdString
.MaximumLength
= 15;
361 LmPwdString
.Buffer
= LmPwdBuffer
;
362 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
364 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
367 if (NT_SUCCESS(Status
))
369 /* Calculate the LM hash value of the password */
370 Status
= SystemFunction006(LmPwdString
.Buffer
,
371 (LPSTR
)&NewLmPassword
);
372 if (NT_SUCCESS(Status
))
374 NewLmPasswordPresent
= TRUE
;
378 if (OldLmPasswordPresent
&& NewLmPasswordPresent
)
380 Status
= SystemFunction012((const BYTE
*)&OldLmPassword
,
381 (const BYTE
*)&NewLmPassword
,
382 (LPBYTE
)&OldLmEncryptedWithNewLm
);
383 if (!NT_SUCCESS(Status
))
385 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status
);
389 Status
= SystemFunction012((const BYTE
*)&NewLmPassword
,
390 (const BYTE
*)&OldLmPassword
,
391 (LPBYTE
)&NewLmEncryptedWithOldLm
);
392 if (!NT_SUCCESS(Status
))
394 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status
);
398 pOldLmEncryptedWithNewLm
= &OldLmEncryptedWithNewLm
;
399 pNewLmEncryptedWithOldLm
= &NewLmEncryptedWithOldLm
;
402 Status
= SystemFunction012((const BYTE
*)&OldNtPassword
,
403 (const BYTE
*)&NewNtPassword
,
404 (LPBYTE
)&OldNtEncryptedWithNewNt
);
405 if (!NT_SUCCESS(Status
))
407 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status
);
411 Status
= SystemFunction012((const BYTE
*)&NewNtPassword
,
412 (const BYTE
*)&OldNtPassword
,
413 (LPBYTE
)&NewNtEncryptedWithOldNt
);
414 if (!NT_SUCCESS(Status
))
416 TRACE("SystemFunction012 failed (Status 0x%08lx)\n", Status
);
422 Status
= SamrChangePasswordUser((SAMPR_HANDLE
)UserHandle
,
423 OldLmPasswordPresent
&& NewLmPasswordPresent
,
424 pOldLmEncryptedWithNewLm
,
425 pNewLmEncryptedWithOldLm
,
427 &OldNtEncryptedWithNewNt
,
428 &NewNtEncryptedWithOldNt
,
434 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
436 Status
= I_RpcMapWin32Status(RpcExceptionCode());
446 SamChangePasswordUser2(IN PUNICODE_STRING ServerName
,
447 IN PUNICODE_STRING UserName
,
448 IN PUNICODE_STRING OldPassword
,
449 IN PUNICODE_STRING NewPassword
)
452 return STATUS_NOT_IMPLEMENTED
;
458 SamChangePasswordUser3(IN PUNICODE_STRING ServerName
,
459 IN PUNICODE_STRING UserName
,
460 IN PUNICODE_STRING OldPassword
,
461 IN PUNICODE_STRING NewPassword
,
462 OUT PDOMAIN_PASSWORD_INFORMATION
*EffectivePasswordPolicy
,
463 OUT PUSER_PWD_CHANGE_FAILURE_INFORMATION
*PasswordChangeFailureInfo
)
466 return STATUS_NOT_IMPLEMENTED
;
472 SamCloseHandle(IN SAM_HANDLE SamHandle
)
476 TRACE("SamCloseHandle(%p)\n", SamHandle
);
480 Status
= SamrCloseHandle((SAMPR_HANDLE
*)&SamHandle
);
482 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
484 Status
= I_RpcMapWin32Status(RpcExceptionCode());
494 SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL
,
495 OUT PSAM_HANDLE ServerHandle
,
496 IN ACCESS_MASK DesiredAccess
,
497 IN POBJECT_ATTRIBUTES ObjectAttributes
)
501 TRACE("SamConnect(%p %p 0x%08x %p)\n",
502 ServerName
, ServerHandle
, DesiredAccess
, ObjectAttributes
);
506 Status
= SamrConnect((PSAMPR_SERVER_NAME
)ServerName
,
507 (SAMPR_HANDLE
*)ServerHandle
,
510 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
512 Status
= I_RpcMapWin32Status(RpcExceptionCode());
522 SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle
,
523 IN PUNICODE_STRING AccountName
,
524 IN ACCESS_MASK DesiredAccess
,
525 OUT PSAM_HANDLE AliasHandle
,
526 OUT PULONG RelativeId
)
530 TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
531 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
538 Status
= SamrCreateAliasInDomain((SAMPR_HANDLE
)DomainHandle
,
539 (PRPC_UNICODE_STRING
)AccountName
,
541 (SAMPR_HANDLE
*)AliasHandle
,
544 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
546 Status
= I_RpcMapWin32Status(RpcExceptionCode());
556 SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle
,
557 IN PUNICODE_STRING AccountName
,
558 IN ACCESS_MASK DesiredAccess
,
559 OUT PSAM_HANDLE GroupHandle
,
560 OUT PULONG RelativeId
)
564 TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
565 DomainHandle
, AccountName
, DesiredAccess
, GroupHandle
, RelativeId
);
572 Status
= SamrCreateGroupInDomain((SAMPR_HANDLE
)DomainHandle
,
573 (PRPC_UNICODE_STRING
)AccountName
,
575 (SAMPR_HANDLE
*)GroupHandle
,
578 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
580 Status
= I_RpcMapWin32Status(RpcExceptionCode());
590 SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle
,
591 IN PUNICODE_STRING AccountName
,
592 IN ULONG AccountType
,
593 IN ACCESS_MASK DesiredAccess
,
594 OUT PSAM_HANDLE UserHandle
,
595 OUT PULONG GrantedAccess
,
596 OUT PULONG RelativeId
)
600 TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
601 DomainHandle
, AccountName
, AccountType
, DesiredAccess
,
602 UserHandle
, GrantedAccess
, RelativeId
);
609 Status
= SamrCreateUser2InDomain((SAMPR_HANDLE
)DomainHandle
,
610 (PRPC_UNICODE_STRING
)AccountName
,
613 (SAMPR_HANDLE
*)UserHandle
,
618 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
620 Status
= I_RpcMapWin32Status(RpcExceptionCode());
630 SamCreateUserInDomain(IN SAM_HANDLE DomainHandle
,
631 IN PUNICODE_STRING AccountName
,
632 IN ACCESS_MASK DesiredAccess
,
633 OUT PSAM_HANDLE UserHandle
,
634 OUT PULONG RelativeId
)
638 TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
639 DomainHandle
, AccountName
, DesiredAccess
, UserHandle
, RelativeId
);
646 Status
= SamrCreateUserInDomain((SAMPR_HANDLE
)DomainHandle
,
647 (PRPC_UNICODE_STRING
)AccountName
,
649 (SAMPR_HANDLE
*)UserHandle
,
652 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
654 Status
= I_RpcMapWin32Status(RpcExceptionCode());
664 SamDeleteAlias(IN SAM_HANDLE AliasHandle
)
666 SAMPR_HANDLE LocalAliasHandle
;
669 TRACE("SamDeleteAlias(%p)\n", AliasHandle
);
671 LocalAliasHandle
= (SAMPR_HANDLE
)AliasHandle
;
673 if (LocalAliasHandle
== NULL
)
674 return STATUS_INVALID_HANDLE
;
678 Status
= SamrDeleteAlias(&LocalAliasHandle
);
680 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
682 Status
= I_RpcMapWin32Status(RpcExceptionCode());
692 SamDeleteGroup(IN SAM_HANDLE GroupHandle
)
694 SAMPR_HANDLE LocalGroupHandle
;
697 TRACE("SamDeleteGroup(%p)\n", GroupHandle
);
699 LocalGroupHandle
= (SAMPR_HANDLE
)GroupHandle
;
701 if (LocalGroupHandle
== NULL
)
702 return STATUS_INVALID_HANDLE
;
706 Status
= SamrDeleteGroup(&LocalGroupHandle
);
708 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
710 Status
= I_RpcMapWin32Status(RpcExceptionCode());
720 SamDeleteUser(IN SAM_HANDLE UserHandle
)
722 SAMPR_HANDLE LocalUserHandle
;
725 TRACE("SamDeleteUser(%p)\n", UserHandle
);
727 LocalUserHandle
= (SAMPR_HANDLE
)UserHandle
;
729 if (LocalUserHandle
== NULL
)
730 return STATUS_INVALID_HANDLE
;
734 Status
= SamrDeleteUser(&LocalUserHandle
);
736 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
738 Status
= I_RpcMapWin32Status(RpcExceptionCode());
748 SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle
,
749 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
751 IN ULONG PreferedMaximumLength
,
752 OUT PULONG CountReturned
)
754 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
757 TRACE("SamEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
758 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
761 if ((EnumerationContext
== NULL
) ||
763 (CountReturned
== NULL
))
764 return STATUS_INVALID_PARAMETER
;
770 Status
= SamrEnumerateAliasesInDomain((SAMPR_HANDLE
)DomainHandle
,
773 PreferedMaximumLength
,
776 if (EnumBuffer
!= NULL
)
778 if (EnumBuffer
->Buffer
!= NULL
)
780 *Buffer
= EnumBuffer
->Buffer
;
783 midl_user_free(EnumBuffer
);
786 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
788 Status
= I_RpcMapWin32Status(RpcExceptionCode());
798 SamEnumerateDomainsInSamServer(IN SAM_HANDLE ServerHandle
,
799 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
801 IN ULONG PreferedMaximumLength
,
802 OUT PULONG CountReturned
)
804 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
807 TRACE("SamEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
808 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
811 if ((EnumerationContext
== NULL
) ||
813 (CountReturned
== NULL
))
814 return STATUS_INVALID_PARAMETER
;
820 Status
= SamrEnumerateDomainsInSamServer((SAMPR_HANDLE
)ServerHandle
,
823 PreferedMaximumLength
,
826 if (EnumBuffer
!= NULL
)
828 if (EnumBuffer
->Buffer
!= NULL
)
830 *Buffer
= EnumBuffer
->Buffer
;
833 midl_user_free(EnumBuffer
);
836 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
838 Status
= I_RpcMapWin32Status(RpcExceptionCode());
848 SamEnumerateGroupsInDomain(IN SAM_HANDLE DomainHandle
,
849 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
851 IN ULONG PreferedMaximumLength
,
852 OUT PULONG CountReturned
)
854 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
857 TRACE("SamEnumerateGroupsInDomain(%p %p %p %lu %p)\n",
858 DomainHandle
, EnumerationContext
, Buffer
,
859 PreferedMaximumLength
, CountReturned
);
861 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
862 return STATUS_INVALID_PARAMETER
;
868 Status
= SamrEnumerateGroupsInDomain((SAMPR_HANDLE
)DomainHandle
,
871 PreferedMaximumLength
,
873 if (EnumBuffer
!= NULL
)
875 if (EnumBuffer
->Buffer
!= NULL
)
876 *Buffer
= EnumBuffer
->Buffer
;
878 midl_user_free(EnumBuffer
);
881 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
883 Status
= I_RpcMapWin32Status(RpcExceptionCode());
893 SamEnumerateUsersInDomain(IN SAM_HANDLE DomainHandle
,
894 IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext
,
895 IN ULONG UserAccountControl
,
897 IN ULONG PreferedMaximumLength
,
898 OUT PULONG CountReturned
)
900 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
903 TRACE("SamEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
904 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
905 PreferedMaximumLength
, CountReturned
);
907 if (EnumerationContext
== NULL
|| Buffer
== NULL
|| CountReturned
== NULL
)
908 return STATUS_INVALID_PARAMETER
;
914 Status
= SamrEnumerateUsersInDomain((SAMPR_HANDLE
)DomainHandle
,
918 PreferedMaximumLength
,
920 if (EnumBuffer
!= NULL
)
922 if (EnumBuffer
->Buffer
!= NULL
)
924 *Buffer
= EnumBuffer
->Buffer
;
927 midl_user_free(EnumBuffer
);
931 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
933 Status
= I_RpcMapWin32Status(RpcExceptionCode());
943 SamFreeMemory(IN PVOID Buffer
)
946 midl_user_free(Buffer
);
948 return STATUS_SUCCESS
;
954 SamGetAliasMembership(IN SAM_HANDLE DomainHandle
,
955 IN ULONG PassedCount
,
957 OUT PULONG MembershipCount
,
960 SAMPR_PSID_ARRAY SidArray
;
961 SAMPR_ULONG_ARRAY Membership
;
964 TRACE("SamAliasMembership(%p %lu %p %p %p)\n",
965 DomainHandle
, PassedCount
, Sids
, MembershipCount
, Aliases
);
968 MembershipCount
== NULL
||
970 return STATUS_INVALID_PARAMETER
;
972 Membership
.Element
= NULL
;
976 SidArray
.Count
= PassedCount
;
977 SidArray
.Sids
= (PSAMPR_SID_INFORMATION
)Sids
;
979 Status
= SamrGetAliasMembership((SAMPR_HANDLE
)DomainHandle
,
982 if (NT_SUCCESS(Status
))
984 *MembershipCount
= Membership
.Count
;
985 *Aliases
= Membership
.Element
;
989 if (Membership
.Element
!= NULL
)
990 midl_user_free(Membership
.Element
);
993 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
995 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1005 SamGetCompatibilityMode(IN SAM_HANDLE ObjectHandle
,
1008 TRACE("(%p %p)\n", ObjectHandle
, Mode
);
1011 return STATUS_INVALID_PARAMETER
;
1013 *Mode
= SAM_SID_COMPATIBILITY_ALL
;
1015 return STATUS_SUCCESS
;
1021 SamGetDisplayEnumerationIndex(IN SAM_HANDLE DomainHandle
,
1022 IN DOMAIN_DISPLAY_INFORMATION DisplayInformation
,
1023 IN PUNICODE_STRING Prefix
,
1028 TRACE("(%p %lu %wZ %p)\n",
1029 DomainHandle
, DisplayInformation
, Prefix
, Index
);
1031 if ((Prefix
== NULL
) ||
1033 return STATUS_INVALID_PARAMETER
;
1037 Status
= SamrGetDisplayEnumerationIndex2((SAMPR_HANDLE
)DomainHandle
,
1039 (PRPC_UNICODE_STRING
)Prefix
,
1042 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1044 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1054 SamGetGroupsForUser(IN SAM_HANDLE UserHandle
,
1055 OUT PGROUP_MEMBERSHIP
*Groups
,
1056 OUT PULONG MembershipCount
)
1058 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
1061 TRACE("SamGetGroupsForUser(%p %p %p)\n",
1062 UserHandle
, Groups
, MembershipCount
);
1066 Status
= SamrGetGroupsForUser((SAMPR_HANDLE
)UserHandle
,
1068 if (NT_SUCCESS(Status
))
1070 *Groups
= GroupsBuffer
->Groups
;
1071 *MembershipCount
= GroupsBuffer
->MembershipCount
;
1073 MIDL_user_free(GroupsBuffer
);
1077 if (GroupsBuffer
!= NULL
)
1079 if (GroupsBuffer
->Groups
!= NULL
)
1080 MIDL_user_free(GroupsBuffer
->Groups
);
1082 MIDL_user_free(GroupsBuffer
);
1086 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1088 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1098 SamGetMembersInAlias(IN SAM_HANDLE AliasHandle
,
1099 OUT PSID
**MemberIds
,
1100 OUT PULONG MemberCount
)
1102 SAMPR_PSID_ARRAY_OUT SidArray
;
1105 TRACE("SamGetMembersInAlias(%p %p %p)\n",
1106 AliasHandle
, MemberIds
, MemberCount
);
1108 if ((MemberIds
== NULL
) ||
1109 (MemberCount
== NULL
))
1110 return STATUS_INVALID_PARAMETER
;
1115 SidArray
.Sids
= NULL
;
1119 Status
= SamrGetMembersInAlias((SAMPR_HANDLE
)AliasHandle
,
1121 if (NT_SUCCESS(Status
))
1123 *MemberCount
= SidArray
.Count
;
1124 *MemberIds
= (PSID
*)SidArray
.Sids
;
1128 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1130 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1140 SamGetMembersInGroup(IN SAM_HANDLE GroupHandle
,
1141 OUT PULONG
*MemberIds
,
1142 OUT PULONG
*Attributes
,
1143 OUT PULONG MemberCount
)
1145 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
1148 TRACE("SamGetMembersInGroup(%p %p %p %p)\n",
1149 GroupHandle
, MemberIds
, Attributes
, MemberCount
);
1153 Status
= SamrGetMembersInGroup((SAMPR_HANDLE
)GroupHandle
,
1155 if (NT_SUCCESS(Status
))
1157 *MemberIds
= MembersBuffer
->Members
;
1158 *Attributes
= MembersBuffer
->Attributes
;
1159 *MemberCount
= MembersBuffer
->MemberCount
;
1161 MIDL_user_free(MembersBuffer
);
1165 if (MembersBuffer
!= NULL
)
1167 if (MembersBuffer
->Members
!= NULL
)
1168 MIDL_user_free(MembersBuffer
->Members
);
1170 if (MembersBuffer
->Attributes
!= NULL
)
1171 MIDL_user_free(MembersBuffer
->Attributes
);
1173 MIDL_user_free(MembersBuffer
);
1177 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1179 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1189 SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle
,
1190 IN PUNICODE_STRING Name
,
1195 TRACE("SamLookupDomainInSamServer(%p %p %p)\n",
1196 ServerHandle
, Name
, DomainId
);
1200 Status
= SamrLookupDomainInSamServer((SAMPR_HANDLE
)ServerHandle
,
1201 (PRPC_UNICODE_STRING
)Name
,
1202 (PRPC_SID
*)DomainId
);
1204 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1206 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1216 SamLookupIdsInDomain(IN SAM_HANDLE DomainHandle
,
1218 IN PULONG RelativeIds
,
1219 OUT PUNICODE_STRING
*Names
,
1220 OUT PSID_NAME_USE
*Use OPTIONAL
)
1222 SAMPR_RETURNED_USTRING_ARRAY NamesBuffer
= {0, NULL
};
1223 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1227 TRACE("SamLookupIdsInDomain(%p %lu %p %p %p)\n",
1228 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
1237 Status
= SamrLookupIdsInDomain((SAMPR_HANDLE
)DomainHandle
,
1243 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1245 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1249 if (NT_SUCCESS(Status
))
1251 *Names
= midl_user_allocate(Count
* sizeof(RPC_UNICODE_STRING
));
1254 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1258 for (i
= 0; i
< Count
; i
++)
1260 (*Names
)[i
].Buffer
= midl_user_allocate(NamesBuffer
.Element
[i
].MaximumLength
);
1261 if ((*Names
)[i
].Buffer
== NULL
)
1263 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1268 for (i
= 0; i
< Count
; i
++)
1270 (*Names
)[i
].Length
= NamesBuffer
.Element
[i
].Length
;
1271 (*Names
)[i
].MaximumLength
= NamesBuffer
.Element
[i
].MaximumLength
;
1273 RtlCopyMemory((*Names
)[i
].Buffer
,
1274 NamesBuffer
.Element
[i
].Buffer
,
1275 NamesBuffer
.Element
[i
].Length
);
1280 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1283 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1289 Count
* sizeof(SID_NAME_USE
));
1294 if (!NT_SUCCESS(Status
))
1298 for (i
= 0; i
< Count
; i
++)
1300 if ((*Names
)[i
].Buffer
!= NULL
)
1301 midl_user_free((*Names
)[i
].Buffer
);
1304 midl_user_free(*Names
);
1307 if (Use
!= NULL
&& *Use
!= NULL
)
1308 midl_user_free(*Use
);
1311 if (NamesBuffer
.Element
!= NULL
)
1313 for (i
= 0; i
< NamesBuffer
.Count
; i
++)
1315 if (NamesBuffer
.Element
[i
].Buffer
!= NULL
)
1316 midl_user_free(NamesBuffer
.Element
[i
].Buffer
);
1319 midl_user_free(NamesBuffer
.Element
);
1322 if (UseBuffer
.Element
!= NULL
)
1323 midl_user_free(UseBuffer
.Element
);
1331 SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle
,
1333 IN PUNICODE_STRING Names
,
1334 OUT PULONG
*RelativeIds
,
1335 OUT PSID_NAME_USE
*Use
)
1337 SAMPR_ULONG_ARRAY RidBuffer
= {0, NULL
};
1338 SAMPR_ULONG_ARRAY UseBuffer
= {0, NULL
};
1341 TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
1342 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
1344 *RelativeIds
= NULL
;
1349 Status
= SamrLookupNamesInDomain((SAMPR_HANDLE
)DomainHandle
,
1351 (PRPC_UNICODE_STRING
)Names
,
1355 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1357 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1361 if (NT_SUCCESS(Status
))
1363 *RelativeIds
= midl_user_allocate(Count
* sizeof(ULONG
));
1364 if (*RelativeIds
== NULL
)
1366 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1370 *Use
= midl_user_allocate(Count
* sizeof(SID_NAME_USE
));
1373 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1377 RtlCopyMemory(*RelativeIds
,
1379 Count
* sizeof(ULONG
));
1383 Count
* sizeof(SID_NAME_USE
));
1387 if (!NT_SUCCESS(Status
))
1389 if (*RelativeIds
!= NULL
)
1390 midl_user_free(*RelativeIds
);
1393 midl_user_free(*Use
);
1396 if (RidBuffer
.Element
!= NULL
)
1397 midl_user_free(RidBuffer
.Element
);
1399 if (UseBuffer
.Element
!= NULL
)
1400 midl_user_free(UseBuffer
.Element
);
1408 SamOpenAlias(IN SAM_HANDLE DomainHandle
,
1409 IN ACCESS_MASK DesiredAccess
,
1411 OUT PSAM_HANDLE AliasHandle
)
1415 TRACE("SamOpenAlias(%p 0x%08x %lx %p)\n",
1416 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
1420 Status
= SamrOpenAlias((SAMPR_HANDLE
)DomainHandle
,
1423 (SAMPR_HANDLE
*)AliasHandle
);
1425 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1427 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1437 SamOpenDomain(IN SAM_HANDLE ServerHandle
,
1438 IN ACCESS_MASK DesiredAccess
,
1440 OUT PSAM_HANDLE DomainHandle
)
1444 TRACE("SamOpenDomain(%p 0x%08x %p %p)\n",
1445 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
1449 Status
= SamrOpenDomain((SAMPR_HANDLE
)ServerHandle
,
1452 (SAMPR_HANDLE
*)DomainHandle
);
1454 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1456 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1466 SamOpenGroup(IN SAM_HANDLE DomainHandle
,
1467 IN ACCESS_MASK DesiredAccess
,
1469 OUT PSAM_HANDLE GroupHandle
)
1473 TRACE("SamOpenGroup(%p 0x%08x %p %p)\n",
1474 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
1478 Status
= SamrOpenGroup((SAMPR_HANDLE
)DomainHandle
,
1481 (SAMPR_HANDLE
*)GroupHandle
);
1483 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1485 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1495 SamOpenUser(IN SAM_HANDLE DomainHandle
,
1496 IN ACCESS_MASK DesiredAccess
,
1498 OUT PSAM_HANDLE UserHandle
)
1502 TRACE("SamOpenUser(%p 0x%08x %lx %p)\n",
1503 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
1507 Status
= SamrOpenUser((SAMPR_HANDLE
)DomainHandle
,
1510 (SAMPR_HANDLE
*)UserHandle
);
1512 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1514 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1524 SamQueryDisplayInformation(IN SAM_HANDLE DomainHandle
,
1525 IN DOMAIN_DISPLAY_INFORMATION DisplayInformation
,
1527 IN ULONG EntryCount
,
1528 IN ULONG PreferredMaximumLength
,
1529 OUT PULONG TotalAvailable
,
1530 OUT PULONG TotalReturned
,
1531 OUT PULONG ReturnedEntryCount
,
1532 OUT PVOID
*SortedBuffer
)
1534 SAMPR_DISPLAY_INFO_BUFFER LocalBuffer
;
1537 TRACE("(%p %lu %lu %lu %lu %p %p %p %p)\n",
1538 DomainHandle
, DisplayInformation
, Index
, EntryCount
,
1539 PreferredMaximumLength
, TotalAvailable
, TotalReturned
,
1540 ReturnedEntryCount
, SortedBuffer
);
1542 if ((TotalAvailable
== NULL
) ||
1543 (TotalReturned
== NULL
) ||
1544 (ReturnedEntryCount
== NULL
) ||
1545 (SortedBuffer
== NULL
))
1546 return STATUS_INVALID_PARAMETER
;
1550 Status
= SamrQueryDisplayInformation3((SAMPR_HANDLE
)DomainHandle
,
1554 PreferredMaximumLength
,
1558 if (NT_SUCCESS(Status
))
1560 switch (DisplayInformation
)
1562 case DomainDisplayUser
:
1563 *ReturnedEntryCount
= LocalBuffer
.UserInformation
.EntriesRead
;
1564 *SortedBuffer
= LocalBuffer
.UserInformation
.Buffer
;
1567 case DomainDisplayMachine
:
1568 *ReturnedEntryCount
= LocalBuffer
.MachineInformation
.EntriesRead
;
1569 *SortedBuffer
= LocalBuffer
.MachineInformation
.Buffer
;
1572 case DomainDisplayGroup
:
1573 *ReturnedEntryCount
= LocalBuffer
.GroupInformation
.EntriesRead
;
1574 *SortedBuffer
= LocalBuffer
.GroupInformation
.Buffer
;
1577 case DomainDisplayOemUser
:
1578 *ReturnedEntryCount
= LocalBuffer
.OemUserInformation
.EntriesRead
;
1579 *SortedBuffer
= LocalBuffer
.OemUserInformation
.Buffer
;
1582 case DomainDisplayOemGroup
:
1583 *ReturnedEntryCount
= LocalBuffer
.OemGroupInformation
.EntriesRead
;
1584 *SortedBuffer
= LocalBuffer
.OemGroupInformation
.Buffer
;
1587 case DomainDisplayServer
:
1594 *ReturnedEntryCount
= 0;
1595 *SortedBuffer
= NULL
;
1598 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1600 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1610 SamQueryInformationAlias(IN SAM_HANDLE AliasHandle
,
1611 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1616 TRACE("SamQueryInformationAlias(%p %lu %p)\n",
1617 AliasHandle
, AliasInformationClass
, Buffer
);
1621 Status
= SamrQueryInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1622 AliasInformationClass
,
1623 (PSAMPR_ALIAS_INFO_BUFFER
*)Buffer
);
1625 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1627 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1637 SamQueryInformationDomain(IN SAM_HANDLE DomainHandle
,
1638 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1643 TRACE("SamQueryInformationDomain(%p %lu %p)\n",
1644 DomainHandle
, DomainInformationClass
, Buffer
);
1648 Status
= SamrQueryInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1649 DomainInformationClass
,
1650 (PSAMPR_DOMAIN_INFO_BUFFER
*)Buffer
);
1652 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1654 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1664 SamQueryInformationGroup(IN SAM_HANDLE GroupHandle
,
1665 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1670 TRACE("SamQueryInformationGroup(%p %lu %p)\n",
1671 GroupHandle
, GroupInformationClass
, Buffer
);
1675 Status
= SamrQueryInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1676 GroupInformationClass
,
1677 (PSAMPR_GROUP_INFO_BUFFER
*)Buffer
);
1679 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1681 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1691 SamQueryInformationUser(IN SAM_HANDLE UserHandle
,
1692 IN USER_INFORMATION_CLASS UserInformationClass
,
1697 TRACE("SamQueryInformationUser(%p %lu %p)\n",
1698 UserHandle
, UserInformationClass
, Buffer
);
1702 Status
= SamrQueryInformationUser((SAMPR_HANDLE
)UserHandle
,
1703 UserInformationClass
,
1704 (PSAMPR_USER_INFO_BUFFER
*)Buffer
);
1706 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1708 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1718 SamQuerySecurityObject(IN SAM_HANDLE ObjectHandle
,
1719 IN SECURITY_INFORMATION SecurityInformation
,
1720 OUT PSECURITY_DESCRIPTOR
*SecurityDescriptor
)
1722 PSAMPR_SR_SECURITY_DESCRIPTOR SamSecurityDescriptor
= NULL
;
1725 TRACE("SamQuerySecurityObject(%p %lu %p)\n",
1726 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
1728 *SecurityDescriptor
= NULL
;
1732 Status
= SamrQuerySecurityObject((SAMPR_HANDLE
)ObjectHandle
,
1733 SecurityInformation
,
1734 &SamSecurityDescriptor
);
1736 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1738 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1742 TRACE("SamSecurityDescriptor: %p\n", SamSecurityDescriptor
);
1744 if (SamSecurityDescriptor
!= NULL
)
1746 TRACE("SamSecurityDescriptor->Length: %lu\n", SamSecurityDescriptor
->Length
);
1747 TRACE("SamSecurityDescriptor->SecurityDescriptor: %p\n", SamSecurityDescriptor
->SecurityDescriptor
);
1749 *SecurityDescriptor
= SamSecurityDescriptor
->SecurityDescriptor
;
1751 midl_user_free(SamSecurityDescriptor
);
1760 SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle
,
1765 TRACE("SamRemoveMemberFromAlias(%p %ul)\n",
1766 AliasHandle
, MemberId
);
1770 Status
= SamrRemoveMemberFromAlias((SAMPR_HANDLE
)AliasHandle
,
1773 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1775 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1785 SamRemoveMemberFromForeignDomain(IN SAM_HANDLE DomainHandle
,
1790 TRACE("SamRemoveMemberFromForeignDomain(%p %ul)\n",
1791 DomainHandle
, MemberId
);
1795 Status
= SamrRemoveMemberFromForeignDomain((SAMPR_HANDLE
)DomainHandle
,
1798 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1800 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1810 SamRemoveMemberFromGroup(IN SAM_HANDLE GroupHandle
,
1815 TRACE("SamRemoveMemberFromGroup(%p %ul)\n",
1816 GroupHandle
, MemberId
);
1820 Status
= SamrRemoveMemberFromGroup((SAMPR_HANDLE
)GroupHandle
,
1823 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1825 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1835 SamRemoveMultipleMembersFromAlias(IN SAM_HANDLE AliasHandle
,
1837 IN ULONG MemberCount
)
1839 SAMPR_PSID_ARRAY Buffer
;
1842 TRACE("SamRemoveMultipleMembersFromAlias(%p %p %lu)\n",
1843 AliasHandle
, MemberIds
, MemberCount
);
1845 if (MemberIds
== NULL
)
1846 return STATUS_INVALID_PARAMETER_2
;
1848 Buffer
.Count
= MemberCount
;
1849 Buffer
.Sids
= (PSAMPR_SID_INFORMATION
)MemberIds
;
1853 Status
= SamrRemoveMultipleMembersFromAlias((SAMPR_HANDLE
)AliasHandle
,
1856 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1858 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1868 SamRidToSid(IN SAM_HANDLE ObjectHandle
,
1873 return STATUS_NOT_IMPLEMENTED
;
1879 SamSetInformationAlias(IN SAM_HANDLE AliasHandle
,
1880 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1885 TRACE("SamSetInformationAlias(%p %lu %p)\n",
1886 AliasHandle
, AliasInformationClass
, Buffer
);
1890 Status
= SamrSetInformationAlias((SAMPR_HANDLE
)AliasHandle
,
1891 AliasInformationClass
,
1894 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1896 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1906 SamSetInformationDomain(IN SAM_HANDLE DomainHandle
,
1907 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1912 TRACE("SamSetInformationDomain(%p %lu %p)\n",
1913 DomainHandle
, DomainInformationClass
, Buffer
);
1917 Status
= SamrSetInformationDomain((SAMPR_HANDLE
)DomainHandle
,
1918 DomainInformationClass
,
1921 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1923 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1933 SamSetInformationGroup(IN SAM_HANDLE GroupHandle
,
1934 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1939 TRACE("SamSetInformationGroup(%p %lu %p)\n",
1940 GroupHandle
, GroupInformationClass
, Buffer
);
1944 Status
= SamrSetInformationGroup((SAMPR_HANDLE
)GroupHandle
,
1945 GroupInformationClass
,
1948 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
1950 Status
= I_RpcMapWin32Status(RpcExceptionCode());
1960 SamSetInformationUser(IN SAM_HANDLE UserHandle
,
1961 IN USER_INFORMATION_CLASS UserInformationClass
,
1964 PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordBuffer
;
1965 SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer
;
1966 USER_ALL_INFORMATION InternalAllBuffer
;
1967 OEM_STRING LmPwdString
;
1968 CHAR LmPwdBuffer
[15];
1971 TRACE("SamSetInformationUser(%p %lu %p)\n",
1972 UserHandle
, UserInformationClass
, Buffer
);
1974 if (UserInformationClass
== UserSetPasswordInformation
)
1976 PasswordBuffer
= (PSAMPR_USER_SET_PASSWORD_INFORMATION
)Buffer
;
1978 Status
= SampCheckPassword(UserHandle
,
1979 (PUNICODE_STRING
)&PasswordBuffer
->Password
);
1980 if (!NT_SUCCESS(Status
))
1982 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status
);
1986 /* Calculate the NT hash value of the passord */
1987 Status
= SystemFunction007((PUNICODE_STRING
)&PasswordBuffer
->Password
,
1988 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
1989 if (!NT_SUCCESS(Status
))
1991 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
1995 Internal1Buffer
.NtPasswordPresent
= TRUE
;
1996 Internal1Buffer
.LmPasswordPresent
= FALSE
;
1998 /* Build the LM password */
1999 LmPwdString
.Length
= 15;
2000 LmPwdString
.MaximumLength
= 15;
2001 LmPwdString
.Buffer
= LmPwdBuffer
;
2002 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
2004 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
2005 (PUNICODE_STRING
)&PasswordBuffer
->Password
,
2007 if (NT_SUCCESS(Status
))
2009 /* Calculate the LM hash value of the password */
2010 Status
= SystemFunction006(LmPwdString
.Buffer
,
2011 (LPSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
);
2012 if (NT_SUCCESS(Status
))
2013 Internal1Buffer
.LmPasswordPresent
= TRUE
;
2016 Internal1Buffer
.PasswordExpired
= PasswordBuffer
->PasswordExpired
;
2020 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
2021 UserInternal1Information
,
2022 (PVOID
)&Internal1Buffer
);
2024 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2026 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2030 if (!NT_SUCCESS(Status
))
2032 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
2037 else if (UserInformationClass
== UserAllInformation
)
2039 RtlCopyMemory(&InternalAllBuffer
,
2041 sizeof(USER_ALL_INFORMATION
));
2043 if (InternalAllBuffer
.WhichFields
& (USER_ALL_LMPASSWORDPRESENT
| USER_ALL_NTPASSWORDPRESENT
))
2045 if (InternalAllBuffer
.WhichFields
& USER_ALL_OWFPASSWORD
)
2047 /* Check NT password hash */
2048 if (InternalAllBuffer
.WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
2050 if (InternalAllBuffer
.NtPassword
.Length
!= sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
2051 return STATUS_INVALID_PARAMETER
;
2054 /* Check LM password hash */
2055 if (InternalAllBuffer
.WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
2057 if (InternalAllBuffer
.LmPassword
.Length
!= sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
2058 return STATUS_INVALID_PARAMETER
;
2064 * Only allow the NT password to be set.
2065 * The LM password will be created here.
2067 if (InternalAllBuffer
.WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
2069 TRACE("Do not try to set a clear text LM password!\n");
2070 return STATUS_INVALID_PARAMETER
;
2073 if (InternalAllBuffer
.WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
2075 Status
= SampCheckPassword(UserHandle
,
2076 &InternalAllBuffer
.NtPassword
);
2077 if (!NT_SUCCESS(Status
))
2079 TRACE("SampCheckPassword failed (Status 0x%08lx)\n", Status
);
2083 /* Calculate the NT password hash */
2084 Status
= SystemFunction007((PUNICODE_STRING
)&InternalAllBuffer
.NtPassword
,
2085 (LPBYTE
)&Internal1Buffer
.EncryptedNtOwfPassword
);
2086 if (!NT_SUCCESS(Status
))
2088 TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status
);
2092 InternalAllBuffer
.NtPasswordPresent
= TRUE
;
2093 InternalAllBuffer
.LmPasswordPresent
= FALSE
;
2095 InternalAllBuffer
.NtPassword
.Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
2096 InternalAllBuffer
.NtPassword
.MaximumLength
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
2097 InternalAllBuffer
.NtPassword
.Buffer
= (LPWSTR
)&Internal1Buffer
.EncryptedNtOwfPassword
;
2099 /* Build the LM password */
2100 LmPwdString
.Length
= 15;
2101 LmPwdString
.MaximumLength
= 15;
2102 LmPwdString
.Buffer
= LmPwdBuffer
;
2103 ZeroMemory(LmPwdString
.Buffer
, LmPwdString
.MaximumLength
);
2105 Status
= RtlUpcaseUnicodeStringToOemString(&LmPwdString
,
2106 (PUNICODE_STRING
)&InternalAllBuffer
.NtPassword
,
2108 if (NT_SUCCESS(Status
))
2110 /* Calculate the LM password hash */
2111 Status
= SystemFunction006(LmPwdString
.Buffer
,
2112 (LPSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
);
2113 if (NT_SUCCESS(Status
))
2115 InternalAllBuffer
.WhichFields
|= USER_ALL_LMPASSWORDPRESENT
;
2116 InternalAllBuffer
.LmPasswordPresent
= TRUE
;
2118 InternalAllBuffer
.LmPassword
.Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
2119 InternalAllBuffer
.LmPassword
.MaximumLength
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
2120 InternalAllBuffer
.LmPassword
.Buffer
= (LPWSTR
)&Internal1Buffer
.EncryptedLmOwfPassword
;
2129 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
2131 (PVOID
)&InternalAllBuffer
);
2133 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2135 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2139 if (!NT_SUCCESS(Status
))
2141 TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status
);
2149 Status
= SamrSetInformationUser((SAMPR_HANDLE
)UserHandle
,
2150 UserInformationClass
,
2153 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2155 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2165 SamSetMemberAttributesOfGroup(IN SAM_HANDLE GroupHandle
,
2167 IN ULONG Attributes
)
2171 TRACE("SamSetMemberAttributesOfGroup(%p %lu 0x%lx)\n",
2172 GroupHandle
, MemberId
, Attributes
);
2176 Status
= SamrSetMemberAttributesOfGroup((SAMPR_HANDLE
)GroupHandle
,
2180 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2182 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2192 SamSetSecurityObject(IN SAM_HANDLE ObjectHandle
,
2193 IN SECURITY_INFORMATION SecurityInformation
,
2194 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
2196 SAMPR_SR_SECURITY_DESCRIPTOR DescriptorToPass
;
2200 TRACE("SamSetSecurityObject(%p %lu %p)\n",
2201 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
2203 /* Retrieve the length of the relative security descriptor */
2205 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
2208 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
2209 return STATUS_INVALID_PARAMETER
;
2212 /* Allocate a buffer for the security descriptor */
2213 DescriptorToPass
.Length
= Length
;
2214 DescriptorToPass
.SecurityDescriptor
= MIDL_user_allocate(Length
);
2215 if (DescriptorToPass
.SecurityDescriptor
== NULL
)
2216 return STATUS_INSUFFICIENT_RESOURCES
;
2218 /* Convert the given security descriptor to a relative security descriptor */
2219 Status
= RtlMakeSelfRelativeSD(SecurityDescriptor
,
2220 (PSECURITY_DESCRIPTOR
)DescriptorToPass
.SecurityDescriptor
,
2222 if (!NT_SUCCESS(Status
))
2227 Status
= SamrSetSecurityObject((SAMPR_HANDLE
)ObjectHandle
,
2228 SecurityInformation
,
2231 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2233 Status
= I_RpcMapWin32Status(RpcExceptionCode());
2238 if (DescriptorToPass
.SecurityDescriptor
!= NULL
)
2239 MIDL_user_free(DescriptorToPass
.SecurityDescriptor
);
2247 SamShutdownSamServer(IN SAM_HANDLE ServerHandle
)
2251 TRACE("(%p)\n", ServerHandle
);
2255 Status
= SamrShutdownSamServer((SAMPR_HANDLE
)ServerHandle
);
2257 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
2259 Status
= I_RpcMapWin32Status(RpcExceptionCode());