2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Security Account Manager (SAM) Server
4 * FILE: reactos/dll/win32/samsrv/samrpc.c
5 * PURPOSE: RPC interface functions
7 * PROGRAMMERS: Eric Kohl
10 /* INCLUDES ******************************************************************/
14 WINE_DEFAULT_DEBUG_CHANNEL(samsrv
);
16 /* GLOBALS *******************************************************************/
18 static SID_IDENTIFIER_AUTHORITY NtSidAuthority
= {SECURITY_NT_AUTHORITY
};
20 static GENERIC_MAPPING ServerMapping
=
28 static GENERIC_MAPPING DomainMapping
=
36 static GENERIC_MAPPING AliasMapping
=
44 static GENERIC_MAPPING GroupMapping
=
52 static GENERIC_MAPPING UserMapping
=
61 /* FUNCTIONS *****************************************************************/
64 SampStartRpcServer(VOID
)
68 TRACE("SampStartRpcServer() called\n");
70 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
74 if (Status
!= RPC_S_OK
)
76 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
80 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
83 if (Status
!= RPC_S_OK
)
85 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
89 Status
= RpcServerListen(1, 20, TRUE
);
90 if (Status
!= RPC_S_OK
)
92 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
96 TRACE("SampStartRpcServer() done\n");
100 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
102 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
106 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
108 HeapFree(GetProcessHeap(), 0, ptr
);
112 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
120 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
121 OUT SAMPR_HANDLE
*ServerHandle
,
122 IN ACCESS_MASK DesiredAccess
)
124 PSAM_DB_OBJECT ServerObject
;
127 TRACE("SamrConnect(%p %p %lx)\n",
128 ServerName
, ServerHandle
, DesiredAccess
);
130 /* Map generic access rights */
131 RtlMapGenericMask(&DesiredAccess
,
134 /* Open the Server Object */
135 Status
= SampOpenDbObject(NULL
,
142 if (NT_SUCCESS(Status
))
143 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
145 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
154 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
156 PSAM_DB_OBJECT DbObject
;
157 NTSTATUS Status
= STATUS_SUCCESS
;
159 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
161 Status
= SampValidateDbObject(*SamHandle
,
165 if (Status
== STATUS_SUCCESS
)
167 Status
= SampCloseDbObject(DbObject
);
171 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
180 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
181 IN SECURITY_INFORMATION SecurityInformation
,
182 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
185 return STATUS_NOT_IMPLEMENTED
;
192 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
193 IN SECURITY_INFORMATION SecurityInformation
,
194 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
*SecurityDescriptor
)
197 return STATUS_NOT_IMPLEMENTED
;
204 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
207 return STATUS_NOT_IMPLEMENTED
;
214 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
215 IN PRPC_UNICODE_STRING Name
,
216 OUT PRPC_SID
*DomainId
)
218 PSAM_DB_OBJECT ServerObject
;
219 HANDLE DomainsKeyHandle
= NULL
;
220 HANDLE DomainKeyHandle
= NULL
;
221 WCHAR DomainKeyName
[64];
223 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
224 UNICODE_STRING DomainName
;
229 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
230 ServerHandle
, Name
, DomainId
);
232 /* Validate the server handle */
233 Status
= SampValidateDbObject(ServerHandle
,
235 SAM_SERVER_LOOKUP_DOMAIN
,
237 if (!NT_SUCCESS(Status
))
242 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
246 if (!NT_SUCCESS(Status
))
250 while (Found
== FALSE
)
252 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
256 if (!NT_SUCCESS(Status
))
258 if (Status
== STATUS_NO_MORE_ENTRIES
)
259 Status
= STATUS_NO_SUCH_DOMAIN
;
263 TRACE("Domain key name: %S\n", DomainKeyName
);
265 Status
= SampRegOpenKey(DomainsKeyHandle
,
269 if (NT_SUCCESS(Status
))
271 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
272 Status
= SampRegQueryValue(DomainKeyHandle
,
275 (PVOID
)&DomainNameString
,
277 if (NT_SUCCESS(Status
))
279 TRACE("Domain name: %S\n", DomainNameString
);
281 RtlInitUnicodeString(&DomainName
,
283 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
285 TRACE("Found it!\n");
288 Status
= SampRegQueryValue(DomainKeyHandle
,
293 if (NT_SUCCESS(Status
))
295 *DomainId
= midl_user_allocate(Length
);
297 SampRegQueryValue(DomainKeyHandle
,
303 Status
= STATUS_SUCCESS
;
309 NtClose(DomainKeyHandle
);
315 NtClose(DomainsKeyHandle
);
324 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
325 IN OUT
unsigned long *EnumerationContext
,
326 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
327 IN ULONG PreferedMaximumLength
,
328 OUT PULONG CountReturned
)
330 PSAM_DB_OBJECT ServerObject
;
331 WCHAR DomainKeyName
[64];
332 HANDLE DomainsKeyHandle
;
333 HANDLE DomainKeyHandle
;
336 ULONG RequiredLength
;
339 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
342 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
343 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
346 /* Validate the server handle */
347 Status
= SampValidateDbObject(ServerHandle
,
349 SAM_SERVER_ENUMERATE_DOMAINS
,
351 if (!NT_SUCCESS(Status
))
354 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
358 if (!NT_SUCCESS(Status
))
361 EnumIndex
= *EnumerationContext
;
367 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
371 if (!NT_SUCCESS(Status
))
374 TRACE("EnumIndex: %lu\n", EnumIndex
);
375 TRACE("Domain key name: %S\n", DomainKeyName
);
377 Status
= SampRegOpenKey(DomainsKeyHandle
,
381 TRACE("SampRegOpenKey returned %08lX\n", Status
);
382 if (NT_SUCCESS(Status
))
385 Status
= SampRegQueryValue(DomainKeyHandle
,
390 TRACE("SampRegQueryValue returned %08lX\n", Status
);
391 if (NT_SUCCESS(Status
))
393 TRACE("Data length: %lu\n", DataLength
);
395 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
398 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
402 NtClose(DomainKeyHandle
);
408 TRACE("EnumCount: %lu\n", EnumCount
);
409 TRACE("RequiredLength: %lu\n", RequiredLength
);
411 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
412 if (EnumBuffer
== NULL
)
414 Status
= STATUS_INSUFFICIENT_RESOURCES
;
418 EnumBuffer
->EntriesRead
= EnumCount
;
419 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
420 if (EnumBuffer
->Buffer
== NULL
)
422 Status
= STATUS_INSUFFICIENT_RESOURCES
;
426 EnumIndex
= *EnumerationContext
;
427 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
429 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
433 if (!NT_SUCCESS(Status
))
436 TRACE("EnumIndex: %lu\n", EnumIndex
);
437 TRACE("Domain key name: %S\n", DomainKeyName
);
439 Status
= SampRegOpenKey(DomainsKeyHandle
,
443 TRACE("SampRegOpenKey returned %08lX\n", Status
);
444 if (NT_SUCCESS(Status
))
447 Status
= SampRegQueryValue(DomainKeyHandle
,
452 TRACE("SampRegQueryValue returned %08lX\n", Status
);
453 if (NT_SUCCESS(Status
))
455 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
456 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
457 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
458 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
459 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
461 NtClose(DomainKeyHandle
);
462 Status
= STATUS_INSUFFICIENT_RESOURCES
;
466 Status
= SampRegQueryValue(DomainKeyHandle
,
469 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
471 TRACE("SampRegQueryValue returned %08lX\n", Status
);
472 if (NT_SUCCESS(Status
))
474 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
478 NtClose(DomainKeyHandle
);
480 if (!NT_SUCCESS(Status
))
485 if (NT_SUCCESS(Status
))
487 *EnumerationContext
+= EnumCount
;
488 *Buffer
= EnumBuffer
;
489 *CountReturned
= EnumCount
;
493 if (!NT_SUCCESS(Status
))
495 *EnumerationContext
= 0;
499 if (EnumBuffer
!= NULL
)
501 if (EnumBuffer
->Buffer
!= NULL
)
503 if (EnumBuffer
->EntriesRead
!= 0)
505 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
507 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
508 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
512 midl_user_free(EnumBuffer
->Buffer
);
515 midl_user_free(EnumBuffer
);
519 NtClose(DomainsKeyHandle
);
528 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
529 IN ACCESS_MASK DesiredAccess
,
530 IN PRPC_SID DomainId
,
531 OUT SAMPR_HANDLE
*DomainHandle
)
533 PSAM_DB_OBJECT ServerObject
;
534 PSAM_DB_OBJECT DomainObject
;
537 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
538 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
540 /* Map generic access rights */
541 RtlMapGenericMask(&DesiredAccess
,
544 /* Validate the server handle */
545 Status
= SampValidateDbObject(ServerHandle
,
547 SAM_SERVER_LOOKUP_DOMAIN
,
549 if (!NT_SUCCESS(Status
))
552 /* Validate the Domain SID */
553 if ((DomainId
->Revision
!= SID_REVISION
) ||
554 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
555 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
556 return STATUS_INVALID_PARAMETER
;
558 /* Open the domain object */
559 if ((DomainId
->SubAuthorityCount
== 1) &&
560 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
562 /* Builtin domain object */
563 TRACE("Opening the builtin domain object.\n");
565 Status
= SampOpenDbObject(ServerObject
,
573 else if ((DomainId
->SubAuthorityCount
== 4) &&
574 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
576 /* Account domain object */
577 TRACE("Opening the account domain object.\n");
579 /* FIXME: Check the account domain sub authorities!!! */
581 Status
= SampOpenDbObject(ServerObject
,
591 /* No vaild domain SID */
592 Status
= STATUS_INVALID_PARAMETER
;
595 if (NT_SUCCESS(Status
))
596 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
598 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
605 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
606 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
608 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
609 SAM_DOMAIN_FIXED_DATA FixedData
;
615 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
616 if (InfoBuffer
== NULL
)
617 return STATUS_INSUFFICIENT_RESOURCES
;
619 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
620 Status
= SampGetObjectAttribute(DomainObject
,
625 if (!NT_SUCCESS(Status
))
628 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
629 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
630 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
631 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
632 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
633 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
634 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
636 *Buffer
= InfoBuffer
;
639 if (!NT_SUCCESS(Status
))
641 if (InfoBuffer
!= NULL
)
643 midl_user_free(InfoBuffer
);
652 SampGetNumberOfAccounts(PSAM_DB_OBJECT DomainObject
,
656 HANDLE AccountKeyHandle
= NULL
;
657 HANDLE NamesKeyHandle
= NULL
;
662 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
666 if (!NT_SUCCESS(Status
))
669 Status
= SampRegOpenKey(AccountKeyHandle
,
673 if (!NT_SUCCESS(Status
))
676 Status
= SampRegQueryKeyInfo(NamesKeyHandle
,
680 if (NamesKeyHandle
!= NULL
)
681 SampRegCloseKey(NamesKeyHandle
);
683 if (AccountKeyHandle
!= NULL
)
684 SampRegCloseKey(AccountKeyHandle
);
691 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
692 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
694 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
695 SAM_DOMAIN_FIXED_DATA FixedData
;
701 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
702 if (InfoBuffer
== NULL
)
703 return STATUS_INSUFFICIENT_RESOURCES
;
705 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
706 Status
= SampGetObjectAttribute(DomainObject
,
711 if (!NT_SUCCESS(Status
))
714 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
715 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
716 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
717 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
718 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
719 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
720 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
722 /* Get the OemInformation string */
723 Status
= SampGetObjectAttributeString(DomainObject
,
725 &InfoBuffer
->General
.OemInformation
);
726 if (!NT_SUCCESS(Status
))
728 TRACE("Status 0x%08lx\n", Status
);
732 /* Get the Name string */
733 Status
= SampGetObjectAttributeString(DomainObject
,
735 &InfoBuffer
->General
.DomainName
);
736 if (!NT_SUCCESS(Status
))
738 TRACE("Status 0x%08lx\n", Status
);
742 /* Get the ReplicaSourceNodeName string */
743 Status
= SampGetObjectAttributeString(DomainObject
,
744 L
"ReplicaSourceNodeName",
745 &InfoBuffer
->General
.ReplicaSourceNodeName
);
746 if (!NT_SUCCESS(Status
))
748 TRACE("Status 0x%08lx\n", Status
);
752 /* Get the number of Users in the Domain */
753 Status
= SampGetNumberOfAccounts(DomainObject
,
755 &InfoBuffer
->General
.UserCount
);
756 if (!NT_SUCCESS(Status
))
758 TRACE("Status 0x%08lx\n", Status
);
762 /* Get the number of Groups in the Domain */
763 Status
= SampGetNumberOfAccounts(DomainObject
,
765 &InfoBuffer
->General
.GroupCount
);
766 if (!NT_SUCCESS(Status
))
768 TRACE("Status 0x%08lx\n", Status
);
772 /* Get the number of Aliases in the Domain */
773 Status
= SampGetNumberOfAccounts(DomainObject
,
775 &InfoBuffer
->General
.AliasCount
);
776 if (!NT_SUCCESS(Status
))
778 TRACE("Status 0x%08lx\n", Status
);
782 *Buffer
= InfoBuffer
;
785 if (!NT_SUCCESS(Status
))
787 if (InfoBuffer
!= NULL
)
789 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
790 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
792 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
793 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
795 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
796 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
798 midl_user_free(InfoBuffer
);
807 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
808 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
810 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
811 SAM_DOMAIN_FIXED_DATA FixedData
;
817 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
818 if (InfoBuffer
== NULL
)
819 return STATUS_INSUFFICIENT_RESOURCES
;
821 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
822 Status
= SampGetObjectAttribute(DomainObject
,
827 if (!NT_SUCCESS(Status
))
830 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
831 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
833 *Buffer
= InfoBuffer
;
836 if (!NT_SUCCESS(Status
))
838 if (InfoBuffer
!= NULL
)
840 midl_user_free(InfoBuffer
);
849 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
850 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
852 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
857 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
858 if (InfoBuffer
== NULL
)
859 return STATUS_INSUFFICIENT_RESOURCES
;
861 /* Get the OemInformation string */
862 Status
= SampGetObjectAttributeString(DomainObject
,
864 &InfoBuffer
->Oem
.OemInformation
);
865 if (!NT_SUCCESS(Status
))
867 TRACE("Status 0x%08lx\n", Status
);
871 *Buffer
= InfoBuffer
;
874 if (!NT_SUCCESS(Status
))
876 if (InfoBuffer
!= NULL
)
878 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
879 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
881 midl_user_free(InfoBuffer
);
890 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
891 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
893 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
898 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
899 if (InfoBuffer
== NULL
)
900 return STATUS_INSUFFICIENT_RESOURCES
;
902 /* Get the Name string */
903 Status
= SampGetObjectAttributeString(DomainObject
,
905 &InfoBuffer
->Name
.DomainName
);
906 if (!NT_SUCCESS(Status
))
908 TRACE("Status 0x%08lx\n", Status
);
912 *Buffer
= InfoBuffer
;
915 if (!NT_SUCCESS(Status
))
917 if (InfoBuffer
!= NULL
)
919 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
920 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
922 midl_user_free(InfoBuffer
);
931 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
932 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
934 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
939 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
940 if (InfoBuffer
== NULL
)
941 return STATUS_INSUFFICIENT_RESOURCES
;
943 /* Get the ReplicaSourceNodeName string */
944 Status
= SampGetObjectAttributeString(DomainObject
,
945 L
"ReplicaSourceNodeName",
946 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
947 if (!NT_SUCCESS(Status
))
949 TRACE("Status 0x%08lx\n", Status
);
953 *Buffer
= InfoBuffer
;
956 if (!NT_SUCCESS(Status
))
958 if (InfoBuffer
!= NULL
)
960 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
961 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
963 midl_user_free(InfoBuffer
);
972 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
973 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
975 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
976 SAM_DOMAIN_FIXED_DATA FixedData
;
982 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
983 if (InfoBuffer
== NULL
)
984 return STATUS_INSUFFICIENT_RESOURCES
;
986 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
987 Status
= SampGetObjectAttribute(DomainObject
,
992 if (!NT_SUCCESS(Status
))
995 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
997 *Buffer
= InfoBuffer
;
1000 if (!NT_SUCCESS(Status
))
1002 if (InfoBuffer
!= NULL
)
1004 midl_user_free(InfoBuffer
);
1013 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
1014 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1016 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1017 SAM_DOMAIN_FIXED_DATA FixedData
;
1023 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1024 if (InfoBuffer
== NULL
)
1025 return STATUS_INSUFFICIENT_RESOURCES
;
1027 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1028 Status
= SampGetObjectAttribute(DomainObject
,
1033 if (!NT_SUCCESS(Status
))
1036 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1037 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1038 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1039 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1041 *Buffer
= InfoBuffer
;
1044 if (!NT_SUCCESS(Status
))
1046 if (InfoBuffer
!= NULL
)
1048 midl_user_free(InfoBuffer
);
1057 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1058 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1060 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1061 SAM_DOMAIN_FIXED_DATA FixedData
;
1067 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1068 if (InfoBuffer
== NULL
)
1069 return STATUS_INSUFFICIENT_RESOURCES
;
1071 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1072 Status
= SampGetObjectAttribute(DomainObject
,
1077 if (!NT_SUCCESS(Status
))
1080 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1082 *Buffer
= InfoBuffer
;
1085 if (!NT_SUCCESS(Status
))
1087 if (InfoBuffer
!= NULL
)
1089 midl_user_free(InfoBuffer
);
1098 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1099 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1101 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1102 SAM_DOMAIN_FIXED_DATA FixedData
;
1108 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1109 if (InfoBuffer
== NULL
)
1110 return STATUS_INSUFFICIENT_RESOURCES
;
1112 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1113 Status
= SampGetObjectAttribute(DomainObject
,
1118 if (!NT_SUCCESS(Status
))
1121 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1122 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1123 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1124 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1125 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1126 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1127 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1129 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1130 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1131 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1133 /* Get the OemInformation string */
1134 Status
= SampGetObjectAttributeString(DomainObject
,
1136 &InfoBuffer
->General2
.I1
.OemInformation
);
1137 if (!NT_SUCCESS(Status
))
1139 TRACE("Status 0x%08lx\n", Status
);
1143 /* Get the Name string */
1144 Status
= SampGetObjectAttributeString(DomainObject
,
1146 &InfoBuffer
->General2
.I1
.DomainName
);
1147 if (!NT_SUCCESS(Status
))
1149 TRACE("Status 0x%08lx\n", Status
);
1153 /* Get the ReplicaSourceNodeName string */
1154 Status
= SampGetObjectAttributeString(DomainObject
,
1155 L
"ReplicaSourceNodeName",
1156 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1157 if (!NT_SUCCESS(Status
))
1159 TRACE("Status 0x%08lx\n", Status
);
1163 /* Get the number of Users in the Domain */
1164 Status
= SampGetNumberOfAccounts(DomainObject
,
1166 &InfoBuffer
->General2
.I1
.UserCount
);
1167 if (!NT_SUCCESS(Status
))
1169 TRACE("Status 0x%08lx\n", Status
);
1173 /* Get the number of Groups in the Domain */
1174 Status
= SampGetNumberOfAccounts(DomainObject
,
1176 &InfoBuffer
->General2
.I1
.GroupCount
);
1177 if (!NT_SUCCESS(Status
))
1179 TRACE("Status 0x%08lx\n", Status
);
1183 /* Get the number of Aliases in the Domain */
1184 Status
= SampGetNumberOfAccounts(DomainObject
,
1186 &InfoBuffer
->General2
.I1
.AliasCount
);
1187 if (!NT_SUCCESS(Status
))
1189 TRACE("Status 0x%08lx\n", Status
);
1193 *Buffer
= InfoBuffer
;
1196 if (!NT_SUCCESS(Status
))
1198 if (InfoBuffer
!= NULL
)
1200 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1201 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1203 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1204 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1206 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1207 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1209 midl_user_free(InfoBuffer
);
1218 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1219 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1221 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1222 SAM_DOMAIN_FIXED_DATA FixedData
;
1228 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1229 if (InfoBuffer
== NULL
)
1230 return STATUS_INSUFFICIENT_RESOURCES
;
1232 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1233 Status
= SampGetObjectAttribute(DomainObject
,
1238 if (!NT_SUCCESS(Status
))
1241 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1242 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1243 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1245 *Buffer
= InfoBuffer
;
1248 if (!NT_SUCCESS(Status
))
1250 if (InfoBuffer
!= NULL
)
1252 midl_user_free(InfoBuffer
);
1261 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1262 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1264 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1265 SAM_DOMAIN_FIXED_DATA FixedData
;
1271 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1272 if (InfoBuffer
== NULL
)
1273 return STATUS_INSUFFICIENT_RESOURCES
;
1275 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1276 Status
= SampGetObjectAttribute(DomainObject
,
1281 if (!NT_SUCCESS(Status
))
1284 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1285 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1286 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1287 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1288 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1289 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1291 *Buffer
= InfoBuffer
;
1294 if (!NT_SUCCESS(Status
))
1296 if (InfoBuffer
!= NULL
)
1298 midl_user_free(InfoBuffer
);
1309 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1310 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1311 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1313 PSAM_DB_OBJECT DomainObject
;
1314 ACCESS_MASK DesiredAccess
;
1317 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1318 DomainHandle
, DomainInformationClass
, Buffer
);
1320 switch (DomainInformationClass
)
1322 case DomainPasswordInformation
:
1323 case DomainLockoutInformation
:
1324 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1327 case DomainGeneralInformation
:
1328 case DomainLogoffInformation
:
1329 case DomainOemInformation
:
1330 case DomainNameInformation
:
1331 case DomainReplicationInformation
:
1332 case DomainServerRoleInformation
:
1333 case DomainModifiedInformation
:
1334 case DomainStateInformation
:
1335 case DomainModifiedInformation2
:
1336 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1339 case DomainGeneralInformation2
:
1340 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1341 DOMAIN_READ_OTHER_PARAMETERS
;
1345 return STATUS_INVALID_INFO_CLASS
;
1348 /* Validate the server handle */
1349 Status
= SampValidateDbObject(DomainHandle
,
1353 if (!NT_SUCCESS(Status
))
1356 switch (DomainInformationClass
)
1358 case DomainPasswordInformation
:
1359 Status
= SampQueryDomainPassword(DomainObject
,
1363 case DomainGeneralInformation
:
1364 Status
= SampQueryDomainGeneral(DomainObject
,
1368 case DomainLogoffInformation
:
1369 Status
= SampQueryDomainLogoff(DomainObject
,
1373 case DomainOemInformation
:
1374 Status
= SampQueryDomainOem(DomainObject
,
1378 case DomainNameInformation
:
1379 Status
= SampQueryDomainName(DomainObject
,
1383 case DomainReplicationInformation
:
1384 Status
= SampQueryDomainReplication(DomainObject
,
1388 case DomainServerRoleInformation
:
1389 Status
= SampQueryDomainServerRole(DomainObject
,
1393 case DomainModifiedInformation
:
1394 Status
= SampQueryDomainModified(DomainObject
,
1398 case DomainStateInformation
:
1399 Status
= SampQueryDomainState(DomainObject
,
1403 case DomainGeneralInformation2
:
1404 Status
= SampQueryDomainGeneral2(DomainObject
,
1408 case DomainLockoutInformation
:
1409 Status
= SampQueryDomainLockout(DomainObject
,
1413 case DomainModifiedInformation2
:
1414 Status
= SampQueryDomainModified2(DomainObject
,
1419 Status
= STATUS_NOT_IMPLEMENTED
;
1427 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1428 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1430 SAM_DOMAIN_FIXED_DATA FixedData
;
1434 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1435 Status
= SampGetObjectAttribute(DomainObject
,
1440 if (!NT_SUCCESS(Status
))
1443 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1444 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1445 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1446 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1447 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1448 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1449 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1451 Status
= SampSetObjectAttribute(DomainObject
,
1463 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1464 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1466 SAM_DOMAIN_FIXED_DATA FixedData
;
1470 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1471 Status
= SampGetObjectAttribute(DomainObject
,
1476 if (!NT_SUCCESS(Status
))
1479 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1480 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1482 Status
= SampSetObjectAttribute(DomainObject
,
1494 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1495 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1497 SAM_DOMAIN_FIXED_DATA FixedData
;
1501 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1502 Status
= SampGetObjectAttribute(DomainObject
,
1507 if (!NT_SUCCESS(Status
))
1510 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1512 Status
= SampSetObjectAttribute(DomainObject
,
1524 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1525 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1527 SAM_DOMAIN_FIXED_DATA FixedData
;
1531 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1532 Status
= SampGetObjectAttribute(DomainObject
,
1537 if (!NT_SUCCESS(Status
))
1540 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1542 Status
= SampSetObjectAttribute(DomainObject
,
1554 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1555 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1557 SAM_DOMAIN_FIXED_DATA FixedData
;
1561 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1562 Status
= SampGetObjectAttribute(DomainObject
,
1567 if (!NT_SUCCESS(Status
))
1570 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1571 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1572 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1574 Status
= SampSetObjectAttribute(DomainObject
,
1588 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1589 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1590 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1592 PSAM_DB_OBJECT DomainObject
;
1593 ACCESS_MASK DesiredAccess
;
1596 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1597 DomainHandle
, DomainInformationClass
, DomainInformation
);
1599 switch (DomainInformationClass
)
1601 case DomainPasswordInformation
:
1602 case DomainLockoutInformation
:
1603 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1606 case DomainLogoffInformation
:
1607 case DomainOemInformation
:
1608 case DomainNameInformation
:
1609 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1612 case DomainReplicationInformation
:
1613 case DomainServerRoleInformation
:
1614 case DomainStateInformation
:
1615 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1619 return STATUS_INVALID_INFO_CLASS
;
1622 /* Validate the server handle */
1623 Status
= SampValidateDbObject(DomainHandle
,
1627 if (!NT_SUCCESS(Status
))
1630 switch (DomainInformationClass
)
1632 case DomainPasswordInformation
:
1633 Status
= SampSetDomainPassword(DomainObject
,
1637 case DomainLogoffInformation
:
1638 Status
= SampSetDomainLogoff(DomainObject
,
1642 case DomainOemInformation
:
1643 Status
= SampSetObjectAttribute(DomainObject
,
1646 DomainInformation
->Oem
.OemInformation
.Buffer
,
1647 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1650 case DomainNameInformation
:
1651 Status
= SampSetObjectAttribute(DomainObject
,
1654 DomainInformation
->Name
.DomainName
.Buffer
,
1655 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1658 case DomainReplicationInformation
:
1659 Status
= SampSetObjectAttribute(DomainObject
,
1660 L
"ReplicaSourceNodeName",
1662 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1663 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1666 case DomainServerRoleInformation
:
1667 Status
= SampSetDomainServerRole(DomainObject
,
1671 case DomainStateInformation
:
1672 Status
= SampSetDomainState(DomainObject
,
1676 case DomainLockoutInformation
:
1677 Status
= SampSetDomainLockout(DomainObject
,
1682 Status
= STATUS_NOT_IMPLEMENTED
;
1692 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1693 IN PRPC_UNICODE_STRING Name
,
1694 IN ACCESS_MASK DesiredAccess
,
1695 OUT SAMPR_HANDLE
*GroupHandle
,
1696 OUT
unsigned long *RelativeId
)
1698 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1699 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1700 SAM_GROUP_FIXED_DATA FixedGroupData
;
1701 PSAM_DB_OBJECT DomainObject
;
1702 PSAM_DB_OBJECT GroupObject
;
1708 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1709 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1711 /* Map generic access rights */
1712 RtlMapGenericMask(&DesiredAccess
,
1715 /* Validate the domain handle */
1716 Status
= SampValidateDbObject(DomainHandle
,
1718 DOMAIN_CREATE_GROUP
,
1720 if (!NT_SUCCESS(Status
))
1722 TRACE("failed with status 0x%08lx\n", Status
);
1726 /* Check if the group name already exists in the domain */
1727 Status
= SampCheckAccountNameInDomain(DomainObject
,
1729 if (!NT_SUCCESS(Status
))
1731 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1732 Name
->Buffer
, Status
);
1736 /* Get the fixed domain attributes */
1737 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1738 Status
= SampGetObjectAttribute(DomainObject
,
1741 (PVOID
)&FixedDomainData
,
1743 if (!NT_SUCCESS(Status
))
1745 TRACE("failed with status 0x%08lx\n", Status
);
1749 /* Increment the NextRid attribute */
1750 ulRid
= FixedDomainData
.NextRid
;
1751 FixedDomainData
.NextRid
++;
1753 /* Store the fixed domain attributes */
1754 Status
= SampSetObjectAttribute(DomainObject
,
1759 if (!NT_SUCCESS(Status
))
1761 TRACE("failed with status 0x%08lx\n", Status
);
1765 TRACE("RID: %lx\n", ulRid
);
1767 /* Convert the RID into a string (hex) */
1768 swprintf(szRid
, L
"%08lX", ulRid
);
1770 /* Create the group object */
1771 Status
= SampCreateDbObject(DomainObject
,
1778 if (!NT_SUCCESS(Status
))
1780 TRACE("failed with status 0x%08lx\n", Status
);
1784 /* Add the account name of the user object */
1785 Status
= SampSetAccountNameInDomain(DomainObject
,
1789 if (!NT_SUCCESS(Status
))
1791 TRACE("failed with status 0x%08lx\n", Status
);
1795 /* Initialize fixed user data */
1796 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1797 FixedGroupData
.Version
= 1;
1799 FixedGroupData
.GroupId
= ulRid
;
1801 /* Set fixed user data attribute */
1802 Status
= SampSetObjectAttribute(GroupObject
,
1805 (LPVOID
)&FixedGroupData
,
1806 sizeof(SAM_GROUP_FIXED_DATA
));
1807 if (!NT_SUCCESS(Status
))
1809 TRACE("failed with status 0x%08lx\n", Status
);
1813 /* Set the Name attribute */
1814 Status
= SampSetObjectAttribute(GroupObject
,
1817 (LPVOID
)Name
->Buffer
,
1818 Name
->MaximumLength
);
1819 if (!NT_SUCCESS(Status
))
1821 TRACE("failed with status 0x%08lx\n", Status
);
1825 /* Set the AdminComment attribute */
1826 Status
= SampSetObjectAttribute(GroupObject
,
1830 EmptyString
.MaximumLength
);
1831 if (!NT_SUCCESS(Status
))
1833 TRACE("failed with status 0x%08lx\n", Status
);
1837 if (NT_SUCCESS(Status
))
1839 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1840 *RelativeId
= ulRid
;
1843 TRACE("returns with status 0x%08lx\n", Status
);
1852 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1853 IN OUT
unsigned long *EnumerationContext
,
1854 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1855 IN
unsigned long PreferedMaximumLength
,
1856 OUT
unsigned long *CountReturned
)
1858 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1859 PSAM_DB_OBJECT DomainObject
;
1860 HANDLE GroupsKeyHandle
= NULL
;
1861 HANDLE NamesKeyHandle
= NULL
;
1862 WCHAR GroupName
[64];
1864 ULONG EnumCount
= 0;
1865 ULONG RequiredLength
= 0;
1870 BOOLEAN MoreEntries
= FALSE
;
1873 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1874 DomainHandle
, EnumerationContext
, Buffer
,
1875 PreferedMaximumLength
, CountReturned
);
1877 /* Validate the domain handle */
1878 Status
= SampValidateDbObject(DomainHandle
,
1880 DOMAIN_LIST_ACCOUNTS
,
1882 if (!NT_SUCCESS(Status
))
1885 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1889 if (!NT_SUCCESS(Status
))
1892 Status
= SampRegOpenKey(GroupsKeyHandle
,
1896 if (!NT_SUCCESS(Status
))
1901 EnumIndex
= *EnumerationContext
;
1905 NameLength
= 64 * sizeof(WCHAR
);
1906 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1913 if (!NT_SUCCESS(Status
))
1915 if (Status
== STATUS_NO_MORE_ENTRIES
)
1916 Status
= STATUS_SUCCESS
;
1920 TRACE("EnumIndex: %lu\n", EnumIndex
);
1921 TRACE("Group name: %S\n", GroupName
);
1922 TRACE("Name length: %lu\n", NameLength
);
1924 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
1930 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
1936 TRACE("EnumCount: %lu\n", EnumCount
);
1937 TRACE("RequiredLength: %lu\n", RequiredLength
);
1939 if (!NT_SUCCESS(Status
))
1942 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
1943 if (EnumBuffer
== NULL
)
1945 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1949 EnumBuffer
->EntriesRead
= EnumCount
;
1953 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
1954 if (EnumBuffer
->Buffer
== NULL
)
1956 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1962 EnumIndex
= *EnumerationContext
;
1963 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
1965 NameLength
= 64 * sizeof(WCHAR
);
1966 DataLength
= sizeof(ULONG
);
1967 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1974 if (!NT_SUCCESS(Status
))
1976 if (Status
== STATUS_NO_MORE_ENTRIES
)
1977 Status
= STATUS_SUCCESS
;
1981 TRACE("EnumIndex: %lu\n", EnumIndex
);
1982 TRACE("Group name: %S\n", GroupName
);
1983 TRACE("Name length: %lu\n", NameLength
);
1984 TRACE("RID: %lu\n", Rid
);
1986 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
1988 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
1989 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
1991 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
1993 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
1994 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
1996 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2000 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2002 EnumBuffer
->Buffer
[i
].Name
.Length
);
2007 if (NT_SUCCESS(Status
))
2009 *EnumerationContext
+= EnumCount
;
2010 *Buffer
= EnumBuffer
;
2011 *CountReturned
= EnumCount
;
2015 *EnumerationContext
= 0;
2019 if (EnumBuffer
!= NULL
)
2021 if (EnumBuffer
->Buffer
!= NULL
)
2023 if (EnumBuffer
->EntriesRead
!= 0)
2025 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2027 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2028 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2032 midl_user_free(EnumBuffer
->Buffer
);
2035 midl_user_free(EnumBuffer
);
2039 if (NamesKeyHandle
!= NULL
)
2040 SampRegCloseKey(NamesKeyHandle
);
2042 if (GroupsKeyHandle
!= NULL
)
2043 SampRegCloseKey(GroupsKeyHandle
);
2045 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2046 Status
= STATUS_MORE_ENTRIES
;
2055 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
2056 IN PRPC_UNICODE_STRING Name
,
2057 IN ACCESS_MASK DesiredAccess
,
2058 OUT SAMPR_HANDLE
*UserHandle
,
2059 OUT
unsigned long *RelativeId
)
2061 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2062 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2063 SAM_USER_FIXED_DATA FixedUserData
;
2064 PSAM_DB_OBJECT DomainObject
;
2065 PSAM_DB_OBJECT UserObject
;
2071 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2072 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2075 Name
->Length
== 0 ||
2076 Name
->Buffer
== NULL
||
2077 UserHandle
== NULL
||
2079 return STATUS_INVALID_PARAMETER
;
2081 /* Map generic access rights */
2082 RtlMapGenericMask(&DesiredAccess
,
2085 /* Validate the domain handle */
2086 Status
= SampValidateDbObject(DomainHandle
,
2090 if (!NT_SUCCESS(Status
))
2092 TRACE("failed with status 0x%08lx\n", Status
);
2096 /* Check if the user name already exists in the domain */
2097 Status
= SampCheckAccountNameInDomain(DomainObject
,
2099 if (!NT_SUCCESS(Status
))
2101 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2102 Name
->Buffer
, Status
);
2106 /* Get the fixed domain attributes */
2107 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2108 Status
= SampGetObjectAttribute(DomainObject
,
2111 (PVOID
)&FixedDomainData
,
2113 if (!NT_SUCCESS(Status
))
2115 TRACE("failed with status 0x%08lx\n", Status
);
2119 /* Increment the NextRid attribute */
2120 ulRid
= FixedDomainData
.NextRid
;
2121 FixedDomainData
.NextRid
++;
2123 /* Store the fixed domain attributes */
2124 Status
= SampSetObjectAttribute(DomainObject
,
2129 if (!NT_SUCCESS(Status
))
2131 TRACE("failed with status 0x%08lx\n", Status
);
2135 TRACE("RID: %lx\n", ulRid
);
2137 /* Convert the RID into a string (hex) */
2138 swprintf(szRid
, L
"%08lX", ulRid
);
2140 /* Create the user object */
2141 Status
= SampCreateDbObject(DomainObject
,
2148 if (!NT_SUCCESS(Status
))
2150 TRACE("failed with status 0x%08lx\n", Status
);
2154 /* Add the account name for the user object */
2155 Status
= SampSetAccountNameInDomain(DomainObject
,
2159 if (!NT_SUCCESS(Status
))
2161 TRACE("failed with status 0x%08lx\n", Status
);
2165 /* Initialize fixed user data */
2166 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2167 FixedUserData
.Version
= 1;
2168 FixedUserData
.LastLogon
.QuadPart
= 0;
2169 FixedUserData
.LastLogoff
.QuadPart
= 0;
2170 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2171 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2172 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2173 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2174 FixedUserData
.UserId
= ulRid
;
2175 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2176 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2177 USER_PASSWORD_NOT_REQUIRED
|
2178 USER_NORMAL_ACCOUNT
;
2180 /* Set fixed user data attribute */
2181 Status
= SampSetObjectAttribute(UserObject
,
2184 (LPVOID
)&FixedUserData
,
2185 sizeof(SAM_USER_FIXED_DATA
));
2186 if (!NT_SUCCESS(Status
))
2188 TRACE("failed with status 0x%08lx\n", Status
);
2192 /* Set the Name attribute */
2193 Status
= SampSetObjectAttribute(UserObject
,
2196 (LPVOID
)Name
->Buffer
,
2197 Name
->MaximumLength
);
2198 if (!NT_SUCCESS(Status
))
2200 TRACE("failed with status 0x%08lx\n", Status
);
2204 /* Set the FullName attribute */
2205 Status
= SampSetObjectAttribute(UserObject
,
2209 EmptyString
.MaximumLength
);
2210 if (!NT_SUCCESS(Status
))
2212 TRACE("failed with status 0x%08lx\n", Status
);
2216 /* Set the HomeDirectory attribute */
2217 Status
= SampSetObjectAttribute(UserObject
,
2221 EmptyString
.MaximumLength
);
2222 if (!NT_SUCCESS(Status
))
2224 TRACE("failed with status 0x%08lx\n", Status
);
2228 /* Set the HomeDirectoryDrive attribute */
2229 Status
= SampSetObjectAttribute(UserObject
,
2230 L
"HomeDirectoryDrive",
2233 EmptyString
.MaximumLength
);
2234 if (!NT_SUCCESS(Status
))
2236 TRACE("failed with status 0x%08lx\n", Status
);
2240 /* Set the ScriptPath attribute */
2241 Status
= SampSetObjectAttribute(UserObject
,
2245 EmptyString
.MaximumLength
);
2246 if (!NT_SUCCESS(Status
))
2248 TRACE("failed with status 0x%08lx\n", Status
);
2252 /* Set the ProfilePath attribute */
2253 Status
= SampSetObjectAttribute(UserObject
,
2257 EmptyString
.MaximumLength
);
2258 if (!NT_SUCCESS(Status
))
2260 TRACE("failed with status 0x%08lx\n", Status
);
2264 /* Set the AdminComment attribute */
2265 Status
= SampSetObjectAttribute(UserObject
,
2269 EmptyString
.MaximumLength
);
2270 if (!NT_SUCCESS(Status
))
2272 TRACE("failed with status 0x%08lx\n", Status
);
2276 /* Set the UserComment attribute */
2277 Status
= SampSetObjectAttribute(UserObject
,
2281 EmptyString
.MaximumLength
);
2282 if (!NT_SUCCESS(Status
))
2284 TRACE("failed with status 0x%08lx\n", Status
);
2288 /* Set the WorkStations attribute */
2289 Status
= SampSetObjectAttribute(UserObject
,
2293 EmptyString
.MaximumLength
);
2294 if (!NT_SUCCESS(Status
))
2296 TRACE("failed with status 0x%08lx\n", Status
);
2300 /* Set the Parameters attribute */
2301 Status
= SampSetObjectAttribute(UserObject
,
2305 EmptyString
.MaximumLength
);
2306 if (!NT_SUCCESS(Status
))
2308 TRACE("failed with status 0x%08lx\n", Status
);
2312 /* FIXME: Set default user attributes */
2314 if (NT_SUCCESS(Status
))
2316 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2317 *RelativeId
= ulRid
;
2320 TRACE("returns with status 0x%08lx\n", Status
);
2329 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2330 IN OUT
unsigned long *EnumerationContext
,
2331 IN
unsigned long UserAccountControl
,
2332 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2333 IN
unsigned long PreferedMaximumLength
,
2334 OUT
unsigned long *CountReturned
)
2336 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2337 PSAM_DB_OBJECT DomainObject
;
2338 HANDLE UsersKeyHandle
= NULL
;
2339 HANDLE NamesKeyHandle
= NULL
;
2342 ULONG EnumCount
= 0;
2343 ULONG RequiredLength
= 0;
2348 BOOLEAN MoreEntries
= FALSE
;
2351 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2352 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2353 PreferedMaximumLength
, CountReturned
);
2355 /* Validate the domain handle */
2356 Status
= SampValidateDbObject(DomainHandle
,
2358 DOMAIN_LIST_ACCOUNTS
,
2360 if (!NT_SUCCESS(Status
))
2363 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2367 if (!NT_SUCCESS(Status
))
2370 Status
= SampRegOpenKey(UsersKeyHandle
,
2374 if (!NT_SUCCESS(Status
))
2379 EnumIndex
= *EnumerationContext
;
2383 NameLength
= 64 * sizeof(WCHAR
);
2384 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2391 if (!NT_SUCCESS(Status
))
2393 if (Status
== STATUS_NO_MORE_ENTRIES
)
2394 Status
= STATUS_SUCCESS
;
2398 TRACE("EnumIndex: %lu\n", EnumIndex
);
2399 TRACE("User name: %S\n", UserName
);
2400 TRACE("Name length: %lu\n", NameLength
);
2402 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2408 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2414 TRACE("EnumCount: %lu\n", EnumCount
);
2415 TRACE("RequiredLength: %lu\n", RequiredLength
);
2417 if (!NT_SUCCESS(Status
))
2420 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2421 if (EnumBuffer
== NULL
)
2423 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2427 EnumBuffer
->EntriesRead
= EnumCount
;
2431 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2432 if (EnumBuffer
->Buffer
== NULL
)
2434 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2440 EnumIndex
= *EnumerationContext
;
2441 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2443 NameLength
= 64 * sizeof(WCHAR
);
2444 DataLength
= sizeof(ULONG
);
2445 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2452 if (!NT_SUCCESS(Status
))
2454 if (Status
== STATUS_NO_MORE_ENTRIES
)
2455 Status
= STATUS_SUCCESS
;
2459 TRACE("EnumIndex: %lu\n", EnumIndex
);
2460 TRACE("User name: %S\n", UserName
);
2461 TRACE("Name length: %lu\n", NameLength
);
2462 TRACE("RID: %lu\n", Rid
);
2464 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2466 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2467 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2469 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2471 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2472 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2474 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2478 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2480 EnumBuffer
->Buffer
[i
].Name
.Length
);
2485 if (NT_SUCCESS(Status
))
2487 *EnumerationContext
+= EnumCount
;
2488 *Buffer
= EnumBuffer
;
2489 *CountReturned
= EnumCount
;
2493 *EnumerationContext
= 0;
2497 if (EnumBuffer
!= NULL
)
2499 if (EnumBuffer
->Buffer
!= NULL
)
2501 if (EnumBuffer
->EntriesRead
!= 0)
2503 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2505 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2506 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2510 midl_user_free(EnumBuffer
->Buffer
);
2513 midl_user_free(EnumBuffer
);
2517 if (NamesKeyHandle
!= NULL
)
2518 SampRegCloseKey(NamesKeyHandle
);
2520 if (UsersKeyHandle
!= NULL
)
2521 SampRegCloseKey(UsersKeyHandle
);
2523 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2524 Status
= STATUS_MORE_ENTRIES
;
2533 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2534 IN PRPC_UNICODE_STRING AccountName
,
2535 IN ACCESS_MASK DesiredAccess
,
2536 OUT SAMPR_HANDLE
*AliasHandle
,
2537 OUT
unsigned long *RelativeId
)
2539 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2540 PSAM_DB_OBJECT DomainObject
;
2541 PSAM_DB_OBJECT AliasObject
;
2542 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2548 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2549 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2551 /* Map generic access rights */
2552 RtlMapGenericMask(&DesiredAccess
,
2555 /* Validate the domain handle */
2556 Status
= SampValidateDbObject(DomainHandle
,
2558 DOMAIN_CREATE_ALIAS
,
2560 if (!NT_SUCCESS(Status
))
2562 TRACE("failed with status 0x%08lx\n", Status
);
2566 /* Check if the alias name already exists in the domain */
2567 Status
= SampCheckAccountNameInDomain(DomainObject
,
2568 AccountName
->Buffer
);
2569 if (!NT_SUCCESS(Status
))
2571 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2572 AccountName
->Buffer
, Status
);
2576 /* Get the fixed domain attributes */
2577 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2578 Status
= SampGetObjectAttribute(DomainObject
,
2581 (PVOID
)&FixedDomainData
,
2583 if (!NT_SUCCESS(Status
))
2585 TRACE("failed with status 0x%08lx\n", Status
);
2589 /* Increment the NextRid attribute */
2590 ulRid
= FixedDomainData
.NextRid
;
2591 FixedDomainData
.NextRid
++;
2593 /* Store the fixed domain attributes */
2594 Status
= SampSetObjectAttribute(DomainObject
,
2599 if (!NT_SUCCESS(Status
))
2601 TRACE("failed with status 0x%08lx\n", Status
);
2605 TRACE("RID: %lx\n", ulRid
);
2607 /* Convert the RID into a string (hex) */
2608 swprintf(szRid
, L
"%08lX", ulRid
);
2610 /* Create the alias object */
2611 Status
= SampCreateDbObject(DomainObject
,
2618 if (!NT_SUCCESS(Status
))
2620 TRACE("failed with status 0x%08lx\n", Status
);
2624 /* Add the account name for the alias object */
2625 Status
= SampSetAccountNameInDomain(DomainObject
,
2627 AccountName
->Buffer
,
2629 if (!NT_SUCCESS(Status
))
2631 TRACE("failed with status 0x%08lx\n", Status
);
2635 /* Set the Name attribute */
2636 Status
= SampSetObjectAttribute(AliasObject
,
2639 (LPVOID
)AccountName
->Buffer
,
2640 AccountName
->MaximumLength
);
2641 if (!NT_SUCCESS(Status
))
2643 TRACE("failed with status 0x%08lx\n", Status
);
2647 /* Set the Description attribute */
2648 Status
= SampSetObjectAttribute(AliasObject
,
2652 EmptyString
.MaximumLength
);
2653 if (!NT_SUCCESS(Status
))
2655 TRACE("failed with status 0x%08lx\n", Status
);
2659 if (NT_SUCCESS(Status
))
2661 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2662 *RelativeId
= ulRid
;
2665 TRACE("returns with status 0x%08lx\n", Status
);
2674 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2675 IN OUT
unsigned long *EnumerationContext
,
2676 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2677 IN
unsigned long PreferedMaximumLength
,
2678 OUT
unsigned long *CountReturned
)
2680 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2681 PSAM_DB_OBJECT DomainObject
;
2682 HANDLE AliasesKeyHandle
= NULL
;
2683 HANDLE NamesKeyHandle
= NULL
;
2684 WCHAR AliasName
[64];
2686 ULONG EnumCount
= 0;
2687 ULONG RequiredLength
= 0;
2692 BOOLEAN MoreEntries
= FALSE
;
2695 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2696 DomainHandle
, EnumerationContext
, Buffer
,
2697 PreferedMaximumLength
, CountReturned
);
2699 /* Validate the domain handle */
2700 Status
= SampValidateDbObject(DomainHandle
,
2702 DOMAIN_LIST_ACCOUNTS
,
2704 if (!NT_SUCCESS(Status
))
2707 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2711 if (!NT_SUCCESS(Status
))
2714 Status
= SampRegOpenKey(AliasesKeyHandle
,
2718 if (!NT_SUCCESS(Status
))
2723 EnumIndex
= *EnumerationContext
;
2727 NameLength
= 64 * sizeof(WCHAR
);
2728 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2735 if (!NT_SUCCESS(Status
))
2737 if (Status
== STATUS_NO_MORE_ENTRIES
)
2738 Status
= STATUS_SUCCESS
;
2742 TRACE("EnumIndex: %lu\n", EnumIndex
);
2743 TRACE("Alias name: %S\n", AliasName
);
2744 TRACE("Name length: %lu\n", NameLength
);
2746 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2752 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2758 TRACE("EnumCount: %lu\n", EnumCount
);
2759 TRACE("RequiredLength: %lu\n", RequiredLength
);
2761 if (!NT_SUCCESS(Status
))
2764 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2765 if (EnumBuffer
== NULL
)
2767 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2771 EnumBuffer
->EntriesRead
= EnumCount
;
2775 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2776 if (EnumBuffer
->Buffer
== NULL
)
2778 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2784 EnumIndex
= *EnumerationContext
;
2785 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2787 NameLength
= 64 * sizeof(WCHAR
);
2788 DataLength
= sizeof(ULONG
);
2789 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2796 if (!NT_SUCCESS(Status
))
2798 if (Status
== STATUS_NO_MORE_ENTRIES
)
2799 Status
= STATUS_SUCCESS
;
2803 TRACE("EnumIndex: %lu\n", EnumIndex
);
2804 TRACE("Alias name: %S\n", AliasName
);
2805 TRACE("Name length: %lu\n", NameLength
);
2806 TRACE("RID: %lu\n", Rid
);
2808 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2810 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2811 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2813 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2815 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2816 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2818 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2822 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2824 EnumBuffer
->Buffer
[i
].Name
.Length
);
2829 if (NT_SUCCESS(Status
))
2831 *EnumerationContext
+= EnumCount
;
2832 *Buffer
= EnumBuffer
;
2833 *CountReturned
= EnumCount
;
2837 *EnumerationContext
= 0;
2841 if (EnumBuffer
!= NULL
)
2843 if (EnumBuffer
->Buffer
!= NULL
)
2845 if (EnumBuffer
->EntriesRead
!= 0)
2847 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2849 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2850 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2854 midl_user_free(EnumBuffer
->Buffer
);
2857 midl_user_free(EnumBuffer
);
2861 if (NamesKeyHandle
!= NULL
)
2862 SampRegCloseKey(NamesKeyHandle
);
2864 if (AliasesKeyHandle
!= NULL
)
2865 SampRegCloseKey(AliasesKeyHandle
);
2867 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2868 Status
= STATUS_MORE_ENTRIES
;
2877 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2878 IN PSAMPR_PSID_ARRAY SidArray
,
2879 OUT PSAMPR_ULONG_ARRAY Membership
)
2881 PSAM_DB_OBJECT DomainObject
;
2882 HANDLE AliasesKeyHandle
= NULL
;
2883 HANDLE MembersKeyHandle
= NULL
;
2884 HANDLE MemberKeyHandle
= NULL
;
2885 LPWSTR MemberSidString
= NULL
;
2886 PULONG RidArray
= NULL
;
2887 ULONG MaxSidCount
= 0;
2892 WCHAR NameBuffer
[9];
2894 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2895 DomainHandle
, SidArray
, Membership
);
2897 /* Validate the domain handle */
2898 Status
= SampValidateDbObject(DomainHandle
,
2900 DOMAIN_GET_ALIAS_MEMBERSHIP
,
2902 if (!NT_SUCCESS(Status
))
2905 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2909 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2910 if (!NT_SUCCESS(Status
))
2913 Status
= SampRegOpenKey(AliasesKeyHandle
,
2917 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2919 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
2921 Status
= STATUS_SUCCESS
;
2925 if (!NT_SUCCESS(Status
))
2928 for (i
= 0; i
< SidArray
->Count
; i
++)
2930 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2931 TRACE("Open %S\n", MemberSidString
);
2933 Status
= SampRegOpenKey(MembersKeyHandle
,
2937 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2938 if (NT_SUCCESS(Status
))
2940 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2943 if (NT_SUCCESS(Status
))
2945 TRACE("Found %lu values\n", ValueCount
);
2946 MaxSidCount
+= ValueCount
;
2949 NtClose(MemberKeyHandle
);
2952 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
2953 Status
= STATUS_SUCCESS
;
2955 LocalFree(MemberSidString
);
2958 if (MaxSidCount
== 0)
2960 Status
= STATUS_SUCCESS
;
2964 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
2965 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
2966 if (RidArray
== NULL
)
2968 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2972 for (i
= 0; i
< SidArray
->Count
; i
++)
2974 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2975 TRACE("Open %S\n", MemberSidString
);
2977 Status
= SampRegOpenKey(MembersKeyHandle
,
2981 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2982 if (NT_SUCCESS(Status
))
2984 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2987 if (NT_SUCCESS(Status
))
2989 TRACE("Found %lu values\n", ValueCount
);
2991 for (j
= 0; j
< ValueCount
; j
++)
2993 DataLength
= 9 * sizeof(WCHAR
);
2994 Status
= SampRegEnumerateValue(MemberKeyHandle
,
3001 if (NT_SUCCESS(Status
))
3003 RidArray
[j
] = wcstoul(NameBuffer
, NULL
, 16);
3008 NtClose(MemberKeyHandle
);
3011 LocalFree(MemberSidString
);
3015 if (NT_SUCCESS(Status
))
3017 Membership
->Count
= MaxSidCount
;
3018 Membership
->Element
= RidArray
;
3022 if (RidArray
!= NULL
)
3023 midl_user_free(RidArray
);
3026 if (MembersKeyHandle
!= NULL
)
3027 NtClose(MembersKeyHandle
);
3029 if (MembersKeyHandle
!= NULL
)
3030 NtClose(MembersKeyHandle
);
3032 if (AliasesKeyHandle
!= NULL
)
3033 NtClose(AliasesKeyHandle
);
3042 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
3044 IN RPC_UNICODE_STRING Names
[],
3045 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
3046 OUT PSAMPR_ULONG_ARRAY Use
)
3048 PSAM_DB_OBJECT DomainObject
;
3049 HANDLE AccountsKeyHandle
;
3050 HANDLE NamesKeyHandle
;
3051 ULONG MappedCount
= 0;
3057 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
3058 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
3060 /* Validate the domain handle */
3061 Status
= SampValidateDbObject(DomainHandle
,
3065 if (!NT_SUCCESS(Status
))
3067 TRACE("failed with status 0x%08lx\n", Status
);
3071 RelativeIds
->Count
= 0;
3075 return STATUS_SUCCESS
;
3077 /* Allocate the relative IDs array */
3078 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3079 if (RelativeIds
->Element
== NULL
)
3081 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3085 /* Allocate the use array */
3086 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3087 if (Use
->Element
== NULL
)
3089 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3093 RelativeIds
->Count
= Count
;
3096 for (i
= 0; i
< Count
; i
++)
3098 TRACE("Name: %S\n", Names
[i
].Buffer
);
3102 /* Lookup aliases */
3103 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3106 &AccountsKeyHandle
);
3107 if (NT_SUCCESS(Status
))
3109 Status
= SampRegOpenKey(AccountsKeyHandle
,
3113 if (NT_SUCCESS(Status
))
3115 DataLength
= sizeof(ULONG
);
3116 Status
= SampRegQueryValue(NamesKeyHandle
,
3122 SampRegCloseKey(NamesKeyHandle
);
3125 SampRegCloseKey(AccountsKeyHandle
);
3128 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3131 /* Return alias account */
3132 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3134 TRACE("Rid: %lu\n", RelativeId
);
3135 RelativeIds
->Element
[i
] = RelativeId
;
3136 Use
->Element
[i
] = SidTypeAlias
;
3142 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3145 &AccountsKeyHandle
);
3146 if (NT_SUCCESS(Status
))
3148 Status
= SampRegOpenKey(AccountsKeyHandle
,
3152 if (NT_SUCCESS(Status
))
3154 DataLength
= sizeof(ULONG
);
3155 Status
= SampRegQueryValue(NamesKeyHandle
,
3161 SampRegCloseKey(NamesKeyHandle
);
3164 SampRegCloseKey(AccountsKeyHandle
);
3167 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3170 /* Return group account */
3171 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3173 TRACE("Rid: %lu\n", RelativeId
);
3174 RelativeIds
->Element
[i
] = RelativeId
;
3175 Use
->Element
[i
] = SidTypeGroup
;
3181 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3184 &AccountsKeyHandle
);
3185 if (NT_SUCCESS(Status
))
3187 Status
= SampRegOpenKey(AccountsKeyHandle
,
3191 if (NT_SUCCESS(Status
))
3193 DataLength
= sizeof(ULONG
);
3194 Status
= SampRegQueryValue(NamesKeyHandle
,
3200 SampRegCloseKey(NamesKeyHandle
);
3203 SampRegCloseKey(AccountsKeyHandle
);
3206 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3209 /* Return user account */
3210 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3212 TRACE("Rid: %lu\n", RelativeId
);
3213 RelativeIds
->Element
[i
] = RelativeId
;
3214 Use
->Element
[i
] = SidTypeUser
;
3219 /* Return unknown account */
3220 RelativeIds
->Element
[i
] = 0;
3221 Use
->Element
[i
] = SidTypeUnknown
;
3225 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3226 Status
= STATUS_SUCCESS
;
3228 if (NT_SUCCESS(Status
))
3230 if (MappedCount
== 0)
3231 Status
= STATUS_NONE_MAPPED
;
3232 else if (MappedCount
< Count
)
3233 Status
= STATUS_SOME_NOT_MAPPED
;
3237 if (RelativeIds
->Element
!= NULL
)
3239 midl_user_free(RelativeIds
->Element
);
3240 RelativeIds
->Element
= NULL
;
3243 RelativeIds
->Count
= 0;
3245 if (Use
->Element
!= NULL
)
3247 midl_user_free(Use
->Element
);
3248 Use
->Element
= NULL
;
3254 TRACE("Returned Status %lx\n", Status
);
3263 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3265 IN ULONG
*RelativeIds
,
3266 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3267 OUT PSAMPR_ULONG_ARRAY Use
)
3269 PSAM_DB_OBJECT DomainObject
;
3271 HANDLE AccountsKeyHandle
;
3272 HANDLE AccountKeyHandle
;
3273 ULONG MappedCount
= 0;
3278 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3279 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3281 /* Validate the domain handle */
3282 Status
= SampValidateDbObject(DomainHandle
,
3286 if (!NT_SUCCESS(Status
))
3288 TRACE("failed with status 0x%08lx\n", Status
);
3296 return STATUS_SUCCESS
;
3298 /* Allocate the names array */
3299 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3300 if (Names
->Element
== NULL
)
3302 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3306 /* Allocate the use array */
3307 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3308 if (Use
->Element
== NULL
)
3310 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3314 Names
->Count
= Count
;
3317 for (i
= 0; i
< Count
; i
++)
3319 TRACE("RID: %lu\n", RelativeIds
[i
]);
3321 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3323 /* Lookup aliases */
3324 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3327 &AccountsKeyHandle
);
3328 if (NT_SUCCESS(Status
))
3330 Status
= SampRegOpenKey(AccountsKeyHandle
,
3334 if (NT_SUCCESS(Status
))
3337 Status
= SampRegQueryValue(AccountKeyHandle
,
3342 if (NT_SUCCESS(Status
))
3344 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3345 if (Names
->Element
[i
].Buffer
== NULL
)
3346 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3348 if (NT_SUCCESS(Status
))
3350 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3351 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3353 Status
= SampRegQueryValue(AccountKeyHandle
,
3356 Names
->Element
[i
].Buffer
,
3361 SampRegCloseKey(AccountKeyHandle
);
3364 SampRegCloseKey(AccountsKeyHandle
);
3367 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3370 /* Return alias account */
3371 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3373 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3374 Use
->Element
[i
] = SidTypeAlias
;
3380 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3383 &AccountsKeyHandle
);
3384 if (NT_SUCCESS(Status
))
3386 Status
= SampRegOpenKey(AccountsKeyHandle
,
3390 if (NT_SUCCESS(Status
))
3393 Status
= SampRegQueryValue(AccountKeyHandle
,
3398 if (NT_SUCCESS(Status
))
3400 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3401 if (Names
->Element
[i
].Buffer
== NULL
)
3402 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3404 if (NT_SUCCESS(Status
))
3406 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3407 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3409 Status
= SampRegQueryValue(AccountKeyHandle
,
3412 Names
->Element
[i
].Buffer
,
3417 SampRegCloseKey(AccountKeyHandle
);
3420 SampRegCloseKey(AccountsKeyHandle
);
3423 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3426 /* Return group account */
3427 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3429 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3430 Use
->Element
[i
] = SidTypeGroup
;
3436 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3439 &AccountsKeyHandle
);
3440 if (NT_SUCCESS(Status
))
3442 Status
= SampRegOpenKey(AccountsKeyHandle
,
3446 if (NT_SUCCESS(Status
))
3449 Status
= SampRegQueryValue(AccountKeyHandle
,
3454 if (NT_SUCCESS(Status
))
3456 TRACE("DataLength: %lu\n", DataLength
);
3458 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3459 if (Names
->Element
[i
].Buffer
== NULL
)
3460 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3462 if (NT_SUCCESS(Status
))
3464 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3465 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3467 Status
= SampRegQueryValue(AccountKeyHandle
,
3470 Names
->Element
[i
].Buffer
,
3475 SampRegCloseKey(AccountKeyHandle
);
3478 SampRegCloseKey(AccountsKeyHandle
);
3481 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3484 /* Return user account */
3485 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3487 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3488 Use
->Element
[i
] = SidTypeUser
;
3493 /* Return unknown account */
3494 Use
->Element
[i
] = SidTypeUnknown
;
3498 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3499 Status
= STATUS_SUCCESS
;
3501 if (NT_SUCCESS(Status
))
3503 if (MappedCount
== 0)
3504 Status
= STATUS_NONE_MAPPED
;
3505 else if (MappedCount
< Count
)
3506 Status
= STATUS_SOME_NOT_MAPPED
;
3510 if (Names
->Element
!= NULL
)
3512 for (i
= 0; i
< Count
; i
++)
3514 if (Names
->Element
[i
].Buffer
!= NULL
)
3515 midl_user_free(Names
->Element
[i
].Buffer
);
3518 midl_user_free(Names
->Element
);
3519 Names
->Element
= NULL
;
3524 if (Use
->Element
!= NULL
)
3526 midl_user_free(Use
->Element
);
3527 Use
->Element
= NULL
;
3540 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3541 IN ACCESS_MASK DesiredAccess
,
3542 IN
unsigned long GroupId
,
3543 OUT SAMPR_HANDLE
*GroupHandle
)
3545 PSAM_DB_OBJECT DomainObject
;
3546 PSAM_DB_OBJECT GroupObject
;
3550 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3551 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3553 /* Map generic access rights */
3554 RtlMapGenericMask(&DesiredAccess
,
3557 /* Validate the domain handle */
3558 Status
= SampValidateDbObject(DomainHandle
,
3562 if (!NT_SUCCESS(Status
))
3564 TRACE("failed with status 0x%08lx\n", Status
);
3568 /* Convert the RID into a string (hex) */
3569 swprintf(szRid
, L
"%08lX", GroupId
);
3571 /* Create the group object */
3572 Status
= SampOpenDbObject(DomainObject
,
3579 if (!NT_SUCCESS(Status
))
3581 TRACE("failed with status 0x%08lx\n", Status
);
3585 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3587 return STATUS_SUCCESS
;
3592 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3593 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3595 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3596 SAM_GROUP_FIXED_DATA FixedData
;
3597 ULONG MembersLength
= 0;
3603 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3604 if (InfoBuffer
== NULL
)
3605 return STATUS_INSUFFICIENT_RESOURCES
;
3607 Status
= SampGetObjectAttributeString(GroupObject
,
3609 &InfoBuffer
->General
.Name
);
3610 if (!NT_SUCCESS(Status
))
3612 TRACE("Status 0x%08lx\n", Status
);
3616 Status
= SampGetObjectAttributeString(GroupObject
,
3618 &InfoBuffer
->General
.AdminComment
);
3619 if (!NT_SUCCESS(Status
))
3621 TRACE("Status 0x%08lx\n", Status
);
3625 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3626 Status
= SampGetObjectAttribute(GroupObject
,
3631 if (!NT_SUCCESS(Status
))
3634 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3636 Status
= SampGetObjectAttribute(GroupObject
,
3641 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3644 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3645 InfoBuffer
->General
.MemberCount
= 0;
3647 InfoBuffer
->General
.MemberCount
= MembersLength
/ sizeof(ULONG
);
3649 *Buffer
= InfoBuffer
;
3652 if (!NT_SUCCESS(Status
))
3654 if (InfoBuffer
!= NULL
)
3656 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3657 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3659 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3660 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3662 midl_user_free(InfoBuffer
);
3671 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3672 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3674 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3679 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3680 if (InfoBuffer
== NULL
)
3681 return STATUS_INSUFFICIENT_RESOURCES
;
3683 Status
= SampGetObjectAttributeString(GroupObject
,
3685 &InfoBuffer
->Name
.Name
);
3686 if (!NT_SUCCESS(Status
))
3688 TRACE("Status 0x%08lx\n", Status
);
3692 *Buffer
= InfoBuffer
;
3695 if (!NT_SUCCESS(Status
))
3697 if (InfoBuffer
!= NULL
)
3699 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3700 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3702 midl_user_free(InfoBuffer
);
3711 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3712 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3714 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3715 SAM_GROUP_FIXED_DATA FixedData
;
3721 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3722 if (InfoBuffer
== NULL
)
3723 return STATUS_INSUFFICIENT_RESOURCES
;
3725 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3726 Status
= SampGetObjectAttribute(GroupObject
,
3731 if (!NT_SUCCESS(Status
))
3734 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3736 *Buffer
= InfoBuffer
;
3739 if (!NT_SUCCESS(Status
))
3741 if (InfoBuffer
!= NULL
)
3743 midl_user_free(InfoBuffer
);
3752 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3753 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3755 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3760 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3761 if (InfoBuffer
== NULL
)
3762 return STATUS_INSUFFICIENT_RESOURCES
;
3764 Status
= SampGetObjectAttributeString(GroupObject
,
3766 &InfoBuffer
->AdminComment
.AdminComment
);
3767 if (!NT_SUCCESS(Status
))
3769 TRACE("Status 0x%08lx\n", Status
);
3773 *Buffer
= InfoBuffer
;
3776 if (!NT_SUCCESS(Status
))
3778 if (InfoBuffer
!= NULL
)
3780 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3781 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3783 midl_user_free(InfoBuffer
);
3794 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3795 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3796 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3798 PSAM_DB_OBJECT GroupObject
;
3801 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
3802 GroupHandle
, GroupInformationClass
, Buffer
);
3804 /* Validate the group handle */
3805 Status
= SampValidateDbObject(GroupHandle
,
3807 GROUP_READ_INFORMATION
,
3809 if (!NT_SUCCESS(Status
))
3812 switch (GroupInformationClass
)
3814 case GroupGeneralInformation
:
3815 Status
= SampQueryGroupGeneral(GroupObject
,
3819 case GroupNameInformation
:
3820 Status
= SampQueryGroupName(GroupObject
,
3824 case GroupAttributeInformation
:
3825 Status
= SampQueryGroupAttribute(GroupObject
,
3829 case GroupAdminCommentInformation
:
3830 Status
= SampQueryGroupAdminComment(GroupObject
,
3835 Status
= STATUS_INVALID_INFO_CLASS
;
3844 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3845 PSAMPR_GROUP_INFO_BUFFER Buffer
)
3847 SAM_GROUP_FIXED_DATA FixedData
;
3851 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3852 Status
= SampGetObjectAttribute(GroupObject
,
3857 if (!NT_SUCCESS(Status
))
3860 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
3862 Status
= SampSetObjectAttribute(GroupObject
,
3876 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3877 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3878 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
3880 PSAM_DB_OBJECT GroupObject
;
3883 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
3884 GroupHandle
, GroupInformationClass
, Buffer
);
3886 /* Validate the group handle */
3887 Status
= SampValidateDbObject(GroupHandle
,
3889 GROUP_WRITE_ACCOUNT
,
3891 if (!NT_SUCCESS(Status
))
3894 switch (GroupInformationClass
)
3896 case GroupNameInformation
:
3897 Status
= SampSetObjectAttribute(GroupObject
,
3900 Buffer
->Name
.Name
.Buffer
,
3901 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3904 case GroupAttributeInformation
:
3905 Status
= SampSetGroupAttribute(GroupObject
,
3909 case GroupAdminCommentInformation
:
3910 Status
= SampSetObjectAttribute(GroupObject
,
3913 Buffer
->AdminComment
.AdminComment
.Buffer
,
3914 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
3918 Status
= STATUS_INVALID_INFO_CLASS
;
3929 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
3930 IN
unsigned long MemberId
,
3931 IN
unsigned long Attributes
)
3933 PSAM_DB_OBJECT GroupObject
;
3934 PSAM_DB_OBJECT UserObject
= NULL
;
3937 TRACE("(%p %lu %lx)\n",
3938 GroupHandle
, MemberId
, Attributes
);
3940 /* Validate the group handle */
3941 Status
= SampValidateDbObject(GroupHandle
,
3945 if (!NT_SUCCESS(Status
))
3948 /* Open the user object in the same domain */
3949 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
3953 if (!NT_SUCCESS(Status
))
3955 TRACE("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
3959 /* Add group membership to the user object */
3960 Status
= SampAddGroupMembershipToUser(UserObject
,
3961 GroupObject
->RelativeId
,
3963 if (!NT_SUCCESS(Status
))
3965 TRACE("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
3969 /* Add the member to the group object */
3970 Status
= SampAddMemberToGroup(GroupObject
,
3972 if (!NT_SUCCESS(Status
))
3974 TRACE("SampAddMemberToGroup() failed (Status 0x%08lx)\n", Status
);
3979 SampCloseDbObject(UserObject
);
3988 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
3990 PSAM_DB_OBJECT GroupObject
;
3994 TRACE("(%p)\n", GroupHandle
);
3996 /* Validate the group handle */
3997 Status
= SampValidateDbObject(*GroupHandle
,
4001 if (!NT_SUCCESS(Status
))
4003 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
4007 /* Fail, if the group is built-in */
4008 if (GroupObject
->RelativeId
< 1000)
4010 TRACE("You can not delete a special account!\n");
4011 return STATUS_SPECIAL_ACCOUNT
;
4014 /* Get the length of the Members attribute */
4015 SampGetObjectAttribute(GroupObject
,
4021 /* Fail, if the group has members */
4024 TRACE("There are still members in the group!\n");
4025 return STATUS_MEMBER_IN_GROUP
;
4028 /* FIXME: Remove the group from all aliases */
4030 /* Delete the group from the database */
4031 Status
= SampDeleteAccountDbObject(GroupObject
);
4032 if (!NT_SUCCESS(Status
))
4034 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4038 /* Invalidate the handle */
4039 *GroupHandle
= NULL
;
4041 return STATUS_SUCCESS
;
4048 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
4049 IN
unsigned long MemberId
)
4051 PSAM_DB_OBJECT GroupObject
;
4052 PSAM_DB_OBJECT UserObject
= NULL
;
4056 GroupHandle
, MemberId
);
4058 /* Validate the group handle */
4059 Status
= SampValidateDbObject(GroupHandle
,
4061 GROUP_REMOVE_MEMBER
,
4063 if (!NT_SUCCESS(Status
))
4066 /* Open the user object in the same domain */
4067 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4071 if (!NT_SUCCESS(Status
))
4073 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4077 /* Remove group membership from the user object */
4078 Status
= SampRemoveGroupMembershipFromUser(UserObject
,
4079 GroupObject
->RelativeId
);
4080 if (!NT_SUCCESS(Status
))
4082 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4086 /* Remove the member from the group object */
4087 Status
= SampRemoveMemberFromGroup(GroupObject
,
4089 if (!NT_SUCCESS(Status
))
4091 ERR("SampRemoveMemberFromGroup() failed (Status 0x%08lx)\n", Status
);
4096 SampCloseDbObject(UserObject
);
4105 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
4106 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
4108 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
4109 PSAM_DB_OBJECT GroupObject
;
4114 /* Validate the group handle */
4115 Status
= SampValidateDbObject(GroupHandle
,
4119 if (!NT_SUCCESS(Status
))
4122 MembersBuffer
= midl_user_allocate(sizeof(SAMPR_GET_MEMBERS_BUFFER
));
4123 if (MembersBuffer
== NULL
)
4124 return STATUS_INSUFFICIENT_RESOURCES
;
4126 SampGetObjectAttribute(GroupObject
,
4134 MembersBuffer
->MemberCount
= 0;
4135 MembersBuffer
->Members
= NULL
;
4136 MembersBuffer
->Attributes
= NULL
;
4138 *Members
= MembersBuffer
;
4140 return STATUS_SUCCESS
;
4143 MembersBuffer
->Members
= midl_user_allocate(Length
);
4144 if (MembersBuffer
->Members
== NULL
)
4146 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4150 MembersBuffer
->Attributes
= midl_user_allocate(Length
);
4151 if (MembersBuffer
->Attributes
== NULL
)
4153 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4157 Status
= SampGetObjectAttribute(GroupObject
,
4160 MembersBuffer
->Members
,
4162 if (!NT_SUCCESS(Status
))
4164 TRACE("SampGetObjectAttributes() failed (Status 0x%08lx)\n", Status
);
4168 MembersBuffer
->MemberCount
= Length
/ sizeof(ULONG
);
4170 for (i
= 0; i
< MembersBuffer
->MemberCount
; i
++)
4172 Status
= SampGetUserGroupAttributes(GroupObject
->ParentObject
,
4173 MembersBuffer
->Members
[i
],
4174 GroupObject
->RelativeId
,
4175 &(MembersBuffer
->Attributes
[i
]));
4176 if (!NT_SUCCESS(Status
))
4178 TRACE("SampGetUserGroupAttributes() failed (Status 0x%08lx)\n", Status
);
4183 *Members
= MembersBuffer
;
4186 if (!NT_SUCCESS(Status
))
4188 if (MembersBuffer
!= NULL
)
4190 if (MembersBuffer
->Members
!= NULL
)
4191 midl_user_free(MembersBuffer
->Members
);
4193 if (MembersBuffer
->Attributes
!= NULL
)
4194 midl_user_free(MembersBuffer
->Attributes
);
4196 midl_user_free(MembersBuffer
);
4207 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
4208 IN
unsigned long MemberId
,
4209 IN
unsigned long Attributes
)
4211 PSAM_DB_OBJECT GroupObject
;
4214 /* Validate the group handle */
4215 Status
= SampValidateDbObject(GroupHandle
,
4219 if (!NT_SUCCESS(Status
))
4221 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
4225 Status
= SampSetUserGroupAttributes(GroupObject
->ParentObject
,
4227 GroupObject
->RelativeId
,
4229 if (!NT_SUCCESS(Status
))
4231 TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status
);
4241 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
4242 IN ACCESS_MASK DesiredAccess
,
4244 OUT SAMPR_HANDLE
*AliasHandle
)
4246 PSAM_DB_OBJECT DomainObject
;
4247 PSAM_DB_OBJECT AliasObject
;
4251 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4252 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4254 /* Map generic access rights */
4255 RtlMapGenericMask(&DesiredAccess
,
4258 /* Validate the domain handle */
4259 Status
= SampValidateDbObject(DomainHandle
,
4263 if (!NT_SUCCESS(Status
))
4265 TRACE("failed with status 0x%08lx\n", Status
);
4269 /* Convert the RID into a string (hex) */
4270 swprintf(szRid
, L
"%08lX", AliasId
);
4272 /* Create the alias object */
4273 Status
= SampOpenDbObject(DomainObject
,
4280 if (!NT_SUCCESS(Status
))
4282 TRACE("failed with status 0x%08lx\n", Status
);
4286 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4288 return STATUS_SUCCESS
;
4293 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4294 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4296 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4297 HANDLE MembersKeyHandle
= NULL
;
4302 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4303 if (InfoBuffer
== NULL
)
4304 return STATUS_INSUFFICIENT_RESOURCES
;
4306 Status
= SampGetObjectAttributeString(AliasObject
,
4308 &InfoBuffer
->General
.Name
);
4309 if (!NT_SUCCESS(Status
))
4311 TRACE("Status 0x%08lx\n", Status
);
4315 Status
= SampGetObjectAttributeString(AliasObject
,
4317 &InfoBuffer
->General
.AdminComment
);
4318 if (!NT_SUCCESS(Status
))
4320 TRACE("Status 0x%08lx\n", Status
);
4324 /* Open the Members subkey */
4325 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4329 if (NT_SUCCESS(Status
))
4331 /* Retrieve the number of members of the alias */
4332 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4334 &InfoBuffer
->General
.MemberCount
);
4335 if (!NT_SUCCESS(Status
))
4337 TRACE("Status 0x%08lx\n", Status
);
4341 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4343 InfoBuffer
->General
.MemberCount
= 0;
4344 Status
= STATUS_SUCCESS
;
4348 TRACE("Status 0x%08lx\n", Status
);
4352 *Buffer
= InfoBuffer
;
4355 if (MembersKeyHandle
!= NULL
)
4356 SampRegCloseKey(MembersKeyHandle
);
4358 if (!NT_SUCCESS(Status
))
4360 if (InfoBuffer
!= NULL
)
4362 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4363 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4365 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4366 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4368 midl_user_free(InfoBuffer
);
4377 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4378 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4380 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4385 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4386 if (InfoBuffer
== NULL
)
4387 return STATUS_INSUFFICIENT_RESOURCES
;
4389 Status
= SampGetObjectAttributeString(AliasObject
,
4391 &InfoBuffer
->Name
.Name
);
4392 if (!NT_SUCCESS(Status
))
4394 TRACE("Status 0x%08lx\n", Status
);
4398 *Buffer
= InfoBuffer
;
4401 if (!NT_SUCCESS(Status
))
4403 if (InfoBuffer
!= NULL
)
4405 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4406 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4408 midl_user_free(InfoBuffer
);
4417 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4418 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4420 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4425 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4426 if (InfoBuffer
== NULL
)
4427 return STATUS_INSUFFICIENT_RESOURCES
;
4429 Status
= SampGetObjectAttributeString(AliasObject
,
4431 &InfoBuffer
->AdminComment
.AdminComment
);
4432 if (!NT_SUCCESS(Status
))
4434 TRACE("Status 0x%08lx\n", Status
);
4438 *Buffer
= InfoBuffer
;
4441 if (!NT_SUCCESS(Status
))
4443 if (InfoBuffer
!= NULL
)
4445 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4446 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4448 midl_user_free(InfoBuffer
);
4459 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4460 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4461 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4463 PSAM_DB_OBJECT AliasObject
;
4466 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4467 AliasHandle
, AliasInformationClass
, Buffer
);
4469 /* Validate the alias handle */
4470 Status
= SampValidateDbObject(AliasHandle
,
4472 ALIAS_READ_INFORMATION
,
4474 if (!NT_SUCCESS(Status
))
4477 switch (AliasInformationClass
)
4479 case AliasGeneralInformation
:
4480 Status
= SampQueryAliasGeneral(AliasObject
,
4484 case AliasNameInformation
:
4485 Status
= SampQueryAliasName(AliasObject
,
4489 case AliasAdminCommentInformation
:
4490 Status
= SampQueryAliasAdminComment(AliasObject
,
4495 Status
= STATUS_INVALID_INFO_CLASS
;
4506 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4507 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4508 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4510 PSAM_DB_OBJECT AliasObject
;
4513 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4514 AliasHandle
, AliasInformationClass
, Buffer
);
4516 /* Validate the alias handle */
4517 Status
= SampValidateDbObject(AliasHandle
,
4519 ALIAS_WRITE_ACCOUNT
,
4521 if (!NT_SUCCESS(Status
))
4524 switch (AliasInformationClass
)
4526 case AliasNameInformation
:
4527 Status
= SampSetObjectAttribute(AliasObject
,
4530 Buffer
->Name
.Name
.Buffer
,
4531 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4534 case AliasAdminCommentInformation
:
4535 Status
= SampSetObjectAttribute(AliasObject
,
4538 Buffer
->AdminComment
.AdminComment
.Buffer
,
4539 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4543 Status
= STATUS_INVALID_INFO_CLASS
;
4554 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4556 PSAM_DB_OBJECT AliasObject
;
4559 /* Validate the alias handle */
4560 Status
= SampValidateDbObject(AliasHandle
,
4564 if (!NT_SUCCESS(Status
))
4566 TRACE("failed with status 0x%08lx\n", Status
);
4570 /* Fail, if the alias is built-in */
4571 if (AliasObject
->RelativeId
< 1000)
4573 TRACE("You can not delete a special account!\n");
4574 return STATUS_SPECIAL_ACCOUNT
;
4577 /* FIXME: Remove all members from the alias */
4579 /* Delete the alias from the database */
4580 Status
= SampDeleteAccountDbObject(AliasObject
);
4581 if (!NT_SUCCESS(Status
))
4583 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4587 /* Invalidate the handle */
4588 *AliasHandle
= NULL
;
4597 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4598 IN PRPC_SID MemberId
)
4600 PSAM_DB_OBJECT AliasObject
;
4601 LPWSTR MemberIdString
= NULL
;
4602 HANDLE MembersKeyHandle
= NULL
;
4603 HANDLE MemberKeyHandle
= NULL
;
4604 ULONG MemberIdLength
;
4607 TRACE("SamrAddMemberToAlias(%p %p)\n",
4608 AliasHandle
, MemberId
);
4610 /* Validate the alias handle */
4611 Status
= SampValidateDbObject(AliasHandle
,
4615 if (!NT_SUCCESS(Status
))
4617 TRACE("failed with status 0x%08lx\n", Status
);
4621 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4622 TRACE("Member SID: %S\n", MemberIdString
);
4624 MemberIdLength
= RtlLengthSid(MemberId
);
4626 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4630 if (!NT_SUCCESS(Status
))
4632 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4636 Status
= SampRegSetValue(MembersKeyHandle
,
4641 if (!NT_SUCCESS(Status
))
4643 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4647 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4651 if (!NT_SUCCESS(Status
))
4653 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4657 Status
= SampRegSetValue(MemberKeyHandle
,
4662 if (!NT_SUCCESS(Status
))
4664 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4669 if (MemberKeyHandle
!= NULL
)
4670 SampRegCloseKey(MemberKeyHandle
);
4672 if (MembersKeyHandle
!= NULL
)
4673 SampRegCloseKey(MembersKeyHandle
);
4675 if (MemberIdString
!= NULL
)
4676 LocalFree(MemberIdString
);
4685 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4686 IN PRPC_SID MemberId
)
4688 PSAM_DB_OBJECT AliasObject
;
4689 LPWSTR MemberIdString
= NULL
;
4690 HANDLE MembersKeyHandle
= NULL
;
4691 HANDLE MemberKeyHandle
= NULL
;
4695 TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
4696 AliasHandle
, MemberId
);
4698 /* Validate the alias handle */
4699 Status
= SampValidateDbObject(AliasHandle
,
4701 ALIAS_REMOVE_MEMBER
,
4703 if (!NT_SUCCESS(Status
))
4705 TRACE("failed with status 0x%08lx\n", Status
);
4709 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4710 TRACE("Member SID: %S\n", MemberIdString
);
4712 Status
= SampRegOpenKey(AliasObject
->MembersKeyHandle
,
4714 KEY_WRITE
| KEY_QUERY_VALUE
,
4716 if (!NT_SUCCESS(Status
))
4718 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4722 Status
= SampRegDeleteValue(MemberKeyHandle
,
4724 if (!NT_SUCCESS(Status
))
4726 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4730 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
4733 if (!NT_SUCCESS(Status
))
4735 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4739 if (ulValueCount
== 0)
4741 SampRegCloseKey(MemberKeyHandle
);
4742 MemberKeyHandle
= NULL
;
4744 Status
= SampRegDeleteKey(AliasObject
->MembersKeyHandle
,
4746 if (!NT_SUCCESS(Status
))
4748 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4753 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4755 KEY_WRITE
| KEY_QUERY_VALUE
,
4757 if (!NT_SUCCESS(Status
))
4759 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4763 Status
= SampRegDeleteValue(MembersKeyHandle
,
4765 if (!NT_SUCCESS(Status
))
4767 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4771 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4774 if (!NT_SUCCESS(Status
))
4776 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4780 if (ulValueCount
== 0)
4782 SampRegCloseKey(MembersKeyHandle
);
4783 MembersKeyHandle
= NULL
;
4785 Status
= SampRegDeleteKey(AliasObject
->KeyHandle
,
4787 if (!NT_SUCCESS(Status
))
4789 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4795 if (MemberKeyHandle
!= NULL
)
4796 SampRegCloseKey(MemberKeyHandle
);
4798 if (MembersKeyHandle
!= NULL
)
4799 SampRegCloseKey(MembersKeyHandle
);
4801 if (MemberIdString
!= NULL
)
4802 LocalFree(MemberIdString
);
4811 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4812 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4814 PSAM_DB_OBJECT AliasObject
;
4815 HANDLE MembersKeyHandle
= NULL
;
4816 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4817 ULONG ValueCount
= 0;
4822 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4823 AliasHandle
, Members
);
4825 /* Validate the alias handle */
4826 Status
= SampValidateDbObject(AliasHandle
,
4830 if (!NT_SUCCESS(Status
))
4832 ERR("failed with status 0x%08lx\n", Status
);
4836 /* Open the members key of the alias objct */
4837 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4841 if (!NT_SUCCESS(Status
))
4843 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4847 /* Get the number of members */
4848 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4851 if (!NT_SUCCESS(Status
))
4853 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4857 /* Allocate the member array */
4858 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4859 if (MemberArray
== NULL
)
4861 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4865 /* Enumerate the members */
4869 /* Get the size of the next SID */
4871 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4878 if (!NT_SUCCESS(Status
))
4880 if (Status
== STATUS_NO_MORE_ENTRIES
)
4881 Status
= STATUS_SUCCESS
;
4885 /* Allocate a buffer for the SID */
4886 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4887 if (MemberArray
[Index
].SidPointer
== NULL
)
4889 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4893 /* Read the SID into the buffer */
4894 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4899 (PVOID
)MemberArray
[Index
].SidPointer
,
4901 if (!NT_SUCCESS(Status
))
4909 /* Return the number of members and the member array */
4910 if (NT_SUCCESS(Status
))
4912 Members
->Count
= ValueCount
;
4913 Members
->Sids
= MemberArray
;
4917 /* Clean up the members array and the SID buffers if something failed */
4918 if (!NT_SUCCESS(Status
))
4920 if (MemberArray
!= NULL
)
4922 for (Index
= 0; Index
< ValueCount
; Index
++)
4924 if (MemberArray
[Index
].SidPointer
!= NULL
)
4925 midl_user_free(MemberArray
[Index
].SidPointer
);
4928 midl_user_free(MemberArray
);
4932 /* Close the members key */
4933 if (MembersKeyHandle
!= NULL
)
4934 SampRegCloseKey(MembersKeyHandle
);
4943 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
4944 IN ACCESS_MASK DesiredAccess
,
4945 IN
unsigned long UserId
,
4946 OUT SAMPR_HANDLE
*UserHandle
)
4948 PSAM_DB_OBJECT DomainObject
;
4949 PSAM_DB_OBJECT UserObject
;
4953 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
4954 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
4956 /* Map generic access rights */
4957 RtlMapGenericMask(&DesiredAccess
,
4960 /* Validate the domain handle */
4961 Status
= SampValidateDbObject(DomainHandle
,
4965 if (!NT_SUCCESS(Status
))
4967 TRACE("failed with status 0x%08lx\n", Status
);
4971 /* Convert the RID into a string (hex) */
4972 swprintf(szRid
, L
"%08lX", UserId
);
4974 /* Create the user object */
4975 Status
= SampOpenDbObject(DomainObject
,
4982 if (!NT_SUCCESS(Status
))
4984 TRACE("failed with status 0x%08lx\n", Status
);
4988 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
4990 return STATUS_SUCCESS
;
4997 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
4999 PSAM_DB_OBJECT UserObject
;
5002 TRACE("(%p)\n", UserHandle
);
5004 /* Validate the user handle */
5005 Status
= SampValidateDbObject(*UserHandle
,
5009 if (!NT_SUCCESS(Status
))
5011 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
5015 /* Fail, if the user is built-in */
5016 if (UserObject
->RelativeId
< 1000)
5018 TRACE("You can not delete a special account!\n");
5019 return STATUS_SPECIAL_ACCOUNT
;
5022 /* FIXME: Remove the user from all groups */
5024 /* FIXME: Remove the user from all aliases */
5026 /* Delete the user from the database */
5027 Status
= SampDeleteAccountDbObject(UserObject
);
5028 if (!NT_SUCCESS(Status
))
5030 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5034 /* Invalidate the handle */
5037 return STATUS_SUCCESS
;
5043 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
5044 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5046 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5047 SAM_USER_FIXED_DATA FixedData
;
5053 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5054 if (InfoBuffer
== NULL
)
5055 return STATUS_INSUFFICIENT_RESOURCES
;
5057 Length
= sizeof(SAM_USER_FIXED_DATA
);
5058 Status
= SampGetObjectAttribute(UserObject
,
5063 if (!NT_SUCCESS(Status
))
5066 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5068 /* Get the Name string */
5069 Status
= SampGetObjectAttributeString(UserObject
,
5071 &InfoBuffer
->General
.UserName
);
5072 if (!NT_SUCCESS(Status
))
5074 TRACE("Status 0x%08lx\n", Status
);
5078 /* Get the FullName string */
5079 Status
= SampGetObjectAttributeString(UserObject
,
5081 &InfoBuffer
->General
.FullName
);
5082 if (!NT_SUCCESS(Status
))
5084 TRACE("Status 0x%08lx\n", Status
);
5088 /* Get the AdminComment string */
5089 Status
= SampGetObjectAttributeString(UserObject
,
5091 &InfoBuffer
->General
.AdminComment
);
5092 if (!NT_SUCCESS(Status
))
5094 TRACE("Status 0x%08lx\n", Status
);
5098 /* Get the UserComment string */
5099 Status
= SampGetObjectAttributeString(UserObject
,
5101 &InfoBuffer
->General
.UserComment
);
5102 if (!NT_SUCCESS(Status
))
5104 TRACE("Status 0x%08lx\n", Status
);
5108 *Buffer
= InfoBuffer
;
5111 if (!NT_SUCCESS(Status
))
5113 if (InfoBuffer
!= NULL
)
5115 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
5116 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
5118 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
5119 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
5121 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
5122 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
5124 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
5125 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
5127 midl_user_free(InfoBuffer
);
5137 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
5138 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5140 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5141 SAM_USER_FIXED_DATA FixedData
;
5147 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5148 if (InfoBuffer
== NULL
)
5149 return STATUS_INSUFFICIENT_RESOURCES
;
5151 Length
= sizeof(SAM_USER_FIXED_DATA
);
5152 Status
= SampGetObjectAttribute(UserObject
,
5157 if (!NT_SUCCESS(Status
))
5160 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
5161 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
5163 /* Get the UserComment string */
5164 Status
= SampGetObjectAttributeString(UserObject
,
5166 &InfoBuffer
->Preferences
.UserComment
);
5167 if (!NT_SUCCESS(Status
))
5169 TRACE("Status 0x%08lx\n", Status
);
5173 *Buffer
= InfoBuffer
;
5176 if (!NT_SUCCESS(Status
))
5178 if (InfoBuffer
!= NULL
)
5180 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
5181 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
5183 midl_user_free(InfoBuffer
);
5193 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
5194 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5196 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5197 SAM_USER_FIXED_DATA FixedData
;
5203 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5204 if (InfoBuffer
== NULL
)
5205 return STATUS_INSUFFICIENT_RESOURCES
;
5207 Length
= sizeof(SAM_USER_FIXED_DATA
);
5208 Status
= SampGetObjectAttribute(UserObject
,
5213 if (!NT_SUCCESS(Status
))
5216 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
5217 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5218 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5219 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5220 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5221 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5222 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5223 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5224 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5225 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
5226 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
5228 // OLD_LARGE_INTEGER PasswordCanChange;
5229 // OLD_LARGE_INTEGER PasswordMustChange;
5231 /* Get the Name string */
5232 Status
= SampGetObjectAttributeString(UserObject
,
5234 &InfoBuffer
->Logon
.UserName
);
5235 if (!NT_SUCCESS(Status
))
5237 TRACE("Status 0x%08lx\n", Status
);
5241 /* Get the FullName string */
5242 Status
= SampGetObjectAttributeString(UserObject
,
5244 &InfoBuffer
->Logon
.FullName
);
5245 if (!NT_SUCCESS(Status
))
5247 TRACE("Status 0x%08lx\n", Status
);
5251 /* Get the HomeDirectory string */
5252 Status
= SampGetObjectAttributeString(UserObject
,
5254 &InfoBuffer
->Logon
.HomeDirectory
);
5255 if (!NT_SUCCESS(Status
))
5257 TRACE("Status 0x%08lx\n", Status
);
5261 /* Get the HomeDirectoryDrive string */
5262 Status
= SampGetObjectAttributeString(UserObject
,
5263 L
"HomeDirectoryDrive",
5264 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
5265 if (!NT_SUCCESS(Status
))
5267 TRACE("Status 0x%08lx\n", Status
);
5271 /* Get the ScriptPath string */
5272 Status
= SampGetObjectAttributeString(UserObject
,
5274 &InfoBuffer
->Logon
.ScriptPath
);
5275 if (!NT_SUCCESS(Status
))
5277 TRACE("Status 0x%08lx\n", Status
);
5281 /* Get the ProfilePath string */
5282 Status
= SampGetObjectAttributeString(UserObject
,
5284 &InfoBuffer
->Logon
.ProfilePath
);
5285 if (!NT_SUCCESS(Status
))
5287 TRACE("Status 0x%08lx\n", Status
);
5291 /* Get the WorkStations string */
5292 Status
= SampGetObjectAttributeString(UserObject
,
5294 &InfoBuffer
->Logon
.WorkStations
);
5295 if (!NT_SUCCESS(Status
))
5297 TRACE("Status 0x%08lx\n", Status
);
5301 /* FIXME: LogonHours */
5303 *Buffer
= InfoBuffer
;
5306 if (!NT_SUCCESS(Status
))
5308 if (InfoBuffer
!= NULL
)
5310 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
5311 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
5313 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
5314 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
5316 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
5317 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5319 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5320 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5322 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5323 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5325 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5326 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5328 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5329 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5331 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5332 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5334 midl_user_free(InfoBuffer
);
5344 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5345 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5347 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5348 SAM_USER_FIXED_DATA FixedData
;
5354 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5355 if (InfoBuffer
== NULL
)
5356 return STATUS_INSUFFICIENT_RESOURCES
;
5358 Length
= sizeof(SAM_USER_FIXED_DATA
);
5359 Status
= SampGetObjectAttribute(UserObject
,
5364 if (!NT_SUCCESS(Status
))
5367 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5368 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5369 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5370 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5371 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5372 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5373 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5374 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5375 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5376 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5377 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5378 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
5379 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
5381 /* Get the Name string */
5382 Status
= SampGetObjectAttributeString(UserObject
,
5384 &InfoBuffer
->Account
.UserName
);
5385 if (!NT_SUCCESS(Status
))
5387 TRACE("Status 0x%08lx\n", Status
);
5391 /* Get the FullName string */
5392 Status
= SampGetObjectAttributeString(UserObject
,
5394 &InfoBuffer
->Account
.FullName
);
5395 if (!NT_SUCCESS(Status
))
5397 TRACE("Status 0x%08lx\n", Status
);
5401 /* Get the HomeDirectory string */
5402 Status
= SampGetObjectAttributeString(UserObject
,
5404 &InfoBuffer
->Account
.HomeDirectory
);
5405 if (!NT_SUCCESS(Status
))
5407 TRACE("Status 0x%08lx\n", Status
);
5411 /* Get the HomeDirectoryDrive string */
5412 Status
= SampGetObjectAttributeString(UserObject
,
5413 L
"HomeDirectoryDrive",
5414 &InfoBuffer
->Account
.HomeDirectoryDrive
);
5415 if (!NT_SUCCESS(Status
))
5417 TRACE("Status 0x%08lx\n", Status
);
5421 /* Get the ScriptPath string */
5422 Status
= SampGetObjectAttributeString(UserObject
,
5424 &InfoBuffer
->Account
.ScriptPath
);
5425 if (!NT_SUCCESS(Status
))
5427 TRACE("Status 0x%08lx\n", Status
);
5431 /* Get the ProfilePath string */
5432 Status
= SampGetObjectAttributeString(UserObject
,
5434 &InfoBuffer
->Account
.ProfilePath
);
5435 if (!NT_SUCCESS(Status
))
5437 TRACE("Status 0x%08lx\n", Status
);
5441 /* Get the AdminComment string */
5442 Status
= SampGetObjectAttributeString(UserObject
,
5444 &InfoBuffer
->Account
.AdminComment
);
5445 if (!NT_SUCCESS(Status
))
5447 TRACE("Status 0x%08lx\n", Status
);
5451 /* Get the WorkStations string */
5452 Status
= SampGetObjectAttributeString(UserObject
,
5454 &InfoBuffer
->Account
.WorkStations
);
5455 if (!NT_SUCCESS(Status
))
5457 TRACE("Status 0x%08lx\n", Status
);
5461 /* FIXME: LogonHours */
5463 *Buffer
= InfoBuffer
;
5466 if (!NT_SUCCESS(Status
))
5468 if (InfoBuffer
!= NULL
)
5470 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5471 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5473 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5474 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5476 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5477 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5479 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5480 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5482 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5483 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5485 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5486 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5488 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5489 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5491 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5492 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5494 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5495 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5497 midl_user_free(InfoBuffer
);
5504 /* FIXME: SampQueryUserLogonHours */
5508 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
5509 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5511 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5516 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5517 if (InfoBuffer
== NULL
)
5518 return STATUS_INSUFFICIENT_RESOURCES
;
5520 /* Get the Name string */
5521 Status
= SampGetObjectAttributeString(UserObject
,
5523 &InfoBuffer
->Name
.UserName
);
5524 if (!NT_SUCCESS(Status
))
5526 TRACE("Status 0x%08lx\n", Status
);
5530 /* Get the FullName string */
5531 Status
= SampGetObjectAttributeString(UserObject
,
5533 &InfoBuffer
->Name
.FullName
);
5534 if (!NT_SUCCESS(Status
))
5536 TRACE("Status 0x%08lx\n", Status
);
5540 *Buffer
= InfoBuffer
;
5543 if (!NT_SUCCESS(Status
))
5545 if (InfoBuffer
!= NULL
)
5547 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5548 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5550 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5551 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5553 midl_user_free(InfoBuffer
);
5562 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5563 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5565 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5570 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5571 if (InfoBuffer
== NULL
)
5572 return STATUS_INSUFFICIENT_RESOURCES
;
5574 /* Get the Name string */
5575 Status
= SampGetObjectAttributeString(UserObject
,
5577 &InfoBuffer
->AccountName
.UserName
);
5578 if (!NT_SUCCESS(Status
))
5580 TRACE("Status 0x%08lx\n", Status
);
5584 *Buffer
= InfoBuffer
;
5587 if (!NT_SUCCESS(Status
))
5589 if (InfoBuffer
!= NULL
)
5591 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5592 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5594 midl_user_free(InfoBuffer
);
5603 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5604 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5606 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5611 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5612 if (InfoBuffer
== NULL
)
5613 return STATUS_INSUFFICIENT_RESOURCES
;
5615 /* Get the FullName string */
5616 Status
= SampGetObjectAttributeString(UserObject
,
5618 &InfoBuffer
->FullName
.FullName
);
5619 if (!NT_SUCCESS(Status
))
5621 TRACE("Status 0x%08lx\n", Status
);
5625 *Buffer
= InfoBuffer
;
5628 if (!NT_SUCCESS(Status
))
5630 if (InfoBuffer
!= NULL
)
5632 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
5633 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5635 midl_user_free(InfoBuffer
);
5645 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5646 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5648 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5649 SAM_USER_FIXED_DATA FixedData
;
5655 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5656 if (InfoBuffer
== NULL
)
5657 return STATUS_INSUFFICIENT_RESOURCES
;
5659 Length
= sizeof(SAM_USER_FIXED_DATA
);
5660 Status
= SampGetObjectAttribute(UserObject
,
5665 if (!NT_SUCCESS(Status
))
5668 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5670 *Buffer
= InfoBuffer
;
5673 if (!NT_SUCCESS(Status
))
5675 if (InfoBuffer
!= NULL
)
5677 midl_user_free(InfoBuffer
);
5686 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5687 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5689 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5694 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5695 if (InfoBuffer
== NULL
)
5696 return STATUS_INSUFFICIENT_RESOURCES
;
5698 /* Get the HomeDirectory string */
5699 Status
= SampGetObjectAttributeString(UserObject
,
5701 &InfoBuffer
->Home
.HomeDirectory
);
5702 if (!NT_SUCCESS(Status
))
5704 TRACE("Status 0x%08lx\n", Status
);
5708 /* Get the HomeDirectoryDrive string */
5709 Status
= SampGetObjectAttributeString(UserObject
,
5710 L
"HomeDirectoryDrive",
5711 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5712 if (!NT_SUCCESS(Status
))
5714 TRACE("Status 0x%08lx\n", Status
);
5718 *Buffer
= InfoBuffer
;
5721 if (!NT_SUCCESS(Status
))
5723 if (InfoBuffer
!= NULL
)
5725 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5726 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5728 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5729 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5731 midl_user_free(InfoBuffer
);
5740 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5741 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5743 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5748 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5749 if (InfoBuffer
== NULL
)
5750 return STATUS_INSUFFICIENT_RESOURCES
;
5752 /* Get the ScriptPath string */
5753 Status
= SampGetObjectAttributeString(UserObject
,
5755 &InfoBuffer
->Script
.ScriptPath
);
5756 if (!NT_SUCCESS(Status
))
5758 TRACE("Status 0x%08lx\n", Status
);
5762 *Buffer
= InfoBuffer
;
5765 if (!NT_SUCCESS(Status
))
5767 if (InfoBuffer
!= NULL
)
5769 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5770 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5772 midl_user_free(InfoBuffer
);
5781 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5782 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5784 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5789 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5790 if (InfoBuffer
== NULL
)
5791 return STATUS_INSUFFICIENT_RESOURCES
;
5793 /* Get the ProfilePath string */
5794 Status
= SampGetObjectAttributeString(UserObject
,
5796 &InfoBuffer
->Profile
.ProfilePath
);
5797 if (!NT_SUCCESS(Status
))
5799 TRACE("Status 0x%08lx\n", Status
);
5803 *Buffer
= InfoBuffer
;
5806 if (!NT_SUCCESS(Status
))
5808 if (InfoBuffer
!= NULL
)
5810 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
5811 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5813 midl_user_free(InfoBuffer
);
5822 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5823 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5825 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5830 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5831 if (InfoBuffer
== NULL
)
5832 return STATUS_INSUFFICIENT_RESOURCES
;
5834 /* Get the AdminComment string */
5835 Status
= SampGetObjectAttributeString(UserObject
,
5837 &InfoBuffer
->AdminComment
.AdminComment
);
5838 if (!NT_SUCCESS(Status
))
5840 TRACE("Status 0x%08lx\n", Status
);
5844 *Buffer
= InfoBuffer
;
5847 if (!NT_SUCCESS(Status
))
5849 if (InfoBuffer
!= NULL
)
5851 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5852 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5854 midl_user_free(InfoBuffer
);
5863 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5864 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5866 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5871 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5872 if (InfoBuffer
== NULL
)
5873 return STATUS_INSUFFICIENT_RESOURCES
;
5875 /* Get the WorkStations string */
5876 Status
= SampGetObjectAttributeString(UserObject
,
5878 &InfoBuffer
->WorkStations
.WorkStations
);
5879 if (!NT_SUCCESS(Status
))
5881 TRACE("Status 0x%08lx\n", Status
);
5885 *Buffer
= InfoBuffer
;
5888 if (!NT_SUCCESS(Status
))
5890 if (InfoBuffer
!= NULL
)
5892 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
5893 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
5895 midl_user_free(InfoBuffer
);
5905 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
5906 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5908 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5909 SAM_USER_FIXED_DATA FixedData
;
5915 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5916 if (InfoBuffer
== NULL
)
5917 return STATUS_INSUFFICIENT_RESOURCES
;
5919 Length
= sizeof(SAM_USER_FIXED_DATA
);
5920 Status
= SampGetObjectAttribute(UserObject
,
5925 if (!NT_SUCCESS(Status
))
5928 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
5930 *Buffer
= InfoBuffer
;
5933 if (!NT_SUCCESS(Status
))
5935 if (InfoBuffer
!= NULL
)
5937 midl_user_free(InfoBuffer
);
5947 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
5948 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5950 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5951 SAM_USER_FIXED_DATA FixedData
;
5957 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5958 if (InfoBuffer
== NULL
)
5959 return STATUS_INSUFFICIENT_RESOURCES
;
5961 Length
= sizeof(SAM_USER_FIXED_DATA
);
5962 Status
= SampGetObjectAttribute(UserObject
,
5967 if (!NT_SUCCESS(Status
))
5970 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5971 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5973 *Buffer
= InfoBuffer
;
5976 if (!NT_SUCCESS(Status
))
5978 if (InfoBuffer
!= NULL
)
5980 midl_user_free(InfoBuffer
);
5989 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
5990 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5992 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5997 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5998 if (InfoBuffer
== NULL
)
5999 return STATUS_INSUFFICIENT_RESOURCES
;
6001 /* Get the Parameters string */
6002 Status
= SampGetObjectAttributeString(UserObject
,
6004 &InfoBuffer
->Parameters
.Parameters
);
6005 if (!NT_SUCCESS(Status
))
6007 TRACE("Status 0x%08lx\n", Status
);
6011 *Buffer
= InfoBuffer
;
6014 if (!NT_SUCCESS(Status
))
6016 if (InfoBuffer
!= NULL
)
6018 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
6019 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
6021 midl_user_free(InfoBuffer
);
6032 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
6033 IN USER_INFORMATION_CLASS UserInformationClass
,
6034 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6036 PSAM_DB_OBJECT UserObject
;
6037 ACCESS_MASK DesiredAccess
;
6040 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
6041 UserHandle
, UserInformationClass
, Buffer
);
6043 switch (UserInformationClass
)
6045 case UserGeneralInformation
:
6046 case UserNameInformation
:
6047 case UserAccountNameInformation
:
6048 case UserFullNameInformation
:
6049 case UserPrimaryGroupInformation
:
6050 case UserAdminCommentInformation
:
6051 DesiredAccess
= USER_READ_GENERAL
;
6054 case UserLogonHoursInformation
:
6055 case UserHomeInformation
:
6056 case UserScriptInformation
:
6057 case UserProfileInformation
:
6058 case UserWorkStationsInformation
:
6059 DesiredAccess
= USER_READ_LOGON
;
6062 case UserControlInformation
:
6063 case UserExpiresInformation
:
6064 case UserParametersInformation
:
6065 DesiredAccess
= USER_READ_ACCOUNT
;
6068 case UserPreferencesInformation
:
6069 DesiredAccess
= USER_READ_GENERAL
|
6070 USER_READ_PREFERENCES
;
6073 case UserLogonInformation
:
6074 case UserAccountInformation
:
6075 DesiredAccess
= USER_READ_GENERAL
|
6076 USER_READ_PREFERENCES
|
6082 return STATUS_INVALID_INFO_CLASS
;
6085 /* Validate the domain handle */
6086 Status
= SampValidateDbObject(UserHandle
,
6090 if (!NT_SUCCESS(Status
))
6092 TRACE("failed with status 0x%08lx\n", Status
);
6096 switch (UserInformationClass
)
6098 case UserGeneralInformation
:
6099 Status
= SampQueryUserGeneral(UserObject
,
6103 case UserPreferencesInformation
:
6104 Status
= SampQueryUserPreferences(UserObject
,
6108 case UserLogonInformation
:
6109 Status
= SampQueryUserLogon(UserObject
,
6113 // case UserLogonHoursInformation:
6114 // Status = SampQueryUserLogonHours(UserObject,
6118 case UserAccountInformation
:
6119 Status
= SampQueryUserAccount(UserObject
,
6123 case UserNameInformation
:
6124 Status
= SampQueryUserName(UserObject
,
6128 case UserAccountNameInformation
:
6129 Status
= SampQueryUserAccountName(UserObject
,
6133 case UserFullNameInformation
:
6134 Status
= SampQueryUserFullName(UserObject
,
6138 case UserPrimaryGroupInformation
:
6139 Status
= SampQueryUserPrimaryGroup(UserObject
,
6143 case UserHomeInformation
:
6144 Status
= SampQueryUserHome(UserObject
,
6147 case UserScriptInformation
:
6148 Status
= SampQueryUserScript(UserObject
,
6152 case UserProfileInformation
:
6153 Status
= SampQueryUserProfile(UserObject
,
6157 case UserAdminCommentInformation
:
6158 Status
= SampQueryUserAdminComment(UserObject
,
6162 case UserWorkStationsInformation
:
6163 Status
= SampQueryUserWorkStations(UserObject
,
6167 case UserControlInformation
:
6168 Status
= SampQueryUserControl(UserObject
,
6172 case UserExpiresInformation
:
6173 Status
= SampQueryUserExpires(UserObject
,
6177 // case UserInternal1Information:
6179 case UserParametersInformation
:
6180 Status
= SampQueryUserParameters(UserObject
,
6184 // case UserAllInformation:
6185 // case UserInternal4Information:
6186 // case UserInternal5Information:
6187 // case UserInternal4InformationNew:
6188 // case UserInternal5InformationNew:
6191 Status
= STATUS_INVALID_INFO_CLASS
;
6199 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
6200 PSAMPR_USER_INFO_BUFFER Buffer
)
6202 SAM_USER_FIXED_DATA FixedData
;
6206 Length
= sizeof(SAM_USER_FIXED_DATA
);
6207 Status
= SampGetObjectAttribute(UserObject
,
6212 if (!NT_SUCCESS(Status
))
6215 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
6217 Status
= SampSetObjectAttribute(UserObject
,
6222 if (!NT_SUCCESS(Status
))
6225 Status
= SampSetObjectAttribute(UserObject
,
6228 Buffer
->General
.UserName
.Buffer
,
6229 Buffer
->General
.UserName
.MaximumLength
);
6230 if (!NT_SUCCESS(Status
))
6233 Status
= SampSetObjectAttribute(UserObject
,
6236 Buffer
->General
.FullName
.Buffer
,
6237 Buffer
->General
.FullName
.MaximumLength
);
6238 if (!NT_SUCCESS(Status
))
6241 Status
= SampSetObjectAttribute(UserObject
,
6244 Buffer
->General
.AdminComment
.Buffer
,
6245 Buffer
->General
.AdminComment
.MaximumLength
);
6246 if (!NT_SUCCESS(Status
))
6249 Status
= SampSetObjectAttribute(UserObject
,
6252 Buffer
->General
.UserComment
.Buffer
,
6253 Buffer
->General
.UserComment
.MaximumLength
);
6261 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
6262 PSAMPR_USER_INFO_BUFFER Buffer
)
6264 SAM_USER_FIXED_DATA FixedData
;
6268 Length
= sizeof(SAM_USER_FIXED_DATA
);
6269 Status
= SampGetObjectAttribute(UserObject
,
6274 if (!NT_SUCCESS(Status
))
6277 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6278 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6280 Status
= SampSetObjectAttribute(UserObject
,
6285 if (!NT_SUCCESS(Status
))
6288 Status
= SampSetObjectAttribute(UserObject
,
6291 Buffer
->Preferences
.UserComment
.Buffer
,
6292 Buffer
->Preferences
.UserComment
.MaximumLength
);
6300 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
6301 PSAMPR_USER_INFO_BUFFER Buffer
)
6303 SAM_USER_FIXED_DATA FixedData
;
6307 Length
= sizeof(SAM_USER_FIXED_DATA
);
6308 Status
= SampGetObjectAttribute(UserObject
,
6313 if (!NT_SUCCESS(Status
))
6316 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
6318 Status
= SampSetObjectAttribute(UserObject
,
6330 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
6331 PSAMPR_USER_INFO_BUFFER Buffer
)
6333 SAM_USER_FIXED_DATA FixedData
;
6337 Length
= sizeof(SAM_USER_FIXED_DATA
);
6338 Status
= SampGetObjectAttribute(UserObject
,
6343 if (!NT_SUCCESS(Status
))
6346 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
6348 Status
= SampSetObjectAttribute(UserObject
,
6360 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
6361 PSAMPR_USER_INFO_BUFFER Buffer
)
6363 SAM_USER_FIXED_DATA FixedData
;
6367 Length
= sizeof(SAM_USER_FIXED_DATA
);
6368 Status
= SampGetObjectAttribute(UserObject
,
6373 if (!NT_SUCCESS(Status
))
6376 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
6377 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
6379 Status
= SampSetObjectAttribute(UserObject
,
6391 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
6392 PSAMPR_USER_INFO_BUFFER Buffer
)
6394 SAM_USER_FIXED_DATA FixedData
;
6397 NTSTATUS Status
= STATUS_SUCCESS
;
6399 WhichFields
= Buffer
->All
.WhichFields
;
6401 if (WhichFields
& USER_ALL_USERNAME
)
6403 Status
= SampSetObjectAttribute(UserObject
,
6406 Buffer
->All
.UserName
.Buffer
,
6407 Buffer
->All
.UserName
.MaximumLength
);
6408 if (!NT_SUCCESS(Status
))
6412 if (WhichFields
& USER_ALL_FULLNAME
)
6414 Status
= SampSetObjectAttribute(UserObject
,
6417 Buffer
->All
.FullName
.Buffer
,
6418 Buffer
->All
.FullName
.MaximumLength
);
6419 if (!NT_SUCCESS(Status
))
6423 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
6425 Status
= SampSetObjectAttribute(UserObject
,
6428 Buffer
->All
.AdminComment
.Buffer
,
6429 Buffer
->All
.AdminComment
.MaximumLength
);
6430 if (!NT_SUCCESS(Status
))
6434 if (WhichFields
& USER_ALL_USERCOMMENT
)
6436 Status
= SampSetObjectAttribute(UserObject
,
6439 Buffer
->All
.UserComment
.Buffer
,
6440 Buffer
->All
.UserComment
.MaximumLength
);
6441 if (!NT_SUCCESS(Status
))
6445 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
6447 Status
= SampSetObjectAttribute(UserObject
,
6450 Buffer
->All
.HomeDirectory
.Buffer
,
6451 Buffer
->All
.HomeDirectory
.MaximumLength
);
6452 if (!NT_SUCCESS(Status
))
6456 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6458 Status
= SampSetObjectAttribute(UserObject
,
6459 L
"HomeDirectoryDrive",
6461 Buffer
->All
.HomeDirectoryDrive
.Buffer
,
6462 Buffer
->All
.HomeDirectoryDrive
.MaximumLength
);
6463 if (!NT_SUCCESS(Status
))
6467 if (WhichFields
& USER_ALL_SCRIPTPATH
)
6469 Status
= SampSetObjectAttribute(UserObject
,
6472 Buffer
->All
.ScriptPath
.Buffer
,
6473 Buffer
->All
.ScriptPath
.MaximumLength
);
6474 if (!NT_SUCCESS(Status
))
6478 if (WhichFields
& USER_ALL_PROFILEPATH
)
6480 Status
= SampSetObjectAttribute(UserObject
,
6483 Buffer
->All
.ProfilePath
.Buffer
,
6484 Buffer
->All
.ProfilePath
.MaximumLength
);
6485 if (!NT_SUCCESS(Status
))
6489 if (WhichFields
& USER_ALL_WORKSTATIONS
)
6491 Status
= SampSetObjectAttribute(UserObject
,
6494 Buffer
->All
.WorkStations
.Buffer
,
6495 Buffer
->All
.WorkStations
.MaximumLength
);
6496 if (!NT_SUCCESS(Status
))
6500 if (WhichFields
& USER_ALL_PARAMETERS
)
6502 Status
= SampSetObjectAttribute(UserObject
,
6505 Buffer
->All
.Parameters
.Buffer
,
6506 Buffer
->All
.Parameters
.MaximumLength
);
6509 if (WhichFields
& (USER_ALL_PRIMARYGROUPID
|
6510 USER_ALL_ACCOUNTEXPIRES
|
6511 USER_ALL_USERACCOUNTCONTROL
|
6512 USER_ALL_COUNTRYCODE
|
6515 Length
= sizeof(SAM_USER_FIXED_DATA
);
6516 Status
= SampGetObjectAttribute(UserObject
,
6521 if (!NT_SUCCESS(Status
))
6524 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
6525 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
6527 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
6529 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
6530 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
6533 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
6534 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
6536 if (WhichFields
& USER_ALL_COUNTRYCODE
)
6537 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6539 if (WhichFields
& USER_ALL_CODEPAGE
)
6540 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6542 Status
= SampSetObjectAttribute(UserObject
,
6547 if (!NT_SUCCESS(Status
))
6554 USER_ALL_NTPASSWORDPRESENT
6555 USER_ALL_LMPASSWORDPRESENT
6556 USER_ALL_PASSWORDEXPIRED
6568 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
6569 IN USER_INFORMATION_CLASS UserInformationClass
,
6570 IN PSAMPR_USER_INFO_BUFFER Buffer
)
6572 PSAM_DB_OBJECT UserObject
;
6573 ACCESS_MASK DesiredAccess
;
6576 TRACE("SamrSetInformationUser(%p %lu %p)\n",
6577 UserHandle
, UserInformationClass
, Buffer
);
6579 switch (UserInformationClass
)
6581 case UserLogonHoursInformation
:
6582 case UserNameInformation
:
6583 case UserAccountNameInformation
:
6584 case UserFullNameInformation
:
6585 case UserPrimaryGroupInformation
:
6586 case UserHomeInformation
:
6587 case UserScriptInformation
:
6588 case UserProfileInformation
:
6589 case UserAdminCommentInformation
:
6590 case UserWorkStationsInformation
:
6591 case UserControlInformation
:
6592 case UserExpiresInformation
:
6593 case UserParametersInformation
:
6594 DesiredAccess
= USER_WRITE_ACCOUNT
;
6597 case UserGeneralInformation
:
6598 DesiredAccess
= USER_WRITE_ACCOUNT
|
6599 USER_WRITE_PREFERENCES
;
6602 case UserPreferencesInformation
:
6603 DesiredAccess
= USER_WRITE_PREFERENCES
;
6606 case UserSetPasswordInformation
:
6607 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
6610 case UserAllInformation
:
6611 DesiredAccess
= 0; /* FIXME */
6615 return STATUS_INVALID_INFO_CLASS
;
6618 /* Validate the domain handle */
6619 Status
= SampValidateDbObject(UserHandle
,
6623 if (!NT_SUCCESS(Status
))
6625 TRACE("failed with status 0x%08lx\n", Status
);
6629 switch (UserInformationClass
)
6631 case UserGeneralInformation
:
6632 Status
= SampSetUserGeneral(UserObject
,
6636 case UserPreferencesInformation
:
6637 Status
= SampSetUserPreferences(UserObject
,
6641 case UserLogonHoursInformation:
6642 Status = SampSetUserLogonHours(UserObject,
6646 case UserNameInformation
:
6647 Status
= SampSetObjectAttribute(UserObject
,
6650 Buffer
->Name
.UserName
.Buffer
,
6651 Buffer
->Name
.UserName
.MaximumLength
);
6652 if (!NT_SUCCESS(Status
))
6655 Status
= SampSetObjectAttribute(UserObject
,
6658 Buffer
->Name
.FullName
.Buffer
,
6659 Buffer
->Name
.FullName
.MaximumLength
);
6662 case UserAccountNameInformation
:
6663 Status
= SampSetObjectAttribute(UserObject
,
6666 Buffer
->AccountName
.UserName
.Buffer
,
6667 Buffer
->AccountName
.UserName
.MaximumLength
);
6670 case UserFullNameInformation
:
6671 Status
= SampSetObjectAttribute(UserObject
,
6674 Buffer
->FullName
.FullName
.Buffer
,
6675 Buffer
->FullName
.FullName
.MaximumLength
);
6678 case UserPrimaryGroupInformation
:
6679 Status
= SampSetUserPrimaryGroup(UserObject
,
6683 case UserHomeInformation
:
6684 Status
= SampSetObjectAttribute(UserObject
,
6687 Buffer
->Home
.HomeDirectory
.Buffer
,
6688 Buffer
->Home
.HomeDirectory
.MaximumLength
);
6689 if (!NT_SUCCESS(Status
))
6692 Status
= SampSetObjectAttribute(UserObject
,
6693 L
"HomeDirectoryDrive",
6695 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
6696 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
6699 case UserScriptInformation
:
6700 Status
= SampSetObjectAttribute(UserObject
,
6703 Buffer
->Script
.ScriptPath
.Buffer
,
6704 Buffer
->Script
.ScriptPath
.MaximumLength
);
6707 case UserProfileInformation
:
6708 Status
= SampSetObjectAttribute(UserObject
,
6711 Buffer
->Profile
.ProfilePath
.Buffer
,
6712 Buffer
->Profile
.ProfilePath
.MaximumLength
);
6715 case UserAdminCommentInformation
:
6716 Status
= SampSetObjectAttribute(UserObject
,
6719 Buffer
->AdminComment
.AdminComment
.Buffer
,
6720 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
6723 case UserWorkStationsInformation
:
6724 Status
= SampSetObjectAttribute(UserObject
,
6727 Buffer
->WorkStations
.WorkStations
.Buffer
,
6728 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
6731 case UserSetPasswordInformation
:
6732 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
6733 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
6735 Status
= SampSetObjectAttribute(UserObject
,
6738 Buffer
->SetPassword
.Password
.Buffer
,
6739 Buffer
->SetPassword
.Password
.MaximumLength
);
6742 case UserControlInformation
:
6743 Status
= SampSetUserControl(UserObject
,
6747 case UserExpiresInformation
:
6748 Status
= SampSetUserExpires(UserObject
,
6752 // case UserInternal1Information:
6754 case UserParametersInformation
:
6755 Status
= SampSetObjectAttribute(UserObject
,
6758 Buffer
->Parameters
.Parameters
.Buffer
,
6759 Buffer
->Parameters
.Parameters
.MaximumLength
);
6762 case UserAllInformation
:
6763 Status
= SampSetUserAll(UserObject
,
6767 // case UserInternal4Information:
6768 // case UserInternal5Information:
6769 // case UserInternal4InformationNew:
6770 // case UserInternal5InformationNew:
6773 Status
= STATUS_INVALID_INFO_CLASS
;
6783 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
6784 IN
unsigned char LmPresent
,
6785 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
6786 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
6787 IN
unsigned char NtPresent
,
6788 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
6789 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
6790 IN
unsigned char NtCrossEncryptionPresent
,
6791 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
6792 IN
unsigned char LmCrossEncryptionPresent
,
6793 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
6796 return STATUS_NOT_IMPLEMENTED
;
6803 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
6804 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
6806 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
6807 PSAM_DB_OBJECT UserObject
;
6811 TRACE("SamrGetGroupsForUser(%p %p)\n",
6812 UserHandle
, Groups
);
6814 /* Validate the domain handle */
6815 Status
= SampValidateDbObject(UserHandle
,
6819 if (!NT_SUCCESS(Status
))
6821 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
6825 /* Allocate the groups buffer */
6826 GroupsBuffer
= midl_user_allocate(sizeof(SAMPR_GET_GROUPS_BUFFER
));
6827 if (GroupsBuffer
== NULL
)
6828 return STATUS_INSUFFICIENT_RESOURCES
;
6831 * Get the size of the Groups attribute.
6832 * Do not check the status code because in case of an error
6833 * Length will be 0. And that is all we need.
6835 SampGetObjectAttribute(UserObject
,
6841 /* If there is no Groups attribute, return a groups buffer without an array */
6844 GroupsBuffer
->MembershipCount
= 0;
6845 GroupsBuffer
->Groups
= NULL
;
6847 *Groups
= GroupsBuffer
;
6849 return STATUS_SUCCESS
;
6852 /* Allocate a buffer for the Groups attribute */
6853 GroupsBuffer
->Groups
= midl_user_allocate(Length
);
6854 if (GroupsBuffer
->Groups
== NULL
)
6856 Status
= STATUS_INSUFFICIENT_RESOURCES
;
6860 /* Retrieve the Grous attribute */
6861 Status
= SampGetObjectAttribute(UserObject
,
6864 GroupsBuffer
->Groups
,
6866 if (!NT_SUCCESS(Status
))
6868 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
6872 /* Calculate the membership count */
6873 GroupsBuffer
->MembershipCount
= Length
/ sizeof(GROUP_MEMBERSHIP
);
6875 /* Return the groups buffer to the caller */
6876 *Groups
= GroupsBuffer
;
6879 if (!NT_SUCCESS(Status
))
6881 if (GroupsBuffer
!= NULL
)
6883 if (GroupsBuffer
->Groups
!= NULL
)
6884 midl_user_free(GroupsBuffer
->Groups
);
6886 midl_user_free(GroupsBuffer
);
6897 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
6898 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6899 IN
unsigned long Index
,
6900 IN
unsigned long EntryCount
,
6901 IN
unsigned long PreferredMaximumLength
,
6902 OUT
unsigned long *TotalAvailable
,
6903 OUT
unsigned long *TotalReturned
,
6904 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6907 return STATUS_NOT_IMPLEMENTED
;
6913 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
6914 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6915 IN PRPC_UNICODE_STRING Prefix
,
6916 OUT
unsigned long *Index
)
6919 return STATUS_NOT_IMPLEMENTED
;
6925 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
6928 return STATUS_NOT_IMPLEMENTED
;
6934 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
6937 return STATUS_NOT_IMPLEMENTED
;
6943 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
6944 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6947 return STATUS_NOT_IMPLEMENTED
;
6953 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
6954 IN PRPC_SID MemberSid
)
6957 return STATUS_NOT_IMPLEMENTED
;
6963 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
6964 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
6965 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
6968 return STATUS_NOT_IMPLEMENTED
;
6974 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
6975 IN USER_INFORMATION_CLASS UserInformationClass
,
6976 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6979 return STATUS_NOT_IMPLEMENTED
;
6985 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
6986 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6987 IN
unsigned long Index
,
6988 IN
unsigned long EntryCount
,
6989 IN
unsigned long PreferredMaximumLength
,
6990 OUT
unsigned long *TotalAvailable
,
6991 OUT
unsigned long *TotalReturned
,
6992 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6995 return STATUS_NOT_IMPLEMENTED
;
7001 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
7002 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7003 IN PRPC_UNICODE_STRING Prefix
,
7004 OUT
unsigned long *Index
)
7007 return STATUS_NOT_IMPLEMENTED
;
7014 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
7015 IN PRPC_UNICODE_STRING Name
,
7016 IN
unsigned long AccountType
,
7017 IN ACCESS_MASK DesiredAccess
,
7018 OUT SAMPR_HANDLE
*UserHandle
,
7019 OUT
unsigned long *GrantedAccess
,
7020 OUT
unsigned long *RelativeId
)
7022 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
7023 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
7024 SAM_USER_FIXED_DATA FixedUserData
;
7025 PSAM_DB_OBJECT DomainObject
;
7026 PSAM_DB_OBJECT UserObject
;
7032 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
7033 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
7036 Name
->Length
== 0 ||
7037 Name
->Buffer
== NULL
||
7038 UserHandle
== NULL
||
7040 return STATUS_INVALID_PARAMETER
;
7042 /* Check for valid account type */
7043 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
7044 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
7045 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
7046 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
7047 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
7048 return STATUS_INVALID_PARAMETER
;
7050 /* Map generic access rights */
7051 RtlMapGenericMask(&DesiredAccess
,
7054 /* Validate the domain handle */
7055 Status
= SampValidateDbObject(DomainHandle
,
7059 if (!NT_SUCCESS(Status
))
7061 TRACE("failed with status 0x%08lx\n", Status
);
7065 /* Check if the user name already exists in the domain */
7066 Status
= SampCheckAccountNameInDomain(DomainObject
,
7068 if (!NT_SUCCESS(Status
))
7070 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
7071 Name
->Buffer
, Status
);
7075 /* Get the fixed domain attributes */
7076 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
7077 Status
= SampGetObjectAttribute(DomainObject
,
7080 (PVOID
)&FixedDomainData
,
7082 if (!NT_SUCCESS(Status
))
7084 TRACE("failed with status 0x%08lx\n", Status
);
7088 /* Increment the NextRid attribute */
7089 ulRid
= FixedDomainData
.NextRid
;
7090 FixedDomainData
.NextRid
++;
7092 /* Store the fixed domain attributes */
7093 Status
= SampSetObjectAttribute(DomainObject
,
7098 if (!NT_SUCCESS(Status
))
7100 TRACE("failed with status 0x%08lx\n", Status
);
7104 TRACE("RID: %lx\n", ulRid
);
7106 /* Convert the RID into a string (hex) */
7107 swprintf(szRid
, L
"%08lX", ulRid
);
7109 /* Create the user object */
7110 Status
= SampCreateDbObject(DomainObject
,
7117 if (!NT_SUCCESS(Status
))
7119 TRACE("failed with status 0x%08lx\n", Status
);
7123 /* Add the account name for the user object */
7124 Status
= SampSetAccountNameInDomain(DomainObject
,
7128 if (!NT_SUCCESS(Status
))
7130 TRACE("failed with status 0x%08lx\n", Status
);
7134 /* Initialize fixed user data */
7135 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
7136 FixedUserData
.Version
= 1;
7137 FixedUserData
.LastLogon
.QuadPart
= 0;
7138 FixedUserData
.LastLogoff
.QuadPart
= 0;
7139 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
7140 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
7141 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
7142 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
7143 FixedUserData
.UserId
= ulRid
;
7144 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
7145 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
7146 USER_PASSWORD_NOT_REQUIRED
|
7149 /* Set fixed user data attribute */
7150 Status
= SampSetObjectAttribute(UserObject
,
7153 (LPVOID
)&FixedUserData
,
7154 sizeof(SAM_USER_FIXED_DATA
));
7155 if (!NT_SUCCESS(Status
))
7157 TRACE("failed with status 0x%08lx\n", Status
);
7161 /* Set the Name attribute */
7162 Status
= SampSetObjectAttribute(UserObject
,
7165 (LPVOID
)Name
->Buffer
,
7166 Name
->MaximumLength
);
7167 if (!NT_SUCCESS(Status
))
7169 TRACE("failed with status 0x%08lx\n", Status
);
7173 /* Set the FullName attribute */
7174 Status
= SampSetObjectAttribute(UserObject
,
7178 EmptyString
.MaximumLength
);
7179 if (!NT_SUCCESS(Status
))
7181 TRACE("failed with status 0x%08lx\n", Status
);
7185 /* Set the HomeDirectory attribute */
7186 Status
= SampSetObjectAttribute(UserObject
,
7190 EmptyString
.MaximumLength
);
7191 if (!NT_SUCCESS(Status
))
7193 TRACE("failed with status 0x%08lx\n", Status
);
7197 /* Set the HomeDirectoryDrive attribute */
7198 Status
= SampSetObjectAttribute(UserObject
,
7199 L
"HomeDirectoryDrive",
7202 EmptyString
.MaximumLength
);
7203 if (!NT_SUCCESS(Status
))
7205 TRACE("failed with status 0x%08lx\n", Status
);
7209 /* Set the ScriptPath attribute */
7210 Status
= SampSetObjectAttribute(UserObject
,
7214 EmptyString
.MaximumLength
);
7215 if (!NT_SUCCESS(Status
))
7217 TRACE("failed with status 0x%08lx\n", Status
);
7221 /* Set the ProfilePath attribute */
7222 Status
= SampSetObjectAttribute(UserObject
,
7226 EmptyString
.MaximumLength
);
7227 if (!NT_SUCCESS(Status
))
7229 TRACE("failed with status 0x%08lx\n", Status
);
7233 /* Set the AdminComment attribute */
7234 Status
= SampSetObjectAttribute(UserObject
,
7238 EmptyString
.MaximumLength
);
7239 if (!NT_SUCCESS(Status
))
7241 TRACE("failed with status 0x%08lx\n", Status
);
7245 /* Set the UserComment attribute */
7246 Status
= SampSetObjectAttribute(UserObject
,
7250 EmptyString
.MaximumLength
);
7251 if (!NT_SUCCESS(Status
))
7253 TRACE("failed with status 0x%08lx\n", Status
);
7257 /* Set the WorkStations attribute */
7258 Status
= SampSetObjectAttribute(UserObject
,
7262 EmptyString
.MaximumLength
);
7263 if (!NT_SUCCESS(Status
))
7265 TRACE("failed with status 0x%08lx\n", Status
);
7269 /* FIXME: Set default user attributes */
7271 if (NT_SUCCESS(Status
))
7273 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
7274 *RelativeId
= ulRid
;
7275 *GrantedAccess
= UserObject
->Access
;
7278 TRACE("returns with status 0x%08lx\n", Status
);
7287 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
7288 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7289 IN
unsigned long Index
,
7290 IN
unsigned long EntryCount
,
7291 IN
unsigned long PreferredMaximumLength
,
7292 OUT
unsigned long *TotalAvailable
,
7293 OUT
unsigned long *TotalReturned
,
7294 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7297 return STATUS_NOT_IMPLEMENTED
;
7304 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
7305 IN PSAMPR_PSID_ARRAY MembersBuffer
)
7308 NTSTATUS Status
= STATUS_SUCCESS
;
7310 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
7311 AliasHandle
, MembersBuffer
);
7313 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
7315 Status
= SamrAddMemberToAlias(AliasHandle
,
7316 ((PSID
*)MembersBuffer
->Sids
)[i
]);
7318 if (Status
== STATUS_MEMBER_IN_ALIAS
)
7319 Status
= STATUS_SUCCESS
;
7321 if (!NT_SUCCESS(Status
))
7332 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
7333 IN PSAMPR_PSID_ARRAY MembersBuffer
)
7336 NTSTATUS Status
= STATUS_SUCCESS
;
7338 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
7339 AliasHandle
, MembersBuffer
);
7341 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
7343 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
7344 ((PSID
*)MembersBuffer
->Sids
)[i
]);
7346 if (Status
== STATUS_MEMBER_IN_ALIAS
)
7347 Status
= STATUS_SUCCESS
;
7349 if (!NT_SUCCESS(Status
))
7360 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
7361 IN PRPC_STRING ServerName
,
7362 IN PRPC_STRING UserName
,
7363 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
7364 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
7367 return STATUS_NOT_IMPLEMENTED
;
7373 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
7374 IN PRPC_UNICODE_STRING ServerName
,
7375 IN PRPC_UNICODE_STRING UserName
,
7376 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
7377 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
7378 IN
unsigned char LmPresent
,
7379 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
7380 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
7383 return STATUS_NOT_IMPLEMENTED
;
7389 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
7390 IN PRPC_UNICODE_STRING Unused
,
7391 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
7394 return STATUS_NOT_IMPLEMENTED
;
7400 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
7401 OUT SAMPR_HANDLE
*ServerHandle
,
7402 IN ACCESS_MASK DesiredAccess
)
7405 return STATUS_NOT_IMPLEMENTED
;
7412 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
7413 IN USER_INFORMATION_CLASS UserInformationClass
,
7414 IN PSAMPR_USER_INFO_BUFFER Buffer
)
7416 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
7418 return SamrSetInformationUser(UserHandle
,
7419 UserInformationClass
,
7427 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7430 return STATUS_NOT_IMPLEMENTED
;
7436 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7439 return STATUS_NOT_IMPLEMENTED
;
7445 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
7448 return STATUS_NOT_IMPLEMENTED
;
7454 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
7455 OUT SAMPR_HANDLE
*ServerHandle
,
7456 IN
unsigned long ClientRevision
,
7457 IN ACCESS_MASK DesiredAccess
)
7460 return STATUS_NOT_IMPLEMENTED
;
7466 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
7469 return STATUS_NOT_IMPLEMENTED
;
7475 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
7476 IN ACCESS_MASK DesiredAccess
,
7477 IN
unsigned long InVersion
,
7478 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
7479 OUT
unsigned long *OutVersion
,
7480 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
7481 OUT SAMPR_HANDLE
*ServerHandle
)
7484 return STATUS_NOT_IMPLEMENTED
;
7490 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
7491 IN
unsigned long Rid
,
7495 return STATUS_NOT_IMPLEMENTED
;
7501 SamrSetDSRMPassword(IN handle_t BindingHandle
,
7502 IN PRPC_UNICODE_STRING Unused
,
7503 IN
unsigned long UserId
,
7504 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
7507 return STATUS_NOT_IMPLEMENTED
;
7513 SamrValidatePassword(IN handle_t Handle
,
7514 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
7515 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
7516 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
7519 return STATUS_NOT_IMPLEMENTED
;