2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Security Account Manager (SAM) Server
4 * FILE: reactos/dll/win32/samsrv/samrpc.c
5 * PURPOSE: RPC interface functions
7 * PROGRAMMERS: Eric Kohl
10 /* INCLUDES ****************************************************************/
14 WINE_DEFAULT_DEBUG_CHANNEL(samsrv
);
16 /* GLOBALS ********************************************************************/
18 static SID_IDENTIFIER_AUTHORITY NtSidAuthority
= {SECURITY_NT_AUTHORITY
};
20 /* FUNCTIONS ***************************************************************/
23 SampStartRpcServer(VOID
)
27 TRACE("SampStartRpcServer() called\n");
29 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
33 if (Status
!= RPC_S_OK
)
35 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
39 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
42 if (Status
!= RPC_S_OK
)
44 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
48 Status
= RpcServerListen(1, 20, TRUE
);
49 if (Status
!= RPC_S_OK
)
51 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
55 TRACE("SampStartRpcServer() done\n");
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
);
70 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
77 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
78 OUT SAMPR_HANDLE
*ServerHandle
,
79 IN ACCESS_MASK DesiredAccess
)
81 PSAM_DB_OBJECT ServerObject
;
84 TRACE("SamrConnect(%p %p %lx)\n",
85 ServerName
, ServerHandle
, DesiredAccess
);
87 Status
= SampOpenDbObject(NULL
,
93 if (NT_SUCCESS(Status
))
94 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
96 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
104 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
106 PSAM_DB_OBJECT DbObject
;
107 NTSTATUS Status
= STATUS_SUCCESS
;
109 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
111 Status
= SampValidateDbObject(*SamHandle
,
115 if (Status
== STATUS_SUCCESS
)
117 Status
= SampCloseDbObject(DbObject
);
121 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
129 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
130 IN SECURITY_INFORMATION SecurityInformation
,
131 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
134 return STATUS_NOT_IMPLEMENTED
;
140 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
141 IN SECURITY_INFORMATION SecurityInformation
,
142 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
* SecurityDescriptor
)
145 return STATUS_NOT_IMPLEMENTED
;
151 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
154 return STATUS_NOT_IMPLEMENTED
;
160 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
161 IN PRPC_UNICODE_STRING Name
,
162 OUT PRPC_SID
*DomainId
)
164 PSAM_DB_OBJECT ServerObject
;
165 HANDLE DomainsKeyHandle
= NULL
;
166 HANDLE DomainKeyHandle
= NULL
;
167 WCHAR DomainKeyName
[64];
169 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
170 UNICODE_STRING DomainName
;
175 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
176 ServerHandle
, Name
, DomainId
);
178 /* Validate the server handle */
179 Status
= SampValidateDbObject(ServerHandle
,
181 SAM_SERVER_LOOKUP_DOMAIN
,
183 if (!NT_SUCCESS(Status
))
188 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
192 if (!NT_SUCCESS(Status
))
196 while (Found
== FALSE
)
198 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
202 if (!NT_SUCCESS(Status
))
204 if (Status
== STATUS_NO_MORE_ENTRIES
)
205 Status
= STATUS_NO_SUCH_DOMAIN
;
209 TRACE("Domain key name: %S\n", DomainKeyName
);
211 Status
= SampRegOpenKey(DomainsKeyHandle
,
215 if (NT_SUCCESS(Status
))
217 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
218 Status
= SampRegQueryValue(DomainKeyHandle
,
221 (PVOID
)&DomainNameString
,
223 if (NT_SUCCESS(Status
))
225 TRACE("Domain name: %S\n", DomainNameString
);
227 RtlInitUnicodeString(&DomainName
,
229 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
231 TRACE("Found it!\n");
234 Status
= SampRegQueryValue(DomainKeyHandle
,
239 if (NT_SUCCESS(Status
))
241 *DomainId
= midl_user_allocate(Length
);
243 SampRegQueryValue(DomainKeyHandle
,
249 Status
= STATUS_SUCCESS
;
255 NtClose(DomainKeyHandle
);
261 NtClose(DomainsKeyHandle
);
269 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
270 IN OUT
unsigned long *EnumerationContext
,
271 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
272 IN ULONG PreferedMaximumLength
,
273 OUT PULONG CountReturned
)
275 PSAM_DB_OBJECT ServerObject
;
276 WCHAR DomainKeyName
[64];
277 HANDLE DomainsKeyHandle
;
278 HANDLE DomainKeyHandle
;
281 ULONG RequiredLength
;
284 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
287 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
288 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
291 /* Validate the server handle */
292 Status
= SampValidateDbObject(ServerHandle
,
294 SAM_SERVER_ENUMERATE_DOMAINS
,
296 if (!NT_SUCCESS(Status
))
299 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
303 if (!NT_SUCCESS(Status
))
306 EnumIndex
= *EnumerationContext
;
312 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
316 if (!NT_SUCCESS(Status
))
319 TRACE("EnumIndex: %lu\n", EnumIndex
);
320 TRACE("Domain key name: %S\n", DomainKeyName
);
322 Status
= SampRegOpenKey(DomainsKeyHandle
,
326 TRACE("SampRegOpenKey returned %08lX\n", Status
);
327 if (NT_SUCCESS(Status
))
330 Status
= SampRegQueryValue(DomainKeyHandle
,
335 TRACE("SampRegQueryValue returned %08lX\n", Status
);
336 if (NT_SUCCESS(Status
))
338 TRACE("Data length: %lu\n", DataLength
);
340 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
343 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
347 NtClose(DomainKeyHandle
);
353 TRACE("EnumCount: %lu\n", EnumCount
);
354 TRACE("RequiredLength: %lu\n", RequiredLength
);
356 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
357 if (EnumBuffer
== NULL
)
359 Status
= STATUS_INSUFFICIENT_RESOURCES
;
363 EnumBuffer
->EntriesRead
= EnumCount
;
364 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
365 if (EnumBuffer
->Buffer
== NULL
)
367 Status
= STATUS_INSUFFICIENT_RESOURCES
;
371 EnumIndex
= *EnumerationContext
;
372 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
374 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
378 if (!NT_SUCCESS(Status
))
381 TRACE("EnumIndex: %lu\n", EnumIndex
);
382 TRACE("Domain key name: %S\n", DomainKeyName
);
384 Status
= SampRegOpenKey(DomainsKeyHandle
,
388 TRACE("SampRegOpenKey returned %08lX\n", Status
);
389 if (NT_SUCCESS(Status
))
392 Status
= SampRegQueryValue(DomainKeyHandle
,
397 TRACE("SampRegQueryValue returned %08lX\n", Status
);
398 if (NT_SUCCESS(Status
))
400 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
401 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
402 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
403 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
404 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
406 NtClose(DomainKeyHandle
);
407 Status
= STATUS_INSUFFICIENT_RESOURCES
;
411 Status
= SampRegQueryValue(DomainKeyHandle
,
414 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
416 TRACE("SampRegQueryValue returned %08lX\n", Status
);
417 if (NT_SUCCESS(Status
))
419 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
423 NtClose(DomainKeyHandle
);
425 if (!NT_SUCCESS(Status
))
430 if (NT_SUCCESS(Status
))
432 *EnumerationContext
+= EnumCount
;
433 *Buffer
= EnumBuffer
;
434 *CountReturned
= EnumCount
;
438 if (!NT_SUCCESS(Status
))
440 *EnumerationContext
= 0;
444 if (EnumBuffer
!= NULL
)
446 if (EnumBuffer
->Buffer
!= NULL
)
448 if (EnumBuffer
->EntriesRead
!= 0)
450 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
452 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
453 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
457 midl_user_free(EnumBuffer
->Buffer
);
460 midl_user_free(EnumBuffer
);
464 NtClose(DomainsKeyHandle
);
472 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
473 IN ACCESS_MASK DesiredAccess
,
474 IN PRPC_SID DomainId
,
475 OUT SAMPR_HANDLE
*DomainHandle
)
477 PSAM_DB_OBJECT ServerObject
;
478 PSAM_DB_OBJECT DomainObject
;
481 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
482 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
484 /* Validate the server handle */
485 Status
= SampValidateDbObject(ServerHandle
,
487 SAM_SERVER_LOOKUP_DOMAIN
,
489 if (!NT_SUCCESS(Status
))
492 /* Validate the Domain SID */
493 if ((DomainId
->Revision
!= SID_REVISION
) ||
494 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
495 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
496 return STATUS_INVALID_PARAMETER
;
498 /* Open the domain object */
499 if ((DomainId
->SubAuthorityCount
== 1) &&
500 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
502 /* Builtin domain object */
503 TRACE("Opening the builtin domain object.\n");
505 Status
= SampOpenDbObject(ServerObject
,
512 else if ((DomainId
->SubAuthorityCount
== 4) &&
513 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
515 /* Account domain object */
516 TRACE("Opening the account domain object.\n");
518 /* FIXME: Check the account domain sub authorities!!! */
520 Status
= SampOpenDbObject(ServerObject
,
529 /* No vaild domain SID */
530 Status
= STATUS_INVALID_PARAMETER
;
533 if (NT_SUCCESS(Status
))
534 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
536 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
543 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
544 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
546 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
552 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
553 if (InfoBuffer
== NULL
)
554 return STATUS_INSUFFICIENT_RESOURCES
;
556 Status
= SampGetObjectAttribute(DomainObject
,
561 if (!NT_SUCCESS(Status
))
564 InfoBuffer
->Name
.DomainName
.Length
= Length
- sizeof(WCHAR
);
565 InfoBuffer
->Name
.DomainName
.MaximumLength
= Length
;
566 InfoBuffer
->Name
.DomainName
.Buffer
= midl_user_allocate(Length
);
567 if (InfoBuffer
->Name
.DomainName
.Buffer
== NULL
)
569 Status
= STATUS_INSUFFICIENT_RESOURCES
;
573 Status
= SampGetObjectAttribute(DomainObject
,
576 (PVOID
)InfoBuffer
->Name
.DomainName
.Buffer
,
578 if (!NT_SUCCESS(Status
))
581 *Buffer
= InfoBuffer
;
584 if (!NT_SUCCESS(Status
))
586 if (InfoBuffer
!= NULL
)
588 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
589 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
591 midl_user_free(InfoBuffer
);
602 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
603 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
604 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
606 PSAM_DB_OBJECT DomainObject
;
609 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
610 DomainHandle
, DomainInformationClass
, Buffer
);
612 /* Validate the server handle */
613 Status
= SampValidateDbObject(DomainHandle
,
615 DOMAIN_READ_OTHER_PARAMETERS
,
617 if (!NT_SUCCESS(Status
))
620 switch (DomainInformationClass
)
622 case DomainNameInformation
:
623 Status
= SampQueryDomainName(DomainObject
,
628 Status
= STATUS_NOT_IMPLEMENTED
;
635 SampSetDomainName(PSAM_DB_OBJECT DomainObject
,
636 PSAMPR_DOMAIN_NAME_INFORMATION DomainNameInfo
)
640 Status
= SampSetObjectAttribute(DomainObject
,
643 DomainNameInfo
->DomainName
.Buffer
,
644 DomainNameInfo
->DomainName
.Length
+ sizeof(WCHAR
));
652 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
653 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
654 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
656 PSAM_DB_OBJECT DomainObject
;
659 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
660 DomainHandle
, DomainInformationClass
, DomainInformation
);
662 /* Validate the server handle */
663 Status
= SampValidateDbObject(DomainHandle
,
665 DOMAIN_WRITE_OTHER_PARAMETERS
,
667 if (!NT_SUCCESS(Status
))
670 switch (DomainInformationClass
)
672 case DomainNameInformation
:
673 Status
= SampSetDomainName(DomainObject
,
674 &DomainInformation
->Name
);
678 Status
= STATUS_NOT_IMPLEMENTED
;
687 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
688 IN PRPC_UNICODE_STRING Name
,
689 IN ACCESS_MASK DesiredAccess
,
690 OUT SAMPR_HANDLE
*GroupHandle
,
691 OUT
unsigned long *RelativeId
)
694 return STATUS_NOT_IMPLEMENTED
;
700 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
701 IN OUT
unsigned long *EnumerationContext
,
702 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
703 IN
unsigned long PreferedMaximumLength
,
704 OUT
unsigned long *CountReturned
)
707 return STATUS_NOT_IMPLEMENTED
;
713 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
714 IN PRPC_UNICODE_STRING Name
,
715 IN ACCESS_MASK DesiredAccess
,
716 OUT SAMPR_HANDLE
*UserHandle
,
717 OUT
unsigned long *RelativeId
)
719 PSAM_DB_OBJECT DomainObject
;
720 PSAM_DB_OBJECT UserObject
;
724 BOOL bAliasExists
= FALSE
;
727 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
728 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
730 /* Validate the domain handle */
731 Status
= SampValidateDbObject(DomainHandle
,
735 if (!NT_SUCCESS(Status
))
737 TRACE("failed with status 0x%08lx\n", Status
);
741 /* Get the NextRID attribute */
742 ulSize
= sizeof(ULONG
);
743 Status
= SampGetObjectAttribute(DomainObject
,
748 if (!NT_SUCCESS(Status
))
749 ulRid
= DOMAIN_USER_RID_MAX
+ 1;
751 TRACE("RID: %lx\n", ulRid
);
753 /* Convert the RID into a string (hex) */
754 swprintf(szRid
, L
"%08lX", ulRid
);
756 /* Check whether the user name is already in use */
757 Status
= SampCheckDbObjectNameAlias(DomainObject
,
761 if (!NT_SUCCESS(Status
))
763 TRACE("failed with status 0x%08lx\n", Status
);
769 TRACE("The user account %S already exists!\n", Name
->Buffer
);
770 return STATUS_USER_EXISTS
;
773 /* Create the user object */
774 Status
= SampCreateDbObject(DomainObject
,
780 if (!NT_SUCCESS(Status
))
782 TRACE("failed with status 0x%08lx\n", Status
);
786 /* Add the name alias for the user object */
787 Status
= SampSetDbObjectNameAlias(DomainObject
,
791 if (!NT_SUCCESS(Status
))
793 TRACE("failed with status 0x%08lx\n", Status
);
797 /* Set the name attribute */
798 Status
= SampSetObjectAttribute(UserObject
,
801 (LPVOID
)Name
->Buffer
,
802 Name
->MaximumLength
);
803 if (!NT_SUCCESS(Status
))
805 TRACE("failed with status 0x%08lx\n", Status
);
809 /* FIXME: Set default user attributes */
811 if (NT_SUCCESS(Status
))
813 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
817 /* Increment the NextRID attribute */
819 ulSize
= sizeof(ULONG
);
820 SampSetObjectAttribute(DomainObject
,
826 TRACE("returns with status 0x%08lx\n", Status
);
834 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
835 IN OUT
unsigned long *EnumerationContext
,
836 IN
unsigned long UserAccountControl
,
837 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
838 IN
unsigned long PreferedMaximumLength
,
839 OUT
unsigned long *CountReturned
)
842 return STATUS_NOT_IMPLEMENTED
;
848 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
849 IN PRPC_UNICODE_STRING AccountName
,
850 IN ACCESS_MASK DesiredAccess
,
851 OUT SAMPR_HANDLE
*AliasHandle
,
852 OUT
unsigned long *RelativeId
)
854 PSAM_DB_OBJECT DomainObject
;
855 PSAM_DB_OBJECT AliasObject
;
856 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
860 BOOL bAliasExists
= FALSE
;
863 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
864 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
866 /* Validate the domain handle */
867 Status
= SampValidateDbObject(DomainHandle
,
871 if (!NT_SUCCESS(Status
))
873 TRACE("failed with status 0x%08lx\n", Status
);
877 /* Get the NextRID attribute */
878 ulSize
= sizeof(ULONG
);
879 Status
= SampGetObjectAttribute(DomainObject
,
884 if (!NT_SUCCESS(Status
))
885 ulRid
= DOMAIN_USER_RID_MAX
+ 1;
887 TRACE("RID: %lx\n", ulRid
);
889 /* Convert the RID into a string (hex) */
890 swprintf(szRid
, L
"%08lX", ulRid
);
892 /* Check whether the user name is already in use */
893 Status
= SampCheckDbObjectNameAlias(DomainObject
,
897 if (!NT_SUCCESS(Status
))
899 TRACE("failed with status 0x%08lx\n", Status
);
905 TRACE("The alias account %S already exists!\n", AccountName
->Buffer
);
906 return STATUS_ALIAS_EXISTS
;
909 /* Create the user object */
910 Status
= SampCreateDbObject(DomainObject
,
916 if (!NT_SUCCESS(Status
))
918 TRACE("failed with status 0x%08lx\n", Status
);
922 /* Add the name alias for the user object */
923 Status
= SampSetDbObjectNameAlias(DomainObject
,
927 if (!NT_SUCCESS(Status
))
929 TRACE("failed with status 0x%08lx\n", Status
);
933 /* Set the Name attribute */
934 Status
= SampSetObjectAttribute(AliasObject
,
937 (LPVOID
)AccountName
->Buffer
,
938 AccountName
->MaximumLength
);
939 if (!NT_SUCCESS(Status
))
941 TRACE("failed with status 0x%08lx\n", Status
);
945 /* Set the Description attribute */
946 Status
= SampSetObjectAttribute(AliasObject
,
950 EmptyString
.MaximumLength
);
951 if (!NT_SUCCESS(Status
))
953 TRACE("failed with status 0x%08lx\n", Status
);
957 if (NT_SUCCESS(Status
))
959 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
963 /* Increment the NextRID attribute */
965 ulSize
= sizeof(ULONG
);
966 SampSetObjectAttribute(DomainObject
,
972 TRACE("returns with status 0x%08lx\n", Status
);
980 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
981 IN OUT
unsigned long *EnumerationContext
,
982 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
983 IN
unsigned long PreferedMaximumLength
,
984 OUT
unsigned long *CountReturned
)
986 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
987 PSAM_DB_OBJECT DomainObject
;
988 HANDLE AliasesKeyHandle
;
989 WCHAR AliasKeyName
[64];
990 HANDLE AliasKeyHandle
;
993 ULONG RequiredLength
;
996 BOOLEAN MoreEntries
= FALSE
;
999 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
1000 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
1003 /* Validate the domain handle */
1004 Status
= SampValidateDbObject(DomainHandle
,
1006 DOMAIN_LIST_ACCOUNTS
,
1008 if (!NT_SUCCESS(Status
))
1011 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1015 if (!NT_SUCCESS(Status
))
1020 EnumIndex
= *EnumerationContext
;
1026 Status
= SampRegEnumerateSubKey(AliasesKeyHandle
,
1030 if (!NT_SUCCESS(Status
))
1032 if (Status
== STATUS_NO_MORE_ENTRIES
)
1033 Status
= STATUS_SUCCESS
;
1037 TRACE("EnumIndex: %lu\n", EnumIndex
);
1038 TRACE("Alias key name: %S\n", AliasKeyName
);
1040 Status
= SampRegOpenKey(AliasesKeyHandle
,
1044 TRACE("SampRegOpenKey returned %08lX\n", Status
);
1045 if (NT_SUCCESS(Status
))
1048 Status
= SampRegQueryValue(AliasKeyHandle
,
1054 NtClose(AliasKeyHandle
);
1056 TRACE("SampRegQueryValue returned %08lX\n", Status
);
1058 if (NT_SUCCESS(Status
))
1060 TRACE("Data length: %lu\n", DataLength
);
1062 if ((RequiredLength
+ DataLength
+ sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
1068 RequiredLength
+= (DataLength
+ sizeof(SAMPR_RID_ENUMERATION
));
1076 TRACE("EnumCount: %lu\n", EnumCount
);
1077 TRACE("RequiredLength: %lu\n", RequiredLength
);
1079 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
1080 if (EnumBuffer
== NULL
)
1082 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1086 EnumBuffer
->EntriesRead
= EnumCount
;
1090 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
1091 if (EnumBuffer
->Buffer
== NULL
)
1093 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1099 EnumIndex
= *EnumerationContext
;
1100 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
1102 Status
= SampRegEnumerateSubKey(AliasesKeyHandle
,
1106 if (!NT_SUCCESS(Status
))
1108 if (Status
== STATUS_NO_MORE_ENTRIES
)
1109 Status
= STATUS_SUCCESS
;
1113 TRACE("EnumIndex: %lu\n", EnumIndex
);
1114 TRACE("Alias key name: %S\n", AliasKeyName
);
1116 Status
= SampRegOpenKey(AliasesKeyHandle
,
1120 TRACE("SampRegOpenKey returned %08lX\n", Status
);
1121 if (NT_SUCCESS(Status
))
1124 Status
= SampRegQueryValue(AliasKeyHandle
,
1129 TRACE("SampRegQueryValue returned %08lX\n", Status
);
1130 if (NT_SUCCESS(Status
))
1132 EnumBuffer
->Buffer
[i
].RelativeId
= wcstoul(AliasKeyName
, NULL
, 16);
1134 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
1135 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
1136 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
1137 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
1139 NtClose(AliasKeyHandle
);
1140 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1144 Status
= SampRegQueryValue(AliasKeyHandle
,
1147 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
1149 TRACE("SampRegQueryValue returned %08lX\n", Status
);
1150 if (NT_SUCCESS(Status
))
1152 TRACE("Alias name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
1156 NtClose(AliasKeyHandle
);
1158 if (!NT_SUCCESS(Status
))
1164 if (NT_SUCCESS(Status
))
1166 *EnumerationContext
+= EnumCount
;
1167 *Buffer
= EnumBuffer
;
1168 *CountReturned
= EnumCount
;
1171 if (!NT_SUCCESS(Status
))
1173 *EnumerationContext
= 0;
1177 if (EnumBuffer
!= NULL
)
1179 if (EnumBuffer
->Buffer
!= NULL
)
1181 if (EnumBuffer
->EntriesRead
!= 0)
1183 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
1185 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
1186 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
1190 midl_user_free(EnumBuffer
->Buffer
);
1193 midl_user_free(EnumBuffer
);
1197 NtClose(AliasesKeyHandle
);
1199 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
1200 Status
= STATUS_MORE_ENTRIES
;
1208 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
1209 IN PSAMPR_PSID_ARRAY SidArray
,
1210 OUT PSAMPR_ULONG_ARRAY Membership
)
1212 PSAM_DB_OBJECT DomainObject
;
1213 HANDLE AliasesKeyHandle
= NULL
;
1214 HANDLE MembersKeyHandle
= NULL
;
1215 HANDLE MemberKeyHandle
= NULL
;
1216 LPWSTR MemberSidString
= NULL
;
1217 PULONG RidArray
= NULL
;
1218 ULONG MaxSidCount
= 0;
1224 TRACE("SamrGetAliasMembership(%p %p %p)\n",
1225 DomainHandle
, SidArray
, Membership
);
1227 /* Validate the domain handle */
1228 Status
= SampValidateDbObject(DomainHandle
,
1232 if (!NT_SUCCESS(Status
))
1235 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1239 TRACE("SampRegOpenKey returned %08lX\n", Status
);
1240 if (!NT_SUCCESS(Status
))
1243 Status
= SampRegOpenKey(AliasesKeyHandle
,
1247 TRACE("SampRegOpenKey returned %08lX\n", Status
);
1248 if (!NT_SUCCESS(Status
))
1251 for (i
= 0; i
< SidArray
->Count
; i
++)
1253 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
1254 TRACE("Open %S\n", MemberSidString
);
1256 Status
= SampRegOpenKey(MembersKeyHandle
,
1260 TRACE("SampRegOpenKey returned %08lX\n", Status
);
1261 if (NT_SUCCESS(Status
))
1263 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
1266 if (NT_SUCCESS(Status
))
1268 TRACE("Found %lu values\n", ValueCount
);
1269 MaxSidCount
+= ValueCount
;
1273 NtClose(MemberKeyHandle
);
1276 LocalFree(MemberSidString
);
1279 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
1280 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
1281 if (RidArray
== NULL
)
1283 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1287 for (i
= 0; i
< SidArray
->Count
; i
++)
1289 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
1290 TRACE("Open %S\n", MemberSidString
);
1292 Status
= SampRegOpenKey(MembersKeyHandle
,
1296 TRACE("SampRegOpenKey returned %08lX\n", Status
);
1297 if (NT_SUCCESS(Status
))
1299 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
1302 if (NT_SUCCESS(Status
))
1304 TRACE("Found %lu values\n", ValueCount
);
1306 for (j
= 0; j
< ValueCount
; j
++)
1308 DataLength
= sizeof(ULONG
);
1309 Status
= SampRegEnumerateValue(MemberKeyHandle
,
1314 (PVOID
)&RidArray
[j
],
1319 NtClose(MemberKeyHandle
);
1322 LocalFree(MemberSidString
);
1327 if (NT_SUCCESS(Status
))
1329 Membership
->Count
= MaxSidCount
;
1330 Membership
->Element
= RidArray
;
1334 if (RidArray
!= NULL
)
1335 midl_user_free(RidArray
);
1338 if (MembersKeyHandle
!= NULL
)
1339 NtClose(MembersKeyHandle
);
1341 if (MembersKeyHandle
!= NULL
)
1342 NtClose(MembersKeyHandle
);
1344 if (AliasesKeyHandle
!= NULL
)
1345 NtClose(AliasesKeyHandle
);
1353 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
1354 IN
unsigned long Count
,
1355 IN RPC_UNICODE_STRING Names
[],
1356 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
1357 OUT PSAMPR_ULONG_ARRAY Use
)
1360 return STATUS_NOT_IMPLEMENTED
;
1366 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
1367 IN
unsigned long Count
,
1368 IN
unsigned long *RelativeIds
,
1369 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
1370 OUT PSAMPR_ULONG_ARRAY Use
)
1373 return STATUS_NOT_IMPLEMENTED
;
1379 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
1380 IN ACCESS_MASK DesiredAccess
,
1381 IN
unsigned long GroupId
,
1382 OUT SAMPR_HANDLE
*GroupHandle
)
1385 return STATUS_NOT_IMPLEMENTED
;
1391 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
1392 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1393 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
1396 return STATUS_NOT_IMPLEMENTED
;
1402 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
1403 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
1404 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
1407 return STATUS_NOT_IMPLEMENTED
;
1413 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
1414 IN
unsigned long MemberId
,
1415 IN
unsigned long Attributes
)
1418 return STATUS_NOT_IMPLEMENTED
;
1424 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
1427 return STATUS_NOT_IMPLEMENTED
;
1433 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
1434 IN
unsigned long MemberId
)
1437 return STATUS_NOT_IMPLEMENTED
;
1443 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
1444 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
1447 return STATUS_NOT_IMPLEMENTED
;
1453 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
1454 IN
unsigned long MemberId
,
1455 IN
unsigned long Attributes
)
1458 return STATUS_NOT_IMPLEMENTED
;
1464 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
1465 IN ACCESS_MASK DesiredAccess
,
1467 OUT SAMPR_HANDLE
*AliasHandle
)
1469 PSAM_DB_OBJECT DomainObject
;
1470 PSAM_DB_OBJECT AliasObject
;
1474 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
1475 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
1477 /* Validate the domain handle */
1478 Status
= SampValidateDbObject(DomainHandle
,
1482 if (!NT_SUCCESS(Status
))
1484 TRACE("failed with status 0x%08lx\n", Status
);
1488 /* Convert the RID into a string (hex) */
1489 swprintf(szRid
, L
"%08lX", AliasId
);
1491 /* Create the alias object */
1492 Status
= SampOpenDbObject(DomainObject
,
1498 if (!NT_SUCCESS(Status
))
1500 TRACE("failed with status 0x%08lx\n", Status
);
1504 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
1506 return STATUS_SUCCESS
;
1512 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
1513 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1514 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
1516 PSAM_DB_OBJECT AliasObject
;
1519 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
1520 AliasHandle
, AliasInformationClass
, Buffer
);
1522 /* Validate the alias handle */
1523 Status
= SampValidateDbObject(AliasHandle
,
1525 ALIAS_READ_INFORMATION
,
1527 if (!NT_SUCCESS(Status
))
1530 switch (AliasInformationClass
)
1533 case AliasGeneralInformation
:
1534 Status
= SampQueryAliasGeneral(AliasObject
,
1538 case AliasNameInformation
:
1539 Status
= SampQueryAliasName(AliasObject
,
1543 case AliasAdminCommentInformation
:
1544 Status
= SampQueryAliasAdminComment(AliasObject
,
1545 &Buffer
->AdminComment
);
1550 Status
= STATUS_INVALID_INFO_CLASS
;
1559 SampSetAliasName(PSAM_DB_OBJECT AliasObject
,
1560 PSAMPR_ALIAS_NAME_INFORMATION AliasNameInfo
)
1564 Status
= SampSetObjectAttribute(AliasObject
,
1567 AliasNameInfo
->Name
.Buffer
,
1568 AliasNameInfo
->Name
.Length
+ sizeof(WCHAR
));
1574 SampSetAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
1575 PSAMPR_ALIAS_ADM_COMMENT_INFORMATION AliasAdminCommentInfo
)
1579 Status
= SampSetObjectAttribute(AliasObject
,
1582 AliasAdminCommentInfo
->AdminComment
.Buffer
,
1583 AliasAdminCommentInfo
->AdminComment
.Length
+ sizeof(WCHAR
));
1591 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
1592 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
1593 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
1595 PSAM_DB_OBJECT AliasObject
;
1598 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
1599 AliasHandle
, AliasInformationClass
, Buffer
);
1601 /* Validate the alias handle */
1602 Status
= SampValidateDbObject(AliasHandle
,
1604 ALIAS_WRITE_ACCOUNT
,
1606 if (!NT_SUCCESS(Status
))
1609 switch (AliasInformationClass
)
1611 case AliasNameInformation
:
1612 Status
= SampSetAliasName(AliasObject
,
1616 case AliasAdminCommentInformation
:
1617 Status
= SampSetAliasAdminComment(AliasObject
,
1618 &Buffer
->AdminComment
);
1622 Status
= STATUS_INVALID_INFO_CLASS
;
1632 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
1635 return STATUS_NOT_IMPLEMENTED
;
1641 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
1642 IN PRPC_SID MemberId
)
1644 PSAM_DB_OBJECT AliasObject
;
1645 LPWSTR MemberIdString
= NULL
;
1646 HANDLE MembersKeyHandle
= NULL
;
1647 HANDLE MemberKeyHandle
= NULL
;
1648 ULONG MemberIdLength
;
1651 TRACE("SamrAddMemberToAlias(%p %p)\n",
1652 AliasHandle
, MemberId
);
1654 /* Validate the domain handle */
1655 Status
= SampValidateDbObject(AliasHandle
,
1659 if (!NT_SUCCESS(Status
))
1661 TRACE("failed with status 0x%08lx\n", Status
);
1665 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
1666 TRACE("Member SID: %S\n", MemberIdString
);
1668 MemberIdLength
= RtlLengthSid(MemberId
);
1670 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
1674 if (!NT_SUCCESS(Status
))
1676 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
1680 Status
= SampRegSetValue(MembersKeyHandle
,
1685 if (!NT_SUCCESS(Status
))
1687 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
1691 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
1695 if (!NT_SUCCESS(Status
))
1697 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
1701 Status
= SampRegSetValue(MemberKeyHandle
,
1706 if (!NT_SUCCESS(Status
))
1708 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
1713 if (MemberKeyHandle
!= NULL
)
1714 SampRegCloseKey(MemberKeyHandle
);
1716 if (MembersKeyHandle
!= NULL
)
1717 SampRegCloseKey(MembersKeyHandle
);
1719 if (MemberIdString
!= NULL
)
1720 LocalFree(MemberIdString
);
1728 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
1729 IN PRPC_SID MemberId
)
1732 return STATUS_NOT_IMPLEMENTED
;
1738 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
1739 OUT PSAMPR_PSID_ARRAY_OUT Members
)
1741 PSAM_DB_OBJECT AliasObject
;
1742 HANDLE MembersKeyHandle
= NULL
;
1743 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
1744 ULONG ValueCount
= 0;
1749 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
1750 AliasHandle
, Members
);
1752 /* Validate the alias handle */
1753 Status
= SampValidateDbObject(AliasHandle
,
1757 if (!NT_SUCCESS(Status
))
1759 ERR("failed with status 0x%08lx\n", Status
);
1763 /* Open the members key of the alias objct */
1764 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
1768 if (!NT_SUCCESS(Status
))
1770 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
1774 /* Get the number of members */
1775 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
1778 if (!NT_SUCCESS(Status
))
1780 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
1784 /* Allocate the member array */
1785 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
1786 if (MemberArray
== NULL
)
1788 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1792 /* Enumerate the members */
1796 /* Get the size of the next SID */
1798 Status
= SampRegEnumerateValue(MembersKeyHandle
,
1805 if (!NT_SUCCESS(Status
))
1807 if (Status
== STATUS_NO_MORE_ENTRIES
)
1808 Status
= STATUS_SUCCESS
;
1812 /* Allocate a buffer for the SID */
1813 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
1814 if (MemberArray
[Index
].SidPointer
== NULL
)
1816 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1820 /* Read the SID into the buffer */
1821 Status
= SampRegEnumerateValue(MembersKeyHandle
,
1826 (PVOID
)MemberArray
[Index
].SidPointer
,
1828 if (!NT_SUCCESS(Status
))
1836 /* Return the number of members and the member array */
1837 if (NT_SUCCESS(Status
))
1839 Members
->Count
= ValueCount
;
1840 Members
->Sids
= MemberArray
;
1844 /* Clean up the members array and the SID buffers if something failed */
1845 if (!NT_SUCCESS(Status
))
1847 if (MemberArray
!= NULL
)
1849 for (Index
= 0; Index
< ValueCount
; Index
++)
1851 if (MemberArray
[Index
].SidPointer
!= NULL
)
1852 midl_user_free(MemberArray
[Index
].SidPointer
);
1855 midl_user_free(MemberArray
);
1859 /* Close the members key */
1860 if (MembersKeyHandle
!= NULL
)
1861 SampRegCloseKey(MembersKeyHandle
);
1869 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
1870 IN ACCESS_MASK DesiredAccess
,
1871 IN
unsigned long UserId
,
1872 OUT SAMPR_HANDLE
*UserHandle
)
1874 PSAM_DB_OBJECT DomainObject
;
1875 PSAM_DB_OBJECT UserObject
;
1879 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
1880 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
1882 /* Validate the domain handle */
1883 Status
= SampValidateDbObject(DomainHandle
,
1887 if (!NT_SUCCESS(Status
))
1889 TRACE("failed with status 0x%08lx\n", Status
);
1893 /* Convert the RID into a string (hex) */
1894 swprintf(szRid
, L
"%08lX", UserId
);
1896 /* Create the user object */
1897 Status
= SampOpenDbObject(DomainObject
,
1903 if (!NT_SUCCESS(Status
))
1905 TRACE("failed with status 0x%08lx\n", Status
);
1909 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
1911 return STATUS_SUCCESS
;
1917 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
1920 return STATUS_NOT_IMPLEMENTED
;
1926 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
1927 IN USER_INFORMATION_CLASS UserInformationClass
,
1928 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
1931 return STATUS_NOT_IMPLEMENTED
;
1937 SampSetPasswordInformation(PSAM_DB_OBJECT UserObject
,
1938 PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordInfo
)
1942 TRACE("Password: %S\n", PasswordInfo
->Password
.Buffer
);
1943 TRACE("PasswordExpired: %d\n", PasswordInfo
->PasswordExpired
);
1945 Status
= SampSetObjectAttribute(UserObject
,
1948 PasswordInfo
->Password
.Buffer
,
1949 PasswordInfo
->Password
.MaximumLength
);
1958 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
1959 IN USER_INFORMATION_CLASS UserInformationClass
,
1960 IN PSAMPR_USER_INFO_BUFFER Buffer
)
1962 PSAM_DB_OBJECT UserObject
;
1965 TRACE("SamrSetInformationUser(%p %lu %p)\n",
1966 UserHandle
, UserInformationClass
, Buffer
);
1968 /* Validate the domain handle */
1969 Status
= SampValidateDbObject(UserHandle
,
1971 USER_FORCE_PASSWORD_CHANGE
,
1973 if (!NT_SUCCESS(Status
))
1975 TRACE("failed with status 0x%08lx\n", Status
);
1979 switch (UserInformationClass
)
1981 case UserSetPasswordInformation
:
1982 Status
= SampSetPasswordInformation(UserObject
,
1983 (PSAMPR_USER_SET_PASSWORD_INFORMATION
)Buffer
);
1987 Status
= STATUS_INVALID_INFO_CLASS
;
1997 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
1998 IN
unsigned char LmPresent
,
1999 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
2000 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
2001 IN
unsigned char NtPresent
,
2002 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
2003 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
2004 IN
unsigned char NtCrossEncryptionPresent
,
2005 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
2006 IN
unsigned char LmCrossEncryptionPresent
,
2007 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
2010 return STATUS_NOT_IMPLEMENTED
;
2016 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
2017 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
2020 return STATUS_NOT_IMPLEMENTED
;
2026 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
2027 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
2028 IN
unsigned long Index
,
2029 IN
unsigned long EntryCount
,
2030 IN
unsigned long PreferredMaximumLength
,
2031 OUT
unsigned long *TotalAvailable
,
2032 OUT
unsigned long *TotalReturned
,
2033 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
2036 return STATUS_NOT_IMPLEMENTED
;
2042 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
2043 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
2044 IN PRPC_UNICODE_STRING Prefix
,
2045 OUT
unsigned long *Index
)
2048 return STATUS_NOT_IMPLEMENTED
;
2054 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
2057 return STATUS_NOT_IMPLEMENTED
;
2063 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
2066 return STATUS_NOT_IMPLEMENTED
;
2072 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
2073 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
2076 return STATUS_NOT_IMPLEMENTED
;
2082 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
2083 IN PRPC_SID MemberSid
)
2086 return STATUS_NOT_IMPLEMENTED
;
2092 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
2093 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
2094 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
2097 return STATUS_NOT_IMPLEMENTED
;
2103 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
2104 IN USER_INFORMATION_CLASS UserInformationClass
,
2105 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
2108 return STATUS_NOT_IMPLEMENTED
;
2114 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
2115 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
2116 IN
unsigned long Index
,
2117 IN
unsigned long EntryCount
,
2118 IN
unsigned long PreferredMaximumLength
,
2119 OUT
unsigned long *TotalAvailable
,
2120 OUT
unsigned long *TotalReturned
,
2121 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
2124 return STATUS_NOT_IMPLEMENTED
;
2130 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
2131 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
2132 IN PRPC_UNICODE_STRING Prefix
,
2133 OUT
unsigned long *Index
)
2136 return STATUS_NOT_IMPLEMENTED
;
2142 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
2143 IN PRPC_UNICODE_STRING Name
,
2144 IN
unsigned long AccountType
,
2145 IN ACCESS_MASK DesiredAccess
,
2146 OUT SAMPR_HANDLE
*UserHandle
,
2147 OUT
unsigned long *GrantedAccess
,
2148 OUT
unsigned long *RelativeId
)
2151 return STATUS_NOT_IMPLEMENTED
;
2157 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
2158 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
2159 IN
unsigned long Index
,
2160 IN
unsigned long EntryCount
,
2161 IN
unsigned long PreferredMaximumLength
,
2162 OUT
unsigned long *TotalAvailable
,
2163 OUT
unsigned long *TotalReturned
,
2164 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
2167 return STATUS_NOT_IMPLEMENTED
;
2173 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
2174 IN PSAMPR_PSID_ARRAY MembersBuffer
)
2177 return STATUS_NOT_IMPLEMENTED
;
2183 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
2184 IN PSAMPR_PSID_ARRAY MembersBuffer
)
2187 return STATUS_NOT_IMPLEMENTED
;
2193 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
2194 IN PRPC_STRING ServerName
,
2195 IN PRPC_STRING UserName
,
2196 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
2197 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
2200 return STATUS_NOT_IMPLEMENTED
;
2206 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
2207 IN PRPC_UNICODE_STRING ServerName
,
2208 IN PRPC_UNICODE_STRING UserName
,
2209 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
2210 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
2211 IN
unsigned char LmPresent
,
2212 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
2213 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
2216 return STATUS_NOT_IMPLEMENTED
;
2222 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
2223 IN PRPC_UNICODE_STRING Unused
,
2224 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
2227 return STATUS_NOT_IMPLEMENTED
;
2233 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
2234 OUT SAMPR_HANDLE
*ServerHandle
,
2235 IN ACCESS_MASK DesiredAccess
)
2238 return STATUS_NOT_IMPLEMENTED
;
2244 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
2245 IN USER_INFORMATION_CLASS UserInformationClass
,
2246 IN PSAMPR_USER_INFO_BUFFER Buffer
)
2249 return STATUS_NOT_IMPLEMENTED
;
2255 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
2258 return STATUS_NOT_IMPLEMENTED
;
2264 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
2267 return STATUS_NOT_IMPLEMENTED
;
2273 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
2276 return STATUS_NOT_IMPLEMENTED
;
2282 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
2283 OUT SAMPR_HANDLE
*ServerHandle
,
2284 IN
unsigned long ClientRevision
,
2285 IN ACCESS_MASK DesiredAccess
)
2288 return STATUS_NOT_IMPLEMENTED
;
2294 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
2297 return STATUS_NOT_IMPLEMENTED
;
2303 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
2304 IN ACCESS_MASK DesiredAccess
,
2305 IN
unsigned long InVersion
,
2306 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
2307 OUT
unsigned long *OutVersion
,
2308 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
2309 OUT SAMPR_HANDLE
*ServerHandle
)
2312 return STATUS_NOT_IMPLEMENTED
;
2318 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
2319 IN
unsigned long Rid
,
2323 return STATUS_NOT_IMPLEMENTED
;
2329 SamrSetDSRMPassword(IN handle_t BindingHandle
,
2330 IN PRPC_UNICODE_STRING Unused
,
2331 IN
unsigned long UserId
,
2332 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
2335 return STATUS_NOT_IMPLEMENTED
;
2341 SamrValidatePassword(IN handle_t Handle
,
2342 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
2343 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
2344 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
2347 return STATUS_NOT_IMPLEMENTED
;