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 HANDLE MembersKeyHandle
= NULL
;
3597 SAM_GROUP_FIXED_DATA FixedData
;
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 /* Open the Members subkey */
3637 Status
= SampRegOpenKey(GroupObject
->KeyHandle
,
3641 if (!NT_SUCCESS(Status
))
3643 TRACE("Status 0x%08lx\n", Status
);
3647 /* Retrieve the number of members of the alias */
3648 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3650 &InfoBuffer
->General
.MemberCount
);
3651 if (!NT_SUCCESS(Status
))
3653 TRACE("Status 0x%08lx\n", Status
);
3657 *Buffer
= InfoBuffer
;
3660 if (MembersKeyHandle
!= NULL
)
3661 SampRegCloseKey(MembersKeyHandle
);
3663 if (!NT_SUCCESS(Status
))
3665 if (InfoBuffer
!= NULL
)
3667 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3668 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3670 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3671 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3673 midl_user_free(InfoBuffer
);
3682 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3683 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3685 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3690 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3691 if (InfoBuffer
== NULL
)
3692 return STATUS_INSUFFICIENT_RESOURCES
;
3694 Status
= SampGetObjectAttributeString(GroupObject
,
3696 &InfoBuffer
->Name
.Name
);
3697 if (!NT_SUCCESS(Status
))
3699 TRACE("Status 0x%08lx\n", Status
);
3703 *Buffer
= InfoBuffer
;
3706 if (!NT_SUCCESS(Status
))
3708 if (InfoBuffer
!= NULL
)
3710 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3711 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3713 midl_user_free(InfoBuffer
);
3722 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3723 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3725 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3726 SAM_GROUP_FIXED_DATA FixedData
;
3732 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3733 if (InfoBuffer
== NULL
)
3734 return STATUS_INSUFFICIENT_RESOURCES
;
3736 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3737 Status
= SampGetObjectAttribute(GroupObject
,
3742 if (!NT_SUCCESS(Status
))
3745 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3747 *Buffer
= InfoBuffer
;
3750 if (!NT_SUCCESS(Status
))
3752 if (InfoBuffer
!= NULL
)
3754 midl_user_free(InfoBuffer
);
3763 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3764 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3766 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3771 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3772 if (InfoBuffer
== NULL
)
3773 return STATUS_INSUFFICIENT_RESOURCES
;
3775 Status
= SampGetObjectAttributeString(GroupObject
,
3777 &InfoBuffer
->AdminComment
.AdminComment
);
3778 if (!NT_SUCCESS(Status
))
3780 TRACE("Status 0x%08lx\n", Status
);
3784 *Buffer
= InfoBuffer
;
3787 if (!NT_SUCCESS(Status
))
3789 if (InfoBuffer
!= NULL
)
3791 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3792 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3794 midl_user_free(InfoBuffer
);
3805 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3806 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3807 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3809 PSAM_DB_OBJECT GroupObject
;
3812 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
3813 GroupHandle
, GroupInformationClass
, Buffer
);
3815 /* Validate the group handle */
3816 Status
= SampValidateDbObject(GroupHandle
,
3818 GROUP_READ_INFORMATION
,
3820 if (!NT_SUCCESS(Status
))
3823 switch (GroupInformationClass
)
3825 case GroupGeneralInformation
:
3826 Status
= SampQueryGroupGeneral(GroupObject
,
3830 case GroupNameInformation
:
3831 Status
= SampQueryGroupName(GroupObject
,
3835 case GroupAttributeInformation
:
3836 Status
= SampQueryGroupAttribute(GroupObject
,
3840 case GroupAdminCommentInformation
:
3841 Status
= SampQueryGroupAdminComment(GroupObject
,
3846 Status
= STATUS_INVALID_INFO_CLASS
;
3855 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3856 PSAMPR_GROUP_INFO_BUFFER Buffer
)
3858 SAM_GROUP_FIXED_DATA FixedData
;
3862 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3863 Status
= SampGetObjectAttribute(GroupObject
,
3868 if (!NT_SUCCESS(Status
))
3871 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
3873 Status
= SampSetObjectAttribute(GroupObject
,
3887 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3888 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3889 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
3891 PSAM_DB_OBJECT GroupObject
;
3894 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
3895 GroupHandle
, GroupInformationClass
, Buffer
);
3897 /* Validate the group handle */
3898 Status
= SampValidateDbObject(GroupHandle
,
3900 GROUP_WRITE_ACCOUNT
,
3902 if (!NT_SUCCESS(Status
))
3905 switch (GroupInformationClass
)
3907 case GroupNameInformation
:
3908 Status
= SampSetObjectAttribute(GroupObject
,
3911 Buffer
->Name
.Name
.Buffer
,
3912 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3915 case GroupAttributeInformation
:
3916 Status
= SampSetGroupAttribute(GroupObject
,
3920 case GroupAdminCommentInformation
:
3921 Status
= SampSetObjectAttribute(GroupObject
,
3924 Buffer
->AdminComment
.AdminComment
.Buffer
,
3925 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
3929 Status
= STATUS_INVALID_INFO_CLASS
;
3940 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
3941 IN
unsigned long MemberId
,
3942 IN
unsigned long Attributes
)
3945 return STATUS_NOT_IMPLEMENTED
;
3951 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
3954 return STATUS_NOT_IMPLEMENTED
;
3960 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
3961 IN
unsigned long MemberId
)
3964 return STATUS_NOT_IMPLEMENTED
;
3970 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
3971 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
3974 return STATUS_NOT_IMPLEMENTED
;
3980 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
3981 IN
unsigned long MemberId
,
3982 IN
unsigned long Attributes
)
3985 return STATUS_NOT_IMPLEMENTED
;
3992 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
3993 IN ACCESS_MASK DesiredAccess
,
3995 OUT SAMPR_HANDLE
*AliasHandle
)
3997 PSAM_DB_OBJECT DomainObject
;
3998 PSAM_DB_OBJECT AliasObject
;
4002 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4003 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4005 /* Map generic access rights */
4006 RtlMapGenericMask(&DesiredAccess
,
4009 /* Validate the domain handle */
4010 Status
= SampValidateDbObject(DomainHandle
,
4014 if (!NT_SUCCESS(Status
))
4016 TRACE("failed with status 0x%08lx\n", Status
);
4020 /* Convert the RID into a string (hex) */
4021 swprintf(szRid
, L
"%08lX", AliasId
);
4023 /* Create the alias object */
4024 Status
= SampOpenDbObject(DomainObject
,
4031 if (!NT_SUCCESS(Status
))
4033 TRACE("failed with status 0x%08lx\n", Status
);
4037 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4039 return STATUS_SUCCESS
;
4044 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4045 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4047 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4048 HANDLE MembersKeyHandle
= NULL
;
4053 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4054 if (InfoBuffer
== NULL
)
4055 return STATUS_INSUFFICIENT_RESOURCES
;
4057 Status
= SampGetObjectAttributeString(AliasObject
,
4059 &InfoBuffer
->General
.Name
);
4060 if (!NT_SUCCESS(Status
))
4062 TRACE("Status 0x%08lx\n", Status
);
4066 Status
= SampGetObjectAttributeString(AliasObject
,
4068 &InfoBuffer
->General
.AdminComment
);
4069 if (!NT_SUCCESS(Status
))
4071 TRACE("Status 0x%08lx\n", Status
);
4075 /* Open the Members subkey */
4076 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4080 if (NT_SUCCESS(Status
))
4082 /* Retrieve the number of members of the alias */
4083 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4085 &InfoBuffer
->General
.MemberCount
);
4086 if (!NT_SUCCESS(Status
))
4088 TRACE("Status 0x%08lx\n", Status
);
4092 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4094 InfoBuffer
->General
.MemberCount
= 0;
4095 Status
= STATUS_SUCCESS
;
4099 TRACE("Status 0x%08lx\n", Status
);
4103 *Buffer
= InfoBuffer
;
4106 if (MembersKeyHandle
!= NULL
)
4107 SampRegCloseKey(MembersKeyHandle
);
4109 if (!NT_SUCCESS(Status
))
4111 if (InfoBuffer
!= NULL
)
4113 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4114 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4116 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4117 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4119 midl_user_free(InfoBuffer
);
4128 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4129 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4131 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4136 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4137 if (InfoBuffer
== NULL
)
4138 return STATUS_INSUFFICIENT_RESOURCES
;
4140 Status
= SampGetObjectAttributeString(AliasObject
,
4142 &InfoBuffer
->Name
.Name
);
4143 if (!NT_SUCCESS(Status
))
4145 TRACE("Status 0x%08lx\n", Status
);
4149 *Buffer
= InfoBuffer
;
4152 if (!NT_SUCCESS(Status
))
4154 if (InfoBuffer
!= NULL
)
4156 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4157 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4159 midl_user_free(InfoBuffer
);
4168 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4169 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4171 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4176 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4177 if (InfoBuffer
== NULL
)
4178 return STATUS_INSUFFICIENT_RESOURCES
;
4180 Status
= SampGetObjectAttributeString(AliasObject
,
4182 &InfoBuffer
->AdminComment
.AdminComment
);
4183 if (!NT_SUCCESS(Status
))
4185 TRACE("Status 0x%08lx\n", Status
);
4189 *Buffer
= InfoBuffer
;
4192 if (!NT_SUCCESS(Status
))
4194 if (InfoBuffer
!= NULL
)
4196 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4197 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4199 midl_user_free(InfoBuffer
);
4210 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4211 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4212 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4214 PSAM_DB_OBJECT AliasObject
;
4217 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4218 AliasHandle
, AliasInformationClass
, Buffer
);
4220 /* Validate the alias handle */
4221 Status
= SampValidateDbObject(AliasHandle
,
4223 ALIAS_READ_INFORMATION
,
4225 if (!NT_SUCCESS(Status
))
4228 switch (AliasInformationClass
)
4230 case AliasGeneralInformation
:
4231 Status
= SampQueryAliasGeneral(AliasObject
,
4235 case AliasNameInformation
:
4236 Status
= SampQueryAliasName(AliasObject
,
4240 case AliasAdminCommentInformation
:
4241 Status
= SampQueryAliasAdminComment(AliasObject
,
4246 Status
= STATUS_INVALID_INFO_CLASS
;
4257 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4258 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4259 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4261 PSAM_DB_OBJECT AliasObject
;
4264 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4265 AliasHandle
, AliasInformationClass
, Buffer
);
4267 /* Validate the alias handle */
4268 Status
= SampValidateDbObject(AliasHandle
,
4270 ALIAS_WRITE_ACCOUNT
,
4272 if (!NT_SUCCESS(Status
))
4275 switch (AliasInformationClass
)
4277 case AliasNameInformation
:
4278 Status
= SampSetObjectAttribute(AliasObject
,
4281 Buffer
->Name
.Name
.Buffer
,
4282 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4285 case AliasAdminCommentInformation
:
4286 Status
= SampSetObjectAttribute(AliasObject
,
4289 Buffer
->AdminComment
.AdminComment
.Buffer
,
4290 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4294 Status
= STATUS_INVALID_INFO_CLASS
;
4305 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4308 return STATUS_NOT_IMPLEMENTED
;
4315 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4316 IN PRPC_SID MemberId
)
4318 PSAM_DB_OBJECT AliasObject
;
4319 LPWSTR MemberIdString
= NULL
;
4320 HANDLE MembersKeyHandle
= NULL
;
4321 HANDLE MemberKeyHandle
= NULL
;
4322 ULONG MemberIdLength
;
4325 TRACE("SamrAddMemberToAlias(%p %p)\n",
4326 AliasHandle
, MemberId
);
4328 /* Validate the alias handle */
4329 Status
= SampValidateDbObject(AliasHandle
,
4333 if (!NT_SUCCESS(Status
))
4335 TRACE("failed with status 0x%08lx\n", Status
);
4339 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4340 TRACE("Member SID: %S\n", MemberIdString
);
4342 MemberIdLength
= RtlLengthSid(MemberId
);
4344 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4348 if (!NT_SUCCESS(Status
))
4350 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4354 Status
= SampRegSetValue(MembersKeyHandle
,
4359 if (!NT_SUCCESS(Status
))
4361 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4365 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4369 if (!NT_SUCCESS(Status
))
4371 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4375 Status
= SampRegSetValue(MemberKeyHandle
,
4380 if (!NT_SUCCESS(Status
))
4382 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4387 if (MemberKeyHandle
!= NULL
)
4388 SampRegCloseKey(MemberKeyHandle
);
4390 if (MembersKeyHandle
!= NULL
)
4391 SampRegCloseKey(MembersKeyHandle
);
4393 if (MemberIdString
!= NULL
)
4394 LocalFree(MemberIdString
);
4403 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4404 IN PRPC_SID MemberId
)
4406 PSAM_DB_OBJECT AliasObject
;
4407 LPWSTR MemberIdString
= NULL
;
4408 HANDLE MembersKeyHandle
= NULL
;
4409 HANDLE MemberKeyHandle
= NULL
;
4413 TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
4414 AliasHandle
, MemberId
);
4416 /* Validate the alias handle */
4417 Status
= SampValidateDbObject(AliasHandle
,
4419 ALIAS_REMOVE_MEMBER
,
4421 if (!NT_SUCCESS(Status
))
4423 TRACE("failed with status 0x%08lx\n", Status
);
4427 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4428 TRACE("Member SID: %S\n", MemberIdString
);
4430 Status
= SampRegOpenKey(AliasObject
->MembersKeyHandle
,
4432 KEY_WRITE
| KEY_QUERY_VALUE
,
4434 if (!NT_SUCCESS(Status
))
4436 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4440 Status
= SampRegDeleteValue(MemberKeyHandle
,
4442 if (!NT_SUCCESS(Status
))
4444 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4448 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
4451 if (!NT_SUCCESS(Status
))
4453 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4457 if (ulValueCount
== 0)
4459 SampRegCloseKey(MemberKeyHandle
);
4460 MemberKeyHandle
= NULL
;
4462 Status
= SampRegDeleteKey(AliasObject
->MembersKeyHandle
,
4464 if (!NT_SUCCESS(Status
))
4466 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4471 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4473 KEY_WRITE
| KEY_QUERY_VALUE
,
4475 if (!NT_SUCCESS(Status
))
4477 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4481 Status
= SampRegDeleteValue(MembersKeyHandle
,
4483 if (!NT_SUCCESS(Status
))
4485 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4489 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4492 if (!NT_SUCCESS(Status
))
4494 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4498 if (ulValueCount
== 0)
4500 SampRegCloseKey(MembersKeyHandle
);
4501 MembersKeyHandle
= NULL
;
4503 Status
= SampRegDeleteKey(AliasObject
->KeyHandle
,
4505 if (!NT_SUCCESS(Status
))
4507 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4513 if (MemberKeyHandle
!= NULL
)
4514 SampRegCloseKey(MemberKeyHandle
);
4516 if (MembersKeyHandle
!= NULL
)
4517 SampRegCloseKey(MembersKeyHandle
);
4519 if (MemberIdString
!= NULL
)
4520 LocalFree(MemberIdString
);
4529 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4530 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4532 PSAM_DB_OBJECT AliasObject
;
4533 HANDLE MembersKeyHandle
= NULL
;
4534 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4535 ULONG ValueCount
= 0;
4540 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4541 AliasHandle
, Members
);
4543 /* Validate the alias handle */
4544 Status
= SampValidateDbObject(AliasHandle
,
4548 if (!NT_SUCCESS(Status
))
4550 ERR("failed with status 0x%08lx\n", Status
);
4554 /* Open the members key of the alias objct */
4555 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4559 if (!NT_SUCCESS(Status
))
4561 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4565 /* Get the number of members */
4566 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4569 if (!NT_SUCCESS(Status
))
4571 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4575 /* Allocate the member array */
4576 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4577 if (MemberArray
== NULL
)
4579 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4583 /* Enumerate the members */
4587 /* Get the size of the next SID */
4589 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4596 if (!NT_SUCCESS(Status
))
4598 if (Status
== STATUS_NO_MORE_ENTRIES
)
4599 Status
= STATUS_SUCCESS
;
4603 /* Allocate a buffer for the SID */
4604 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4605 if (MemberArray
[Index
].SidPointer
== NULL
)
4607 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4611 /* Read the SID into the buffer */
4612 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4617 (PVOID
)MemberArray
[Index
].SidPointer
,
4619 if (!NT_SUCCESS(Status
))
4627 /* Return the number of members and the member array */
4628 if (NT_SUCCESS(Status
))
4630 Members
->Count
= ValueCount
;
4631 Members
->Sids
= MemberArray
;
4635 /* Clean up the members array and the SID buffers if something failed */
4636 if (!NT_SUCCESS(Status
))
4638 if (MemberArray
!= NULL
)
4640 for (Index
= 0; Index
< ValueCount
; Index
++)
4642 if (MemberArray
[Index
].SidPointer
!= NULL
)
4643 midl_user_free(MemberArray
[Index
].SidPointer
);
4646 midl_user_free(MemberArray
);
4650 /* Close the members key */
4651 if (MembersKeyHandle
!= NULL
)
4652 SampRegCloseKey(MembersKeyHandle
);
4661 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
4662 IN ACCESS_MASK DesiredAccess
,
4663 IN
unsigned long UserId
,
4664 OUT SAMPR_HANDLE
*UserHandle
)
4666 PSAM_DB_OBJECT DomainObject
;
4667 PSAM_DB_OBJECT UserObject
;
4671 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
4672 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
4674 /* Map generic access rights */
4675 RtlMapGenericMask(&DesiredAccess
,
4678 /* Validate the domain handle */
4679 Status
= SampValidateDbObject(DomainHandle
,
4683 if (!NT_SUCCESS(Status
))
4685 TRACE("failed with status 0x%08lx\n", Status
);
4689 /* Convert the RID into a string (hex) */
4690 swprintf(szRid
, L
"%08lX", UserId
);
4692 /* Create the user object */
4693 Status
= SampOpenDbObject(DomainObject
,
4700 if (!NT_SUCCESS(Status
))
4702 TRACE("failed with status 0x%08lx\n", Status
);
4706 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
4708 return STATUS_SUCCESS
;
4715 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
4718 return STATUS_NOT_IMPLEMENTED
;
4724 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
4725 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4727 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4728 SAM_USER_FIXED_DATA FixedData
;
4734 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4735 if (InfoBuffer
== NULL
)
4736 return STATUS_INSUFFICIENT_RESOURCES
;
4738 Length
= sizeof(SAM_USER_FIXED_DATA
);
4739 Status
= SampGetObjectAttribute(UserObject
,
4744 if (!NT_SUCCESS(Status
))
4747 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4749 /* Get the Name string */
4750 Status
= SampGetObjectAttributeString(UserObject
,
4752 &InfoBuffer
->General
.UserName
);
4753 if (!NT_SUCCESS(Status
))
4755 TRACE("Status 0x%08lx\n", Status
);
4759 /* Get the FullName string */
4760 Status
= SampGetObjectAttributeString(UserObject
,
4762 &InfoBuffer
->General
.FullName
);
4763 if (!NT_SUCCESS(Status
))
4765 TRACE("Status 0x%08lx\n", Status
);
4769 /* Get the AdminComment string */
4770 Status
= SampGetObjectAttributeString(UserObject
,
4772 &InfoBuffer
->General
.AdminComment
);
4773 if (!NT_SUCCESS(Status
))
4775 TRACE("Status 0x%08lx\n", Status
);
4779 /* Get the UserComment string */
4780 Status
= SampGetObjectAttributeString(UserObject
,
4782 &InfoBuffer
->General
.UserComment
);
4783 if (!NT_SUCCESS(Status
))
4785 TRACE("Status 0x%08lx\n", Status
);
4789 *Buffer
= InfoBuffer
;
4792 if (!NT_SUCCESS(Status
))
4794 if (InfoBuffer
!= NULL
)
4796 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
4797 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
4799 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
4800 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
4802 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4803 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4805 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
4806 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
4808 midl_user_free(InfoBuffer
);
4818 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
4819 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4821 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4822 SAM_USER_FIXED_DATA FixedData
;
4828 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4829 if (InfoBuffer
== NULL
)
4830 return STATUS_INSUFFICIENT_RESOURCES
;
4832 Length
= sizeof(SAM_USER_FIXED_DATA
);
4833 Status
= SampGetObjectAttribute(UserObject
,
4838 if (!NT_SUCCESS(Status
))
4841 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
4842 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
4844 /* Get the UserComment string */
4845 Status
= SampGetObjectAttributeString(UserObject
,
4847 &InfoBuffer
->Preferences
.UserComment
);
4848 if (!NT_SUCCESS(Status
))
4850 TRACE("Status 0x%08lx\n", Status
);
4854 *Buffer
= InfoBuffer
;
4857 if (!NT_SUCCESS(Status
))
4859 if (InfoBuffer
!= NULL
)
4861 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
4862 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
4864 midl_user_free(InfoBuffer
);
4874 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
4875 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4877 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4878 SAM_USER_FIXED_DATA FixedData
;
4884 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4885 if (InfoBuffer
== NULL
)
4886 return STATUS_INSUFFICIENT_RESOURCES
;
4888 Length
= sizeof(SAM_USER_FIXED_DATA
);
4889 Status
= SampGetObjectAttribute(UserObject
,
4894 if (!NT_SUCCESS(Status
))
4897 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
4898 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4899 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4900 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4901 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4902 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4903 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4904 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4905 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4906 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
4907 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
4909 // OLD_LARGE_INTEGER PasswordCanChange;
4910 // OLD_LARGE_INTEGER PasswordMustChange;
4912 /* Get the Name string */
4913 Status
= SampGetObjectAttributeString(UserObject
,
4915 &InfoBuffer
->Logon
.UserName
);
4916 if (!NT_SUCCESS(Status
))
4918 TRACE("Status 0x%08lx\n", Status
);
4922 /* Get the FullName string */
4923 Status
= SampGetObjectAttributeString(UserObject
,
4925 &InfoBuffer
->Logon
.FullName
);
4926 if (!NT_SUCCESS(Status
))
4928 TRACE("Status 0x%08lx\n", Status
);
4932 /* Get the HomeDirectory string */
4933 Status
= SampGetObjectAttributeString(UserObject
,
4935 &InfoBuffer
->Logon
.HomeDirectory
);
4936 if (!NT_SUCCESS(Status
))
4938 TRACE("Status 0x%08lx\n", Status
);
4942 /* Get the HomeDirectoryDrive string */
4943 Status
= SampGetObjectAttributeString(UserObject
,
4944 L
"HomeDirectoryDrive",
4945 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
4946 if (!NT_SUCCESS(Status
))
4948 TRACE("Status 0x%08lx\n", Status
);
4952 /* Get the ScriptPath string */
4953 Status
= SampGetObjectAttributeString(UserObject
,
4955 &InfoBuffer
->Logon
.ScriptPath
);
4956 if (!NT_SUCCESS(Status
))
4958 TRACE("Status 0x%08lx\n", Status
);
4962 /* Get the ProfilePath string */
4963 Status
= SampGetObjectAttributeString(UserObject
,
4965 &InfoBuffer
->Logon
.ProfilePath
);
4966 if (!NT_SUCCESS(Status
))
4968 TRACE("Status 0x%08lx\n", Status
);
4972 /* Get the WorkStations string */
4973 Status
= SampGetObjectAttributeString(UserObject
,
4975 &InfoBuffer
->Logon
.WorkStations
);
4976 if (!NT_SUCCESS(Status
))
4978 TRACE("Status 0x%08lx\n", Status
);
4982 /* FIXME: LogonHours */
4984 *Buffer
= InfoBuffer
;
4987 if (!NT_SUCCESS(Status
))
4989 if (InfoBuffer
!= NULL
)
4991 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
4992 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
4994 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
4995 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
4997 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
4998 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5000 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5001 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5003 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5004 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5006 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5007 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5009 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5010 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5012 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5013 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5015 midl_user_free(InfoBuffer
);
5025 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5026 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5028 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5029 SAM_USER_FIXED_DATA FixedData
;
5035 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5036 if (InfoBuffer
== NULL
)
5037 return STATUS_INSUFFICIENT_RESOURCES
;
5039 Length
= sizeof(SAM_USER_FIXED_DATA
);
5040 Status
= SampGetObjectAttribute(UserObject
,
5045 if (!NT_SUCCESS(Status
))
5048 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5049 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5050 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5051 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5052 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5053 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5054 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5055 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5056 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5057 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5058 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5059 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
5060 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
5062 /* Get the Name string */
5063 Status
= SampGetObjectAttributeString(UserObject
,
5065 &InfoBuffer
->Account
.UserName
);
5066 if (!NT_SUCCESS(Status
))
5068 TRACE("Status 0x%08lx\n", Status
);
5072 /* Get the FullName string */
5073 Status
= SampGetObjectAttributeString(UserObject
,
5075 &InfoBuffer
->Account
.FullName
);
5076 if (!NT_SUCCESS(Status
))
5078 TRACE("Status 0x%08lx\n", Status
);
5082 /* Get the HomeDirectory string */
5083 Status
= SampGetObjectAttributeString(UserObject
,
5085 &InfoBuffer
->Account
.HomeDirectory
);
5086 if (!NT_SUCCESS(Status
))
5088 TRACE("Status 0x%08lx\n", Status
);
5092 /* Get the HomeDirectoryDrive string */
5093 Status
= SampGetObjectAttributeString(UserObject
,
5094 L
"HomeDirectoryDrive",
5095 &InfoBuffer
->Account
.HomeDirectoryDrive
);
5096 if (!NT_SUCCESS(Status
))
5098 TRACE("Status 0x%08lx\n", Status
);
5102 /* Get the ScriptPath string */
5103 Status
= SampGetObjectAttributeString(UserObject
,
5105 &InfoBuffer
->Account
.ScriptPath
);
5106 if (!NT_SUCCESS(Status
))
5108 TRACE("Status 0x%08lx\n", Status
);
5112 /* Get the ProfilePath string */
5113 Status
= SampGetObjectAttributeString(UserObject
,
5115 &InfoBuffer
->Account
.ProfilePath
);
5116 if (!NT_SUCCESS(Status
))
5118 TRACE("Status 0x%08lx\n", Status
);
5122 /* Get the AdminComment string */
5123 Status
= SampGetObjectAttributeString(UserObject
,
5125 &InfoBuffer
->Account
.AdminComment
);
5126 if (!NT_SUCCESS(Status
))
5128 TRACE("Status 0x%08lx\n", Status
);
5132 /* Get the WorkStations string */
5133 Status
= SampGetObjectAttributeString(UserObject
,
5135 &InfoBuffer
->Account
.WorkStations
);
5136 if (!NT_SUCCESS(Status
))
5138 TRACE("Status 0x%08lx\n", Status
);
5142 /* FIXME: LogonHours */
5144 *Buffer
= InfoBuffer
;
5147 if (!NT_SUCCESS(Status
))
5149 if (InfoBuffer
!= NULL
)
5151 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5152 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5154 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5155 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5157 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5158 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5160 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5161 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5163 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5164 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5166 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5167 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5169 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5170 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5172 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5173 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5175 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5176 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5178 midl_user_free(InfoBuffer
);
5185 /* FIXME: SampQueryUserLogonHours */
5189 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
5190 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5192 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5197 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5198 if (InfoBuffer
== NULL
)
5199 return STATUS_INSUFFICIENT_RESOURCES
;
5201 /* Get the Name string */
5202 Status
= SampGetObjectAttributeString(UserObject
,
5204 &InfoBuffer
->Name
.UserName
);
5205 if (!NT_SUCCESS(Status
))
5207 TRACE("Status 0x%08lx\n", Status
);
5211 /* Get the FullName string */
5212 Status
= SampGetObjectAttributeString(UserObject
,
5214 &InfoBuffer
->Name
.FullName
);
5215 if (!NT_SUCCESS(Status
))
5217 TRACE("Status 0x%08lx\n", Status
);
5221 *Buffer
= InfoBuffer
;
5224 if (!NT_SUCCESS(Status
))
5226 if (InfoBuffer
!= NULL
)
5228 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5229 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5231 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5232 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5234 midl_user_free(InfoBuffer
);
5243 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5244 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5246 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5251 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5252 if (InfoBuffer
== NULL
)
5253 return STATUS_INSUFFICIENT_RESOURCES
;
5255 /* Get the Name string */
5256 Status
= SampGetObjectAttributeString(UserObject
,
5258 &InfoBuffer
->AccountName
.UserName
);
5259 if (!NT_SUCCESS(Status
))
5261 TRACE("Status 0x%08lx\n", Status
);
5265 *Buffer
= InfoBuffer
;
5268 if (!NT_SUCCESS(Status
))
5270 if (InfoBuffer
!= NULL
)
5272 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5273 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5275 midl_user_free(InfoBuffer
);
5284 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5285 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5287 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5292 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5293 if (InfoBuffer
== NULL
)
5294 return STATUS_INSUFFICIENT_RESOURCES
;
5296 /* Get the FullName string */
5297 Status
= SampGetObjectAttributeString(UserObject
,
5299 &InfoBuffer
->FullName
.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
->FullName
.FullName
.Buffer
!= NULL
)
5314 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5316 midl_user_free(InfoBuffer
);
5326 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5327 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5329 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5330 SAM_USER_FIXED_DATA FixedData
;
5336 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5337 if (InfoBuffer
== NULL
)
5338 return STATUS_INSUFFICIENT_RESOURCES
;
5340 Length
= sizeof(SAM_USER_FIXED_DATA
);
5341 Status
= SampGetObjectAttribute(UserObject
,
5346 if (!NT_SUCCESS(Status
))
5349 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5351 *Buffer
= InfoBuffer
;
5354 if (!NT_SUCCESS(Status
))
5356 if (InfoBuffer
!= NULL
)
5358 midl_user_free(InfoBuffer
);
5367 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5368 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5370 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5375 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5376 if (InfoBuffer
== NULL
)
5377 return STATUS_INSUFFICIENT_RESOURCES
;
5379 /* Get the HomeDirectory string */
5380 Status
= SampGetObjectAttributeString(UserObject
,
5382 &InfoBuffer
->Home
.HomeDirectory
);
5383 if (!NT_SUCCESS(Status
))
5385 TRACE("Status 0x%08lx\n", Status
);
5389 /* Get the HomeDirectoryDrive string */
5390 Status
= SampGetObjectAttributeString(UserObject
,
5391 L
"HomeDirectoryDrive",
5392 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5393 if (!NT_SUCCESS(Status
))
5395 TRACE("Status 0x%08lx\n", Status
);
5399 *Buffer
= InfoBuffer
;
5402 if (!NT_SUCCESS(Status
))
5404 if (InfoBuffer
!= NULL
)
5406 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5407 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5409 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5410 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5412 midl_user_free(InfoBuffer
);
5421 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5422 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5424 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5429 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5430 if (InfoBuffer
== NULL
)
5431 return STATUS_INSUFFICIENT_RESOURCES
;
5433 /* Get the ScriptPath string */
5434 Status
= SampGetObjectAttributeString(UserObject
,
5436 &InfoBuffer
->Script
.ScriptPath
);
5437 if (!NT_SUCCESS(Status
))
5439 TRACE("Status 0x%08lx\n", Status
);
5443 *Buffer
= InfoBuffer
;
5446 if (!NT_SUCCESS(Status
))
5448 if (InfoBuffer
!= NULL
)
5450 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5451 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5453 midl_user_free(InfoBuffer
);
5462 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5463 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5465 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5470 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5471 if (InfoBuffer
== NULL
)
5472 return STATUS_INSUFFICIENT_RESOURCES
;
5474 /* Get the ProfilePath string */
5475 Status
= SampGetObjectAttributeString(UserObject
,
5477 &InfoBuffer
->Profile
.ProfilePath
);
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
->Profile
.ProfilePath
.Buffer
!= NULL
)
5492 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5494 midl_user_free(InfoBuffer
);
5503 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5504 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5506 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5511 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5512 if (InfoBuffer
== NULL
)
5513 return STATUS_INSUFFICIENT_RESOURCES
;
5515 /* Get the AdminComment string */
5516 Status
= SampGetObjectAttributeString(UserObject
,
5518 &InfoBuffer
->AdminComment
.AdminComment
);
5519 if (!NT_SUCCESS(Status
))
5521 TRACE("Status 0x%08lx\n", Status
);
5525 *Buffer
= InfoBuffer
;
5528 if (!NT_SUCCESS(Status
))
5530 if (InfoBuffer
!= NULL
)
5532 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5533 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5535 midl_user_free(InfoBuffer
);
5544 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5545 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5547 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5552 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5553 if (InfoBuffer
== NULL
)
5554 return STATUS_INSUFFICIENT_RESOURCES
;
5556 /* Get the WorkStations string */
5557 Status
= SampGetObjectAttributeString(UserObject
,
5559 &InfoBuffer
->WorkStations
.WorkStations
);
5560 if (!NT_SUCCESS(Status
))
5562 TRACE("Status 0x%08lx\n", Status
);
5566 *Buffer
= InfoBuffer
;
5569 if (!NT_SUCCESS(Status
))
5571 if (InfoBuffer
!= NULL
)
5573 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
5574 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
5576 midl_user_free(InfoBuffer
);
5586 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
5587 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5589 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5590 SAM_USER_FIXED_DATA FixedData
;
5596 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5597 if (InfoBuffer
== NULL
)
5598 return STATUS_INSUFFICIENT_RESOURCES
;
5600 Length
= sizeof(SAM_USER_FIXED_DATA
);
5601 Status
= SampGetObjectAttribute(UserObject
,
5606 if (!NT_SUCCESS(Status
))
5609 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
5611 *Buffer
= InfoBuffer
;
5614 if (!NT_SUCCESS(Status
))
5616 if (InfoBuffer
!= NULL
)
5618 midl_user_free(InfoBuffer
);
5628 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
5629 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5631 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5632 SAM_USER_FIXED_DATA FixedData
;
5638 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5639 if (InfoBuffer
== NULL
)
5640 return STATUS_INSUFFICIENT_RESOURCES
;
5642 Length
= sizeof(SAM_USER_FIXED_DATA
);
5643 Status
= SampGetObjectAttribute(UserObject
,
5648 if (!NT_SUCCESS(Status
))
5651 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5652 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5654 *Buffer
= InfoBuffer
;
5657 if (!NT_SUCCESS(Status
))
5659 if (InfoBuffer
!= NULL
)
5661 midl_user_free(InfoBuffer
);
5670 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
5671 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5673 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5678 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5679 if (InfoBuffer
== NULL
)
5680 return STATUS_INSUFFICIENT_RESOURCES
;
5682 /* Get the Parameters string */
5683 Status
= SampGetObjectAttributeString(UserObject
,
5685 &InfoBuffer
->Parameters
.Parameters
);
5686 if (!NT_SUCCESS(Status
))
5688 TRACE("Status 0x%08lx\n", Status
);
5692 *Buffer
= InfoBuffer
;
5695 if (!NT_SUCCESS(Status
))
5697 if (InfoBuffer
!= NULL
)
5699 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
5700 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
5702 midl_user_free(InfoBuffer
);
5713 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
5714 IN USER_INFORMATION_CLASS UserInformationClass
,
5715 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
5717 PSAM_DB_OBJECT UserObject
;
5718 ACCESS_MASK DesiredAccess
;
5721 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
5722 UserHandle
, UserInformationClass
, Buffer
);
5724 switch (UserInformationClass
)
5726 case UserGeneralInformation
:
5727 case UserNameInformation
:
5728 case UserAccountNameInformation
:
5729 case UserFullNameInformation
:
5730 case UserPrimaryGroupInformation
:
5731 case UserAdminCommentInformation
:
5732 DesiredAccess
= USER_READ_GENERAL
;
5735 case UserLogonHoursInformation
:
5736 case UserHomeInformation
:
5737 case UserScriptInformation
:
5738 case UserProfileInformation
:
5739 case UserWorkStationsInformation
:
5740 DesiredAccess
= USER_READ_LOGON
;
5743 case UserControlInformation
:
5744 case UserExpiresInformation
:
5745 case UserParametersInformation
:
5746 DesiredAccess
= USER_READ_ACCOUNT
;
5749 case UserPreferencesInformation
:
5750 DesiredAccess
= USER_READ_GENERAL
|
5751 USER_READ_PREFERENCES
;
5754 case UserLogonInformation
:
5755 case UserAccountInformation
:
5756 DesiredAccess
= USER_READ_GENERAL
|
5757 USER_READ_PREFERENCES
|
5763 return STATUS_INVALID_INFO_CLASS
;
5766 /* Validate the domain handle */
5767 Status
= SampValidateDbObject(UserHandle
,
5771 if (!NT_SUCCESS(Status
))
5773 TRACE("failed with status 0x%08lx\n", Status
);
5777 switch (UserInformationClass
)
5779 case UserGeneralInformation
:
5780 Status
= SampQueryUserGeneral(UserObject
,
5784 case UserPreferencesInformation
:
5785 Status
= SampQueryUserPreferences(UserObject
,
5789 case UserLogonInformation
:
5790 Status
= SampQueryUserLogon(UserObject
,
5794 // case UserLogonHoursInformation:
5795 // Status = SampQueryUserLogonHours(UserObject,
5799 case UserAccountInformation
:
5800 Status
= SampQueryUserAccount(UserObject
,
5804 case UserNameInformation
:
5805 Status
= SampQueryUserName(UserObject
,
5809 case UserAccountNameInformation
:
5810 Status
= SampQueryUserAccountName(UserObject
,
5814 case UserFullNameInformation
:
5815 Status
= SampQueryUserFullName(UserObject
,
5819 case UserPrimaryGroupInformation
:
5820 Status
= SampQueryUserPrimaryGroup(UserObject
,
5824 case UserHomeInformation
:
5825 Status
= SampQueryUserHome(UserObject
,
5828 case UserScriptInformation
:
5829 Status
= SampQueryUserScript(UserObject
,
5833 case UserProfileInformation
:
5834 Status
= SampQueryUserProfile(UserObject
,
5838 case UserAdminCommentInformation
:
5839 Status
= SampQueryUserAdminComment(UserObject
,
5843 case UserWorkStationsInformation
:
5844 Status
= SampQueryUserWorkStations(UserObject
,
5848 case UserControlInformation
:
5849 Status
= SampQueryUserControl(UserObject
,
5853 case UserExpiresInformation
:
5854 Status
= SampQueryUserExpires(UserObject
,
5858 // case UserInternal1Information:
5860 case UserParametersInformation
:
5861 Status
= SampQueryUserParameters(UserObject
,
5865 // case UserAllInformation:
5866 // case UserInternal4Information:
5867 // case UserInternal5Information:
5868 // case UserInternal4InformationNew:
5869 // case UserInternal5InformationNew:
5872 Status
= STATUS_INVALID_INFO_CLASS
;
5880 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
5881 PSAMPR_USER_INFO_BUFFER Buffer
)
5883 SAM_USER_FIXED_DATA FixedData
;
5887 Length
= sizeof(SAM_USER_FIXED_DATA
);
5888 Status
= SampGetObjectAttribute(UserObject
,
5893 if (!NT_SUCCESS(Status
))
5896 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
5898 Status
= SampSetObjectAttribute(UserObject
,
5903 if (!NT_SUCCESS(Status
))
5906 Status
= SampSetObjectAttribute(UserObject
,
5909 Buffer
->General
.UserName
.Buffer
,
5910 Buffer
->General
.UserName
.MaximumLength
);
5911 if (!NT_SUCCESS(Status
))
5914 Status
= SampSetObjectAttribute(UserObject
,
5917 Buffer
->General
.FullName
.Buffer
,
5918 Buffer
->General
.FullName
.MaximumLength
);
5919 if (!NT_SUCCESS(Status
))
5922 Status
= SampSetObjectAttribute(UserObject
,
5925 Buffer
->General
.AdminComment
.Buffer
,
5926 Buffer
->General
.AdminComment
.MaximumLength
);
5927 if (!NT_SUCCESS(Status
))
5930 Status
= SampSetObjectAttribute(UserObject
,
5933 Buffer
->General
.UserComment
.Buffer
,
5934 Buffer
->General
.UserComment
.MaximumLength
);
5942 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
5943 PSAMPR_USER_INFO_BUFFER Buffer
)
5945 SAM_USER_FIXED_DATA FixedData
;
5949 Length
= sizeof(SAM_USER_FIXED_DATA
);
5950 Status
= SampGetObjectAttribute(UserObject
,
5955 if (!NT_SUCCESS(Status
))
5958 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
5959 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
5961 Status
= SampSetObjectAttribute(UserObject
,
5966 if (!NT_SUCCESS(Status
))
5969 Status
= SampSetObjectAttribute(UserObject
,
5972 Buffer
->Preferences
.UserComment
.Buffer
,
5973 Buffer
->Preferences
.UserComment
.MaximumLength
);
5981 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5982 PSAMPR_USER_INFO_BUFFER Buffer
)
5984 SAM_USER_FIXED_DATA FixedData
;
5988 Length
= sizeof(SAM_USER_FIXED_DATA
);
5989 Status
= SampGetObjectAttribute(UserObject
,
5994 if (!NT_SUCCESS(Status
))
5997 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
5999 Status
= SampSetObjectAttribute(UserObject
,
6011 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
6012 PSAMPR_USER_INFO_BUFFER Buffer
)
6014 SAM_USER_FIXED_DATA FixedData
;
6018 Length
= sizeof(SAM_USER_FIXED_DATA
);
6019 Status
= SampGetObjectAttribute(UserObject
,
6024 if (!NT_SUCCESS(Status
))
6027 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
6029 Status
= SampSetObjectAttribute(UserObject
,
6041 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
6042 PSAMPR_USER_INFO_BUFFER Buffer
)
6044 SAM_USER_FIXED_DATA FixedData
;
6048 Length
= sizeof(SAM_USER_FIXED_DATA
);
6049 Status
= SampGetObjectAttribute(UserObject
,
6054 if (!NT_SUCCESS(Status
))
6057 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
6058 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
6060 Status
= SampSetObjectAttribute(UserObject
,
6072 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
6073 PSAMPR_USER_INFO_BUFFER Buffer
)
6075 SAM_USER_FIXED_DATA FixedData
;
6078 NTSTATUS Status
= STATUS_SUCCESS
;
6080 WhichFields
= Buffer
->All
.WhichFields
;
6082 if (WhichFields
& USER_ALL_USERNAME
)
6084 Status
= SampSetObjectAttribute(UserObject
,
6087 Buffer
->All
.UserName
.Buffer
,
6088 Buffer
->All
.UserName
.MaximumLength
);
6089 if (!NT_SUCCESS(Status
))
6093 if (WhichFields
& USER_ALL_FULLNAME
)
6095 Status
= SampSetObjectAttribute(UserObject
,
6098 Buffer
->All
.FullName
.Buffer
,
6099 Buffer
->All
.FullName
.MaximumLength
);
6100 if (!NT_SUCCESS(Status
))
6104 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
6106 Status
= SampSetObjectAttribute(UserObject
,
6109 Buffer
->All
.AdminComment
.Buffer
,
6110 Buffer
->All
.AdminComment
.MaximumLength
);
6111 if (!NT_SUCCESS(Status
))
6115 if (WhichFields
& USER_ALL_USERCOMMENT
)
6117 Status
= SampSetObjectAttribute(UserObject
,
6120 Buffer
->All
.UserComment
.Buffer
,
6121 Buffer
->All
.UserComment
.MaximumLength
);
6122 if (!NT_SUCCESS(Status
))
6126 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
6128 Status
= SampSetObjectAttribute(UserObject
,
6131 Buffer
->All
.HomeDirectory
.Buffer
,
6132 Buffer
->All
.HomeDirectory
.MaximumLength
);
6133 if (!NT_SUCCESS(Status
))
6137 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6139 Status
= SampSetObjectAttribute(UserObject
,
6140 L
"HomeDirectoryDrive",
6142 Buffer
->All
.HomeDirectoryDrive
.Buffer
,
6143 Buffer
->All
.HomeDirectoryDrive
.MaximumLength
);
6144 if (!NT_SUCCESS(Status
))
6148 if (WhichFields
& USER_ALL_SCRIPTPATH
)
6150 Status
= SampSetObjectAttribute(UserObject
,
6153 Buffer
->All
.ScriptPath
.Buffer
,
6154 Buffer
->All
.ScriptPath
.MaximumLength
);
6155 if (!NT_SUCCESS(Status
))
6159 if (WhichFields
& USER_ALL_PROFILEPATH
)
6161 Status
= SampSetObjectAttribute(UserObject
,
6164 Buffer
->All
.ProfilePath
.Buffer
,
6165 Buffer
->All
.ProfilePath
.MaximumLength
);
6166 if (!NT_SUCCESS(Status
))
6170 if (WhichFields
& USER_ALL_WORKSTATIONS
)
6172 Status
= SampSetObjectAttribute(UserObject
,
6175 Buffer
->All
.WorkStations
.Buffer
,
6176 Buffer
->All
.WorkStations
.MaximumLength
);
6177 if (!NT_SUCCESS(Status
))
6181 if (WhichFields
& USER_ALL_PARAMETERS
)
6183 Status
= SampSetObjectAttribute(UserObject
,
6186 Buffer
->All
.Parameters
.Buffer
,
6187 Buffer
->All
.Parameters
.MaximumLength
);
6190 if (WhichFields
& (USER_ALL_PRIMARYGROUPID
|
6191 USER_ALL_ACCOUNTEXPIRES
|
6192 USER_ALL_USERACCOUNTCONTROL
|
6193 USER_ALL_COUNTRYCODE
|
6196 Length
= sizeof(SAM_USER_FIXED_DATA
);
6197 Status
= SampGetObjectAttribute(UserObject
,
6202 if (!NT_SUCCESS(Status
))
6205 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
6206 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
6208 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
6210 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
6211 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
6214 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
6215 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
6217 if (WhichFields
& USER_ALL_COUNTRYCODE
)
6218 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6220 if (WhichFields
& USER_ALL_CODEPAGE
)
6221 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6223 Status
= SampSetObjectAttribute(UserObject
,
6228 if (!NT_SUCCESS(Status
))
6235 USER_ALL_NTPASSWORDPRESENT
6236 USER_ALL_LMPASSWORDPRESENT
6237 USER_ALL_PASSWORDEXPIRED
6249 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
6250 IN USER_INFORMATION_CLASS UserInformationClass
,
6251 IN PSAMPR_USER_INFO_BUFFER Buffer
)
6253 PSAM_DB_OBJECT UserObject
;
6254 ACCESS_MASK DesiredAccess
;
6257 TRACE("SamrSetInformationUser(%p %lu %p)\n",
6258 UserHandle
, UserInformationClass
, Buffer
);
6260 switch (UserInformationClass
)
6262 case UserLogonHoursInformation
:
6263 case UserNameInformation
:
6264 case UserAccountNameInformation
:
6265 case UserFullNameInformation
:
6266 case UserPrimaryGroupInformation
:
6267 case UserHomeInformation
:
6268 case UserScriptInformation
:
6269 case UserProfileInformation
:
6270 case UserAdminCommentInformation
:
6271 case UserWorkStationsInformation
:
6272 case UserControlInformation
:
6273 case UserExpiresInformation
:
6274 case UserParametersInformation
:
6275 DesiredAccess
= USER_WRITE_ACCOUNT
;
6278 case UserGeneralInformation
:
6279 DesiredAccess
= USER_WRITE_ACCOUNT
|
6280 USER_WRITE_PREFERENCES
;
6283 case UserPreferencesInformation
:
6284 DesiredAccess
= USER_WRITE_PREFERENCES
;
6287 case UserSetPasswordInformation
:
6288 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
6291 case UserAllInformation
:
6292 DesiredAccess
= 0; /* FIXME */
6296 return STATUS_INVALID_INFO_CLASS
;
6299 /* Validate the domain handle */
6300 Status
= SampValidateDbObject(UserHandle
,
6304 if (!NT_SUCCESS(Status
))
6306 TRACE("failed with status 0x%08lx\n", Status
);
6310 switch (UserInformationClass
)
6312 case UserGeneralInformation
:
6313 Status
= SampSetUserGeneral(UserObject
,
6317 case UserPreferencesInformation
:
6318 Status
= SampSetUserPreferences(UserObject
,
6322 case UserLogonHoursInformation:
6323 Status = SampSetUserLogonHours(UserObject,
6327 case UserNameInformation
:
6328 Status
= SampSetObjectAttribute(UserObject
,
6331 Buffer
->Name
.UserName
.Buffer
,
6332 Buffer
->Name
.UserName
.MaximumLength
);
6333 if (!NT_SUCCESS(Status
))
6336 Status
= SampSetObjectAttribute(UserObject
,
6339 Buffer
->Name
.FullName
.Buffer
,
6340 Buffer
->Name
.FullName
.MaximumLength
);
6343 case UserAccountNameInformation
:
6344 Status
= SampSetObjectAttribute(UserObject
,
6347 Buffer
->AccountName
.UserName
.Buffer
,
6348 Buffer
->AccountName
.UserName
.MaximumLength
);
6351 case UserFullNameInformation
:
6352 Status
= SampSetObjectAttribute(UserObject
,
6355 Buffer
->FullName
.FullName
.Buffer
,
6356 Buffer
->FullName
.FullName
.MaximumLength
);
6359 case UserPrimaryGroupInformation
:
6360 Status
= SampSetUserPrimaryGroup(UserObject
,
6364 case UserHomeInformation
:
6365 Status
= SampSetObjectAttribute(UserObject
,
6368 Buffer
->Home
.HomeDirectory
.Buffer
,
6369 Buffer
->Home
.HomeDirectory
.MaximumLength
);
6370 if (!NT_SUCCESS(Status
))
6373 Status
= SampSetObjectAttribute(UserObject
,
6374 L
"HomeDirectoryDrive",
6376 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
6377 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
6380 case UserScriptInformation
:
6381 Status
= SampSetObjectAttribute(UserObject
,
6384 Buffer
->Script
.ScriptPath
.Buffer
,
6385 Buffer
->Script
.ScriptPath
.MaximumLength
);
6388 case UserProfileInformation
:
6389 Status
= SampSetObjectAttribute(UserObject
,
6392 Buffer
->Profile
.ProfilePath
.Buffer
,
6393 Buffer
->Profile
.ProfilePath
.MaximumLength
);
6396 case UserAdminCommentInformation
:
6397 Status
= SampSetObjectAttribute(UserObject
,
6400 Buffer
->AdminComment
.AdminComment
.Buffer
,
6401 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
6404 case UserWorkStationsInformation
:
6405 Status
= SampSetObjectAttribute(UserObject
,
6408 Buffer
->WorkStations
.WorkStations
.Buffer
,
6409 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
6412 case UserSetPasswordInformation
:
6413 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
6414 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
6416 Status
= SampSetObjectAttribute(UserObject
,
6419 Buffer
->SetPassword
.Password
.Buffer
,
6420 Buffer
->SetPassword
.Password
.MaximumLength
);
6423 case UserControlInformation
:
6424 Status
= SampSetUserControl(UserObject
,
6428 case UserExpiresInformation
:
6429 Status
= SampSetUserExpires(UserObject
,
6433 // case UserInternal1Information:
6435 case UserParametersInformation
:
6436 Status
= SampSetObjectAttribute(UserObject
,
6439 Buffer
->Parameters
.Parameters
.Buffer
,
6440 Buffer
->Parameters
.Parameters
.MaximumLength
);
6443 case UserAllInformation
:
6444 Status
= SampSetUserAll(UserObject
,
6448 // case UserInternal4Information:
6449 // case UserInternal5Information:
6450 // case UserInternal4InformationNew:
6451 // case UserInternal5InformationNew:
6454 Status
= STATUS_INVALID_INFO_CLASS
;
6464 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
6465 IN
unsigned char LmPresent
,
6466 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
6467 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
6468 IN
unsigned char NtPresent
,
6469 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
6470 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
6471 IN
unsigned char NtCrossEncryptionPresent
,
6472 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
6473 IN
unsigned char LmCrossEncryptionPresent
,
6474 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
6477 return STATUS_NOT_IMPLEMENTED
;
6483 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
6484 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
6487 return STATUS_NOT_IMPLEMENTED
;
6493 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
6494 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6495 IN
unsigned long Index
,
6496 IN
unsigned long EntryCount
,
6497 IN
unsigned long PreferredMaximumLength
,
6498 OUT
unsigned long *TotalAvailable
,
6499 OUT
unsigned long *TotalReturned
,
6500 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6503 return STATUS_NOT_IMPLEMENTED
;
6509 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
6510 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6511 IN PRPC_UNICODE_STRING Prefix
,
6512 OUT
unsigned long *Index
)
6515 return STATUS_NOT_IMPLEMENTED
;
6521 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
6524 return STATUS_NOT_IMPLEMENTED
;
6530 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
6533 return STATUS_NOT_IMPLEMENTED
;
6539 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
6540 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6543 return STATUS_NOT_IMPLEMENTED
;
6549 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
6550 IN PRPC_SID MemberSid
)
6553 return STATUS_NOT_IMPLEMENTED
;
6559 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
6560 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
6561 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
6564 return STATUS_NOT_IMPLEMENTED
;
6570 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
6571 IN USER_INFORMATION_CLASS UserInformationClass
,
6572 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6575 return STATUS_NOT_IMPLEMENTED
;
6581 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
6582 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6583 IN
unsigned long Index
,
6584 IN
unsigned long EntryCount
,
6585 IN
unsigned long PreferredMaximumLength
,
6586 OUT
unsigned long *TotalAvailable
,
6587 OUT
unsigned long *TotalReturned
,
6588 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6591 return STATUS_NOT_IMPLEMENTED
;
6597 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
6598 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6599 IN PRPC_UNICODE_STRING Prefix
,
6600 OUT
unsigned long *Index
)
6603 return STATUS_NOT_IMPLEMENTED
;
6610 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
6611 IN PRPC_UNICODE_STRING Name
,
6612 IN
unsigned long AccountType
,
6613 IN ACCESS_MASK DesiredAccess
,
6614 OUT SAMPR_HANDLE
*UserHandle
,
6615 OUT
unsigned long *GrantedAccess
,
6616 OUT
unsigned long *RelativeId
)
6618 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
6619 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
6620 SAM_USER_FIXED_DATA FixedUserData
;
6621 PSAM_DB_OBJECT DomainObject
;
6622 PSAM_DB_OBJECT UserObject
;
6628 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
6629 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
6632 Name
->Length
== 0 ||
6633 Name
->Buffer
== NULL
||
6634 UserHandle
== NULL
||
6636 return STATUS_INVALID_PARAMETER
;
6638 /* Check for valid account type */
6639 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
6640 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
6641 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
6642 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
6643 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
6644 return STATUS_INVALID_PARAMETER
;
6646 /* Map generic access rights */
6647 RtlMapGenericMask(&DesiredAccess
,
6650 /* Validate the domain handle */
6651 Status
= SampValidateDbObject(DomainHandle
,
6655 if (!NT_SUCCESS(Status
))
6657 TRACE("failed with status 0x%08lx\n", Status
);
6661 /* Check if the user name already exists in the domain */
6662 Status
= SampCheckAccountNameInDomain(DomainObject
,
6664 if (!NT_SUCCESS(Status
))
6666 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
6667 Name
->Buffer
, Status
);
6671 /* Get the fixed domain attributes */
6672 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6673 Status
= SampGetObjectAttribute(DomainObject
,
6676 (PVOID
)&FixedDomainData
,
6678 if (!NT_SUCCESS(Status
))
6680 TRACE("failed with status 0x%08lx\n", Status
);
6684 /* Increment the NextRid attribute */
6685 ulRid
= FixedDomainData
.NextRid
;
6686 FixedDomainData
.NextRid
++;
6688 /* Store the fixed domain attributes */
6689 Status
= SampSetObjectAttribute(DomainObject
,
6694 if (!NT_SUCCESS(Status
))
6696 TRACE("failed with status 0x%08lx\n", Status
);
6700 TRACE("RID: %lx\n", ulRid
);
6702 /* Convert the RID into a string (hex) */
6703 swprintf(szRid
, L
"%08lX", ulRid
);
6705 /* Create the user object */
6706 Status
= SampCreateDbObject(DomainObject
,
6713 if (!NT_SUCCESS(Status
))
6715 TRACE("failed with status 0x%08lx\n", Status
);
6719 /* Add the account name for the user object */
6720 Status
= SampSetAccountNameInDomain(DomainObject
,
6724 if (!NT_SUCCESS(Status
))
6726 TRACE("failed with status 0x%08lx\n", Status
);
6730 /* Initialize fixed user data */
6731 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
6732 FixedUserData
.Version
= 1;
6733 FixedUserData
.LastLogon
.QuadPart
= 0;
6734 FixedUserData
.LastLogoff
.QuadPart
= 0;
6735 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
6736 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
6737 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
6738 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
6739 FixedUserData
.UserId
= ulRid
;
6740 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
6741 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
6742 USER_PASSWORD_NOT_REQUIRED
|
6745 /* Set fixed user data attribute */
6746 Status
= SampSetObjectAttribute(UserObject
,
6749 (LPVOID
)&FixedUserData
,
6750 sizeof(SAM_USER_FIXED_DATA
));
6751 if (!NT_SUCCESS(Status
))
6753 TRACE("failed with status 0x%08lx\n", Status
);
6757 /* Set the Name attribute */
6758 Status
= SampSetObjectAttribute(UserObject
,
6761 (LPVOID
)Name
->Buffer
,
6762 Name
->MaximumLength
);
6763 if (!NT_SUCCESS(Status
))
6765 TRACE("failed with status 0x%08lx\n", Status
);
6769 /* Set the FullName attribute */
6770 Status
= SampSetObjectAttribute(UserObject
,
6774 EmptyString
.MaximumLength
);
6775 if (!NT_SUCCESS(Status
))
6777 TRACE("failed with status 0x%08lx\n", Status
);
6781 /* Set the HomeDirectory attribute */
6782 Status
= SampSetObjectAttribute(UserObject
,
6786 EmptyString
.MaximumLength
);
6787 if (!NT_SUCCESS(Status
))
6789 TRACE("failed with status 0x%08lx\n", Status
);
6793 /* Set the HomeDirectoryDrive attribute */
6794 Status
= SampSetObjectAttribute(UserObject
,
6795 L
"HomeDirectoryDrive",
6798 EmptyString
.MaximumLength
);
6799 if (!NT_SUCCESS(Status
))
6801 TRACE("failed with status 0x%08lx\n", Status
);
6805 /* Set the ScriptPath attribute */
6806 Status
= SampSetObjectAttribute(UserObject
,
6810 EmptyString
.MaximumLength
);
6811 if (!NT_SUCCESS(Status
))
6813 TRACE("failed with status 0x%08lx\n", Status
);
6817 /* Set the ProfilePath attribute */
6818 Status
= SampSetObjectAttribute(UserObject
,
6822 EmptyString
.MaximumLength
);
6823 if (!NT_SUCCESS(Status
))
6825 TRACE("failed with status 0x%08lx\n", Status
);
6829 /* Set the AdminComment attribute */
6830 Status
= SampSetObjectAttribute(UserObject
,
6834 EmptyString
.MaximumLength
);
6835 if (!NT_SUCCESS(Status
))
6837 TRACE("failed with status 0x%08lx\n", Status
);
6841 /* Set the UserComment attribute */
6842 Status
= SampSetObjectAttribute(UserObject
,
6846 EmptyString
.MaximumLength
);
6847 if (!NT_SUCCESS(Status
))
6849 TRACE("failed with status 0x%08lx\n", Status
);
6853 /* Set the WorkStations attribute */
6854 Status
= SampSetObjectAttribute(UserObject
,
6858 EmptyString
.MaximumLength
);
6859 if (!NT_SUCCESS(Status
))
6861 TRACE("failed with status 0x%08lx\n", Status
);
6865 /* FIXME: Set default user attributes */
6867 if (NT_SUCCESS(Status
))
6869 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
6870 *RelativeId
= ulRid
;
6871 *GrantedAccess
= UserObject
->Access
;
6874 TRACE("returns with status 0x%08lx\n", Status
);
6883 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
6884 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6885 IN
unsigned long Index
,
6886 IN
unsigned long EntryCount
,
6887 IN
unsigned long PreferredMaximumLength
,
6888 OUT
unsigned long *TotalAvailable
,
6889 OUT
unsigned long *TotalReturned
,
6890 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6893 return STATUS_NOT_IMPLEMENTED
;
6900 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
6901 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6904 NTSTATUS Status
= STATUS_SUCCESS
;
6906 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
6907 AliasHandle
, MembersBuffer
);
6909 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6911 Status
= SamrAddMemberToAlias(AliasHandle
,
6912 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6914 if (Status
== STATUS_MEMBER_IN_ALIAS
)
6915 Status
= STATUS_SUCCESS
;
6917 if (!NT_SUCCESS(Status
))
6928 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
6929 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6932 NTSTATUS Status
= STATUS_SUCCESS
;
6934 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
6935 AliasHandle
, MembersBuffer
);
6937 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6939 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
6940 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6942 if (Status
== STATUS_MEMBER_IN_ALIAS
)
6943 Status
= STATUS_SUCCESS
;
6945 if (!NT_SUCCESS(Status
))
6956 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
6957 IN PRPC_STRING ServerName
,
6958 IN PRPC_STRING UserName
,
6959 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6960 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
6963 return STATUS_NOT_IMPLEMENTED
;
6969 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
6970 IN PRPC_UNICODE_STRING ServerName
,
6971 IN PRPC_UNICODE_STRING UserName
,
6972 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
6973 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
6974 IN
unsigned char LmPresent
,
6975 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6976 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
6979 return STATUS_NOT_IMPLEMENTED
;
6985 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
6986 IN PRPC_UNICODE_STRING Unused
,
6987 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6990 return STATUS_NOT_IMPLEMENTED
;
6996 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
6997 OUT SAMPR_HANDLE
*ServerHandle
,
6998 IN ACCESS_MASK DesiredAccess
)
7001 return STATUS_NOT_IMPLEMENTED
;
7008 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
7009 IN USER_INFORMATION_CLASS UserInformationClass
,
7010 IN PSAMPR_USER_INFO_BUFFER Buffer
)
7012 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
7014 return SamrSetInformationUser(UserHandle
,
7015 UserInformationClass
,
7023 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7026 return STATUS_NOT_IMPLEMENTED
;
7032 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7035 return STATUS_NOT_IMPLEMENTED
;
7041 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
7044 return STATUS_NOT_IMPLEMENTED
;
7050 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
7051 OUT SAMPR_HANDLE
*ServerHandle
,
7052 IN
unsigned long ClientRevision
,
7053 IN ACCESS_MASK DesiredAccess
)
7056 return STATUS_NOT_IMPLEMENTED
;
7062 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
7065 return STATUS_NOT_IMPLEMENTED
;
7071 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
7072 IN ACCESS_MASK DesiredAccess
,
7073 IN
unsigned long InVersion
,
7074 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
7075 OUT
unsigned long *OutVersion
,
7076 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
7077 OUT SAMPR_HANDLE
*ServerHandle
)
7080 return STATUS_NOT_IMPLEMENTED
;
7086 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
7087 IN
unsigned long Rid
,
7091 return STATUS_NOT_IMPLEMENTED
;
7097 SamrSetDSRMPassword(IN handle_t BindingHandle
,
7098 IN PRPC_UNICODE_STRING Unused
,
7099 IN
unsigned long UserId
,
7100 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
7103 return STATUS_NOT_IMPLEMENTED
;
7109 SamrValidatePassword(IN handle_t Handle
,
7110 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
7111 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
7112 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
7115 return STATUS_NOT_IMPLEMENTED
;