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
=
60 PGENERIC_MAPPING pServerMapping
= &ServerMapping
;
63 /* FUNCTIONS *****************************************************************/
67 SampAddRelativeTimeToTime(IN LARGE_INTEGER AbsoluteTime
,
68 IN LARGE_INTEGER RelativeTime
)
70 LARGE_INTEGER NewTime
;
72 NewTime
.QuadPart
= AbsoluteTime
.QuadPart
- RelativeTime
.QuadPart
;
74 if (NewTime
.QuadPart
< 0)
82 SampStartRpcServer(VOID
)
86 TRACE("SampStartRpcServer() called\n");
88 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
92 if (Status
!= RPC_S_OK
)
94 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
98 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
101 if (Status
!= RPC_S_OK
)
103 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
107 Status
= RpcServerListen(1, 20, TRUE
);
108 if (Status
!= RPC_S_OK
)
110 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
114 TRACE("SampStartRpcServer() done\n");
118 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
120 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
124 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
126 HeapFree(GetProcessHeap(), 0, ptr
);
130 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
138 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
139 OUT SAMPR_HANDLE
*ServerHandle
,
140 IN ACCESS_MASK DesiredAccess
)
142 PSAM_DB_OBJECT ServerObject
;
145 TRACE("SamrConnect(%p %p %lx)\n",
146 ServerName
, ServerHandle
, DesiredAccess
);
148 RtlAcquireResourceShared(&SampResource
,
151 /* Map generic access rights */
152 RtlMapGenericMask(&DesiredAccess
,
155 /* Open the Server Object */
156 Status
= SampOpenDbObject(NULL
,
163 if (NT_SUCCESS(Status
))
164 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
166 RtlReleaseResource(&SampResource
);
168 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
177 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
179 PSAM_DB_OBJECT DbObject
;
180 NTSTATUS Status
= STATUS_SUCCESS
;
182 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
184 RtlAcquireResourceShared(&SampResource
,
187 Status
= SampValidateDbObject(*SamHandle
,
191 if (Status
== STATUS_SUCCESS
)
193 Status
= SampCloseDbObject(DbObject
);
197 RtlReleaseResource(&SampResource
);
199 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
208 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
209 IN SECURITY_INFORMATION SecurityInformation
,
210 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
213 return STATUS_NOT_IMPLEMENTED
;
220 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
221 IN SECURITY_INFORMATION SecurityInformation
,
222 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
*SecurityDescriptor
)
225 return STATUS_NOT_IMPLEMENTED
;
232 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
234 PSAM_DB_OBJECT ServerObject
;
237 TRACE("(%p)\n", ServerHandle
);
239 RtlAcquireResourceShared(&SampResource
,
242 /* Validate the server handle */
243 Status
= SampValidateDbObject(ServerHandle
,
248 RtlReleaseResource(&SampResource
);
250 if (!NT_SUCCESS(Status
))
253 /* Shut the server down */
254 RpcMgmtStopServerListening(0);
256 return STATUS_SUCCESS
;
263 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
264 IN PRPC_UNICODE_STRING Name
,
265 OUT PRPC_SID
*DomainId
)
267 PSAM_DB_OBJECT ServerObject
;
268 HANDLE DomainsKeyHandle
= NULL
;
269 HANDLE DomainKeyHandle
= NULL
;
270 WCHAR DomainKeyName
[64];
272 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
273 UNICODE_STRING DomainName
;
278 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
279 ServerHandle
, Name
, DomainId
);
281 RtlAcquireResourceShared(&SampResource
,
284 /* Validate the server handle */
285 Status
= SampValidateDbObject(ServerHandle
,
287 SAM_SERVER_LOOKUP_DOMAIN
,
289 if (!NT_SUCCESS(Status
))
294 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
298 if (!NT_SUCCESS(Status
))
302 while (Found
== FALSE
)
304 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
308 if (!NT_SUCCESS(Status
))
310 if (Status
== STATUS_NO_MORE_ENTRIES
)
311 Status
= STATUS_NO_SUCH_DOMAIN
;
315 TRACE("Domain key name: %S\n", DomainKeyName
);
317 Status
= SampRegOpenKey(DomainsKeyHandle
,
321 if (NT_SUCCESS(Status
))
323 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
324 Status
= SampRegQueryValue(DomainKeyHandle
,
327 (PVOID
)&DomainNameString
,
329 if (NT_SUCCESS(Status
))
331 TRACE("Domain name: %S\n", DomainNameString
);
333 RtlInitUnicodeString(&DomainName
,
335 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
337 TRACE("Found it!\n");
340 Status
= SampRegQueryValue(DomainKeyHandle
,
345 if (NT_SUCCESS(Status
))
347 *DomainId
= midl_user_allocate(Length
);
349 SampRegQueryValue(DomainKeyHandle
,
355 Status
= STATUS_SUCCESS
;
361 SampRegCloseKey(&DomainKeyHandle
);
368 SampRegCloseKey(&DomainKeyHandle
);
369 SampRegCloseKey(&DomainsKeyHandle
);
371 RtlReleaseResource(&SampResource
);
380 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
381 IN OUT
unsigned long *EnumerationContext
,
382 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
383 IN ULONG PreferedMaximumLength
,
384 OUT PULONG CountReturned
)
386 PSAM_DB_OBJECT ServerObject
;
387 WCHAR DomainKeyName
[64];
388 HANDLE DomainsKeyHandle
= NULL
;
389 HANDLE DomainKeyHandle
= NULL
;
392 ULONG RequiredLength
;
395 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
398 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
399 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
402 RtlAcquireResourceShared(&SampResource
,
405 /* Validate the server handle */
406 Status
= SampValidateDbObject(ServerHandle
,
408 SAM_SERVER_ENUMERATE_DOMAINS
,
410 if (!NT_SUCCESS(Status
))
413 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
417 if (!NT_SUCCESS(Status
))
420 EnumIndex
= *EnumerationContext
;
426 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
430 if (!NT_SUCCESS(Status
))
433 TRACE("EnumIndex: %lu\n", EnumIndex
);
434 TRACE("Domain key name: %S\n", DomainKeyName
);
436 Status
= SampRegOpenKey(DomainsKeyHandle
,
440 TRACE("SampRegOpenKey returned %08lX\n", Status
);
441 if (NT_SUCCESS(Status
))
444 Status
= SampRegQueryValue(DomainKeyHandle
,
449 TRACE("SampRegQueryValue returned %08lX\n", Status
);
450 if (NT_SUCCESS(Status
))
452 TRACE("Data length: %lu\n", DataLength
);
454 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
457 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
461 SampRegCloseKey(&DomainKeyHandle
);
467 TRACE("EnumCount: %lu\n", EnumCount
);
468 TRACE("RequiredLength: %lu\n", RequiredLength
);
470 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
471 if (EnumBuffer
== NULL
)
473 Status
= STATUS_INSUFFICIENT_RESOURCES
;
477 EnumBuffer
->EntriesRead
= EnumCount
;
478 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
479 if (EnumBuffer
->Buffer
== NULL
)
481 Status
= STATUS_INSUFFICIENT_RESOURCES
;
485 EnumIndex
= *EnumerationContext
;
486 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
488 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
492 if (!NT_SUCCESS(Status
))
495 TRACE("EnumIndex: %lu\n", EnumIndex
);
496 TRACE("Domain key name: %S\n", DomainKeyName
);
498 Status
= SampRegOpenKey(DomainsKeyHandle
,
502 TRACE("SampRegOpenKey returned %08lX\n", Status
);
503 if (NT_SUCCESS(Status
))
506 Status
= SampRegQueryValue(DomainKeyHandle
,
511 TRACE("SampRegQueryValue returned %08lX\n", Status
);
512 if (NT_SUCCESS(Status
))
514 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
515 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
516 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
517 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
518 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
520 SampRegCloseKey(&DomainKeyHandle
);
521 Status
= STATUS_INSUFFICIENT_RESOURCES
;
525 Status
= SampRegQueryValue(DomainKeyHandle
,
528 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
530 TRACE("SampRegQueryValue returned %08lX\n", Status
);
531 if (NT_SUCCESS(Status
))
533 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
537 SampRegCloseKey(&DomainKeyHandle
);
539 if (!NT_SUCCESS(Status
))
544 if (NT_SUCCESS(Status
))
546 *EnumerationContext
+= EnumCount
;
547 *Buffer
= EnumBuffer
;
548 *CountReturned
= EnumCount
;
552 SampRegCloseKey(&DomainKeyHandle
);
553 SampRegCloseKey(&DomainsKeyHandle
);
555 if (!NT_SUCCESS(Status
))
557 *EnumerationContext
= 0;
561 if (EnumBuffer
!= NULL
)
563 if (EnumBuffer
->Buffer
!= NULL
)
565 if (EnumBuffer
->EntriesRead
!= 0)
567 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
569 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
570 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
574 midl_user_free(EnumBuffer
->Buffer
);
577 midl_user_free(EnumBuffer
);
581 RtlReleaseResource(&SampResource
);
590 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
591 IN ACCESS_MASK DesiredAccess
,
592 IN PRPC_SID DomainId
,
593 OUT SAMPR_HANDLE
*DomainHandle
)
595 PSAM_DB_OBJECT ServerObject
;
596 PSAM_DB_OBJECT DomainObject
;
599 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
600 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
602 /* Map generic access rights */
603 RtlMapGenericMask(&DesiredAccess
,
606 RtlAcquireResourceShared(&SampResource
,
609 /* Validate the server handle */
610 Status
= SampValidateDbObject(ServerHandle
,
612 SAM_SERVER_LOOKUP_DOMAIN
,
614 if (!NT_SUCCESS(Status
))
617 /* Validate the Domain SID */
618 if ((DomainId
->Revision
!= SID_REVISION
) ||
619 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
620 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
621 return STATUS_INVALID_PARAMETER
;
623 /* Open the domain object */
624 if ((DomainId
->SubAuthorityCount
== 1) &&
625 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
627 /* Builtin domain object */
628 TRACE("Opening the builtin domain object.\n");
630 Status
= SampOpenDbObject(ServerObject
,
638 else if ((DomainId
->SubAuthorityCount
== 4) &&
639 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
641 /* Account domain object */
642 TRACE("Opening the account domain object.\n");
644 /* FIXME: Check the account domain sub authorities!!! */
646 Status
= SampOpenDbObject(ServerObject
,
656 /* No vaild domain SID */
657 Status
= STATUS_INVALID_PARAMETER
;
660 if (NT_SUCCESS(Status
))
661 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
663 RtlReleaseResource(&SampResource
);
665 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
672 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
673 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
675 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
676 SAM_DOMAIN_FIXED_DATA FixedData
;
682 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
683 if (InfoBuffer
== NULL
)
684 return STATUS_INSUFFICIENT_RESOURCES
;
686 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
687 Status
= SampGetObjectAttribute(DomainObject
,
692 if (!NT_SUCCESS(Status
))
695 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
696 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
697 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
698 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
699 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
700 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
701 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
703 *Buffer
= InfoBuffer
;
706 if (!NT_SUCCESS(Status
))
708 if (InfoBuffer
!= NULL
)
710 midl_user_free(InfoBuffer
);
719 SampGetNumberOfAccounts(PSAM_DB_OBJECT DomainObject
,
723 HANDLE AccountKeyHandle
= NULL
;
724 HANDLE NamesKeyHandle
= NULL
;
729 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
733 if (!NT_SUCCESS(Status
))
736 Status
= SampRegOpenKey(AccountKeyHandle
,
740 if (!NT_SUCCESS(Status
))
743 Status
= SampRegQueryKeyInfo(NamesKeyHandle
,
748 SampRegCloseKey(&NamesKeyHandle
);
749 SampRegCloseKey(&AccountKeyHandle
);
756 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
757 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
759 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
760 SAM_DOMAIN_FIXED_DATA FixedData
;
766 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
767 if (InfoBuffer
== NULL
)
768 return STATUS_INSUFFICIENT_RESOURCES
;
770 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
771 Status
= SampGetObjectAttribute(DomainObject
,
776 if (!NT_SUCCESS(Status
))
779 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
780 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
781 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
782 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
783 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
784 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
785 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
787 /* Get the OemInformation string */
788 Status
= SampGetObjectAttributeString(DomainObject
,
790 &InfoBuffer
->General
.OemInformation
);
791 if (!NT_SUCCESS(Status
))
793 TRACE("Status 0x%08lx\n", Status
);
797 /* Get the Name string */
798 Status
= SampGetObjectAttributeString(DomainObject
,
800 &InfoBuffer
->General
.DomainName
);
801 if (!NT_SUCCESS(Status
))
803 TRACE("Status 0x%08lx\n", Status
);
807 /* Get the ReplicaSourceNodeName string */
808 Status
= SampGetObjectAttributeString(DomainObject
,
809 L
"ReplicaSourceNodeName",
810 &InfoBuffer
->General
.ReplicaSourceNodeName
);
811 if (!NT_SUCCESS(Status
))
813 TRACE("Status 0x%08lx\n", Status
);
817 /* Get the number of Users in the Domain */
818 Status
= SampGetNumberOfAccounts(DomainObject
,
820 &InfoBuffer
->General
.UserCount
);
821 if (!NT_SUCCESS(Status
))
823 TRACE("Status 0x%08lx\n", Status
);
827 /* Get the number of Groups in the Domain */
828 Status
= SampGetNumberOfAccounts(DomainObject
,
830 &InfoBuffer
->General
.GroupCount
);
831 if (!NT_SUCCESS(Status
))
833 TRACE("Status 0x%08lx\n", Status
);
837 /* Get the number of Aliases in the Domain */
838 Status
= SampGetNumberOfAccounts(DomainObject
,
840 &InfoBuffer
->General
.AliasCount
);
841 if (!NT_SUCCESS(Status
))
843 TRACE("Status 0x%08lx\n", Status
);
847 *Buffer
= InfoBuffer
;
850 if (!NT_SUCCESS(Status
))
852 if (InfoBuffer
!= NULL
)
854 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
855 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
857 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
858 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
860 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
861 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
863 midl_user_free(InfoBuffer
);
872 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
873 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
875 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
876 SAM_DOMAIN_FIXED_DATA FixedData
;
882 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
883 if (InfoBuffer
== NULL
)
884 return STATUS_INSUFFICIENT_RESOURCES
;
886 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
887 Status
= SampGetObjectAttribute(DomainObject
,
892 if (!NT_SUCCESS(Status
))
895 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
896 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
898 *Buffer
= InfoBuffer
;
901 if (!NT_SUCCESS(Status
))
903 if (InfoBuffer
!= NULL
)
905 midl_user_free(InfoBuffer
);
914 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
915 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
917 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
922 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
923 if (InfoBuffer
== NULL
)
924 return STATUS_INSUFFICIENT_RESOURCES
;
926 /* Get the OemInformation string */
927 Status
= SampGetObjectAttributeString(DomainObject
,
929 &InfoBuffer
->Oem
.OemInformation
);
930 if (!NT_SUCCESS(Status
))
932 TRACE("Status 0x%08lx\n", Status
);
936 *Buffer
= InfoBuffer
;
939 if (!NT_SUCCESS(Status
))
941 if (InfoBuffer
!= NULL
)
943 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
944 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
946 midl_user_free(InfoBuffer
);
955 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
956 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
958 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
963 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
964 if (InfoBuffer
== NULL
)
965 return STATUS_INSUFFICIENT_RESOURCES
;
967 /* Get the Name string */
968 Status
= SampGetObjectAttributeString(DomainObject
,
970 &InfoBuffer
->Name
.DomainName
);
971 if (!NT_SUCCESS(Status
))
973 TRACE("Status 0x%08lx\n", Status
);
977 *Buffer
= InfoBuffer
;
980 if (!NT_SUCCESS(Status
))
982 if (InfoBuffer
!= NULL
)
984 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
985 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
987 midl_user_free(InfoBuffer
);
996 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
997 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
999 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1004 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1005 if (InfoBuffer
== NULL
)
1006 return STATUS_INSUFFICIENT_RESOURCES
;
1008 /* Get the ReplicaSourceNodeName string */
1009 Status
= SampGetObjectAttributeString(DomainObject
,
1010 L
"ReplicaSourceNodeName",
1011 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
1012 if (!NT_SUCCESS(Status
))
1014 TRACE("Status 0x%08lx\n", Status
);
1018 *Buffer
= InfoBuffer
;
1021 if (!NT_SUCCESS(Status
))
1023 if (InfoBuffer
!= NULL
)
1025 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1026 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
1028 midl_user_free(InfoBuffer
);
1037 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1038 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1040 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1041 SAM_DOMAIN_FIXED_DATA FixedData
;
1047 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1048 if (InfoBuffer
== NULL
)
1049 return STATUS_INSUFFICIENT_RESOURCES
;
1051 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1052 Status
= SampGetObjectAttribute(DomainObject
,
1057 if (!NT_SUCCESS(Status
))
1060 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
1062 *Buffer
= InfoBuffer
;
1065 if (!NT_SUCCESS(Status
))
1067 if (InfoBuffer
!= NULL
)
1069 midl_user_free(InfoBuffer
);
1078 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
1079 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1081 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1082 SAM_DOMAIN_FIXED_DATA FixedData
;
1088 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1089 if (InfoBuffer
== NULL
)
1090 return STATUS_INSUFFICIENT_RESOURCES
;
1092 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1093 Status
= SampGetObjectAttribute(DomainObject
,
1098 if (!NT_SUCCESS(Status
))
1101 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1102 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1103 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1104 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1106 *Buffer
= InfoBuffer
;
1109 if (!NT_SUCCESS(Status
))
1111 if (InfoBuffer
!= NULL
)
1113 midl_user_free(InfoBuffer
);
1122 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1123 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1125 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1126 SAM_DOMAIN_FIXED_DATA FixedData
;
1132 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1133 if (InfoBuffer
== NULL
)
1134 return STATUS_INSUFFICIENT_RESOURCES
;
1136 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1137 Status
= SampGetObjectAttribute(DomainObject
,
1142 if (!NT_SUCCESS(Status
))
1145 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1147 *Buffer
= InfoBuffer
;
1150 if (!NT_SUCCESS(Status
))
1152 if (InfoBuffer
!= NULL
)
1154 midl_user_free(InfoBuffer
);
1163 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1164 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1166 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1167 SAM_DOMAIN_FIXED_DATA FixedData
;
1173 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1174 if (InfoBuffer
== NULL
)
1175 return STATUS_INSUFFICIENT_RESOURCES
;
1177 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1178 Status
= SampGetObjectAttribute(DomainObject
,
1183 if (!NT_SUCCESS(Status
))
1186 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1187 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1188 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1189 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1190 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1191 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1192 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1194 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1195 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1196 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1198 /* Get the OemInformation string */
1199 Status
= SampGetObjectAttributeString(DomainObject
,
1201 &InfoBuffer
->General2
.I1
.OemInformation
);
1202 if (!NT_SUCCESS(Status
))
1204 TRACE("Status 0x%08lx\n", Status
);
1208 /* Get the Name string */
1209 Status
= SampGetObjectAttributeString(DomainObject
,
1211 &InfoBuffer
->General2
.I1
.DomainName
);
1212 if (!NT_SUCCESS(Status
))
1214 TRACE("Status 0x%08lx\n", Status
);
1218 /* Get the ReplicaSourceNodeName string */
1219 Status
= SampGetObjectAttributeString(DomainObject
,
1220 L
"ReplicaSourceNodeName",
1221 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1222 if (!NT_SUCCESS(Status
))
1224 TRACE("Status 0x%08lx\n", Status
);
1228 /* Get the number of Users in the Domain */
1229 Status
= SampGetNumberOfAccounts(DomainObject
,
1231 &InfoBuffer
->General2
.I1
.UserCount
);
1232 if (!NT_SUCCESS(Status
))
1234 TRACE("Status 0x%08lx\n", Status
);
1238 /* Get the number of Groups in the Domain */
1239 Status
= SampGetNumberOfAccounts(DomainObject
,
1241 &InfoBuffer
->General2
.I1
.GroupCount
);
1242 if (!NT_SUCCESS(Status
))
1244 TRACE("Status 0x%08lx\n", Status
);
1248 /* Get the number of Aliases in the Domain */
1249 Status
= SampGetNumberOfAccounts(DomainObject
,
1251 &InfoBuffer
->General2
.I1
.AliasCount
);
1252 if (!NT_SUCCESS(Status
))
1254 TRACE("Status 0x%08lx\n", Status
);
1258 *Buffer
= InfoBuffer
;
1261 if (!NT_SUCCESS(Status
))
1263 if (InfoBuffer
!= NULL
)
1265 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1266 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1268 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1269 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1271 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1272 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1274 midl_user_free(InfoBuffer
);
1283 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1284 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1286 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1287 SAM_DOMAIN_FIXED_DATA FixedData
;
1293 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1294 if (InfoBuffer
== NULL
)
1295 return STATUS_INSUFFICIENT_RESOURCES
;
1297 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1298 Status
= SampGetObjectAttribute(DomainObject
,
1303 if (!NT_SUCCESS(Status
))
1306 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1307 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1308 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1310 *Buffer
= InfoBuffer
;
1313 if (!NT_SUCCESS(Status
))
1315 if (InfoBuffer
!= NULL
)
1317 midl_user_free(InfoBuffer
);
1326 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1327 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1329 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1330 SAM_DOMAIN_FIXED_DATA FixedData
;
1336 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1337 if (InfoBuffer
== NULL
)
1338 return STATUS_INSUFFICIENT_RESOURCES
;
1340 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1341 Status
= SampGetObjectAttribute(DomainObject
,
1346 if (!NT_SUCCESS(Status
))
1349 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1350 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1351 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1352 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1353 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1354 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1356 *Buffer
= InfoBuffer
;
1359 if (!NT_SUCCESS(Status
))
1361 if (InfoBuffer
!= NULL
)
1363 midl_user_free(InfoBuffer
);
1374 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1375 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1376 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1378 PSAM_DB_OBJECT DomainObject
;
1379 ACCESS_MASK DesiredAccess
;
1382 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1383 DomainHandle
, DomainInformationClass
, Buffer
);
1385 switch (DomainInformationClass
)
1387 case DomainPasswordInformation
:
1388 case DomainLockoutInformation
:
1389 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1392 case DomainGeneralInformation
:
1393 case DomainLogoffInformation
:
1394 case DomainOemInformation
:
1395 case DomainNameInformation
:
1396 case DomainReplicationInformation
:
1397 case DomainServerRoleInformation
:
1398 case DomainModifiedInformation
:
1399 case DomainStateInformation
:
1400 case DomainModifiedInformation2
:
1401 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1404 case DomainGeneralInformation2
:
1405 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1406 DOMAIN_READ_OTHER_PARAMETERS
;
1410 return STATUS_INVALID_INFO_CLASS
;
1413 RtlAcquireResourceShared(&SampResource
,
1416 /* Validate the server handle */
1417 Status
= SampValidateDbObject(DomainHandle
,
1421 if (!NT_SUCCESS(Status
))
1424 switch (DomainInformationClass
)
1426 case DomainPasswordInformation
:
1427 Status
= SampQueryDomainPassword(DomainObject
,
1431 case DomainGeneralInformation
:
1432 Status
= SampQueryDomainGeneral(DomainObject
,
1436 case DomainLogoffInformation
:
1437 Status
= SampQueryDomainLogoff(DomainObject
,
1441 case DomainOemInformation
:
1442 Status
= SampQueryDomainOem(DomainObject
,
1446 case DomainNameInformation
:
1447 Status
= SampQueryDomainName(DomainObject
,
1451 case DomainReplicationInformation
:
1452 Status
= SampQueryDomainReplication(DomainObject
,
1456 case DomainServerRoleInformation
:
1457 Status
= SampQueryDomainServerRole(DomainObject
,
1461 case DomainModifiedInformation
:
1462 Status
= SampQueryDomainModified(DomainObject
,
1466 case DomainStateInformation
:
1467 Status
= SampQueryDomainState(DomainObject
,
1471 case DomainGeneralInformation2
:
1472 Status
= SampQueryDomainGeneral2(DomainObject
,
1476 case DomainLockoutInformation
:
1477 Status
= SampQueryDomainLockout(DomainObject
,
1481 case DomainModifiedInformation2
:
1482 Status
= SampQueryDomainModified2(DomainObject
,
1487 Status
= STATUS_NOT_IMPLEMENTED
;
1491 RtlReleaseResource(&SampResource
);
1498 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1499 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1501 SAM_DOMAIN_FIXED_DATA FixedData
;
1505 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1506 Status
= SampGetObjectAttribute(DomainObject
,
1511 if (!NT_SUCCESS(Status
))
1514 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1515 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1516 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1517 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1518 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1519 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1520 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1522 Status
= SampSetObjectAttribute(DomainObject
,
1534 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1535 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1537 SAM_DOMAIN_FIXED_DATA FixedData
;
1541 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1542 Status
= SampGetObjectAttribute(DomainObject
,
1547 if (!NT_SUCCESS(Status
))
1550 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1551 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1553 Status
= SampSetObjectAttribute(DomainObject
,
1565 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1566 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1568 SAM_DOMAIN_FIXED_DATA FixedData
;
1572 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1573 Status
= SampGetObjectAttribute(DomainObject
,
1578 if (!NT_SUCCESS(Status
))
1581 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1583 Status
= SampSetObjectAttribute(DomainObject
,
1595 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1596 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1598 SAM_DOMAIN_FIXED_DATA FixedData
;
1602 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1603 Status
= SampGetObjectAttribute(DomainObject
,
1608 if (!NT_SUCCESS(Status
))
1611 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1613 Status
= SampSetObjectAttribute(DomainObject
,
1625 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1626 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1628 SAM_DOMAIN_FIXED_DATA FixedData
;
1632 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1633 Status
= SampGetObjectAttribute(DomainObject
,
1638 if (!NT_SUCCESS(Status
))
1641 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1642 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1643 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1645 Status
= SampSetObjectAttribute(DomainObject
,
1659 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1660 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1661 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1663 PSAM_DB_OBJECT DomainObject
;
1664 ACCESS_MASK DesiredAccess
;
1667 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1668 DomainHandle
, DomainInformationClass
, DomainInformation
);
1670 switch (DomainInformationClass
)
1672 case DomainPasswordInformation
:
1673 case DomainLockoutInformation
:
1674 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1677 case DomainLogoffInformation
:
1678 case DomainOemInformation
:
1679 case DomainNameInformation
:
1680 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1683 case DomainReplicationInformation
:
1684 case DomainServerRoleInformation
:
1685 case DomainStateInformation
:
1686 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1690 return STATUS_INVALID_INFO_CLASS
;
1693 RtlAcquireResourceExclusive(&SampResource
,
1696 /* Validate the server handle */
1697 Status
= SampValidateDbObject(DomainHandle
,
1701 if (!NT_SUCCESS(Status
))
1704 switch (DomainInformationClass
)
1706 case DomainPasswordInformation
:
1707 Status
= SampSetDomainPassword(DomainObject
,
1711 case DomainLogoffInformation
:
1712 Status
= SampSetDomainLogoff(DomainObject
,
1716 case DomainOemInformation
:
1717 Status
= SampSetObjectAttributeString(DomainObject
,
1719 &DomainInformation
->Oem
.OemInformation
);
1722 case DomainNameInformation
:
1723 Status
= SampSetObjectAttributeString(DomainObject
,
1725 &DomainInformation
->Name
.DomainName
);
1728 case DomainReplicationInformation
:
1729 Status
= SampSetObjectAttributeString(DomainObject
,
1730 L
"ReplicaSourceNodeName",
1731 &DomainInformation
->Replication
.ReplicaSourceNodeName
);
1734 case DomainServerRoleInformation
:
1735 Status
= SampSetDomainServerRole(DomainObject
,
1739 case DomainStateInformation
:
1740 Status
= SampSetDomainState(DomainObject
,
1744 case DomainLockoutInformation
:
1745 Status
= SampSetDomainLockout(DomainObject
,
1750 Status
= STATUS_NOT_IMPLEMENTED
;
1754 RtlReleaseResource(&SampResource
);
1763 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1764 IN PRPC_UNICODE_STRING Name
,
1765 IN ACCESS_MASK DesiredAccess
,
1766 OUT SAMPR_HANDLE
*GroupHandle
,
1767 OUT
unsigned long *RelativeId
)
1769 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1770 SAM_GROUP_FIXED_DATA FixedGroupData
;
1771 PSAM_DB_OBJECT DomainObject
;
1772 PSAM_DB_OBJECT GroupObject
;
1778 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1779 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1781 /* Map generic access rights */
1782 RtlMapGenericMask(&DesiredAccess
,
1785 RtlAcquireResourceExclusive(&SampResource
,
1788 /* Validate the domain handle */
1789 Status
= SampValidateDbObject(DomainHandle
,
1791 DOMAIN_CREATE_GROUP
,
1793 if (!NT_SUCCESS(Status
))
1795 TRACE("failed with status 0x%08lx\n", Status
);
1799 /* Check the group account name */
1800 Status
= SampCheckAccountName(Name
, 256);
1801 if (!NT_SUCCESS(Status
))
1803 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
1807 /* Check if the group name already exists in the domain */
1808 Status
= SampCheckAccountNameInDomain(DomainObject
,
1810 if (!NT_SUCCESS(Status
))
1812 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1813 Name
->Buffer
, Status
);
1817 /* Get the fixed domain attributes */
1818 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1819 Status
= SampGetObjectAttribute(DomainObject
,
1822 (PVOID
)&FixedDomainData
,
1824 if (!NT_SUCCESS(Status
))
1826 TRACE("failed with status 0x%08lx\n", Status
);
1830 /* Increment the NextRid attribute */
1831 ulRid
= FixedDomainData
.NextRid
;
1832 FixedDomainData
.NextRid
++;
1834 /* Store the fixed domain attributes */
1835 Status
= SampSetObjectAttribute(DomainObject
,
1840 if (!NT_SUCCESS(Status
))
1842 TRACE("failed with status 0x%08lx\n", Status
);
1846 TRACE("RID: %lx\n", ulRid
);
1848 /* Convert the RID into a string (hex) */
1849 swprintf(szRid
, L
"%08lX", ulRid
);
1851 /* Create the group object */
1852 Status
= SampCreateDbObject(DomainObject
,
1859 if (!NT_SUCCESS(Status
))
1861 TRACE("failed with status 0x%08lx\n", Status
);
1865 /* Add the account name of the user object */
1866 Status
= SampSetAccountNameInDomain(DomainObject
,
1870 if (!NT_SUCCESS(Status
))
1872 TRACE("failed with status 0x%08lx\n", Status
);
1876 /* Initialize fixed user data */
1877 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1878 FixedGroupData
.Version
= 1;
1879 FixedGroupData
.GroupId
= ulRid
;
1881 /* Set fixed user data attribute */
1882 Status
= SampSetObjectAttribute(GroupObject
,
1885 (LPVOID
)&FixedGroupData
,
1886 sizeof(SAM_GROUP_FIXED_DATA
));
1887 if (!NT_SUCCESS(Status
))
1889 TRACE("failed with status 0x%08lx\n", Status
);
1893 /* Set the Name attribute */
1894 Status
= SampSetObjectAttributeString(GroupObject
,
1897 if (!NT_SUCCESS(Status
))
1899 TRACE("failed with status 0x%08lx\n", Status
);
1903 /* Set the AdminComment attribute */
1904 Status
= SampSetObjectAttributeString(GroupObject
,
1907 if (!NT_SUCCESS(Status
))
1909 TRACE("failed with status 0x%08lx\n", Status
);
1913 if (NT_SUCCESS(Status
))
1915 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1916 *RelativeId
= ulRid
;
1920 RtlReleaseResource(&SampResource
);
1922 TRACE("returns with status 0x%08lx\n", Status
);
1931 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1932 IN OUT
unsigned long *EnumerationContext
,
1933 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1934 IN
unsigned long PreferedMaximumLength
,
1935 OUT
unsigned long *CountReturned
)
1937 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1938 PSAM_DB_OBJECT DomainObject
;
1939 HANDLE GroupsKeyHandle
= NULL
;
1940 HANDLE NamesKeyHandle
= NULL
;
1941 WCHAR GroupName
[64];
1943 ULONG EnumCount
= 0;
1944 ULONG RequiredLength
= 0;
1949 BOOLEAN MoreEntries
= FALSE
;
1952 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1953 DomainHandle
, EnumerationContext
, Buffer
,
1954 PreferedMaximumLength
, CountReturned
);
1956 RtlAcquireResourceShared(&SampResource
,
1959 /* Validate the domain handle */
1960 Status
= SampValidateDbObject(DomainHandle
,
1962 DOMAIN_LIST_ACCOUNTS
,
1964 if (!NT_SUCCESS(Status
))
1967 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1971 if (!NT_SUCCESS(Status
))
1974 Status
= SampRegOpenKey(GroupsKeyHandle
,
1978 if (!NT_SUCCESS(Status
))
1983 EnumIndex
= *EnumerationContext
;
1987 NameLength
= 64 * sizeof(WCHAR
);
1988 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1995 if (!NT_SUCCESS(Status
))
1997 if (Status
== STATUS_NO_MORE_ENTRIES
)
1998 Status
= STATUS_SUCCESS
;
2002 TRACE("EnumIndex: %lu\n", EnumIndex
);
2003 TRACE("Group name: %S\n", GroupName
);
2004 TRACE("Name length: %lu\n", NameLength
);
2006 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2012 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2018 TRACE("EnumCount: %lu\n", EnumCount
);
2019 TRACE("RequiredLength: %lu\n", RequiredLength
);
2021 if (!NT_SUCCESS(Status
))
2024 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2025 if (EnumBuffer
== NULL
)
2027 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2031 EnumBuffer
->EntriesRead
= EnumCount
;
2035 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2036 if (EnumBuffer
->Buffer
== NULL
)
2038 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2044 EnumIndex
= *EnumerationContext
;
2045 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2047 NameLength
= 64 * sizeof(WCHAR
);
2048 DataLength
= sizeof(ULONG
);
2049 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2056 if (!NT_SUCCESS(Status
))
2058 if (Status
== STATUS_NO_MORE_ENTRIES
)
2059 Status
= STATUS_SUCCESS
;
2063 TRACE("EnumIndex: %lu\n", EnumIndex
);
2064 TRACE("Group name: %S\n", GroupName
);
2065 TRACE("Name length: %lu\n", NameLength
);
2066 TRACE("RID: %lu\n", Rid
);
2068 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2070 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2071 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2073 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2075 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2076 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2078 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2082 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2084 EnumBuffer
->Buffer
[i
].Name
.Length
);
2089 if (NT_SUCCESS(Status
))
2091 *EnumerationContext
+= EnumCount
;
2092 *Buffer
= EnumBuffer
;
2093 *CountReturned
= EnumCount
;
2097 *EnumerationContext
= 0;
2101 if (EnumBuffer
!= NULL
)
2103 if (EnumBuffer
->Buffer
!= NULL
)
2105 if (EnumBuffer
->EntriesRead
!= 0)
2107 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2109 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2110 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2114 midl_user_free(EnumBuffer
->Buffer
);
2117 midl_user_free(EnumBuffer
);
2121 SampRegCloseKey(&NamesKeyHandle
);
2122 SampRegCloseKey(&GroupsKeyHandle
);
2124 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2125 Status
= STATUS_MORE_ENTRIES
;
2127 RtlReleaseResource(&SampResource
);
2136 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
2137 IN PRPC_UNICODE_STRING Name
,
2138 IN ACCESS_MASK DesiredAccess
,
2139 OUT SAMPR_HANDLE
*UserHandle
,
2140 OUT
unsigned long *RelativeId
)
2142 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2143 SAM_USER_FIXED_DATA FixedUserData
;
2144 PSAM_DB_OBJECT DomainObject
;
2145 PSAM_DB_OBJECT UserObject
;
2146 GROUP_MEMBERSHIP GroupMembership
;
2147 UCHAR LogonHours
[23];
2153 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2154 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2157 Name
->Length
== 0 ||
2158 Name
->Buffer
== NULL
||
2159 UserHandle
== NULL
||
2161 return STATUS_INVALID_PARAMETER
;
2163 /* Map generic access rights */
2164 RtlMapGenericMask(&DesiredAccess
,
2167 RtlAcquireResourceExclusive(&SampResource
,
2170 /* Validate the domain handle */
2171 Status
= SampValidateDbObject(DomainHandle
,
2175 if (!NT_SUCCESS(Status
))
2177 TRACE("failed with status 0x%08lx\n", Status
);
2181 /* Check the user account name */
2182 Status
= SampCheckAccountName(Name
, 20);
2183 if (!NT_SUCCESS(Status
))
2185 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
2189 /* Check if the user name already exists in the domain */
2190 Status
= SampCheckAccountNameInDomain(DomainObject
,
2192 if (!NT_SUCCESS(Status
))
2194 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2195 Name
->Buffer
, Status
);
2199 /* Get the fixed domain attributes */
2200 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2201 Status
= SampGetObjectAttribute(DomainObject
,
2204 (PVOID
)&FixedDomainData
,
2206 if (!NT_SUCCESS(Status
))
2208 TRACE("failed with status 0x%08lx\n", Status
);
2212 /* Increment the NextRid attribute */
2213 ulRid
= FixedDomainData
.NextRid
;
2214 FixedDomainData
.NextRid
++;
2216 /* Store the fixed domain attributes */
2217 Status
= SampSetObjectAttribute(DomainObject
,
2222 if (!NT_SUCCESS(Status
))
2224 TRACE("failed with status 0x%08lx\n", Status
);
2228 TRACE("RID: %lx\n", ulRid
);
2230 /* Convert the RID into a string (hex) */
2231 swprintf(szRid
, L
"%08lX", ulRid
);
2233 /* Create the user object */
2234 Status
= SampCreateDbObject(DomainObject
,
2241 if (!NT_SUCCESS(Status
))
2243 TRACE("failed with status 0x%08lx\n", Status
);
2247 /* Add the account name for the user object */
2248 Status
= SampSetAccountNameInDomain(DomainObject
,
2252 if (!NT_SUCCESS(Status
))
2254 TRACE("failed with status 0x%08lx\n", Status
);
2258 /* Initialize fixed user data */
2259 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2260 FixedUserData
.Version
= 1;
2261 FixedUserData
.Reserved
= 0;
2262 FixedUserData
.LastLogon
.QuadPart
= 0;
2263 FixedUserData
.LastLogoff
.QuadPart
= 0;
2264 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2265 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2266 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2267 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2268 FixedUserData
.UserId
= ulRid
;
2269 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2270 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2271 USER_PASSWORD_NOT_REQUIRED
|
2272 USER_NORMAL_ACCOUNT
;
2273 FixedUserData
.CountryCode
= 0;
2274 FixedUserData
.CodePage
= 0;
2275 FixedUserData
.BadPasswordCount
= 0;
2276 FixedUserData
.LogonCount
= 0;
2277 FixedUserData
.AdminCount
= 0;
2278 FixedUserData
.OperatorCount
= 0;
2280 /* Set fixed user data attribute */
2281 Status
= SampSetObjectAttribute(UserObject
,
2284 (LPVOID
)&FixedUserData
,
2285 sizeof(SAM_USER_FIXED_DATA
));
2286 if (!NT_SUCCESS(Status
))
2288 TRACE("failed with status 0x%08lx\n", Status
);
2292 /* Set the Name attribute */
2293 Status
= SampSetObjectAttributeString(UserObject
,
2296 if (!NT_SUCCESS(Status
))
2298 TRACE("failed with status 0x%08lx\n", Status
);
2302 /* Set the FullName attribute */
2303 Status
= SampSetObjectAttributeString(UserObject
,
2306 if (!NT_SUCCESS(Status
))
2308 TRACE("failed with status 0x%08lx\n", Status
);
2312 /* Set the HomeDirectory attribute */
2313 Status
= SampSetObjectAttributeString(UserObject
,
2316 if (!NT_SUCCESS(Status
))
2318 TRACE("failed with status 0x%08lx\n", Status
);
2322 /* Set the HomeDirectoryDrive attribute */
2323 Status
= SampSetObjectAttributeString(UserObject
,
2324 L
"HomeDirectoryDrive",
2326 if (!NT_SUCCESS(Status
))
2328 TRACE("failed with status 0x%08lx\n", Status
);
2332 /* Set the ScriptPath attribute */
2333 Status
= SampSetObjectAttributeString(UserObject
,
2336 if (!NT_SUCCESS(Status
))
2338 TRACE("failed with status 0x%08lx\n", Status
);
2342 /* Set the ProfilePath attribute */
2343 Status
= SampSetObjectAttributeString(UserObject
,
2346 if (!NT_SUCCESS(Status
))
2348 TRACE("failed with status 0x%08lx\n", Status
);
2352 /* Set the AdminComment attribute */
2353 Status
= SampSetObjectAttributeString(UserObject
,
2356 if (!NT_SUCCESS(Status
))
2358 TRACE("failed with status 0x%08lx\n", Status
);
2362 /* Set the UserComment attribute */
2363 Status
= SampSetObjectAttributeString(UserObject
,
2366 if (!NT_SUCCESS(Status
))
2368 TRACE("failed with status 0x%08lx\n", Status
);
2372 /* Set the WorkStations attribute */
2373 Status
= SampSetObjectAttributeString(UserObject
,
2376 if (!NT_SUCCESS(Status
))
2378 TRACE("failed with status 0x%08lx\n", Status
);
2382 /* Set the Parameters attribute */
2383 Status
= SampSetObjectAttributeString(UserObject
,
2386 if (!NT_SUCCESS(Status
))
2388 TRACE("failed with status 0x%08lx\n", Status
);
2392 /* Set LogonHours attribute*/
2393 *((PUSHORT
)LogonHours
) = 168;
2394 memset(&(LogonHours
[2]), 0xff, 21);
2396 Status
= SampSetObjectAttribute(UserObject
,
2400 sizeof(LogonHours
));
2401 if (!NT_SUCCESS(Status
))
2403 TRACE("failed with status 0x%08lx\n", Status
);
2407 /* Set Groups attribute*/
2408 GroupMembership
.RelativeId
= DOMAIN_GROUP_RID_USERS
;
2409 GroupMembership
.Attributes
= SE_GROUP_MANDATORY
|
2411 SE_GROUP_ENABLED_BY_DEFAULT
;
2413 Status
= SampSetObjectAttribute(UserObject
,
2417 sizeof(GROUP_MEMBERSHIP
));
2418 if (!NT_SUCCESS(Status
))
2420 TRACE("failed with status 0x%08lx\n", Status
);
2424 /* Set LMPwd attribute*/
2425 Status
= SampSetObjectAttribute(UserObject
,
2429 sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
2430 if (!NT_SUCCESS(Status
))
2432 TRACE("failed with status 0x%08lx\n", Status
);
2436 /* Set NTPwd attribute*/
2437 Status
= SampSetObjectAttribute(UserObject
,
2441 sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
2442 if (!NT_SUCCESS(Status
))
2444 TRACE("failed with status 0x%08lx\n", Status
);
2448 /* Set LMPwdHistory attribute*/
2449 Status
= SampSetObjectAttribute(UserObject
,
2454 if (!NT_SUCCESS(Status
))
2456 TRACE("failed with status 0x%08lx\n", Status
);
2460 /* Set NTPwdHistory attribute*/
2461 Status
= SampSetObjectAttribute(UserObject
,
2466 if (!NT_SUCCESS(Status
))
2468 TRACE("failed with status 0x%08lx\n", Status
);
2472 /* FIXME: Set SecDesc attribute*/
2474 if (NT_SUCCESS(Status
))
2476 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2477 *RelativeId
= ulRid
;
2481 RtlReleaseResource(&SampResource
);
2483 TRACE("returns with status 0x%08lx\n", Status
);
2492 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2493 IN OUT
unsigned long *EnumerationContext
,
2494 IN
unsigned long UserAccountControl
,
2495 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2496 IN
unsigned long PreferedMaximumLength
,
2497 OUT
unsigned long *CountReturned
)
2499 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2500 PSAM_DB_OBJECT DomainObject
;
2501 HANDLE UsersKeyHandle
= NULL
;
2502 HANDLE NamesKeyHandle
= NULL
;
2505 ULONG EnumCount
= 0;
2506 ULONG RequiredLength
= 0;
2511 BOOLEAN MoreEntries
= FALSE
;
2514 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2515 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2516 PreferedMaximumLength
, CountReturned
);
2518 RtlAcquireResourceShared(&SampResource
,
2521 /* Validate the domain handle */
2522 Status
= SampValidateDbObject(DomainHandle
,
2524 DOMAIN_LIST_ACCOUNTS
,
2526 if (!NT_SUCCESS(Status
))
2529 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2533 if (!NT_SUCCESS(Status
))
2536 Status
= SampRegOpenKey(UsersKeyHandle
,
2540 if (!NT_SUCCESS(Status
))
2545 EnumIndex
= *EnumerationContext
;
2549 NameLength
= 64 * sizeof(WCHAR
);
2550 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2557 if (!NT_SUCCESS(Status
))
2559 if (Status
== STATUS_NO_MORE_ENTRIES
)
2560 Status
= STATUS_SUCCESS
;
2564 TRACE("EnumIndex: %lu\n", EnumIndex
);
2565 TRACE("User name: %S\n", UserName
);
2566 TRACE("Name length: %lu\n", NameLength
);
2568 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2574 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2580 TRACE("EnumCount: %lu\n", EnumCount
);
2581 TRACE("RequiredLength: %lu\n", RequiredLength
);
2583 if (!NT_SUCCESS(Status
))
2586 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2587 if (EnumBuffer
== NULL
)
2589 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2593 EnumBuffer
->EntriesRead
= EnumCount
;
2597 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2598 if (EnumBuffer
->Buffer
== NULL
)
2600 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2606 EnumIndex
= *EnumerationContext
;
2607 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2609 NameLength
= 64 * sizeof(WCHAR
);
2610 DataLength
= sizeof(ULONG
);
2611 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2618 if (!NT_SUCCESS(Status
))
2620 if (Status
== STATUS_NO_MORE_ENTRIES
)
2621 Status
= STATUS_SUCCESS
;
2625 TRACE("EnumIndex: %lu\n", EnumIndex
);
2626 TRACE("User name: %S\n", UserName
);
2627 TRACE("Name length: %lu\n", NameLength
);
2628 TRACE("RID: %lu\n", Rid
);
2630 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2632 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2633 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2635 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2637 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2638 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2640 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2644 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2646 EnumBuffer
->Buffer
[i
].Name
.Length
);
2651 if (NT_SUCCESS(Status
))
2653 *EnumerationContext
+= EnumCount
;
2654 *Buffer
= EnumBuffer
;
2655 *CountReturned
= EnumCount
;
2659 *EnumerationContext
= 0;
2663 if (EnumBuffer
!= NULL
)
2665 if (EnumBuffer
->Buffer
!= NULL
)
2667 if (EnumBuffer
->EntriesRead
!= 0)
2669 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2671 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2672 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2676 midl_user_free(EnumBuffer
->Buffer
);
2679 midl_user_free(EnumBuffer
);
2683 SampRegCloseKey(&NamesKeyHandle
);
2684 SampRegCloseKey(&UsersKeyHandle
);
2686 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2687 Status
= STATUS_MORE_ENTRIES
;
2689 RtlReleaseResource(&SampResource
);
2698 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2699 IN PRPC_UNICODE_STRING AccountName
,
2700 IN ACCESS_MASK DesiredAccess
,
2701 OUT SAMPR_HANDLE
*AliasHandle
,
2702 OUT
unsigned long *RelativeId
)
2704 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2705 PSAM_DB_OBJECT DomainObject
;
2706 PSAM_DB_OBJECT AliasObject
;
2712 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2713 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2715 /* Map generic access rights */
2716 RtlMapGenericMask(&DesiredAccess
,
2719 RtlAcquireResourceExclusive(&SampResource
,
2722 /* Validate the domain handle */
2723 Status
= SampValidateDbObject(DomainHandle
,
2725 DOMAIN_CREATE_ALIAS
,
2727 if (!NT_SUCCESS(Status
))
2729 TRACE("failed with status 0x%08lx\n", Status
);
2733 /* Check the alias acoount name */
2734 Status
= SampCheckAccountName(AccountName
, 256);
2735 if (!NT_SUCCESS(Status
))
2737 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
2741 /* Check if the alias name already exists in the domain */
2742 Status
= SampCheckAccountNameInDomain(DomainObject
,
2743 AccountName
->Buffer
);
2744 if (!NT_SUCCESS(Status
))
2746 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2747 AccountName
->Buffer
, Status
);
2751 /* Get the fixed domain attributes */
2752 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2753 Status
= SampGetObjectAttribute(DomainObject
,
2756 (PVOID
)&FixedDomainData
,
2758 if (!NT_SUCCESS(Status
))
2760 TRACE("failed with status 0x%08lx\n", Status
);
2764 /* Increment the NextRid attribute */
2765 ulRid
= FixedDomainData
.NextRid
;
2766 FixedDomainData
.NextRid
++;
2768 /* Store the fixed domain attributes */
2769 Status
= SampSetObjectAttribute(DomainObject
,
2774 if (!NT_SUCCESS(Status
))
2776 TRACE("failed with status 0x%08lx\n", Status
);
2780 TRACE("RID: %lx\n", ulRid
);
2782 /* Convert the RID into a string (hex) */
2783 swprintf(szRid
, L
"%08lX", ulRid
);
2785 /* Create the alias object */
2786 Status
= SampCreateDbObject(DomainObject
,
2793 if (!NT_SUCCESS(Status
))
2795 TRACE("failed with status 0x%08lx\n", Status
);
2799 /* Add the account name for the alias object */
2800 Status
= SampSetAccountNameInDomain(DomainObject
,
2802 AccountName
->Buffer
,
2804 if (!NT_SUCCESS(Status
))
2806 TRACE("failed with status 0x%08lx\n", Status
);
2810 /* Set the Name attribute */
2811 Status
= SampSetObjectAttributeString(AliasObject
,
2814 if (!NT_SUCCESS(Status
))
2816 TRACE("failed with status 0x%08lx\n", Status
);
2820 /* Set the Description attribute */
2821 Status
= SampSetObjectAttributeString(AliasObject
,
2824 if (!NT_SUCCESS(Status
))
2826 TRACE("failed with status 0x%08lx\n", Status
);
2830 if (NT_SUCCESS(Status
))
2832 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2833 *RelativeId
= ulRid
;
2837 RtlReleaseResource(&SampResource
);
2839 TRACE("returns with status 0x%08lx\n", Status
);
2848 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2849 IN OUT
unsigned long *EnumerationContext
,
2850 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2851 IN
unsigned long PreferedMaximumLength
,
2852 OUT
unsigned long *CountReturned
)
2854 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2855 PSAM_DB_OBJECT DomainObject
;
2856 HANDLE AliasesKeyHandle
= NULL
;
2857 HANDLE NamesKeyHandle
= NULL
;
2858 WCHAR AliasName
[64];
2860 ULONG EnumCount
= 0;
2861 ULONG RequiredLength
= 0;
2866 BOOLEAN MoreEntries
= FALSE
;
2869 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2870 DomainHandle
, EnumerationContext
, Buffer
,
2871 PreferedMaximumLength
, CountReturned
);
2873 RtlAcquireResourceShared(&SampResource
,
2876 /* Validate the domain handle */
2877 Status
= SampValidateDbObject(DomainHandle
,
2879 DOMAIN_LIST_ACCOUNTS
,
2881 if (!NT_SUCCESS(Status
))
2884 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2888 if (!NT_SUCCESS(Status
))
2891 Status
= SampRegOpenKey(AliasesKeyHandle
,
2895 if (!NT_SUCCESS(Status
))
2900 EnumIndex
= *EnumerationContext
;
2904 NameLength
= 64 * sizeof(WCHAR
);
2905 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2912 if (!NT_SUCCESS(Status
))
2914 if (Status
== STATUS_NO_MORE_ENTRIES
)
2915 Status
= STATUS_SUCCESS
;
2919 TRACE("EnumIndex: %lu\n", EnumIndex
);
2920 TRACE("Alias name: %S\n", AliasName
);
2921 TRACE("Name length: %lu\n", NameLength
);
2923 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2929 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2935 TRACE("EnumCount: %lu\n", EnumCount
);
2936 TRACE("RequiredLength: %lu\n", RequiredLength
);
2938 if (!NT_SUCCESS(Status
))
2941 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2942 if (EnumBuffer
== NULL
)
2944 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2948 EnumBuffer
->EntriesRead
= EnumCount
;
2952 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2953 if (EnumBuffer
->Buffer
== NULL
)
2955 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2961 EnumIndex
= *EnumerationContext
;
2962 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2964 NameLength
= 64 * sizeof(WCHAR
);
2965 DataLength
= sizeof(ULONG
);
2966 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2973 if (!NT_SUCCESS(Status
))
2975 if (Status
== STATUS_NO_MORE_ENTRIES
)
2976 Status
= STATUS_SUCCESS
;
2980 TRACE("EnumIndex: %lu\n", EnumIndex
);
2981 TRACE("Alias name: %S\n", AliasName
);
2982 TRACE("Name length: %lu\n", NameLength
);
2983 TRACE("RID: %lu\n", Rid
);
2985 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2987 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2988 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2990 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2992 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2993 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2995 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2999 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
3001 EnumBuffer
->Buffer
[i
].Name
.Length
);
3006 if (NT_SUCCESS(Status
))
3008 *EnumerationContext
+= EnumCount
;
3009 *Buffer
= EnumBuffer
;
3010 *CountReturned
= EnumCount
;
3014 *EnumerationContext
= 0;
3018 if (EnumBuffer
!= NULL
)
3020 if (EnumBuffer
->Buffer
!= NULL
)
3022 if (EnumBuffer
->EntriesRead
!= 0)
3024 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
3026 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
3027 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
3031 midl_user_free(EnumBuffer
->Buffer
);
3034 midl_user_free(EnumBuffer
);
3038 SampRegCloseKey(&NamesKeyHandle
);
3039 SampRegCloseKey(&AliasesKeyHandle
);
3041 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
3042 Status
= STATUS_MORE_ENTRIES
;
3044 RtlReleaseResource(&SampResource
);
3053 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
3054 IN PSAMPR_PSID_ARRAY SidArray
,
3055 OUT PSAMPR_ULONG_ARRAY Membership
)
3057 PSAM_DB_OBJECT DomainObject
;
3058 HANDLE AliasesKeyHandle
= NULL
;
3059 HANDLE MembersKeyHandle
= NULL
;
3060 HANDLE MemberKeyHandle
= NULL
;
3061 LPWSTR MemberSidString
= NULL
;
3062 PULONG RidArray
= NULL
;
3063 ULONG MaxSidCount
= 0;
3068 WCHAR NameBuffer
[9];
3070 TRACE("SamrGetAliasMembership(%p %p %p)\n",
3071 DomainHandle
, SidArray
, Membership
);
3073 RtlAcquireResourceShared(&SampResource
,
3076 /* Validate the domain handle */
3077 Status
= SampValidateDbObject(DomainHandle
,
3079 DOMAIN_GET_ALIAS_MEMBERSHIP
,
3081 if (!NT_SUCCESS(Status
))
3084 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3088 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3089 if (!NT_SUCCESS(Status
))
3092 Status
= SampRegOpenKey(AliasesKeyHandle
,
3096 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3098 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3100 Status
= STATUS_SUCCESS
;
3104 if (!NT_SUCCESS(Status
))
3107 for (i
= 0; i
< SidArray
->Count
; i
++)
3109 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3110 TRACE("Open %S\n", MemberSidString
);
3112 Status
= SampRegOpenKey(MembersKeyHandle
,
3116 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3117 if (NT_SUCCESS(Status
))
3119 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3122 if (NT_SUCCESS(Status
))
3124 TRACE("Found %lu values\n", ValueCount
);
3125 MaxSidCount
+= ValueCount
;
3128 SampRegCloseKey(&MemberKeyHandle
);
3131 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3132 Status
= STATUS_SUCCESS
;
3134 LocalFree(MemberSidString
);
3137 if (MaxSidCount
== 0)
3139 Status
= STATUS_SUCCESS
;
3143 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
3144 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
3145 if (RidArray
== NULL
)
3147 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3151 for (i
= 0; i
< SidArray
->Count
; i
++)
3153 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3154 TRACE("Open %S\n", MemberSidString
);
3156 Status
= SampRegOpenKey(MembersKeyHandle
,
3160 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3161 if (NT_SUCCESS(Status
))
3163 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3166 if (NT_SUCCESS(Status
))
3168 TRACE("Found %lu values\n", ValueCount
);
3170 for (j
= 0; j
< ValueCount
; j
++)
3172 DataLength
= 9 * sizeof(WCHAR
);
3173 Status
= SampRegEnumerateValue(MemberKeyHandle
,
3180 if (NT_SUCCESS(Status
))
3182 RidArray
[j
] = wcstoul(NameBuffer
, NULL
, 16);
3187 SampRegCloseKey(&MemberKeyHandle
);
3190 LocalFree(MemberSidString
);
3194 SampRegCloseKey(&MembersKeyHandle
);
3195 SampRegCloseKey(&MembersKeyHandle
);
3196 SampRegCloseKey(&AliasesKeyHandle
);
3198 if (NT_SUCCESS(Status
))
3200 Membership
->Count
= MaxSidCount
;
3201 Membership
->Element
= RidArray
;
3205 if (RidArray
!= NULL
)
3206 midl_user_free(RidArray
);
3209 RtlReleaseResource(&SampResource
);
3218 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
3220 IN RPC_UNICODE_STRING Names
[],
3221 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
3222 OUT PSAMPR_ULONG_ARRAY Use
)
3224 PSAM_DB_OBJECT DomainObject
;
3225 HANDLE AccountsKeyHandle
= NULL
;
3226 HANDLE NamesKeyHandle
= NULL
;
3227 ULONG MappedCount
= 0;
3233 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
3234 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
3236 RtlAcquireResourceShared(&SampResource
,
3239 /* Validate the domain handle */
3240 Status
= SampValidateDbObject(DomainHandle
,
3244 if (!NT_SUCCESS(Status
))
3246 TRACE("failed with status 0x%08lx\n", Status
);
3250 RelativeIds
->Count
= 0;
3255 Status
= STATUS_SUCCESS
;
3259 /* Allocate the relative IDs array */
3260 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3261 if (RelativeIds
->Element
== NULL
)
3263 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3267 /* Allocate the use array */
3268 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3269 if (Use
->Element
== NULL
)
3271 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3275 RelativeIds
->Count
= Count
;
3278 for (i
= 0; i
< Count
; i
++)
3280 TRACE("Name: %S\n", Names
[i
].Buffer
);
3284 /* Lookup aliases */
3285 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3288 &AccountsKeyHandle
);
3289 if (NT_SUCCESS(Status
))
3291 Status
= SampRegOpenKey(AccountsKeyHandle
,
3295 if (NT_SUCCESS(Status
))
3297 DataLength
= sizeof(ULONG
);
3298 Status
= SampRegQueryValue(NamesKeyHandle
,
3304 SampRegCloseKey(&NamesKeyHandle
);
3307 SampRegCloseKey(&AccountsKeyHandle
);
3310 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3313 /* Return alias account */
3314 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3316 TRACE("Rid: %lu\n", RelativeId
);
3317 RelativeIds
->Element
[i
] = RelativeId
;
3318 Use
->Element
[i
] = SidTypeAlias
;
3324 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3327 &AccountsKeyHandle
);
3328 if (NT_SUCCESS(Status
))
3330 Status
= SampRegOpenKey(AccountsKeyHandle
,
3334 if (NT_SUCCESS(Status
))
3336 DataLength
= sizeof(ULONG
);
3337 Status
= SampRegQueryValue(NamesKeyHandle
,
3343 SampRegCloseKey(&NamesKeyHandle
);
3346 SampRegCloseKey(&AccountsKeyHandle
);
3349 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3352 /* Return group account */
3353 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3355 TRACE("Rid: %lu\n", RelativeId
);
3356 RelativeIds
->Element
[i
] = RelativeId
;
3357 Use
->Element
[i
] = SidTypeGroup
;
3363 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3366 &AccountsKeyHandle
);
3367 if (NT_SUCCESS(Status
))
3369 Status
= SampRegOpenKey(AccountsKeyHandle
,
3373 if (NT_SUCCESS(Status
))
3375 DataLength
= sizeof(ULONG
);
3376 Status
= SampRegQueryValue(NamesKeyHandle
,
3382 SampRegCloseKey(&NamesKeyHandle
);
3385 SampRegCloseKey(&AccountsKeyHandle
);
3388 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3391 /* Return user account */
3392 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3394 TRACE("Rid: %lu\n", RelativeId
);
3395 RelativeIds
->Element
[i
] = RelativeId
;
3396 Use
->Element
[i
] = SidTypeUser
;
3401 /* Return unknown account */
3402 RelativeIds
->Element
[i
] = 0;
3403 Use
->Element
[i
] = SidTypeUnknown
;
3407 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3408 Status
= STATUS_SUCCESS
;
3410 if (NT_SUCCESS(Status
))
3412 if (MappedCount
== 0)
3413 Status
= STATUS_NONE_MAPPED
;
3414 else if (MappedCount
< Count
)
3415 Status
= STATUS_SOME_NOT_MAPPED
;
3419 if (RelativeIds
->Element
!= NULL
)
3421 midl_user_free(RelativeIds
->Element
);
3422 RelativeIds
->Element
= NULL
;
3425 RelativeIds
->Count
= 0;
3427 if (Use
->Element
!= NULL
)
3429 midl_user_free(Use
->Element
);
3430 Use
->Element
= NULL
;
3436 RtlReleaseResource(&SampResource
);
3438 TRACE("Returned Status %lx\n", Status
);
3447 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3449 IN ULONG
*RelativeIds
,
3450 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3451 OUT PSAMPR_ULONG_ARRAY Use
)
3453 PSAM_DB_OBJECT DomainObject
;
3455 HANDLE AccountsKeyHandle
= NULL
;
3456 HANDLE AccountKeyHandle
= NULL
;
3457 ULONG MappedCount
= 0;
3462 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3463 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3465 RtlAcquireResourceShared(&SampResource
,
3468 /* Validate the domain handle */
3469 Status
= SampValidateDbObject(DomainHandle
,
3473 if (!NT_SUCCESS(Status
))
3475 TRACE("failed with status 0x%08lx\n", Status
);
3484 Status
= STATUS_SUCCESS
;
3488 /* Allocate the names array */
3489 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3490 if (Names
->Element
== NULL
)
3492 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3496 /* Allocate the use array */
3497 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3498 if (Use
->Element
== NULL
)
3500 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3504 Names
->Count
= Count
;
3507 for (i
= 0; i
< Count
; i
++)
3509 TRACE("RID: %lu\n", RelativeIds
[i
]);
3511 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3513 /* Lookup aliases */
3514 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3517 &AccountsKeyHandle
);
3518 if (NT_SUCCESS(Status
))
3520 Status
= SampRegOpenKey(AccountsKeyHandle
,
3524 if (NT_SUCCESS(Status
))
3527 Status
= SampRegQueryValue(AccountKeyHandle
,
3532 if (NT_SUCCESS(Status
))
3534 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3535 if (Names
->Element
[i
].Buffer
== NULL
)
3536 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3538 if (NT_SUCCESS(Status
))
3540 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3541 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3543 Status
= SampRegQueryValue(AccountKeyHandle
,
3546 Names
->Element
[i
].Buffer
,
3551 SampRegCloseKey(&AccountKeyHandle
);
3554 SampRegCloseKey(&AccountsKeyHandle
);
3557 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3560 /* Return alias account */
3561 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3563 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3564 Use
->Element
[i
] = SidTypeAlias
;
3570 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3573 &AccountsKeyHandle
);
3574 if (NT_SUCCESS(Status
))
3576 Status
= SampRegOpenKey(AccountsKeyHandle
,
3580 if (NT_SUCCESS(Status
))
3583 Status
= SampRegQueryValue(AccountKeyHandle
,
3588 if (NT_SUCCESS(Status
))
3590 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3591 if (Names
->Element
[i
].Buffer
== NULL
)
3592 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3594 if (NT_SUCCESS(Status
))
3596 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3597 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3599 Status
= SampRegQueryValue(AccountKeyHandle
,
3602 Names
->Element
[i
].Buffer
,
3607 SampRegCloseKey(&AccountKeyHandle
);
3610 SampRegCloseKey(&AccountsKeyHandle
);
3613 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3616 /* Return group account */
3617 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3619 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3620 Use
->Element
[i
] = SidTypeGroup
;
3626 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3629 &AccountsKeyHandle
);
3630 if (NT_SUCCESS(Status
))
3632 Status
= SampRegOpenKey(AccountsKeyHandle
,
3636 if (NT_SUCCESS(Status
))
3639 Status
= SampRegQueryValue(AccountKeyHandle
,
3644 if (NT_SUCCESS(Status
))
3646 TRACE("DataLength: %lu\n", DataLength
);
3648 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3649 if (Names
->Element
[i
].Buffer
== NULL
)
3650 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3652 if (NT_SUCCESS(Status
))
3654 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3655 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3657 Status
= SampRegQueryValue(AccountKeyHandle
,
3660 Names
->Element
[i
].Buffer
,
3665 SampRegCloseKey(&AccountKeyHandle
);
3668 SampRegCloseKey(&AccountsKeyHandle
);
3671 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3674 /* Return user account */
3675 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3677 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3678 Use
->Element
[i
] = SidTypeUser
;
3683 /* Return unknown account */
3684 Use
->Element
[i
] = SidTypeUnknown
;
3688 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3689 Status
= STATUS_SUCCESS
;
3691 if (NT_SUCCESS(Status
))
3693 if (MappedCount
== 0)
3694 Status
= STATUS_NONE_MAPPED
;
3695 else if (MappedCount
< Count
)
3696 Status
= STATUS_SOME_NOT_MAPPED
;
3700 if (Names
->Element
!= NULL
)
3702 for (i
= 0; i
< Count
; i
++)
3704 if (Names
->Element
[i
].Buffer
!= NULL
)
3705 midl_user_free(Names
->Element
[i
].Buffer
);
3708 midl_user_free(Names
->Element
);
3709 Names
->Element
= NULL
;
3714 if (Use
->Element
!= NULL
)
3716 midl_user_free(Use
->Element
);
3717 Use
->Element
= NULL
;
3723 RtlReleaseResource(&SampResource
);
3732 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3733 IN ACCESS_MASK DesiredAccess
,
3734 IN
unsigned long GroupId
,
3735 OUT SAMPR_HANDLE
*GroupHandle
)
3737 PSAM_DB_OBJECT DomainObject
;
3738 PSAM_DB_OBJECT GroupObject
;
3742 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3743 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3745 /* Map generic access rights */
3746 RtlMapGenericMask(&DesiredAccess
,
3749 RtlAcquireResourceShared(&SampResource
,
3752 /* Validate the domain handle */
3753 Status
= SampValidateDbObject(DomainHandle
,
3757 if (!NT_SUCCESS(Status
))
3759 TRACE("failed with status 0x%08lx\n", Status
);
3763 /* Convert the RID into a string (hex) */
3764 swprintf(szRid
, L
"%08lX", GroupId
);
3766 /* Create the group object */
3767 Status
= SampOpenDbObject(DomainObject
,
3774 if (!NT_SUCCESS(Status
))
3776 TRACE("failed with status 0x%08lx\n", Status
);
3780 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3783 RtlReleaseResource(&SampResource
);
3790 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3791 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3793 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3794 SAM_GROUP_FIXED_DATA FixedData
;
3795 ULONG MembersLength
= 0;
3801 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3802 if (InfoBuffer
== NULL
)
3803 return STATUS_INSUFFICIENT_RESOURCES
;
3805 Status
= SampGetObjectAttributeString(GroupObject
,
3807 &InfoBuffer
->General
.Name
);
3808 if (!NT_SUCCESS(Status
))
3810 TRACE("Status 0x%08lx\n", Status
);
3814 Status
= SampGetObjectAttributeString(GroupObject
,
3816 &InfoBuffer
->General
.AdminComment
);
3817 if (!NT_SUCCESS(Status
))
3819 TRACE("Status 0x%08lx\n", Status
);
3823 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3824 Status
= SampGetObjectAttribute(GroupObject
,
3829 if (!NT_SUCCESS(Status
))
3832 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3834 Status
= SampGetObjectAttribute(GroupObject
,
3839 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3842 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3843 InfoBuffer
->General
.MemberCount
= 0;
3845 InfoBuffer
->General
.MemberCount
= MembersLength
/ sizeof(ULONG
);
3847 *Buffer
= InfoBuffer
;
3850 if (!NT_SUCCESS(Status
))
3852 if (InfoBuffer
!= NULL
)
3854 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3855 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3857 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3858 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3860 midl_user_free(InfoBuffer
);
3869 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3870 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3872 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3877 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3878 if (InfoBuffer
== NULL
)
3879 return STATUS_INSUFFICIENT_RESOURCES
;
3881 Status
= SampGetObjectAttributeString(GroupObject
,
3883 &InfoBuffer
->Name
.Name
);
3884 if (!NT_SUCCESS(Status
))
3886 TRACE("Status 0x%08lx\n", Status
);
3890 *Buffer
= InfoBuffer
;
3893 if (!NT_SUCCESS(Status
))
3895 if (InfoBuffer
!= NULL
)
3897 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3898 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3900 midl_user_free(InfoBuffer
);
3909 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3910 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3912 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3913 SAM_GROUP_FIXED_DATA FixedData
;
3919 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3920 if (InfoBuffer
== NULL
)
3921 return STATUS_INSUFFICIENT_RESOURCES
;
3923 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3924 Status
= SampGetObjectAttribute(GroupObject
,
3929 if (!NT_SUCCESS(Status
))
3932 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3934 *Buffer
= InfoBuffer
;
3937 if (!NT_SUCCESS(Status
))
3939 if (InfoBuffer
!= NULL
)
3941 midl_user_free(InfoBuffer
);
3950 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3951 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3953 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3958 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3959 if (InfoBuffer
== NULL
)
3960 return STATUS_INSUFFICIENT_RESOURCES
;
3962 Status
= SampGetObjectAttributeString(GroupObject
,
3964 &InfoBuffer
->AdminComment
.AdminComment
);
3965 if (!NT_SUCCESS(Status
))
3967 TRACE("Status 0x%08lx\n", Status
);
3971 *Buffer
= InfoBuffer
;
3974 if (!NT_SUCCESS(Status
))
3976 if (InfoBuffer
!= NULL
)
3978 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3979 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3981 midl_user_free(InfoBuffer
);
3992 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3993 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3994 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3996 PSAM_DB_OBJECT GroupObject
;
3999 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
4000 GroupHandle
, GroupInformationClass
, Buffer
);
4002 RtlAcquireResourceShared(&SampResource
,
4005 /* Validate the group handle */
4006 Status
= SampValidateDbObject(GroupHandle
,
4008 GROUP_READ_INFORMATION
,
4010 if (!NT_SUCCESS(Status
))
4013 switch (GroupInformationClass
)
4015 case GroupGeneralInformation
:
4016 Status
= SampQueryGroupGeneral(GroupObject
,
4020 case GroupNameInformation
:
4021 Status
= SampQueryGroupName(GroupObject
,
4025 case GroupAttributeInformation
:
4026 Status
= SampQueryGroupAttribute(GroupObject
,
4030 case GroupAdminCommentInformation
:
4031 Status
= SampQueryGroupAdminComment(GroupObject
,
4036 Status
= STATUS_INVALID_INFO_CLASS
;
4041 RtlReleaseResource(&SampResource
);
4048 SampSetGroupName(PSAM_DB_OBJECT GroupObject
,
4049 PSAMPR_GROUP_INFO_BUFFER Buffer
)
4051 UNICODE_STRING OldGroupName
= {0, 0, NULL
};
4052 UNICODE_STRING NewGroupName
;
4055 Status
= SampGetObjectAttributeString(GroupObject
,
4057 (PRPC_UNICODE_STRING
)&OldGroupName
);
4058 if (!NT_SUCCESS(Status
))
4060 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
4064 /* Check the new account name */
4065 Status
= SampCheckAccountName(&Buffer
->Name
.Name
, 256);
4066 if (!NT_SUCCESS(Status
))
4068 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
4072 NewGroupName
.Length
= Buffer
->Name
.Name
.Length
;
4073 NewGroupName
.MaximumLength
= Buffer
->Name
.Name
.MaximumLength
;
4074 NewGroupName
.Buffer
= Buffer
->Name
.Name
.Buffer
;
4076 if (!RtlEqualUnicodeString(&OldGroupName
, &NewGroupName
, TRUE
))
4078 Status
= SampCheckAccountNameInDomain(GroupObject
->ParentObject
,
4079 NewGroupName
.Buffer
);
4080 if (!NT_SUCCESS(Status
))
4082 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
4083 NewGroupName
.Buffer
, Status
);
4088 Status
= SampSetAccountNameInDomain(GroupObject
->ParentObject
,
4090 NewGroupName
.Buffer
,
4091 GroupObject
->RelativeId
);
4092 if (!NT_SUCCESS(Status
))
4094 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
4098 Status
= SampRemoveAccountNameFromDomain(GroupObject
->ParentObject
,
4100 OldGroupName
.Buffer
);
4101 if (!NT_SUCCESS(Status
))
4103 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
4107 Status
= SampSetObjectAttributeString(GroupObject
,
4109 (PRPC_UNICODE_STRING
)&NewGroupName
);
4110 if (!NT_SUCCESS(Status
))
4112 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
4116 if (OldGroupName
.Buffer
!= NULL
)
4117 midl_user_free(OldGroupName
.Buffer
);
4124 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
4125 PSAMPR_GROUP_INFO_BUFFER Buffer
)
4127 SAM_GROUP_FIXED_DATA FixedData
;
4131 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
4132 Status
= SampGetObjectAttribute(GroupObject
,
4137 if (!NT_SUCCESS(Status
))
4140 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
4142 Status
= SampSetObjectAttribute(GroupObject
,
4156 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
4157 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
4158 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
4160 PSAM_DB_OBJECT GroupObject
;
4163 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
4164 GroupHandle
, GroupInformationClass
, Buffer
);
4166 RtlAcquireResourceExclusive(&SampResource
,
4169 /* Validate the group handle */
4170 Status
= SampValidateDbObject(GroupHandle
,
4172 GROUP_WRITE_ACCOUNT
,
4174 if (!NT_SUCCESS(Status
))
4177 switch (GroupInformationClass
)
4179 case GroupNameInformation
:
4180 Status
= SampSetGroupName(GroupObject
,
4184 case GroupAttributeInformation
:
4185 Status
= SampSetGroupAttribute(GroupObject
,
4189 case GroupAdminCommentInformation
:
4190 Status
= SampSetObjectAttributeString(GroupObject
,
4192 &Buffer
->AdminComment
.AdminComment
);
4196 Status
= STATUS_INVALID_INFO_CLASS
;
4201 RtlReleaseResource(&SampResource
);
4210 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
4211 IN
unsigned long MemberId
,
4212 IN
unsigned long Attributes
)
4214 PSAM_DB_OBJECT GroupObject
;
4215 PSAM_DB_OBJECT UserObject
= NULL
;
4218 TRACE("(%p %lu %lx)\n",
4219 GroupHandle
, MemberId
, Attributes
);
4221 RtlAcquireResourceExclusive(&SampResource
,
4224 /* Validate the group handle */
4225 Status
= SampValidateDbObject(GroupHandle
,
4229 if (!NT_SUCCESS(Status
))
4232 /* Open the user object in the same domain */
4233 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4237 if (!NT_SUCCESS(Status
))
4239 TRACE("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4243 /* Add group membership to the user object */
4244 Status
= SampAddGroupMembershipToUser(UserObject
,
4245 GroupObject
->RelativeId
,
4247 if (!NT_SUCCESS(Status
))
4249 TRACE("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4253 /* Add the member to the group object */
4254 Status
= SampAddMemberToGroup(GroupObject
,
4256 if (!NT_SUCCESS(Status
))
4258 TRACE("SampAddMemberToGroup() failed (Status 0x%08lx)\n", Status
);
4263 SampCloseDbObject(UserObject
);
4265 RtlReleaseResource(&SampResource
);
4274 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
4276 PSAM_DB_OBJECT GroupObject
;
4280 TRACE("(%p)\n", GroupHandle
);
4282 RtlAcquireResourceExclusive(&SampResource
,
4285 /* Validate the group handle */
4286 Status
= SampValidateDbObject(*GroupHandle
,
4290 if (!NT_SUCCESS(Status
))
4292 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
4296 /* Fail, if the group is built-in */
4297 if (GroupObject
->RelativeId
< 1000)
4299 TRACE("You can not delete a special account!\n");
4300 Status
= STATUS_SPECIAL_ACCOUNT
;
4304 /* Get the length of the Members attribute */
4305 SampGetObjectAttribute(GroupObject
,
4311 /* Fail, if the group has members */
4314 TRACE("There are still members in the group!\n");
4315 Status
= STATUS_MEMBER_IN_GROUP
;
4319 /* FIXME: Remove the group from all aliases */
4321 /* Delete the group from the database */
4322 Status
= SampDeleteAccountDbObject(GroupObject
);
4323 if (!NT_SUCCESS(Status
))
4325 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4329 /* Invalidate the handle */
4330 *GroupHandle
= NULL
;
4333 RtlReleaseResource(&SampResource
);
4342 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
4343 IN
unsigned long MemberId
)
4345 PSAM_DB_OBJECT GroupObject
;
4346 PSAM_DB_OBJECT UserObject
= NULL
;
4350 GroupHandle
, MemberId
);
4352 RtlAcquireResourceExclusive(&SampResource
,
4355 /* Validate the group handle */
4356 Status
= SampValidateDbObject(GroupHandle
,
4358 GROUP_REMOVE_MEMBER
,
4360 if (!NT_SUCCESS(Status
))
4363 /* Open the user object in the same domain */
4364 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4368 if (!NT_SUCCESS(Status
))
4370 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4374 /* Remove group membership from the user object */
4375 Status
= SampRemoveGroupMembershipFromUser(UserObject
,
4376 GroupObject
->RelativeId
);
4377 if (!NT_SUCCESS(Status
))
4379 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4383 /* Remove the member from the group object */
4384 Status
= SampRemoveMemberFromGroup(GroupObject
,
4386 if (!NT_SUCCESS(Status
))
4388 ERR("SampRemoveMemberFromGroup() failed (Status 0x%08lx)\n", Status
);
4393 SampCloseDbObject(UserObject
);
4395 RtlReleaseResource(&SampResource
);
4404 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
4405 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
4407 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
4408 PSAM_DB_OBJECT GroupObject
;
4413 RtlAcquireResourceShared(&SampResource
,
4416 /* Validate the group handle */
4417 Status
= SampValidateDbObject(GroupHandle
,
4421 if (!NT_SUCCESS(Status
))
4424 MembersBuffer
= midl_user_allocate(sizeof(SAMPR_GET_MEMBERS_BUFFER
));
4425 if (MembersBuffer
== NULL
)
4427 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4431 SampGetObjectAttribute(GroupObject
,
4439 MembersBuffer
->MemberCount
= 0;
4440 MembersBuffer
->Members
= NULL
;
4441 MembersBuffer
->Attributes
= NULL
;
4443 *Members
= MembersBuffer
;
4445 Status
= STATUS_SUCCESS
;
4449 MembersBuffer
->Members
= midl_user_allocate(Length
);
4450 if (MembersBuffer
->Members
== NULL
)
4452 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4456 MembersBuffer
->Attributes
= midl_user_allocate(Length
);
4457 if (MembersBuffer
->Attributes
== NULL
)
4459 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4463 Status
= SampGetObjectAttribute(GroupObject
,
4466 MembersBuffer
->Members
,
4468 if (!NT_SUCCESS(Status
))
4470 TRACE("SampGetObjectAttributes() failed (Status 0x%08lx)\n", Status
);
4474 MembersBuffer
->MemberCount
= Length
/ sizeof(ULONG
);
4476 for (i
= 0; i
< MembersBuffer
->MemberCount
; i
++)
4478 Status
= SampGetUserGroupAttributes(GroupObject
->ParentObject
,
4479 MembersBuffer
->Members
[i
],
4480 GroupObject
->RelativeId
,
4481 &(MembersBuffer
->Attributes
[i
]));
4482 if (!NT_SUCCESS(Status
))
4484 TRACE("SampGetUserGroupAttributes() failed (Status 0x%08lx)\n", Status
);
4489 *Members
= MembersBuffer
;
4492 if (!NT_SUCCESS(Status
))
4494 if (MembersBuffer
!= NULL
)
4496 if (MembersBuffer
->Members
!= NULL
)
4497 midl_user_free(MembersBuffer
->Members
);
4499 if (MembersBuffer
->Attributes
!= NULL
)
4500 midl_user_free(MembersBuffer
->Attributes
);
4502 midl_user_free(MembersBuffer
);
4506 RtlReleaseResource(&SampResource
);
4515 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
4516 IN
unsigned long MemberId
,
4517 IN
unsigned long Attributes
)
4519 PSAM_DB_OBJECT GroupObject
;
4522 RtlAcquireResourceExclusive(&SampResource
,
4525 /* Validate the group handle */
4526 Status
= SampValidateDbObject(GroupHandle
,
4530 if (!NT_SUCCESS(Status
))
4532 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
4536 Status
= SampSetUserGroupAttributes(GroupObject
->ParentObject
,
4538 GroupObject
->RelativeId
,
4540 if (!NT_SUCCESS(Status
))
4542 TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status
);
4546 RtlReleaseResource(&SampResource
);
4555 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
4556 IN ACCESS_MASK DesiredAccess
,
4558 OUT SAMPR_HANDLE
*AliasHandle
)
4560 PSAM_DB_OBJECT DomainObject
;
4561 PSAM_DB_OBJECT AliasObject
;
4565 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4566 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4568 /* Map generic access rights */
4569 RtlMapGenericMask(&DesiredAccess
,
4572 RtlAcquireResourceShared(&SampResource
,
4575 /* Validate the domain handle */
4576 Status
= SampValidateDbObject(DomainHandle
,
4580 if (!NT_SUCCESS(Status
))
4582 TRACE("failed with status 0x%08lx\n", Status
);
4586 /* Convert the RID into a string (hex) */
4587 swprintf(szRid
, L
"%08lX", AliasId
);
4589 /* Create the alias object */
4590 Status
= SampOpenDbObject(DomainObject
,
4597 if (!NT_SUCCESS(Status
))
4599 TRACE("failed with status 0x%08lx\n", Status
);
4603 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4606 RtlReleaseResource(&SampResource
);
4613 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4614 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4616 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4617 HANDLE MembersKeyHandle
= NULL
;
4622 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4623 if (InfoBuffer
== NULL
)
4624 return STATUS_INSUFFICIENT_RESOURCES
;
4626 Status
= SampGetObjectAttributeString(AliasObject
,
4628 &InfoBuffer
->General
.Name
);
4629 if (!NT_SUCCESS(Status
))
4631 TRACE("Status 0x%08lx\n", Status
);
4635 Status
= SampGetObjectAttributeString(AliasObject
,
4637 &InfoBuffer
->General
.AdminComment
);
4638 if (!NT_SUCCESS(Status
))
4640 TRACE("Status 0x%08lx\n", Status
);
4644 /* Open the Members subkey */
4645 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4649 if (NT_SUCCESS(Status
))
4651 /* Retrieve the number of members of the alias */
4652 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4654 &InfoBuffer
->General
.MemberCount
);
4655 if (!NT_SUCCESS(Status
))
4657 TRACE("Status 0x%08lx\n", Status
);
4661 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4663 InfoBuffer
->General
.MemberCount
= 0;
4664 Status
= STATUS_SUCCESS
;
4668 TRACE("Status 0x%08lx\n", Status
);
4672 *Buffer
= InfoBuffer
;
4675 SampRegCloseKey(&MembersKeyHandle
);
4677 if (!NT_SUCCESS(Status
))
4679 if (InfoBuffer
!= NULL
)
4681 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4682 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4684 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4685 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4687 midl_user_free(InfoBuffer
);
4696 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4697 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4699 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4704 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4705 if (InfoBuffer
== NULL
)
4706 return STATUS_INSUFFICIENT_RESOURCES
;
4708 Status
= SampGetObjectAttributeString(AliasObject
,
4710 &InfoBuffer
->Name
.Name
);
4711 if (!NT_SUCCESS(Status
))
4713 TRACE("Status 0x%08lx\n", Status
);
4717 *Buffer
= InfoBuffer
;
4720 if (!NT_SUCCESS(Status
))
4722 if (InfoBuffer
!= NULL
)
4724 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4725 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4727 midl_user_free(InfoBuffer
);
4736 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4737 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4739 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4744 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4745 if (InfoBuffer
== NULL
)
4746 return STATUS_INSUFFICIENT_RESOURCES
;
4748 Status
= SampGetObjectAttributeString(AliasObject
,
4750 &InfoBuffer
->AdminComment
.AdminComment
);
4751 if (!NT_SUCCESS(Status
))
4753 TRACE("Status 0x%08lx\n", Status
);
4757 *Buffer
= InfoBuffer
;
4760 if (!NT_SUCCESS(Status
))
4762 if (InfoBuffer
!= NULL
)
4764 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4765 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4767 midl_user_free(InfoBuffer
);
4778 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4779 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4780 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4782 PSAM_DB_OBJECT AliasObject
;
4785 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4786 AliasHandle
, AliasInformationClass
, Buffer
);
4788 RtlAcquireResourceShared(&SampResource
,
4791 /* Validate the alias handle */
4792 Status
= SampValidateDbObject(AliasHandle
,
4794 ALIAS_READ_INFORMATION
,
4796 if (!NT_SUCCESS(Status
))
4799 switch (AliasInformationClass
)
4801 case AliasGeneralInformation
:
4802 Status
= SampQueryAliasGeneral(AliasObject
,
4806 case AliasNameInformation
:
4807 Status
= SampQueryAliasName(AliasObject
,
4811 case AliasAdminCommentInformation
:
4812 Status
= SampQueryAliasAdminComment(AliasObject
,
4817 Status
= STATUS_INVALID_INFO_CLASS
;
4822 RtlReleaseResource(&SampResource
);
4829 SampSetAliasName(PSAM_DB_OBJECT AliasObject
,
4830 PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4832 UNICODE_STRING OldAliasName
= {0, 0, NULL
};
4833 UNICODE_STRING NewAliasName
;
4836 Status
= SampGetObjectAttributeString(AliasObject
,
4838 (PRPC_UNICODE_STRING
)&OldAliasName
);
4839 if (!NT_SUCCESS(Status
))
4841 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
4845 /* Check the new account name */
4846 Status
= SampCheckAccountName(&Buffer
->Name
.Name
, 256);
4847 if (!NT_SUCCESS(Status
))
4849 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
4853 NewAliasName
.Length
= Buffer
->Name
.Name
.Length
;
4854 NewAliasName
.MaximumLength
= Buffer
->Name
.Name
.MaximumLength
;
4855 NewAliasName
.Buffer
= Buffer
->Name
.Name
.Buffer
;
4857 if (!RtlEqualUnicodeString(&OldAliasName
, &NewAliasName
, TRUE
))
4859 Status
= SampCheckAccountNameInDomain(AliasObject
->ParentObject
,
4860 NewAliasName
.Buffer
);
4861 if (!NT_SUCCESS(Status
))
4863 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
4864 NewAliasName
.Buffer
, Status
);
4869 Status
= SampSetAccountNameInDomain(AliasObject
->ParentObject
,
4871 NewAliasName
.Buffer
,
4872 AliasObject
->RelativeId
);
4873 if (!NT_SUCCESS(Status
))
4875 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
4879 Status
= SampRemoveAccountNameFromDomain(AliasObject
->ParentObject
,
4881 OldAliasName
.Buffer
);
4882 if (!NT_SUCCESS(Status
))
4884 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
4888 Status
= SampSetObjectAttributeString(AliasObject
,
4890 (PRPC_UNICODE_STRING
)&NewAliasName
);
4891 if (!NT_SUCCESS(Status
))
4893 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
4897 if (OldAliasName
.Buffer
!= NULL
)
4898 midl_user_free(OldAliasName
.Buffer
);
4907 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4908 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4909 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4911 PSAM_DB_OBJECT AliasObject
;
4914 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4915 AliasHandle
, AliasInformationClass
, Buffer
);
4917 RtlAcquireResourceExclusive(&SampResource
,
4920 /* Validate the alias handle */
4921 Status
= SampValidateDbObject(AliasHandle
,
4923 ALIAS_WRITE_ACCOUNT
,
4925 if (!NT_SUCCESS(Status
))
4928 switch (AliasInformationClass
)
4930 case AliasNameInformation
:
4931 Status
= SampSetAliasName(AliasObject
,
4935 case AliasAdminCommentInformation
:
4936 Status
= SampSetObjectAttributeString(AliasObject
,
4938 &Buffer
->AdminComment
.AdminComment
);
4942 Status
= STATUS_INVALID_INFO_CLASS
;
4947 RtlReleaseResource(&SampResource
);
4956 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4958 PSAM_DB_OBJECT AliasObject
;
4961 RtlAcquireResourceExclusive(&SampResource
,
4964 /* Validate the alias handle */
4965 Status
= SampValidateDbObject(*AliasHandle
,
4969 if (!NT_SUCCESS(Status
))
4971 TRACE("SampValidateDbObject failed (Status 0x%08lx)\n", Status
);
4975 /* Fail, if the alias is built-in */
4976 if (AliasObject
->RelativeId
< 1000)
4978 TRACE("You can not delete a special account!\n");
4979 Status
= STATUS_SPECIAL_ACCOUNT
;
4983 /* Remove all members from the alias */
4984 Status
= SampRemoveAllMembersFromAlias(AliasObject
);
4985 if (!NT_SUCCESS(Status
))
4987 TRACE("SampRemoveAllMembersFromAlias() failed (Status 0x%08lx)\n", Status
);
4991 /* Delete the alias from the database */
4992 Status
= SampDeleteAccountDbObject(AliasObject
);
4993 if (!NT_SUCCESS(Status
))
4995 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4999 /* Invalidate the handle */
5000 *AliasHandle
= NULL
;
5003 RtlReleaseResource(&SampResource
);
5012 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
5013 IN PRPC_SID MemberId
)
5015 PSAM_DB_OBJECT AliasObject
;
5018 TRACE("(%p %p)\n", AliasHandle
, MemberId
);
5020 RtlAcquireResourceExclusive(&SampResource
,
5023 /* Validate the alias handle */
5024 Status
= SampValidateDbObject(AliasHandle
,
5028 if (!NT_SUCCESS(Status
))
5030 TRACE("failed with status 0x%08lx\n", Status
);
5034 Status
= SampAddMemberToAlias(AliasObject
,
5036 if (!NT_SUCCESS(Status
))
5038 TRACE("failed with status 0x%08lx\n", Status
);
5042 RtlReleaseResource(&SampResource
);
5051 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
5052 IN PRPC_SID MemberId
)
5054 PSAM_DB_OBJECT AliasObject
;
5057 TRACE("(%p %p)\n", AliasHandle
, MemberId
);
5059 RtlAcquireResourceExclusive(&SampResource
,
5062 /* Validate the alias handle */
5063 Status
= SampValidateDbObject(AliasHandle
,
5065 ALIAS_REMOVE_MEMBER
,
5067 if (!NT_SUCCESS(Status
))
5069 TRACE("failed with status 0x%08lx\n", Status
);
5073 Status
= SampRemoveMemberFromAlias(AliasObject
,
5075 if (!NT_SUCCESS(Status
))
5077 TRACE("failed with status 0x%08lx\n", Status
);
5081 RtlReleaseResource(&SampResource
);
5090 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
5091 OUT PSAMPR_PSID_ARRAY_OUT Members
)
5093 PSAM_DB_OBJECT AliasObject
;
5094 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
5095 ULONG MemberCount
= 0;
5099 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
5100 AliasHandle
, Members
);
5102 RtlAcquireResourceShared(&SampResource
,
5105 /* Validate the alias handle */
5106 Status
= SampValidateDbObject(AliasHandle
,
5110 if (!NT_SUCCESS(Status
))
5112 ERR("failed with status 0x%08lx\n", Status
);
5116 Status
= SampGetMembersInAlias(AliasObject
,
5120 /* Return the number of members and the member array */
5121 if (NT_SUCCESS(Status
))
5123 Members
->Count
= MemberCount
;
5124 Members
->Sids
= MemberArray
;
5128 /* Clean up the members array and the SID buffers if something failed */
5129 if (!NT_SUCCESS(Status
))
5131 if (MemberArray
!= NULL
)
5133 for (Index
= 0; Index
< MemberCount
; Index
++)
5135 if (MemberArray
[Index
].SidPointer
!= NULL
)
5136 midl_user_free(MemberArray
[Index
].SidPointer
);
5139 midl_user_free(MemberArray
);
5143 RtlReleaseResource(&SampResource
);
5152 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
5153 IN ACCESS_MASK DesiredAccess
,
5154 IN
unsigned long UserId
,
5155 OUT SAMPR_HANDLE
*UserHandle
)
5157 PSAM_DB_OBJECT DomainObject
;
5158 PSAM_DB_OBJECT UserObject
;
5162 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
5163 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
5165 /* Map generic access rights */
5166 RtlMapGenericMask(&DesiredAccess
,
5169 RtlAcquireResourceShared(&SampResource
,
5172 /* Validate the domain handle */
5173 Status
= SampValidateDbObject(DomainHandle
,
5177 if (!NT_SUCCESS(Status
))
5179 TRACE("failed with status 0x%08lx\n", Status
);
5183 /* Convert the RID into a string (hex) */
5184 swprintf(szRid
, L
"%08lX", UserId
);
5186 /* Create the user object */
5187 Status
= SampOpenDbObject(DomainObject
,
5194 if (!NT_SUCCESS(Status
))
5196 TRACE("failed with status 0x%08lx\n", Status
);
5200 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
5203 RtlReleaseResource(&SampResource
);
5212 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
5214 PSAM_DB_OBJECT UserObject
;
5217 TRACE("(%p)\n", UserHandle
);
5219 RtlAcquireResourceExclusive(&SampResource
,
5222 /* Validate the user handle */
5223 Status
= SampValidateDbObject(*UserHandle
,
5227 if (!NT_SUCCESS(Status
))
5229 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
5233 /* Fail, if the user is built-in */
5234 if (UserObject
->RelativeId
< 1000)
5236 TRACE("You can not delete a special account!\n");
5237 Status
= STATUS_SPECIAL_ACCOUNT
;
5241 /* FIXME: Remove the user from all groups */
5243 /* FIXME: Remove the user from all aliases */
5245 /* Delete the user from the database */
5246 Status
= SampDeleteAccountDbObject(UserObject
);
5247 if (!NT_SUCCESS(Status
))
5249 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5253 /* Invalidate the handle */
5257 RtlReleaseResource(&SampResource
);
5265 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
5266 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5268 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5269 SAM_USER_FIXED_DATA FixedData
;
5275 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5276 if (InfoBuffer
== NULL
)
5277 return STATUS_INSUFFICIENT_RESOURCES
;
5279 Length
= sizeof(SAM_USER_FIXED_DATA
);
5280 Status
= SampGetObjectAttribute(UserObject
,
5285 if (!NT_SUCCESS(Status
))
5288 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5290 /* Get the Name string */
5291 Status
= SampGetObjectAttributeString(UserObject
,
5293 &InfoBuffer
->General
.UserName
);
5294 if (!NT_SUCCESS(Status
))
5296 TRACE("Status 0x%08lx\n", Status
);
5300 /* Get the FullName string */
5301 Status
= SampGetObjectAttributeString(UserObject
,
5303 &InfoBuffer
->General
.FullName
);
5304 if (!NT_SUCCESS(Status
))
5306 TRACE("Status 0x%08lx\n", Status
);
5310 /* Get the AdminComment string */
5311 Status
= SampGetObjectAttributeString(UserObject
,
5313 &InfoBuffer
->General
.AdminComment
);
5314 if (!NT_SUCCESS(Status
))
5316 TRACE("Status 0x%08lx\n", Status
);
5320 /* Get the UserComment string */
5321 Status
= SampGetObjectAttributeString(UserObject
,
5323 &InfoBuffer
->General
.UserComment
);
5324 if (!NT_SUCCESS(Status
))
5326 TRACE("Status 0x%08lx\n", Status
);
5330 *Buffer
= InfoBuffer
;
5333 if (!NT_SUCCESS(Status
))
5335 if (InfoBuffer
!= NULL
)
5337 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
5338 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
5340 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
5341 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
5343 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
5344 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
5346 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
5347 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
5349 midl_user_free(InfoBuffer
);
5359 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
5360 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5362 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5363 SAM_USER_FIXED_DATA FixedData
;
5369 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5370 if (InfoBuffer
== NULL
)
5371 return STATUS_INSUFFICIENT_RESOURCES
;
5373 Length
= sizeof(SAM_USER_FIXED_DATA
);
5374 Status
= SampGetObjectAttribute(UserObject
,
5379 if (!NT_SUCCESS(Status
))
5382 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
5383 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
5385 /* Get the UserComment string */
5386 Status
= SampGetObjectAttributeString(UserObject
,
5388 &InfoBuffer
->Preferences
.UserComment
);
5389 if (!NT_SUCCESS(Status
))
5391 TRACE("Status 0x%08lx\n", Status
);
5395 *Buffer
= InfoBuffer
;
5398 if (!NT_SUCCESS(Status
))
5400 if (InfoBuffer
!= NULL
)
5402 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
5403 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
5405 midl_user_free(InfoBuffer
);
5415 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
5416 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5418 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5419 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
5420 SAM_USER_FIXED_DATA FixedData
;
5421 LARGE_INTEGER PasswordCanChange
;
5422 LARGE_INTEGER PasswordMustChange
;
5428 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5429 if (InfoBuffer
== NULL
)
5430 return STATUS_INSUFFICIENT_RESOURCES
;
5432 /* Get the fixed size domain data */
5433 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
5434 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
5437 (PVOID
)&DomainFixedData
,
5439 if (!NT_SUCCESS(Status
))
5442 /* Get the fixed size user data */
5443 Length
= sizeof(SAM_USER_FIXED_DATA
);
5444 Status
= SampGetObjectAttribute(UserObject
,
5449 if (!NT_SUCCESS(Status
))
5452 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
5453 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5454 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5455 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5456 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5457 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5458 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5459 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5460 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5461 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
5462 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
5464 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5465 DomainFixedData
.MinPasswordAge
);
5466 InfoBuffer
->Logon
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
5467 InfoBuffer
->Logon
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
5469 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5470 DomainFixedData
.MaxPasswordAge
);
5471 InfoBuffer
->Logon
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
5472 InfoBuffer
->Logon
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
5474 /* Get the Name string */
5475 Status
= SampGetObjectAttributeString(UserObject
,
5477 &InfoBuffer
->Logon
.UserName
);
5478 if (!NT_SUCCESS(Status
))
5480 TRACE("Status 0x%08lx\n", Status
);
5484 /* Get the FullName string */
5485 Status
= SampGetObjectAttributeString(UserObject
,
5487 &InfoBuffer
->Logon
.FullName
);
5488 if (!NT_SUCCESS(Status
))
5490 TRACE("Status 0x%08lx\n", Status
);
5494 /* Get the HomeDirectory string */
5495 Status
= SampGetObjectAttributeString(UserObject
,
5497 &InfoBuffer
->Logon
.HomeDirectory
);
5498 if (!NT_SUCCESS(Status
))
5500 TRACE("Status 0x%08lx\n", Status
);
5504 /* Get the HomeDirectoryDrive string */
5505 Status
= SampGetObjectAttributeString(UserObject
,
5506 L
"HomeDirectoryDrive",
5507 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
5508 if (!NT_SUCCESS(Status
))
5510 TRACE("Status 0x%08lx\n", Status
);
5514 /* Get the ScriptPath string */
5515 Status
= SampGetObjectAttributeString(UserObject
,
5517 &InfoBuffer
->Logon
.ScriptPath
);
5518 if (!NT_SUCCESS(Status
))
5520 TRACE("Status 0x%08lx\n", Status
);
5524 /* Get the ProfilePath string */
5525 Status
= SampGetObjectAttributeString(UserObject
,
5527 &InfoBuffer
->Logon
.ProfilePath
);
5528 if (!NT_SUCCESS(Status
))
5530 TRACE("Status 0x%08lx\n", Status
);
5534 /* Get the WorkStations string */
5535 Status
= SampGetObjectAttributeString(UserObject
,
5537 &InfoBuffer
->Logon
.WorkStations
);
5538 if (!NT_SUCCESS(Status
))
5540 TRACE("Status 0x%08lx\n", Status
);
5544 /* Get the LogonHours attribute */
5545 Status
= SampGetLogonHoursAttrbute(UserObject
,
5546 &InfoBuffer
->Logon
.LogonHours
);
5547 if (!NT_SUCCESS(Status
))
5549 TRACE("Status 0x%08lx\n", Status
);
5553 *Buffer
= InfoBuffer
;
5556 if (!NT_SUCCESS(Status
))
5558 if (InfoBuffer
!= NULL
)
5560 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
5561 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
5563 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
5564 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
5566 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
5567 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5569 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5570 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5572 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5573 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5575 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5576 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5578 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5579 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5581 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5582 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5584 midl_user_free(InfoBuffer
);
5594 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5595 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5597 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5598 SAM_USER_FIXED_DATA FixedData
;
5604 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5605 if (InfoBuffer
== NULL
)
5606 return STATUS_INSUFFICIENT_RESOURCES
;
5608 Length
= sizeof(SAM_USER_FIXED_DATA
);
5609 Status
= SampGetObjectAttribute(UserObject
,
5614 if (!NT_SUCCESS(Status
))
5617 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5618 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5619 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5620 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5621 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5622 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5623 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5624 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5625 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5626 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5627 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5628 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
5629 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
5631 /* Get the Name string */
5632 Status
= SampGetObjectAttributeString(UserObject
,
5634 &InfoBuffer
->Account
.UserName
);
5635 if (!NT_SUCCESS(Status
))
5637 TRACE("Status 0x%08lx\n", Status
);
5641 /* Get the FullName string */
5642 Status
= SampGetObjectAttributeString(UserObject
,
5644 &InfoBuffer
->Account
.FullName
);
5645 if (!NT_SUCCESS(Status
))
5647 TRACE("Status 0x%08lx\n", Status
);
5651 /* Get the HomeDirectory string */
5652 Status
= SampGetObjectAttributeString(UserObject
,
5654 &InfoBuffer
->Account
.HomeDirectory
);
5655 if (!NT_SUCCESS(Status
))
5657 TRACE("Status 0x%08lx\n", Status
);
5661 /* Get the HomeDirectoryDrive string */
5662 Status
= SampGetObjectAttributeString(UserObject
,
5663 L
"HomeDirectoryDrive",
5664 &InfoBuffer
->Account
.HomeDirectoryDrive
);
5665 if (!NT_SUCCESS(Status
))
5667 TRACE("Status 0x%08lx\n", Status
);
5671 /* Get the ScriptPath string */
5672 Status
= SampGetObjectAttributeString(UserObject
,
5674 &InfoBuffer
->Account
.ScriptPath
);
5675 if (!NT_SUCCESS(Status
))
5677 TRACE("Status 0x%08lx\n", Status
);
5681 /* Get the ProfilePath string */
5682 Status
= SampGetObjectAttributeString(UserObject
,
5684 &InfoBuffer
->Account
.ProfilePath
);
5685 if (!NT_SUCCESS(Status
))
5687 TRACE("Status 0x%08lx\n", Status
);
5691 /* Get the AdminComment string */
5692 Status
= SampGetObjectAttributeString(UserObject
,
5694 &InfoBuffer
->Account
.AdminComment
);
5695 if (!NT_SUCCESS(Status
))
5697 TRACE("Status 0x%08lx\n", Status
);
5701 /* Get the WorkStations string */
5702 Status
= SampGetObjectAttributeString(UserObject
,
5704 &InfoBuffer
->Account
.WorkStations
);
5705 if (!NT_SUCCESS(Status
))
5707 TRACE("Status 0x%08lx\n", Status
);
5711 /* Get the LogonHours attribute */
5712 Status
= SampGetLogonHoursAttrbute(UserObject
,
5713 &InfoBuffer
->Account
.LogonHours
);
5714 if (!NT_SUCCESS(Status
))
5716 TRACE("Status 0x%08lx\n", Status
);
5720 *Buffer
= InfoBuffer
;
5723 if (!NT_SUCCESS(Status
))
5725 if (InfoBuffer
!= NULL
)
5727 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5728 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5730 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5731 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5733 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5734 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5736 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5737 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5739 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5740 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5742 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5743 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5745 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5746 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5748 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5749 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5751 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5752 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5754 midl_user_free(InfoBuffer
);
5764 SampQueryUserLogonHours(PSAM_DB_OBJECT UserObject
,
5765 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5767 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5770 TRACE("(%p %p)\n", UserObject
, Buffer
);
5774 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5775 if (InfoBuffer
== NULL
)
5777 TRACE("Failed to allocate InfoBuffer!\n");
5778 return STATUS_INSUFFICIENT_RESOURCES
;
5781 Status
= SampGetLogonHoursAttrbute(UserObject
,
5782 &InfoBuffer
->LogonHours
.LogonHours
);
5783 if (!NT_SUCCESS(Status
))
5785 TRACE("SampGetLogonHoursAttrbute failed (Status 0x%08lx)\n", Status
);
5789 *Buffer
= InfoBuffer
;
5792 if (!NT_SUCCESS(Status
))
5794 if (InfoBuffer
!= NULL
)
5796 if (InfoBuffer
->LogonHours
.LogonHours
.LogonHours
!= NULL
)
5797 midl_user_free(InfoBuffer
->LogonHours
.LogonHours
.LogonHours
);
5799 midl_user_free(InfoBuffer
);
5809 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
5810 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5812 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5817 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5818 if (InfoBuffer
== NULL
)
5819 return STATUS_INSUFFICIENT_RESOURCES
;
5821 /* Get the Name string */
5822 Status
= SampGetObjectAttributeString(UserObject
,
5824 &InfoBuffer
->Name
.UserName
);
5825 if (!NT_SUCCESS(Status
))
5827 TRACE("Status 0x%08lx\n", Status
);
5831 /* Get the FullName string */
5832 Status
= SampGetObjectAttributeString(UserObject
,
5834 &InfoBuffer
->Name
.FullName
);
5835 if (!NT_SUCCESS(Status
))
5837 TRACE("Status 0x%08lx\n", Status
);
5841 *Buffer
= InfoBuffer
;
5844 if (!NT_SUCCESS(Status
))
5846 if (InfoBuffer
!= NULL
)
5848 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5849 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5851 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5852 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5854 midl_user_free(InfoBuffer
);
5863 SampQueryUserAccountName(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 Name string */
5876 Status
= SampGetObjectAttributeString(UserObject
,
5878 &InfoBuffer
->AccountName
.UserName
);
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
->AccountName
.UserName
.Buffer
!= NULL
)
5893 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5895 midl_user_free(InfoBuffer
);
5904 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5905 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5907 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5912 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5913 if (InfoBuffer
== NULL
)
5914 return STATUS_INSUFFICIENT_RESOURCES
;
5916 /* Get the FullName string */
5917 Status
= SampGetObjectAttributeString(UserObject
,
5919 &InfoBuffer
->FullName
.FullName
);
5920 if (!NT_SUCCESS(Status
))
5922 TRACE("Status 0x%08lx\n", Status
);
5926 *Buffer
= InfoBuffer
;
5929 if (!NT_SUCCESS(Status
))
5931 if (InfoBuffer
!= NULL
)
5933 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
5934 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5936 midl_user_free(InfoBuffer
);
5946 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5947 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5949 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5950 SAM_USER_FIXED_DATA FixedData
;
5956 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5957 if (InfoBuffer
== NULL
)
5958 return STATUS_INSUFFICIENT_RESOURCES
;
5960 Length
= sizeof(SAM_USER_FIXED_DATA
);
5961 Status
= SampGetObjectAttribute(UserObject
,
5966 if (!NT_SUCCESS(Status
))
5969 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5971 *Buffer
= InfoBuffer
;
5974 if (!NT_SUCCESS(Status
))
5976 if (InfoBuffer
!= NULL
)
5978 midl_user_free(InfoBuffer
);
5987 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5988 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5990 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5995 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5996 if (InfoBuffer
== NULL
)
5997 return STATUS_INSUFFICIENT_RESOURCES
;
5999 /* Get the HomeDirectory string */
6000 Status
= SampGetObjectAttributeString(UserObject
,
6002 &InfoBuffer
->Home
.HomeDirectory
);
6003 if (!NT_SUCCESS(Status
))
6005 TRACE("Status 0x%08lx\n", Status
);
6009 /* Get the HomeDirectoryDrive string */
6010 Status
= SampGetObjectAttributeString(UserObject
,
6011 L
"HomeDirectoryDrive",
6012 &InfoBuffer
->Home
.HomeDirectoryDrive
);
6013 if (!NT_SUCCESS(Status
))
6015 TRACE("Status 0x%08lx\n", Status
);
6019 *Buffer
= InfoBuffer
;
6022 if (!NT_SUCCESS(Status
))
6024 if (InfoBuffer
!= NULL
)
6026 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
6027 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
6029 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
6030 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
6032 midl_user_free(InfoBuffer
);
6041 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
6042 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6044 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6049 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6050 if (InfoBuffer
== NULL
)
6051 return STATUS_INSUFFICIENT_RESOURCES
;
6053 /* Get the ScriptPath string */
6054 Status
= SampGetObjectAttributeString(UserObject
,
6056 &InfoBuffer
->Script
.ScriptPath
);
6057 if (!NT_SUCCESS(Status
))
6059 TRACE("Status 0x%08lx\n", Status
);
6063 *Buffer
= InfoBuffer
;
6066 if (!NT_SUCCESS(Status
))
6068 if (InfoBuffer
!= NULL
)
6070 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
6071 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
6073 midl_user_free(InfoBuffer
);
6082 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
6083 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6085 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6090 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6091 if (InfoBuffer
== NULL
)
6092 return STATUS_INSUFFICIENT_RESOURCES
;
6094 /* Get the ProfilePath string */
6095 Status
= SampGetObjectAttributeString(UserObject
,
6097 &InfoBuffer
->Profile
.ProfilePath
);
6098 if (!NT_SUCCESS(Status
))
6100 TRACE("Status 0x%08lx\n", Status
);
6104 *Buffer
= InfoBuffer
;
6107 if (!NT_SUCCESS(Status
))
6109 if (InfoBuffer
!= NULL
)
6111 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
6112 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
6114 midl_user_free(InfoBuffer
);
6123 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
6124 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6126 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6131 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6132 if (InfoBuffer
== NULL
)
6133 return STATUS_INSUFFICIENT_RESOURCES
;
6135 /* Get the AdminComment string */
6136 Status
= SampGetObjectAttributeString(UserObject
,
6138 &InfoBuffer
->AdminComment
.AdminComment
);
6139 if (!NT_SUCCESS(Status
))
6141 TRACE("Status 0x%08lx\n", Status
);
6145 *Buffer
= InfoBuffer
;
6148 if (!NT_SUCCESS(Status
))
6150 if (InfoBuffer
!= NULL
)
6152 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
6153 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
6155 midl_user_free(InfoBuffer
);
6164 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
6165 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6167 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6172 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6173 if (InfoBuffer
== NULL
)
6174 return STATUS_INSUFFICIENT_RESOURCES
;
6176 /* Get the WorkStations string */
6177 Status
= SampGetObjectAttributeString(UserObject
,
6179 &InfoBuffer
->WorkStations
.WorkStations
);
6180 if (!NT_SUCCESS(Status
))
6182 TRACE("Status 0x%08lx\n", Status
);
6186 *Buffer
= InfoBuffer
;
6189 if (!NT_SUCCESS(Status
))
6191 if (InfoBuffer
!= NULL
)
6193 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
6194 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
6196 midl_user_free(InfoBuffer
);
6206 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
6207 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6209 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6210 SAM_USER_FIXED_DATA FixedData
;
6216 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6217 if (InfoBuffer
== NULL
)
6218 return STATUS_INSUFFICIENT_RESOURCES
;
6220 Length
= sizeof(SAM_USER_FIXED_DATA
);
6221 Status
= SampGetObjectAttribute(UserObject
,
6226 if (!NT_SUCCESS(Status
))
6229 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
6231 *Buffer
= InfoBuffer
;
6234 if (!NT_SUCCESS(Status
))
6236 if (InfoBuffer
!= NULL
)
6238 midl_user_free(InfoBuffer
);
6248 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
6249 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6251 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6252 SAM_USER_FIXED_DATA FixedData
;
6258 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6259 if (InfoBuffer
== NULL
)
6260 return STATUS_INSUFFICIENT_RESOURCES
;
6262 Length
= sizeof(SAM_USER_FIXED_DATA
);
6263 Status
= SampGetObjectAttribute(UserObject
,
6268 if (!NT_SUCCESS(Status
))
6271 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6272 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6274 *Buffer
= InfoBuffer
;
6277 if (!NT_SUCCESS(Status
))
6279 if (InfoBuffer
!= NULL
)
6281 midl_user_free(InfoBuffer
);
6291 SampQueryUserInternal1(PSAM_DB_OBJECT UserObject
,
6292 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6294 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6296 NTSTATUS Status
= STATUS_SUCCESS
;
6298 /* Fail, if the caller is not a trusted caller */
6299 if (UserObject
->Trusted
== FALSE
)
6300 return STATUS_INVALID_INFO_CLASS
;
6304 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6305 if (InfoBuffer
== NULL
)
6306 return STATUS_INSUFFICIENT_RESOURCES
;
6308 InfoBuffer
->Internal1
.LmPasswordPresent
= FALSE
;
6309 InfoBuffer
->Internal1
.NtPasswordPresent
= FALSE
;
6311 /* Get the NT password */
6313 SampGetObjectAttribute(UserObject
,
6319 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6321 Status
= SampGetObjectAttribute(UserObject
,
6324 (PVOID
)&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6326 if (!NT_SUCCESS(Status
))
6329 if (memcmp(&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6331 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
6332 InfoBuffer
->Internal1
.NtPasswordPresent
= TRUE
;
6336 /* Get the LM password */
6338 SampGetObjectAttribute(UserObject
,
6344 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6346 Status
= SampGetObjectAttribute(UserObject
,
6349 (PVOID
)&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6351 if (!NT_SUCCESS(Status
))
6354 if (memcmp(&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6356 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
6357 InfoBuffer
->Internal1
.LmPasswordPresent
= TRUE
;
6360 InfoBuffer
->Internal1
.PasswordExpired
= FALSE
;
6362 *Buffer
= InfoBuffer
;
6365 if (!NT_SUCCESS(Status
))
6367 if (InfoBuffer
!= NULL
)
6369 midl_user_free(InfoBuffer
);
6378 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
6379 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6381 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6386 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6387 if (InfoBuffer
== NULL
)
6388 return STATUS_INSUFFICIENT_RESOURCES
;
6390 /* Get the Parameters string */
6391 Status
= SampGetObjectAttributeString(UserObject
,
6393 &InfoBuffer
->Parameters
.Parameters
);
6394 if (!NT_SUCCESS(Status
))
6396 TRACE("Status 0x%08lx\n", Status
);
6400 *Buffer
= InfoBuffer
;
6403 if (!NT_SUCCESS(Status
))
6405 if (InfoBuffer
!= NULL
)
6407 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
6408 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
6410 midl_user_free(InfoBuffer
);
6419 SampQueryUserAll(PSAM_DB_OBJECT UserObject
,
6420 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6422 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6423 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
6424 SAM_USER_FIXED_DATA FixedData
;
6425 LARGE_INTEGER PasswordCanChange
;
6426 LARGE_INTEGER PasswordMustChange
;
6432 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6433 if (InfoBuffer
== NULL
)
6434 return STATUS_INSUFFICIENT_RESOURCES
;
6436 /* Get the fixed size domain data */
6437 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6438 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
6441 (PVOID
)&DomainFixedData
,
6443 if (!NT_SUCCESS(Status
))
6446 /* Get the fixed size user data */
6447 Length
= sizeof(SAM_USER_FIXED_DATA
);
6448 Status
= SampGetObjectAttribute(UserObject
,
6453 if (!NT_SUCCESS(Status
))
6456 /* Set the fields to be returned */
6457 if (UserObject
->Trusted
)
6459 InfoBuffer
->All
.WhichFields
= USER_ALL_READ_GENERAL_MASK
|
6460 USER_ALL_READ_LOGON_MASK
|
6461 USER_ALL_READ_ACCOUNT_MASK
|
6462 USER_ALL_READ_PREFERENCES_MASK
|
6463 USER_ALL_READ_TRUSTED_MASK
;
6467 InfoBuffer
->All
.WhichFields
= 0;
6469 if (UserObject
->Access
& USER_READ_GENERAL
)
6470 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_GENERAL_MASK
;
6472 if (UserObject
->Access
& USER_READ_LOGON
)
6473 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_LOGON_MASK
;
6475 if (UserObject
->Access
& USER_READ_ACCOUNT
)
6476 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_ACCOUNT_MASK
;
6478 if (UserObject
->Access
& USER_READ_PREFERENCES
)
6479 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_PREFERENCES_MASK
;
6482 /* Fail, if no fields are to be returned */
6483 if (InfoBuffer
->All
.WhichFields
== 0)
6485 Status
= STATUS_ACCESS_DENIED
;
6489 /* Get the UserName attribute */
6490 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERNAME
)
6492 Status
= SampGetObjectAttributeString(UserObject
,
6494 &InfoBuffer
->All
.UserName
);
6495 if (!NT_SUCCESS(Status
))
6497 TRACE("Status 0x%08lx\n", Status
);
6502 /* Get the FullName attribute */
6503 if (InfoBuffer
->All
.WhichFields
& USER_ALL_FULLNAME
)
6505 Status
= SampGetObjectAttributeString(UserObject
,
6507 &InfoBuffer
->All
.FullName
);
6508 if (!NT_SUCCESS(Status
))
6510 TRACE("Status 0x%08lx\n", Status
);
6515 /* Get the UserId attribute */
6516 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERID
)
6518 InfoBuffer
->All
.UserId
= FixedData
.UserId
;
6521 /* Get the PrimaryGroupId attribute */
6522 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PRIMARYGROUPID
)
6524 InfoBuffer
->All
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
6527 /* Get the AdminComment attribute */
6528 if (InfoBuffer
->All
.WhichFields
& USER_ALL_ADMINCOMMENT
)
6530 Status
= SampGetObjectAttributeString(UserObject
,
6532 &InfoBuffer
->All
.AdminComment
);
6533 if (!NT_SUCCESS(Status
))
6535 TRACE("Status 0x%08lx\n", Status
);
6540 /* Get the UserComment attribute */
6541 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERCOMMENT
)
6543 Status
= SampGetObjectAttributeString(UserObject
,
6545 &InfoBuffer
->All
.UserComment
);
6546 if (!NT_SUCCESS(Status
))
6548 TRACE("Status 0x%08lx\n", Status
);
6553 /* Get the HomeDirectory attribute */
6554 if (InfoBuffer
->All
.WhichFields
& USER_ALL_HOMEDIRECTORY
)
6556 Status
= SampGetObjectAttributeString(UserObject
,
6558 &InfoBuffer
->All
.HomeDirectory
);
6559 if (!NT_SUCCESS(Status
))
6561 TRACE("Status 0x%08lx\n", Status
);
6566 /* Get the HomeDirectoryDrive attribute */
6567 if (InfoBuffer
->All
.WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6569 Status
= SampGetObjectAttributeString(UserObject
,
6570 L
"HomeDirectoryDrive",
6571 &InfoBuffer
->Home
.HomeDirectoryDrive
);
6572 if (!NT_SUCCESS(Status
))
6574 TRACE("Status 0x%08lx\n", Status
);
6579 /* Get the ScriptPath attribute */
6580 if (InfoBuffer
->All
.WhichFields
& USER_ALL_SCRIPTPATH
)
6582 Status
= SampGetObjectAttributeString(UserObject
,
6584 &InfoBuffer
->All
.ScriptPath
);
6585 if (!NT_SUCCESS(Status
))
6587 TRACE("Status 0x%08lx\n", Status
);
6592 /* Get the ProfilePath attribute */
6593 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PROFILEPATH
)
6595 Status
= SampGetObjectAttributeString(UserObject
,
6597 &InfoBuffer
->All
.ProfilePath
);
6598 if (!NT_SUCCESS(Status
))
6600 TRACE("Status 0x%08lx\n", Status
);
6605 /* Get the WorkStations attribute */
6606 if (InfoBuffer
->All
.WhichFields
& USER_ALL_WORKSTATIONS
)
6608 Status
= SampGetObjectAttributeString(UserObject
,
6610 &InfoBuffer
->All
.WorkStations
);
6611 if (!NT_SUCCESS(Status
))
6613 TRACE("Status 0x%08lx\n", Status
);
6618 /* Get the LastLogon attribute */
6619 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LASTLOGON
)
6621 InfoBuffer
->All
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
6622 InfoBuffer
->All
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
6625 /* Get the LastLogoff attribute */
6626 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LASTLOGOFF
)
6628 InfoBuffer
->All
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
6629 InfoBuffer
->All
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
6632 /* Get the LogonHours attribute */
6633 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LOGONHOURS
)
6635 Status
= SampGetLogonHoursAttrbute(UserObject
,
6636 &InfoBuffer
->All
.LogonHours
);
6637 if (!NT_SUCCESS(Status
))
6639 TRACE("Status 0x%08lx\n", Status
);
6644 /* Get the BadPasswordCount attribute */
6645 if (InfoBuffer
->All
.WhichFields
& USER_ALL_BADPASSWORDCOUNT
)
6647 InfoBuffer
->All
.BadPasswordCount
= FixedData
.BadPasswordCount
;
6650 /* Get the LogonCount attribute */
6651 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LOGONCOUNT
)
6653 InfoBuffer
->All
.LogonCount
= FixedData
.LogonCount
;
6656 /* Get the PasswordCanChange attribute */
6657 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDCANCHANGE
)
6659 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
6660 DomainFixedData
.MinPasswordAge
);
6661 InfoBuffer
->All
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
6662 InfoBuffer
->All
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
6665 /* Get the PasswordMustChange attribute */
6666 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDMUSTCHANGE
)
6668 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
6669 DomainFixedData
.MaxPasswordAge
);
6670 InfoBuffer
->All
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
6671 InfoBuffer
->All
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
6674 /* Get the PasswordLastSet attribute */
6675 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDLASTSET
)
6677 InfoBuffer
->All
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
6678 InfoBuffer
->All
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
6681 /* Get the AccountExpires attribute */
6682 if (InfoBuffer
->All
.WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
6684 InfoBuffer
->All
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6685 InfoBuffer
->All
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6688 /* Get the UserAccountControl attribute */
6689 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
6691 InfoBuffer
->All
.UserAccountControl
= FixedData
.UserAccountControl
;
6694 /* Get the Parameters attribute */
6695 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PARAMETERS
)
6697 Status
= SampGetObjectAttributeString(UserObject
,
6699 &InfoBuffer
->All
.Parameters
);
6700 if (!NT_SUCCESS(Status
))
6702 TRACE("Status 0x%08lx\n", Status
);
6707 /* Get the CountryCode attribute */
6708 if (InfoBuffer
->All
.WhichFields
& USER_ALL_COUNTRYCODE
)
6710 InfoBuffer
->All
.CountryCode
= FixedData
.CountryCode
;
6713 /* Get the CodePage attribute */
6714 if (InfoBuffer
->All
.WhichFields
& USER_ALL_CODEPAGE
)
6716 InfoBuffer
->All
.CodePage
= FixedData
.CodePage
;
6719 /* Get the LmPassword and NtPassword attributes */
6720 if (InfoBuffer
->All
.WhichFields
& (USER_ALL_NTPASSWORDPRESENT
| USER_ALL_LMPASSWORDPRESENT
))
6722 InfoBuffer
->All
.LmPasswordPresent
= FALSE
;
6723 InfoBuffer
->All
.NtPasswordPresent
= FALSE
;
6725 /* Get the NT password */
6727 SampGetObjectAttribute(UserObject
,
6733 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6735 InfoBuffer
->All
.NtOwfPassword
.Buffer
= midl_user_allocate(sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
6736 if (InfoBuffer
->All
.NtOwfPassword
.Buffer
== NULL
)
6738 Status
= STATUS_INSUFFICIENT_RESOURCES
;
6742 InfoBuffer
->All
.NtOwfPassword
.Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
6743 InfoBuffer
->All
.NtOwfPassword
.MaximumLength
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
6745 Status
= SampGetObjectAttribute(UserObject
,
6748 (PVOID
)InfoBuffer
->All
.NtOwfPassword
.Buffer
,
6750 if (!NT_SUCCESS(Status
))
6753 if (memcmp(InfoBuffer
->All
.NtOwfPassword
.Buffer
,
6755 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
6756 InfoBuffer
->All
.NtPasswordPresent
= TRUE
;
6759 /* Get the LM password */
6761 SampGetObjectAttribute(UserObject
,
6767 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6769 InfoBuffer
->All
.LmOwfPassword
.Buffer
= midl_user_allocate(sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
6770 if (InfoBuffer
->All
.LmOwfPassword
.Buffer
== NULL
)
6772 Status
= STATUS_INSUFFICIENT_RESOURCES
;
6776 InfoBuffer
->All
.LmOwfPassword
.Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
6777 InfoBuffer
->All
.LmOwfPassword
.MaximumLength
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
6779 Status
= SampGetObjectAttribute(UserObject
,
6782 (PVOID
)InfoBuffer
->All
.LmOwfPassword
.Buffer
,
6784 if (!NT_SUCCESS(Status
))
6787 if (memcmp(InfoBuffer
->All
.LmOwfPassword
.Buffer
,
6789 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
6790 InfoBuffer
->All
.LmPasswordPresent
= TRUE
;
6794 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PRIVATEDATA
)
6799 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDEXPIRED
)
6804 if (InfoBuffer
->All
.WhichFields
& USER_ALL_SECURITYDESCRIPTOR
)
6809 *Buffer
= InfoBuffer
;
6812 if (!NT_SUCCESS(Status
))
6814 if (InfoBuffer
!= NULL
)
6816 if (InfoBuffer
->All
.UserName
.Buffer
!= NULL
)
6817 midl_user_free(InfoBuffer
->All
.UserName
.Buffer
);
6819 if (InfoBuffer
->All
.FullName
.Buffer
!= NULL
)
6820 midl_user_free(InfoBuffer
->All
.FullName
.Buffer
);
6822 if (InfoBuffer
->All
.AdminComment
.Buffer
!= NULL
)
6823 midl_user_free(InfoBuffer
->All
.AdminComment
.Buffer
);
6825 if (InfoBuffer
->All
.UserComment
.Buffer
!= NULL
)
6826 midl_user_free(InfoBuffer
->All
.UserComment
.Buffer
);
6828 if (InfoBuffer
->All
.HomeDirectory
.Buffer
!= NULL
)
6829 midl_user_free(InfoBuffer
->All
.HomeDirectory
.Buffer
);
6831 if (InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
!= NULL
)
6832 midl_user_free(InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
);
6834 if (InfoBuffer
->All
.ScriptPath
.Buffer
!= NULL
)
6835 midl_user_free(InfoBuffer
->All
.ScriptPath
.Buffer
);
6837 if (InfoBuffer
->All
.ProfilePath
.Buffer
!= NULL
)
6838 midl_user_free(InfoBuffer
->All
.ProfilePath
.Buffer
);
6840 if (InfoBuffer
->All
.WorkStations
.Buffer
!= NULL
)
6841 midl_user_free(InfoBuffer
->All
.WorkStations
.Buffer
);
6843 if (InfoBuffer
->All
.LogonHours
.LogonHours
!= NULL
)
6844 midl_user_free(InfoBuffer
->All
.LogonHours
.LogonHours
);
6846 if (InfoBuffer
->All
.Parameters
.Buffer
!= NULL
)
6847 midl_user_free(InfoBuffer
->All
.Parameters
.Buffer
);
6849 if (InfoBuffer
->All
.LmOwfPassword
.Buffer
!= NULL
)
6850 midl_user_free(InfoBuffer
->All
.LmOwfPassword
.Buffer
);
6852 if (InfoBuffer
->All
.NtOwfPassword
.Buffer
!= NULL
)
6853 midl_user_free(InfoBuffer
->All
.NtOwfPassword
.Buffer
);
6855 midl_user_free(InfoBuffer
);
6866 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
6867 IN USER_INFORMATION_CLASS UserInformationClass
,
6868 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6870 PSAM_DB_OBJECT UserObject
;
6871 ACCESS_MASK DesiredAccess
;
6874 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
6875 UserHandle
, UserInformationClass
, Buffer
);
6877 switch (UserInformationClass
)
6879 case UserGeneralInformation
:
6880 case UserNameInformation
:
6881 case UserAccountNameInformation
:
6882 case UserFullNameInformation
:
6883 case UserPrimaryGroupInformation
:
6884 case UserAdminCommentInformation
:
6885 DesiredAccess
= USER_READ_GENERAL
;
6888 case UserLogonHoursInformation
:
6889 case UserHomeInformation
:
6890 case UserScriptInformation
:
6891 case UserProfileInformation
:
6892 case UserWorkStationsInformation
:
6893 DesiredAccess
= USER_READ_LOGON
;
6896 case UserControlInformation
:
6897 case UserExpiresInformation
:
6898 case UserParametersInformation
:
6899 DesiredAccess
= USER_READ_ACCOUNT
;
6902 case UserPreferencesInformation
:
6903 DesiredAccess
= USER_READ_GENERAL
|
6904 USER_READ_PREFERENCES
;
6907 case UserLogonInformation
:
6908 case UserAccountInformation
:
6909 DesiredAccess
= USER_READ_GENERAL
|
6910 USER_READ_PREFERENCES
|
6915 case UserInternal1Information
:
6916 case UserAllInformation
:
6921 return STATUS_INVALID_INFO_CLASS
;
6924 RtlAcquireResourceShared(&SampResource
,
6927 /* Validate the domain handle */
6928 Status
= SampValidateDbObject(UserHandle
,
6932 if (!NT_SUCCESS(Status
))
6934 TRACE("failed with status 0x%08lx\n", Status
);
6938 switch (UserInformationClass
)
6940 case UserGeneralInformation
:
6941 Status
= SampQueryUserGeneral(UserObject
,
6945 case UserPreferencesInformation
:
6946 Status
= SampQueryUserPreferences(UserObject
,
6950 case UserLogonInformation
:
6951 Status
= SampQueryUserLogon(UserObject
,
6955 case UserLogonHoursInformation
:
6956 Status
= SampQueryUserLogonHours(UserObject
,
6960 case UserAccountInformation
:
6961 Status
= SampQueryUserAccount(UserObject
,
6965 case UserNameInformation
:
6966 Status
= SampQueryUserName(UserObject
,
6970 case UserAccountNameInformation
:
6971 Status
= SampQueryUserAccountName(UserObject
,
6975 case UserFullNameInformation
:
6976 Status
= SampQueryUserFullName(UserObject
,
6980 case UserPrimaryGroupInformation
:
6981 Status
= SampQueryUserPrimaryGroup(UserObject
,
6985 case UserHomeInformation
:
6986 Status
= SampQueryUserHome(UserObject
,
6989 case UserScriptInformation
:
6990 Status
= SampQueryUserScript(UserObject
,
6994 case UserProfileInformation
:
6995 Status
= SampQueryUserProfile(UserObject
,
6999 case UserAdminCommentInformation
:
7000 Status
= SampQueryUserAdminComment(UserObject
,
7004 case UserWorkStationsInformation
:
7005 Status
= SampQueryUserWorkStations(UserObject
,
7009 case UserControlInformation
:
7010 Status
= SampQueryUserControl(UserObject
,
7014 case UserExpiresInformation
:
7015 Status
= SampQueryUserExpires(UserObject
,
7019 case UserInternal1Information
:
7020 Status
= SampQueryUserInternal1(UserObject
,
7024 case UserParametersInformation
:
7025 Status
= SampQueryUserParameters(UserObject
,
7029 case UserAllInformation
:
7030 Status
= SampQueryUserAll(UserObject
,
7034 // case UserInternal4Information:
7035 // case UserInternal5Information:
7036 // case UserInternal4InformationNew:
7037 // case UserInternal5InformationNew:
7040 Status
= STATUS_INVALID_INFO_CLASS
;
7044 RtlReleaseResource(&SampResource
);
7051 SampSetUserName(PSAM_DB_OBJECT UserObject
,
7052 PRPC_UNICODE_STRING NewUserName
)
7054 UNICODE_STRING OldUserName
= {0, 0, NULL
};
7057 /* Check the account name */
7058 Status
= SampCheckAccountName(NewUserName
, 20);
7059 if (!NT_SUCCESS(Status
))
7061 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
7065 Status
= SampGetObjectAttributeString(UserObject
,
7067 (PRPC_UNICODE_STRING
)&OldUserName
);
7068 if (!NT_SUCCESS(Status
))
7070 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
7074 if (!RtlEqualUnicodeString(&OldUserName
, (PCUNICODE_STRING
)NewUserName
, TRUE
))
7076 Status
= SampCheckAccountNameInDomain(UserObject
->ParentObject
,
7077 NewUserName
->Buffer
);
7078 if (!NT_SUCCESS(Status
))
7080 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
7081 NewUserName
->Buffer
, Status
);
7086 Status
= SampSetAccountNameInDomain(UserObject
->ParentObject
,
7088 NewUserName
->Buffer
,
7089 UserObject
->RelativeId
);
7090 if (!NT_SUCCESS(Status
))
7092 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
7096 Status
= SampRemoveAccountNameFromDomain(UserObject
->ParentObject
,
7098 OldUserName
.Buffer
);
7099 if (!NT_SUCCESS(Status
))
7101 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
7105 Status
= SampSetObjectAttributeString(UserObject
,
7108 if (!NT_SUCCESS(Status
))
7110 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
7114 if (OldUserName
.Buffer
!= NULL
)
7115 midl_user_free(OldUserName
.Buffer
);
7122 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
7123 PSAMPR_USER_INFO_BUFFER Buffer
)
7125 SAM_USER_FIXED_DATA FixedData
;
7129 Length
= sizeof(SAM_USER_FIXED_DATA
);
7130 Status
= SampGetObjectAttribute(UserObject
,
7135 if (!NT_SUCCESS(Status
))
7138 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
7140 Status
= SampSetObjectAttribute(UserObject
,
7145 if (!NT_SUCCESS(Status
))
7148 Status
= SampSetUserName(UserObject
,
7149 &Buffer
->General
.UserName
);
7150 if (!NT_SUCCESS(Status
))
7153 Status
= SampSetObjectAttributeString(UserObject
,
7155 &Buffer
->General
.FullName
);
7156 if (!NT_SUCCESS(Status
))
7159 Status
= SampSetObjectAttributeString(UserObject
,
7161 &Buffer
->General
.AdminComment
);
7162 if (!NT_SUCCESS(Status
))
7165 Status
= SampSetObjectAttributeString(UserObject
,
7167 &Buffer
->General
.UserComment
);
7175 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
7176 PSAMPR_USER_INFO_BUFFER Buffer
)
7178 SAM_USER_FIXED_DATA FixedData
;
7182 Length
= sizeof(SAM_USER_FIXED_DATA
);
7183 Status
= SampGetObjectAttribute(UserObject
,
7188 if (!NT_SUCCESS(Status
))
7191 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
7192 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
7194 Status
= SampSetObjectAttribute(UserObject
,
7199 if (!NT_SUCCESS(Status
))
7202 Status
= SampSetObjectAttributeString(UserObject
,
7204 &Buffer
->Preferences
.UserComment
);
7212 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
7213 PSAMPR_USER_INFO_BUFFER Buffer
)
7215 SAM_USER_FIXED_DATA FixedData
;
7219 Length
= sizeof(SAM_USER_FIXED_DATA
);
7220 Status
= SampGetObjectAttribute(UserObject
,
7225 if (!NT_SUCCESS(Status
))
7228 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
7230 Status
= SampSetObjectAttribute(UserObject
,
7242 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
7243 PSAMPR_USER_INFO_BUFFER Buffer
)
7245 SAM_USER_FIXED_DATA FixedData
;
7249 Length
= sizeof(SAM_USER_FIXED_DATA
);
7250 Status
= SampGetObjectAttribute(UserObject
,
7255 if (!NT_SUCCESS(Status
))
7258 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
7260 Status
= SampSetObjectAttribute(UserObject
,
7272 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
7273 PSAMPR_USER_INFO_BUFFER Buffer
)
7275 SAM_USER_FIXED_DATA FixedData
;
7279 Length
= sizeof(SAM_USER_FIXED_DATA
);
7280 Status
= SampGetObjectAttribute(UserObject
,
7285 if (!NT_SUCCESS(Status
))
7288 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
7289 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
7291 Status
= SampSetObjectAttribute(UserObject
,
7303 SampSetUserInternal1(PSAM_DB_OBJECT UserObject
,
7304 PSAMPR_USER_INFO_BUFFER Buffer
)
7306 SAM_USER_FIXED_DATA FixedData
;
7308 NTSTATUS Status
= STATUS_SUCCESS
;
7310 /* FIXME: Decrypt NT password */
7311 /* FIXME: Decrypt LM password */
7313 Status
= SampSetUserPassword(UserObject
,
7314 &Buffer
->Internal1
.EncryptedNtOwfPassword
,
7315 Buffer
->Internal1
.NtPasswordPresent
,
7316 &Buffer
->Internal1
.EncryptedLmOwfPassword
,
7317 Buffer
->Internal1
.LmPasswordPresent
);
7318 if (!NT_SUCCESS(Status
))
7321 /* Get the fixed user attributes */
7322 Length
= sizeof(SAM_USER_FIXED_DATA
);
7323 Status
= SampGetObjectAttribute(UserObject
,
7328 if (!NT_SUCCESS(Status
))
7331 if (Buffer
->Internal1
.PasswordExpired
)
7333 /* The pasword was last set ages ago */
7334 FixedData
.PasswordLastSet
.LowPart
= 0;
7335 FixedData
.PasswordLastSet
.HighPart
= 0;
7339 /* The pasword was last set right now */
7340 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7341 if (!NT_SUCCESS(Status
))
7345 /* Set the fixed user attributes */
7346 Status
= SampSetObjectAttribute(UserObject
,
7358 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
7359 PSAMPR_USER_INFO_BUFFER Buffer
)
7361 SAM_USER_FIXED_DATA FixedData
;
7364 PENCRYPTED_NT_OWF_PASSWORD NtPassword
= NULL
;
7365 PENCRYPTED_LM_OWF_PASSWORD LmPassword
= NULL
;
7366 BOOLEAN NtPasswordPresent
= FALSE
;
7367 BOOLEAN LmPasswordPresent
= FALSE
;
7368 BOOLEAN WriteFixedData
= FALSE
;
7369 NTSTATUS Status
= STATUS_SUCCESS
;
7371 WhichFields
= Buffer
->All
.WhichFields
;
7373 /* Get the fixed size attributes */
7374 Length
= sizeof(SAM_USER_FIXED_DATA
);
7375 Status
= SampGetObjectAttribute(UserObject
,
7380 if (!NT_SUCCESS(Status
))
7383 if (WhichFields
& USER_ALL_USERNAME
)
7385 Status
= SampSetUserName(UserObject
,
7386 &Buffer
->All
.UserName
);
7387 if (!NT_SUCCESS(Status
))
7391 if (WhichFields
& USER_ALL_FULLNAME
)
7393 Status
= SampSetObjectAttributeString(UserObject
,
7395 &Buffer
->All
.FullName
);
7396 if (!NT_SUCCESS(Status
))
7400 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
7402 Status
= SampSetObjectAttributeString(UserObject
,
7404 &Buffer
->All
.AdminComment
);
7405 if (!NT_SUCCESS(Status
))
7409 if (WhichFields
& USER_ALL_USERCOMMENT
)
7411 Status
= SampSetObjectAttributeString(UserObject
,
7413 &Buffer
->All
.UserComment
);
7414 if (!NT_SUCCESS(Status
))
7418 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
7420 Status
= SampSetObjectAttributeString(UserObject
,
7422 &Buffer
->All
.HomeDirectory
);
7423 if (!NT_SUCCESS(Status
))
7427 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
7429 Status
= SampSetObjectAttributeString(UserObject
,
7430 L
"HomeDirectoryDrive",
7431 &Buffer
->All
.HomeDirectoryDrive
);
7432 if (!NT_SUCCESS(Status
))
7436 if (WhichFields
& USER_ALL_SCRIPTPATH
)
7438 Status
= SampSetObjectAttributeString(UserObject
,
7440 &Buffer
->All
.ScriptPath
);
7441 if (!NT_SUCCESS(Status
))
7445 if (WhichFields
& USER_ALL_PROFILEPATH
)
7447 Status
= SampSetObjectAttributeString(UserObject
,
7449 &Buffer
->All
.ProfilePath
);
7450 if (!NT_SUCCESS(Status
))
7454 if (WhichFields
& USER_ALL_WORKSTATIONS
)
7456 Status
= SampSetObjectAttributeString(UserObject
,
7458 &Buffer
->All
.WorkStations
);
7459 if (!NT_SUCCESS(Status
))
7463 if (WhichFields
& USER_ALL_PARAMETERS
)
7465 Status
= SampSetObjectAttributeString(UserObject
,
7467 &Buffer
->All
.Parameters
);
7468 if (!NT_SUCCESS(Status
))
7472 if (WhichFields
& USER_ALL_LOGONHOURS
)
7474 Status
= SampSetLogonHoursAttrbute(UserObject
,
7475 &Buffer
->All
.LogonHours
);
7476 if (!NT_SUCCESS(Status
))
7480 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
7482 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
7483 WriteFixedData
= TRUE
;
7486 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
7488 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
7489 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
7490 WriteFixedData
= TRUE
;
7493 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
7495 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
7496 WriteFixedData
= TRUE
;
7499 if (WhichFields
& USER_ALL_COUNTRYCODE
)
7501 FixedData
.CountryCode
= Buffer
->All
.CountryCode
;
7502 WriteFixedData
= TRUE
;
7505 if (WhichFields
& USER_ALL_CODEPAGE
)
7507 FixedData
.CodePage
= Buffer
->All
.CodePage
;
7508 WriteFixedData
= TRUE
;
7511 if (WhichFields
& (USER_ALL_NTPASSWORDPRESENT
|
7512 USER_ALL_LMPASSWORDPRESENT
))
7514 if (WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
7516 NtPassword
= (PENCRYPTED_NT_OWF_PASSWORD
)Buffer
->All
.NtOwfPassword
.Buffer
;
7517 NtPasswordPresent
= Buffer
->All
.NtPasswordPresent
;
7520 if (WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
7522 LmPassword
= (PENCRYPTED_LM_OWF_PASSWORD
)Buffer
->All
.LmOwfPassword
.Buffer
;
7523 LmPasswordPresent
= Buffer
->All
.LmPasswordPresent
;
7526 Status
= SampSetUserPassword(UserObject
,
7531 if (!NT_SUCCESS(Status
))
7534 /* The password has just been set */
7535 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7536 if (!NT_SUCCESS(Status
))
7539 WriteFixedData
= TRUE
;
7542 if (WhichFields
& USER_ALL_PASSWORDEXPIRED
)
7544 if (Buffer
->All
.PasswordExpired
)
7546 /* The pasword was last set ages ago */
7547 FixedData
.PasswordLastSet
.LowPart
= 0;
7548 FixedData
.PasswordLastSet
.HighPart
= 0;
7552 /* The pasword was last set right now */
7553 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7554 if (!NT_SUCCESS(Status
))
7558 WriteFixedData
= TRUE
;
7561 if (WriteFixedData
== TRUE
)
7563 Status
= SampSetObjectAttribute(UserObject
,
7568 if (!NT_SUCCESS(Status
))
7580 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
7581 IN USER_INFORMATION_CLASS UserInformationClass
,
7582 IN PSAMPR_USER_INFO_BUFFER Buffer
)
7584 PSAM_DB_OBJECT UserObject
;
7585 ACCESS_MASK DesiredAccess
;
7588 TRACE("SamrSetInformationUser(%p %lu %p)\n",
7589 UserHandle
, UserInformationClass
, Buffer
);
7591 switch (UserInformationClass
)
7593 case UserLogonHoursInformation
:
7594 case UserNameInformation
:
7595 case UserAccountNameInformation
:
7596 case UserFullNameInformation
:
7597 case UserPrimaryGroupInformation
:
7598 case UserHomeInformation
:
7599 case UserScriptInformation
:
7600 case UserProfileInformation
:
7601 case UserAdminCommentInformation
:
7602 case UserWorkStationsInformation
:
7603 case UserControlInformation
:
7604 case UserExpiresInformation
:
7605 case UserParametersInformation
:
7606 DesiredAccess
= USER_WRITE_ACCOUNT
;
7609 case UserGeneralInformation
:
7610 DesiredAccess
= USER_WRITE_ACCOUNT
|
7611 USER_WRITE_PREFERENCES
;
7614 case UserPreferencesInformation
:
7615 DesiredAccess
= USER_WRITE_PREFERENCES
;
7618 case UserSetPasswordInformation
:
7619 case UserInternal1Information
:
7620 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
7623 case UserAllInformation
:
7624 DesiredAccess
= 0; /* FIXME */
7628 return STATUS_INVALID_INFO_CLASS
;
7631 RtlAcquireResourceExclusive(&SampResource
,
7634 /* Validate the domain handle */
7635 Status
= SampValidateDbObject(UserHandle
,
7639 if (!NT_SUCCESS(Status
))
7641 TRACE("failed with status 0x%08lx\n", Status
);
7645 switch (UserInformationClass
)
7647 case UserGeneralInformation
:
7648 Status
= SampSetUserGeneral(UserObject
,
7652 case UserPreferencesInformation
:
7653 Status
= SampSetUserPreferences(UserObject
,
7657 case UserLogonHoursInformation
:
7658 Status
= SampSetLogonHoursAttrbute(UserObject
,
7659 &Buffer
->LogonHours
.LogonHours
);
7662 case UserNameInformation
:
7663 Status
= SampSetUserName(UserObject
,
7664 &Buffer
->Name
.UserName
);
7665 if (!NT_SUCCESS(Status
))
7668 Status
= SampSetObjectAttributeString(UserObject
,
7670 &Buffer
->Name
.FullName
);
7673 case UserAccountNameInformation
:
7674 Status
= SampSetUserName(UserObject
,
7675 &Buffer
->AccountName
.UserName
);
7678 case UserFullNameInformation
:
7679 Status
= SampSetObjectAttributeString(UserObject
,
7681 &Buffer
->FullName
.FullName
);
7684 case UserPrimaryGroupInformation
:
7685 Status
= SampSetUserPrimaryGroup(UserObject
,
7689 case UserHomeInformation
:
7690 Status
= SampSetObjectAttributeString(UserObject
,
7692 &Buffer
->Home
.HomeDirectory
);
7693 if (!NT_SUCCESS(Status
))
7696 Status
= SampSetObjectAttributeString(UserObject
,
7697 L
"HomeDirectoryDrive",
7698 &Buffer
->Home
.HomeDirectoryDrive
);
7701 case UserScriptInformation
:
7702 Status
= SampSetObjectAttributeString(UserObject
,
7704 &Buffer
->Script
.ScriptPath
);
7707 case UserProfileInformation
:
7708 Status
= SampSetObjectAttributeString(UserObject
,
7710 &Buffer
->Profile
.ProfilePath
);
7713 case UserAdminCommentInformation
:
7714 Status
= SampSetObjectAttributeString(UserObject
,
7716 &Buffer
->AdminComment
.AdminComment
);
7719 case UserWorkStationsInformation
:
7720 Status
= SampSetObjectAttributeString(UserObject
,
7722 &Buffer
->WorkStations
.WorkStations
);
7725 case UserSetPasswordInformation
:
7726 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
7727 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
7729 Status
= SampSetObjectAttributeString(UserObject
,
7731 &Buffer
->SetPassword
.Password
);
7734 case UserControlInformation
:
7735 Status
= SampSetUserControl(UserObject
,
7739 case UserExpiresInformation
:
7740 Status
= SampSetUserExpires(UserObject
,
7744 case UserInternal1Information
:
7745 Status
= SampSetUserInternal1(UserObject
,
7749 case UserParametersInformation
:
7750 Status
= SampSetObjectAttributeString(UserObject
,
7752 &Buffer
->Parameters
.Parameters
);
7755 case UserAllInformation
:
7756 Status
= SampSetUserAll(UserObject
,
7760 // case UserInternal4Information:
7761 // case UserInternal5Information:
7762 // case UserInternal4InformationNew:
7763 // case UserInternal5InformationNew:
7766 Status
= STATUS_INVALID_INFO_CLASS
;
7770 RtlReleaseResource(&SampResource
);
7779 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
7780 IN
unsigned char LmPresent
,
7781 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
7782 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
7783 IN
unsigned char NtPresent
,
7784 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
7785 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
7786 IN
unsigned char NtCrossEncryptionPresent
,
7787 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
7788 IN
unsigned char LmCrossEncryptionPresent
,
7789 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
7791 ENCRYPTED_LM_OWF_PASSWORD StoredLmPassword
;
7792 ENCRYPTED_NT_OWF_PASSWORD StoredNtPassword
;
7793 PENCRYPTED_LM_OWF_PASSWORD OldLmPassword
;
7794 PENCRYPTED_LM_OWF_PASSWORD NewLmPassword
;
7795 PENCRYPTED_NT_OWF_PASSWORD OldNtPassword
;
7796 PENCRYPTED_NT_OWF_PASSWORD NewNtPassword
;
7797 BOOLEAN StoredLmPresent
= FALSE
;
7798 BOOLEAN StoredNtPresent
= FALSE
;
7799 BOOLEAN StoredLmEmpty
= TRUE
;
7800 BOOLEAN StoredNtEmpty
= TRUE
;
7801 PSAM_DB_OBJECT UserObject
;
7803 SAM_USER_FIXED_DATA UserFixedData
;
7804 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
7805 LARGE_INTEGER SystemTime
;
7808 TRACE("(%p %u %p %p %u %p %p %u %p %u %p)\n",
7809 UserHandle
, LmPresent
, OldLmEncryptedWithNewLm
, NewLmEncryptedWithOldLm
,
7810 NtPresent
, OldNtEncryptedWithNewNt
, NewNtEncryptedWithOldNt
, NtCrossEncryptionPresent
,
7811 NewNtEncryptedWithNewLm
, LmCrossEncryptionPresent
, NewLmEncryptedWithNewNt
);
7813 RtlAcquireResourceExclusive(&SampResource
,
7816 /* Validate the user handle */
7817 Status
= SampValidateDbObject(UserHandle
,
7819 USER_CHANGE_PASSWORD
,
7821 if (!NT_SUCCESS(Status
))
7823 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7827 /* Get the current time */
7828 Status
= NtQuerySystemTime(&SystemTime
);
7829 if (!NT_SUCCESS(Status
))
7831 TRACE("NtQuerySystemTime failed (Status 0x%08lx)\n", Status
);
7835 /* Retrieve the LM password */
7836 Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
7837 Status
= SampGetObjectAttribute(UserObject
,
7842 if (NT_SUCCESS(Status
))
7844 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
7846 StoredLmPresent
= TRUE
;
7847 if (!RtlEqualMemory(&StoredLmPassword
,
7849 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
7850 StoredLmEmpty
= FALSE
;
7854 /* Retrieve the NT password */
7855 Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
7856 Status
= SampGetObjectAttribute(UserObject
,
7861 if (NT_SUCCESS(Status
))
7863 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
7865 StoredNtPresent
= TRUE
;
7866 if (!RtlEqualMemory(&StoredNtPassword
,
7868 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
7869 StoredNtEmpty
= FALSE
;
7873 /* Retrieve the fixed size user data */
7874 Length
= sizeof(SAM_USER_FIXED_DATA
);
7875 Status
= SampGetObjectAttribute(UserObject
,
7880 if (!NT_SUCCESS(Status
))
7882 TRACE("SampGetObjectAttribute failed to retrieve the fixed user data (Status 0x%08lx)\n", Status
);
7886 /* Check if we can change the password at this time */
7887 if ((StoredNtEmpty
== FALSE
) || (StoredNtEmpty
== FALSE
))
7889 /* Get fixed domain data */
7890 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
7891 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
7896 if (!NT_SUCCESS(Status
))
7898 TRACE("SampGetObjectAttribute failed to retrieve the fixed domain data (Status 0x%08lx)\n", Status
);
7902 if (DomainFixedData
.MinPasswordAge
.QuadPart
> 0)
7904 if (SystemTime
.QuadPart
< (UserFixedData
.PasswordLastSet
.QuadPart
+ DomainFixedData
.MinPasswordAge
.QuadPart
))
7905 return STATUS_ACCOUNT_RESTRICTION
;
7909 /* FIXME: Decrypt passwords */
7910 OldLmPassword
= OldLmEncryptedWithNewLm
;
7911 NewLmPassword
= NewLmEncryptedWithOldLm
;
7912 OldNtPassword
= OldNtEncryptedWithNewNt
;
7913 NewNtPassword
= NewNtEncryptedWithOldNt
;
7915 /* Check if the old passwords match the stored ones */
7920 if (!RtlEqualMemory(&StoredLmPassword
,
7922 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
7924 TRACE("Old LM Password does not match!\n");
7925 Status
= STATUS_WRONG_PASSWORD
;
7929 if (!RtlEqualMemory(&StoredNtPassword
,
7931 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
7933 TRACE("Old NT Password does not match!\n");
7934 Status
= STATUS_WRONG_PASSWORD
;
7940 if (!RtlEqualMemory(&StoredNtPassword
,
7942 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
7944 TRACE("Old NT Password does not match!\n");
7945 Status
= STATUS_WRONG_PASSWORD
;
7953 if (!RtlEqualMemory(&StoredLmPassword
,
7955 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
7957 TRACE("Old LM Password does not match!\n");
7958 Status
= STATUS_WRONG_PASSWORD
;
7963 Status
= STATUS_INVALID_PARAMETER
;
7967 /* Store the new password hashes */
7968 if (NT_SUCCESS(Status
))
7970 Status
= SampSetUserPassword(UserObject
,
7975 if (NT_SUCCESS(Status
))
7977 /* Update PasswordLastSet */
7978 UserFixedData
.PasswordLastSet
.QuadPart
= SystemTime
.QuadPart
;
7980 /* Set the fixed size user data */
7981 Length
= sizeof(SAM_USER_FIXED_DATA
);
7982 Status
= SampSetObjectAttribute(UserObject
,
7990 if (Status
== STATUS_WRONG_PASSWORD
)
7992 /* Update BadPasswordCount and LastBadPasswordTime */
7993 UserFixedData
.BadPasswordCount
++;
7994 UserFixedData
.LastBadPasswordTime
.QuadPart
= SystemTime
.QuadPart
;
7996 /* Set the fixed size user data */
7997 Length
= sizeof(SAM_USER_FIXED_DATA
);
7998 Status
= SampSetObjectAttribute(UserObject
,
8006 RtlReleaseResource(&SampResource
);
8015 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
8016 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
8018 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
8019 PSAM_DB_OBJECT UserObject
;
8023 TRACE("SamrGetGroupsForUser(%p %p)\n",
8024 UserHandle
, Groups
);
8026 RtlAcquireResourceShared(&SampResource
,
8029 /* Validate the user handle */
8030 Status
= SampValidateDbObject(UserHandle
,
8034 if (!NT_SUCCESS(Status
))
8036 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8040 /* Allocate the groups buffer */
8041 GroupsBuffer
= midl_user_allocate(sizeof(SAMPR_GET_GROUPS_BUFFER
));
8042 if (GroupsBuffer
== NULL
)
8044 Status
= STATUS_INSUFFICIENT_RESOURCES
;
8049 * Get the size of the Groups attribute.
8050 * Do not check the status code because in case of an error
8051 * Length will be 0. And that is all we need.
8053 SampGetObjectAttribute(UserObject
,
8059 /* If there is no Groups attribute, return a groups buffer without an array */
8062 GroupsBuffer
->MembershipCount
= 0;
8063 GroupsBuffer
->Groups
= NULL
;
8065 *Groups
= GroupsBuffer
;
8067 Status
= STATUS_SUCCESS
;
8071 /* Allocate a buffer for the Groups attribute */
8072 GroupsBuffer
->Groups
= midl_user_allocate(Length
);
8073 if (GroupsBuffer
->Groups
== NULL
)
8075 Status
= STATUS_INSUFFICIENT_RESOURCES
;
8079 /* Retrieve the Grous attribute */
8080 Status
= SampGetObjectAttribute(UserObject
,
8083 GroupsBuffer
->Groups
,
8085 if (!NT_SUCCESS(Status
))
8087 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8091 /* Calculate the membership count */
8092 GroupsBuffer
->MembershipCount
= Length
/ sizeof(GROUP_MEMBERSHIP
);
8094 /* Return the groups buffer to the caller */
8095 *Groups
= GroupsBuffer
;
8098 if (!NT_SUCCESS(Status
))
8100 if (GroupsBuffer
!= NULL
)
8102 if (GroupsBuffer
->Groups
!= NULL
)
8103 midl_user_free(GroupsBuffer
->Groups
);
8105 midl_user_free(GroupsBuffer
);
8109 RtlReleaseResource(&SampResource
);
8118 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
8119 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8120 IN
unsigned long Index
,
8121 IN
unsigned long EntryCount
,
8122 IN
unsigned long PreferredMaximumLength
,
8123 OUT
unsigned long *TotalAvailable
,
8124 OUT
unsigned long *TotalReturned
,
8125 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8128 return STATUS_NOT_IMPLEMENTED
;
8134 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
8135 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8136 IN PRPC_UNICODE_STRING Prefix
,
8137 OUT
unsigned long *Index
)
8140 return STATUS_NOT_IMPLEMENTED
;
8146 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
8149 return STATUS_NOT_IMPLEMENTED
;
8155 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
8158 return STATUS_NOT_IMPLEMENTED
;
8165 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
8166 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
8168 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
8169 SAM_USER_FIXED_DATA UserFixedData
;
8170 PSAM_DB_OBJECT DomainObject
;
8171 PSAM_DB_OBJECT UserObject
;
8176 UserHandle
, PasswordInformation
);
8178 RtlAcquireResourceShared(&SampResource
,
8181 /* Validate the user handle */
8182 Status
= SampValidateDbObject(UserHandle
,
8186 if (!NT_SUCCESS(Status
))
8188 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8192 /* Validate the domain object */
8193 Status
= SampValidateDbObject((SAMPR_HANDLE
)UserObject
->ParentObject
,
8195 DOMAIN_READ_PASSWORD_PARAMETERS
,
8197 if (!NT_SUCCESS(Status
))
8199 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8203 /* Get fixed user data */
8204 Length
= sizeof(SAM_USER_FIXED_DATA
);
8205 Status
= SampGetObjectAttribute(UserObject
,
8208 (PVOID
)&UserFixedData
,
8210 if (!NT_SUCCESS(Status
))
8212 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8216 if ((UserObject
->RelativeId
== DOMAIN_USER_RID_KRBTGT
) ||
8217 (UserFixedData
.UserAccountControl
& (USER_INTERDOMAIN_TRUST_ACCOUNT
|
8218 USER_WORKSTATION_TRUST_ACCOUNT
|
8219 USER_SERVER_TRUST_ACCOUNT
)))
8221 PasswordInformation
->MinPasswordLength
= 0;
8222 PasswordInformation
->PasswordProperties
= 0;
8226 /* Get fixed domain data */
8227 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8228 Status
= SampGetObjectAttribute(DomainObject
,
8231 (PVOID
)&DomainFixedData
,
8233 if (!NT_SUCCESS(Status
))
8235 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8239 PasswordInformation
->MinPasswordLength
= DomainFixedData
.MinPasswordLength
;
8240 PasswordInformation
->PasswordProperties
= DomainFixedData
.PasswordProperties
;
8244 RtlReleaseResource(&SampResource
);
8246 return STATUS_SUCCESS
;
8253 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
8254 IN PRPC_SID MemberSid
)
8256 PSAM_DB_OBJECT DomainObject
;
8261 DomainHandle
, MemberSid
);
8263 RtlAcquireResourceExclusive(&SampResource
,
8266 /* Validate the domain object */
8267 Status
= SampValidateDbObject(DomainHandle
,
8271 if (!NT_SUCCESS(Status
))
8273 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8277 /* Retrieve the RID from the MemberSID */
8278 Status
= SampGetRidFromSid((PSID
)MemberSid
,
8280 if (!NT_SUCCESS(Status
))
8282 TRACE("SampGetRidFromSid failed with status 0x%08lx\n", Status
);
8286 /* Fail, if the RID represents a special account */
8289 TRACE("Cannot remove a special account (RID: %lu)\n", Rid
);
8290 Status
= STATUS_SPECIAL_ACCOUNT
;
8294 /* Remove the member from all aliases in the domain */
8295 Status
= SampRemoveMemberFromAllAliases(DomainObject
,
8297 if (!NT_SUCCESS(Status
))
8299 TRACE("SampRemoveMemberFromAllAliases failed with status 0x%08lx\n", Status
);
8303 RtlReleaseResource(&SampResource
);
8312 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
8313 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
8314 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
8316 TRACE("(%p %lu %p)\n", DomainHandle
, DomainInformationClass
, Buffer
);
8318 return SamrQueryInformationDomain(DomainHandle
,
8319 DomainInformationClass
,
8327 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
8328 IN USER_INFORMATION_CLASS UserInformationClass
,
8329 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
8331 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
8333 return SamrQueryInformationUser(UserHandle
,
8334 UserInformationClass
,
8342 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
8343 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8344 IN
unsigned long Index
,
8345 IN
unsigned long EntryCount
,
8346 IN
unsigned long PreferredMaximumLength
,
8347 OUT
unsigned long *TotalAvailable
,
8348 OUT
unsigned long *TotalReturned
,
8349 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8351 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
8352 DomainHandle
, DisplayInformationClass
, Index
,
8353 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
8354 TotalReturned
, Buffer
);
8356 return SamrQueryDisplayInformation(DomainHandle
,
8357 DisplayInformationClass
,
8360 PreferredMaximumLength
,
8370 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
8371 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8372 IN PRPC_UNICODE_STRING Prefix
,
8373 OUT
unsigned long *Index
)
8375 TRACE("(%p %lu %p %p)\n",
8376 DomainHandle
, DisplayInformationClass
, Prefix
, Index
);
8378 return SamrGetDisplayEnumerationIndex(DomainHandle
,
8379 DisplayInformationClass
,
8388 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
8389 IN PRPC_UNICODE_STRING Name
,
8390 IN
unsigned long AccountType
,
8391 IN ACCESS_MASK DesiredAccess
,
8392 OUT SAMPR_HANDLE
*UserHandle
,
8393 OUT
unsigned long *GrantedAccess
,
8394 OUT
unsigned long *RelativeId
)
8396 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
8397 SAM_USER_FIXED_DATA FixedUserData
;
8398 PSAM_DB_OBJECT DomainObject
;
8399 PSAM_DB_OBJECT UserObject
;
8400 GROUP_MEMBERSHIP GroupMembership
;
8401 UCHAR LogonHours
[23];
8407 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
8408 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
8411 Name
->Length
== 0 ||
8412 Name
->Buffer
== NULL
||
8413 UserHandle
== NULL
||
8415 return STATUS_INVALID_PARAMETER
;
8417 /* Check for valid account type */
8418 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
8419 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
8420 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
8421 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
8422 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
8423 return STATUS_INVALID_PARAMETER
;
8425 /* Map generic access rights */
8426 RtlMapGenericMask(&DesiredAccess
,
8429 RtlAcquireResourceExclusive(&SampResource
,
8432 /* Validate the domain handle */
8433 Status
= SampValidateDbObject(DomainHandle
,
8437 if (!NT_SUCCESS(Status
))
8439 TRACE("failed with status 0x%08lx\n", Status
);
8443 /* Check the user account name */
8444 Status
= SampCheckAccountName(Name
, 20);
8445 if (!NT_SUCCESS(Status
))
8447 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
8451 /* Check if the user name already exists in the domain */
8452 Status
= SampCheckAccountNameInDomain(DomainObject
,
8454 if (!NT_SUCCESS(Status
))
8456 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
8457 Name
->Buffer
, Status
);
8461 /* Get the fixed domain attributes */
8462 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8463 Status
= SampGetObjectAttribute(DomainObject
,
8466 (PVOID
)&FixedDomainData
,
8468 if (!NT_SUCCESS(Status
))
8470 TRACE("failed with status 0x%08lx\n", Status
);
8474 /* Increment the NextRid attribute */
8475 ulRid
= FixedDomainData
.NextRid
;
8476 FixedDomainData
.NextRid
++;
8478 /* Store the fixed domain attributes */
8479 Status
= SampSetObjectAttribute(DomainObject
,
8484 if (!NT_SUCCESS(Status
))
8486 TRACE("failed with status 0x%08lx\n", Status
);
8490 TRACE("RID: %lx\n", ulRid
);
8492 /* Convert the RID into a string (hex) */
8493 swprintf(szRid
, L
"%08lX", ulRid
);
8495 /* Create the user object */
8496 Status
= SampCreateDbObject(DomainObject
,
8503 if (!NT_SUCCESS(Status
))
8505 TRACE("failed with status 0x%08lx\n", Status
);
8509 /* Add the account name for the user object */
8510 Status
= SampSetAccountNameInDomain(DomainObject
,
8514 if (!NT_SUCCESS(Status
))
8516 TRACE("failed with status 0x%08lx\n", Status
);
8520 /* Initialize fixed user data */
8521 FixedUserData
.Version
= 1;
8522 FixedUserData
.Reserved
= 0;
8523 FixedUserData
.LastLogon
.QuadPart
= 0;
8524 FixedUserData
.LastLogoff
.QuadPart
= 0;
8525 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
8526 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
8527 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
8528 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
8529 FixedUserData
.UserId
= ulRid
;
8530 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
8531 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
8532 USER_PASSWORD_NOT_REQUIRED
|
8534 FixedUserData
.CountryCode
= 0;
8535 FixedUserData
.CodePage
= 0;
8536 FixedUserData
.BadPasswordCount
= 0;
8537 FixedUserData
.LogonCount
= 0;
8538 FixedUserData
.AdminCount
= 0;
8539 FixedUserData
.OperatorCount
= 0;
8541 /* Set fixed user data attribute */
8542 Status
= SampSetObjectAttribute(UserObject
,
8545 (LPVOID
)&FixedUserData
,
8546 sizeof(SAM_USER_FIXED_DATA
));
8547 if (!NT_SUCCESS(Status
))
8549 TRACE("failed with status 0x%08lx\n", Status
);
8553 /* Set the Name attribute */
8554 Status
= SampSetObjectAttributeString(UserObject
,
8557 if (!NT_SUCCESS(Status
))
8559 TRACE("failed with status 0x%08lx\n", Status
);
8563 /* Set the FullName attribute */
8564 Status
= SampSetObjectAttributeString(UserObject
,
8567 if (!NT_SUCCESS(Status
))
8569 TRACE("failed with status 0x%08lx\n", Status
);
8573 /* Set the HomeDirectory attribute */
8574 Status
= SampSetObjectAttributeString(UserObject
,
8577 if (!NT_SUCCESS(Status
))
8579 TRACE("failed with status 0x%08lx\n", Status
);
8583 /* Set the HomeDirectoryDrive attribute */
8584 Status
= SampSetObjectAttributeString(UserObject
,
8585 L
"HomeDirectoryDrive",
8587 if (!NT_SUCCESS(Status
))
8589 TRACE("failed with status 0x%08lx\n", Status
);
8593 /* Set the ScriptPath attribute */
8594 Status
= SampSetObjectAttributeString(UserObject
,
8597 if (!NT_SUCCESS(Status
))
8599 TRACE("failed with status 0x%08lx\n", Status
);
8603 /* Set the ProfilePath attribute */
8604 Status
= SampSetObjectAttributeString(UserObject
,
8607 if (!NT_SUCCESS(Status
))
8609 TRACE("failed with status 0x%08lx\n", Status
);
8613 /* Set the AdminComment attribute */
8614 Status
= SampSetObjectAttributeString(UserObject
,
8617 if (!NT_SUCCESS(Status
))
8619 TRACE("failed with status 0x%08lx\n", Status
);
8623 /* Set the UserComment attribute */
8624 Status
= SampSetObjectAttributeString(UserObject
,
8627 if (!NT_SUCCESS(Status
))
8629 TRACE("failed with status 0x%08lx\n", Status
);
8633 /* Set the WorkStations attribute */
8634 Status
= SampSetObjectAttributeString(UserObject
,
8637 if (!NT_SUCCESS(Status
))
8639 TRACE("failed with status 0x%08lx\n", Status
);
8643 /* Set the Parameters attribute */
8644 Status
= SampSetObjectAttributeString(UserObject
,
8647 if (!NT_SUCCESS(Status
))
8649 TRACE("failed with status 0x%08lx\n", Status
);
8653 /* Set LogonHours attribute*/
8654 *((PUSHORT
)LogonHours
) = 168;
8655 memset(&(LogonHours
[2]), 0xff, 21);
8657 Status
= SampSetObjectAttribute(UserObject
,
8661 sizeof(LogonHours
));
8662 if (!NT_SUCCESS(Status
))
8664 TRACE("failed with status 0x%08lx\n", Status
);
8668 /* Set Groups attribute*/
8669 GroupMembership
.RelativeId
= DOMAIN_GROUP_RID_USERS
;
8670 GroupMembership
.Attributes
= SE_GROUP_MANDATORY
|
8672 SE_GROUP_ENABLED_BY_DEFAULT
;
8674 Status
= SampSetObjectAttribute(UserObject
,
8678 sizeof(GROUP_MEMBERSHIP
));
8679 if (!NT_SUCCESS(Status
))
8681 TRACE("failed with status 0x%08lx\n", Status
);
8685 /* Set LMPwd attribute*/
8686 Status
= SampSetObjectAttribute(UserObject
,
8691 if (!NT_SUCCESS(Status
))
8693 TRACE("failed with status 0x%08lx\n", Status
);
8697 /* Set NTPwd attribute*/
8698 Status
= SampSetObjectAttribute(UserObject
,
8703 if (!NT_SUCCESS(Status
))
8705 TRACE("failed with status 0x%08lx\n", Status
);
8709 /* Set LMPwdHistory attribute*/
8710 Status
= SampSetObjectAttribute(UserObject
,
8715 if (!NT_SUCCESS(Status
))
8717 TRACE("failed with status 0x%08lx\n", Status
);
8721 /* Set NTPwdHistory attribute*/
8722 Status
= SampSetObjectAttribute(UserObject
,
8727 if (!NT_SUCCESS(Status
))
8729 TRACE("failed with status 0x%08lx\n", Status
);
8733 /* FIXME: Set SecDesc attribute*/
8735 if (NT_SUCCESS(Status
))
8737 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
8738 *RelativeId
= ulRid
;
8739 *GrantedAccess
= UserObject
->Access
;
8743 RtlReleaseResource(&SampResource
);
8745 TRACE("returns with status 0x%08lx\n", Status
);
8754 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
8755 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8756 IN
unsigned long Index
,
8757 IN
unsigned long EntryCount
,
8758 IN
unsigned long PreferredMaximumLength
,
8759 OUT
unsigned long *TotalAvailable
,
8760 OUT
unsigned long *TotalReturned
,
8761 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8763 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
8764 DomainHandle
, DisplayInformationClass
, Index
,
8765 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
8766 TotalReturned
, Buffer
);
8768 return SamrQueryDisplayInformation(DomainHandle
,
8769 DisplayInformationClass
,
8772 PreferredMaximumLength
,
8782 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
8783 IN PSAMPR_PSID_ARRAY MembersBuffer
)
8786 NTSTATUS Status
= STATUS_SUCCESS
;
8788 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
8789 AliasHandle
, MembersBuffer
);
8791 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
8793 Status
= SamrAddMemberToAlias(AliasHandle
,
8794 ((PSID
*)MembersBuffer
->Sids
)[i
]);
8796 if (Status
== STATUS_MEMBER_IN_ALIAS
)
8797 Status
= STATUS_SUCCESS
;
8799 if (!NT_SUCCESS(Status
))
8810 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
8811 IN PSAMPR_PSID_ARRAY MembersBuffer
)
8814 NTSTATUS Status
= STATUS_SUCCESS
;
8816 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
8817 AliasHandle
, MembersBuffer
);
8819 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
8821 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
8822 ((PSID
*)MembersBuffer
->Sids
)[i
]);
8824 if (Status
== STATUS_MEMBER_IN_ALIAS
)
8825 Status
= STATUS_SUCCESS
;
8827 if (!NT_SUCCESS(Status
))
8838 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
8839 IN PRPC_STRING ServerName
,
8840 IN PRPC_STRING UserName
,
8841 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
8842 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
8845 return STATUS_NOT_IMPLEMENTED
;
8851 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
8852 IN PRPC_UNICODE_STRING ServerName
,
8853 IN PRPC_UNICODE_STRING UserName
,
8854 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
8855 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
8856 IN
unsigned char LmPresent
,
8857 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
8858 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
8861 return STATUS_NOT_IMPLEMENTED
;
8867 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
8868 IN PRPC_UNICODE_STRING Unused
,
8869 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
8872 return STATUS_NOT_IMPLEMENTED
;
8879 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
8880 OUT SAMPR_HANDLE
*ServerHandle
,
8881 IN ACCESS_MASK DesiredAccess
)
8883 TRACE("(%p %p %lx)\n", ServerName
, ServerHandle
, DesiredAccess
);
8885 return SamrConnect(ServerName
,
8894 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
8895 IN USER_INFORMATION_CLASS UserInformationClass
,
8896 IN PSAMPR_USER_INFO_BUFFER Buffer
)
8898 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
8900 return SamrSetInformationUser(UserHandle
,
8901 UserInformationClass
,
8909 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
8912 return STATUS_NOT_IMPLEMENTED
;
8918 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
8921 return STATUS_NOT_IMPLEMENTED
;
8927 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
8930 return STATUS_NOT_IMPLEMENTED
;
8936 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
8937 OUT SAMPR_HANDLE
*ServerHandle
,
8938 IN
unsigned long ClientRevision
,
8939 IN ACCESS_MASK DesiredAccess
)
8942 return STATUS_NOT_IMPLEMENTED
;
8948 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
8951 return STATUS_NOT_IMPLEMENTED
;
8957 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
8958 IN ACCESS_MASK DesiredAccess
,
8959 IN
unsigned long InVersion
,
8960 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
8961 OUT
unsigned long *OutVersion
,
8962 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
8963 OUT SAMPR_HANDLE
*ServerHandle
)
8966 return STATUS_NOT_IMPLEMENTED
;
8972 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
8973 IN
unsigned long Rid
,
8977 return STATUS_NOT_IMPLEMENTED
;
8983 SamrSetDSRMPassword(IN handle_t BindingHandle
,
8984 IN PRPC_UNICODE_STRING Unused
,
8985 IN
unsigned long UserId
,
8986 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
8989 return STATUS_NOT_IMPLEMENTED
;
8995 SamrValidatePassword(IN handle_t Handle
,
8996 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
8997 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
8998 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
9001 return STATUS_NOT_IMPLEMENTED
;