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 static GENERIC_MAPPING ServerMapping
=
28 static GENERIC_MAPPING DomainMapping
=
36 static GENERIC_MAPPING AliasMapping
=
44 static GENERIC_MAPPING GroupMapping
=
52 static GENERIC_MAPPING UserMapping
=
61 /* FUNCTIONS *****************************************************************/
64 SampStartRpcServer(VOID
)
68 TRACE("SampStartRpcServer() called\n");
70 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
74 if (Status
!= RPC_S_OK
)
76 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
80 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
83 if (Status
!= RPC_S_OK
)
85 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
89 Status
= RpcServerListen(1, 20, TRUE
);
90 if (Status
!= RPC_S_OK
)
92 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
96 TRACE("SampStartRpcServer() done\n");
100 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
102 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
106 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
108 HeapFree(GetProcessHeap(), 0, ptr
);
112 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
120 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
121 OUT SAMPR_HANDLE
*ServerHandle
,
122 IN ACCESS_MASK DesiredAccess
)
124 PSAM_DB_OBJECT ServerObject
;
127 TRACE("SamrConnect(%p %p %lx)\n",
128 ServerName
, ServerHandle
, DesiredAccess
);
130 /* Map generic access rights */
131 RtlMapGenericMask(&DesiredAccess
,
134 /* Open the Server Object */
135 Status
= SampOpenDbObject(NULL
,
142 if (NT_SUCCESS(Status
))
143 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
145 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
154 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
156 PSAM_DB_OBJECT DbObject
;
157 NTSTATUS Status
= STATUS_SUCCESS
;
159 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
161 Status
= SampValidateDbObject(*SamHandle
,
165 if (Status
== STATUS_SUCCESS
)
167 Status
= SampCloseDbObject(DbObject
);
171 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
180 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
181 IN SECURITY_INFORMATION SecurityInformation
,
182 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
185 return STATUS_NOT_IMPLEMENTED
;
192 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
193 IN SECURITY_INFORMATION SecurityInformation
,
194 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
*SecurityDescriptor
)
197 return STATUS_NOT_IMPLEMENTED
;
204 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
207 return STATUS_NOT_IMPLEMENTED
;
214 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
215 IN PRPC_UNICODE_STRING Name
,
216 OUT PRPC_SID
*DomainId
)
218 PSAM_DB_OBJECT ServerObject
;
219 HANDLE DomainsKeyHandle
= NULL
;
220 HANDLE DomainKeyHandle
= NULL
;
221 WCHAR DomainKeyName
[64];
223 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
224 UNICODE_STRING DomainName
;
229 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
230 ServerHandle
, Name
, DomainId
);
232 /* Validate the server handle */
233 Status
= SampValidateDbObject(ServerHandle
,
235 SAM_SERVER_LOOKUP_DOMAIN
,
237 if (!NT_SUCCESS(Status
))
242 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
246 if (!NT_SUCCESS(Status
))
250 while (Found
== FALSE
)
252 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
256 if (!NT_SUCCESS(Status
))
258 if (Status
== STATUS_NO_MORE_ENTRIES
)
259 Status
= STATUS_NO_SUCH_DOMAIN
;
263 TRACE("Domain key name: %S\n", DomainKeyName
);
265 Status
= SampRegOpenKey(DomainsKeyHandle
,
269 if (NT_SUCCESS(Status
))
271 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
272 Status
= SampRegQueryValue(DomainKeyHandle
,
275 (PVOID
)&DomainNameString
,
277 if (NT_SUCCESS(Status
))
279 TRACE("Domain name: %S\n", DomainNameString
);
281 RtlInitUnicodeString(&DomainName
,
283 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
285 TRACE("Found it!\n");
288 Status
= SampRegQueryValue(DomainKeyHandle
,
293 if (NT_SUCCESS(Status
))
295 *DomainId
= midl_user_allocate(Length
);
297 SampRegQueryValue(DomainKeyHandle
,
303 Status
= STATUS_SUCCESS
;
309 NtClose(DomainKeyHandle
);
315 NtClose(DomainsKeyHandle
);
324 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
325 IN OUT
unsigned long *EnumerationContext
,
326 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
327 IN ULONG PreferedMaximumLength
,
328 OUT PULONG CountReturned
)
330 PSAM_DB_OBJECT ServerObject
;
331 WCHAR DomainKeyName
[64];
332 HANDLE DomainsKeyHandle
;
333 HANDLE DomainKeyHandle
;
336 ULONG RequiredLength
;
339 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
342 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
343 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
346 /* Validate the server handle */
347 Status
= SampValidateDbObject(ServerHandle
,
349 SAM_SERVER_ENUMERATE_DOMAINS
,
351 if (!NT_SUCCESS(Status
))
354 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
358 if (!NT_SUCCESS(Status
))
361 EnumIndex
= *EnumerationContext
;
367 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
371 if (!NT_SUCCESS(Status
))
374 TRACE("EnumIndex: %lu\n", EnumIndex
);
375 TRACE("Domain key name: %S\n", DomainKeyName
);
377 Status
= SampRegOpenKey(DomainsKeyHandle
,
381 TRACE("SampRegOpenKey returned %08lX\n", Status
);
382 if (NT_SUCCESS(Status
))
385 Status
= SampRegQueryValue(DomainKeyHandle
,
390 TRACE("SampRegQueryValue returned %08lX\n", Status
);
391 if (NT_SUCCESS(Status
))
393 TRACE("Data length: %lu\n", DataLength
);
395 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
398 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
402 NtClose(DomainKeyHandle
);
408 TRACE("EnumCount: %lu\n", EnumCount
);
409 TRACE("RequiredLength: %lu\n", RequiredLength
);
411 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
412 if (EnumBuffer
== NULL
)
414 Status
= STATUS_INSUFFICIENT_RESOURCES
;
418 EnumBuffer
->EntriesRead
= EnumCount
;
419 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
420 if (EnumBuffer
->Buffer
== NULL
)
422 Status
= STATUS_INSUFFICIENT_RESOURCES
;
426 EnumIndex
= *EnumerationContext
;
427 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
429 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
433 if (!NT_SUCCESS(Status
))
436 TRACE("EnumIndex: %lu\n", EnumIndex
);
437 TRACE("Domain key name: %S\n", DomainKeyName
);
439 Status
= SampRegOpenKey(DomainsKeyHandle
,
443 TRACE("SampRegOpenKey returned %08lX\n", Status
);
444 if (NT_SUCCESS(Status
))
447 Status
= SampRegQueryValue(DomainKeyHandle
,
452 TRACE("SampRegQueryValue returned %08lX\n", Status
);
453 if (NT_SUCCESS(Status
))
455 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
456 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
457 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
458 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
459 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
461 NtClose(DomainKeyHandle
);
462 Status
= STATUS_INSUFFICIENT_RESOURCES
;
466 Status
= SampRegQueryValue(DomainKeyHandle
,
469 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
471 TRACE("SampRegQueryValue returned %08lX\n", Status
);
472 if (NT_SUCCESS(Status
))
474 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
478 NtClose(DomainKeyHandle
);
480 if (!NT_SUCCESS(Status
))
485 if (NT_SUCCESS(Status
))
487 *EnumerationContext
+= EnumCount
;
488 *Buffer
= EnumBuffer
;
489 *CountReturned
= EnumCount
;
493 if (!NT_SUCCESS(Status
))
495 *EnumerationContext
= 0;
499 if (EnumBuffer
!= NULL
)
501 if (EnumBuffer
->Buffer
!= NULL
)
503 if (EnumBuffer
->EntriesRead
!= 0)
505 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
507 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
508 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
512 midl_user_free(EnumBuffer
->Buffer
);
515 midl_user_free(EnumBuffer
);
519 NtClose(DomainsKeyHandle
);
528 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
529 IN ACCESS_MASK DesiredAccess
,
530 IN PRPC_SID DomainId
,
531 OUT SAMPR_HANDLE
*DomainHandle
)
533 PSAM_DB_OBJECT ServerObject
;
534 PSAM_DB_OBJECT DomainObject
;
537 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
538 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
540 /* Map generic access rights */
541 RtlMapGenericMask(&DesiredAccess
,
544 /* Validate the server handle */
545 Status
= SampValidateDbObject(ServerHandle
,
547 SAM_SERVER_LOOKUP_DOMAIN
,
549 if (!NT_SUCCESS(Status
))
552 /* Validate the Domain SID */
553 if ((DomainId
->Revision
!= SID_REVISION
) ||
554 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
555 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
556 return STATUS_INVALID_PARAMETER
;
558 /* Open the domain object */
559 if ((DomainId
->SubAuthorityCount
== 1) &&
560 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
562 /* Builtin domain object */
563 TRACE("Opening the builtin domain object.\n");
565 Status
= SampOpenDbObject(ServerObject
,
573 else if ((DomainId
->SubAuthorityCount
== 4) &&
574 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
576 /* Account domain object */
577 TRACE("Opening the account domain object.\n");
579 /* FIXME: Check the account domain sub authorities!!! */
581 Status
= SampOpenDbObject(ServerObject
,
591 /* No vaild domain SID */
592 Status
= STATUS_INVALID_PARAMETER
;
595 if (NT_SUCCESS(Status
))
596 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
598 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
605 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
606 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
608 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
609 SAM_DOMAIN_FIXED_DATA FixedData
;
615 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
616 if (InfoBuffer
== NULL
)
617 return STATUS_INSUFFICIENT_RESOURCES
;
619 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
620 Status
= SampGetObjectAttribute(DomainObject
,
625 if (!NT_SUCCESS(Status
))
628 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
629 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
630 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
631 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
632 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
633 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
634 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
636 *Buffer
= InfoBuffer
;
639 if (!NT_SUCCESS(Status
))
641 if (InfoBuffer
!= NULL
)
643 midl_user_free(InfoBuffer
);
652 SampGetNumberOfAccounts(PSAM_DB_OBJECT DomainObject
,
656 HANDLE AccountKeyHandle
= NULL
;
657 HANDLE NamesKeyHandle
= NULL
;
662 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
666 if (!NT_SUCCESS(Status
))
669 Status
= SampRegOpenKey(AccountKeyHandle
,
673 if (!NT_SUCCESS(Status
))
676 Status
= SampRegQueryKeyInfo(NamesKeyHandle
,
680 if (NamesKeyHandle
!= NULL
)
681 SampRegCloseKey(NamesKeyHandle
);
683 if (AccountKeyHandle
!= NULL
)
684 SampRegCloseKey(AccountKeyHandle
);
691 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
692 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
694 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
695 SAM_DOMAIN_FIXED_DATA FixedData
;
701 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
702 if (InfoBuffer
== NULL
)
703 return STATUS_INSUFFICIENT_RESOURCES
;
705 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
706 Status
= SampGetObjectAttribute(DomainObject
,
711 if (!NT_SUCCESS(Status
))
714 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
715 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
716 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
717 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
718 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
719 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
720 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
722 /* Get the OemInformation string */
723 Status
= SampGetObjectAttributeString(DomainObject
,
725 &InfoBuffer
->General
.OemInformation
);
726 if (!NT_SUCCESS(Status
))
728 TRACE("Status 0x%08lx\n", Status
);
732 /* Get the Name string */
733 Status
= SampGetObjectAttributeString(DomainObject
,
735 &InfoBuffer
->General
.DomainName
);
736 if (!NT_SUCCESS(Status
))
738 TRACE("Status 0x%08lx\n", Status
);
742 /* Get the ReplicaSourceNodeName string */
743 Status
= SampGetObjectAttributeString(DomainObject
,
744 L
"ReplicaSourceNodeName",
745 &InfoBuffer
->General
.ReplicaSourceNodeName
);
746 if (!NT_SUCCESS(Status
))
748 TRACE("Status 0x%08lx\n", Status
);
752 /* Get the number of Users in the Domain */
753 Status
= SampGetNumberOfAccounts(DomainObject
,
755 &InfoBuffer
->General
.UserCount
);
756 if (!NT_SUCCESS(Status
))
758 TRACE("Status 0x%08lx\n", Status
);
762 /* Get the number of Groups in the Domain */
763 Status
= SampGetNumberOfAccounts(DomainObject
,
765 &InfoBuffer
->General
.GroupCount
);
766 if (!NT_SUCCESS(Status
))
768 TRACE("Status 0x%08lx\n", Status
);
772 /* Get the number of Aliases in the Domain */
773 Status
= SampGetNumberOfAccounts(DomainObject
,
775 &InfoBuffer
->General
.AliasCount
);
776 if (!NT_SUCCESS(Status
))
778 TRACE("Status 0x%08lx\n", Status
);
782 *Buffer
= InfoBuffer
;
785 if (!NT_SUCCESS(Status
))
787 if (InfoBuffer
!= NULL
)
789 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
790 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
792 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
793 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
795 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
796 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
798 midl_user_free(InfoBuffer
);
807 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
808 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
810 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
811 SAM_DOMAIN_FIXED_DATA FixedData
;
817 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
818 if (InfoBuffer
== NULL
)
819 return STATUS_INSUFFICIENT_RESOURCES
;
821 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
822 Status
= SampGetObjectAttribute(DomainObject
,
827 if (!NT_SUCCESS(Status
))
830 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
831 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
833 *Buffer
= InfoBuffer
;
836 if (!NT_SUCCESS(Status
))
838 if (InfoBuffer
!= NULL
)
840 midl_user_free(InfoBuffer
);
849 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
850 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
852 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
857 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
858 if (InfoBuffer
== NULL
)
859 return STATUS_INSUFFICIENT_RESOURCES
;
861 /* Get the OemInformation string */
862 Status
= SampGetObjectAttributeString(DomainObject
,
864 &InfoBuffer
->Oem
.OemInformation
);
865 if (!NT_SUCCESS(Status
))
867 TRACE("Status 0x%08lx\n", Status
);
871 *Buffer
= InfoBuffer
;
874 if (!NT_SUCCESS(Status
))
876 if (InfoBuffer
!= NULL
)
878 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
879 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
881 midl_user_free(InfoBuffer
);
890 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
891 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
893 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
898 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
899 if (InfoBuffer
== NULL
)
900 return STATUS_INSUFFICIENT_RESOURCES
;
902 /* Get the Name string */
903 Status
= SampGetObjectAttributeString(DomainObject
,
905 &InfoBuffer
->Name
.DomainName
);
906 if (!NT_SUCCESS(Status
))
908 TRACE("Status 0x%08lx\n", Status
);
912 *Buffer
= InfoBuffer
;
915 if (!NT_SUCCESS(Status
))
917 if (InfoBuffer
!= NULL
)
919 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
920 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
922 midl_user_free(InfoBuffer
);
931 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
932 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
934 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
939 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
940 if (InfoBuffer
== NULL
)
941 return STATUS_INSUFFICIENT_RESOURCES
;
943 /* Get the ReplicaSourceNodeName string */
944 Status
= SampGetObjectAttributeString(DomainObject
,
945 L
"ReplicaSourceNodeName",
946 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
947 if (!NT_SUCCESS(Status
))
949 TRACE("Status 0x%08lx\n", Status
);
953 *Buffer
= InfoBuffer
;
956 if (!NT_SUCCESS(Status
))
958 if (InfoBuffer
!= NULL
)
960 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
961 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
963 midl_user_free(InfoBuffer
);
972 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
973 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
975 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
976 SAM_DOMAIN_FIXED_DATA FixedData
;
982 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
983 if (InfoBuffer
== NULL
)
984 return STATUS_INSUFFICIENT_RESOURCES
;
986 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
987 Status
= SampGetObjectAttribute(DomainObject
,
992 if (!NT_SUCCESS(Status
))
995 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
997 *Buffer
= InfoBuffer
;
1000 if (!NT_SUCCESS(Status
))
1002 if (InfoBuffer
!= NULL
)
1004 midl_user_free(InfoBuffer
);
1013 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
1014 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1016 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1017 SAM_DOMAIN_FIXED_DATA FixedData
;
1023 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1024 if (InfoBuffer
== NULL
)
1025 return STATUS_INSUFFICIENT_RESOURCES
;
1027 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1028 Status
= SampGetObjectAttribute(DomainObject
,
1033 if (!NT_SUCCESS(Status
))
1036 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1037 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1038 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1039 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1041 *Buffer
= InfoBuffer
;
1044 if (!NT_SUCCESS(Status
))
1046 if (InfoBuffer
!= NULL
)
1048 midl_user_free(InfoBuffer
);
1057 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1058 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1060 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1061 SAM_DOMAIN_FIXED_DATA FixedData
;
1067 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1068 if (InfoBuffer
== NULL
)
1069 return STATUS_INSUFFICIENT_RESOURCES
;
1071 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1072 Status
= SampGetObjectAttribute(DomainObject
,
1077 if (!NT_SUCCESS(Status
))
1080 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1082 *Buffer
= InfoBuffer
;
1085 if (!NT_SUCCESS(Status
))
1087 if (InfoBuffer
!= NULL
)
1089 midl_user_free(InfoBuffer
);
1098 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1099 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1101 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1102 SAM_DOMAIN_FIXED_DATA FixedData
;
1108 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1109 if (InfoBuffer
== NULL
)
1110 return STATUS_INSUFFICIENT_RESOURCES
;
1112 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1113 Status
= SampGetObjectAttribute(DomainObject
,
1118 if (!NT_SUCCESS(Status
))
1121 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1122 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1123 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1124 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1125 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1126 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1127 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1129 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1130 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1131 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1133 /* Get the OemInformation string */
1134 Status
= SampGetObjectAttributeString(DomainObject
,
1136 &InfoBuffer
->General2
.I1
.OemInformation
);
1137 if (!NT_SUCCESS(Status
))
1139 TRACE("Status 0x%08lx\n", Status
);
1143 /* Get the Name string */
1144 Status
= SampGetObjectAttributeString(DomainObject
,
1146 &InfoBuffer
->General2
.I1
.DomainName
);
1147 if (!NT_SUCCESS(Status
))
1149 TRACE("Status 0x%08lx\n", Status
);
1153 /* Get the ReplicaSourceNodeName string */
1154 Status
= SampGetObjectAttributeString(DomainObject
,
1155 L
"ReplicaSourceNodeName",
1156 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1157 if (!NT_SUCCESS(Status
))
1159 TRACE("Status 0x%08lx\n", Status
);
1163 /* Get the number of Users in the Domain */
1164 Status
= SampGetNumberOfAccounts(DomainObject
,
1166 &InfoBuffer
->General2
.I1
.UserCount
);
1167 if (!NT_SUCCESS(Status
))
1169 TRACE("Status 0x%08lx\n", Status
);
1173 /* Get the number of Groups in the Domain */
1174 Status
= SampGetNumberOfAccounts(DomainObject
,
1176 &InfoBuffer
->General2
.I1
.GroupCount
);
1177 if (!NT_SUCCESS(Status
))
1179 TRACE("Status 0x%08lx\n", Status
);
1183 /* Get the number of Aliases in the Domain */
1184 Status
= SampGetNumberOfAccounts(DomainObject
,
1186 &InfoBuffer
->General2
.I1
.AliasCount
);
1187 if (!NT_SUCCESS(Status
))
1189 TRACE("Status 0x%08lx\n", Status
);
1193 *Buffer
= InfoBuffer
;
1196 if (!NT_SUCCESS(Status
))
1198 if (InfoBuffer
!= NULL
)
1200 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1201 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1203 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1204 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1206 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1207 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1209 midl_user_free(InfoBuffer
);
1218 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1219 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1221 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1222 SAM_DOMAIN_FIXED_DATA FixedData
;
1228 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1229 if (InfoBuffer
== NULL
)
1230 return STATUS_INSUFFICIENT_RESOURCES
;
1232 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1233 Status
= SampGetObjectAttribute(DomainObject
,
1238 if (!NT_SUCCESS(Status
))
1241 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1242 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1243 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1245 *Buffer
= InfoBuffer
;
1248 if (!NT_SUCCESS(Status
))
1250 if (InfoBuffer
!= NULL
)
1252 midl_user_free(InfoBuffer
);
1261 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1262 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1264 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1265 SAM_DOMAIN_FIXED_DATA FixedData
;
1271 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1272 if (InfoBuffer
== NULL
)
1273 return STATUS_INSUFFICIENT_RESOURCES
;
1275 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1276 Status
= SampGetObjectAttribute(DomainObject
,
1281 if (!NT_SUCCESS(Status
))
1284 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1285 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1286 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1287 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1288 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1289 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1291 *Buffer
= InfoBuffer
;
1294 if (!NT_SUCCESS(Status
))
1296 if (InfoBuffer
!= NULL
)
1298 midl_user_free(InfoBuffer
);
1309 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1310 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1311 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1313 PSAM_DB_OBJECT DomainObject
;
1314 ACCESS_MASK DesiredAccess
;
1317 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1318 DomainHandle
, DomainInformationClass
, Buffer
);
1320 switch (DomainInformationClass
)
1322 case DomainPasswordInformation
:
1323 case DomainLockoutInformation
:
1324 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1327 case DomainGeneralInformation
:
1328 case DomainLogoffInformation
:
1329 case DomainOemInformation
:
1330 case DomainNameInformation
:
1331 case DomainReplicationInformation
:
1332 case DomainServerRoleInformation
:
1333 case DomainModifiedInformation
:
1334 case DomainStateInformation
:
1335 case DomainModifiedInformation2
:
1336 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1339 case DomainGeneralInformation2
:
1340 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1341 DOMAIN_READ_OTHER_PARAMETERS
;
1345 return STATUS_INVALID_INFO_CLASS
;
1348 /* Validate the server handle */
1349 Status
= SampValidateDbObject(DomainHandle
,
1353 if (!NT_SUCCESS(Status
))
1356 switch (DomainInformationClass
)
1358 case DomainPasswordInformation
:
1359 Status
= SampQueryDomainPassword(DomainObject
,
1363 case DomainGeneralInformation
:
1364 Status
= SampQueryDomainGeneral(DomainObject
,
1368 case DomainLogoffInformation
:
1369 Status
= SampQueryDomainLogoff(DomainObject
,
1373 case DomainOemInformation
:
1374 Status
= SampQueryDomainOem(DomainObject
,
1378 case DomainNameInformation
:
1379 Status
= SampQueryDomainName(DomainObject
,
1383 case DomainReplicationInformation
:
1384 Status
= SampQueryDomainReplication(DomainObject
,
1388 case DomainServerRoleInformation
:
1389 Status
= SampQueryDomainServerRole(DomainObject
,
1393 case DomainModifiedInformation
:
1394 Status
= SampQueryDomainModified(DomainObject
,
1398 case DomainStateInformation
:
1399 Status
= SampQueryDomainState(DomainObject
,
1403 case DomainGeneralInformation2
:
1404 Status
= SampQueryDomainGeneral2(DomainObject
,
1408 case DomainLockoutInformation
:
1409 Status
= SampQueryDomainLockout(DomainObject
,
1413 case DomainModifiedInformation2
:
1414 Status
= SampQueryDomainModified2(DomainObject
,
1419 Status
= STATUS_NOT_IMPLEMENTED
;
1427 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1428 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1430 SAM_DOMAIN_FIXED_DATA FixedData
;
1434 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1435 Status
= SampGetObjectAttribute(DomainObject
,
1440 if (!NT_SUCCESS(Status
))
1443 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1444 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1445 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1446 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1447 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1448 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1449 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1451 Status
= SampSetObjectAttribute(DomainObject
,
1463 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1464 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1466 SAM_DOMAIN_FIXED_DATA FixedData
;
1470 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1471 Status
= SampGetObjectAttribute(DomainObject
,
1476 if (!NT_SUCCESS(Status
))
1479 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1480 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1482 Status
= SampSetObjectAttribute(DomainObject
,
1494 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1495 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1497 SAM_DOMAIN_FIXED_DATA FixedData
;
1501 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1502 Status
= SampGetObjectAttribute(DomainObject
,
1507 if (!NT_SUCCESS(Status
))
1510 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1512 Status
= SampSetObjectAttribute(DomainObject
,
1524 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1525 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1527 SAM_DOMAIN_FIXED_DATA FixedData
;
1531 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1532 Status
= SampGetObjectAttribute(DomainObject
,
1537 if (!NT_SUCCESS(Status
))
1540 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1542 Status
= SampSetObjectAttribute(DomainObject
,
1554 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1555 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1557 SAM_DOMAIN_FIXED_DATA FixedData
;
1561 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1562 Status
= SampGetObjectAttribute(DomainObject
,
1567 if (!NT_SUCCESS(Status
))
1570 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1571 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1572 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1574 Status
= SampSetObjectAttribute(DomainObject
,
1588 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1589 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1590 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1592 PSAM_DB_OBJECT DomainObject
;
1593 ACCESS_MASK DesiredAccess
;
1596 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1597 DomainHandle
, DomainInformationClass
, DomainInformation
);
1599 switch (DomainInformationClass
)
1601 case DomainPasswordInformation
:
1602 case DomainLockoutInformation
:
1603 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1606 case DomainLogoffInformation
:
1607 case DomainOemInformation
:
1608 case DomainNameInformation
:
1609 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1612 case DomainReplicationInformation
:
1613 case DomainServerRoleInformation
:
1614 case DomainStateInformation
:
1615 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1619 return STATUS_INVALID_INFO_CLASS
;
1622 /* Validate the server handle */
1623 Status
= SampValidateDbObject(DomainHandle
,
1627 if (!NT_SUCCESS(Status
))
1630 switch (DomainInformationClass
)
1632 case DomainPasswordInformation
:
1633 Status
= SampSetDomainPassword(DomainObject
,
1637 case DomainLogoffInformation
:
1638 Status
= SampSetDomainLogoff(DomainObject
,
1642 case DomainOemInformation
:
1643 Status
= SampSetObjectAttribute(DomainObject
,
1646 DomainInformation
->Oem
.OemInformation
.Buffer
,
1647 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1650 case DomainNameInformation
:
1651 Status
= SampSetObjectAttribute(DomainObject
,
1654 DomainInformation
->Name
.DomainName
.Buffer
,
1655 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1658 case DomainReplicationInformation
:
1659 Status
= SampSetObjectAttribute(DomainObject
,
1660 L
"ReplicaSourceNodeName",
1662 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1663 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1666 case DomainServerRoleInformation
:
1667 Status
= SampSetDomainServerRole(DomainObject
,
1671 case DomainStateInformation
:
1672 Status
= SampSetDomainState(DomainObject
,
1676 case DomainLockoutInformation
:
1677 Status
= SampSetDomainLockout(DomainObject
,
1682 Status
= STATUS_NOT_IMPLEMENTED
;
1692 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1693 IN PRPC_UNICODE_STRING Name
,
1694 IN ACCESS_MASK DesiredAccess
,
1695 OUT SAMPR_HANDLE
*GroupHandle
,
1696 OUT
unsigned long *RelativeId
)
1698 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1699 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1700 SAM_GROUP_FIXED_DATA FixedGroupData
;
1701 PSAM_DB_OBJECT DomainObject
;
1702 PSAM_DB_OBJECT GroupObject
;
1708 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1709 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1711 /* Map generic access rights */
1712 RtlMapGenericMask(&DesiredAccess
,
1715 /* Validate the domain handle */
1716 Status
= SampValidateDbObject(DomainHandle
,
1718 DOMAIN_CREATE_GROUP
,
1720 if (!NT_SUCCESS(Status
))
1722 TRACE("failed with status 0x%08lx\n", Status
);
1726 /* Check if the group name already exists in the domain */
1727 Status
= SampCheckAccountNameInDomain(DomainObject
,
1729 if (!NT_SUCCESS(Status
))
1731 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1732 Name
->Buffer
, Status
);
1736 /* Get the fixed domain attributes */
1737 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1738 Status
= SampGetObjectAttribute(DomainObject
,
1741 (PVOID
)&FixedDomainData
,
1743 if (!NT_SUCCESS(Status
))
1745 TRACE("failed with status 0x%08lx\n", Status
);
1749 /* Increment the NextRid attribute */
1750 ulRid
= FixedDomainData
.NextRid
;
1751 FixedDomainData
.NextRid
++;
1753 /* Store the fixed domain attributes */
1754 Status
= SampSetObjectAttribute(DomainObject
,
1759 if (!NT_SUCCESS(Status
))
1761 TRACE("failed with status 0x%08lx\n", Status
);
1765 TRACE("RID: %lx\n", ulRid
);
1767 /* Convert the RID into a string (hex) */
1768 swprintf(szRid
, L
"%08lX", ulRid
);
1770 /* Create the group object */
1771 Status
= SampCreateDbObject(DomainObject
,
1778 if (!NT_SUCCESS(Status
))
1780 TRACE("failed with status 0x%08lx\n", Status
);
1784 /* Add the account name of the user object */
1785 Status
= SampSetAccountNameInDomain(DomainObject
,
1789 if (!NT_SUCCESS(Status
))
1791 TRACE("failed with status 0x%08lx\n", Status
);
1795 /* Initialize fixed user data */
1796 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1797 FixedGroupData
.Version
= 1;
1799 FixedGroupData
.GroupId
= ulRid
;
1801 /* Set fixed user data attribute */
1802 Status
= SampSetObjectAttribute(GroupObject
,
1805 (LPVOID
)&FixedGroupData
,
1806 sizeof(SAM_GROUP_FIXED_DATA
));
1807 if (!NT_SUCCESS(Status
))
1809 TRACE("failed with status 0x%08lx\n", Status
);
1813 /* Set the Name attribute */
1814 Status
= SampSetObjectAttribute(GroupObject
,
1817 (LPVOID
)Name
->Buffer
,
1818 Name
->MaximumLength
);
1819 if (!NT_SUCCESS(Status
))
1821 TRACE("failed with status 0x%08lx\n", Status
);
1825 /* Set the AdminComment attribute */
1826 Status
= SampSetObjectAttribute(GroupObject
,
1830 EmptyString
.MaximumLength
);
1831 if (!NT_SUCCESS(Status
))
1833 TRACE("failed with status 0x%08lx\n", Status
);
1837 if (NT_SUCCESS(Status
))
1839 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1840 *RelativeId
= ulRid
;
1843 TRACE("returns with status 0x%08lx\n", Status
);
1852 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1853 IN OUT
unsigned long *EnumerationContext
,
1854 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1855 IN
unsigned long PreferedMaximumLength
,
1856 OUT
unsigned long *CountReturned
)
1858 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1859 PSAM_DB_OBJECT DomainObject
;
1860 HANDLE GroupsKeyHandle
= NULL
;
1861 HANDLE NamesKeyHandle
= NULL
;
1862 WCHAR GroupName
[64];
1864 ULONG EnumCount
= 0;
1865 ULONG RequiredLength
= 0;
1870 BOOLEAN MoreEntries
= FALSE
;
1873 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1874 DomainHandle
, EnumerationContext
, Buffer
,
1875 PreferedMaximumLength
, CountReturned
);
1877 /* Validate the domain handle */
1878 Status
= SampValidateDbObject(DomainHandle
,
1880 DOMAIN_LIST_ACCOUNTS
,
1882 if (!NT_SUCCESS(Status
))
1885 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1889 if (!NT_SUCCESS(Status
))
1892 Status
= SampRegOpenKey(GroupsKeyHandle
,
1896 if (!NT_SUCCESS(Status
))
1901 EnumIndex
= *EnumerationContext
;
1905 NameLength
= 64 * sizeof(WCHAR
);
1906 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1913 if (!NT_SUCCESS(Status
))
1915 if (Status
== STATUS_NO_MORE_ENTRIES
)
1916 Status
= STATUS_SUCCESS
;
1920 TRACE("EnumIndex: %lu\n", EnumIndex
);
1921 TRACE("Group name: %S\n", GroupName
);
1922 TRACE("Name length: %lu\n", NameLength
);
1924 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
1930 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
1936 TRACE("EnumCount: %lu\n", EnumCount
);
1937 TRACE("RequiredLength: %lu\n", RequiredLength
);
1939 if (!NT_SUCCESS(Status
))
1942 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
1943 if (EnumBuffer
== NULL
)
1945 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1949 EnumBuffer
->EntriesRead
= EnumCount
;
1953 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
1954 if (EnumBuffer
->Buffer
== NULL
)
1956 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1962 EnumIndex
= *EnumerationContext
;
1963 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
1965 NameLength
= 64 * sizeof(WCHAR
);
1966 DataLength
= sizeof(ULONG
);
1967 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1974 if (!NT_SUCCESS(Status
))
1976 if (Status
== STATUS_NO_MORE_ENTRIES
)
1977 Status
= STATUS_SUCCESS
;
1981 TRACE("EnumIndex: %lu\n", EnumIndex
);
1982 TRACE("Group name: %S\n", GroupName
);
1983 TRACE("Name length: %lu\n", NameLength
);
1984 TRACE("RID: %lu\n", Rid
);
1986 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
1988 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
1989 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
1991 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
1993 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
1994 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
1996 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2000 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2002 EnumBuffer
->Buffer
[i
].Name
.Length
);
2007 if (NT_SUCCESS(Status
))
2009 *EnumerationContext
+= EnumCount
;
2010 *Buffer
= EnumBuffer
;
2011 *CountReturned
= EnumCount
;
2015 *EnumerationContext
= 0;
2019 if (EnumBuffer
!= NULL
)
2021 if (EnumBuffer
->Buffer
!= NULL
)
2023 if (EnumBuffer
->EntriesRead
!= 0)
2025 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2027 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2028 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2032 midl_user_free(EnumBuffer
->Buffer
);
2035 midl_user_free(EnumBuffer
);
2039 if (NamesKeyHandle
!= NULL
)
2040 SampRegCloseKey(NamesKeyHandle
);
2042 if (GroupsKeyHandle
!= NULL
)
2043 SampRegCloseKey(GroupsKeyHandle
);
2045 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2046 Status
= STATUS_MORE_ENTRIES
;
2055 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
2056 IN PRPC_UNICODE_STRING Name
,
2057 IN ACCESS_MASK DesiredAccess
,
2058 OUT SAMPR_HANDLE
*UserHandle
,
2059 OUT
unsigned long *RelativeId
)
2061 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2062 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2063 SAM_USER_FIXED_DATA FixedUserData
;
2064 PSAM_DB_OBJECT DomainObject
;
2065 PSAM_DB_OBJECT UserObject
;
2071 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2072 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2075 Name
->Length
== 0 ||
2076 Name
->Buffer
== NULL
||
2077 UserHandle
== NULL
||
2079 return STATUS_INVALID_PARAMETER
;
2081 /* Map generic access rights */
2082 RtlMapGenericMask(&DesiredAccess
,
2085 /* Validate the domain handle */
2086 Status
= SampValidateDbObject(DomainHandle
,
2090 if (!NT_SUCCESS(Status
))
2092 TRACE("failed with status 0x%08lx\n", Status
);
2096 /* Check if the user name already exists in the domain */
2097 Status
= SampCheckAccountNameInDomain(DomainObject
,
2099 if (!NT_SUCCESS(Status
))
2101 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2102 Name
->Buffer
, Status
);
2106 /* Get the fixed domain attributes */
2107 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2108 Status
= SampGetObjectAttribute(DomainObject
,
2111 (PVOID
)&FixedDomainData
,
2113 if (!NT_SUCCESS(Status
))
2115 TRACE("failed with status 0x%08lx\n", Status
);
2119 /* Increment the NextRid attribute */
2120 ulRid
= FixedDomainData
.NextRid
;
2121 FixedDomainData
.NextRid
++;
2123 /* Store the fixed domain attributes */
2124 Status
= SampSetObjectAttribute(DomainObject
,
2129 if (!NT_SUCCESS(Status
))
2131 TRACE("failed with status 0x%08lx\n", Status
);
2135 TRACE("RID: %lx\n", ulRid
);
2137 /* Convert the RID into a string (hex) */
2138 swprintf(szRid
, L
"%08lX", ulRid
);
2140 /* Create the user object */
2141 Status
= SampCreateDbObject(DomainObject
,
2148 if (!NT_SUCCESS(Status
))
2150 TRACE("failed with status 0x%08lx\n", Status
);
2154 /* Add the account name for the user object */
2155 Status
= SampSetAccountNameInDomain(DomainObject
,
2159 if (!NT_SUCCESS(Status
))
2161 TRACE("failed with status 0x%08lx\n", Status
);
2165 /* Initialize fixed user data */
2166 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2167 FixedUserData
.Version
= 1;
2168 FixedUserData
.LastLogon
.QuadPart
= 0;
2169 FixedUserData
.LastLogoff
.QuadPart
= 0;
2170 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2171 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2172 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2173 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2174 FixedUserData
.UserId
= ulRid
;
2175 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2176 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2177 USER_PASSWORD_NOT_REQUIRED
|
2178 USER_NORMAL_ACCOUNT
;
2180 /* Set fixed user data attribute */
2181 Status
= SampSetObjectAttribute(UserObject
,
2184 (LPVOID
)&FixedUserData
,
2185 sizeof(SAM_USER_FIXED_DATA
));
2186 if (!NT_SUCCESS(Status
))
2188 TRACE("failed with status 0x%08lx\n", Status
);
2192 /* Set the Name attribute */
2193 Status
= SampSetObjectAttribute(UserObject
,
2196 (LPVOID
)Name
->Buffer
,
2197 Name
->MaximumLength
);
2198 if (!NT_SUCCESS(Status
))
2200 TRACE("failed with status 0x%08lx\n", Status
);
2204 /* Set the FullName attribute */
2205 Status
= SampSetObjectAttribute(UserObject
,
2209 EmptyString
.MaximumLength
);
2210 if (!NT_SUCCESS(Status
))
2212 TRACE("failed with status 0x%08lx\n", Status
);
2216 /* Set the HomeDirectory attribute */
2217 Status
= SampSetObjectAttribute(UserObject
,
2221 EmptyString
.MaximumLength
);
2222 if (!NT_SUCCESS(Status
))
2224 TRACE("failed with status 0x%08lx\n", Status
);
2228 /* Set the HomeDirectoryDrive attribute */
2229 Status
= SampSetObjectAttribute(UserObject
,
2230 L
"HomeDirectoryDrive",
2233 EmptyString
.MaximumLength
);
2234 if (!NT_SUCCESS(Status
))
2236 TRACE("failed with status 0x%08lx\n", Status
);
2240 /* Set the ScriptPath attribute */
2241 Status
= SampSetObjectAttribute(UserObject
,
2245 EmptyString
.MaximumLength
);
2246 if (!NT_SUCCESS(Status
))
2248 TRACE("failed with status 0x%08lx\n", Status
);
2252 /* Set the ProfilePath attribute */
2253 Status
= SampSetObjectAttribute(UserObject
,
2257 EmptyString
.MaximumLength
);
2258 if (!NT_SUCCESS(Status
))
2260 TRACE("failed with status 0x%08lx\n", Status
);
2264 /* Set the AdminComment attribute */
2265 Status
= SampSetObjectAttribute(UserObject
,
2269 EmptyString
.MaximumLength
);
2270 if (!NT_SUCCESS(Status
))
2272 TRACE("failed with status 0x%08lx\n", Status
);
2276 /* Set the UserComment attribute */
2277 Status
= SampSetObjectAttribute(UserObject
,
2281 EmptyString
.MaximumLength
);
2282 if (!NT_SUCCESS(Status
))
2284 TRACE("failed with status 0x%08lx\n", Status
);
2288 /* Set the WorkStations attribute */
2289 Status
= SampSetObjectAttribute(UserObject
,
2293 EmptyString
.MaximumLength
);
2294 if (!NT_SUCCESS(Status
))
2296 TRACE("failed with status 0x%08lx\n", Status
);
2300 /* Set the Parameters attribute */
2301 Status
= SampSetObjectAttribute(UserObject
,
2305 EmptyString
.MaximumLength
);
2306 if (!NT_SUCCESS(Status
))
2308 TRACE("failed with status 0x%08lx\n", Status
);
2312 /* FIXME: Set default user attributes */
2314 if (NT_SUCCESS(Status
))
2316 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2317 *RelativeId
= ulRid
;
2320 TRACE("returns with status 0x%08lx\n", Status
);
2329 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2330 IN OUT
unsigned long *EnumerationContext
,
2331 IN
unsigned long UserAccountControl
,
2332 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2333 IN
unsigned long PreferedMaximumLength
,
2334 OUT
unsigned long *CountReturned
)
2336 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2337 PSAM_DB_OBJECT DomainObject
;
2338 HANDLE UsersKeyHandle
= NULL
;
2339 HANDLE NamesKeyHandle
= NULL
;
2342 ULONG EnumCount
= 0;
2343 ULONG RequiredLength
= 0;
2348 BOOLEAN MoreEntries
= FALSE
;
2351 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2352 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2353 PreferedMaximumLength
, CountReturned
);
2355 /* Validate the domain handle */
2356 Status
= SampValidateDbObject(DomainHandle
,
2358 DOMAIN_LIST_ACCOUNTS
,
2360 if (!NT_SUCCESS(Status
))
2363 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2367 if (!NT_SUCCESS(Status
))
2370 Status
= SampRegOpenKey(UsersKeyHandle
,
2374 if (!NT_SUCCESS(Status
))
2379 EnumIndex
= *EnumerationContext
;
2383 NameLength
= 64 * sizeof(WCHAR
);
2384 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2391 if (!NT_SUCCESS(Status
))
2393 if (Status
== STATUS_NO_MORE_ENTRIES
)
2394 Status
= STATUS_SUCCESS
;
2398 TRACE("EnumIndex: %lu\n", EnumIndex
);
2399 TRACE("User name: %S\n", UserName
);
2400 TRACE("Name length: %lu\n", NameLength
);
2402 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2408 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2414 TRACE("EnumCount: %lu\n", EnumCount
);
2415 TRACE("RequiredLength: %lu\n", RequiredLength
);
2417 if (!NT_SUCCESS(Status
))
2420 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2421 if (EnumBuffer
== NULL
)
2423 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2427 EnumBuffer
->EntriesRead
= EnumCount
;
2431 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2432 if (EnumBuffer
->Buffer
== NULL
)
2434 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2440 EnumIndex
= *EnumerationContext
;
2441 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2443 NameLength
= 64 * sizeof(WCHAR
);
2444 DataLength
= sizeof(ULONG
);
2445 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2452 if (!NT_SUCCESS(Status
))
2454 if (Status
== STATUS_NO_MORE_ENTRIES
)
2455 Status
= STATUS_SUCCESS
;
2459 TRACE("EnumIndex: %lu\n", EnumIndex
);
2460 TRACE("User name: %S\n", UserName
);
2461 TRACE("Name length: %lu\n", NameLength
);
2462 TRACE("RID: %lu\n", Rid
);
2464 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2466 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2467 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2469 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2471 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2472 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2474 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2478 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2480 EnumBuffer
->Buffer
[i
].Name
.Length
);
2485 if (NT_SUCCESS(Status
))
2487 *EnumerationContext
+= EnumCount
;
2488 *Buffer
= EnumBuffer
;
2489 *CountReturned
= EnumCount
;
2493 *EnumerationContext
= 0;
2497 if (EnumBuffer
!= NULL
)
2499 if (EnumBuffer
->Buffer
!= NULL
)
2501 if (EnumBuffer
->EntriesRead
!= 0)
2503 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2505 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2506 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2510 midl_user_free(EnumBuffer
->Buffer
);
2513 midl_user_free(EnumBuffer
);
2517 if (NamesKeyHandle
!= NULL
)
2518 SampRegCloseKey(NamesKeyHandle
);
2520 if (UsersKeyHandle
!= NULL
)
2521 SampRegCloseKey(UsersKeyHandle
);
2523 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2524 Status
= STATUS_MORE_ENTRIES
;
2533 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2534 IN PRPC_UNICODE_STRING AccountName
,
2535 IN ACCESS_MASK DesiredAccess
,
2536 OUT SAMPR_HANDLE
*AliasHandle
,
2537 OUT
unsigned long *RelativeId
)
2539 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2540 PSAM_DB_OBJECT DomainObject
;
2541 PSAM_DB_OBJECT AliasObject
;
2542 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2548 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2549 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2551 /* Map generic access rights */
2552 RtlMapGenericMask(&DesiredAccess
,
2555 /* Validate the domain handle */
2556 Status
= SampValidateDbObject(DomainHandle
,
2558 DOMAIN_CREATE_ALIAS
,
2560 if (!NT_SUCCESS(Status
))
2562 TRACE("failed with status 0x%08lx\n", Status
);
2566 /* Check if the alias name already exists in the domain */
2567 Status
= SampCheckAccountNameInDomain(DomainObject
,
2568 AccountName
->Buffer
);
2569 if (!NT_SUCCESS(Status
))
2571 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2572 AccountName
->Buffer
, Status
);
2576 /* Get the fixed domain attributes */
2577 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2578 Status
= SampGetObjectAttribute(DomainObject
,
2581 (PVOID
)&FixedDomainData
,
2583 if (!NT_SUCCESS(Status
))
2585 TRACE("failed with status 0x%08lx\n", Status
);
2589 /* Increment the NextRid attribute */
2590 ulRid
= FixedDomainData
.NextRid
;
2591 FixedDomainData
.NextRid
++;
2593 /* Store the fixed domain attributes */
2594 Status
= SampSetObjectAttribute(DomainObject
,
2599 if (!NT_SUCCESS(Status
))
2601 TRACE("failed with status 0x%08lx\n", Status
);
2605 TRACE("RID: %lx\n", ulRid
);
2607 /* Convert the RID into a string (hex) */
2608 swprintf(szRid
, L
"%08lX", ulRid
);
2610 /* Create the alias object */
2611 Status
= SampCreateDbObject(DomainObject
,
2618 if (!NT_SUCCESS(Status
))
2620 TRACE("failed with status 0x%08lx\n", Status
);
2624 /* Add the account name for the alias object */
2625 Status
= SampSetAccountNameInDomain(DomainObject
,
2627 AccountName
->Buffer
,
2629 if (!NT_SUCCESS(Status
))
2631 TRACE("failed with status 0x%08lx\n", Status
);
2635 /* Set the Name attribute */
2636 Status
= SampSetObjectAttribute(AliasObject
,
2639 (LPVOID
)AccountName
->Buffer
,
2640 AccountName
->MaximumLength
);
2641 if (!NT_SUCCESS(Status
))
2643 TRACE("failed with status 0x%08lx\n", Status
);
2647 /* Set the Description attribute */
2648 Status
= SampSetObjectAttribute(AliasObject
,
2652 EmptyString
.MaximumLength
);
2653 if (!NT_SUCCESS(Status
))
2655 TRACE("failed with status 0x%08lx\n", Status
);
2659 if (NT_SUCCESS(Status
))
2661 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2662 *RelativeId
= ulRid
;
2665 TRACE("returns with status 0x%08lx\n", Status
);
2674 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2675 IN OUT
unsigned long *EnumerationContext
,
2676 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2677 IN
unsigned long PreferedMaximumLength
,
2678 OUT
unsigned long *CountReturned
)
2680 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2681 PSAM_DB_OBJECT DomainObject
;
2682 HANDLE AliasesKeyHandle
= NULL
;
2683 HANDLE NamesKeyHandle
= NULL
;
2684 WCHAR AliasName
[64];
2686 ULONG EnumCount
= 0;
2687 ULONG RequiredLength
= 0;
2692 BOOLEAN MoreEntries
= FALSE
;
2695 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2696 DomainHandle
, EnumerationContext
, Buffer
,
2697 PreferedMaximumLength
, CountReturned
);
2699 /* Validate the domain handle */
2700 Status
= SampValidateDbObject(DomainHandle
,
2702 DOMAIN_LIST_ACCOUNTS
,
2704 if (!NT_SUCCESS(Status
))
2707 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2711 if (!NT_SUCCESS(Status
))
2714 Status
= SampRegOpenKey(AliasesKeyHandle
,
2718 if (!NT_SUCCESS(Status
))
2723 EnumIndex
= *EnumerationContext
;
2727 NameLength
= 64 * sizeof(WCHAR
);
2728 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2735 if (!NT_SUCCESS(Status
))
2737 if (Status
== STATUS_NO_MORE_ENTRIES
)
2738 Status
= STATUS_SUCCESS
;
2742 TRACE("EnumIndex: %lu\n", EnumIndex
);
2743 TRACE("Alias name: %S\n", AliasName
);
2744 TRACE("Name length: %lu\n", NameLength
);
2746 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2752 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2758 TRACE("EnumCount: %lu\n", EnumCount
);
2759 TRACE("RequiredLength: %lu\n", RequiredLength
);
2761 if (!NT_SUCCESS(Status
))
2764 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2765 if (EnumBuffer
== NULL
)
2767 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2771 EnumBuffer
->EntriesRead
= EnumCount
;
2775 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2776 if (EnumBuffer
->Buffer
== NULL
)
2778 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2784 EnumIndex
= *EnumerationContext
;
2785 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2787 NameLength
= 64 * sizeof(WCHAR
);
2788 DataLength
= sizeof(ULONG
);
2789 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2796 if (!NT_SUCCESS(Status
))
2798 if (Status
== STATUS_NO_MORE_ENTRIES
)
2799 Status
= STATUS_SUCCESS
;
2803 TRACE("EnumIndex: %lu\n", EnumIndex
);
2804 TRACE("Alias name: %S\n", AliasName
);
2805 TRACE("Name length: %lu\n", NameLength
);
2806 TRACE("RID: %lu\n", Rid
);
2808 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2810 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2811 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2813 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2815 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2816 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2818 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2822 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2824 EnumBuffer
->Buffer
[i
].Name
.Length
);
2829 if (NT_SUCCESS(Status
))
2831 *EnumerationContext
+= EnumCount
;
2832 *Buffer
= EnumBuffer
;
2833 *CountReturned
= EnumCount
;
2837 *EnumerationContext
= 0;
2841 if (EnumBuffer
!= NULL
)
2843 if (EnumBuffer
->Buffer
!= NULL
)
2845 if (EnumBuffer
->EntriesRead
!= 0)
2847 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2849 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2850 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2854 midl_user_free(EnumBuffer
->Buffer
);
2857 midl_user_free(EnumBuffer
);
2861 if (NamesKeyHandle
!= NULL
)
2862 SampRegCloseKey(NamesKeyHandle
);
2864 if (AliasesKeyHandle
!= NULL
)
2865 SampRegCloseKey(AliasesKeyHandle
);
2867 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2868 Status
= STATUS_MORE_ENTRIES
;
2877 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2878 IN PSAMPR_PSID_ARRAY SidArray
,
2879 OUT PSAMPR_ULONG_ARRAY Membership
)
2881 PSAM_DB_OBJECT DomainObject
;
2882 HANDLE AliasesKeyHandle
= NULL
;
2883 HANDLE MembersKeyHandle
= NULL
;
2884 HANDLE MemberKeyHandle
= NULL
;
2885 LPWSTR MemberSidString
= NULL
;
2886 PULONG RidArray
= NULL
;
2887 ULONG MaxSidCount
= 0;
2892 WCHAR NameBuffer
[9];
2894 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2895 DomainHandle
, SidArray
, Membership
);
2897 /* Validate the domain handle */
2898 Status
= SampValidateDbObject(DomainHandle
,
2900 DOMAIN_GET_ALIAS_MEMBERSHIP
,
2902 if (!NT_SUCCESS(Status
))
2905 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2909 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2910 if (!NT_SUCCESS(Status
))
2913 Status
= SampRegOpenKey(AliasesKeyHandle
,
2917 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2919 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
2921 Status
= STATUS_SUCCESS
;
2925 if (!NT_SUCCESS(Status
))
2928 for (i
= 0; i
< SidArray
->Count
; i
++)
2930 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2931 TRACE("Open %S\n", MemberSidString
);
2933 Status
= SampRegOpenKey(MembersKeyHandle
,
2937 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2938 if (NT_SUCCESS(Status
))
2940 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2943 if (NT_SUCCESS(Status
))
2945 TRACE("Found %lu values\n", ValueCount
);
2946 MaxSidCount
+= ValueCount
;
2949 NtClose(MemberKeyHandle
);
2952 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
2953 Status
= STATUS_SUCCESS
;
2955 LocalFree(MemberSidString
);
2958 if (MaxSidCount
== 0)
2960 Status
= STATUS_SUCCESS
;
2964 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
2965 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
2966 if (RidArray
== NULL
)
2968 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2972 for (i
= 0; i
< SidArray
->Count
; i
++)
2974 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2975 TRACE("Open %S\n", MemberSidString
);
2977 Status
= SampRegOpenKey(MembersKeyHandle
,
2981 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2982 if (NT_SUCCESS(Status
))
2984 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2987 if (NT_SUCCESS(Status
))
2989 TRACE("Found %lu values\n", ValueCount
);
2991 for (j
= 0; j
< ValueCount
; j
++)
2993 DataLength
= 9 * sizeof(WCHAR
);
2994 Status
= SampRegEnumerateValue(MemberKeyHandle
,
3001 if (NT_SUCCESS(Status
))
3003 RidArray
[j
] = wcstoul(NameBuffer
, NULL
, 16);
3008 NtClose(MemberKeyHandle
);
3011 LocalFree(MemberSidString
);
3015 if (NT_SUCCESS(Status
))
3017 Membership
->Count
= MaxSidCount
;
3018 Membership
->Element
= RidArray
;
3022 if (RidArray
!= NULL
)
3023 midl_user_free(RidArray
);
3026 if (MembersKeyHandle
!= NULL
)
3027 NtClose(MembersKeyHandle
);
3029 if (MembersKeyHandle
!= NULL
)
3030 NtClose(MembersKeyHandle
);
3032 if (AliasesKeyHandle
!= NULL
)
3033 NtClose(AliasesKeyHandle
);
3042 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
3044 IN RPC_UNICODE_STRING Names
[],
3045 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
3046 OUT PSAMPR_ULONG_ARRAY Use
)
3048 PSAM_DB_OBJECT DomainObject
;
3049 HANDLE AccountsKeyHandle
;
3050 HANDLE NamesKeyHandle
;
3051 ULONG MappedCount
= 0;
3057 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
3058 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
3060 /* Validate the domain handle */
3061 Status
= SampValidateDbObject(DomainHandle
,
3065 if (!NT_SUCCESS(Status
))
3067 TRACE("failed with status 0x%08lx\n", Status
);
3071 RelativeIds
->Count
= 0;
3075 return STATUS_SUCCESS
;
3077 /* Allocate the relative IDs array */
3078 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3079 if (RelativeIds
->Element
== NULL
)
3081 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3085 /* Allocate the use array */
3086 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3087 if (Use
->Element
== NULL
)
3089 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3093 RelativeIds
->Count
= Count
;
3096 for (i
= 0; i
< Count
; i
++)
3098 TRACE("Name: %S\n", Names
[i
].Buffer
);
3102 /* Lookup aliases */
3103 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3106 &AccountsKeyHandle
);
3107 if (NT_SUCCESS(Status
))
3109 Status
= SampRegOpenKey(AccountsKeyHandle
,
3113 if (NT_SUCCESS(Status
))
3115 DataLength
= sizeof(ULONG
);
3116 Status
= SampRegQueryValue(NamesKeyHandle
,
3122 SampRegCloseKey(NamesKeyHandle
);
3125 SampRegCloseKey(AccountsKeyHandle
);
3128 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3131 /* Return alias account */
3132 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3134 TRACE("Rid: %lu\n", RelativeId
);
3135 RelativeIds
->Element
[i
] = RelativeId
;
3136 Use
->Element
[i
] = SidTypeAlias
;
3142 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3145 &AccountsKeyHandle
);
3146 if (NT_SUCCESS(Status
))
3148 Status
= SampRegOpenKey(AccountsKeyHandle
,
3152 if (NT_SUCCESS(Status
))
3154 DataLength
= sizeof(ULONG
);
3155 Status
= SampRegQueryValue(NamesKeyHandle
,
3161 SampRegCloseKey(NamesKeyHandle
);
3164 SampRegCloseKey(AccountsKeyHandle
);
3167 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3170 /* Return group account */
3171 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3173 TRACE("Rid: %lu\n", RelativeId
);
3174 RelativeIds
->Element
[i
] = RelativeId
;
3175 Use
->Element
[i
] = SidTypeGroup
;
3181 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3184 &AccountsKeyHandle
);
3185 if (NT_SUCCESS(Status
))
3187 Status
= SampRegOpenKey(AccountsKeyHandle
,
3191 if (NT_SUCCESS(Status
))
3193 DataLength
= sizeof(ULONG
);
3194 Status
= SampRegQueryValue(NamesKeyHandle
,
3200 SampRegCloseKey(NamesKeyHandle
);
3203 SampRegCloseKey(AccountsKeyHandle
);
3206 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3209 /* Return user account */
3210 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3212 TRACE("Rid: %lu\n", RelativeId
);
3213 RelativeIds
->Element
[i
] = RelativeId
;
3214 Use
->Element
[i
] = SidTypeUser
;
3219 /* Return unknown account */
3220 RelativeIds
->Element
[i
] = 0;
3221 Use
->Element
[i
] = SidTypeUnknown
;
3225 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3226 Status
= STATUS_SUCCESS
;
3228 if (NT_SUCCESS(Status
))
3230 if (MappedCount
== 0)
3231 Status
= STATUS_NONE_MAPPED
;
3232 else if (MappedCount
< Count
)
3233 Status
= STATUS_SOME_NOT_MAPPED
;
3237 if (RelativeIds
->Element
!= NULL
)
3239 midl_user_free(RelativeIds
->Element
);
3240 RelativeIds
->Element
= NULL
;
3243 RelativeIds
->Count
= 0;
3245 if (Use
->Element
!= NULL
)
3247 midl_user_free(Use
->Element
);
3248 Use
->Element
= NULL
;
3254 TRACE("Returned Status %lx\n", Status
);
3263 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3265 IN ULONG
*RelativeIds
,
3266 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3267 OUT PSAMPR_ULONG_ARRAY Use
)
3269 PSAM_DB_OBJECT DomainObject
;
3271 HANDLE AccountsKeyHandle
;
3272 HANDLE AccountKeyHandle
;
3273 ULONG MappedCount
= 0;
3278 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3279 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3281 /* Validate the domain handle */
3282 Status
= SampValidateDbObject(DomainHandle
,
3286 if (!NT_SUCCESS(Status
))
3288 TRACE("failed with status 0x%08lx\n", Status
);
3296 return STATUS_SUCCESS
;
3298 /* Allocate the names array */
3299 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3300 if (Names
->Element
== NULL
)
3302 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3306 /* Allocate the use array */
3307 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3308 if (Use
->Element
== NULL
)
3310 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3314 Names
->Count
= Count
;
3317 for (i
= 0; i
< Count
; i
++)
3319 TRACE("RID: %lu\n", RelativeIds
[i
]);
3321 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3323 /* Lookup aliases */
3324 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3327 &AccountsKeyHandle
);
3328 if (NT_SUCCESS(Status
))
3330 Status
= SampRegOpenKey(AccountsKeyHandle
,
3334 if (NT_SUCCESS(Status
))
3337 Status
= SampRegQueryValue(AccountKeyHandle
,
3342 if (NT_SUCCESS(Status
))
3344 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3345 if (Names
->Element
[i
].Buffer
== NULL
)
3346 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3348 if (NT_SUCCESS(Status
))
3350 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3351 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3353 Status
= SampRegQueryValue(AccountKeyHandle
,
3356 Names
->Element
[i
].Buffer
,
3361 SampRegCloseKey(AccountKeyHandle
);
3364 SampRegCloseKey(AccountsKeyHandle
);
3367 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3370 /* Return alias account */
3371 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3373 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3374 Use
->Element
[i
] = SidTypeAlias
;
3380 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3383 &AccountsKeyHandle
);
3384 if (NT_SUCCESS(Status
))
3386 Status
= SampRegOpenKey(AccountsKeyHandle
,
3390 if (NT_SUCCESS(Status
))
3393 Status
= SampRegQueryValue(AccountKeyHandle
,
3398 if (NT_SUCCESS(Status
))
3400 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3401 if (Names
->Element
[i
].Buffer
== NULL
)
3402 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3404 if (NT_SUCCESS(Status
))
3406 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3407 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3409 Status
= SampRegQueryValue(AccountKeyHandle
,
3412 Names
->Element
[i
].Buffer
,
3417 SampRegCloseKey(AccountKeyHandle
);
3420 SampRegCloseKey(AccountsKeyHandle
);
3423 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3426 /* Return group account */
3427 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3429 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3430 Use
->Element
[i
] = SidTypeGroup
;
3436 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3439 &AccountsKeyHandle
);
3440 if (NT_SUCCESS(Status
))
3442 Status
= SampRegOpenKey(AccountsKeyHandle
,
3446 if (NT_SUCCESS(Status
))
3449 Status
= SampRegQueryValue(AccountKeyHandle
,
3454 if (NT_SUCCESS(Status
))
3456 TRACE("DataLength: %lu\n", DataLength
);
3458 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3459 if (Names
->Element
[i
].Buffer
== NULL
)
3460 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3462 if (NT_SUCCESS(Status
))
3464 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3465 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3467 Status
= SampRegQueryValue(AccountKeyHandle
,
3470 Names
->Element
[i
].Buffer
,
3475 SampRegCloseKey(AccountKeyHandle
);
3478 SampRegCloseKey(AccountsKeyHandle
);
3481 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3484 /* Return user account */
3485 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3487 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3488 Use
->Element
[i
] = SidTypeUser
;
3493 /* Return unknown account */
3494 Use
->Element
[i
] = SidTypeUnknown
;
3498 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3499 Status
= STATUS_SUCCESS
;
3501 if (NT_SUCCESS(Status
))
3503 if (MappedCount
== 0)
3504 Status
= STATUS_NONE_MAPPED
;
3505 else if (MappedCount
< Count
)
3506 Status
= STATUS_SOME_NOT_MAPPED
;
3510 if (Names
->Element
!= NULL
)
3512 for (i
= 0; i
< Count
; i
++)
3514 if (Names
->Element
[i
].Buffer
!= NULL
)
3515 midl_user_free(Names
->Element
[i
].Buffer
);
3518 midl_user_free(Names
->Element
);
3519 Names
->Element
= NULL
;
3524 if (Use
->Element
!= NULL
)
3526 midl_user_free(Use
->Element
);
3527 Use
->Element
= NULL
;
3540 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3541 IN ACCESS_MASK DesiredAccess
,
3542 IN
unsigned long GroupId
,
3543 OUT SAMPR_HANDLE
*GroupHandle
)
3545 PSAM_DB_OBJECT DomainObject
;
3546 PSAM_DB_OBJECT GroupObject
;
3550 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3551 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3553 /* Map generic access rights */
3554 RtlMapGenericMask(&DesiredAccess
,
3557 /* Validate the domain handle */
3558 Status
= SampValidateDbObject(DomainHandle
,
3562 if (!NT_SUCCESS(Status
))
3564 TRACE("failed with status 0x%08lx\n", Status
);
3568 /* Convert the RID into a string (hex) */
3569 swprintf(szRid
, L
"%08lX", GroupId
);
3571 /* Create the group object */
3572 Status
= SampOpenDbObject(DomainObject
,
3579 if (!NT_SUCCESS(Status
))
3581 TRACE("failed with status 0x%08lx\n", Status
);
3585 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3587 return STATUS_SUCCESS
;
3592 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3593 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3595 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3596 SAM_GROUP_FIXED_DATA FixedData
;
3597 ULONG MembersLength
= 0;
3603 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3604 if (InfoBuffer
== NULL
)
3605 return STATUS_INSUFFICIENT_RESOURCES
;
3607 Status
= SampGetObjectAttributeString(GroupObject
,
3609 &InfoBuffer
->General
.Name
);
3610 if (!NT_SUCCESS(Status
))
3612 TRACE("Status 0x%08lx\n", Status
);
3616 Status
= SampGetObjectAttributeString(GroupObject
,
3618 &InfoBuffer
->General
.AdminComment
);
3619 if (!NT_SUCCESS(Status
))
3621 TRACE("Status 0x%08lx\n", Status
);
3625 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3626 Status
= SampGetObjectAttribute(GroupObject
,
3631 if (!NT_SUCCESS(Status
))
3634 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3636 Status
= SampGetObjectAttribute(GroupObject
,
3641 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3644 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3645 InfoBuffer
->General
.MemberCount
= 0;
3647 InfoBuffer
->General
.MemberCount
= MembersLength
/ sizeof(ULONG
);
3649 *Buffer
= InfoBuffer
;
3652 if (!NT_SUCCESS(Status
))
3654 if (InfoBuffer
!= NULL
)
3656 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3657 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3659 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3660 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3662 midl_user_free(InfoBuffer
);
3671 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3672 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3674 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3679 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3680 if (InfoBuffer
== NULL
)
3681 return STATUS_INSUFFICIENT_RESOURCES
;
3683 Status
= SampGetObjectAttributeString(GroupObject
,
3685 &InfoBuffer
->Name
.Name
);
3686 if (!NT_SUCCESS(Status
))
3688 TRACE("Status 0x%08lx\n", Status
);
3692 *Buffer
= InfoBuffer
;
3695 if (!NT_SUCCESS(Status
))
3697 if (InfoBuffer
!= NULL
)
3699 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3700 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3702 midl_user_free(InfoBuffer
);
3711 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3712 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3714 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3715 SAM_GROUP_FIXED_DATA FixedData
;
3721 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3722 if (InfoBuffer
== NULL
)
3723 return STATUS_INSUFFICIENT_RESOURCES
;
3725 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3726 Status
= SampGetObjectAttribute(GroupObject
,
3731 if (!NT_SUCCESS(Status
))
3734 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3736 *Buffer
= InfoBuffer
;
3739 if (!NT_SUCCESS(Status
))
3741 if (InfoBuffer
!= NULL
)
3743 midl_user_free(InfoBuffer
);
3752 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3753 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3755 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3760 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3761 if (InfoBuffer
== NULL
)
3762 return STATUS_INSUFFICIENT_RESOURCES
;
3764 Status
= SampGetObjectAttributeString(GroupObject
,
3766 &InfoBuffer
->AdminComment
.AdminComment
);
3767 if (!NT_SUCCESS(Status
))
3769 TRACE("Status 0x%08lx\n", Status
);
3773 *Buffer
= InfoBuffer
;
3776 if (!NT_SUCCESS(Status
))
3778 if (InfoBuffer
!= NULL
)
3780 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3781 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3783 midl_user_free(InfoBuffer
);
3794 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3795 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3796 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3798 PSAM_DB_OBJECT GroupObject
;
3801 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
3802 GroupHandle
, GroupInformationClass
, Buffer
);
3804 /* Validate the group handle */
3805 Status
= SampValidateDbObject(GroupHandle
,
3807 GROUP_READ_INFORMATION
,
3809 if (!NT_SUCCESS(Status
))
3812 switch (GroupInformationClass
)
3814 case GroupGeneralInformation
:
3815 Status
= SampQueryGroupGeneral(GroupObject
,
3819 case GroupNameInformation
:
3820 Status
= SampQueryGroupName(GroupObject
,
3824 case GroupAttributeInformation
:
3825 Status
= SampQueryGroupAttribute(GroupObject
,
3829 case GroupAdminCommentInformation
:
3830 Status
= SampQueryGroupAdminComment(GroupObject
,
3835 Status
= STATUS_INVALID_INFO_CLASS
;
3844 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3845 PSAMPR_GROUP_INFO_BUFFER Buffer
)
3847 SAM_GROUP_FIXED_DATA FixedData
;
3851 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3852 Status
= SampGetObjectAttribute(GroupObject
,
3857 if (!NT_SUCCESS(Status
))
3860 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
3862 Status
= SampSetObjectAttribute(GroupObject
,
3876 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3877 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3878 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
3880 PSAM_DB_OBJECT GroupObject
;
3883 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
3884 GroupHandle
, GroupInformationClass
, Buffer
);
3886 /* Validate the group handle */
3887 Status
= SampValidateDbObject(GroupHandle
,
3889 GROUP_WRITE_ACCOUNT
,
3891 if (!NT_SUCCESS(Status
))
3894 switch (GroupInformationClass
)
3896 case GroupNameInformation
:
3897 Status
= SampSetObjectAttribute(GroupObject
,
3900 Buffer
->Name
.Name
.Buffer
,
3901 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3904 case GroupAttributeInformation
:
3905 Status
= SampSetGroupAttribute(GroupObject
,
3909 case GroupAdminCommentInformation
:
3910 Status
= SampSetObjectAttribute(GroupObject
,
3913 Buffer
->AdminComment
.AdminComment
.Buffer
,
3914 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
3918 Status
= STATUS_INVALID_INFO_CLASS
;
3929 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
3930 IN
unsigned long MemberId
,
3931 IN
unsigned long Attributes
)
3933 PSAM_DB_OBJECT GroupObject
;
3934 PSAM_DB_OBJECT UserObject
= NULL
;
3937 TRACE("(%p %lu %lx)\n",
3938 GroupHandle
, MemberId
, Attributes
);
3940 /* Validate the group handle */
3941 Status
= SampValidateDbObject(GroupHandle
,
3945 if (!NT_SUCCESS(Status
))
3948 /* Open the user object in the same domain */
3949 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
3953 if (!NT_SUCCESS(Status
))
3955 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
3959 /* Add group membership to the user object */
3960 Status
= SampAddGroupMembershipToUser(UserObject
,
3961 GroupObject
->RelativeId
,
3963 if (!NT_SUCCESS(Status
))
3965 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
3969 /* Add the member to the group object */
3970 Status
= SampAddMemberToGroup(GroupObject
,
3972 if (!NT_SUCCESS(Status
))
3974 ERR("SampAddMemberToGroup() failed (Status 0x%08lx)\n", Status
);
3979 SampCloseDbObject(UserObject
);
3988 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
3991 return STATUS_NOT_IMPLEMENTED
;
3998 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
3999 IN
unsigned long MemberId
)
4001 PSAM_DB_OBJECT GroupObject
;
4002 PSAM_DB_OBJECT UserObject
= NULL
;
4006 GroupHandle
, MemberId
);
4008 /* Validate the group handle */
4009 Status
= SampValidateDbObject(GroupHandle
,
4011 GROUP_REMOVE_MEMBER
,
4013 if (!NT_SUCCESS(Status
))
4016 /* Open the user object in the same domain */
4017 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4021 if (!NT_SUCCESS(Status
))
4023 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4027 /* Remove group membership from the user object */
4028 Status
= SampRemoveGroupMembershipFromUser(UserObject
,
4029 GroupObject
->RelativeId
);
4030 if (!NT_SUCCESS(Status
))
4032 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4036 /* Remove the member from the group object */
4037 Status
= SampRemoveMemberFromGroup(GroupObject
,
4039 if (!NT_SUCCESS(Status
))
4041 ERR("SampRemoveMemberFromGroup() failed (Status 0x%08lx)\n", Status
);
4046 SampCloseDbObject(UserObject
);
4055 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
4056 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
4059 return STATUS_NOT_IMPLEMENTED
;
4065 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
4066 IN
unsigned long MemberId
,
4067 IN
unsigned long Attributes
)
4070 return STATUS_NOT_IMPLEMENTED
;
4077 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
4078 IN ACCESS_MASK DesiredAccess
,
4080 OUT SAMPR_HANDLE
*AliasHandle
)
4082 PSAM_DB_OBJECT DomainObject
;
4083 PSAM_DB_OBJECT AliasObject
;
4087 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4088 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4090 /* Map generic access rights */
4091 RtlMapGenericMask(&DesiredAccess
,
4094 /* Validate the domain handle */
4095 Status
= SampValidateDbObject(DomainHandle
,
4099 if (!NT_SUCCESS(Status
))
4101 TRACE("failed with status 0x%08lx\n", Status
);
4105 /* Convert the RID into a string (hex) */
4106 swprintf(szRid
, L
"%08lX", AliasId
);
4108 /* Create the alias object */
4109 Status
= SampOpenDbObject(DomainObject
,
4116 if (!NT_SUCCESS(Status
))
4118 TRACE("failed with status 0x%08lx\n", Status
);
4122 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4124 return STATUS_SUCCESS
;
4129 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4130 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4132 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4133 HANDLE MembersKeyHandle
= NULL
;
4138 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4139 if (InfoBuffer
== NULL
)
4140 return STATUS_INSUFFICIENT_RESOURCES
;
4142 Status
= SampGetObjectAttributeString(AliasObject
,
4144 &InfoBuffer
->General
.Name
);
4145 if (!NT_SUCCESS(Status
))
4147 TRACE("Status 0x%08lx\n", Status
);
4151 Status
= SampGetObjectAttributeString(AliasObject
,
4153 &InfoBuffer
->General
.AdminComment
);
4154 if (!NT_SUCCESS(Status
))
4156 TRACE("Status 0x%08lx\n", Status
);
4160 /* Open the Members subkey */
4161 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4165 if (NT_SUCCESS(Status
))
4167 /* Retrieve the number of members of the alias */
4168 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4170 &InfoBuffer
->General
.MemberCount
);
4171 if (!NT_SUCCESS(Status
))
4173 TRACE("Status 0x%08lx\n", Status
);
4177 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4179 InfoBuffer
->General
.MemberCount
= 0;
4180 Status
= STATUS_SUCCESS
;
4184 TRACE("Status 0x%08lx\n", Status
);
4188 *Buffer
= InfoBuffer
;
4191 if (MembersKeyHandle
!= NULL
)
4192 SampRegCloseKey(MembersKeyHandle
);
4194 if (!NT_SUCCESS(Status
))
4196 if (InfoBuffer
!= NULL
)
4198 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4199 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4201 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4202 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4204 midl_user_free(InfoBuffer
);
4213 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4214 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4216 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4221 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4222 if (InfoBuffer
== NULL
)
4223 return STATUS_INSUFFICIENT_RESOURCES
;
4225 Status
= SampGetObjectAttributeString(AliasObject
,
4227 &InfoBuffer
->Name
.Name
);
4228 if (!NT_SUCCESS(Status
))
4230 TRACE("Status 0x%08lx\n", Status
);
4234 *Buffer
= InfoBuffer
;
4237 if (!NT_SUCCESS(Status
))
4239 if (InfoBuffer
!= NULL
)
4241 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4242 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4244 midl_user_free(InfoBuffer
);
4253 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4254 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4256 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4261 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4262 if (InfoBuffer
== NULL
)
4263 return STATUS_INSUFFICIENT_RESOURCES
;
4265 Status
= SampGetObjectAttributeString(AliasObject
,
4267 &InfoBuffer
->AdminComment
.AdminComment
);
4268 if (!NT_SUCCESS(Status
))
4270 TRACE("Status 0x%08lx\n", Status
);
4274 *Buffer
= InfoBuffer
;
4277 if (!NT_SUCCESS(Status
))
4279 if (InfoBuffer
!= NULL
)
4281 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4282 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4284 midl_user_free(InfoBuffer
);
4295 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4296 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4297 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4299 PSAM_DB_OBJECT AliasObject
;
4302 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4303 AliasHandle
, AliasInformationClass
, Buffer
);
4305 /* Validate the alias handle */
4306 Status
= SampValidateDbObject(AliasHandle
,
4308 ALIAS_READ_INFORMATION
,
4310 if (!NT_SUCCESS(Status
))
4313 switch (AliasInformationClass
)
4315 case AliasGeneralInformation
:
4316 Status
= SampQueryAliasGeneral(AliasObject
,
4320 case AliasNameInformation
:
4321 Status
= SampQueryAliasName(AliasObject
,
4325 case AliasAdminCommentInformation
:
4326 Status
= SampQueryAliasAdminComment(AliasObject
,
4331 Status
= STATUS_INVALID_INFO_CLASS
;
4342 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4343 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4344 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4346 PSAM_DB_OBJECT AliasObject
;
4349 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4350 AliasHandle
, AliasInformationClass
, Buffer
);
4352 /* Validate the alias handle */
4353 Status
= SampValidateDbObject(AliasHandle
,
4355 ALIAS_WRITE_ACCOUNT
,
4357 if (!NT_SUCCESS(Status
))
4360 switch (AliasInformationClass
)
4362 case AliasNameInformation
:
4363 Status
= SampSetObjectAttribute(AliasObject
,
4366 Buffer
->Name
.Name
.Buffer
,
4367 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4370 case AliasAdminCommentInformation
:
4371 Status
= SampSetObjectAttribute(AliasObject
,
4374 Buffer
->AdminComment
.AdminComment
.Buffer
,
4375 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4379 Status
= STATUS_INVALID_INFO_CLASS
;
4390 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4393 return STATUS_NOT_IMPLEMENTED
;
4400 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4401 IN PRPC_SID MemberId
)
4403 PSAM_DB_OBJECT AliasObject
;
4404 LPWSTR MemberIdString
= NULL
;
4405 HANDLE MembersKeyHandle
= NULL
;
4406 HANDLE MemberKeyHandle
= NULL
;
4407 ULONG MemberIdLength
;
4410 TRACE("SamrAddMemberToAlias(%p %p)\n",
4411 AliasHandle
, MemberId
);
4413 /* Validate the alias handle */
4414 Status
= SampValidateDbObject(AliasHandle
,
4418 if (!NT_SUCCESS(Status
))
4420 TRACE("failed with status 0x%08lx\n", Status
);
4424 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4425 TRACE("Member SID: %S\n", MemberIdString
);
4427 MemberIdLength
= RtlLengthSid(MemberId
);
4429 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4433 if (!NT_SUCCESS(Status
))
4435 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4439 Status
= SampRegSetValue(MembersKeyHandle
,
4444 if (!NT_SUCCESS(Status
))
4446 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4450 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4454 if (!NT_SUCCESS(Status
))
4456 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4460 Status
= SampRegSetValue(MemberKeyHandle
,
4465 if (!NT_SUCCESS(Status
))
4467 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4472 if (MemberKeyHandle
!= NULL
)
4473 SampRegCloseKey(MemberKeyHandle
);
4475 if (MembersKeyHandle
!= NULL
)
4476 SampRegCloseKey(MembersKeyHandle
);
4478 if (MemberIdString
!= NULL
)
4479 LocalFree(MemberIdString
);
4488 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4489 IN PRPC_SID MemberId
)
4491 PSAM_DB_OBJECT AliasObject
;
4492 LPWSTR MemberIdString
= NULL
;
4493 HANDLE MembersKeyHandle
= NULL
;
4494 HANDLE MemberKeyHandle
= NULL
;
4498 TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
4499 AliasHandle
, MemberId
);
4501 /* Validate the alias handle */
4502 Status
= SampValidateDbObject(AliasHandle
,
4504 ALIAS_REMOVE_MEMBER
,
4506 if (!NT_SUCCESS(Status
))
4508 TRACE("failed with status 0x%08lx\n", Status
);
4512 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4513 TRACE("Member SID: %S\n", MemberIdString
);
4515 Status
= SampRegOpenKey(AliasObject
->MembersKeyHandle
,
4517 KEY_WRITE
| KEY_QUERY_VALUE
,
4519 if (!NT_SUCCESS(Status
))
4521 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4525 Status
= SampRegDeleteValue(MemberKeyHandle
,
4527 if (!NT_SUCCESS(Status
))
4529 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4533 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
4536 if (!NT_SUCCESS(Status
))
4538 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4542 if (ulValueCount
== 0)
4544 SampRegCloseKey(MemberKeyHandle
);
4545 MemberKeyHandle
= NULL
;
4547 Status
= SampRegDeleteKey(AliasObject
->MembersKeyHandle
,
4549 if (!NT_SUCCESS(Status
))
4551 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4556 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4558 KEY_WRITE
| KEY_QUERY_VALUE
,
4560 if (!NT_SUCCESS(Status
))
4562 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4566 Status
= SampRegDeleteValue(MembersKeyHandle
,
4568 if (!NT_SUCCESS(Status
))
4570 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4574 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4577 if (!NT_SUCCESS(Status
))
4579 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4583 if (ulValueCount
== 0)
4585 SampRegCloseKey(MembersKeyHandle
);
4586 MembersKeyHandle
= NULL
;
4588 Status
= SampRegDeleteKey(AliasObject
->KeyHandle
,
4590 if (!NT_SUCCESS(Status
))
4592 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4598 if (MemberKeyHandle
!= NULL
)
4599 SampRegCloseKey(MemberKeyHandle
);
4601 if (MembersKeyHandle
!= NULL
)
4602 SampRegCloseKey(MembersKeyHandle
);
4604 if (MemberIdString
!= NULL
)
4605 LocalFree(MemberIdString
);
4614 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4615 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4617 PSAM_DB_OBJECT AliasObject
;
4618 HANDLE MembersKeyHandle
= NULL
;
4619 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4620 ULONG ValueCount
= 0;
4625 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4626 AliasHandle
, Members
);
4628 /* Validate the alias handle */
4629 Status
= SampValidateDbObject(AliasHandle
,
4633 if (!NT_SUCCESS(Status
))
4635 ERR("failed with status 0x%08lx\n", Status
);
4639 /* Open the members key of the alias objct */
4640 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4644 if (!NT_SUCCESS(Status
))
4646 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4650 /* Get the number of members */
4651 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4654 if (!NT_SUCCESS(Status
))
4656 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4660 /* Allocate the member array */
4661 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4662 if (MemberArray
== NULL
)
4664 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4668 /* Enumerate the members */
4672 /* Get the size of the next SID */
4674 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4681 if (!NT_SUCCESS(Status
))
4683 if (Status
== STATUS_NO_MORE_ENTRIES
)
4684 Status
= STATUS_SUCCESS
;
4688 /* Allocate a buffer for the SID */
4689 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4690 if (MemberArray
[Index
].SidPointer
== NULL
)
4692 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4696 /* Read the SID into the buffer */
4697 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4702 (PVOID
)MemberArray
[Index
].SidPointer
,
4704 if (!NT_SUCCESS(Status
))
4712 /* Return the number of members and the member array */
4713 if (NT_SUCCESS(Status
))
4715 Members
->Count
= ValueCount
;
4716 Members
->Sids
= MemberArray
;
4720 /* Clean up the members array and the SID buffers if something failed */
4721 if (!NT_SUCCESS(Status
))
4723 if (MemberArray
!= NULL
)
4725 for (Index
= 0; Index
< ValueCount
; Index
++)
4727 if (MemberArray
[Index
].SidPointer
!= NULL
)
4728 midl_user_free(MemberArray
[Index
].SidPointer
);
4731 midl_user_free(MemberArray
);
4735 /* Close the members key */
4736 if (MembersKeyHandle
!= NULL
)
4737 SampRegCloseKey(MembersKeyHandle
);
4746 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
4747 IN ACCESS_MASK DesiredAccess
,
4748 IN
unsigned long UserId
,
4749 OUT SAMPR_HANDLE
*UserHandle
)
4751 PSAM_DB_OBJECT DomainObject
;
4752 PSAM_DB_OBJECT UserObject
;
4756 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
4757 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
4759 /* Map generic access rights */
4760 RtlMapGenericMask(&DesiredAccess
,
4763 /* Validate the domain handle */
4764 Status
= SampValidateDbObject(DomainHandle
,
4768 if (!NT_SUCCESS(Status
))
4770 TRACE("failed with status 0x%08lx\n", Status
);
4774 /* Convert the RID into a string (hex) */
4775 swprintf(szRid
, L
"%08lX", UserId
);
4777 /* Create the user object */
4778 Status
= SampOpenDbObject(DomainObject
,
4785 if (!NT_SUCCESS(Status
))
4787 TRACE("failed with status 0x%08lx\n", Status
);
4791 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
4793 return STATUS_SUCCESS
;
4800 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
4803 return STATUS_NOT_IMPLEMENTED
;
4809 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
4810 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4812 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4813 SAM_USER_FIXED_DATA FixedData
;
4819 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4820 if (InfoBuffer
== NULL
)
4821 return STATUS_INSUFFICIENT_RESOURCES
;
4823 Length
= sizeof(SAM_USER_FIXED_DATA
);
4824 Status
= SampGetObjectAttribute(UserObject
,
4829 if (!NT_SUCCESS(Status
))
4832 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4834 /* Get the Name string */
4835 Status
= SampGetObjectAttributeString(UserObject
,
4837 &InfoBuffer
->General
.UserName
);
4838 if (!NT_SUCCESS(Status
))
4840 TRACE("Status 0x%08lx\n", Status
);
4844 /* Get the FullName string */
4845 Status
= SampGetObjectAttributeString(UserObject
,
4847 &InfoBuffer
->General
.FullName
);
4848 if (!NT_SUCCESS(Status
))
4850 TRACE("Status 0x%08lx\n", Status
);
4854 /* Get the AdminComment string */
4855 Status
= SampGetObjectAttributeString(UserObject
,
4857 &InfoBuffer
->General
.AdminComment
);
4858 if (!NT_SUCCESS(Status
))
4860 TRACE("Status 0x%08lx\n", Status
);
4864 /* Get the UserComment string */
4865 Status
= SampGetObjectAttributeString(UserObject
,
4867 &InfoBuffer
->General
.UserComment
);
4868 if (!NT_SUCCESS(Status
))
4870 TRACE("Status 0x%08lx\n", Status
);
4874 *Buffer
= InfoBuffer
;
4877 if (!NT_SUCCESS(Status
))
4879 if (InfoBuffer
!= NULL
)
4881 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
4882 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
4884 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
4885 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
4887 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4888 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4890 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
4891 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
4893 midl_user_free(InfoBuffer
);
4903 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
4904 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4906 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4907 SAM_USER_FIXED_DATA FixedData
;
4913 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4914 if (InfoBuffer
== NULL
)
4915 return STATUS_INSUFFICIENT_RESOURCES
;
4917 Length
= sizeof(SAM_USER_FIXED_DATA
);
4918 Status
= SampGetObjectAttribute(UserObject
,
4923 if (!NT_SUCCESS(Status
))
4926 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
4927 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
4929 /* Get the UserComment string */
4930 Status
= SampGetObjectAttributeString(UserObject
,
4932 &InfoBuffer
->Preferences
.UserComment
);
4933 if (!NT_SUCCESS(Status
))
4935 TRACE("Status 0x%08lx\n", Status
);
4939 *Buffer
= InfoBuffer
;
4942 if (!NT_SUCCESS(Status
))
4944 if (InfoBuffer
!= NULL
)
4946 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
4947 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
4949 midl_user_free(InfoBuffer
);
4959 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
4960 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4962 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4963 SAM_USER_FIXED_DATA FixedData
;
4969 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4970 if (InfoBuffer
== NULL
)
4971 return STATUS_INSUFFICIENT_RESOURCES
;
4973 Length
= sizeof(SAM_USER_FIXED_DATA
);
4974 Status
= SampGetObjectAttribute(UserObject
,
4979 if (!NT_SUCCESS(Status
))
4982 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
4983 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4984 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4985 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4986 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4987 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4988 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4989 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4990 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4991 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
4992 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
4994 // OLD_LARGE_INTEGER PasswordCanChange;
4995 // OLD_LARGE_INTEGER PasswordMustChange;
4997 /* Get the Name string */
4998 Status
= SampGetObjectAttributeString(UserObject
,
5000 &InfoBuffer
->Logon
.UserName
);
5001 if (!NT_SUCCESS(Status
))
5003 TRACE("Status 0x%08lx\n", Status
);
5007 /* Get the FullName string */
5008 Status
= SampGetObjectAttributeString(UserObject
,
5010 &InfoBuffer
->Logon
.FullName
);
5011 if (!NT_SUCCESS(Status
))
5013 TRACE("Status 0x%08lx\n", Status
);
5017 /* Get the HomeDirectory string */
5018 Status
= SampGetObjectAttributeString(UserObject
,
5020 &InfoBuffer
->Logon
.HomeDirectory
);
5021 if (!NT_SUCCESS(Status
))
5023 TRACE("Status 0x%08lx\n", Status
);
5027 /* Get the HomeDirectoryDrive string */
5028 Status
= SampGetObjectAttributeString(UserObject
,
5029 L
"HomeDirectoryDrive",
5030 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
5031 if (!NT_SUCCESS(Status
))
5033 TRACE("Status 0x%08lx\n", Status
);
5037 /* Get the ScriptPath string */
5038 Status
= SampGetObjectAttributeString(UserObject
,
5040 &InfoBuffer
->Logon
.ScriptPath
);
5041 if (!NT_SUCCESS(Status
))
5043 TRACE("Status 0x%08lx\n", Status
);
5047 /* Get the ProfilePath string */
5048 Status
= SampGetObjectAttributeString(UserObject
,
5050 &InfoBuffer
->Logon
.ProfilePath
);
5051 if (!NT_SUCCESS(Status
))
5053 TRACE("Status 0x%08lx\n", Status
);
5057 /* Get the WorkStations string */
5058 Status
= SampGetObjectAttributeString(UserObject
,
5060 &InfoBuffer
->Logon
.WorkStations
);
5061 if (!NT_SUCCESS(Status
))
5063 TRACE("Status 0x%08lx\n", Status
);
5067 /* FIXME: LogonHours */
5069 *Buffer
= InfoBuffer
;
5072 if (!NT_SUCCESS(Status
))
5074 if (InfoBuffer
!= NULL
)
5076 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
5077 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
5079 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
5080 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
5082 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
5083 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5085 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5086 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5088 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5089 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5091 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5092 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5094 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5095 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5097 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5098 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5100 midl_user_free(InfoBuffer
);
5110 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5111 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5113 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5114 SAM_USER_FIXED_DATA FixedData
;
5120 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5121 if (InfoBuffer
== NULL
)
5122 return STATUS_INSUFFICIENT_RESOURCES
;
5124 Length
= sizeof(SAM_USER_FIXED_DATA
);
5125 Status
= SampGetObjectAttribute(UserObject
,
5130 if (!NT_SUCCESS(Status
))
5133 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5134 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5135 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5136 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5137 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5138 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5139 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5140 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5141 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5142 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5143 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5144 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
5145 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
5147 /* Get the Name string */
5148 Status
= SampGetObjectAttributeString(UserObject
,
5150 &InfoBuffer
->Account
.UserName
);
5151 if (!NT_SUCCESS(Status
))
5153 TRACE("Status 0x%08lx\n", Status
);
5157 /* Get the FullName string */
5158 Status
= SampGetObjectAttributeString(UserObject
,
5160 &InfoBuffer
->Account
.FullName
);
5161 if (!NT_SUCCESS(Status
))
5163 TRACE("Status 0x%08lx\n", Status
);
5167 /* Get the HomeDirectory string */
5168 Status
= SampGetObjectAttributeString(UserObject
,
5170 &InfoBuffer
->Account
.HomeDirectory
);
5171 if (!NT_SUCCESS(Status
))
5173 TRACE("Status 0x%08lx\n", Status
);
5177 /* Get the HomeDirectoryDrive string */
5178 Status
= SampGetObjectAttributeString(UserObject
,
5179 L
"HomeDirectoryDrive",
5180 &InfoBuffer
->Account
.HomeDirectoryDrive
);
5181 if (!NT_SUCCESS(Status
))
5183 TRACE("Status 0x%08lx\n", Status
);
5187 /* Get the ScriptPath string */
5188 Status
= SampGetObjectAttributeString(UserObject
,
5190 &InfoBuffer
->Account
.ScriptPath
);
5191 if (!NT_SUCCESS(Status
))
5193 TRACE("Status 0x%08lx\n", Status
);
5197 /* Get the ProfilePath string */
5198 Status
= SampGetObjectAttributeString(UserObject
,
5200 &InfoBuffer
->Account
.ProfilePath
);
5201 if (!NT_SUCCESS(Status
))
5203 TRACE("Status 0x%08lx\n", Status
);
5207 /* Get the AdminComment string */
5208 Status
= SampGetObjectAttributeString(UserObject
,
5210 &InfoBuffer
->Account
.AdminComment
);
5211 if (!NT_SUCCESS(Status
))
5213 TRACE("Status 0x%08lx\n", Status
);
5217 /* Get the WorkStations string */
5218 Status
= SampGetObjectAttributeString(UserObject
,
5220 &InfoBuffer
->Account
.WorkStations
);
5221 if (!NT_SUCCESS(Status
))
5223 TRACE("Status 0x%08lx\n", Status
);
5227 /* FIXME: LogonHours */
5229 *Buffer
= InfoBuffer
;
5232 if (!NT_SUCCESS(Status
))
5234 if (InfoBuffer
!= NULL
)
5236 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5237 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5239 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5240 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5242 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5243 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5245 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5246 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5248 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5249 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5251 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5252 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5254 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5255 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5257 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5258 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5260 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5261 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5263 midl_user_free(InfoBuffer
);
5270 /* FIXME: SampQueryUserLogonHours */
5274 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
5275 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5277 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5282 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5283 if (InfoBuffer
== NULL
)
5284 return STATUS_INSUFFICIENT_RESOURCES
;
5286 /* Get the Name string */
5287 Status
= SampGetObjectAttributeString(UserObject
,
5289 &InfoBuffer
->Name
.UserName
);
5290 if (!NT_SUCCESS(Status
))
5292 TRACE("Status 0x%08lx\n", Status
);
5296 /* Get the FullName string */
5297 Status
= SampGetObjectAttributeString(UserObject
,
5299 &InfoBuffer
->Name
.FullName
);
5300 if (!NT_SUCCESS(Status
))
5302 TRACE("Status 0x%08lx\n", Status
);
5306 *Buffer
= InfoBuffer
;
5309 if (!NT_SUCCESS(Status
))
5311 if (InfoBuffer
!= NULL
)
5313 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5314 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5316 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5317 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5319 midl_user_free(InfoBuffer
);
5328 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5329 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5331 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5336 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5337 if (InfoBuffer
== NULL
)
5338 return STATUS_INSUFFICIENT_RESOURCES
;
5340 /* Get the Name string */
5341 Status
= SampGetObjectAttributeString(UserObject
,
5343 &InfoBuffer
->AccountName
.UserName
);
5344 if (!NT_SUCCESS(Status
))
5346 TRACE("Status 0x%08lx\n", Status
);
5350 *Buffer
= InfoBuffer
;
5353 if (!NT_SUCCESS(Status
))
5355 if (InfoBuffer
!= NULL
)
5357 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5358 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5360 midl_user_free(InfoBuffer
);
5369 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5370 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5372 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5377 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5378 if (InfoBuffer
== NULL
)
5379 return STATUS_INSUFFICIENT_RESOURCES
;
5381 /* Get the FullName string */
5382 Status
= SampGetObjectAttributeString(UserObject
,
5384 &InfoBuffer
->FullName
.FullName
);
5385 if (!NT_SUCCESS(Status
))
5387 TRACE("Status 0x%08lx\n", Status
);
5391 *Buffer
= InfoBuffer
;
5394 if (!NT_SUCCESS(Status
))
5396 if (InfoBuffer
!= NULL
)
5398 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
5399 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5401 midl_user_free(InfoBuffer
);
5411 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5412 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5414 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5415 SAM_USER_FIXED_DATA FixedData
;
5421 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5422 if (InfoBuffer
== NULL
)
5423 return STATUS_INSUFFICIENT_RESOURCES
;
5425 Length
= sizeof(SAM_USER_FIXED_DATA
);
5426 Status
= SampGetObjectAttribute(UserObject
,
5431 if (!NT_SUCCESS(Status
))
5434 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5436 *Buffer
= InfoBuffer
;
5439 if (!NT_SUCCESS(Status
))
5441 if (InfoBuffer
!= NULL
)
5443 midl_user_free(InfoBuffer
);
5452 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5453 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5455 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5460 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5461 if (InfoBuffer
== NULL
)
5462 return STATUS_INSUFFICIENT_RESOURCES
;
5464 /* Get the HomeDirectory string */
5465 Status
= SampGetObjectAttributeString(UserObject
,
5467 &InfoBuffer
->Home
.HomeDirectory
);
5468 if (!NT_SUCCESS(Status
))
5470 TRACE("Status 0x%08lx\n", Status
);
5474 /* Get the HomeDirectoryDrive string */
5475 Status
= SampGetObjectAttributeString(UserObject
,
5476 L
"HomeDirectoryDrive",
5477 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5478 if (!NT_SUCCESS(Status
))
5480 TRACE("Status 0x%08lx\n", Status
);
5484 *Buffer
= InfoBuffer
;
5487 if (!NT_SUCCESS(Status
))
5489 if (InfoBuffer
!= NULL
)
5491 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5492 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5494 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5495 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5497 midl_user_free(InfoBuffer
);
5506 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5507 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5509 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5514 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5515 if (InfoBuffer
== NULL
)
5516 return STATUS_INSUFFICIENT_RESOURCES
;
5518 /* Get the ScriptPath string */
5519 Status
= SampGetObjectAttributeString(UserObject
,
5521 &InfoBuffer
->Script
.ScriptPath
);
5522 if (!NT_SUCCESS(Status
))
5524 TRACE("Status 0x%08lx\n", Status
);
5528 *Buffer
= InfoBuffer
;
5531 if (!NT_SUCCESS(Status
))
5533 if (InfoBuffer
!= NULL
)
5535 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5536 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5538 midl_user_free(InfoBuffer
);
5547 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5548 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5550 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5555 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5556 if (InfoBuffer
== NULL
)
5557 return STATUS_INSUFFICIENT_RESOURCES
;
5559 /* Get the ProfilePath string */
5560 Status
= SampGetObjectAttributeString(UserObject
,
5562 &InfoBuffer
->Profile
.ProfilePath
);
5563 if (!NT_SUCCESS(Status
))
5565 TRACE("Status 0x%08lx\n", Status
);
5569 *Buffer
= InfoBuffer
;
5572 if (!NT_SUCCESS(Status
))
5574 if (InfoBuffer
!= NULL
)
5576 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
5577 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5579 midl_user_free(InfoBuffer
);
5588 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5589 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5591 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5596 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5597 if (InfoBuffer
== NULL
)
5598 return STATUS_INSUFFICIENT_RESOURCES
;
5600 /* Get the AdminComment string */
5601 Status
= SampGetObjectAttributeString(UserObject
,
5603 &InfoBuffer
->AdminComment
.AdminComment
);
5604 if (!NT_SUCCESS(Status
))
5606 TRACE("Status 0x%08lx\n", Status
);
5610 *Buffer
= InfoBuffer
;
5613 if (!NT_SUCCESS(Status
))
5615 if (InfoBuffer
!= NULL
)
5617 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5618 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5620 midl_user_free(InfoBuffer
);
5629 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5630 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5632 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5637 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5638 if (InfoBuffer
== NULL
)
5639 return STATUS_INSUFFICIENT_RESOURCES
;
5641 /* Get the WorkStations string */
5642 Status
= SampGetObjectAttributeString(UserObject
,
5644 &InfoBuffer
->WorkStations
.WorkStations
);
5645 if (!NT_SUCCESS(Status
))
5647 TRACE("Status 0x%08lx\n", Status
);
5651 *Buffer
= InfoBuffer
;
5654 if (!NT_SUCCESS(Status
))
5656 if (InfoBuffer
!= NULL
)
5658 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
5659 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
5661 midl_user_free(InfoBuffer
);
5671 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
5672 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5674 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5675 SAM_USER_FIXED_DATA FixedData
;
5681 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5682 if (InfoBuffer
== NULL
)
5683 return STATUS_INSUFFICIENT_RESOURCES
;
5685 Length
= sizeof(SAM_USER_FIXED_DATA
);
5686 Status
= SampGetObjectAttribute(UserObject
,
5691 if (!NT_SUCCESS(Status
))
5694 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
5696 *Buffer
= InfoBuffer
;
5699 if (!NT_SUCCESS(Status
))
5701 if (InfoBuffer
!= NULL
)
5703 midl_user_free(InfoBuffer
);
5713 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
5714 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5716 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5717 SAM_USER_FIXED_DATA FixedData
;
5723 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5724 if (InfoBuffer
== NULL
)
5725 return STATUS_INSUFFICIENT_RESOURCES
;
5727 Length
= sizeof(SAM_USER_FIXED_DATA
);
5728 Status
= SampGetObjectAttribute(UserObject
,
5733 if (!NT_SUCCESS(Status
))
5736 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5737 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5739 *Buffer
= InfoBuffer
;
5742 if (!NT_SUCCESS(Status
))
5744 if (InfoBuffer
!= NULL
)
5746 midl_user_free(InfoBuffer
);
5755 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
5756 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5758 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5763 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5764 if (InfoBuffer
== NULL
)
5765 return STATUS_INSUFFICIENT_RESOURCES
;
5767 /* Get the Parameters string */
5768 Status
= SampGetObjectAttributeString(UserObject
,
5770 &InfoBuffer
->Parameters
.Parameters
);
5771 if (!NT_SUCCESS(Status
))
5773 TRACE("Status 0x%08lx\n", Status
);
5777 *Buffer
= InfoBuffer
;
5780 if (!NT_SUCCESS(Status
))
5782 if (InfoBuffer
!= NULL
)
5784 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
5785 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
5787 midl_user_free(InfoBuffer
);
5798 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
5799 IN USER_INFORMATION_CLASS UserInformationClass
,
5800 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
5802 PSAM_DB_OBJECT UserObject
;
5803 ACCESS_MASK DesiredAccess
;
5806 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
5807 UserHandle
, UserInformationClass
, Buffer
);
5809 switch (UserInformationClass
)
5811 case UserGeneralInformation
:
5812 case UserNameInformation
:
5813 case UserAccountNameInformation
:
5814 case UserFullNameInformation
:
5815 case UserPrimaryGroupInformation
:
5816 case UserAdminCommentInformation
:
5817 DesiredAccess
= USER_READ_GENERAL
;
5820 case UserLogonHoursInformation
:
5821 case UserHomeInformation
:
5822 case UserScriptInformation
:
5823 case UserProfileInformation
:
5824 case UserWorkStationsInformation
:
5825 DesiredAccess
= USER_READ_LOGON
;
5828 case UserControlInformation
:
5829 case UserExpiresInformation
:
5830 case UserParametersInformation
:
5831 DesiredAccess
= USER_READ_ACCOUNT
;
5834 case UserPreferencesInformation
:
5835 DesiredAccess
= USER_READ_GENERAL
|
5836 USER_READ_PREFERENCES
;
5839 case UserLogonInformation
:
5840 case UserAccountInformation
:
5841 DesiredAccess
= USER_READ_GENERAL
|
5842 USER_READ_PREFERENCES
|
5848 return STATUS_INVALID_INFO_CLASS
;
5851 /* Validate the domain handle */
5852 Status
= SampValidateDbObject(UserHandle
,
5856 if (!NT_SUCCESS(Status
))
5858 TRACE("failed with status 0x%08lx\n", Status
);
5862 switch (UserInformationClass
)
5864 case UserGeneralInformation
:
5865 Status
= SampQueryUserGeneral(UserObject
,
5869 case UserPreferencesInformation
:
5870 Status
= SampQueryUserPreferences(UserObject
,
5874 case UserLogonInformation
:
5875 Status
= SampQueryUserLogon(UserObject
,
5879 // case UserLogonHoursInformation:
5880 // Status = SampQueryUserLogonHours(UserObject,
5884 case UserAccountInformation
:
5885 Status
= SampQueryUserAccount(UserObject
,
5889 case UserNameInformation
:
5890 Status
= SampQueryUserName(UserObject
,
5894 case UserAccountNameInformation
:
5895 Status
= SampQueryUserAccountName(UserObject
,
5899 case UserFullNameInformation
:
5900 Status
= SampQueryUserFullName(UserObject
,
5904 case UserPrimaryGroupInformation
:
5905 Status
= SampQueryUserPrimaryGroup(UserObject
,
5909 case UserHomeInformation
:
5910 Status
= SampQueryUserHome(UserObject
,
5913 case UserScriptInformation
:
5914 Status
= SampQueryUserScript(UserObject
,
5918 case UserProfileInformation
:
5919 Status
= SampQueryUserProfile(UserObject
,
5923 case UserAdminCommentInformation
:
5924 Status
= SampQueryUserAdminComment(UserObject
,
5928 case UserWorkStationsInformation
:
5929 Status
= SampQueryUserWorkStations(UserObject
,
5933 case UserControlInformation
:
5934 Status
= SampQueryUserControl(UserObject
,
5938 case UserExpiresInformation
:
5939 Status
= SampQueryUserExpires(UserObject
,
5943 // case UserInternal1Information:
5945 case UserParametersInformation
:
5946 Status
= SampQueryUserParameters(UserObject
,
5950 // case UserAllInformation:
5951 // case UserInternal4Information:
5952 // case UserInternal5Information:
5953 // case UserInternal4InformationNew:
5954 // case UserInternal5InformationNew:
5957 Status
= STATUS_INVALID_INFO_CLASS
;
5965 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
5966 PSAMPR_USER_INFO_BUFFER Buffer
)
5968 SAM_USER_FIXED_DATA FixedData
;
5972 Length
= sizeof(SAM_USER_FIXED_DATA
);
5973 Status
= SampGetObjectAttribute(UserObject
,
5978 if (!NT_SUCCESS(Status
))
5981 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
5983 Status
= SampSetObjectAttribute(UserObject
,
5988 if (!NT_SUCCESS(Status
))
5991 Status
= SampSetObjectAttribute(UserObject
,
5994 Buffer
->General
.UserName
.Buffer
,
5995 Buffer
->General
.UserName
.MaximumLength
);
5996 if (!NT_SUCCESS(Status
))
5999 Status
= SampSetObjectAttribute(UserObject
,
6002 Buffer
->General
.FullName
.Buffer
,
6003 Buffer
->General
.FullName
.MaximumLength
);
6004 if (!NT_SUCCESS(Status
))
6007 Status
= SampSetObjectAttribute(UserObject
,
6010 Buffer
->General
.AdminComment
.Buffer
,
6011 Buffer
->General
.AdminComment
.MaximumLength
);
6012 if (!NT_SUCCESS(Status
))
6015 Status
= SampSetObjectAttribute(UserObject
,
6018 Buffer
->General
.UserComment
.Buffer
,
6019 Buffer
->General
.UserComment
.MaximumLength
);
6027 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
6028 PSAMPR_USER_INFO_BUFFER Buffer
)
6030 SAM_USER_FIXED_DATA FixedData
;
6034 Length
= sizeof(SAM_USER_FIXED_DATA
);
6035 Status
= SampGetObjectAttribute(UserObject
,
6040 if (!NT_SUCCESS(Status
))
6043 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6044 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6046 Status
= SampSetObjectAttribute(UserObject
,
6051 if (!NT_SUCCESS(Status
))
6054 Status
= SampSetObjectAttribute(UserObject
,
6057 Buffer
->Preferences
.UserComment
.Buffer
,
6058 Buffer
->Preferences
.UserComment
.MaximumLength
);
6066 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
6067 PSAMPR_USER_INFO_BUFFER Buffer
)
6069 SAM_USER_FIXED_DATA FixedData
;
6073 Length
= sizeof(SAM_USER_FIXED_DATA
);
6074 Status
= SampGetObjectAttribute(UserObject
,
6079 if (!NT_SUCCESS(Status
))
6082 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
6084 Status
= SampSetObjectAttribute(UserObject
,
6096 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
6097 PSAMPR_USER_INFO_BUFFER Buffer
)
6099 SAM_USER_FIXED_DATA FixedData
;
6103 Length
= sizeof(SAM_USER_FIXED_DATA
);
6104 Status
= SampGetObjectAttribute(UserObject
,
6109 if (!NT_SUCCESS(Status
))
6112 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
6114 Status
= SampSetObjectAttribute(UserObject
,
6126 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
6127 PSAMPR_USER_INFO_BUFFER Buffer
)
6129 SAM_USER_FIXED_DATA FixedData
;
6133 Length
= sizeof(SAM_USER_FIXED_DATA
);
6134 Status
= SampGetObjectAttribute(UserObject
,
6139 if (!NT_SUCCESS(Status
))
6142 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
6143 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
6145 Status
= SampSetObjectAttribute(UserObject
,
6157 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
6158 PSAMPR_USER_INFO_BUFFER Buffer
)
6160 SAM_USER_FIXED_DATA FixedData
;
6163 NTSTATUS Status
= STATUS_SUCCESS
;
6165 WhichFields
= Buffer
->All
.WhichFields
;
6167 if (WhichFields
& USER_ALL_USERNAME
)
6169 Status
= SampSetObjectAttribute(UserObject
,
6172 Buffer
->All
.UserName
.Buffer
,
6173 Buffer
->All
.UserName
.MaximumLength
);
6174 if (!NT_SUCCESS(Status
))
6178 if (WhichFields
& USER_ALL_FULLNAME
)
6180 Status
= SampSetObjectAttribute(UserObject
,
6183 Buffer
->All
.FullName
.Buffer
,
6184 Buffer
->All
.FullName
.MaximumLength
);
6185 if (!NT_SUCCESS(Status
))
6189 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
6191 Status
= SampSetObjectAttribute(UserObject
,
6194 Buffer
->All
.AdminComment
.Buffer
,
6195 Buffer
->All
.AdminComment
.MaximumLength
);
6196 if (!NT_SUCCESS(Status
))
6200 if (WhichFields
& USER_ALL_USERCOMMENT
)
6202 Status
= SampSetObjectAttribute(UserObject
,
6205 Buffer
->All
.UserComment
.Buffer
,
6206 Buffer
->All
.UserComment
.MaximumLength
);
6207 if (!NT_SUCCESS(Status
))
6211 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
6213 Status
= SampSetObjectAttribute(UserObject
,
6216 Buffer
->All
.HomeDirectory
.Buffer
,
6217 Buffer
->All
.HomeDirectory
.MaximumLength
);
6218 if (!NT_SUCCESS(Status
))
6222 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6224 Status
= SampSetObjectAttribute(UserObject
,
6225 L
"HomeDirectoryDrive",
6227 Buffer
->All
.HomeDirectoryDrive
.Buffer
,
6228 Buffer
->All
.HomeDirectoryDrive
.MaximumLength
);
6229 if (!NT_SUCCESS(Status
))
6233 if (WhichFields
& USER_ALL_SCRIPTPATH
)
6235 Status
= SampSetObjectAttribute(UserObject
,
6238 Buffer
->All
.ScriptPath
.Buffer
,
6239 Buffer
->All
.ScriptPath
.MaximumLength
);
6240 if (!NT_SUCCESS(Status
))
6244 if (WhichFields
& USER_ALL_PROFILEPATH
)
6246 Status
= SampSetObjectAttribute(UserObject
,
6249 Buffer
->All
.ProfilePath
.Buffer
,
6250 Buffer
->All
.ProfilePath
.MaximumLength
);
6251 if (!NT_SUCCESS(Status
))
6255 if (WhichFields
& USER_ALL_WORKSTATIONS
)
6257 Status
= SampSetObjectAttribute(UserObject
,
6260 Buffer
->All
.WorkStations
.Buffer
,
6261 Buffer
->All
.WorkStations
.MaximumLength
);
6262 if (!NT_SUCCESS(Status
))
6266 if (WhichFields
& USER_ALL_PARAMETERS
)
6268 Status
= SampSetObjectAttribute(UserObject
,
6271 Buffer
->All
.Parameters
.Buffer
,
6272 Buffer
->All
.Parameters
.MaximumLength
);
6275 if (WhichFields
& (USER_ALL_PRIMARYGROUPID
|
6276 USER_ALL_ACCOUNTEXPIRES
|
6277 USER_ALL_USERACCOUNTCONTROL
|
6278 USER_ALL_COUNTRYCODE
|
6281 Length
= sizeof(SAM_USER_FIXED_DATA
);
6282 Status
= SampGetObjectAttribute(UserObject
,
6287 if (!NT_SUCCESS(Status
))
6290 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
6291 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
6293 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
6295 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
6296 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
6299 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
6300 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
6302 if (WhichFields
& USER_ALL_COUNTRYCODE
)
6303 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6305 if (WhichFields
& USER_ALL_CODEPAGE
)
6306 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6308 Status
= SampSetObjectAttribute(UserObject
,
6313 if (!NT_SUCCESS(Status
))
6320 USER_ALL_NTPASSWORDPRESENT
6321 USER_ALL_LMPASSWORDPRESENT
6322 USER_ALL_PASSWORDEXPIRED
6334 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
6335 IN USER_INFORMATION_CLASS UserInformationClass
,
6336 IN PSAMPR_USER_INFO_BUFFER Buffer
)
6338 PSAM_DB_OBJECT UserObject
;
6339 ACCESS_MASK DesiredAccess
;
6342 TRACE("SamrSetInformationUser(%p %lu %p)\n",
6343 UserHandle
, UserInformationClass
, Buffer
);
6345 switch (UserInformationClass
)
6347 case UserLogonHoursInformation
:
6348 case UserNameInformation
:
6349 case UserAccountNameInformation
:
6350 case UserFullNameInformation
:
6351 case UserPrimaryGroupInformation
:
6352 case UserHomeInformation
:
6353 case UserScriptInformation
:
6354 case UserProfileInformation
:
6355 case UserAdminCommentInformation
:
6356 case UserWorkStationsInformation
:
6357 case UserControlInformation
:
6358 case UserExpiresInformation
:
6359 case UserParametersInformation
:
6360 DesiredAccess
= USER_WRITE_ACCOUNT
;
6363 case UserGeneralInformation
:
6364 DesiredAccess
= USER_WRITE_ACCOUNT
|
6365 USER_WRITE_PREFERENCES
;
6368 case UserPreferencesInformation
:
6369 DesiredAccess
= USER_WRITE_PREFERENCES
;
6372 case UserSetPasswordInformation
:
6373 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
6376 case UserAllInformation
:
6377 DesiredAccess
= 0; /* FIXME */
6381 return STATUS_INVALID_INFO_CLASS
;
6384 /* Validate the domain handle */
6385 Status
= SampValidateDbObject(UserHandle
,
6389 if (!NT_SUCCESS(Status
))
6391 TRACE("failed with status 0x%08lx\n", Status
);
6395 switch (UserInformationClass
)
6397 case UserGeneralInformation
:
6398 Status
= SampSetUserGeneral(UserObject
,
6402 case UserPreferencesInformation
:
6403 Status
= SampSetUserPreferences(UserObject
,
6407 case UserLogonHoursInformation:
6408 Status = SampSetUserLogonHours(UserObject,
6412 case UserNameInformation
:
6413 Status
= SampSetObjectAttribute(UserObject
,
6416 Buffer
->Name
.UserName
.Buffer
,
6417 Buffer
->Name
.UserName
.MaximumLength
);
6418 if (!NT_SUCCESS(Status
))
6421 Status
= SampSetObjectAttribute(UserObject
,
6424 Buffer
->Name
.FullName
.Buffer
,
6425 Buffer
->Name
.FullName
.MaximumLength
);
6428 case UserAccountNameInformation
:
6429 Status
= SampSetObjectAttribute(UserObject
,
6432 Buffer
->AccountName
.UserName
.Buffer
,
6433 Buffer
->AccountName
.UserName
.MaximumLength
);
6436 case UserFullNameInformation
:
6437 Status
= SampSetObjectAttribute(UserObject
,
6440 Buffer
->FullName
.FullName
.Buffer
,
6441 Buffer
->FullName
.FullName
.MaximumLength
);
6444 case UserPrimaryGroupInformation
:
6445 Status
= SampSetUserPrimaryGroup(UserObject
,
6449 case UserHomeInformation
:
6450 Status
= SampSetObjectAttribute(UserObject
,
6453 Buffer
->Home
.HomeDirectory
.Buffer
,
6454 Buffer
->Home
.HomeDirectory
.MaximumLength
);
6455 if (!NT_SUCCESS(Status
))
6458 Status
= SampSetObjectAttribute(UserObject
,
6459 L
"HomeDirectoryDrive",
6461 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
6462 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
6465 case UserScriptInformation
:
6466 Status
= SampSetObjectAttribute(UserObject
,
6469 Buffer
->Script
.ScriptPath
.Buffer
,
6470 Buffer
->Script
.ScriptPath
.MaximumLength
);
6473 case UserProfileInformation
:
6474 Status
= SampSetObjectAttribute(UserObject
,
6477 Buffer
->Profile
.ProfilePath
.Buffer
,
6478 Buffer
->Profile
.ProfilePath
.MaximumLength
);
6481 case UserAdminCommentInformation
:
6482 Status
= SampSetObjectAttribute(UserObject
,
6485 Buffer
->AdminComment
.AdminComment
.Buffer
,
6486 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
6489 case UserWorkStationsInformation
:
6490 Status
= SampSetObjectAttribute(UserObject
,
6493 Buffer
->WorkStations
.WorkStations
.Buffer
,
6494 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
6497 case UserSetPasswordInformation
:
6498 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
6499 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
6501 Status
= SampSetObjectAttribute(UserObject
,
6504 Buffer
->SetPassword
.Password
.Buffer
,
6505 Buffer
->SetPassword
.Password
.MaximumLength
);
6508 case UserControlInformation
:
6509 Status
= SampSetUserControl(UserObject
,
6513 case UserExpiresInformation
:
6514 Status
= SampSetUserExpires(UserObject
,
6518 // case UserInternal1Information:
6520 case UserParametersInformation
:
6521 Status
= SampSetObjectAttribute(UserObject
,
6524 Buffer
->Parameters
.Parameters
.Buffer
,
6525 Buffer
->Parameters
.Parameters
.MaximumLength
);
6528 case UserAllInformation
:
6529 Status
= SampSetUserAll(UserObject
,
6533 // case UserInternal4Information:
6534 // case UserInternal5Information:
6535 // case UserInternal4InformationNew:
6536 // case UserInternal5InformationNew:
6539 Status
= STATUS_INVALID_INFO_CLASS
;
6549 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
6550 IN
unsigned char LmPresent
,
6551 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
6552 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
6553 IN
unsigned char NtPresent
,
6554 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
6555 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
6556 IN
unsigned char NtCrossEncryptionPresent
,
6557 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
6558 IN
unsigned char LmCrossEncryptionPresent
,
6559 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
6562 return STATUS_NOT_IMPLEMENTED
;
6568 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
6569 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
6572 return STATUS_NOT_IMPLEMENTED
;
6578 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
6579 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6580 IN
unsigned long Index
,
6581 IN
unsigned long EntryCount
,
6582 IN
unsigned long PreferredMaximumLength
,
6583 OUT
unsigned long *TotalAvailable
,
6584 OUT
unsigned long *TotalReturned
,
6585 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6588 return STATUS_NOT_IMPLEMENTED
;
6594 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
6595 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6596 IN PRPC_UNICODE_STRING Prefix
,
6597 OUT
unsigned long *Index
)
6600 return STATUS_NOT_IMPLEMENTED
;
6606 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
6609 return STATUS_NOT_IMPLEMENTED
;
6615 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
6618 return STATUS_NOT_IMPLEMENTED
;
6624 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
6625 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6628 return STATUS_NOT_IMPLEMENTED
;
6634 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
6635 IN PRPC_SID MemberSid
)
6638 return STATUS_NOT_IMPLEMENTED
;
6644 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
6645 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
6646 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
6649 return STATUS_NOT_IMPLEMENTED
;
6655 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
6656 IN USER_INFORMATION_CLASS UserInformationClass
,
6657 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6660 return STATUS_NOT_IMPLEMENTED
;
6666 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
6667 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6668 IN
unsigned long Index
,
6669 IN
unsigned long EntryCount
,
6670 IN
unsigned long PreferredMaximumLength
,
6671 OUT
unsigned long *TotalAvailable
,
6672 OUT
unsigned long *TotalReturned
,
6673 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6676 return STATUS_NOT_IMPLEMENTED
;
6682 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
6683 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6684 IN PRPC_UNICODE_STRING Prefix
,
6685 OUT
unsigned long *Index
)
6688 return STATUS_NOT_IMPLEMENTED
;
6695 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
6696 IN PRPC_UNICODE_STRING Name
,
6697 IN
unsigned long AccountType
,
6698 IN ACCESS_MASK DesiredAccess
,
6699 OUT SAMPR_HANDLE
*UserHandle
,
6700 OUT
unsigned long *GrantedAccess
,
6701 OUT
unsigned long *RelativeId
)
6703 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
6704 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
6705 SAM_USER_FIXED_DATA FixedUserData
;
6706 PSAM_DB_OBJECT DomainObject
;
6707 PSAM_DB_OBJECT UserObject
;
6713 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
6714 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
6717 Name
->Length
== 0 ||
6718 Name
->Buffer
== NULL
||
6719 UserHandle
== NULL
||
6721 return STATUS_INVALID_PARAMETER
;
6723 /* Check for valid account type */
6724 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
6725 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
6726 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
6727 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
6728 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
6729 return STATUS_INVALID_PARAMETER
;
6731 /* Map generic access rights */
6732 RtlMapGenericMask(&DesiredAccess
,
6735 /* Validate the domain handle */
6736 Status
= SampValidateDbObject(DomainHandle
,
6740 if (!NT_SUCCESS(Status
))
6742 TRACE("failed with status 0x%08lx\n", Status
);
6746 /* Check if the user name already exists in the domain */
6747 Status
= SampCheckAccountNameInDomain(DomainObject
,
6749 if (!NT_SUCCESS(Status
))
6751 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
6752 Name
->Buffer
, Status
);
6756 /* Get the fixed domain attributes */
6757 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6758 Status
= SampGetObjectAttribute(DomainObject
,
6761 (PVOID
)&FixedDomainData
,
6763 if (!NT_SUCCESS(Status
))
6765 TRACE("failed with status 0x%08lx\n", Status
);
6769 /* Increment the NextRid attribute */
6770 ulRid
= FixedDomainData
.NextRid
;
6771 FixedDomainData
.NextRid
++;
6773 /* Store the fixed domain attributes */
6774 Status
= SampSetObjectAttribute(DomainObject
,
6779 if (!NT_SUCCESS(Status
))
6781 TRACE("failed with status 0x%08lx\n", Status
);
6785 TRACE("RID: %lx\n", ulRid
);
6787 /* Convert the RID into a string (hex) */
6788 swprintf(szRid
, L
"%08lX", ulRid
);
6790 /* Create the user object */
6791 Status
= SampCreateDbObject(DomainObject
,
6798 if (!NT_SUCCESS(Status
))
6800 TRACE("failed with status 0x%08lx\n", Status
);
6804 /* Add the account name for the user object */
6805 Status
= SampSetAccountNameInDomain(DomainObject
,
6809 if (!NT_SUCCESS(Status
))
6811 TRACE("failed with status 0x%08lx\n", Status
);
6815 /* Initialize fixed user data */
6816 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
6817 FixedUserData
.Version
= 1;
6818 FixedUserData
.LastLogon
.QuadPart
= 0;
6819 FixedUserData
.LastLogoff
.QuadPart
= 0;
6820 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
6821 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
6822 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
6823 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
6824 FixedUserData
.UserId
= ulRid
;
6825 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
6826 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
6827 USER_PASSWORD_NOT_REQUIRED
|
6830 /* Set fixed user data attribute */
6831 Status
= SampSetObjectAttribute(UserObject
,
6834 (LPVOID
)&FixedUserData
,
6835 sizeof(SAM_USER_FIXED_DATA
));
6836 if (!NT_SUCCESS(Status
))
6838 TRACE("failed with status 0x%08lx\n", Status
);
6842 /* Set the Name attribute */
6843 Status
= SampSetObjectAttribute(UserObject
,
6846 (LPVOID
)Name
->Buffer
,
6847 Name
->MaximumLength
);
6848 if (!NT_SUCCESS(Status
))
6850 TRACE("failed with status 0x%08lx\n", Status
);
6854 /* Set the FullName attribute */
6855 Status
= SampSetObjectAttribute(UserObject
,
6859 EmptyString
.MaximumLength
);
6860 if (!NT_SUCCESS(Status
))
6862 TRACE("failed with status 0x%08lx\n", Status
);
6866 /* Set the HomeDirectory attribute */
6867 Status
= SampSetObjectAttribute(UserObject
,
6871 EmptyString
.MaximumLength
);
6872 if (!NT_SUCCESS(Status
))
6874 TRACE("failed with status 0x%08lx\n", Status
);
6878 /* Set the HomeDirectoryDrive attribute */
6879 Status
= SampSetObjectAttribute(UserObject
,
6880 L
"HomeDirectoryDrive",
6883 EmptyString
.MaximumLength
);
6884 if (!NT_SUCCESS(Status
))
6886 TRACE("failed with status 0x%08lx\n", Status
);
6890 /* Set the ScriptPath attribute */
6891 Status
= SampSetObjectAttribute(UserObject
,
6895 EmptyString
.MaximumLength
);
6896 if (!NT_SUCCESS(Status
))
6898 TRACE("failed with status 0x%08lx\n", Status
);
6902 /* Set the ProfilePath attribute */
6903 Status
= SampSetObjectAttribute(UserObject
,
6907 EmptyString
.MaximumLength
);
6908 if (!NT_SUCCESS(Status
))
6910 TRACE("failed with status 0x%08lx\n", Status
);
6914 /* Set the AdminComment attribute */
6915 Status
= SampSetObjectAttribute(UserObject
,
6919 EmptyString
.MaximumLength
);
6920 if (!NT_SUCCESS(Status
))
6922 TRACE("failed with status 0x%08lx\n", Status
);
6926 /* Set the UserComment attribute */
6927 Status
= SampSetObjectAttribute(UserObject
,
6931 EmptyString
.MaximumLength
);
6932 if (!NT_SUCCESS(Status
))
6934 TRACE("failed with status 0x%08lx\n", Status
);
6938 /* Set the WorkStations attribute */
6939 Status
= SampSetObjectAttribute(UserObject
,
6943 EmptyString
.MaximumLength
);
6944 if (!NT_SUCCESS(Status
))
6946 TRACE("failed with status 0x%08lx\n", Status
);
6950 /* FIXME: Set default user attributes */
6952 if (NT_SUCCESS(Status
))
6954 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
6955 *RelativeId
= ulRid
;
6956 *GrantedAccess
= UserObject
->Access
;
6959 TRACE("returns with status 0x%08lx\n", Status
);
6968 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
6969 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6970 IN
unsigned long Index
,
6971 IN
unsigned long EntryCount
,
6972 IN
unsigned long PreferredMaximumLength
,
6973 OUT
unsigned long *TotalAvailable
,
6974 OUT
unsigned long *TotalReturned
,
6975 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6978 return STATUS_NOT_IMPLEMENTED
;
6985 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
6986 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6989 NTSTATUS Status
= STATUS_SUCCESS
;
6991 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
6992 AliasHandle
, MembersBuffer
);
6994 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6996 Status
= SamrAddMemberToAlias(AliasHandle
,
6997 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6999 if (Status
== STATUS_MEMBER_IN_ALIAS
)
7000 Status
= STATUS_SUCCESS
;
7002 if (!NT_SUCCESS(Status
))
7013 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
7014 IN PSAMPR_PSID_ARRAY MembersBuffer
)
7017 NTSTATUS Status
= STATUS_SUCCESS
;
7019 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
7020 AliasHandle
, MembersBuffer
);
7022 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
7024 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
7025 ((PSID
*)MembersBuffer
->Sids
)[i
]);
7027 if (Status
== STATUS_MEMBER_IN_ALIAS
)
7028 Status
= STATUS_SUCCESS
;
7030 if (!NT_SUCCESS(Status
))
7041 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
7042 IN PRPC_STRING ServerName
,
7043 IN PRPC_STRING UserName
,
7044 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
7045 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
7048 return STATUS_NOT_IMPLEMENTED
;
7054 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
7055 IN PRPC_UNICODE_STRING ServerName
,
7056 IN PRPC_UNICODE_STRING UserName
,
7057 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
7058 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
7059 IN
unsigned char LmPresent
,
7060 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
7061 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
7064 return STATUS_NOT_IMPLEMENTED
;
7070 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
7071 IN PRPC_UNICODE_STRING Unused
,
7072 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
7075 return STATUS_NOT_IMPLEMENTED
;
7081 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
7082 OUT SAMPR_HANDLE
*ServerHandle
,
7083 IN ACCESS_MASK DesiredAccess
)
7086 return STATUS_NOT_IMPLEMENTED
;
7093 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
7094 IN USER_INFORMATION_CLASS UserInformationClass
,
7095 IN PSAMPR_USER_INFO_BUFFER Buffer
)
7097 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
7099 return SamrSetInformationUser(UserHandle
,
7100 UserInformationClass
,
7108 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7111 return STATUS_NOT_IMPLEMENTED
;
7117 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7120 return STATUS_NOT_IMPLEMENTED
;
7126 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
7129 return STATUS_NOT_IMPLEMENTED
;
7135 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
7136 OUT SAMPR_HANDLE
*ServerHandle
,
7137 IN
unsigned long ClientRevision
,
7138 IN ACCESS_MASK DesiredAccess
)
7141 return STATUS_NOT_IMPLEMENTED
;
7147 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
7150 return STATUS_NOT_IMPLEMENTED
;
7156 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
7157 IN ACCESS_MASK DesiredAccess
,
7158 IN
unsigned long InVersion
,
7159 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
7160 OUT
unsigned long *OutVersion
,
7161 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
7162 OUT SAMPR_HANDLE
*ServerHandle
)
7165 return STATUS_NOT_IMPLEMENTED
;
7171 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
7172 IN
unsigned long Rid
,
7176 return STATUS_NOT_IMPLEMENTED
;
7182 SamrSetDSRMPassword(IN handle_t BindingHandle
,
7183 IN PRPC_UNICODE_STRING Unused
,
7184 IN
unsigned long UserId
,
7185 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
7188 return STATUS_NOT_IMPLEMENTED
;
7194 SamrValidatePassword(IN handle_t Handle
,
7195 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
7196 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
7197 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
7200 return STATUS_NOT_IMPLEMENTED
;