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
;
1773 PSECURITY_DESCRIPTOR Sd
= NULL
;
1780 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1781 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1783 /* Map generic access rights */
1784 RtlMapGenericMask(&DesiredAccess
,
1787 RtlAcquireResourceExclusive(&SampResource
,
1790 /* Validate the domain handle */
1791 Status
= SampValidateDbObject(DomainHandle
,
1793 DOMAIN_CREATE_GROUP
,
1795 if (!NT_SUCCESS(Status
))
1797 TRACE("failed with status 0x%08lx\n", Status
);
1801 /* Check the group account name */
1802 Status
= SampCheckAccountName(Name
, 256);
1803 if (!NT_SUCCESS(Status
))
1805 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
1809 /* Check if the group name already exists in the domain */
1810 Status
= SampCheckAccountNameInDomain(DomainObject
,
1812 if (!NT_SUCCESS(Status
))
1814 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1815 Name
->Buffer
, Status
);
1819 /* Create the security descriptor */
1820 Status
= SampCreateGroupSD(&Sd
,
1822 if (!NT_SUCCESS(Status
))
1824 TRACE("SampCreateGroupSD failed (Status 0x%08lx)\n", Status
);
1828 /* Get the fixed domain attributes */
1829 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1830 Status
= SampGetObjectAttribute(DomainObject
,
1833 (PVOID
)&FixedDomainData
,
1835 if (!NT_SUCCESS(Status
))
1837 TRACE("failed with status 0x%08lx\n", Status
);
1841 /* Increment the NextRid attribute */
1842 ulRid
= FixedDomainData
.NextRid
;
1843 FixedDomainData
.NextRid
++;
1845 /* Store the fixed domain attributes */
1846 Status
= SampSetObjectAttribute(DomainObject
,
1851 if (!NT_SUCCESS(Status
))
1853 TRACE("failed with status 0x%08lx\n", Status
);
1857 TRACE("RID: %lx\n", ulRid
);
1859 /* Convert the RID into a string (hex) */
1860 swprintf(szRid
, L
"%08lX", ulRid
);
1862 /* Create the group object */
1863 Status
= SampCreateDbObject(DomainObject
,
1870 if (!NT_SUCCESS(Status
))
1872 TRACE("failed with status 0x%08lx\n", Status
);
1876 /* Add the account name of the user object */
1877 Status
= SampSetAccountNameInDomain(DomainObject
,
1881 if (!NT_SUCCESS(Status
))
1883 TRACE("failed with status 0x%08lx\n", Status
);
1887 /* Initialize fixed user data */
1888 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1889 FixedGroupData
.Version
= 1;
1890 FixedGroupData
.GroupId
= ulRid
;
1892 /* Set fixed user data attribute */
1893 Status
= SampSetObjectAttribute(GroupObject
,
1896 (LPVOID
)&FixedGroupData
,
1897 sizeof(SAM_GROUP_FIXED_DATA
));
1898 if (!NT_SUCCESS(Status
))
1900 TRACE("failed with status 0x%08lx\n", Status
);
1904 /* Set the Name attribute */
1905 Status
= SampSetObjectAttributeString(GroupObject
,
1908 if (!NT_SUCCESS(Status
))
1910 TRACE("failed with status 0x%08lx\n", Status
);
1914 /* Set the AdminComment attribute */
1915 Status
= SampSetObjectAttributeString(GroupObject
,
1918 if (!NT_SUCCESS(Status
))
1920 TRACE("failed with status 0x%08lx\n", Status
);
1924 /* Set the SecDesc attribute*/
1925 Status
= SampSetObjectAttribute(GroupObject
,
1930 if (!NT_SUCCESS(Status
))
1932 TRACE("failed with status 0x%08lx\n", Status
);
1936 if (NT_SUCCESS(Status
))
1938 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1939 *RelativeId
= ulRid
;
1944 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
1946 RtlReleaseResource(&SampResource
);
1948 TRACE("returns with status 0x%08lx\n", Status
);
1957 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1958 IN OUT
unsigned long *EnumerationContext
,
1959 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1960 IN
unsigned long PreferedMaximumLength
,
1961 OUT
unsigned long *CountReturned
)
1963 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1964 PSAM_DB_OBJECT DomainObject
;
1965 HANDLE GroupsKeyHandle
= NULL
;
1966 HANDLE NamesKeyHandle
= NULL
;
1967 WCHAR GroupName
[64];
1969 ULONG EnumCount
= 0;
1970 ULONG RequiredLength
= 0;
1975 BOOLEAN MoreEntries
= FALSE
;
1978 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1979 DomainHandle
, EnumerationContext
, Buffer
,
1980 PreferedMaximumLength
, CountReturned
);
1982 RtlAcquireResourceShared(&SampResource
,
1985 /* Validate the domain handle */
1986 Status
= SampValidateDbObject(DomainHandle
,
1988 DOMAIN_LIST_ACCOUNTS
,
1990 if (!NT_SUCCESS(Status
))
1993 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1997 if (!NT_SUCCESS(Status
))
2000 Status
= SampRegOpenKey(GroupsKeyHandle
,
2004 if (!NT_SUCCESS(Status
))
2009 EnumIndex
= *EnumerationContext
;
2013 NameLength
= 64 * sizeof(WCHAR
);
2014 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2021 if (!NT_SUCCESS(Status
))
2023 if (Status
== STATUS_NO_MORE_ENTRIES
)
2024 Status
= STATUS_SUCCESS
;
2028 TRACE("EnumIndex: %lu\n", EnumIndex
);
2029 TRACE("Group name: %S\n", GroupName
);
2030 TRACE("Name length: %lu\n", NameLength
);
2032 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2038 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2044 TRACE("EnumCount: %lu\n", EnumCount
);
2045 TRACE("RequiredLength: %lu\n", RequiredLength
);
2047 if (!NT_SUCCESS(Status
))
2050 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2051 if (EnumBuffer
== NULL
)
2053 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2057 EnumBuffer
->EntriesRead
= EnumCount
;
2061 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2062 if (EnumBuffer
->Buffer
== NULL
)
2064 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2070 EnumIndex
= *EnumerationContext
;
2071 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2073 NameLength
= 64 * sizeof(WCHAR
);
2074 DataLength
= sizeof(ULONG
);
2075 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2082 if (!NT_SUCCESS(Status
))
2084 if (Status
== STATUS_NO_MORE_ENTRIES
)
2085 Status
= STATUS_SUCCESS
;
2089 TRACE("EnumIndex: %lu\n", EnumIndex
);
2090 TRACE("Group name: %S\n", GroupName
);
2091 TRACE("Name length: %lu\n", NameLength
);
2092 TRACE("RID: %lu\n", Rid
);
2094 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2096 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2097 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2099 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2101 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2102 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2104 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2108 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2110 EnumBuffer
->Buffer
[i
].Name
.Length
);
2115 if (NT_SUCCESS(Status
))
2117 *EnumerationContext
+= EnumCount
;
2118 *Buffer
= EnumBuffer
;
2119 *CountReturned
= EnumCount
;
2123 *EnumerationContext
= 0;
2127 if (EnumBuffer
!= NULL
)
2129 if (EnumBuffer
->Buffer
!= NULL
)
2131 if (EnumBuffer
->EntriesRead
!= 0)
2133 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2135 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2136 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2140 midl_user_free(EnumBuffer
->Buffer
);
2143 midl_user_free(EnumBuffer
);
2147 SampRegCloseKey(&NamesKeyHandle
);
2148 SampRegCloseKey(&GroupsKeyHandle
);
2150 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2151 Status
= STATUS_MORE_ENTRIES
;
2153 RtlReleaseResource(&SampResource
);
2162 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
2163 IN PRPC_UNICODE_STRING Name
,
2164 IN ACCESS_MASK DesiredAccess
,
2165 OUT SAMPR_HANDLE
*UserHandle
,
2166 OUT
unsigned long *RelativeId
)
2168 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2169 SAM_USER_FIXED_DATA FixedUserData
;
2170 PSAM_DB_OBJECT DomainObject
;
2171 PSAM_DB_OBJECT UserObject
;
2172 GROUP_MEMBERSHIP GroupMembership
;
2173 UCHAR LogonHours
[23];
2177 PSECURITY_DESCRIPTOR Sd
= NULL
;
2179 PSID UserSid
= NULL
;
2182 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2183 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2186 Name
->Length
== 0 ||
2187 Name
->Buffer
== NULL
||
2188 UserHandle
== NULL
||
2190 return STATUS_INVALID_PARAMETER
;
2192 /* Map generic access rights */
2193 RtlMapGenericMask(&DesiredAccess
,
2196 RtlAcquireResourceExclusive(&SampResource
,
2199 /* Validate the domain handle */
2200 Status
= SampValidateDbObject(DomainHandle
,
2204 if (!NT_SUCCESS(Status
))
2206 TRACE("failed with status 0x%08lx\n", Status
);
2210 /* Check the user account name */
2211 Status
= SampCheckAccountName(Name
, 20);
2212 if (!NT_SUCCESS(Status
))
2214 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
2218 /* Check if the user name already exists in the domain */
2219 Status
= SampCheckAccountNameInDomain(DomainObject
,
2221 if (!NT_SUCCESS(Status
))
2223 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2224 Name
->Buffer
, Status
);
2228 /* Get the fixed domain attributes */
2229 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2230 Status
= SampGetObjectAttribute(DomainObject
,
2233 (PVOID
)&FixedDomainData
,
2235 if (!NT_SUCCESS(Status
))
2237 TRACE("failed with status 0x%08lx\n", Status
);
2241 /* Increment the NextRid attribute */
2242 ulRid
= FixedDomainData
.NextRid
;
2243 FixedDomainData
.NextRid
++;
2245 TRACE("RID: %lx\n", ulRid
);
2247 /* Create the user SID */
2248 Status
= SampCreateAccountSid(DomainObject
,
2251 if (!NT_SUCCESS(Status
))
2253 TRACE("SampCreateAccountSid failed (Status 0x%08lx)\n", Status
);
2257 /* Create the security descriptor */
2258 Status
= SampCreateUserSD(UserSid
,
2261 if (!NT_SUCCESS(Status
))
2263 TRACE("SampCreateUserSD failed (Status 0x%08lx)\n", Status
);
2267 /* Store the fixed domain attributes */
2268 Status
= SampSetObjectAttribute(DomainObject
,
2273 if (!NT_SUCCESS(Status
))
2275 TRACE("failed with status 0x%08lx\n", Status
);
2279 /* Convert the RID into a string (hex) */
2280 swprintf(szRid
, L
"%08lX", ulRid
);
2282 /* Create the user object */
2283 Status
= SampCreateDbObject(DomainObject
,
2290 if (!NT_SUCCESS(Status
))
2292 TRACE("failed with status 0x%08lx\n", Status
);
2296 /* Add the account name for the user object */
2297 Status
= SampSetAccountNameInDomain(DomainObject
,
2301 if (!NT_SUCCESS(Status
))
2303 TRACE("failed with status 0x%08lx\n", Status
);
2307 /* Initialize fixed user data */
2308 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2309 FixedUserData
.Version
= 1;
2310 FixedUserData
.Reserved
= 0;
2311 FixedUserData
.LastLogon
.QuadPart
= 0;
2312 FixedUserData
.LastLogoff
.QuadPart
= 0;
2313 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2314 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2315 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2316 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2317 FixedUserData
.UserId
= ulRid
;
2318 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2319 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2320 USER_PASSWORD_NOT_REQUIRED
|
2321 USER_NORMAL_ACCOUNT
;
2322 FixedUserData
.CountryCode
= 0;
2323 FixedUserData
.CodePage
= 0;
2324 FixedUserData
.BadPasswordCount
= 0;
2325 FixedUserData
.LogonCount
= 0;
2326 FixedUserData
.AdminCount
= 0;
2327 FixedUserData
.OperatorCount
= 0;
2329 /* Set fixed user data attribute */
2330 Status
= SampSetObjectAttribute(UserObject
,
2333 (LPVOID
)&FixedUserData
,
2334 sizeof(SAM_USER_FIXED_DATA
));
2335 if (!NT_SUCCESS(Status
))
2337 TRACE("failed with status 0x%08lx\n", Status
);
2341 /* Set the Name attribute */
2342 Status
= SampSetObjectAttributeString(UserObject
,
2345 if (!NT_SUCCESS(Status
))
2347 TRACE("failed with status 0x%08lx\n", Status
);
2351 /* Set the FullName attribute */
2352 Status
= SampSetObjectAttributeString(UserObject
,
2355 if (!NT_SUCCESS(Status
))
2357 TRACE("failed with status 0x%08lx\n", Status
);
2361 /* Set the HomeDirectory attribute */
2362 Status
= SampSetObjectAttributeString(UserObject
,
2365 if (!NT_SUCCESS(Status
))
2367 TRACE("failed with status 0x%08lx\n", Status
);
2371 /* Set the HomeDirectoryDrive attribute */
2372 Status
= SampSetObjectAttributeString(UserObject
,
2373 L
"HomeDirectoryDrive",
2375 if (!NT_SUCCESS(Status
))
2377 TRACE("failed with status 0x%08lx\n", Status
);
2381 /* Set the ScriptPath attribute */
2382 Status
= SampSetObjectAttributeString(UserObject
,
2385 if (!NT_SUCCESS(Status
))
2387 TRACE("failed with status 0x%08lx\n", Status
);
2391 /* Set the ProfilePath attribute */
2392 Status
= SampSetObjectAttributeString(UserObject
,
2395 if (!NT_SUCCESS(Status
))
2397 TRACE("failed with status 0x%08lx\n", Status
);
2401 /* Set the AdminComment attribute */
2402 Status
= SampSetObjectAttributeString(UserObject
,
2405 if (!NT_SUCCESS(Status
))
2407 TRACE("failed with status 0x%08lx\n", Status
);
2411 /* Set the UserComment attribute */
2412 Status
= SampSetObjectAttributeString(UserObject
,
2415 if (!NT_SUCCESS(Status
))
2417 TRACE("failed with status 0x%08lx\n", Status
);
2421 /* Set the WorkStations attribute */
2422 Status
= SampSetObjectAttributeString(UserObject
,
2425 if (!NT_SUCCESS(Status
))
2427 TRACE("failed with status 0x%08lx\n", Status
);
2431 /* Set the Parameters attribute */
2432 Status
= SampSetObjectAttributeString(UserObject
,
2435 if (!NT_SUCCESS(Status
))
2437 TRACE("failed with status 0x%08lx\n", Status
);
2441 /* Set LogonHours attribute*/
2442 *((PUSHORT
)LogonHours
) = 168;
2443 memset(&(LogonHours
[2]), 0xff, 21);
2445 Status
= SampSetObjectAttribute(UserObject
,
2449 sizeof(LogonHours
));
2450 if (!NT_SUCCESS(Status
))
2452 TRACE("failed with status 0x%08lx\n", Status
);
2456 /* Set Groups attribute*/
2457 GroupMembership
.RelativeId
= DOMAIN_GROUP_RID_USERS
;
2458 GroupMembership
.Attributes
= SE_GROUP_MANDATORY
|
2460 SE_GROUP_ENABLED_BY_DEFAULT
;
2462 Status
= SampSetObjectAttribute(UserObject
,
2466 sizeof(GROUP_MEMBERSHIP
));
2467 if (!NT_SUCCESS(Status
))
2469 TRACE("failed with status 0x%08lx\n", Status
);
2473 /* Set LMPwd attribute*/
2474 Status
= SampSetObjectAttribute(UserObject
,
2478 sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
2479 if (!NT_SUCCESS(Status
))
2481 TRACE("failed with status 0x%08lx\n", Status
);
2485 /* Set NTPwd attribute*/
2486 Status
= SampSetObjectAttribute(UserObject
,
2490 sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
2491 if (!NT_SUCCESS(Status
))
2493 TRACE("failed with status 0x%08lx\n", Status
);
2497 /* Set LMPwdHistory attribute*/
2498 Status
= SampSetObjectAttribute(UserObject
,
2503 if (!NT_SUCCESS(Status
))
2505 TRACE("failed with status 0x%08lx\n", Status
);
2509 /* Set NTPwdHistory attribute*/
2510 Status
= SampSetObjectAttribute(UserObject
,
2515 if (!NT_SUCCESS(Status
))
2517 TRACE("failed with status 0x%08lx\n", Status
);
2521 /* Set the PrivateData attribute */
2522 Status
= SampSetObjectAttributeString(UserObject
,
2525 if (!NT_SUCCESS(Status
))
2527 TRACE("failed with status 0x%08lx\n", Status
);
2531 /* Set the SecDesc attribute*/
2532 Status
= SampSetObjectAttribute(UserObject
,
2537 if (!NT_SUCCESS(Status
))
2539 TRACE("failed with status 0x%08lx\n", Status
);
2543 if (NT_SUCCESS(Status
))
2545 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2546 *RelativeId
= ulRid
;
2551 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
2553 if (UserSid
!= NULL
)
2554 RtlFreeHeap(RtlGetProcessHeap(), 0, UserSid
);
2556 RtlReleaseResource(&SampResource
);
2558 TRACE("returns with status 0x%08lx\n", Status
);
2567 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2568 IN OUT
unsigned long *EnumerationContext
,
2569 IN
unsigned long UserAccountControl
,
2570 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2571 IN
unsigned long PreferedMaximumLength
,
2572 OUT
unsigned long *CountReturned
)
2574 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2575 PSAM_DB_OBJECT DomainObject
;
2576 HANDLE UsersKeyHandle
= NULL
;
2577 HANDLE NamesKeyHandle
= NULL
;
2580 ULONG EnumCount
= 0;
2581 ULONG RequiredLength
= 0;
2586 BOOLEAN MoreEntries
= FALSE
;
2589 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2590 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2591 PreferedMaximumLength
, CountReturned
);
2593 RtlAcquireResourceShared(&SampResource
,
2596 /* Validate the domain handle */
2597 Status
= SampValidateDbObject(DomainHandle
,
2599 DOMAIN_LIST_ACCOUNTS
,
2601 if (!NT_SUCCESS(Status
))
2604 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2608 if (!NT_SUCCESS(Status
))
2611 Status
= SampRegOpenKey(UsersKeyHandle
,
2615 if (!NT_SUCCESS(Status
))
2620 EnumIndex
= *EnumerationContext
;
2624 NameLength
= 64 * sizeof(WCHAR
);
2625 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2632 if (!NT_SUCCESS(Status
))
2634 if (Status
== STATUS_NO_MORE_ENTRIES
)
2635 Status
= STATUS_SUCCESS
;
2639 TRACE("EnumIndex: %lu\n", EnumIndex
);
2640 TRACE("User name: %S\n", UserName
);
2641 TRACE("Name length: %lu\n", NameLength
);
2643 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2649 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2655 TRACE("EnumCount: %lu\n", EnumCount
);
2656 TRACE("RequiredLength: %lu\n", RequiredLength
);
2658 if (!NT_SUCCESS(Status
))
2661 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2662 if (EnumBuffer
== NULL
)
2664 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2668 EnumBuffer
->EntriesRead
= EnumCount
;
2672 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2673 if (EnumBuffer
->Buffer
== NULL
)
2675 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2681 EnumIndex
= *EnumerationContext
;
2682 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2684 NameLength
= 64 * sizeof(WCHAR
);
2685 DataLength
= sizeof(ULONG
);
2686 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2693 if (!NT_SUCCESS(Status
))
2695 if (Status
== STATUS_NO_MORE_ENTRIES
)
2696 Status
= STATUS_SUCCESS
;
2700 TRACE("EnumIndex: %lu\n", EnumIndex
);
2701 TRACE("User name: %S\n", UserName
);
2702 TRACE("Name length: %lu\n", NameLength
);
2703 TRACE("RID: %lu\n", Rid
);
2705 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2707 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2708 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2710 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2712 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2713 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2715 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2719 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2721 EnumBuffer
->Buffer
[i
].Name
.Length
);
2726 if (NT_SUCCESS(Status
))
2728 *EnumerationContext
+= EnumCount
;
2729 *Buffer
= EnumBuffer
;
2730 *CountReturned
= EnumCount
;
2734 *EnumerationContext
= 0;
2738 if (EnumBuffer
!= NULL
)
2740 if (EnumBuffer
->Buffer
!= NULL
)
2742 if (EnumBuffer
->EntriesRead
!= 0)
2744 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2746 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2747 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2751 midl_user_free(EnumBuffer
->Buffer
);
2754 midl_user_free(EnumBuffer
);
2758 SampRegCloseKey(&NamesKeyHandle
);
2759 SampRegCloseKey(&UsersKeyHandle
);
2761 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2762 Status
= STATUS_MORE_ENTRIES
;
2764 RtlReleaseResource(&SampResource
);
2773 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2774 IN PRPC_UNICODE_STRING AccountName
,
2775 IN ACCESS_MASK DesiredAccess
,
2776 OUT SAMPR_HANDLE
*AliasHandle
,
2777 OUT
unsigned long *RelativeId
)
2779 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2780 PSAM_DB_OBJECT DomainObject
;
2781 PSAM_DB_OBJECT AliasObject
;
2782 PSECURITY_DESCRIPTOR Sd
= NULL
;
2789 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2790 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2792 /* Map generic access rights */
2793 RtlMapGenericMask(&DesiredAccess
,
2796 RtlAcquireResourceExclusive(&SampResource
,
2799 /* Validate the domain handle */
2800 Status
= SampValidateDbObject(DomainHandle
,
2802 DOMAIN_CREATE_ALIAS
,
2804 if (!NT_SUCCESS(Status
))
2806 TRACE("failed with status 0x%08lx\n", Status
);
2810 /* Check the alias acoount name */
2811 Status
= SampCheckAccountName(AccountName
, 256);
2812 if (!NT_SUCCESS(Status
))
2814 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
2818 /* Check if the alias name already exists in the domain */
2819 Status
= SampCheckAccountNameInDomain(DomainObject
,
2820 AccountName
->Buffer
);
2821 if (!NT_SUCCESS(Status
))
2823 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2824 AccountName
->Buffer
, Status
);
2828 /* Create the security descriptor */
2829 Status
= SampCreateAliasSD(&Sd
,
2831 if (!NT_SUCCESS(Status
))
2833 TRACE("SampCreateAliasSD failed (Status 0x%08lx)\n", Status
);
2837 /* Get the fixed domain attributes */
2838 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2839 Status
= SampGetObjectAttribute(DomainObject
,
2842 (PVOID
)&FixedDomainData
,
2844 if (!NT_SUCCESS(Status
))
2846 TRACE("failed with status 0x%08lx\n", Status
);
2850 /* Increment the NextRid attribute */
2851 ulRid
= FixedDomainData
.NextRid
;
2852 FixedDomainData
.NextRid
++;
2854 /* Store the fixed domain attributes */
2855 Status
= SampSetObjectAttribute(DomainObject
,
2860 if (!NT_SUCCESS(Status
))
2862 TRACE("failed with status 0x%08lx\n", Status
);
2866 TRACE("RID: %lx\n", ulRid
);
2868 /* Convert the RID into a string (hex) */
2869 swprintf(szRid
, L
"%08lX", ulRid
);
2871 /* Create the alias object */
2872 Status
= SampCreateDbObject(DomainObject
,
2879 if (!NT_SUCCESS(Status
))
2881 TRACE("failed with status 0x%08lx\n", Status
);
2885 /* Add the account name for the alias object */
2886 Status
= SampSetAccountNameInDomain(DomainObject
,
2888 AccountName
->Buffer
,
2890 if (!NT_SUCCESS(Status
))
2892 TRACE("failed with status 0x%08lx\n", Status
);
2896 /* Set the Name attribute */
2897 Status
= SampSetObjectAttributeString(AliasObject
,
2900 if (!NT_SUCCESS(Status
))
2902 TRACE("failed with status 0x%08lx\n", Status
);
2906 /* Set the Description attribute */
2907 Status
= SampSetObjectAttributeString(AliasObject
,
2910 if (!NT_SUCCESS(Status
))
2912 TRACE("failed with status 0x%08lx\n", Status
);
2916 /* Set the SecDesc attribute*/
2917 Status
= SampSetObjectAttribute(AliasObject
,
2922 if (!NT_SUCCESS(Status
))
2924 TRACE("failed with status 0x%08lx\n", Status
);
2928 if (NT_SUCCESS(Status
))
2930 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2931 *RelativeId
= ulRid
;
2936 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
2938 RtlReleaseResource(&SampResource
);
2940 TRACE("returns with status 0x%08lx\n", Status
);
2949 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2950 IN OUT
unsigned long *EnumerationContext
,
2951 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2952 IN
unsigned long PreferedMaximumLength
,
2953 OUT
unsigned long *CountReturned
)
2955 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2956 PSAM_DB_OBJECT DomainObject
;
2957 HANDLE AliasesKeyHandle
= NULL
;
2958 HANDLE NamesKeyHandle
= NULL
;
2959 WCHAR AliasName
[64];
2961 ULONG EnumCount
= 0;
2962 ULONG RequiredLength
= 0;
2967 BOOLEAN MoreEntries
= FALSE
;
2970 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2971 DomainHandle
, EnumerationContext
, Buffer
,
2972 PreferedMaximumLength
, CountReturned
);
2974 RtlAcquireResourceShared(&SampResource
,
2977 /* Validate the domain handle */
2978 Status
= SampValidateDbObject(DomainHandle
,
2980 DOMAIN_LIST_ACCOUNTS
,
2982 if (!NT_SUCCESS(Status
))
2985 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2989 if (!NT_SUCCESS(Status
))
2992 Status
= SampRegOpenKey(AliasesKeyHandle
,
2996 if (!NT_SUCCESS(Status
))
3001 EnumIndex
= *EnumerationContext
;
3005 NameLength
= 64 * sizeof(WCHAR
);
3006 Status
= SampRegEnumerateValue(NamesKeyHandle
,
3013 if (!NT_SUCCESS(Status
))
3015 if (Status
== STATUS_NO_MORE_ENTRIES
)
3016 Status
= STATUS_SUCCESS
;
3020 TRACE("EnumIndex: %lu\n", EnumIndex
);
3021 TRACE("Alias name: %S\n", AliasName
);
3022 TRACE("Name length: %lu\n", NameLength
);
3024 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
3030 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
3036 TRACE("EnumCount: %lu\n", EnumCount
);
3037 TRACE("RequiredLength: %lu\n", RequiredLength
);
3039 if (!NT_SUCCESS(Status
))
3042 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
3043 if (EnumBuffer
== NULL
)
3045 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3049 EnumBuffer
->EntriesRead
= EnumCount
;
3053 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
3054 if (EnumBuffer
->Buffer
== NULL
)
3056 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3062 EnumIndex
= *EnumerationContext
;
3063 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
3065 NameLength
= 64 * sizeof(WCHAR
);
3066 DataLength
= sizeof(ULONG
);
3067 Status
= SampRegEnumerateValue(NamesKeyHandle
,
3074 if (!NT_SUCCESS(Status
))
3076 if (Status
== STATUS_NO_MORE_ENTRIES
)
3077 Status
= STATUS_SUCCESS
;
3081 TRACE("EnumIndex: %lu\n", EnumIndex
);
3082 TRACE("Alias name: %S\n", AliasName
);
3083 TRACE("Name length: %lu\n", NameLength
);
3084 TRACE("RID: %lu\n", Rid
);
3086 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
3088 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
3089 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
3091 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
3093 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
3094 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
3096 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3100 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
3102 EnumBuffer
->Buffer
[i
].Name
.Length
);
3107 if (NT_SUCCESS(Status
))
3109 *EnumerationContext
+= EnumCount
;
3110 *Buffer
= EnumBuffer
;
3111 *CountReturned
= EnumCount
;
3115 *EnumerationContext
= 0;
3119 if (EnumBuffer
!= NULL
)
3121 if (EnumBuffer
->Buffer
!= NULL
)
3123 if (EnumBuffer
->EntriesRead
!= 0)
3125 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
3127 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
3128 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
3132 midl_user_free(EnumBuffer
->Buffer
);
3135 midl_user_free(EnumBuffer
);
3139 SampRegCloseKey(&NamesKeyHandle
);
3140 SampRegCloseKey(&AliasesKeyHandle
);
3142 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
3143 Status
= STATUS_MORE_ENTRIES
;
3145 RtlReleaseResource(&SampResource
);
3154 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
3155 IN PSAMPR_PSID_ARRAY SidArray
,
3156 OUT PSAMPR_ULONG_ARRAY Membership
)
3158 PSAM_DB_OBJECT DomainObject
;
3159 HANDLE AliasesKeyHandle
= NULL
;
3160 HANDLE MembersKeyHandle
= NULL
;
3161 HANDLE MemberKeyHandle
= NULL
;
3162 LPWSTR MemberSidString
= NULL
;
3163 PULONG RidArray
= NULL
;
3164 ULONG MaxSidCount
= 0;
3169 WCHAR NameBuffer
[9];
3171 TRACE("SamrGetAliasMembership(%p %p %p)\n",
3172 DomainHandle
, SidArray
, Membership
);
3174 RtlAcquireResourceShared(&SampResource
,
3177 /* Validate the domain handle */
3178 Status
= SampValidateDbObject(DomainHandle
,
3180 DOMAIN_GET_ALIAS_MEMBERSHIP
,
3182 if (!NT_SUCCESS(Status
))
3185 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3189 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3190 if (!NT_SUCCESS(Status
))
3193 Status
= SampRegOpenKey(AliasesKeyHandle
,
3197 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3199 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3201 Status
= STATUS_SUCCESS
;
3205 if (!NT_SUCCESS(Status
))
3208 for (i
= 0; i
< SidArray
->Count
; i
++)
3210 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3211 TRACE("Open %S\n", MemberSidString
);
3213 Status
= SampRegOpenKey(MembersKeyHandle
,
3217 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3218 if (NT_SUCCESS(Status
))
3220 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3223 if (NT_SUCCESS(Status
))
3225 TRACE("Found %lu values\n", ValueCount
);
3226 MaxSidCount
+= ValueCount
;
3229 SampRegCloseKey(&MemberKeyHandle
);
3232 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3233 Status
= STATUS_SUCCESS
;
3235 LocalFree(MemberSidString
);
3238 if (MaxSidCount
== 0)
3240 Status
= STATUS_SUCCESS
;
3244 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
3245 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
3246 if (RidArray
== NULL
)
3248 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3252 for (i
= 0; i
< SidArray
->Count
; i
++)
3254 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3255 TRACE("Open %S\n", MemberSidString
);
3257 Status
= SampRegOpenKey(MembersKeyHandle
,
3261 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3262 if (NT_SUCCESS(Status
))
3264 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3267 if (NT_SUCCESS(Status
))
3269 TRACE("Found %lu values\n", ValueCount
);
3271 for (j
= 0; j
< ValueCount
; j
++)
3273 DataLength
= 9 * sizeof(WCHAR
);
3274 Status
= SampRegEnumerateValue(MemberKeyHandle
,
3281 if (NT_SUCCESS(Status
))
3283 RidArray
[j
] = wcstoul(NameBuffer
, NULL
, 16);
3288 SampRegCloseKey(&MemberKeyHandle
);
3291 LocalFree(MemberSidString
);
3295 SampRegCloseKey(&MembersKeyHandle
);
3296 SampRegCloseKey(&AliasesKeyHandle
);
3298 if (NT_SUCCESS(Status
))
3300 Membership
->Count
= MaxSidCount
;
3301 Membership
->Element
= RidArray
;
3305 if (RidArray
!= NULL
)
3306 midl_user_free(RidArray
);
3309 RtlReleaseResource(&SampResource
);
3318 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
3320 IN RPC_UNICODE_STRING Names
[],
3321 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
3322 OUT PSAMPR_ULONG_ARRAY Use
)
3324 PSAM_DB_OBJECT DomainObject
;
3325 HANDLE AccountsKeyHandle
= NULL
;
3326 HANDLE NamesKeyHandle
= NULL
;
3327 ULONG MappedCount
= 0;
3333 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
3334 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
3336 RtlAcquireResourceShared(&SampResource
,
3339 /* Validate the domain handle */
3340 Status
= SampValidateDbObject(DomainHandle
,
3344 if (!NT_SUCCESS(Status
))
3346 TRACE("failed with status 0x%08lx\n", Status
);
3350 RelativeIds
->Count
= 0;
3355 Status
= STATUS_SUCCESS
;
3359 /* Allocate the relative IDs array */
3360 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3361 if (RelativeIds
->Element
== NULL
)
3363 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3367 /* Allocate the use array */
3368 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3369 if (Use
->Element
== NULL
)
3371 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3375 RelativeIds
->Count
= Count
;
3378 for (i
= 0; i
< Count
; i
++)
3380 TRACE("Name: %S\n", Names
[i
].Buffer
);
3384 /* Lookup aliases */
3385 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3388 &AccountsKeyHandle
);
3389 if (NT_SUCCESS(Status
))
3391 Status
= SampRegOpenKey(AccountsKeyHandle
,
3395 if (NT_SUCCESS(Status
))
3397 DataLength
= sizeof(ULONG
);
3398 Status
= SampRegQueryValue(NamesKeyHandle
,
3404 SampRegCloseKey(&NamesKeyHandle
);
3407 SampRegCloseKey(&AccountsKeyHandle
);
3410 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3413 /* Return alias account */
3414 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3416 TRACE("Rid: %lu\n", RelativeId
);
3417 RelativeIds
->Element
[i
] = RelativeId
;
3418 Use
->Element
[i
] = SidTypeAlias
;
3424 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3427 &AccountsKeyHandle
);
3428 if (NT_SUCCESS(Status
))
3430 Status
= SampRegOpenKey(AccountsKeyHandle
,
3434 if (NT_SUCCESS(Status
))
3436 DataLength
= sizeof(ULONG
);
3437 Status
= SampRegQueryValue(NamesKeyHandle
,
3443 SampRegCloseKey(&NamesKeyHandle
);
3446 SampRegCloseKey(&AccountsKeyHandle
);
3449 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3452 /* Return group account */
3453 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3455 TRACE("Rid: %lu\n", RelativeId
);
3456 RelativeIds
->Element
[i
] = RelativeId
;
3457 Use
->Element
[i
] = SidTypeGroup
;
3463 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3466 &AccountsKeyHandle
);
3467 if (NT_SUCCESS(Status
))
3469 Status
= SampRegOpenKey(AccountsKeyHandle
,
3473 if (NT_SUCCESS(Status
))
3475 DataLength
= sizeof(ULONG
);
3476 Status
= SampRegQueryValue(NamesKeyHandle
,
3482 SampRegCloseKey(&NamesKeyHandle
);
3485 SampRegCloseKey(&AccountsKeyHandle
);
3488 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3491 /* Return user account */
3492 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3494 TRACE("Rid: %lu\n", RelativeId
);
3495 RelativeIds
->Element
[i
] = RelativeId
;
3496 Use
->Element
[i
] = SidTypeUser
;
3501 /* Return unknown account */
3502 RelativeIds
->Element
[i
] = 0;
3503 Use
->Element
[i
] = SidTypeUnknown
;
3507 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3508 Status
= STATUS_SUCCESS
;
3510 if (NT_SUCCESS(Status
))
3512 if (MappedCount
== 0)
3513 Status
= STATUS_NONE_MAPPED
;
3514 else if (MappedCount
< Count
)
3515 Status
= STATUS_SOME_NOT_MAPPED
;
3519 if (RelativeIds
->Element
!= NULL
)
3521 midl_user_free(RelativeIds
->Element
);
3522 RelativeIds
->Element
= NULL
;
3525 RelativeIds
->Count
= 0;
3527 if (Use
->Element
!= NULL
)
3529 midl_user_free(Use
->Element
);
3530 Use
->Element
= NULL
;
3536 RtlReleaseResource(&SampResource
);
3538 TRACE("Returned Status %lx\n", Status
);
3547 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3549 IN ULONG
*RelativeIds
,
3550 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3551 OUT PSAMPR_ULONG_ARRAY Use
)
3553 PSAM_DB_OBJECT DomainObject
;
3555 HANDLE AccountsKeyHandle
= NULL
;
3556 HANDLE AccountKeyHandle
= NULL
;
3557 ULONG MappedCount
= 0;
3562 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3563 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3565 RtlAcquireResourceShared(&SampResource
,
3568 /* Validate the domain handle */
3569 Status
= SampValidateDbObject(DomainHandle
,
3573 if (!NT_SUCCESS(Status
))
3575 TRACE("failed with status 0x%08lx\n", Status
);
3584 Status
= STATUS_SUCCESS
;
3588 /* Allocate the names array */
3589 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3590 if (Names
->Element
== NULL
)
3592 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3596 /* Allocate the use array */
3597 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3598 if (Use
->Element
== NULL
)
3600 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3604 Names
->Count
= Count
;
3607 for (i
= 0; i
< Count
; i
++)
3609 TRACE("RID: %lu\n", RelativeIds
[i
]);
3611 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3613 /* Lookup aliases */
3614 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3617 &AccountsKeyHandle
);
3618 if (NT_SUCCESS(Status
))
3620 Status
= SampRegOpenKey(AccountsKeyHandle
,
3624 if (NT_SUCCESS(Status
))
3627 Status
= SampRegQueryValue(AccountKeyHandle
,
3632 if (NT_SUCCESS(Status
))
3634 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3635 if (Names
->Element
[i
].Buffer
== NULL
)
3636 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3638 if (NT_SUCCESS(Status
))
3640 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3641 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3643 Status
= SampRegQueryValue(AccountKeyHandle
,
3646 Names
->Element
[i
].Buffer
,
3651 SampRegCloseKey(&AccountKeyHandle
);
3654 SampRegCloseKey(&AccountsKeyHandle
);
3657 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3660 /* Return alias account */
3661 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3663 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3664 Use
->Element
[i
] = SidTypeAlias
;
3670 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3673 &AccountsKeyHandle
);
3674 if (NT_SUCCESS(Status
))
3676 Status
= SampRegOpenKey(AccountsKeyHandle
,
3680 if (NT_SUCCESS(Status
))
3683 Status
= SampRegQueryValue(AccountKeyHandle
,
3688 if (NT_SUCCESS(Status
))
3690 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3691 if (Names
->Element
[i
].Buffer
== NULL
)
3692 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3694 if (NT_SUCCESS(Status
))
3696 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3697 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3699 Status
= SampRegQueryValue(AccountKeyHandle
,
3702 Names
->Element
[i
].Buffer
,
3707 SampRegCloseKey(&AccountKeyHandle
);
3710 SampRegCloseKey(&AccountsKeyHandle
);
3713 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3716 /* Return group account */
3717 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3719 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3720 Use
->Element
[i
] = SidTypeGroup
;
3726 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3729 &AccountsKeyHandle
);
3730 if (NT_SUCCESS(Status
))
3732 Status
= SampRegOpenKey(AccountsKeyHandle
,
3736 if (NT_SUCCESS(Status
))
3739 Status
= SampRegQueryValue(AccountKeyHandle
,
3744 if (NT_SUCCESS(Status
))
3746 TRACE("DataLength: %lu\n", DataLength
);
3748 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3749 if (Names
->Element
[i
].Buffer
== NULL
)
3750 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3752 if (NT_SUCCESS(Status
))
3754 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3755 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3757 Status
= SampRegQueryValue(AccountKeyHandle
,
3760 Names
->Element
[i
].Buffer
,
3765 SampRegCloseKey(&AccountKeyHandle
);
3768 SampRegCloseKey(&AccountsKeyHandle
);
3771 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3774 /* Return user account */
3775 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3777 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3778 Use
->Element
[i
] = SidTypeUser
;
3783 /* Return unknown account */
3784 Use
->Element
[i
] = SidTypeUnknown
;
3788 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3789 Status
= STATUS_SUCCESS
;
3791 if (NT_SUCCESS(Status
))
3793 if (MappedCount
== 0)
3794 Status
= STATUS_NONE_MAPPED
;
3795 else if (MappedCount
< Count
)
3796 Status
= STATUS_SOME_NOT_MAPPED
;
3800 if (Names
->Element
!= NULL
)
3802 for (i
= 0; i
< Count
; i
++)
3804 if (Names
->Element
[i
].Buffer
!= NULL
)
3805 midl_user_free(Names
->Element
[i
].Buffer
);
3808 midl_user_free(Names
->Element
);
3809 Names
->Element
= NULL
;
3814 if (Use
->Element
!= NULL
)
3816 midl_user_free(Use
->Element
);
3817 Use
->Element
= NULL
;
3823 RtlReleaseResource(&SampResource
);
3832 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3833 IN ACCESS_MASK DesiredAccess
,
3834 IN
unsigned long GroupId
,
3835 OUT SAMPR_HANDLE
*GroupHandle
)
3837 PSAM_DB_OBJECT DomainObject
;
3838 PSAM_DB_OBJECT GroupObject
;
3842 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3843 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3845 /* Map generic access rights */
3846 RtlMapGenericMask(&DesiredAccess
,
3849 RtlAcquireResourceShared(&SampResource
,
3852 /* Validate the domain handle */
3853 Status
= SampValidateDbObject(DomainHandle
,
3857 if (!NT_SUCCESS(Status
))
3859 TRACE("failed with status 0x%08lx\n", Status
);
3863 /* Convert the RID into a string (hex) */
3864 swprintf(szRid
, L
"%08lX", GroupId
);
3866 /* Create the group object */
3867 Status
= SampOpenDbObject(DomainObject
,
3874 if (!NT_SUCCESS(Status
))
3876 TRACE("failed with status 0x%08lx\n", Status
);
3880 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3883 RtlReleaseResource(&SampResource
);
3890 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3891 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3893 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3894 SAM_GROUP_FIXED_DATA FixedData
;
3895 ULONG MembersLength
= 0;
3901 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3902 if (InfoBuffer
== NULL
)
3903 return STATUS_INSUFFICIENT_RESOURCES
;
3905 Status
= SampGetObjectAttributeString(GroupObject
,
3907 &InfoBuffer
->General
.Name
);
3908 if (!NT_SUCCESS(Status
))
3910 TRACE("Status 0x%08lx\n", Status
);
3914 Status
= SampGetObjectAttributeString(GroupObject
,
3916 &InfoBuffer
->General
.AdminComment
);
3917 if (!NT_SUCCESS(Status
))
3919 TRACE("Status 0x%08lx\n", Status
);
3923 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3924 Status
= SampGetObjectAttribute(GroupObject
,
3929 if (!NT_SUCCESS(Status
))
3932 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3934 Status
= SampGetObjectAttribute(GroupObject
,
3939 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3942 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3943 InfoBuffer
->General
.MemberCount
= 0;
3945 InfoBuffer
->General
.MemberCount
= MembersLength
/ sizeof(ULONG
);
3947 *Buffer
= InfoBuffer
;
3950 if (!NT_SUCCESS(Status
))
3952 if (InfoBuffer
!= NULL
)
3954 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3955 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3957 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3958 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3960 midl_user_free(InfoBuffer
);
3969 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3970 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3972 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3977 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3978 if (InfoBuffer
== NULL
)
3979 return STATUS_INSUFFICIENT_RESOURCES
;
3981 Status
= SampGetObjectAttributeString(GroupObject
,
3983 &InfoBuffer
->Name
.Name
);
3984 if (!NT_SUCCESS(Status
))
3986 TRACE("Status 0x%08lx\n", Status
);
3990 *Buffer
= InfoBuffer
;
3993 if (!NT_SUCCESS(Status
))
3995 if (InfoBuffer
!= NULL
)
3997 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3998 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4000 midl_user_free(InfoBuffer
);
4009 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
4010 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4012 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
4013 SAM_GROUP_FIXED_DATA FixedData
;
4019 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
4020 if (InfoBuffer
== NULL
)
4021 return STATUS_INSUFFICIENT_RESOURCES
;
4023 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
4024 Status
= SampGetObjectAttribute(GroupObject
,
4029 if (!NT_SUCCESS(Status
))
4032 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
4034 *Buffer
= InfoBuffer
;
4037 if (!NT_SUCCESS(Status
))
4039 if (InfoBuffer
!= NULL
)
4041 midl_user_free(InfoBuffer
);
4050 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
4051 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4053 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
4058 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
4059 if (InfoBuffer
== NULL
)
4060 return STATUS_INSUFFICIENT_RESOURCES
;
4062 Status
= SampGetObjectAttributeString(GroupObject
,
4064 &InfoBuffer
->AdminComment
.AdminComment
);
4065 if (!NT_SUCCESS(Status
))
4067 TRACE("Status 0x%08lx\n", Status
);
4071 *Buffer
= InfoBuffer
;
4074 if (!NT_SUCCESS(Status
))
4076 if (InfoBuffer
!= NULL
)
4078 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4079 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4081 midl_user_free(InfoBuffer
);
4092 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
4093 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
4094 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4096 PSAM_DB_OBJECT GroupObject
;
4099 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
4100 GroupHandle
, GroupInformationClass
, Buffer
);
4102 RtlAcquireResourceShared(&SampResource
,
4105 /* Validate the group handle */
4106 Status
= SampValidateDbObject(GroupHandle
,
4108 GROUP_READ_INFORMATION
,
4110 if (!NT_SUCCESS(Status
))
4113 switch (GroupInformationClass
)
4115 case GroupGeneralInformation
:
4116 Status
= SampQueryGroupGeneral(GroupObject
,
4120 case GroupNameInformation
:
4121 Status
= SampQueryGroupName(GroupObject
,
4125 case GroupAttributeInformation
:
4126 Status
= SampQueryGroupAttribute(GroupObject
,
4130 case GroupAdminCommentInformation
:
4131 Status
= SampQueryGroupAdminComment(GroupObject
,
4136 Status
= STATUS_INVALID_INFO_CLASS
;
4141 RtlReleaseResource(&SampResource
);
4148 SampSetGroupName(PSAM_DB_OBJECT GroupObject
,
4149 PSAMPR_GROUP_INFO_BUFFER Buffer
)
4151 UNICODE_STRING OldGroupName
= {0, 0, NULL
};
4152 UNICODE_STRING NewGroupName
;
4155 Status
= SampGetObjectAttributeString(GroupObject
,
4157 (PRPC_UNICODE_STRING
)&OldGroupName
);
4158 if (!NT_SUCCESS(Status
))
4160 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
4164 /* Check the new account name */
4165 Status
= SampCheckAccountName(&Buffer
->Name
.Name
, 256);
4166 if (!NT_SUCCESS(Status
))
4168 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
4172 NewGroupName
.Length
= Buffer
->Name
.Name
.Length
;
4173 NewGroupName
.MaximumLength
= Buffer
->Name
.Name
.MaximumLength
;
4174 NewGroupName
.Buffer
= Buffer
->Name
.Name
.Buffer
;
4176 if (!RtlEqualUnicodeString(&OldGroupName
, &NewGroupName
, TRUE
))
4178 Status
= SampCheckAccountNameInDomain(GroupObject
->ParentObject
,
4179 NewGroupName
.Buffer
);
4180 if (!NT_SUCCESS(Status
))
4182 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
4183 NewGroupName
.Buffer
, Status
);
4188 Status
= SampSetAccountNameInDomain(GroupObject
->ParentObject
,
4190 NewGroupName
.Buffer
,
4191 GroupObject
->RelativeId
);
4192 if (!NT_SUCCESS(Status
))
4194 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
4198 Status
= SampRemoveAccountNameFromDomain(GroupObject
->ParentObject
,
4200 OldGroupName
.Buffer
);
4201 if (!NT_SUCCESS(Status
))
4203 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
4207 Status
= SampSetObjectAttributeString(GroupObject
,
4209 (PRPC_UNICODE_STRING
)&NewGroupName
);
4210 if (!NT_SUCCESS(Status
))
4212 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
4216 if (OldGroupName
.Buffer
!= NULL
)
4217 midl_user_free(OldGroupName
.Buffer
);
4224 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
4225 PSAMPR_GROUP_INFO_BUFFER Buffer
)
4227 SAM_GROUP_FIXED_DATA FixedData
;
4231 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
4232 Status
= SampGetObjectAttribute(GroupObject
,
4237 if (!NT_SUCCESS(Status
))
4240 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
4242 Status
= SampSetObjectAttribute(GroupObject
,
4256 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
4257 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
4258 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
4260 PSAM_DB_OBJECT GroupObject
;
4263 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
4264 GroupHandle
, GroupInformationClass
, Buffer
);
4266 RtlAcquireResourceExclusive(&SampResource
,
4269 /* Validate the group handle */
4270 Status
= SampValidateDbObject(GroupHandle
,
4272 GROUP_WRITE_ACCOUNT
,
4274 if (!NT_SUCCESS(Status
))
4277 switch (GroupInformationClass
)
4279 case GroupNameInformation
:
4280 Status
= SampSetGroupName(GroupObject
,
4284 case GroupAttributeInformation
:
4285 Status
= SampSetGroupAttribute(GroupObject
,
4289 case GroupAdminCommentInformation
:
4290 Status
= SampSetObjectAttributeString(GroupObject
,
4292 &Buffer
->AdminComment
.AdminComment
);
4296 Status
= STATUS_INVALID_INFO_CLASS
;
4301 RtlReleaseResource(&SampResource
);
4310 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
4311 IN
unsigned long MemberId
,
4312 IN
unsigned long Attributes
)
4314 PSAM_DB_OBJECT GroupObject
;
4315 PSAM_DB_OBJECT UserObject
= NULL
;
4318 TRACE("(%p %lu %lx)\n",
4319 GroupHandle
, MemberId
, Attributes
);
4321 RtlAcquireResourceExclusive(&SampResource
,
4324 /* Validate the group handle */
4325 Status
= SampValidateDbObject(GroupHandle
,
4329 if (!NT_SUCCESS(Status
))
4332 /* Open the user object in the same domain */
4333 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4337 if (!NT_SUCCESS(Status
))
4339 TRACE("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4343 /* Add group membership to the user object */
4344 Status
= SampAddGroupMembershipToUser(UserObject
,
4345 GroupObject
->RelativeId
,
4347 if (!NT_SUCCESS(Status
))
4349 TRACE("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4353 /* Add the member to the group object */
4354 Status
= SampAddMemberToGroup(GroupObject
,
4356 if (!NT_SUCCESS(Status
))
4358 TRACE("SampAddMemberToGroup() failed (Status 0x%08lx)\n", Status
);
4363 SampCloseDbObject(UserObject
);
4365 RtlReleaseResource(&SampResource
);
4374 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
4376 PSAM_DB_OBJECT GroupObject
;
4380 TRACE("(%p)\n", GroupHandle
);
4382 RtlAcquireResourceExclusive(&SampResource
,
4385 /* Validate the group handle */
4386 Status
= SampValidateDbObject(*GroupHandle
,
4390 if (!NT_SUCCESS(Status
))
4392 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
4396 /* Fail, if the group is built-in */
4397 if (GroupObject
->RelativeId
< 1000)
4399 TRACE("You can not delete a special account!\n");
4400 Status
= STATUS_SPECIAL_ACCOUNT
;
4404 /* Get the length of the Members attribute */
4405 SampGetObjectAttribute(GroupObject
,
4411 /* Fail, if the group has members */
4414 TRACE("There are still members in the group!\n");
4415 Status
= STATUS_MEMBER_IN_GROUP
;
4419 /* FIXME: Remove the group from all aliases */
4421 /* Delete the group from the database */
4422 Status
= SampDeleteAccountDbObject(GroupObject
);
4423 if (!NT_SUCCESS(Status
))
4425 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4429 /* Invalidate the handle */
4430 *GroupHandle
= NULL
;
4433 RtlReleaseResource(&SampResource
);
4442 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
4443 IN
unsigned long MemberId
)
4445 PSAM_DB_OBJECT GroupObject
;
4446 PSAM_DB_OBJECT UserObject
= NULL
;
4450 GroupHandle
, MemberId
);
4452 RtlAcquireResourceExclusive(&SampResource
,
4455 /* Validate the group handle */
4456 Status
= SampValidateDbObject(GroupHandle
,
4458 GROUP_REMOVE_MEMBER
,
4460 if (!NT_SUCCESS(Status
))
4463 /* Open the user object in the same domain */
4464 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4468 if (!NT_SUCCESS(Status
))
4470 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4474 /* Remove group membership from the user object */
4475 Status
= SampRemoveGroupMembershipFromUser(UserObject
,
4476 GroupObject
->RelativeId
);
4477 if (!NT_SUCCESS(Status
))
4479 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4483 /* Remove the member from the group object */
4484 Status
= SampRemoveMemberFromGroup(GroupObject
,
4486 if (!NT_SUCCESS(Status
))
4488 ERR("SampRemoveMemberFromGroup() failed (Status 0x%08lx)\n", Status
);
4493 SampCloseDbObject(UserObject
);
4495 RtlReleaseResource(&SampResource
);
4504 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
4505 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
4507 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
4508 PSAM_DB_OBJECT GroupObject
;
4513 RtlAcquireResourceShared(&SampResource
,
4516 /* Validate the group handle */
4517 Status
= SampValidateDbObject(GroupHandle
,
4521 if (!NT_SUCCESS(Status
))
4524 MembersBuffer
= midl_user_allocate(sizeof(SAMPR_GET_MEMBERS_BUFFER
));
4525 if (MembersBuffer
== NULL
)
4527 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4531 SampGetObjectAttribute(GroupObject
,
4539 MembersBuffer
->MemberCount
= 0;
4540 MembersBuffer
->Members
= NULL
;
4541 MembersBuffer
->Attributes
= NULL
;
4543 *Members
= MembersBuffer
;
4545 Status
= STATUS_SUCCESS
;
4549 MembersBuffer
->Members
= midl_user_allocate(Length
);
4550 if (MembersBuffer
->Members
== NULL
)
4552 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4556 MembersBuffer
->Attributes
= midl_user_allocate(Length
);
4557 if (MembersBuffer
->Attributes
== NULL
)
4559 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4563 Status
= SampGetObjectAttribute(GroupObject
,
4566 MembersBuffer
->Members
,
4568 if (!NT_SUCCESS(Status
))
4570 TRACE("SampGetObjectAttributes() failed (Status 0x%08lx)\n", Status
);
4574 MembersBuffer
->MemberCount
= Length
/ sizeof(ULONG
);
4576 for (i
= 0; i
< MembersBuffer
->MemberCount
; i
++)
4578 Status
= SampGetUserGroupAttributes(GroupObject
->ParentObject
,
4579 MembersBuffer
->Members
[i
],
4580 GroupObject
->RelativeId
,
4581 &(MembersBuffer
->Attributes
[i
]));
4582 if (!NT_SUCCESS(Status
))
4584 TRACE("SampGetUserGroupAttributes() failed (Status 0x%08lx)\n", Status
);
4589 *Members
= MembersBuffer
;
4592 if (!NT_SUCCESS(Status
))
4594 if (MembersBuffer
!= NULL
)
4596 if (MembersBuffer
->Members
!= NULL
)
4597 midl_user_free(MembersBuffer
->Members
);
4599 if (MembersBuffer
->Attributes
!= NULL
)
4600 midl_user_free(MembersBuffer
->Attributes
);
4602 midl_user_free(MembersBuffer
);
4606 RtlReleaseResource(&SampResource
);
4615 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
4616 IN
unsigned long MemberId
,
4617 IN
unsigned long Attributes
)
4619 PSAM_DB_OBJECT GroupObject
;
4622 RtlAcquireResourceExclusive(&SampResource
,
4625 /* Validate the group handle */
4626 Status
= SampValidateDbObject(GroupHandle
,
4630 if (!NT_SUCCESS(Status
))
4632 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
4636 Status
= SampSetUserGroupAttributes(GroupObject
->ParentObject
,
4638 GroupObject
->RelativeId
,
4640 if (!NT_SUCCESS(Status
))
4642 TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status
);
4646 RtlReleaseResource(&SampResource
);
4655 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
4656 IN ACCESS_MASK DesiredAccess
,
4658 OUT SAMPR_HANDLE
*AliasHandle
)
4660 PSAM_DB_OBJECT DomainObject
;
4661 PSAM_DB_OBJECT AliasObject
;
4665 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4666 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4668 /* Map generic access rights */
4669 RtlMapGenericMask(&DesiredAccess
,
4672 RtlAcquireResourceShared(&SampResource
,
4675 /* Validate the domain handle */
4676 Status
= SampValidateDbObject(DomainHandle
,
4680 if (!NT_SUCCESS(Status
))
4682 TRACE("failed with status 0x%08lx\n", Status
);
4686 /* Convert the RID into a string (hex) */
4687 swprintf(szRid
, L
"%08lX", AliasId
);
4689 /* Create the alias object */
4690 Status
= SampOpenDbObject(DomainObject
,
4697 if (!NT_SUCCESS(Status
))
4699 TRACE("failed with status 0x%08lx\n", Status
);
4703 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4706 RtlReleaseResource(&SampResource
);
4713 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4714 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4716 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4717 HANDLE MembersKeyHandle
= NULL
;
4722 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4723 if (InfoBuffer
== NULL
)
4724 return STATUS_INSUFFICIENT_RESOURCES
;
4726 Status
= SampGetObjectAttributeString(AliasObject
,
4728 &InfoBuffer
->General
.Name
);
4729 if (!NT_SUCCESS(Status
))
4731 TRACE("Status 0x%08lx\n", Status
);
4735 Status
= SampGetObjectAttributeString(AliasObject
,
4737 &InfoBuffer
->General
.AdminComment
);
4738 if (!NT_SUCCESS(Status
))
4740 TRACE("Status 0x%08lx\n", Status
);
4744 /* Open the Members subkey */
4745 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4749 if (NT_SUCCESS(Status
))
4751 /* Retrieve the number of members of the alias */
4752 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4754 &InfoBuffer
->General
.MemberCount
);
4755 if (!NT_SUCCESS(Status
))
4757 TRACE("Status 0x%08lx\n", Status
);
4761 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4763 InfoBuffer
->General
.MemberCount
= 0;
4764 Status
= STATUS_SUCCESS
;
4768 TRACE("Status 0x%08lx\n", Status
);
4772 *Buffer
= InfoBuffer
;
4775 SampRegCloseKey(&MembersKeyHandle
);
4777 if (!NT_SUCCESS(Status
))
4779 if (InfoBuffer
!= NULL
)
4781 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4782 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4784 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4785 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4787 midl_user_free(InfoBuffer
);
4796 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4797 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4799 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4804 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4805 if (InfoBuffer
== NULL
)
4806 return STATUS_INSUFFICIENT_RESOURCES
;
4808 Status
= SampGetObjectAttributeString(AliasObject
,
4810 &InfoBuffer
->Name
.Name
);
4811 if (!NT_SUCCESS(Status
))
4813 TRACE("Status 0x%08lx\n", Status
);
4817 *Buffer
= InfoBuffer
;
4820 if (!NT_SUCCESS(Status
))
4822 if (InfoBuffer
!= NULL
)
4824 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4825 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4827 midl_user_free(InfoBuffer
);
4836 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4837 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4839 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4844 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4845 if (InfoBuffer
== NULL
)
4846 return STATUS_INSUFFICIENT_RESOURCES
;
4848 Status
= SampGetObjectAttributeString(AliasObject
,
4850 &InfoBuffer
->AdminComment
.AdminComment
);
4851 if (!NT_SUCCESS(Status
))
4853 TRACE("Status 0x%08lx\n", Status
);
4857 *Buffer
= InfoBuffer
;
4860 if (!NT_SUCCESS(Status
))
4862 if (InfoBuffer
!= NULL
)
4864 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4865 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4867 midl_user_free(InfoBuffer
);
4878 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4879 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4880 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4882 PSAM_DB_OBJECT AliasObject
;
4885 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4886 AliasHandle
, AliasInformationClass
, Buffer
);
4888 RtlAcquireResourceShared(&SampResource
,
4891 /* Validate the alias handle */
4892 Status
= SampValidateDbObject(AliasHandle
,
4894 ALIAS_READ_INFORMATION
,
4896 if (!NT_SUCCESS(Status
))
4899 switch (AliasInformationClass
)
4901 case AliasGeneralInformation
:
4902 Status
= SampQueryAliasGeneral(AliasObject
,
4906 case AliasNameInformation
:
4907 Status
= SampQueryAliasName(AliasObject
,
4911 case AliasAdminCommentInformation
:
4912 Status
= SampQueryAliasAdminComment(AliasObject
,
4917 Status
= STATUS_INVALID_INFO_CLASS
;
4922 RtlReleaseResource(&SampResource
);
4929 SampSetAliasName(PSAM_DB_OBJECT AliasObject
,
4930 PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4932 UNICODE_STRING OldAliasName
= {0, 0, NULL
};
4933 UNICODE_STRING NewAliasName
;
4936 Status
= SampGetObjectAttributeString(AliasObject
,
4938 (PRPC_UNICODE_STRING
)&OldAliasName
);
4939 if (!NT_SUCCESS(Status
))
4941 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
4945 /* Check the new account name */
4946 Status
= SampCheckAccountName(&Buffer
->Name
.Name
, 256);
4947 if (!NT_SUCCESS(Status
))
4949 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
4953 NewAliasName
.Length
= Buffer
->Name
.Name
.Length
;
4954 NewAliasName
.MaximumLength
= Buffer
->Name
.Name
.MaximumLength
;
4955 NewAliasName
.Buffer
= Buffer
->Name
.Name
.Buffer
;
4957 if (!RtlEqualUnicodeString(&OldAliasName
, &NewAliasName
, TRUE
))
4959 Status
= SampCheckAccountNameInDomain(AliasObject
->ParentObject
,
4960 NewAliasName
.Buffer
);
4961 if (!NT_SUCCESS(Status
))
4963 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
4964 NewAliasName
.Buffer
, Status
);
4969 Status
= SampSetAccountNameInDomain(AliasObject
->ParentObject
,
4971 NewAliasName
.Buffer
,
4972 AliasObject
->RelativeId
);
4973 if (!NT_SUCCESS(Status
))
4975 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
4979 Status
= SampRemoveAccountNameFromDomain(AliasObject
->ParentObject
,
4981 OldAliasName
.Buffer
);
4982 if (!NT_SUCCESS(Status
))
4984 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
4988 Status
= SampSetObjectAttributeString(AliasObject
,
4990 (PRPC_UNICODE_STRING
)&NewAliasName
);
4991 if (!NT_SUCCESS(Status
))
4993 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
4997 if (OldAliasName
.Buffer
!= NULL
)
4998 midl_user_free(OldAliasName
.Buffer
);
5007 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
5008 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
5009 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
5011 PSAM_DB_OBJECT AliasObject
;
5014 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
5015 AliasHandle
, AliasInformationClass
, Buffer
);
5017 RtlAcquireResourceExclusive(&SampResource
,
5020 /* Validate the alias handle */
5021 Status
= SampValidateDbObject(AliasHandle
,
5023 ALIAS_WRITE_ACCOUNT
,
5025 if (!NT_SUCCESS(Status
))
5028 switch (AliasInformationClass
)
5030 case AliasNameInformation
:
5031 Status
= SampSetAliasName(AliasObject
,
5035 case AliasAdminCommentInformation
:
5036 Status
= SampSetObjectAttributeString(AliasObject
,
5038 &Buffer
->AdminComment
.AdminComment
);
5042 Status
= STATUS_INVALID_INFO_CLASS
;
5047 RtlReleaseResource(&SampResource
);
5056 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
5058 PSAM_DB_OBJECT AliasObject
;
5061 RtlAcquireResourceExclusive(&SampResource
,
5064 /* Validate the alias handle */
5065 Status
= SampValidateDbObject(*AliasHandle
,
5069 if (!NT_SUCCESS(Status
))
5071 TRACE("SampValidateDbObject failed (Status 0x%08lx)\n", Status
);
5075 /* Fail, if the alias is built-in */
5076 if (AliasObject
->RelativeId
< 1000)
5078 TRACE("You can not delete a special account!\n");
5079 Status
= STATUS_SPECIAL_ACCOUNT
;
5083 /* Remove all members from the alias */
5084 Status
= SampRemoveAllMembersFromAlias(AliasObject
);
5085 if (!NT_SUCCESS(Status
))
5087 TRACE("SampRemoveAllMembersFromAlias() failed (Status 0x%08lx)\n", Status
);
5091 /* Delete the alias from the database */
5092 Status
= SampDeleteAccountDbObject(AliasObject
);
5093 if (!NT_SUCCESS(Status
))
5095 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5099 /* Invalidate the handle */
5100 *AliasHandle
= NULL
;
5103 RtlReleaseResource(&SampResource
);
5112 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
5113 IN PRPC_SID MemberId
)
5115 PSAM_DB_OBJECT AliasObject
;
5118 TRACE("(%p %p)\n", AliasHandle
, MemberId
);
5120 RtlAcquireResourceExclusive(&SampResource
,
5123 /* Validate the alias handle */
5124 Status
= SampValidateDbObject(AliasHandle
,
5128 if (!NT_SUCCESS(Status
))
5130 TRACE("failed with status 0x%08lx\n", Status
);
5134 Status
= SampAddMemberToAlias(AliasObject
,
5136 if (!NT_SUCCESS(Status
))
5138 TRACE("failed with status 0x%08lx\n", Status
);
5142 RtlReleaseResource(&SampResource
);
5151 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
5152 IN PRPC_SID MemberId
)
5154 PSAM_DB_OBJECT AliasObject
;
5157 TRACE("(%p %p)\n", AliasHandle
, MemberId
);
5159 RtlAcquireResourceExclusive(&SampResource
,
5162 /* Validate the alias handle */
5163 Status
= SampValidateDbObject(AliasHandle
,
5165 ALIAS_REMOVE_MEMBER
,
5167 if (!NT_SUCCESS(Status
))
5169 TRACE("failed with status 0x%08lx\n", Status
);
5173 Status
= SampRemoveMemberFromAlias(AliasObject
,
5175 if (!NT_SUCCESS(Status
))
5177 TRACE("failed with status 0x%08lx\n", Status
);
5181 RtlReleaseResource(&SampResource
);
5190 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
5191 OUT PSAMPR_PSID_ARRAY_OUT Members
)
5193 PSAM_DB_OBJECT AliasObject
;
5194 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
5195 ULONG MemberCount
= 0;
5199 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
5200 AliasHandle
, Members
);
5202 RtlAcquireResourceShared(&SampResource
,
5205 /* Validate the alias handle */
5206 Status
= SampValidateDbObject(AliasHandle
,
5210 if (!NT_SUCCESS(Status
))
5212 ERR("failed with status 0x%08lx\n", Status
);
5216 Status
= SampGetMembersInAlias(AliasObject
,
5220 /* Return the number of members and the member array */
5221 if (NT_SUCCESS(Status
))
5223 Members
->Count
= MemberCount
;
5224 Members
->Sids
= MemberArray
;
5228 /* Clean up the members array and the SID buffers if something failed */
5229 if (!NT_SUCCESS(Status
))
5231 if (MemberArray
!= NULL
)
5233 for (Index
= 0; Index
< MemberCount
; Index
++)
5235 if (MemberArray
[Index
].SidPointer
!= NULL
)
5236 midl_user_free(MemberArray
[Index
].SidPointer
);
5239 midl_user_free(MemberArray
);
5243 RtlReleaseResource(&SampResource
);
5252 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
5253 IN ACCESS_MASK DesiredAccess
,
5254 IN
unsigned long UserId
,
5255 OUT SAMPR_HANDLE
*UserHandle
)
5257 PSAM_DB_OBJECT DomainObject
;
5258 PSAM_DB_OBJECT UserObject
;
5262 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
5263 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
5265 /* Map generic access rights */
5266 RtlMapGenericMask(&DesiredAccess
,
5269 RtlAcquireResourceShared(&SampResource
,
5272 /* Validate the domain handle */
5273 Status
= SampValidateDbObject(DomainHandle
,
5277 if (!NT_SUCCESS(Status
))
5279 TRACE("failed with status 0x%08lx\n", Status
);
5283 /* Convert the RID into a string (hex) */
5284 swprintf(szRid
, L
"%08lX", UserId
);
5286 /* Create the user object */
5287 Status
= SampOpenDbObject(DomainObject
,
5294 if (!NT_SUCCESS(Status
))
5296 TRACE("failed with status 0x%08lx\n", Status
);
5300 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
5303 RtlReleaseResource(&SampResource
);
5312 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
5314 PSAM_DB_OBJECT UserObject
;
5317 TRACE("(%p)\n", UserHandle
);
5319 RtlAcquireResourceExclusive(&SampResource
,
5322 /* Validate the user handle */
5323 Status
= SampValidateDbObject(*UserHandle
,
5327 if (!NT_SUCCESS(Status
))
5329 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
5333 /* Fail, if the user is built-in */
5334 if (UserObject
->RelativeId
< 1000)
5336 TRACE("You can not delete a special account!\n");
5337 Status
= STATUS_SPECIAL_ACCOUNT
;
5341 /* FIXME: Remove the user from all groups */
5343 /* FIXME: Remove the user from all aliases */
5345 /* Delete the user from the database */
5346 Status
= SampDeleteAccountDbObject(UserObject
);
5347 if (!NT_SUCCESS(Status
))
5349 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5353 /* Invalidate the handle */
5357 RtlReleaseResource(&SampResource
);
5365 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
5366 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5368 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5369 SAM_USER_FIXED_DATA FixedData
;
5375 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5376 if (InfoBuffer
== NULL
)
5377 return STATUS_INSUFFICIENT_RESOURCES
;
5379 Length
= sizeof(SAM_USER_FIXED_DATA
);
5380 Status
= SampGetObjectAttribute(UserObject
,
5385 if (!NT_SUCCESS(Status
))
5388 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5390 /* Get the Name string */
5391 Status
= SampGetObjectAttributeString(UserObject
,
5393 &InfoBuffer
->General
.UserName
);
5394 if (!NT_SUCCESS(Status
))
5396 TRACE("Status 0x%08lx\n", Status
);
5400 /* Get the FullName string */
5401 Status
= SampGetObjectAttributeString(UserObject
,
5403 &InfoBuffer
->General
.FullName
);
5404 if (!NT_SUCCESS(Status
))
5406 TRACE("Status 0x%08lx\n", Status
);
5410 /* Get the AdminComment string */
5411 Status
= SampGetObjectAttributeString(UserObject
,
5413 &InfoBuffer
->General
.AdminComment
);
5414 if (!NT_SUCCESS(Status
))
5416 TRACE("Status 0x%08lx\n", Status
);
5420 /* Get the UserComment string */
5421 Status
= SampGetObjectAttributeString(UserObject
,
5423 &InfoBuffer
->General
.UserComment
);
5424 if (!NT_SUCCESS(Status
))
5426 TRACE("Status 0x%08lx\n", Status
);
5430 *Buffer
= InfoBuffer
;
5433 if (!NT_SUCCESS(Status
))
5435 if (InfoBuffer
!= NULL
)
5437 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
5438 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
5440 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
5441 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
5443 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
5444 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
5446 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
5447 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
5449 midl_user_free(InfoBuffer
);
5459 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
5460 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5462 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5463 SAM_USER_FIXED_DATA FixedData
;
5469 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5470 if (InfoBuffer
== NULL
)
5471 return STATUS_INSUFFICIENT_RESOURCES
;
5473 Length
= sizeof(SAM_USER_FIXED_DATA
);
5474 Status
= SampGetObjectAttribute(UserObject
,
5479 if (!NT_SUCCESS(Status
))
5482 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
5483 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
5485 /* Get the UserComment string */
5486 Status
= SampGetObjectAttributeString(UserObject
,
5488 &InfoBuffer
->Preferences
.UserComment
);
5489 if (!NT_SUCCESS(Status
))
5491 TRACE("Status 0x%08lx\n", Status
);
5495 *Buffer
= InfoBuffer
;
5498 if (!NT_SUCCESS(Status
))
5500 if (InfoBuffer
!= NULL
)
5502 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
5503 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
5505 midl_user_free(InfoBuffer
);
5515 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
5516 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5518 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5519 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
5520 SAM_USER_FIXED_DATA FixedData
;
5521 LARGE_INTEGER PasswordCanChange
;
5522 LARGE_INTEGER PasswordMustChange
;
5528 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5529 if (InfoBuffer
== NULL
)
5530 return STATUS_INSUFFICIENT_RESOURCES
;
5532 /* Get the fixed size domain data */
5533 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
5534 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
5537 (PVOID
)&DomainFixedData
,
5539 if (!NT_SUCCESS(Status
))
5542 /* Get the fixed size user data */
5543 Length
= sizeof(SAM_USER_FIXED_DATA
);
5544 Status
= SampGetObjectAttribute(UserObject
,
5549 if (!NT_SUCCESS(Status
))
5552 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
5553 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5554 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5555 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5556 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5557 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5558 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5559 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5560 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5561 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
5562 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
5564 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5565 DomainFixedData
.MinPasswordAge
);
5566 InfoBuffer
->Logon
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
5567 InfoBuffer
->Logon
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
5569 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5570 DomainFixedData
.MaxPasswordAge
);
5571 InfoBuffer
->Logon
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
5572 InfoBuffer
->Logon
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
5574 /* Get the Name string */
5575 Status
= SampGetObjectAttributeString(UserObject
,
5577 &InfoBuffer
->Logon
.UserName
);
5578 if (!NT_SUCCESS(Status
))
5580 TRACE("Status 0x%08lx\n", Status
);
5584 /* Get the FullName string */
5585 Status
= SampGetObjectAttributeString(UserObject
,
5587 &InfoBuffer
->Logon
.FullName
);
5588 if (!NT_SUCCESS(Status
))
5590 TRACE("Status 0x%08lx\n", Status
);
5594 /* Get the HomeDirectory string */
5595 Status
= SampGetObjectAttributeString(UserObject
,
5597 &InfoBuffer
->Logon
.HomeDirectory
);
5598 if (!NT_SUCCESS(Status
))
5600 TRACE("Status 0x%08lx\n", Status
);
5604 /* Get the HomeDirectoryDrive string */
5605 Status
= SampGetObjectAttributeString(UserObject
,
5606 L
"HomeDirectoryDrive",
5607 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
5608 if (!NT_SUCCESS(Status
))
5610 TRACE("Status 0x%08lx\n", Status
);
5614 /* Get the ScriptPath string */
5615 Status
= SampGetObjectAttributeString(UserObject
,
5617 &InfoBuffer
->Logon
.ScriptPath
);
5618 if (!NT_SUCCESS(Status
))
5620 TRACE("Status 0x%08lx\n", Status
);
5624 /* Get the ProfilePath string */
5625 Status
= SampGetObjectAttributeString(UserObject
,
5627 &InfoBuffer
->Logon
.ProfilePath
);
5628 if (!NT_SUCCESS(Status
))
5630 TRACE("Status 0x%08lx\n", Status
);
5634 /* Get the WorkStations string */
5635 Status
= SampGetObjectAttributeString(UserObject
,
5637 &InfoBuffer
->Logon
.WorkStations
);
5638 if (!NT_SUCCESS(Status
))
5640 TRACE("Status 0x%08lx\n", Status
);
5644 /* Get the LogonHours attribute */
5645 Status
= SampGetLogonHoursAttrbute(UserObject
,
5646 &InfoBuffer
->Logon
.LogonHours
);
5647 if (!NT_SUCCESS(Status
))
5649 TRACE("Status 0x%08lx\n", Status
);
5653 *Buffer
= InfoBuffer
;
5656 if (!NT_SUCCESS(Status
))
5658 if (InfoBuffer
!= NULL
)
5660 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
5661 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
5663 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
5664 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
5666 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
5667 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5669 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5670 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5672 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5673 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5675 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5676 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5678 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5679 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5681 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5682 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5684 midl_user_free(InfoBuffer
);
5694 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5695 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5697 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5698 SAM_USER_FIXED_DATA FixedData
;
5704 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5705 if (InfoBuffer
== NULL
)
5706 return STATUS_INSUFFICIENT_RESOURCES
;
5708 Length
= sizeof(SAM_USER_FIXED_DATA
);
5709 Status
= SampGetObjectAttribute(UserObject
,
5714 if (!NT_SUCCESS(Status
))
5717 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5718 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5719 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5720 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5721 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5722 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5723 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5724 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5725 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5726 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5727 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5728 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
5729 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
5731 /* Get the Name string */
5732 Status
= SampGetObjectAttributeString(UserObject
,
5734 &InfoBuffer
->Account
.UserName
);
5735 if (!NT_SUCCESS(Status
))
5737 TRACE("Status 0x%08lx\n", Status
);
5741 /* Get the FullName string */
5742 Status
= SampGetObjectAttributeString(UserObject
,
5744 &InfoBuffer
->Account
.FullName
);
5745 if (!NT_SUCCESS(Status
))
5747 TRACE("Status 0x%08lx\n", Status
);
5751 /* Get the HomeDirectory string */
5752 Status
= SampGetObjectAttributeString(UserObject
,
5754 &InfoBuffer
->Account
.HomeDirectory
);
5755 if (!NT_SUCCESS(Status
))
5757 TRACE("Status 0x%08lx\n", Status
);
5761 /* Get the HomeDirectoryDrive string */
5762 Status
= SampGetObjectAttributeString(UserObject
,
5763 L
"HomeDirectoryDrive",
5764 &InfoBuffer
->Account
.HomeDirectoryDrive
);
5765 if (!NT_SUCCESS(Status
))
5767 TRACE("Status 0x%08lx\n", Status
);
5771 /* Get the ScriptPath string */
5772 Status
= SampGetObjectAttributeString(UserObject
,
5774 &InfoBuffer
->Account
.ScriptPath
);
5775 if (!NT_SUCCESS(Status
))
5777 TRACE("Status 0x%08lx\n", Status
);
5781 /* Get the ProfilePath string */
5782 Status
= SampGetObjectAttributeString(UserObject
,
5784 &InfoBuffer
->Account
.ProfilePath
);
5785 if (!NT_SUCCESS(Status
))
5787 TRACE("Status 0x%08lx\n", Status
);
5791 /* Get the AdminComment string */
5792 Status
= SampGetObjectAttributeString(UserObject
,
5794 &InfoBuffer
->Account
.AdminComment
);
5795 if (!NT_SUCCESS(Status
))
5797 TRACE("Status 0x%08lx\n", Status
);
5801 /* Get the WorkStations string */
5802 Status
= SampGetObjectAttributeString(UserObject
,
5804 &InfoBuffer
->Account
.WorkStations
);
5805 if (!NT_SUCCESS(Status
))
5807 TRACE("Status 0x%08lx\n", Status
);
5811 /* Get the LogonHours attribute */
5812 Status
= SampGetLogonHoursAttrbute(UserObject
,
5813 &InfoBuffer
->Account
.LogonHours
);
5814 if (!NT_SUCCESS(Status
))
5816 TRACE("Status 0x%08lx\n", Status
);
5820 *Buffer
= InfoBuffer
;
5823 if (!NT_SUCCESS(Status
))
5825 if (InfoBuffer
!= NULL
)
5827 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5828 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5830 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5831 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5833 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5834 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5836 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5837 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5839 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5840 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5842 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5843 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5845 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5846 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5848 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5849 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5851 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5852 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5854 midl_user_free(InfoBuffer
);
5864 SampQueryUserLogonHours(PSAM_DB_OBJECT UserObject
,
5865 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5867 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5870 TRACE("(%p %p)\n", UserObject
, Buffer
);
5874 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5875 if (InfoBuffer
== NULL
)
5877 TRACE("Failed to allocate InfoBuffer!\n");
5878 return STATUS_INSUFFICIENT_RESOURCES
;
5881 Status
= SampGetLogonHoursAttrbute(UserObject
,
5882 &InfoBuffer
->LogonHours
.LogonHours
);
5883 if (!NT_SUCCESS(Status
))
5885 TRACE("SampGetLogonHoursAttrbute failed (Status 0x%08lx)\n", Status
);
5889 *Buffer
= InfoBuffer
;
5892 if (!NT_SUCCESS(Status
))
5894 if (InfoBuffer
!= NULL
)
5896 if (InfoBuffer
->LogonHours
.LogonHours
.LogonHours
!= NULL
)
5897 midl_user_free(InfoBuffer
->LogonHours
.LogonHours
.LogonHours
);
5899 midl_user_free(InfoBuffer
);
5909 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
5910 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5912 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5917 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5918 if (InfoBuffer
== NULL
)
5919 return STATUS_INSUFFICIENT_RESOURCES
;
5921 /* Get the Name string */
5922 Status
= SampGetObjectAttributeString(UserObject
,
5924 &InfoBuffer
->Name
.UserName
);
5925 if (!NT_SUCCESS(Status
))
5927 TRACE("Status 0x%08lx\n", Status
);
5931 /* Get the FullName string */
5932 Status
= SampGetObjectAttributeString(UserObject
,
5934 &InfoBuffer
->Name
.FullName
);
5935 if (!NT_SUCCESS(Status
))
5937 TRACE("Status 0x%08lx\n", Status
);
5941 *Buffer
= InfoBuffer
;
5944 if (!NT_SUCCESS(Status
))
5946 if (InfoBuffer
!= NULL
)
5948 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5949 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5951 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5952 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5954 midl_user_free(InfoBuffer
);
5963 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5964 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5966 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5971 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5972 if (InfoBuffer
== NULL
)
5973 return STATUS_INSUFFICIENT_RESOURCES
;
5975 /* Get the Name string */
5976 Status
= SampGetObjectAttributeString(UserObject
,
5978 &InfoBuffer
->AccountName
.UserName
);
5979 if (!NT_SUCCESS(Status
))
5981 TRACE("Status 0x%08lx\n", Status
);
5985 *Buffer
= InfoBuffer
;
5988 if (!NT_SUCCESS(Status
))
5990 if (InfoBuffer
!= NULL
)
5992 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5993 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5995 midl_user_free(InfoBuffer
);
6004 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
6005 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6007 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6012 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6013 if (InfoBuffer
== NULL
)
6014 return STATUS_INSUFFICIENT_RESOURCES
;
6016 /* Get the FullName string */
6017 Status
= SampGetObjectAttributeString(UserObject
,
6019 &InfoBuffer
->FullName
.FullName
);
6020 if (!NT_SUCCESS(Status
))
6022 TRACE("Status 0x%08lx\n", Status
);
6026 *Buffer
= InfoBuffer
;
6029 if (!NT_SUCCESS(Status
))
6031 if (InfoBuffer
!= NULL
)
6033 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
6034 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
6036 midl_user_free(InfoBuffer
);
6046 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
6047 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6049 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6050 SAM_USER_FIXED_DATA FixedData
;
6056 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6057 if (InfoBuffer
== NULL
)
6058 return STATUS_INSUFFICIENT_RESOURCES
;
6060 Length
= sizeof(SAM_USER_FIXED_DATA
);
6061 Status
= SampGetObjectAttribute(UserObject
,
6066 if (!NT_SUCCESS(Status
))
6069 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
6071 *Buffer
= InfoBuffer
;
6074 if (!NT_SUCCESS(Status
))
6076 if (InfoBuffer
!= NULL
)
6078 midl_user_free(InfoBuffer
);
6087 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
6088 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6090 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6095 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6096 if (InfoBuffer
== NULL
)
6097 return STATUS_INSUFFICIENT_RESOURCES
;
6099 /* Get the HomeDirectory string */
6100 Status
= SampGetObjectAttributeString(UserObject
,
6102 &InfoBuffer
->Home
.HomeDirectory
);
6103 if (!NT_SUCCESS(Status
))
6105 TRACE("Status 0x%08lx\n", Status
);
6109 /* Get the HomeDirectoryDrive string */
6110 Status
= SampGetObjectAttributeString(UserObject
,
6111 L
"HomeDirectoryDrive",
6112 &InfoBuffer
->Home
.HomeDirectoryDrive
);
6113 if (!NT_SUCCESS(Status
))
6115 TRACE("Status 0x%08lx\n", Status
);
6119 *Buffer
= InfoBuffer
;
6122 if (!NT_SUCCESS(Status
))
6124 if (InfoBuffer
!= NULL
)
6126 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
6127 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
6129 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
6130 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
6132 midl_user_free(InfoBuffer
);
6141 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
6142 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6144 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6149 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6150 if (InfoBuffer
== NULL
)
6151 return STATUS_INSUFFICIENT_RESOURCES
;
6153 /* Get the ScriptPath string */
6154 Status
= SampGetObjectAttributeString(UserObject
,
6156 &InfoBuffer
->Script
.ScriptPath
);
6157 if (!NT_SUCCESS(Status
))
6159 TRACE("Status 0x%08lx\n", Status
);
6163 *Buffer
= InfoBuffer
;
6166 if (!NT_SUCCESS(Status
))
6168 if (InfoBuffer
!= NULL
)
6170 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
6171 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
6173 midl_user_free(InfoBuffer
);
6182 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
6183 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6185 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6190 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6191 if (InfoBuffer
== NULL
)
6192 return STATUS_INSUFFICIENT_RESOURCES
;
6194 /* Get the ProfilePath string */
6195 Status
= SampGetObjectAttributeString(UserObject
,
6197 &InfoBuffer
->Profile
.ProfilePath
);
6198 if (!NT_SUCCESS(Status
))
6200 TRACE("Status 0x%08lx\n", Status
);
6204 *Buffer
= InfoBuffer
;
6207 if (!NT_SUCCESS(Status
))
6209 if (InfoBuffer
!= NULL
)
6211 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
6212 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
6214 midl_user_free(InfoBuffer
);
6223 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
6224 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6226 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6231 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6232 if (InfoBuffer
== NULL
)
6233 return STATUS_INSUFFICIENT_RESOURCES
;
6235 /* Get the AdminComment string */
6236 Status
= SampGetObjectAttributeString(UserObject
,
6238 &InfoBuffer
->AdminComment
.AdminComment
);
6239 if (!NT_SUCCESS(Status
))
6241 TRACE("Status 0x%08lx\n", Status
);
6245 *Buffer
= InfoBuffer
;
6248 if (!NT_SUCCESS(Status
))
6250 if (InfoBuffer
!= NULL
)
6252 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
6253 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
6255 midl_user_free(InfoBuffer
);
6264 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
6265 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6267 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6272 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6273 if (InfoBuffer
== NULL
)
6274 return STATUS_INSUFFICIENT_RESOURCES
;
6276 /* Get the WorkStations string */
6277 Status
= SampGetObjectAttributeString(UserObject
,
6279 &InfoBuffer
->WorkStations
.WorkStations
);
6280 if (!NT_SUCCESS(Status
))
6282 TRACE("Status 0x%08lx\n", Status
);
6286 *Buffer
= InfoBuffer
;
6289 if (!NT_SUCCESS(Status
))
6291 if (InfoBuffer
!= NULL
)
6293 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
6294 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
6296 midl_user_free(InfoBuffer
);
6306 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
6307 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6309 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6310 SAM_USER_FIXED_DATA FixedData
;
6316 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6317 if (InfoBuffer
== NULL
)
6318 return STATUS_INSUFFICIENT_RESOURCES
;
6320 Length
= sizeof(SAM_USER_FIXED_DATA
);
6321 Status
= SampGetObjectAttribute(UserObject
,
6326 if (!NT_SUCCESS(Status
))
6329 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
6331 *Buffer
= InfoBuffer
;
6334 if (!NT_SUCCESS(Status
))
6336 if (InfoBuffer
!= NULL
)
6338 midl_user_free(InfoBuffer
);
6348 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
6349 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6351 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6352 SAM_USER_FIXED_DATA FixedData
;
6358 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6359 if (InfoBuffer
== NULL
)
6360 return STATUS_INSUFFICIENT_RESOURCES
;
6362 Length
= sizeof(SAM_USER_FIXED_DATA
);
6363 Status
= SampGetObjectAttribute(UserObject
,
6368 if (!NT_SUCCESS(Status
))
6371 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6372 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6374 *Buffer
= InfoBuffer
;
6377 if (!NT_SUCCESS(Status
))
6379 if (InfoBuffer
!= NULL
)
6381 midl_user_free(InfoBuffer
);
6391 SampQueryUserInternal1(PSAM_DB_OBJECT UserObject
,
6392 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6394 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6396 NTSTATUS Status
= STATUS_SUCCESS
;
6398 /* Fail, if the caller is not a trusted caller */
6399 if (UserObject
->Trusted
== FALSE
)
6400 return STATUS_INVALID_INFO_CLASS
;
6404 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6405 if (InfoBuffer
== NULL
)
6406 return STATUS_INSUFFICIENT_RESOURCES
;
6408 InfoBuffer
->Internal1
.LmPasswordPresent
= FALSE
;
6409 InfoBuffer
->Internal1
.NtPasswordPresent
= FALSE
;
6411 /* Get the NT password */
6413 SampGetObjectAttribute(UserObject
,
6419 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6421 Status
= SampGetObjectAttribute(UserObject
,
6424 (PVOID
)&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6426 if (!NT_SUCCESS(Status
))
6429 if (memcmp(&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6431 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
6432 InfoBuffer
->Internal1
.NtPasswordPresent
= TRUE
;
6436 /* Get the LM password */
6438 SampGetObjectAttribute(UserObject
,
6444 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6446 Status
= SampGetObjectAttribute(UserObject
,
6449 (PVOID
)&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6451 if (!NT_SUCCESS(Status
))
6454 if (memcmp(&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6456 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
6457 InfoBuffer
->Internal1
.LmPasswordPresent
= TRUE
;
6460 InfoBuffer
->Internal1
.PasswordExpired
= FALSE
;
6462 *Buffer
= InfoBuffer
;
6465 if (!NT_SUCCESS(Status
))
6467 if (InfoBuffer
!= NULL
)
6469 midl_user_free(InfoBuffer
);
6478 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
6479 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6481 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6486 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6487 if (InfoBuffer
== NULL
)
6488 return STATUS_INSUFFICIENT_RESOURCES
;
6490 /* Get the Parameters string */
6491 Status
= SampGetObjectAttributeString(UserObject
,
6493 &InfoBuffer
->Parameters
.Parameters
);
6494 if (!NT_SUCCESS(Status
))
6496 TRACE("Status 0x%08lx\n", Status
);
6500 *Buffer
= InfoBuffer
;
6503 if (!NT_SUCCESS(Status
))
6505 if (InfoBuffer
!= NULL
)
6507 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
6508 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
6510 midl_user_free(InfoBuffer
);
6519 SampQueryUserAll(PSAM_DB_OBJECT UserObject
,
6520 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6522 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6523 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
6524 SAM_USER_FIXED_DATA FixedData
;
6525 LARGE_INTEGER PasswordCanChange
;
6526 LARGE_INTEGER PasswordMustChange
;
6532 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6533 if (InfoBuffer
== NULL
)
6534 return STATUS_INSUFFICIENT_RESOURCES
;
6536 /* Get the fixed size domain data */
6537 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6538 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
6541 (PVOID
)&DomainFixedData
,
6543 if (!NT_SUCCESS(Status
))
6546 /* Get the fixed size user data */
6547 Length
= sizeof(SAM_USER_FIXED_DATA
);
6548 Status
= SampGetObjectAttribute(UserObject
,
6553 if (!NT_SUCCESS(Status
))
6556 /* Set the fields to be returned */
6557 if (UserObject
->Trusted
)
6559 InfoBuffer
->All
.WhichFields
= USER_ALL_READ_GENERAL_MASK
|
6560 USER_ALL_READ_LOGON_MASK
|
6561 USER_ALL_READ_ACCOUNT_MASK
|
6562 USER_ALL_READ_PREFERENCES_MASK
|
6563 USER_ALL_READ_TRUSTED_MASK
;
6567 InfoBuffer
->All
.WhichFields
= 0;
6569 if (UserObject
->Access
& USER_READ_GENERAL
)
6570 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_GENERAL_MASK
;
6572 if (UserObject
->Access
& USER_READ_LOGON
)
6573 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_LOGON_MASK
;
6575 if (UserObject
->Access
& USER_READ_ACCOUNT
)
6576 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_ACCOUNT_MASK
;
6578 if (UserObject
->Access
& USER_READ_PREFERENCES
)
6579 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_PREFERENCES_MASK
;
6582 /* Fail, if no fields are to be returned */
6583 if (InfoBuffer
->All
.WhichFields
== 0)
6585 Status
= STATUS_ACCESS_DENIED
;
6589 /* Get the UserName attribute */
6590 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERNAME
)
6592 Status
= SampGetObjectAttributeString(UserObject
,
6594 &InfoBuffer
->All
.UserName
);
6595 if (!NT_SUCCESS(Status
))
6597 TRACE("Status 0x%08lx\n", Status
);
6602 /* Get the FullName attribute */
6603 if (InfoBuffer
->All
.WhichFields
& USER_ALL_FULLNAME
)
6605 Status
= SampGetObjectAttributeString(UserObject
,
6607 &InfoBuffer
->All
.FullName
);
6608 if (!NT_SUCCESS(Status
))
6610 TRACE("Status 0x%08lx\n", Status
);
6615 /* Get the UserId attribute */
6616 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERID
)
6618 InfoBuffer
->All
.UserId
= FixedData
.UserId
;
6621 /* Get the PrimaryGroupId attribute */
6622 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PRIMARYGROUPID
)
6624 InfoBuffer
->All
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
6627 /* Get the AdminComment attribute */
6628 if (InfoBuffer
->All
.WhichFields
& USER_ALL_ADMINCOMMENT
)
6630 Status
= SampGetObjectAttributeString(UserObject
,
6632 &InfoBuffer
->All
.AdminComment
);
6633 if (!NT_SUCCESS(Status
))
6635 TRACE("Status 0x%08lx\n", Status
);
6640 /* Get the UserComment attribute */
6641 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERCOMMENT
)
6643 Status
= SampGetObjectAttributeString(UserObject
,
6645 &InfoBuffer
->All
.UserComment
);
6646 if (!NT_SUCCESS(Status
))
6648 TRACE("Status 0x%08lx\n", Status
);
6653 /* Get the HomeDirectory attribute */
6654 if (InfoBuffer
->All
.WhichFields
& USER_ALL_HOMEDIRECTORY
)
6656 Status
= SampGetObjectAttributeString(UserObject
,
6658 &InfoBuffer
->All
.HomeDirectory
);
6659 if (!NT_SUCCESS(Status
))
6661 TRACE("Status 0x%08lx\n", Status
);
6666 /* Get the HomeDirectoryDrive attribute */
6667 if (InfoBuffer
->All
.WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6669 Status
= SampGetObjectAttributeString(UserObject
,
6670 L
"HomeDirectoryDrive",
6671 &InfoBuffer
->Home
.HomeDirectoryDrive
);
6672 if (!NT_SUCCESS(Status
))
6674 TRACE("Status 0x%08lx\n", Status
);
6679 /* Get the ScriptPath attribute */
6680 if (InfoBuffer
->All
.WhichFields
& USER_ALL_SCRIPTPATH
)
6682 Status
= SampGetObjectAttributeString(UserObject
,
6684 &InfoBuffer
->All
.ScriptPath
);
6685 if (!NT_SUCCESS(Status
))
6687 TRACE("Status 0x%08lx\n", Status
);
6692 /* Get the ProfilePath attribute */
6693 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PROFILEPATH
)
6695 Status
= SampGetObjectAttributeString(UserObject
,
6697 &InfoBuffer
->All
.ProfilePath
);
6698 if (!NT_SUCCESS(Status
))
6700 TRACE("Status 0x%08lx\n", Status
);
6705 /* Get the WorkStations attribute */
6706 if (InfoBuffer
->All
.WhichFields
& USER_ALL_WORKSTATIONS
)
6708 Status
= SampGetObjectAttributeString(UserObject
,
6710 &InfoBuffer
->All
.WorkStations
);
6711 if (!NT_SUCCESS(Status
))
6713 TRACE("Status 0x%08lx\n", Status
);
6718 /* Get the LastLogon attribute */
6719 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LASTLOGON
)
6721 InfoBuffer
->All
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
6722 InfoBuffer
->All
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
6725 /* Get the LastLogoff attribute */
6726 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LASTLOGOFF
)
6728 InfoBuffer
->All
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
6729 InfoBuffer
->All
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
6732 /* Get the LogonHours attribute */
6733 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LOGONHOURS
)
6735 Status
= SampGetLogonHoursAttrbute(UserObject
,
6736 &InfoBuffer
->All
.LogonHours
);
6737 if (!NT_SUCCESS(Status
))
6739 TRACE("Status 0x%08lx\n", Status
);
6744 /* Get the BadPasswordCount attribute */
6745 if (InfoBuffer
->All
.WhichFields
& USER_ALL_BADPASSWORDCOUNT
)
6747 InfoBuffer
->All
.BadPasswordCount
= FixedData
.BadPasswordCount
;
6750 /* Get the LogonCount attribute */
6751 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LOGONCOUNT
)
6753 InfoBuffer
->All
.LogonCount
= FixedData
.LogonCount
;
6756 /* Get the PasswordCanChange attribute */
6757 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDCANCHANGE
)
6759 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
6760 DomainFixedData
.MinPasswordAge
);
6761 InfoBuffer
->All
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
6762 InfoBuffer
->All
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
6765 /* Get the PasswordMustChange attribute */
6766 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDMUSTCHANGE
)
6768 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
6769 DomainFixedData
.MaxPasswordAge
);
6770 InfoBuffer
->All
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
6771 InfoBuffer
->All
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
6774 /* Get the PasswordLastSet attribute */
6775 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDLASTSET
)
6777 InfoBuffer
->All
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
6778 InfoBuffer
->All
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
6781 /* Get the AccountExpires attribute */
6782 if (InfoBuffer
->All
.WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
6784 InfoBuffer
->All
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6785 InfoBuffer
->All
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6788 /* Get the UserAccountControl attribute */
6789 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
6791 InfoBuffer
->All
.UserAccountControl
= FixedData
.UserAccountControl
;
6794 /* Get the Parameters attribute */
6795 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PARAMETERS
)
6797 Status
= SampGetObjectAttributeString(UserObject
,
6799 &InfoBuffer
->All
.Parameters
);
6800 if (!NT_SUCCESS(Status
))
6802 TRACE("Status 0x%08lx\n", Status
);
6807 /* Get the CountryCode attribute */
6808 if (InfoBuffer
->All
.WhichFields
& USER_ALL_COUNTRYCODE
)
6810 InfoBuffer
->All
.CountryCode
= FixedData
.CountryCode
;
6813 /* Get the CodePage attribute */
6814 if (InfoBuffer
->All
.WhichFields
& USER_ALL_CODEPAGE
)
6816 InfoBuffer
->All
.CodePage
= FixedData
.CodePage
;
6819 /* Get the LmPassword and NtPassword attributes */
6820 if (InfoBuffer
->All
.WhichFields
& (USER_ALL_NTPASSWORDPRESENT
| USER_ALL_LMPASSWORDPRESENT
))
6822 InfoBuffer
->All
.LmPasswordPresent
= FALSE
;
6823 InfoBuffer
->All
.NtPasswordPresent
= FALSE
;
6825 /* Get the NT password */
6827 SampGetObjectAttribute(UserObject
,
6833 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6835 InfoBuffer
->All
.NtOwfPassword
.Buffer
= midl_user_allocate(sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
6836 if (InfoBuffer
->All
.NtOwfPassword
.Buffer
== NULL
)
6838 Status
= STATUS_INSUFFICIENT_RESOURCES
;
6842 InfoBuffer
->All
.NtOwfPassword
.Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
6843 InfoBuffer
->All
.NtOwfPassword
.MaximumLength
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
6845 Status
= SampGetObjectAttribute(UserObject
,
6848 (PVOID
)InfoBuffer
->All
.NtOwfPassword
.Buffer
,
6850 if (!NT_SUCCESS(Status
))
6853 if (memcmp(InfoBuffer
->All
.NtOwfPassword
.Buffer
,
6855 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
6856 InfoBuffer
->All
.NtPasswordPresent
= TRUE
;
6859 /* Get the LM password */
6861 SampGetObjectAttribute(UserObject
,
6867 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6869 InfoBuffer
->All
.LmOwfPassword
.Buffer
= midl_user_allocate(sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
6870 if (InfoBuffer
->All
.LmOwfPassword
.Buffer
== NULL
)
6872 Status
= STATUS_INSUFFICIENT_RESOURCES
;
6876 InfoBuffer
->All
.LmOwfPassword
.Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
6877 InfoBuffer
->All
.LmOwfPassword
.MaximumLength
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
6879 Status
= SampGetObjectAttribute(UserObject
,
6882 (PVOID
)InfoBuffer
->All
.LmOwfPassword
.Buffer
,
6884 if (!NT_SUCCESS(Status
))
6887 if (memcmp(InfoBuffer
->All
.LmOwfPassword
.Buffer
,
6889 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
6890 InfoBuffer
->All
.LmPasswordPresent
= TRUE
;
6894 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PRIVATEDATA
)
6896 Status
= SampGetObjectAttributeString(UserObject
,
6898 &InfoBuffer
->All
.PrivateData
);
6899 if (!NT_SUCCESS(Status
))
6901 TRACE("Status 0x%08lx\n", Status
);
6906 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDEXPIRED
)
6911 if (InfoBuffer
->All
.WhichFields
& USER_ALL_SECURITYDESCRIPTOR
)
6914 SampGetObjectAttribute(UserObject
,
6922 InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
= midl_user_allocate(Length
);
6923 if (InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
== NULL
)
6925 Status
= STATUS_INSUFFICIENT_RESOURCES
;
6929 InfoBuffer
->All
.SecurityDescriptor
.Length
= Length
;
6931 Status
= SampGetObjectAttribute(UserObject
,
6934 (PVOID
)InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
,
6936 if (!NT_SUCCESS(Status
))
6941 *Buffer
= InfoBuffer
;
6944 if (!NT_SUCCESS(Status
))
6946 if (InfoBuffer
!= NULL
)
6948 if (InfoBuffer
->All
.UserName
.Buffer
!= NULL
)
6949 midl_user_free(InfoBuffer
->All
.UserName
.Buffer
);
6951 if (InfoBuffer
->All
.FullName
.Buffer
!= NULL
)
6952 midl_user_free(InfoBuffer
->All
.FullName
.Buffer
);
6954 if (InfoBuffer
->All
.AdminComment
.Buffer
!= NULL
)
6955 midl_user_free(InfoBuffer
->All
.AdminComment
.Buffer
);
6957 if (InfoBuffer
->All
.UserComment
.Buffer
!= NULL
)
6958 midl_user_free(InfoBuffer
->All
.UserComment
.Buffer
);
6960 if (InfoBuffer
->All
.HomeDirectory
.Buffer
!= NULL
)
6961 midl_user_free(InfoBuffer
->All
.HomeDirectory
.Buffer
);
6963 if (InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
!= NULL
)
6964 midl_user_free(InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
);
6966 if (InfoBuffer
->All
.ScriptPath
.Buffer
!= NULL
)
6967 midl_user_free(InfoBuffer
->All
.ScriptPath
.Buffer
);
6969 if (InfoBuffer
->All
.ProfilePath
.Buffer
!= NULL
)
6970 midl_user_free(InfoBuffer
->All
.ProfilePath
.Buffer
);
6972 if (InfoBuffer
->All
.WorkStations
.Buffer
!= NULL
)
6973 midl_user_free(InfoBuffer
->All
.WorkStations
.Buffer
);
6975 if (InfoBuffer
->All
.LogonHours
.LogonHours
!= NULL
)
6976 midl_user_free(InfoBuffer
->All
.LogonHours
.LogonHours
);
6978 if (InfoBuffer
->All
.Parameters
.Buffer
!= NULL
)
6979 midl_user_free(InfoBuffer
->All
.Parameters
.Buffer
);
6981 if (InfoBuffer
->All
.LmOwfPassword
.Buffer
!= NULL
)
6982 midl_user_free(InfoBuffer
->All
.LmOwfPassword
.Buffer
);
6984 if (InfoBuffer
->All
.NtOwfPassword
.Buffer
!= NULL
)
6985 midl_user_free(InfoBuffer
->All
.NtOwfPassword
.Buffer
);
6987 if (InfoBuffer
->All
.PrivateData
.Buffer
!= NULL
)
6988 midl_user_free(InfoBuffer
->All
.PrivateData
.Buffer
);
6990 if (InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
!= NULL
)
6991 midl_user_free(InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
);
6993 midl_user_free(InfoBuffer
);
7004 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
7005 IN USER_INFORMATION_CLASS UserInformationClass
,
7006 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
7008 PSAM_DB_OBJECT UserObject
;
7009 ACCESS_MASK DesiredAccess
;
7012 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
7013 UserHandle
, UserInformationClass
, Buffer
);
7015 switch (UserInformationClass
)
7017 case UserGeneralInformation
:
7018 case UserNameInformation
:
7019 case UserAccountNameInformation
:
7020 case UserFullNameInformation
:
7021 case UserPrimaryGroupInformation
:
7022 case UserAdminCommentInformation
:
7023 DesiredAccess
= USER_READ_GENERAL
;
7026 case UserLogonHoursInformation
:
7027 case UserHomeInformation
:
7028 case UserScriptInformation
:
7029 case UserProfileInformation
:
7030 case UserWorkStationsInformation
:
7031 DesiredAccess
= USER_READ_LOGON
;
7034 case UserControlInformation
:
7035 case UserExpiresInformation
:
7036 case UserParametersInformation
:
7037 DesiredAccess
= USER_READ_ACCOUNT
;
7040 case UserPreferencesInformation
:
7041 DesiredAccess
= USER_READ_GENERAL
|
7042 USER_READ_PREFERENCES
;
7045 case UserLogonInformation
:
7046 case UserAccountInformation
:
7047 DesiredAccess
= USER_READ_GENERAL
|
7048 USER_READ_PREFERENCES
|
7053 case UserInternal1Information
:
7054 case UserAllInformation
:
7059 return STATUS_INVALID_INFO_CLASS
;
7062 RtlAcquireResourceShared(&SampResource
,
7065 /* Validate the domain handle */
7066 Status
= SampValidateDbObject(UserHandle
,
7070 if (!NT_SUCCESS(Status
))
7072 TRACE("failed with status 0x%08lx\n", Status
);
7076 switch (UserInformationClass
)
7078 case UserGeneralInformation
:
7079 Status
= SampQueryUserGeneral(UserObject
,
7083 case UserPreferencesInformation
:
7084 Status
= SampQueryUserPreferences(UserObject
,
7088 case UserLogonInformation
:
7089 Status
= SampQueryUserLogon(UserObject
,
7093 case UserLogonHoursInformation
:
7094 Status
= SampQueryUserLogonHours(UserObject
,
7098 case UserAccountInformation
:
7099 Status
= SampQueryUserAccount(UserObject
,
7103 case UserNameInformation
:
7104 Status
= SampQueryUserName(UserObject
,
7108 case UserAccountNameInformation
:
7109 Status
= SampQueryUserAccountName(UserObject
,
7113 case UserFullNameInformation
:
7114 Status
= SampQueryUserFullName(UserObject
,
7118 case UserPrimaryGroupInformation
:
7119 Status
= SampQueryUserPrimaryGroup(UserObject
,
7123 case UserHomeInformation
:
7124 Status
= SampQueryUserHome(UserObject
,
7127 case UserScriptInformation
:
7128 Status
= SampQueryUserScript(UserObject
,
7132 case UserProfileInformation
:
7133 Status
= SampQueryUserProfile(UserObject
,
7137 case UserAdminCommentInformation
:
7138 Status
= SampQueryUserAdminComment(UserObject
,
7142 case UserWorkStationsInformation
:
7143 Status
= SampQueryUserWorkStations(UserObject
,
7147 case UserControlInformation
:
7148 Status
= SampQueryUserControl(UserObject
,
7152 case UserExpiresInformation
:
7153 Status
= SampQueryUserExpires(UserObject
,
7157 case UserInternal1Information
:
7158 Status
= SampQueryUserInternal1(UserObject
,
7162 case UserParametersInformation
:
7163 Status
= SampQueryUserParameters(UserObject
,
7167 case UserAllInformation
:
7168 Status
= SampQueryUserAll(UserObject
,
7172 // case UserInternal4Information:
7173 // case UserInternal5Information:
7174 // case UserInternal4InformationNew:
7175 // case UserInternal5InformationNew:
7178 Status
= STATUS_INVALID_INFO_CLASS
;
7182 RtlReleaseResource(&SampResource
);
7189 SampSetUserName(PSAM_DB_OBJECT UserObject
,
7190 PRPC_UNICODE_STRING NewUserName
)
7192 UNICODE_STRING OldUserName
= {0, 0, NULL
};
7195 /* Check the account name */
7196 Status
= SampCheckAccountName(NewUserName
, 20);
7197 if (!NT_SUCCESS(Status
))
7199 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
7203 Status
= SampGetObjectAttributeString(UserObject
,
7205 (PRPC_UNICODE_STRING
)&OldUserName
);
7206 if (!NT_SUCCESS(Status
))
7208 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
7212 if (!RtlEqualUnicodeString(&OldUserName
, (PCUNICODE_STRING
)NewUserName
, TRUE
))
7214 Status
= SampCheckAccountNameInDomain(UserObject
->ParentObject
,
7215 NewUserName
->Buffer
);
7216 if (!NT_SUCCESS(Status
))
7218 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
7219 NewUserName
->Buffer
, Status
);
7224 Status
= SampSetAccountNameInDomain(UserObject
->ParentObject
,
7226 NewUserName
->Buffer
,
7227 UserObject
->RelativeId
);
7228 if (!NT_SUCCESS(Status
))
7230 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
7234 Status
= SampRemoveAccountNameFromDomain(UserObject
->ParentObject
,
7236 OldUserName
.Buffer
);
7237 if (!NT_SUCCESS(Status
))
7239 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
7243 Status
= SampSetObjectAttributeString(UserObject
,
7246 if (!NT_SUCCESS(Status
))
7248 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
7252 if (OldUserName
.Buffer
!= NULL
)
7253 midl_user_free(OldUserName
.Buffer
);
7260 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
7261 PSAMPR_USER_INFO_BUFFER Buffer
)
7263 SAM_USER_FIXED_DATA FixedData
;
7267 Length
= sizeof(SAM_USER_FIXED_DATA
);
7268 Status
= SampGetObjectAttribute(UserObject
,
7273 if (!NT_SUCCESS(Status
))
7276 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
7278 Status
= SampSetObjectAttribute(UserObject
,
7283 if (!NT_SUCCESS(Status
))
7286 Status
= SampSetUserName(UserObject
,
7287 &Buffer
->General
.UserName
);
7288 if (!NT_SUCCESS(Status
))
7291 Status
= SampSetObjectAttributeString(UserObject
,
7293 &Buffer
->General
.FullName
);
7294 if (!NT_SUCCESS(Status
))
7297 Status
= SampSetObjectAttributeString(UserObject
,
7299 &Buffer
->General
.AdminComment
);
7300 if (!NT_SUCCESS(Status
))
7303 Status
= SampSetObjectAttributeString(UserObject
,
7305 &Buffer
->General
.UserComment
);
7313 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
7314 PSAMPR_USER_INFO_BUFFER Buffer
)
7316 SAM_USER_FIXED_DATA FixedData
;
7320 Length
= sizeof(SAM_USER_FIXED_DATA
);
7321 Status
= SampGetObjectAttribute(UserObject
,
7326 if (!NT_SUCCESS(Status
))
7329 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
7330 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
7332 Status
= SampSetObjectAttribute(UserObject
,
7337 if (!NT_SUCCESS(Status
))
7340 Status
= SampSetObjectAttributeString(UserObject
,
7342 &Buffer
->Preferences
.UserComment
);
7350 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
7351 PSAMPR_USER_INFO_BUFFER Buffer
)
7353 SAM_USER_FIXED_DATA FixedData
;
7357 Length
= sizeof(SAM_USER_FIXED_DATA
);
7358 Status
= SampGetObjectAttribute(UserObject
,
7363 if (!NT_SUCCESS(Status
))
7366 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
7368 Status
= SampSetObjectAttribute(UserObject
,
7380 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
7381 PSAMPR_USER_INFO_BUFFER Buffer
)
7383 SAM_USER_FIXED_DATA FixedData
;
7387 Length
= sizeof(SAM_USER_FIXED_DATA
);
7388 Status
= SampGetObjectAttribute(UserObject
,
7393 if (!NT_SUCCESS(Status
))
7396 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
7398 Status
= SampSetObjectAttribute(UserObject
,
7410 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
7411 PSAMPR_USER_INFO_BUFFER Buffer
)
7413 SAM_USER_FIXED_DATA FixedData
;
7417 Length
= sizeof(SAM_USER_FIXED_DATA
);
7418 Status
= SampGetObjectAttribute(UserObject
,
7423 if (!NT_SUCCESS(Status
))
7426 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
7427 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
7429 Status
= SampSetObjectAttribute(UserObject
,
7441 SampSetUserInternal1(PSAM_DB_OBJECT UserObject
,
7442 PSAMPR_USER_INFO_BUFFER Buffer
)
7444 SAM_USER_FIXED_DATA FixedData
;
7446 NTSTATUS Status
= STATUS_SUCCESS
;
7448 /* FIXME: Decrypt NT password */
7449 /* FIXME: Decrypt LM password */
7451 Status
= SampSetUserPassword(UserObject
,
7452 &Buffer
->Internal1
.EncryptedNtOwfPassword
,
7453 Buffer
->Internal1
.NtPasswordPresent
,
7454 &Buffer
->Internal1
.EncryptedLmOwfPassword
,
7455 Buffer
->Internal1
.LmPasswordPresent
);
7456 if (!NT_SUCCESS(Status
))
7459 /* Get the fixed user attributes */
7460 Length
= sizeof(SAM_USER_FIXED_DATA
);
7461 Status
= SampGetObjectAttribute(UserObject
,
7466 if (!NT_SUCCESS(Status
))
7469 if (Buffer
->Internal1
.PasswordExpired
)
7471 /* The password was last set ages ago */
7472 FixedData
.PasswordLastSet
.LowPart
= 0;
7473 FixedData
.PasswordLastSet
.HighPart
= 0;
7477 /* The password was last set right now */
7478 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7479 if (!NT_SUCCESS(Status
))
7483 /* Set the fixed user attributes */
7484 Status
= SampSetObjectAttribute(UserObject
,
7496 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
7497 PSAMPR_USER_INFO_BUFFER Buffer
)
7499 SAM_USER_FIXED_DATA FixedData
;
7502 PENCRYPTED_NT_OWF_PASSWORD NtPassword
= NULL
;
7503 PENCRYPTED_LM_OWF_PASSWORD LmPassword
= NULL
;
7504 BOOLEAN NtPasswordPresent
= FALSE
;
7505 BOOLEAN LmPasswordPresent
= FALSE
;
7506 BOOLEAN WriteFixedData
= FALSE
;
7507 NTSTATUS Status
= STATUS_SUCCESS
;
7509 WhichFields
= Buffer
->All
.WhichFields
;
7511 /* Get the fixed size attributes */
7512 Length
= sizeof(SAM_USER_FIXED_DATA
);
7513 Status
= SampGetObjectAttribute(UserObject
,
7518 if (!NT_SUCCESS(Status
))
7521 if (WhichFields
& USER_ALL_USERNAME
)
7523 Status
= SampSetUserName(UserObject
,
7524 &Buffer
->All
.UserName
);
7525 if (!NT_SUCCESS(Status
))
7529 if (WhichFields
& USER_ALL_FULLNAME
)
7531 Status
= SampSetObjectAttributeString(UserObject
,
7533 &Buffer
->All
.FullName
);
7534 if (!NT_SUCCESS(Status
))
7538 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
7540 Status
= SampSetObjectAttributeString(UserObject
,
7542 &Buffer
->All
.AdminComment
);
7543 if (!NT_SUCCESS(Status
))
7547 if (WhichFields
& USER_ALL_USERCOMMENT
)
7549 Status
= SampSetObjectAttributeString(UserObject
,
7551 &Buffer
->All
.UserComment
);
7552 if (!NT_SUCCESS(Status
))
7556 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
7558 Status
= SampSetObjectAttributeString(UserObject
,
7560 &Buffer
->All
.HomeDirectory
);
7561 if (!NT_SUCCESS(Status
))
7565 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
7567 Status
= SampSetObjectAttributeString(UserObject
,
7568 L
"HomeDirectoryDrive",
7569 &Buffer
->All
.HomeDirectoryDrive
);
7570 if (!NT_SUCCESS(Status
))
7574 if (WhichFields
& USER_ALL_SCRIPTPATH
)
7576 Status
= SampSetObjectAttributeString(UserObject
,
7578 &Buffer
->All
.ScriptPath
);
7579 if (!NT_SUCCESS(Status
))
7583 if (WhichFields
& USER_ALL_PROFILEPATH
)
7585 Status
= SampSetObjectAttributeString(UserObject
,
7587 &Buffer
->All
.ProfilePath
);
7588 if (!NT_SUCCESS(Status
))
7592 if (WhichFields
& USER_ALL_WORKSTATIONS
)
7594 Status
= SampSetObjectAttributeString(UserObject
,
7596 &Buffer
->All
.WorkStations
);
7597 if (!NT_SUCCESS(Status
))
7601 if (WhichFields
& USER_ALL_PARAMETERS
)
7603 Status
= SampSetObjectAttributeString(UserObject
,
7605 &Buffer
->All
.Parameters
);
7606 if (!NT_SUCCESS(Status
))
7610 if (WhichFields
& USER_ALL_LOGONHOURS
)
7612 Status
= SampSetLogonHoursAttrbute(UserObject
,
7613 &Buffer
->All
.LogonHours
);
7614 if (!NT_SUCCESS(Status
))
7618 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
7620 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
7621 WriteFixedData
= TRUE
;
7624 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
7626 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
7627 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
7628 WriteFixedData
= TRUE
;
7631 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
7633 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
7634 WriteFixedData
= TRUE
;
7637 if (WhichFields
& USER_ALL_COUNTRYCODE
)
7639 FixedData
.CountryCode
= Buffer
->All
.CountryCode
;
7640 WriteFixedData
= TRUE
;
7643 if (WhichFields
& USER_ALL_CODEPAGE
)
7645 FixedData
.CodePage
= Buffer
->All
.CodePage
;
7646 WriteFixedData
= TRUE
;
7649 if (WhichFields
& (USER_ALL_NTPASSWORDPRESENT
|
7650 USER_ALL_LMPASSWORDPRESENT
))
7652 if (WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
7654 NtPassword
= (PENCRYPTED_NT_OWF_PASSWORD
)Buffer
->All
.NtOwfPassword
.Buffer
;
7655 NtPasswordPresent
= Buffer
->All
.NtPasswordPresent
;
7658 if (WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
7660 LmPassword
= (PENCRYPTED_LM_OWF_PASSWORD
)Buffer
->All
.LmOwfPassword
.Buffer
;
7661 LmPasswordPresent
= Buffer
->All
.LmPasswordPresent
;
7664 Status
= SampSetUserPassword(UserObject
,
7669 if (!NT_SUCCESS(Status
))
7672 /* The password has just been set */
7673 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7674 if (!NT_SUCCESS(Status
))
7677 WriteFixedData
= TRUE
;
7680 if (WhichFields
& USER_ALL_PRIVATEDATA
)
7682 Status
= SampSetObjectAttributeString(UserObject
,
7684 &Buffer
->All
.PrivateData
);
7685 if (!NT_SUCCESS(Status
))
7689 if (WhichFields
& USER_ALL_PASSWORDEXPIRED
)
7691 if (Buffer
->All
.PasswordExpired
)
7693 /* The pasword was last set ages ago */
7694 FixedData
.PasswordLastSet
.LowPart
= 0;
7695 FixedData
.PasswordLastSet
.HighPart
= 0;
7699 /* The pasword was last set right now */
7700 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7701 if (!NT_SUCCESS(Status
))
7705 WriteFixedData
= TRUE
;
7708 if (WhichFields
& USER_ALL_SECURITYDESCRIPTOR
)
7710 Status
= SampSetObjectAttribute(UserObject
,
7713 Buffer
->All
.SecurityDescriptor
.SecurityDescriptor
,
7714 Buffer
->All
.SecurityDescriptor
.Length
);
7717 if (WriteFixedData
== TRUE
)
7719 Status
= SampSetObjectAttribute(UserObject
,
7724 if (!NT_SUCCESS(Status
))
7736 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
7737 IN USER_INFORMATION_CLASS UserInformationClass
,
7738 IN PSAMPR_USER_INFO_BUFFER Buffer
)
7740 PSAM_DB_OBJECT UserObject
;
7741 ACCESS_MASK DesiredAccess
;
7744 TRACE("SamrSetInformationUser(%p %lu %p)\n",
7745 UserHandle
, UserInformationClass
, Buffer
);
7747 switch (UserInformationClass
)
7749 case UserLogonHoursInformation
:
7750 case UserNameInformation
:
7751 case UserAccountNameInformation
:
7752 case UserFullNameInformation
:
7753 case UserPrimaryGroupInformation
:
7754 case UserHomeInformation
:
7755 case UserScriptInformation
:
7756 case UserProfileInformation
:
7757 case UserAdminCommentInformation
:
7758 case UserWorkStationsInformation
:
7759 case UserControlInformation
:
7760 case UserExpiresInformation
:
7761 case UserParametersInformation
:
7762 DesiredAccess
= USER_WRITE_ACCOUNT
;
7765 case UserGeneralInformation
:
7766 DesiredAccess
= USER_WRITE_ACCOUNT
|
7767 USER_WRITE_PREFERENCES
;
7770 case UserPreferencesInformation
:
7771 DesiredAccess
= USER_WRITE_PREFERENCES
;
7774 case UserSetPasswordInformation
:
7775 case UserInternal1Information
:
7776 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
7779 case UserAllInformation
:
7780 DesiredAccess
= 0; /* FIXME */
7784 return STATUS_INVALID_INFO_CLASS
;
7787 RtlAcquireResourceExclusive(&SampResource
,
7790 /* Validate the domain handle */
7791 Status
= SampValidateDbObject(UserHandle
,
7795 if (!NT_SUCCESS(Status
))
7797 TRACE("failed with status 0x%08lx\n", Status
);
7801 switch (UserInformationClass
)
7803 case UserGeneralInformation
:
7804 Status
= SampSetUserGeneral(UserObject
,
7808 case UserPreferencesInformation
:
7809 Status
= SampSetUserPreferences(UserObject
,
7813 case UserLogonHoursInformation
:
7814 Status
= SampSetLogonHoursAttrbute(UserObject
,
7815 &Buffer
->LogonHours
.LogonHours
);
7818 case UserNameInformation
:
7819 Status
= SampSetUserName(UserObject
,
7820 &Buffer
->Name
.UserName
);
7821 if (!NT_SUCCESS(Status
))
7824 Status
= SampSetObjectAttributeString(UserObject
,
7826 &Buffer
->Name
.FullName
);
7829 case UserAccountNameInformation
:
7830 Status
= SampSetUserName(UserObject
,
7831 &Buffer
->AccountName
.UserName
);
7834 case UserFullNameInformation
:
7835 Status
= SampSetObjectAttributeString(UserObject
,
7837 &Buffer
->FullName
.FullName
);
7840 case UserPrimaryGroupInformation
:
7841 Status
= SampSetUserPrimaryGroup(UserObject
,
7845 case UserHomeInformation
:
7846 Status
= SampSetObjectAttributeString(UserObject
,
7848 &Buffer
->Home
.HomeDirectory
);
7849 if (!NT_SUCCESS(Status
))
7852 Status
= SampSetObjectAttributeString(UserObject
,
7853 L
"HomeDirectoryDrive",
7854 &Buffer
->Home
.HomeDirectoryDrive
);
7857 case UserScriptInformation
:
7858 Status
= SampSetObjectAttributeString(UserObject
,
7860 &Buffer
->Script
.ScriptPath
);
7863 case UserProfileInformation
:
7864 Status
= SampSetObjectAttributeString(UserObject
,
7866 &Buffer
->Profile
.ProfilePath
);
7869 case UserAdminCommentInformation
:
7870 Status
= SampSetObjectAttributeString(UserObject
,
7872 &Buffer
->AdminComment
.AdminComment
);
7875 case UserWorkStationsInformation
:
7876 Status
= SampSetObjectAttributeString(UserObject
,
7878 &Buffer
->WorkStations
.WorkStations
);
7881 case UserSetPasswordInformation
:
7882 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
7883 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
7885 Status
= SampSetObjectAttributeString(UserObject
,
7887 &Buffer
->SetPassword
.Password
);
7890 case UserControlInformation
:
7891 Status
= SampSetUserControl(UserObject
,
7895 case UserExpiresInformation
:
7896 Status
= SampSetUserExpires(UserObject
,
7900 case UserInternal1Information
:
7901 Status
= SampSetUserInternal1(UserObject
,
7905 case UserParametersInformation
:
7906 Status
= SampSetObjectAttributeString(UserObject
,
7908 &Buffer
->Parameters
.Parameters
);
7911 case UserAllInformation
:
7912 Status
= SampSetUserAll(UserObject
,
7916 // case UserInternal4Information:
7917 // case UserInternal5Information:
7918 // case UserInternal4InformationNew:
7919 // case UserInternal5InformationNew:
7922 Status
= STATUS_INVALID_INFO_CLASS
;
7926 RtlReleaseResource(&SampResource
);
7935 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
7936 IN
unsigned char LmPresent
,
7937 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
7938 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
7939 IN
unsigned char NtPresent
,
7940 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
7941 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
7942 IN
unsigned char NtCrossEncryptionPresent
,
7943 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
7944 IN
unsigned char LmCrossEncryptionPresent
,
7945 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
7947 ENCRYPTED_LM_OWF_PASSWORD StoredLmPassword
;
7948 ENCRYPTED_NT_OWF_PASSWORD StoredNtPassword
;
7949 PENCRYPTED_LM_OWF_PASSWORD OldLmPassword
;
7950 PENCRYPTED_LM_OWF_PASSWORD NewLmPassword
;
7951 PENCRYPTED_NT_OWF_PASSWORD OldNtPassword
;
7952 PENCRYPTED_NT_OWF_PASSWORD NewNtPassword
;
7953 BOOLEAN StoredLmPresent
= FALSE
;
7954 BOOLEAN StoredNtPresent
= FALSE
;
7955 BOOLEAN StoredLmEmpty
= TRUE
;
7956 BOOLEAN StoredNtEmpty
= TRUE
;
7957 PSAM_DB_OBJECT UserObject
;
7959 SAM_USER_FIXED_DATA UserFixedData
;
7960 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
7961 LARGE_INTEGER SystemTime
;
7964 TRACE("(%p %u %p %p %u %p %p %u %p %u %p)\n",
7965 UserHandle
, LmPresent
, OldLmEncryptedWithNewLm
, NewLmEncryptedWithOldLm
,
7966 NtPresent
, OldNtEncryptedWithNewNt
, NewNtEncryptedWithOldNt
, NtCrossEncryptionPresent
,
7967 NewNtEncryptedWithNewLm
, LmCrossEncryptionPresent
, NewLmEncryptedWithNewNt
);
7969 RtlAcquireResourceExclusive(&SampResource
,
7972 /* Validate the user handle */
7973 Status
= SampValidateDbObject(UserHandle
,
7975 USER_CHANGE_PASSWORD
,
7977 if (!NT_SUCCESS(Status
))
7979 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7983 /* Get the current time */
7984 Status
= NtQuerySystemTime(&SystemTime
);
7985 if (!NT_SUCCESS(Status
))
7987 TRACE("NtQuerySystemTime failed (Status 0x%08lx)\n", Status
);
7991 /* Retrieve the LM password */
7992 Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
7993 Status
= SampGetObjectAttribute(UserObject
,
7998 if (NT_SUCCESS(Status
))
8000 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
8002 StoredLmPresent
= TRUE
;
8003 if (!RtlEqualMemory(&StoredLmPassword
,
8005 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8006 StoredLmEmpty
= FALSE
;
8010 /* Retrieve the NT password */
8011 Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
8012 Status
= SampGetObjectAttribute(UserObject
,
8017 if (NT_SUCCESS(Status
))
8019 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
8021 StoredNtPresent
= TRUE
;
8022 if (!RtlEqualMemory(&StoredNtPassword
,
8024 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
8025 StoredNtEmpty
= FALSE
;
8029 /* Retrieve the fixed size user data */
8030 Length
= sizeof(SAM_USER_FIXED_DATA
);
8031 Status
= SampGetObjectAttribute(UserObject
,
8036 if (!NT_SUCCESS(Status
))
8038 TRACE("SampGetObjectAttribute failed to retrieve the fixed user data (Status 0x%08lx)\n", Status
);
8042 /* Check if we can change the password at this time */
8043 if ((StoredNtEmpty
== FALSE
) || (StoredNtEmpty
== FALSE
))
8045 /* Get fixed domain data */
8046 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8047 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
8052 if (!NT_SUCCESS(Status
))
8054 TRACE("SampGetObjectAttribute failed to retrieve the fixed domain data (Status 0x%08lx)\n", Status
);
8058 if (DomainFixedData
.MinPasswordAge
.QuadPart
> 0)
8060 if (SystemTime
.QuadPart
< (UserFixedData
.PasswordLastSet
.QuadPart
+ DomainFixedData
.MinPasswordAge
.QuadPart
))
8061 return STATUS_ACCOUNT_RESTRICTION
;
8065 /* FIXME: Decrypt passwords */
8066 OldLmPassword
= OldLmEncryptedWithNewLm
;
8067 NewLmPassword
= NewLmEncryptedWithOldLm
;
8068 OldNtPassword
= OldNtEncryptedWithNewNt
;
8069 NewNtPassword
= NewNtEncryptedWithOldNt
;
8071 /* Check if the old passwords match the stored ones */
8076 if (!RtlEqualMemory(&StoredLmPassword
,
8078 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8080 TRACE("Old LM Password does not match!\n");
8081 Status
= STATUS_WRONG_PASSWORD
;
8085 if (!RtlEqualMemory(&StoredNtPassword
,
8087 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8089 TRACE("Old NT Password does not match!\n");
8090 Status
= STATUS_WRONG_PASSWORD
;
8096 if (!RtlEqualMemory(&StoredNtPassword
,
8098 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8100 TRACE("Old NT Password does not match!\n");
8101 Status
= STATUS_WRONG_PASSWORD
;
8109 if (!RtlEqualMemory(&StoredLmPassword
,
8111 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8113 TRACE("Old LM Password does not match!\n");
8114 Status
= STATUS_WRONG_PASSWORD
;
8119 Status
= STATUS_INVALID_PARAMETER
;
8123 /* Store the new password hashes */
8124 if (NT_SUCCESS(Status
))
8126 Status
= SampSetUserPassword(UserObject
,
8131 if (NT_SUCCESS(Status
))
8133 /* Update PasswordLastSet */
8134 UserFixedData
.PasswordLastSet
.QuadPart
= SystemTime
.QuadPart
;
8136 /* Set the fixed size user data */
8137 Length
= sizeof(SAM_USER_FIXED_DATA
);
8138 Status
= SampSetObjectAttribute(UserObject
,
8146 if (Status
== STATUS_WRONG_PASSWORD
)
8148 /* Update BadPasswordCount and LastBadPasswordTime */
8149 UserFixedData
.BadPasswordCount
++;
8150 UserFixedData
.LastBadPasswordTime
.QuadPart
= SystemTime
.QuadPart
;
8152 /* Set the fixed size user data */
8153 Length
= sizeof(SAM_USER_FIXED_DATA
);
8154 Status
= SampSetObjectAttribute(UserObject
,
8162 RtlReleaseResource(&SampResource
);
8171 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
8172 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
8174 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
8175 PSAM_DB_OBJECT UserObject
;
8179 TRACE("SamrGetGroupsForUser(%p %p)\n",
8180 UserHandle
, Groups
);
8182 RtlAcquireResourceShared(&SampResource
,
8185 /* Validate the user handle */
8186 Status
= SampValidateDbObject(UserHandle
,
8190 if (!NT_SUCCESS(Status
))
8192 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8196 /* Allocate the groups buffer */
8197 GroupsBuffer
= midl_user_allocate(sizeof(SAMPR_GET_GROUPS_BUFFER
));
8198 if (GroupsBuffer
== NULL
)
8200 Status
= STATUS_INSUFFICIENT_RESOURCES
;
8205 * Get the size of the Groups attribute.
8206 * Do not check the status code because in case of an error
8207 * Length will be 0. And that is all we need.
8209 SampGetObjectAttribute(UserObject
,
8215 /* If there is no Groups attribute, return a groups buffer without an array */
8218 GroupsBuffer
->MembershipCount
= 0;
8219 GroupsBuffer
->Groups
= NULL
;
8221 *Groups
= GroupsBuffer
;
8223 Status
= STATUS_SUCCESS
;
8227 /* Allocate a buffer for the Groups attribute */
8228 GroupsBuffer
->Groups
= midl_user_allocate(Length
);
8229 if (GroupsBuffer
->Groups
== NULL
)
8231 Status
= STATUS_INSUFFICIENT_RESOURCES
;
8235 /* Retrieve the Grous attribute */
8236 Status
= SampGetObjectAttribute(UserObject
,
8239 GroupsBuffer
->Groups
,
8241 if (!NT_SUCCESS(Status
))
8243 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8247 /* Calculate the membership count */
8248 GroupsBuffer
->MembershipCount
= Length
/ sizeof(GROUP_MEMBERSHIP
);
8250 /* Return the groups buffer to the caller */
8251 *Groups
= GroupsBuffer
;
8254 if (!NT_SUCCESS(Status
))
8256 if (GroupsBuffer
!= NULL
)
8258 if (GroupsBuffer
->Groups
!= NULL
)
8259 midl_user_free(GroupsBuffer
->Groups
);
8261 midl_user_free(GroupsBuffer
);
8265 RtlReleaseResource(&SampResource
);
8274 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
8275 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8276 IN
unsigned long Index
,
8277 IN
unsigned long EntryCount
,
8278 IN
unsigned long PreferredMaximumLength
,
8279 OUT
unsigned long *TotalAvailable
,
8280 OUT
unsigned long *TotalReturned
,
8281 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8284 return STATUS_NOT_IMPLEMENTED
;
8290 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
8291 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8292 IN PRPC_UNICODE_STRING Prefix
,
8293 OUT
unsigned long *Index
)
8296 return STATUS_NOT_IMPLEMENTED
;
8302 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
8305 return STATUS_NOT_IMPLEMENTED
;
8311 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
8314 return STATUS_NOT_IMPLEMENTED
;
8321 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
8322 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
8324 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
8325 SAM_USER_FIXED_DATA UserFixedData
;
8326 PSAM_DB_OBJECT DomainObject
;
8327 PSAM_DB_OBJECT UserObject
;
8332 UserHandle
, PasswordInformation
);
8334 RtlAcquireResourceShared(&SampResource
,
8337 /* Validate the user handle */
8338 Status
= SampValidateDbObject(UserHandle
,
8342 if (!NT_SUCCESS(Status
))
8344 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8348 /* Validate the domain object */
8349 Status
= SampValidateDbObject((SAMPR_HANDLE
)UserObject
->ParentObject
,
8351 DOMAIN_READ_PASSWORD_PARAMETERS
,
8353 if (!NT_SUCCESS(Status
))
8355 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8359 /* Get fixed user data */
8360 Length
= sizeof(SAM_USER_FIXED_DATA
);
8361 Status
= SampGetObjectAttribute(UserObject
,
8364 (PVOID
)&UserFixedData
,
8366 if (!NT_SUCCESS(Status
))
8368 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8372 if ((UserObject
->RelativeId
== DOMAIN_USER_RID_KRBTGT
) ||
8373 (UserFixedData
.UserAccountControl
& (USER_INTERDOMAIN_TRUST_ACCOUNT
|
8374 USER_WORKSTATION_TRUST_ACCOUNT
|
8375 USER_SERVER_TRUST_ACCOUNT
)))
8377 PasswordInformation
->MinPasswordLength
= 0;
8378 PasswordInformation
->PasswordProperties
= 0;
8382 /* Get fixed domain data */
8383 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8384 Status
= SampGetObjectAttribute(DomainObject
,
8387 (PVOID
)&DomainFixedData
,
8389 if (!NT_SUCCESS(Status
))
8391 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8395 PasswordInformation
->MinPasswordLength
= DomainFixedData
.MinPasswordLength
;
8396 PasswordInformation
->PasswordProperties
= DomainFixedData
.PasswordProperties
;
8400 RtlReleaseResource(&SampResource
);
8402 return STATUS_SUCCESS
;
8409 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
8410 IN PRPC_SID MemberSid
)
8412 PSAM_DB_OBJECT DomainObject
;
8417 DomainHandle
, MemberSid
);
8419 RtlAcquireResourceExclusive(&SampResource
,
8422 /* Validate the domain object */
8423 Status
= SampValidateDbObject(DomainHandle
,
8427 if (!NT_SUCCESS(Status
))
8429 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8433 /* Retrieve the RID from the MemberSID */
8434 Status
= SampGetRidFromSid((PSID
)MemberSid
,
8436 if (!NT_SUCCESS(Status
))
8438 TRACE("SampGetRidFromSid failed with status 0x%08lx\n", Status
);
8442 /* Fail, if the RID represents a special account */
8445 TRACE("Cannot remove a special account (RID: %lu)\n", Rid
);
8446 Status
= STATUS_SPECIAL_ACCOUNT
;
8450 /* Remove the member from all aliases in the domain */
8451 Status
= SampRemoveMemberFromAllAliases(DomainObject
,
8453 if (!NT_SUCCESS(Status
))
8455 TRACE("SampRemoveMemberFromAllAliases failed with status 0x%08lx\n", Status
);
8459 RtlReleaseResource(&SampResource
);
8468 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
8469 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
8470 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
8472 TRACE("(%p %lu %p)\n", DomainHandle
, DomainInformationClass
, Buffer
);
8474 return SamrQueryInformationDomain(DomainHandle
,
8475 DomainInformationClass
,
8483 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
8484 IN USER_INFORMATION_CLASS UserInformationClass
,
8485 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
8487 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
8489 return SamrQueryInformationUser(UserHandle
,
8490 UserInformationClass
,
8498 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
8499 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8500 IN
unsigned long Index
,
8501 IN
unsigned long EntryCount
,
8502 IN
unsigned long PreferredMaximumLength
,
8503 OUT
unsigned long *TotalAvailable
,
8504 OUT
unsigned long *TotalReturned
,
8505 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8507 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
8508 DomainHandle
, DisplayInformationClass
, Index
,
8509 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
8510 TotalReturned
, Buffer
);
8512 return SamrQueryDisplayInformation(DomainHandle
,
8513 DisplayInformationClass
,
8516 PreferredMaximumLength
,
8526 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
8527 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8528 IN PRPC_UNICODE_STRING Prefix
,
8529 OUT
unsigned long *Index
)
8531 TRACE("(%p %lu %p %p)\n",
8532 DomainHandle
, DisplayInformationClass
, Prefix
, Index
);
8534 return SamrGetDisplayEnumerationIndex(DomainHandle
,
8535 DisplayInformationClass
,
8544 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
8545 IN PRPC_UNICODE_STRING Name
,
8546 IN
unsigned long AccountType
,
8547 IN ACCESS_MASK DesiredAccess
,
8548 OUT SAMPR_HANDLE
*UserHandle
,
8549 OUT
unsigned long *GrantedAccess
,
8550 OUT
unsigned long *RelativeId
)
8552 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
8553 SAM_USER_FIXED_DATA FixedUserData
;
8554 PSAM_DB_OBJECT DomainObject
;
8555 PSAM_DB_OBJECT UserObject
;
8556 GROUP_MEMBERSHIP GroupMembership
;
8557 UCHAR LogonHours
[23];
8561 PSECURITY_DESCRIPTOR Sd
= NULL
;
8563 PSID UserSid
= NULL
;
8566 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
8567 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
8570 Name
->Length
== 0 ||
8571 Name
->Buffer
== NULL
||
8572 UserHandle
== NULL
||
8574 return STATUS_INVALID_PARAMETER
;
8576 /* Check for valid account type */
8577 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
8578 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
8579 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
8580 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
8581 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
8582 return STATUS_INVALID_PARAMETER
;
8584 /* Map generic access rights */
8585 RtlMapGenericMask(&DesiredAccess
,
8588 RtlAcquireResourceExclusive(&SampResource
,
8591 /* Validate the domain handle */
8592 Status
= SampValidateDbObject(DomainHandle
,
8596 if (!NT_SUCCESS(Status
))
8598 TRACE("failed with status 0x%08lx\n", Status
);
8602 /* Check the user account name */
8603 Status
= SampCheckAccountName(Name
, 20);
8604 if (!NT_SUCCESS(Status
))
8606 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
8610 /* Check if the user name already exists in the domain */
8611 Status
= SampCheckAccountNameInDomain(DomainObject
,
8613 if (!NT_SUCCESS(Status
))
8615 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
8616 Name
->Buffer
, Status
);
8620 /* Get the fixed domain attributes */
8621 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8622 Status
= SampGetObjectAttribute(DomainObject
,
8625 (PVOID
)&FixedDomainData
,
8627 if (!NT_SUCCESS(Status
))
8629 TRACE("failed with status 0x%08lx\n", Status
);
8633 /* Increment the NextRid attribute */
8634 ulRid
= FixedDomainData
.NextRid
;
8635 FixedDomainData
.NextRid
++;
8637 TRACE("RID: %lx\n", ulRid
);
8639 /* Create the user SID */
8640 Status
= SampCreateAccountSid(DomainObject
,
8643 if (!NT_SUCCESS(Status
))
8645 TRACE("SampCreateAccountSid failed (Status 0x%08lx)\n", Status
);
8649 /* Create the security descriptor */
8650 Status
= SampCreateUserSD(UserSid
,
8653 if (!NT_SUCCESS(Status
))
8655 TRACE("SampCreateUserSD failed (Status 0x%08lx)\n", Status
);
8659 /* Store the fixed domain attributes */
8660 Status
= SampSetObjectAttribute(DomainObject
,
8665 if (!NT_SUCCESS(Status
))
8667 TRACE("failed with status 0x%08lx\n", Status
);
8671 /* Convert the RID into a string (hex) */
8672 swprintf(szRid
, L
"%08lX", ulRid
);
8674 /* Create the user object */
8675 Status
= SampCreateDbObject(DomainObject
,
8682 if (!NT_SUCCESS(Status
))
8684 TRACE("failed with status 0x%08lx\n", Status
);
8688 /* Add the account name for the user object */
8689 Status
= SampSetAccountNameInDomain(DomainObject
,
8693 if (!NT_SUCCESS(Status
))
8695 TRACE("failed with status 0x%08lx\n", Status
);
8699 /* Initialize fixed user data */
8700 FixedUserData
.Version
= 1;
8701 FixedUserData
.Reserved
= 0;
8702 FixedUserData
.LastLogon
.QuadPart
= 0;
8703 FixedUserData
.LastLogoff
.QuadPart
= 0;
8704 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
8705 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
8706 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
8707 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
8708 FixedUserData
.UserId
= ulRid
;
8709 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
8710 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
8711 USER_PASSWORD_NOT_REQUIRED
|
8713 FixedUserData
.CountryCode
= 0;
8714 FixedUserData
.CodePage
= 0;
8715 FixedUserData
.BadPasswordCount
= 0;
8716 FixedUserData
.LogonCount
= 0;
8717 FixedUserData
.AdminCount
= 0;
8718 FixedUserData
.OperatorCount
= 0;
8720 /* Set fixed user data attribute */
8721 Status
= SampSetObjectAttribute(UserObject
,
8724 (LPVOID
)&FixedUserData
,
8725 sizeof(SAM_USER_FIXED_DATA
));
8726 if (!NT_SUCCESS(Status
))
8728 TRACE("failed with status 0x%08lx\n", Status
);
8732 /* Set the Name attribute */
8733 Status
= SampSetObjectAttributeString(UserObject
,
8736 if (!NT_SUCCESS(Status
))
8738 TRACE("failed with status 0x%08lx\n", Status
);
8742 /* Set the FullName attribute */
8743 Status
= SampSetObjectAttributeString(UserObject
,
8746 if (!NT_SUCCESS(Status
))
8748 TRACE("failed with status 0x%08lx\n", Status
);
8752 /* Set the HomeDirectory attribute */
8753 Status
= SampSetObjectAttributeString(UserObject
,
8756 if (!NT_SUCCESS(Status
))
8758 TRACE("failed with status 0x%08lx\n", Status
);
8762 /* Set the HomeDirectoryDrive attribute */
8763 Status
= SampSetObjectAttributeString(UserObject
,
8764 L
"HomeDirectoryDrive",
8766 if (!NT_SUCCESS(Status
))
8768 TRACE("failed with status 0x%08lx\n", Status
);
8772 /* Set the ScriptPath attribute */
8773 Status
= SampSetObjectAttributeString(UserObject
,
8776 if (!NT_SUCCESS(Status
))
8778 TRACE("failed with status 0x%08lx\n", Status
);
8782 /* Set the ProfilePath attribute */
8783 Status
= SampSetObjectAttributeString(UserObject
,
8786 if (!NT_SUCCESS(Status
))
8788 TRACE("failed with status 0x%08lx\n", Status
);
8792 /* Set the AdminComment attribute */
8793 Status
= SampSetObjectAttributeString(UserObject
,
8796 if (!NT_SUCCESS(Status
))
8798 TRACE("failed with status 0x%08lx\n", Status
);
8802 /* Set the UserComment attribute */
8803 Status
= SampSetObjectAttributeString(UserObject
,
8806 if (!NT_SUCCESS(Status
))
8808 TRACE("failed with status 0x%08lx\n", Status
);
8812 /* Set the WorkStations attribute */
8813 Status
= SampSetObjectAttributeString(UserObject
,
8816 if (!NT_SUCCESS(Status
))
8818 TRACE("failed with status 0x%08lx\n", Status
);
8822 /* Set the Parameters attribute */
8823 Status
= SampSetObjectAttributeString(UserObject
,
8826 if (!NT_SUCCESS(Status
))
8828 TRACE("failed with status 0x%08lx\n", Status
);
8832 /* Set LogonHours attribute*/
8833 *((PUSHORT
)LogonHours
) = 168;
8834 memset(&(LogonHours
[2]), 0xff, 21);
8836 Status
= SampSetObjectAttribute(UserObject
,
8840 sizeof(LogonHours
));
8841 if (!NT_SUCCESS(Status
))
8843 TRACE("failed with status 0x%08lx\n", Status
);
8847 /* Set Groups attribute*/
8848 GroupMembership
.RelativeId
= DOMAIN_GROUP_RID_USERS
;
8849 GroupMembership
.Attributes
= SE_GROUP_MANDATORY
|
8851 SE_GROUP_ENABLED_BY_DEFAULT
;
8853 Status
= SampSetObjectAttribute(UserObject
,
8857 sizeof(GROUP_MEMBERSHIP
));
8858 if (!NT_SUCCESS(Status
))
8860 TRACE("failed with status 0x%08lx\n", Status
);
8864 /* Set LMPwd attribute*/
8865 Status
= SampSetObjectAttribute(UserObject
,
8870 if (!NT_SUCCESS(Status
))
8872 TRACE("failed with status 0x%08lx\n", Status
);
8876 /* Set NTPwd attribute*/
8877 Status
= SampSetObjectAttribute(UserObject
,
8882 if (!NT_SUCCESS(Status
))
8884 TRACE("failed with status 0x%08lx\n", Status
);
8888 /* Set LMPwdHistory attribute*/
8889 Status
= SampSetObjectAttribute(UserObject
,
8894 if (!NT_SUCCESS(Status
))
8896 TRACE("failed with status 0x%08lx\n", Status
);
8900 /* Set NTPwdHistory attribute*/
8901 Status
= SampSetObjectAttribute(UserObject
,
8906 if (!NT_SUCCESS(Status
))
8908 TRACE("failed with status 0x%08lx\n", Status
);
8912 /* Set the PrivateData attribute */
8913 Status
= SampSetObjectAttributeString(UserObject
,
8916 if (!NT_SUCCESS(Status
))
8918 TRACE("failed with status 0x%08lx\n", Status
);
8922 /* Set the SecDesc attribute*/
8923 Status
= SampSetObjectAttribute(UserObject
,
8928 if (!NT_SUCCESS(Status
))
8930 TRACE("failed with status 0x%08lx\n", Status
);
8934 if (NT_SUCCESS(Status
))
8936 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
8937 *RelativeId
= ulRid
;
8938 *GrantedAccess
= UserObject
->Access
;
8943 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
8945 if (UserSid
!= NULL
)
8946 RtlFreeHeap(RtlGetProcessHeap(), 0, UserSid
);
8948 RtlReleaseResource(&SampResource
);
8950 TRACE("returns with status 0x%08lx\n", Status
);
8959 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
8960 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8961 IN
unsigned long Index
,
8962 IN
unsigned long EntryCount
,
8963 IN
unsigned long PreferredMaximumLength
,
8964 OUT
unsigned long *TotalAvailable
,
8965 OUT
unsigned long *TotalReturned
,
8966 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8968 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
8969 DomainHandle
, DisplayInformationClass
, Index
,
8970 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
8971 TotalReturned
, Buffer
);
8973 return SamrQueryDisplayInformation(DomainHandle
,
8974 DisplayInformationClass
,
8977 PreferredMaximumLength
,
8987 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
8988 IN PSAMPR_PSID_ARRAY MembersBuffer
)
8991 NTSTATUS Status
= STATUS_SUCCESS
;
8993 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
8994 AliasHandle
, MembersBuffer
);
8996 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
8998 Status
= SamrAddMemberToAlias(AliasHandle
,
8999 ((PSID
*)MembersBuffer
->Sids
)[i
]);
9001 if (Status
== STATUS_MEMBER_IN_ALIAS
)
9002 Status
= STATUS_SUCCESS
;
9004 if (!NT_SUCCESS(Status
))
9015 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
9016 IN PSAMPR_PSID_ARRAY MembersBuffer
)
9019 NTSTATUS Status
= STATUS_SUCCESS
;
9021 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
9022 AliasHandle
, MembersBuffer
);
9024 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
9026 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
9027 ((PSID
*)MembersBuffer
->Sids
)[i
]);
9029 if (Status
== STATUS_MEMBER_IN_ALIAS
)
9030 Status
= STATUS_SUCCESS
;
9032 if (!NT_SUCCESS(Status
))
9043 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
9044 IN PRPC_STRING ServerName
,
9045 IN PRPC_STRING UserName
,
9046 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
9047 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
9050 return STATUS_NOT_IMPLEMENTED
;
9056 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
9057 IN PRPC_UNICODE_STRING ServerName
,
9058 IN PRPC_UNICODE_STRING UserName
,
9059 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
9060 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
9061 IN
unsigned char LmPresent
,
9062 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
9063 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
9066 return STATUS_NOT_IMPLEMENTED
;
9072 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
9073 IN PRPC_UNICODE_STRING Unused
,
9074 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
9077 return STATUS_NOT_IMPLEMENTED
;
9084 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
9085 OUT SAMPR_HANDLE
*ServerHandle
,
9086 IN ACCESS_MASK DesiredAccess
)
9088 TRACE("(%p %p %lx)\n", ServerName
, ServerHandle
, DesiredAccess
);
9090 return SamrConnect(ServerName
,
9099 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
9100 IN USER_INFORMATION_CLASS UserInformationClass
,
9101 IN PSAMPR_USER_INFO_BUFFER Buffer
)
9103 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
9105 return SamrSetInformationUser(UserHandle
,
9106 UserInformationClass
,
9114 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
9117 return STATUS_NOT_IMPLEMENTED
;
9123 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
9126 return STATUS_NOT_IMPLEMENTED
;
9132 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
9135 return STATUS_NOT_IMPLEMENTED
;
9141 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
9142 OUT SAMPR_HANDLE
*ServerHandle
,
9143 IN
unsigned long ClientRevision
,
9144 IN ACCESS_MASK DesiredAccess
)
9147 return STATUS_NOT_IMPLEMENTED
;
9153 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
9156 return STATUS_NOT_IMPLEMENTED
;
9162 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
9163 IN ACCESS_MASK DesiredAccess
,
9164 IN
unsigned long InVersion
,
9165 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
9166 OUT
unsigned long *OutVersion
,
9167 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
9168 OUT SAMPR_HANDLE
*ServerHandle
)
9171 return STATUS_NOT_IMPLEMENTED
;
9177 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
9178 IN
unsigned long Rid
,
9182 return STATUS_NOT_IMPLEMENTED
;
9188 SamrSetDSRMPassword(IN handle_t BindingHandle
,
9189 IN PRPC_UNICODE_STRING Unused
,
9190 IN
unsigned long UserId
,
9191 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
9194 return STATUS_NOT_IMPLEMENTED
;
9200 SamrValidatePassword(IN handle_t Handle
,
9201 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
9202 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
9203 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
9206 return STATUS_NOT_IMPLEMENTED
;