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
12 /* GLOBALS *******************************************************************/
14 static SID_IDENTIFIER_AUTHORITY NtSidAuthority
= {SECURITY_NT_AUTHORITY
};
16 static GENERIC_MAPPING ServerMapping
=
24 static GENERIC_MAPPING DomainMapping
=
32 static GENERIC_MAPPING AliasMapping
=
40 static GENERIC_MAPPING GroupMapping
=
48 static GENERIC_MAPPING UserMapping
=
56 PGENERIC_MAPPING pServerMapping
= &ServerMapping
;
59 /* FUNCTIONS *****************************************************************/
63 SampAddRelativeTimeToTime(IN LARGE_INTEGER AbsoluteTime
,
64 IN LARGE_INTEGER RelativeTime
)
66 LARGE_INTEGER NewTime
;
68 NewTime
.QuadPart
= AbsoluteTime
.QuadPart
- RelativeTime
.QuadPart
;
70 if (NewTime
.QuadPart
< 0)
78 SampStartRpcServer(VOID
)
82 TRACE("SampStartRpcServer() called\n");
84 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
88 if (Status
!= RPC_S_OK
)
90 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
94 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
97 if (Status
!= RPC_S_OK
)
99 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
103 Status
= RpcServerListen(1, 20, TRUE
);
104 if (Status
!= RPC_S_OK
)
106 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
110 TRACE("SampStartRpcServer() done\n");
114 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
116 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
120 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
122 HeapFree(GetProcessHeap(), 0, ptr
);
126 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
134 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
135 OUT SAMPR_HANDLE
*ServerHandle
,
136 IN ACCESS_MASK DesiredAccess
)
138 PSAM_DB_OBJECT ServerObject
;
141 TRACE("SamrConnect(%p %p %lx)\n",
142 ServerName
, ServerHandle
, DesiredAccess
);
144 RtlAcquireResourceShared(&SampResource
,
147 /* Map generic access rights */
148 RtlMapGenericMask(&DesiredAccess
,
151 /* Open the Server Object */
152 Status
= SampOpenDbObject(NULL
,
159 if (NT_SUCCESS(Status
))
160 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
162 RtlReleaseResource(&SampResource
);
164 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
173 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
175 PSAM_DB_OBJECT DbObject
;
176 NTSTATUS Status
= STATUS_SUCCESS
;
178 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
180 RtlAcquireResourceShared(&SampResource
,
183 Status
= SampValidateDbObject(*SamHandle
,
187 if (Status
== STATUS_SUCCESS
)
189 Status
= SampCloseDbObject(DbObject
);
193 RtlReleaseResource(&SampResource
);
195 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
204 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
205 IN SECURITY_INFORMATION SecurityInformation
,
206 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
209 return STATUS_NOT_IMPLEMENTED
;
216 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
217 IN SECURITY_INFORMATION SecurityInformation
,
218 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
*SecurityDescriptor
)
220 PSAM_DB_OBJECT SamObject
;
221 PSAMPR_SR_SECURITY_DESCRIPTOR SamSD
= NULL
;
222 PSECURITY_DESCRIPTOR SdBuffer
= NULL
;
223 ACCESS_MASK DesiredAccess
= 0;
227 TRACE("(%p %lx %p)\n",
228 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
230 *SecurityDescriptor
= NULL
;
232 RtlAcquireResourceShared(&SampResource
,
235 if (SecurityInformation
& (DACL_SECURITY_INFORMATION
|
236 OWNER_SECURITY_INFORMATION
|
237 GROUP_SECURITY_INFORMATION
))
238 DesiredAccess
|= READ_CONTROL
;
240 if (SecurityInformation
& SACL_SECURITY_INFORMATION
)
241 DesiredAccess
|= ACCESS_SYSTEM_SECURITY
;
243 /* Validate the server handle */
244 Status
= SampValidateDbObject(ObjectHandle
,
248 if (!NT_SUCCESS(Status
))
251 SamSD
= midl_user_allocate(sizeof(SAMPR_SR_SECURITY_DESCRIPTOR
));
254 Status
= STATUS_INSUFFICIENT_RESOURCES
;
258 Status
= SampGetObjectAttribute(SamObject
,
263 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
265 TRACE("Status 0x%08lx\n", Status
);
269 TRACE("SD Length: %lu\n", Length
);
271 SdBuffer
= midl_user_allocate(Length
);
272 if (SdBuffer
== NULL
)
274 Status
= STATUS_INSUFFICIENT_RESOURCES
;
278 Status
= SampGetObjectAttribute(SamObject
,
283 if (!NT_SUCCESS(Status
))
285 TRACE("Status 0x%08lx\n", Status
);
289 /* FIXME: Use SecurityInformation to return only the requested information */
291 SamSD
->Length
= Length
;
292 SamSD
->SecurityDescriptor
= SdBuffer
;
295 RtlReleaseResource(&SampResource
);
297 if (NT_SUCCESS(Status
))
299 *SecurityDescriptor
= SamSD
;
303 if (SdBuffer
!= NULL
)
304 midl_user_free(SdBuffer
);
307 midl_user_free(SamSD
);
317 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
319 PSAM_DB_OBJECT ServerObject
;
322 TRACE("(%p)\n", ServerHandle
);
324 RtlAcquireResourceShared(&SampResource
,
327 /* Validate the server handle */
328 Status
= SampValidateDbObject(ServerHandle
,
333 RtlReleaseResource(&SampResource
);
335 if (!NT_SUCCESS(Status
))
338 /* Shut the server down */
339 RpcMgmtStopServerListening(0);
341 return STATUS_SUCCESS
;
348 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
349 IN PRPC_UNICODE_STRING Name
,
350 OUT PRPC_SID
*DomainId
)
352 PSAM_DB_OBJECT ServerObject
;
353 HANDLE DomainsKeyHandle
= NULL
;
354 HANDLE DomainKeyHandle
= NULL
;
355 WCHAR DomainKeyName
[64];
357 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
358 UNICODE_STRING DomainName
;
363 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
364 ServerHandle
, Name
, DomainId
);
366 RtlAcquireResourceShared(&SampResource
,
369 /* Validate the server handle */
370 Status
= SampValidateDbObject(ServerHandle
,
372 SAM_SERVER_LOOKUP_DOMAIN
,
374 if (!NT_SUCCESS(Status
))
379 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
383 if (!NT_SUCCESS(Status
))
387 while (Found
== FALSE
)
389 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
393 if (!NT_SUCCESS(Status
))
395 if (Status
== STATUS_NO_MORE_ENTRIES
)
396 Status
= STATUS_NO_SUCH_DOMAIN
;
400 TRACE("Domain key name: %S\n", DomainKeyName
);
402 Status
= SampRegOpenKey(DomainsKeyHandle
,
406 if (NT_SUCCESS(Status
))
408 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
409 Status
= SampRegQueryValue(DomainKeyHandle
,
412 (PVOID
)&DomainNameString
,
414 if (NT_SUCCESS(Status
))
416 TRACE("Domain name: %S\n", DomainNameString
);
418 RtlInitUnicodeString(&DomainName
,
420 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
422 TRACE("Found it!\n");
425 Status
= SampRegQueryValue(DomainKeyHandle
,
430 if (NT_SUCCESS(Status
))
432 *DomainId
= midl_user_allocate(Length
);
434 SampRegQueryValue(DomainKeyHandle
,
440 Status
= STATUS_SUCCESS
;
446 SampRegCloseKey(&DomainKeyHandle
);
453 SampRegCloseKey(&DomainKeyHandle
);
454 SampRegCloseKey(&DomainsKeyHandle
);
456 RtlReleaseResource(&SampResource
);
465 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
466 IN OUT
unsigned long *EnumerationContext
,
467 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
468 IN ULONG PreferedMaximumLength
,
469 OUT PULONG CountReturned
)
471 PSAM_DB_OBJECT ServerObject
;
472 WCHAR DomainKeyName
[64];
473 HANDLE DomainsKeyHandle
= NULL
;
474 HANDLE DomainKeyHandle
= NULL
;
477 ULONG RequiredLength
;
480 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
483 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
484 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
487 RtlAcquireResourceShared(&SampResource
,
490 /* Validate the server handle */
491 Status
= SampValidateDbObject(ServerHandle
,
493 SAM_SERVER_ENUMERATE_DOMAINS
,
495 if (!NT_SUCCESS(Status
))
498 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
502 if (!NT_SUCCESS(Status
))
505 EnumIndex
= *EnumerationContext
;
511 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
515 if (!NT_SUCCESS(Status
))
518 TRACE("EnumIndex: %lu\n", EnumIndex
);
519 TRACE("Domain key name: %S\n", DomainKeyName
);
521 Status
= SampRegOpenKey(DomainsKeyHandle
,
525 TRACE("SampRegOpenKey returned %08lX\n", Status
);
526 if (NT_SUCCESS(Status
))
529 Status
= SampRegQueryValue(DomainKeyHandle
,
534 TRACE("SampRegQueryValue returned %08lX\n", Status
);
535 if (NT_SUCCESS(Status
))
537 TRACE("Data length: %lu\n", DataLength
);
539 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
542 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
546 SampRegCloseKey(&DomainKeyHandle
);
552 TRACE("EnumCount: %lu\n", EnumCount
);
553 TRACE("RequiredLength: %lu\n", RequiredLength
);
555 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
556 if (EnumBuffer
== NULL
)
558 Status
= STATUS_INSUFFICIENT_RESOURCES
;
562 EnumBuffer
->EntriesRead
= EnumCount
;
563 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
564 if (EnumBuffer
->Buffer
== NULL
)
566 Status
= STATUS_INSUFFICIENT_RESOURCES
;
570 EnumIndex
= *EnumerationContext
;
571 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
573 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
577 if (!NT_SUCCESS(Status
))
580 TRACE("EnumIndex: %lu\n", EnumIndex
);
581 TRACE("Domain key name: %S\n", DomainKeyName
);
583 Status
= SampRegOpenKey(DomainsKeyHandle
,
587 TRACE("SampRegOpenKey returned %08lX\n", Status
);
588 if (NT_SUCCESS(Status
))
591 Status
= SampRegQueryValue(DomainKeyHandle
,
596 TRACE("SampRegQueryValue returned %08lX\n", Status
);
597 if (NT_SUCCESS(Status
))
599 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
600 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
601 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
602 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
603 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
605 SampRegCloseKey(&DomainKeyHandle
);
606 Status
= STATUS_INSUFFICIENT_RESOURCES
;
610 Status
= SampRegQueryValue(DomainKeyHandle
,
613 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
615 TRACE("SampRegQueryValue returned %08lX\n", Status
);
616 if (NT_SUCCESS(Status
))
618 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
622 SampRegCloseKey(&DomainKeyHandle
);
624 if (!NT_SUCCESS(Status
))
629 if (NT_SUCCESS(Status
))
631 *EnumerationContext
+= EnumCount
;
632 *Buffer
= EnumBuffer
;
633 *CountReturned
= EnumCount
;
637 SampRegCloseKey(&DomainKeyHandle
);
638 SampRegCloseKey(&DomainsKeyHandle
);
640 if (!NT_SUCCESS(Status
))
642 *EnumerationContext
= 0;
646 if (EnumBuffer
!= NULL
)
648 if (EnumBuffer
->Buffer
!= NULL
)
650 if (EnumBuffer
->EntriesRead
!= 0)
652 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
654 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
655 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
659 midl_user_free(EnumBuffer
->Buffer
);
662 midl_user_free(EnumBuffer
);
666 RtlReleaseResource(&SampResource
);
675 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
676 IN ACCESS_MASK DesiredAccess
,
677 IN PRPC_SID DomainId
,
678 OUT SAMPR_HANDLE
*DomainHandle
)
680 PSAM_DB_OBJECT ServerObject
;
681 PSAM_DB_OBJECT DomainObject
;
684 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
685 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
687 /* Map generic access rights */
688 RtlMapGenericMask(&DesiredAccess
,
691 RtlAcquireResourceShared(&SampResource
,
694 /* Validate the server handle */
695 Status
= SampValidateDbObject(ServerHandle
,
697 SAM_SERVER_LOOKUP_DOMAIN
,
699 if (!NT_SUCCESS(Status
))
702 /* Validate the Domain SID */
703 if ((DomainId
->Revision
!= SID_REVISION
) ||
704 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
705 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
706 return STATUS_INVALID_PARAMETER
;
708 /* Open the domain object */
709 if ((DomainId
->SubAuthorityCount
== 1) &&
710 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
712 /* Builtin domain object */
713 TRACE("Opening the builtin domain object.\n");
715 Status
= SampOpenDbObject(ServerObject
,
723 else if ((DomainId
->SubAuthorityCount
== 4) &&
724 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
726 /* Account domain object */
727 TRACE("Opening the account domain object.\n");
729 /* FIXME: Check the account domain sub authorities!!! */
731 Status
= SampOpenDbObject(ServerObject
,
741 /* No vaild domain SID */
742 Status
= STATUS_INVALID_PARAMETER
;
745 if (NT_SUCCESS(Status
))
746 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
748 RtlReleaseResource(&SampResource
);
750 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
757 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
758 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
760 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
761 SAM_DOMAIN_FIXED_DATA FixedData
;
767 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
768 if (InfoBuffer
== NULL
)
769 return STATUS_INSUFFICIENT_RESOURCES
;
771 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
772 Status
= SampGetObjectAttribute(DomainObject
,
777 if (!NT_SUCCESS(Status
))
780 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
781 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
782 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
783 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
784 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
785 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
786 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
788 *Buffer
= InfoBuffer
;
791 if (!NT_SUCCESS(Status
))
793 if (InfoBuffer
!= NULL
)
795 midl_user_free(InfoBuffer
);
804 SampGetNumberOfAccounts(PSAM_DB_OBJECT DomainObject
,
808 HANDLE AccountKeyHandle
= NULL
;
809 HANDLE NamesKeyHandle
= NULL
;
814 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
818 if (!NT_SUCCESS(Status
))
821 Status
= SampRegOpenKey(AccountKeyHandle
,
825 if (!NT_SUCCESS(Status
))
828 Status
= SampRegQueryKeyInfo(NamesKeyHandle
,
833 SampRegCloseKey(&NamesKeyHandle
);
834 SampRegCloseKey(&AccountKeyHandle
);
841 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
842 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
844 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
845 SAM_DOMAIN_FIXED_DATA FixedData
;
851 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
852 if (InfoBuffer
== NULL
)
853 return STATUS_INSUFFICIENT_RESOURCES
;
855 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
856 Status
= SampGetObjectAttribute(DomainObject
,
861 if (!NT_SUCCESS(Status
))
864 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
865 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
866 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
867 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
868 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
869 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
870 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
872 /* Get the OemInformation string */
873 Status
= SampGetObjectAttributeString(DomainObject
,
875 &InfoBuffer
->General
.OemInformation
);
876 if (!NT_SUCCESS(Status
))
878 TRACE("Status 0x%08lx\n", Status
);
882 /* Get the Name string */
883 Status
= SampGetObjectAttributeString(DomainObject
,
885 &InfoBuffer
->General
.DomainName
);
886 if (!NT_SUCCESS(Status
))
888 TRACE("Status 0x%08lx\n", Status
);
892 /* Get the ReplicaSourceNodeName string */
893 Status
= SampGetObjectAttributeString(DomainObject
,
894 L
"ReplicaSourceNodeName",
895 &InfoBuffer
->General
.ReplicaSourceNodeName
);
896 if (!NT_SUCCESS(Status
))
898 TRACE("Status 0x%08lx\n", Status
);
902 /* Get the number of Users in the Domain */
903 Status
= SampGetNumberOfAccounts(DomainObject
,
905 &InfoBuffer
->General
.UserCount
);
906 if (!NT_SUCCESS(Status
))
908 TRACE("Status 0x%08lx\n", Status
);
912 /* Get the number of Groups in the Domain */
913 Status
= SampGetNumberOfAccounts(DomainObject
,
915 &InfoBuffer
->General
.GroupCount
);
916 if (!NT_SUCCESS(Status
))
918 TRACE("Status 0x%08lx\n", Status
);
922 /* Get the number of Aliases in the Domain */
923 Status
= SampGetNumberOfAccounts(DomainObject
,
925 &InfoBuffer
->General
.AliasCount
);
926 if (!NT_SUCCESS(Status
))
928 TRACE("Status 0x%08lx\n", Status
);
932 *Buffer
= InfoBuffer
;
935 if (!NT_SUCCESS(Status
))
937 if (InfoBuffer
!= NULL
)
939 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
940 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
942 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
943 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
945 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
946 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
948 midl_user_free(InfoBuffer
);
957 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
958 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
960 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
961 SAM_DOMAIN_FIXED_DATA FixedData
;
967 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
968 if (InfoBuffer
== NULL
)
969 return STATUS_INSUFFICIENT_RESOURCES
;
971 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
972 Status
= SampGetObjectAttribute(DomainObject
,
977 if (!NT_SUCCESS(Status
))
980 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
981 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
983 *Buffer
= InfoBuffer
;
986 if (!NT_SUCCESS(Status
))
988 if (InfoBuffer
!= NULL
)
990 midl_user_free(InfoBuffer
);
999 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
1000 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1002 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1007 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1008 if (InfoBuffer
== NULL
)
1009 return STATUS_INSUFFICIENT_RESOURCES
;
1011 /* Get the OemInformation string */
1012 Status
= SampGetObjectAttributeString(DomainObject
,
1014 &InfoBuffer
->Oem
.OemInformation
);
1015 if (!NT_SUCCESS(Status
))
1017 TRACE("Status 0x%08lx\n", Status
);
1021 *Buffer
= InfoBuffer
;
1024 if (!NT_SUCCESS(Status
))
1026 if (InfoBuffer
!= NULL
)
1028 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
1029 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
1031 midl_user_free(InfoBuffer
);
1040 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
1041 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1043 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1048 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1049 if (InfoBuffer
== NULL
)
1050 return STATUS_INSUFFICIENT_RESOURCES
;
1052 /* Get the Name string */
1053 Status
= SampGetObjectAttributeString(DomainObject
,
1055 &InfoBuffer
->Name
.DomainName
);
1056 if (!NT_SUCCESS(Status
))
1058 TRACE("Status 0x%08lx\n", Status
);
1062 *Buffer
= InfoBuffer
;
1065 if (!NT_SUCCESS(Status
))
1067 if (InfoBuffer
!= NULL
)
1069 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
1070 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
1072 midl_user_free(InfoBuffer
);
1081 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
1082 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1084 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1089 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1090 if (InfoBuffer
== NULL
)
1091 return STATUS_INSUFFICIENT_RESOURCES
;
1093 /* Get the ReplicaSourceNodeName string */
1094 Status
= SampGetObjectAttributeString(DomainObject
,
1095 L
"ReplicaSourceNodeName",
1096 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
1097 if (!NT_SUCCESS(Status
))
1099 TRACE("Status 0x%08lx\n", Status
);
1103 *Buffer
= InfoBuffer
;
1106 if (!NT_SUCCESS(Status
))
1108 if (InfoBuffer
!= NULL
)
1110 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1111 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
1113 midl_user_free(InfoBuffer
);
1122 SampQueryDomainServerRole(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
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
1147 *Buffer
= InfoBuffer
;
1150 if (!NT_SUCCESS(Status
))
1152 if (InfoBuffer
!= NULL
)
1154 midl_user_free(InfoBuffer
);
1163 SampQueryDomainModified(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
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1187 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1188 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1189 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1191 *Buffer
= InfoBuffer
;
1194 if (!NT_SUCCESS(Status
))
1196 if (InfoBuffer
!= NULL
)
1198 midl_user_free(InfoBuffer
);
1207 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1208 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1210 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1211 SAM_DOMAIN_FIXED_DATA FixedData
;
1217 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1218 if (InfoBuffer
== NULL
)
1219 return STATUS_INSUFFICIENT_RESOURCES
;
1221 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1222 Status
= SampGetObjectAttribute(DomainObject
,
1227 if (!NT_SUCCESS(Status
))
1230 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1232 *Buffer
= InfoBuffer
;
1235 if (!NT_SUCCESS(Status
))
1237 if (InfoBuffer
!= NULL
)
1239 midl_user_free(InfoBuffer
);
1248 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1249 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1251 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1252 SAM_DOMAIN_FIXED_DATA FixedData
;
1258 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1259 if (InfoBuffer
== NULL
)
1260 return STATUS_INSUFFICIENT_RESOURCES
;
1262 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1263 Status
= SampGetObjectAttribute(DomainObject
,
1268 if (!NT_SUCCESS(Status
))
1271 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1272 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1273 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1274 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1275 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1276 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1277 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1279 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1280 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1281 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1283 /* Get the OemInformation string */
1284 Status
= SampGetObjectAttributeString(DomainObject
,
1286 &InfoBuffer
->General2
.I1
.OemInformation
);
1287 if (!NT_SUCCESS(Status
))
1289 TRACE("Status 0x%08lx\n", Status
);
1293 /* Get the Name string */
1294 Status
= SampGetObjectAttributeString(DomainObject
,
1296 &InfoBuffer
->General2
.I1
.DomainName
);
1297 if (!NT_SUCCESS(Status
))
1299 TRACE("Status 0x%08lx\n", Status
);
1303 /* Get the ReplicaSourceNodeName string */
1304 Status
= SampGetObjectAttributeString(DomainObject
,
1305 L
"ReplicaSourceNodeName",
1306 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1307 if (!NT_SUCCESS(Status
))
1309 TRACE("Status 0x%08lx\n", Status
);
1313 /* Get the number of Users in the Domain */
1314 Status
= SampGetNumberOfAccounts(DomainObject
,
1316 &InfoBuffer
->General2
.I1
.UserCount
);
1317 if (!NT_SUCCESS(Status
))
1319 TRACE("Status 0x%08lx\n", Status
);
1323 /* Get the number of Groups in the Domain */
1324 Status
= SampGetNumberOfAccounts(DomainObject
,
1326 &InfoBuffer
->General2
.I1
.GroupCount
);
1327 if (!NT_SUCCESS(Status
))
1329 TRACE("Status 0x%08lx\n", Status
);
1333 /* Get the number of Aliases in the Domain */
1334 Status
= SampGetNumberOfAccounts(DomainObject
,
1336 &InfoBuffer
->General2
.I1
.AliasCount
);
1337 if (!NT_SUCCESS(Status
))
1339 TRACE("Status 0x%08lx\n", Status
);
1343 *Buffer
= InfoBuffer
;
1346 if (!NT_SUCCESS(Status
))
1348 if (InfoBuffer
!= NULL
)
1350 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1351 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1353 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1354 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1356 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1357 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1359 midl_user_free(InfoBuffer
);
1368 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1369 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1371 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1372 SAM_DOMAIN_FIXED_DATA FixedData
;
1378 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1379 if (InfoBuffer
== NULL
)
1380 return STATUS_INSUFFICIENT_RESOURCES
;
1382 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1383 Status
= SampGetObjectAttribute(DomainObject
,
1388 if (!NT_SUCCESS(Status
))
1391 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1392 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1393 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1395 *Buffer
= InfoBuffer
;
1398 if (!NT_SUCCESS(Status
))
1400 if (InfoBuffer
!= NULL
)
1402 midl_user_free(InfoBuffer
);
1411 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1412 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1414 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1415 SAM_DOMAIN_FIXED_DATA FixedData
;
1421 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1422 if (InfoBuffer
== NULL
)
1423 return STATUS_INSUFFICIENT_RESOURCES
;
1425 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1426 Status
= SampGetObjectAttribute(DomainObject
,
1431 if (!NT_SUCCESS(Status
))
1434 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1435 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1436 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1437 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1438 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1439 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1441 *Buffer
= InfoBuffer
;
1444 if (!NT_SUCCESS(Status
))
1446 if (InfoBuffer
!= NULL
)
1448 midl_user_free(InfoBuffer
);
1459 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1460 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1461 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1463 PSAM_DB_OBJECT DomainObject
;
1464 ACCESS_MASK DesiredAccess
;
1467 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1468 DomainHandle
, DomainInformationClass
, Buffer
);
1470 switch (DomainInformationClass
)
1472 case DomainPasswordInformation
:
1473 case DomainLockoutInformation
:
1474 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1477 case DomainGeneralInformation
:
1478 case DomainLogoffInformation
:
1479 case DomainOemInformation
:
1480 case DomainNameInformation
:
1481 case DomainReplicationInformation
:
1482 case DomainServerRoleInformation
:
1483 case DomainModifiedInformation
:
1484 case DomainStateInformation
:
1485 case DomainModifiedInformation2
:
1486 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1489 case DomainGeneralInformation2
:
1490 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1491 DOMAIN_READ_OTHER_PARAMETERS
;
1495 return STATUS_INVALID_INFO_CLASS
;
1498 RtlAcquireResourceShared(&SampResource
,
1501 /* Validate the server handle */
1502 Status
= SampValidateDbObject(DomainHandle
,
1506 if (!NT_SUCCESS(Status
))
1509 switch (DomainInformationClass
)
1511 case DomainPasswordInformation
:
1512 Status
= SampQueryDomainPassword(DomainObject
,
1516 case DomainGeneralInformation
:
1517 Status
= SampQueryDomainGeneral(DomainObject
,
1521 case DomainLogoffInformation
:
1522 Status
= SampQueryDomainLogoff(DomainObject
,
1526 case DomainOemInformation
:
1527 Status
= SampQueryDomainOem(DomainObject
,
1531 case DomainNameInformation
:
1532 Status
= SampQueryDomainName(DomainObject
,
1536 case DomainReplicationInformation
:
1537 Status
= SampQueryDomainReplication(DomainObject
,
1541 case DomainServerRoleInformation
:
1542 Status
= SampQueryDomainServerRole(DomainObject
,
1546 case DomainModifiedInformation
:
1547 Status
= SampQueryDomainModified(DomainObject
,
1551 case DomainStateInformation
:
1552 Status
= SampQueryDomainState(DomainObject
,
1556 case DomainGeneralInformation2
:
1557 Status
= SampQueryDomainGeneral2(DomainObject
,
1561 case DomainLockoutInformation
:
1562 Status
= SampQueryDomainLockout(DomainObject
,
1566 case DomainModifiedInformation2
:
1567 Status
= SampQueryDomainModified2(DomainObject
,
1572 Status
= STATUS_NOT_IMPLEMENTED
;
1576 RtlReleaseResource(&SampResource
);
1583 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1584 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1586 SAM_DOMAIN_FIXED_DATA FixedData
;
1590 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1591 Status
= SampGetObjectAttribute(DomainObject
,
1596 if (!NT_SUCCESS(Status
))
1599 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1600 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1601 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1602 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1603 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1604 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1605 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1607 Status
= SampSetObjectAttribute(DomainObject
,
1619 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1620 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1622 SAM_DOMAIN_FIXED_DATA FixedData
;
1626 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1627 Status
= SampGetObjectAttribute(DomainObject
,
1632 if (!NT_SUCCESS(Status
))
1635 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1636 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1638 Status
= SampSetObjectAttribute(DomainObject
,
1650 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1651 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1653 SAM_DOMAIN_FIXED_DATA FixedData
;
1657 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1658 Status
= SampGetObjectAttribute(DomainObject
,
1663 if (!NT_SUCCESS(Status
))
1666 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1668 Status
= SampSetObjectAttribute(DomainObject
,
1680 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1681 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1683 SAM_DOMAIN_FIXED_DATA FixedData
;
1687 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1688 Status
= SampGetObjectAttribute(DomainObject
,
1693 if (!NT_SUCCESS(Status
))
1696 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1698 Status
= SampSetObjectAttribute(DomainObject
,
1710 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1711 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1713 SAM_DOMAIN_FIXED_DATA FixedData
;
1717 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1718 Status
= SampGetObjectAttribute(DomainObject
,
1723 if (!NT_SUCCESS(Status
))
1726 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1727 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1728 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1730 Status
= SampSetObjectAttribute(DomainObject
,
1744 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1745 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1746 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1748 PSAM_DB_OBJECT DomainObject
;
1749 ACCESS_MASK DesiredAccess
;
1752 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1753 DomainHandle
, DomainInformationClass
, DomainInformation
);
1755 switch (DomainInformationClass
)
1757 case DomainPasswordInformation
:
1758 case DomainLockoutInformation
:
1759 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1762 case DomainLogoffInformation
:
1763 case DomainOemInformation
:
1764 case DomainNameInformation
:
1765 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1768 case DomainReplicationInformation
:
1769 case DomainServerRoleInformation
:
1770 case DomainStateInformation
:
1771 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1775 return STATUS_INVALID_INFO_CLASS
;
1778 RtlAcquireResourceExclusive(&SampResource
,
1781 /* Validate the server handle */
1782 Status
= SampValidateDbObject(DomainHandle
,
1786 if (!NT_SUCCESS(Status
))
1789 switch (DomainInformationClass
)
1791 case DomainPasswordInformation
:
1792 Status
= SampSetDomainPassword(DomainObject
,
1796 case DomainLogoffInformation
:
1797 Status
= SampSetDomainLogoff(DomainObject
,
1801 case DomainOemInformation
:
1802 Status
= SampSetObjectAttributeString(DomainObject
,
1804 &DomainInformation
->Oem
.OemInformation
);
1807 case DomainNameInformation
:
1808 Status
= SampSetObjectAttributeString(DomainObject
,
1810 &DomainInformation
->Name
.DomainName
);
1813 case DomainReplicationInformation
:
1814 Status
= SampSetObjectAttributeString(DomainObject
,
1815 L
"ReplicaSourceNodeName",
1816 &DomainInformation
->Replication
.ReplicaSourceNodeName
);
1819 case DomainServerRoleInformation
:
1820 Status
= SampSetDomainServerRole(DomainObject
,
1824 case DomainStateInformation
:
1825 Status
= SampSetDomainState(DomainObject
,
1829 case DomainLockoutInformation
:
1830 Status
= SampSetDomainLockout(DomainObject
,
1835 Status
= STATUS_NOT_IMPLEMENTED
;
1839 RtlReleaseResource(&SampResource
);
1848 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1849 IN PRPC_UNICODE_STRING Name
,
1850 IN ACCESS_MASK DesiredAccess
,
1851 OUT SAMPR_HANDLE
*GroupHandle
,
1852 OUT
unsigned long *RelativeId
)
1854 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1855 SAM_GROUP_FIXED_DATA FixedGroupData
;
1856 PSAM_DB_OBJECT DomainObject
;
1857 PSAM_DB_OBJECT GroupObject
;
1858 PSECURITY_DESCRIPTOR Sd
= NULL
;
1865 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1866 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1868 /* Map generic access rights */
1869 RtlMapGenericMask(&DesiredAccess
,
1872 RtlAcquireResourceExclusive(&SampResource
,
1875 /* Validate the domain handle */
1876 Status
= SampValidateDbObject(DomainHandle
,
1878 DOMAIN_CREATE_GROUP
,
1880 if (!NT_SUCCESS(Status
))
1882 TRACE("failed with status 0x%08lx\n", Status
);
1886 /* Check the group account name */
1887 Status
= SampCheckAccountName(Name
, 256);
1888 if (!NT_SUCCESS(Status
))
1890 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
1894 /* Check if the group name already exists in the domain */
1895 Status
= SampCheckAccountNameInDomain(DomainObject
,
1897 if (!NT_SUCCESS(Status
))
1899 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1900 Name
->Buffer
, Status
);
1904 /* Create the security descriptor */
1905 Status
= SampCreateGroupSD(&Sd
,
1907 if (!NT_SUCCESS(Status
))
1909 TRACE("SampCreateGroupSD failed (Status 0x%08lx)\n", Status
);
1913 /* Get the fixed domain attributes */
1914 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1915 Status
= SampGetObjectAttribute(DomainObject
,
1918 (PVOID
)&FixedDomainData
,
1920 if (!NT_SUCCESS(Status
))
1922 TRACE("failed with status 0x%08lx\n", Status
);
1926 /* Increment the NextRid attribute */
1927 ulRid
= FixedDomainData
.NextRid
;
1928 FixedDomainData
.NextRid
++;
1930 /* Store the fixed domain attributes */
1931 Status
= SampSetObjectAttribute(DomainObject
,
1936 if (!NT_SUCCESS(Status
))
1938 TRACE("failed with status 0x%08lx\n", Status
);
1942 TRACE("RID: %lx\n", ulRid
);
1944 /* Convert the RID into a string (hex) */
1945 swprintf(szRid
, L
"%08lX", ulRid
);
1947 /* Create the group object */
1948 Status
= SampCreateDbObject(DomainObject
,
1955 if (!NT_SUCCESS(Status
))
1957 TRACE("failed with status 0x%08lx\n", Status
);
1961 /* Add the account name of the user object */
1962 Status
= SampSetAccountNameInDomain(DomainObject
,
1966 if (!NT_SUCCESS(Status
))
1968 TRACE("failed with status 0x%08lx\n", Status
);
1972 /* Initialize fixed user data */
1973 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1974 FixedGroupData
.Version
= 1;
1975 FixedGroupData
.GroupId
= ulRid
;
1977 /* Set fixed user data attribute */
1978 Status
= SampSetObjectAttribute(GroupObject
,
1981 (LPVOID
)&FixedGroupData
,
1982 sizeof(SAM_GROUP_FIXED_DATA
));
1983 if (!NT_SUCCESS(Status
))
1985 TRACE("failed with status 0x%08lx\n", Status
);
1989 /* Set the Name attribute */
1990 Status
= SampSetObjectAttributeString(GroupObject
,
1993 if (!NT_SUCCESS(Status
))
1995 TRACE("failed with status 0x%08lx\n", Status
);
1999 /* Set the AdminComment attribute */
2000 Status
= SampSetObjectAttributeString(GroupObject
,
2003 if (!NT_SUCCESS(Status
))
2005 TRACE("failed with status 0x%08lx\n", Status
);
2009 /* Set the SecDesc attribute*/
2010 Status
= SampSetObjectAttribute(GroupObject
,
2015 if (!NT_SUCCESS(Status
))
2017 TRACE("failed with status 0x%08lx\n", Status
);
2021 if (NT_SUCCESS(Status
))
2023 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
2024 *RelativeId
= ulRid
;
2029 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
2031 RtlReleaseResource(&SampResource
);
2033 TRACE("returns with status 0x%08lx\n", Status
);
2042 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
2043 IN OUT
unsigned long *EnumerationContext
,
2044 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2045 IN
unsigned long PreferedMaximumLength
,
2046 OUT
unsigned long *CountReturned
)
2048 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2049 PSAM_DB_OBJECT DomainObject
;
2050 HANDLE GroupsKeyHandle
= NULL
;
2051 HANDLE NamesKeyHandle
= NULL
;
2052 WCHAR GroupName
[64];
2054 ULONG EnumCount
= 0;
2055 ULONG RequiredLength
= 0;
2060 BOOLEAN MoreEntries
= FALSE
;
2063 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
2064 DomainHandle
, EnumerationContext
, Buffer
,
2065 PreferedMaximumLength
, CountReturned
);
2067 RtlAcquireResourceShared(&SampResource
,
2070 /* Validate the domain handle */
2071 Status
= SampValidateDbObject(DomainHandle
,
2073 DOMAIN_LIST_ACCOUNTS
,
2075 if (!NT_SUCCESS(Status
))
2078 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2082 if (!NT_SUCCESS(Status
))
2085 Status
= SampRegOpenKey(GroupsKeyHandle
,
2089 if (!NT_SUCCESS(Status
))
2094 EnumIndex
= *EnumerationContext
;
2098 NameLength
= 64 * sizeof(WCHAR
);
2099 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2106 if (!NT_SUCCESS(Status
))
2108 if (Status
== STATUS_NO_MORE_ENTRIES
)
2109 Status
= STATUS_SUCCESS
;
2113 TRACE("EnumIndex: %lu\n", EnumIndex
);
2114 TRACE("Group name: %S\n", GroupName
);
2115 TRACE("Name length: %lu\n", NameLength
);
2117 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2123 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2129 TRACE("EnumCount: %lu\n", EnumCount
);
2130 TRACE("RequiredLength: %lu\n", RequiredLength
);
2132 if (!NT_SUCCESS(Status
))
2135 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2136 if (EnumBuffer
== NULL
)
2138 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2142 EnumBuffer
->EntriesRead
= EnumCount
;
2146 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2147 if (EnumBuffer
->Buffer
== NULL
)
2149 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2155 EnumIndex
= *EnumerationContext
;
2156 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2158 NameLength
= 64 * sizeof(WCHAR
);
2159 DataLength
= sizeof(ULONG
);
2160 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2167 if (!NT_SUCCESS(Status
))
2169 if (Status
== STATUS_NO_MORE_ENTRIES
)
2170 Status
= STATUS_SUCCESS
;
2174 TRACE("EnumIndex: %lu\n", EnumIndex
);
2175 TRACE("Group name: %S\n", GroupName
);
2176 TRACE("Name length: %lu\n", NameLength
);
2177 TRACE("RID: %lu\n", Rid
);
2179 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2181 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2182 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(NameLength
+ sizeof(UNICODE_NULL
));
2184 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2186 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2187 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2189 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2193 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2195 EnumBuffer
->Buffer
[i
].Name
.Length
);
2200 if (NT_SUCCESS(Status
))
2202 *EnumerationContext
+= EnumCount
;
2203 *Buffer
= EnumBuffer
;
2204 *CountReturned
= EnumCount
;
2208 *EnumerationContext
= 0;
2212 if (EnumBuffer
!= NULL
)
2214 if (EnumBuffer
->Buffer
!= NULL
)
2216 if (EnumBuffer
->EntriesRead
!= 0)
2218 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2220 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2221 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2225 midl_user_free(EnumBuffer
->Buffer
);
2228 midl_user_free(EnumBuffer
);
2232 SampRegCloseKey(&NamesKeyHandle
);
2233 SampRegCloseKey(&GroupsKeyHandle
);
2235 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2236 Status
= STATUS_MORE_ENTRIES
;
2238 RtlReleaseResource(&SampResource
);
2247 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
2248 IN PRPC_UNICODE_STRING Name
,
2249 IN ACCESS_MASK DesiredAccess
,
2250 OUT SAMPR_HANDLE
*UserHandle
,
2251 OUT
unsigned long *RelativeId
)
2253 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2254 SAM_USER_FIXED_DATA FixedUserData
;
2255 PSAM_DB_OBJECT DomainObject
;
2256 PSAM_DB_OBJECT UserObject
;
2257 GROUP_MEMBERSHIP GroupMembership
;
2258 UCHAR LogonHours
[23];
2262 PSECURITY_DESCRIPTOR Sd
= NULL
;
2264 PSID UserSid
= NULL
;
2267 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2268 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2271 Name
->Length
== 0 ||
2272 Name
->Buffer
== NULL
||
2273 UserHandle
== NULL
||
2275 return STATUS_INVALID_PARAMETER
;
2277 /* Map generic access rights */
2278 RtlMapGenericMask(&DesiredAccess
,
2281 RtlAcquireResourceExclusive(&SampResource
,
2284 /* Validate the domain handle */
2285 Status
= SampValidateDbObject(DomainHandle
,
2289 if (!NT_SUCCESS(Status
))
2291 TRACE("failed with status 0x%08lx\n", Status
);
2295 /* Check the user account name */
2296 Status
= SampCheckAccountName(Name
, 20);
2297 if (!NT_SUCCESS(Status
))
2299 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
2303 /* Check if the user name already exists in the domain */
2304 Status
= SampCheckAccountNameInDomain(DomainObject
,
2306 if (!NT_SUCCESS(Status
))
2308 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2309 Name
->Buffer
, Status
);
2313 /* Get the fixed domain attributes */
2314 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2315 Status
= SampGetObjectAttribute(DomainObject
,
2318 (PVOID
)&FixedDomainData
,
2320 if (!NT_SUCCESS(Status
))
2322 TRACE("failed with status 0x%08lx\n", Status
);
2326 /* Increment the NextRid attribute */
2327 ulRid
= FixedDomainData
.NextRid
;
2328 FixedDomainData
.NextRid
++;
2330 TRACE("RID: %lx\n", ulRid
);
2332 /* Create the user SID */
2333 Status
= SampCreateAccountSid(DomainObject
,
2336 if (!NT_SUCCESS(Status
))
2338 TRACE("SampCreateAccountSid failed (Status 0x%08lx)\n", Status
);
2342 /* Create the security descriptor */
2343 Status
= SampCreateUserSD(UserSid
,
2346 if (!NT_SUCCESS(Status
))
2348 TRACE("SampCreateUserSD failed (Status 0x%08lx)\n", Status
);
2352 /* Store the fixed domain attributes */
2353 Status
= SampSetObjectAttribute(DomainObject
,
2358 if (!NT_SUCCESS(Status
))
2360 TRACE("failed with status 0x%08lx\n", Status
);
2364 /* Convert the RID into a string (hex) */
2365 swprintf(szRid
, L
"%08lX", ulRid
);
2367 /* Create the user object */
2368 Status
= SampCreateDbObject(DomainObject
,
2375 if (!NT_SUCCESS(Status
))
2377 TRACE("failed with status 0x%08lx\n", Status
);
2381 /* Add the account name for the user object */
2382 Status
= SampSetAccountNameInDomain(DomainObject
,
2386 if (!NT_SUCCESS(Status
))
2388 TRACE("failed with status 0x%08lx\n", Status
);
2392 /* Initialize fixed user data */
2393 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2394 FixedUserData
.Version
= 1;
2395 FixedUserData
.Reserved
= 0;
2396 FixedUserData
.LastLogon
.QuadPart
= 0;
2397 FixedUserData
.LastLogoff
.QuadPart
= 0;
2398 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2399 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2400 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2401 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2402 FixedUserData
.UserId
= ulRid
;
2403 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2404 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2405 USER_PASSWORD_NOT_REQUIRED
|
2406 USER_NORMAL_ACCOUNT
;
2407 FixedUserData
.CountryCode
= 0;
2408 FixedUserData
.CodePage
= 0;
2409 FixedUserData
.BadPasswordCount
= 0;
2410 FixedUserData
.LogonCount
= 0;
2411 FixedUserData
.AdminCount
= 0;
2412 FixedUserData
.OperatorCount
= 0;
2414 /* Set fixed user data attribute */
2415 Status
= SampSetObjectAttribute(UserObject
,
2418 (LPVOID
)&FixedUserData
,
2419 sizeof(SAM_USER_FIXED_DATA
));
2420 if (!NT_SUCCESS(Status
))
2422 TRACE("failed with status 0x%08lx\n", Status
);
2426 /* Set the Name attribute */
2427 Status
= SampSetObjectAttributeString(UserObject
,
2430 if (!NT_SUCCESS(Status
))
2432 TRACE("failed with status 0x%08lx\n", Status
);
2436 /* Set the FullName attribute */
2437 Status
= SampSetObjectAttributeString(UserObject
,
2440 if (!NT_SUCCESS(Status
))
2442 TRACE("failed with status 0x%08lx\n", Status
);
2446 /* Set the HomeDirectory attribute */
2447 Status
= SampSetObjectAttributeString(UserObject
,
2450 if (!NT_SUCCESS(Status
))
2452 TRACE("failed with status 0x%08lx\n", Status
);
2456 /* Set the HomeDirectoryDrive attribute */
2457 Status
= SampSetObjectAttributeString(UserObject
,
2458 L
"HomeDirectoryDrive",
2460 if (!NT_SUCCESS(Status
))
2462 TRACE("failed with status 0x%08lx\n", Status
);
2466 /* Set the ScriptPath attribute */
2467 Status
= SampSetObjectAttributeString(UserObject
,
2470 if (!NT_SUCCESS(Status
))
2472 TRACE("failed with status 0x%08lx\n", Status
);
2476 /* Set the ProfilePath attribute */
2477 Status
= SampSetObjectAttributeString(UserObject
,
2480 if (!NT_SUCCESS(Status
))
2482 TRACE("failed with status 0x%08lx\n", Status
);
2486 /* Set the AdminComment attribute */
2487 Status
= SampSetObjectAttributeString(UserObject
,
2490 if (!NT_SUCCESS(Status
))
2492 TRACE("failed with status 0x%08lx\n", Status
);
2496 /* Set the UserComment attribute */
2497 Status
= SampSetObjectAttributeString(UserObject
,
2500 if (!NT_SUCCESS(Status
))
2502 TRACE("failed with status 0x%08lx\n", Status
);
2506 /* Set the WorkStations attribute */
2507 Status
= SampSetObjectAttributeString(UserObject
,
2510 if (!NT_SUCCESS(Status
))
2512 TRACE("failed with status 0x%08lx\n", Status
);
2516 /* Set the Parameters attribute */
2517 Status
= SampSetObjectAttributeString(UserObject
,
2520 if (!NT_SUCCESS(Status
))
2522 TRACE("failed with status 0x%08lx\n", Status
);
2526 /* Set LogonHours attribute*/
2527 *((PUSHORT
)LogonHours
) = 168;
2528 memset(&(LogonHours
[2]), 0xff, 21);
2530 Status
= SampSetObjectAttribute(UserObject
,
2534 sizeof(LogonHours
));
2535 if (!NT_SUCCESS(Status
))
2537 TRACE("failed with status 0x%08lx\n", Status
);
2541 /* Set Groups attribute*/
2542 GroupMembership
.RelativeId
= DOMAIN_GROUP_RID_USERS
;
2543 GroupMembership
.Attributes
= SE_GROUP_MANDATORY
|
2545 SE_GROUP_ENABLED_BY_DEFAULT
;
2547 Status
= SampSetObjectAttribute(UserObject
,
2551 sizeof(GROUP_MEMBERSHIP
));
2552 if (!NT_SUCCESS(Status
))
2554 TRACE("failed with status 0x%08lx\n", Status
);
2558 /* Set LMPwd attribute*/
2559 Status
= SampSetObjectAttribute(UserObject
,
2563 sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
2564 if (!NT_SUCCESS(Status
))
2566 TRACE("failed with status 0x%08lx\n", Status
);
2570 /* Set NTPwd attribute*/
2571 Status
= SampSetObjectAttribute(UserObject
,
2575 sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
2576 if (!NT_SUCCESS(Status
))
2578 TRACE("failed with status 0x%08lx\n", Status
);
2582 /* Set LMPwdHistory attribute*/
2583 Status
= SampSetObjectAttribute(UserObject
,
2588 if (!NT_SUCCESS(Status
))
2590 TRACE("failed with status 0x%08lx\n", Status
);
2594 /* Set NTPwdHistory attribute*/
2595 Status
= SampSetObjectAttribute(UserObject
,
2600 if (!NT_SUCCESS(Status
))
2602 TRACE("failed with status 0x%08lx\n", Status
);
2606 /* Set the PrivateData attribute */
2607 Status
= SampSetObjectAttributeString(UserObject
,
2610 if (!NT_SUCCESS(Status
))
2612 TRACE("failed with status 0x%08lx\n", Status
);
2616 /* Set the SecDesc attribute*/
2617 Status
= SampSetObjectAttribute(UserObject
,
2622 if (!NT_SUCCESS(Status
))
2624 TRACE("failed with status 0x%08lx\n", Status
);
2628 if (NT_SUCCESS(Status
))
2630 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2631 *RelativeId
= ulRid
;
2636 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
2638 if (UserSid
!= NULL
)
2639 RtlFreeHeap(RtlGetProcessHeap(), 0, UserSid
);
2641 RtlReleaseResource(&SampResource
);
2643 TRACE("returns with status 0x%08lx\n", Status
);
2652 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2653 IN OUT
unsigned long *EnumerationContext
,
2654 IN
unsigned long UserAccountControl
,
2655 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2656 IN
unsigned long PreferedMaximumLength
,
2657 OUT
unsigned long *CountReturned
)
2659 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2660 PSAM_DB_OBJECT DomainObject
;
2661 HANDLE UsersKeyHandle
= NULL
;
2662 HANDLE NamesKeyHandle
= NULL
;
2665 ULONG EnumCount
= 0;
2666 ULONG RequiredLength
= 0;
2671 BOOLEAN MoreEntries
= FALSE
;
2674 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2675 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2676 PreferedMaximumLength
, CountReturned
);
2678 RtlAcquireResourceShared(&SampResource
,
2681 /* Validate the domain handle */
2682 Status
= SampValidateDbObject(DomainHandle
,
2684 DOMAIN_LIST_ACCOUNTS
,
2686 if (!NT_SUCCESS(Status
))
2689 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2693 if (!NT_SUCCESS(Status
))
2696 Status
= SampRegOpenKey(UsersKeyHandle
,
2700 if (!NT_SUCCESS(Status
))
2705 EnumIndex
= *EnumerationContext
;
2709 NameLength
= 64 * sizeof(WCHAR
);
2710 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2717 if (!NT_SUCCESS(Status
))
2719 if (Status
== STATUS_NO_MORE_ENTRIES
)
2720 Status
= STATUS_SUCCESS
;
2724 TRACE("EnumIndex: %lu\n", EnumIndex
);
2725 TRACE("User name: %S\n", UserName
);
2726 TRACE("Name length: %lu\n", NameLength
);
2728 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2734 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2740 TRACE("EnumCount: %lu\n", EnumCount
);
2741 TRACE("RequiredLength: %lu\n", RequiredLength
);
2743 if (!NT_SUCCESS(Status
))
2746 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2747 if (EnumBuffer
== NULL
)
2749 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2753 EnumBuffer
->EntriesRead
= EnumCount
;
2757 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2758 if (EnumBuffer
->Buffer
== NULL
)
2760 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2766 EnumIndex
= *EnumerationContext
;
2767 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2769 NameLength
= 64 * sizeof(WCHAR
);
2770 DataLength
= sizeof(ULONG
);
2771 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2778 if (!NT_SUCCESS(Status
))
2780 if (Status
== STATUS_NO_MORE_ENTRIES
)
2781 Status
= STATUS_SUCCESS
;
2785 TRACE("EnumIndex: %lu\n", EnumIndex
);
2786 TRACE("User name: %S\n", UserName
);
2787 TRACE("Name length: %lu\n", NameLength
);
2788 TRACE("RID: %lu\n", Rid
);
2790 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2792 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2793 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(NameLength
+ sizeof(UNICODE_NULL
));
2795 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2797 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2798 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2800 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2804 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2806 EnumBuffer
->Buffer
[i
].Name
.Length
);
2811 if (NT_SUCCESS(Status
))
2813 *EnumerationContext
+= EnumCount
;
2814 *Buffer
= EnumBuffer
;
2815 *CountReturned
= EnumCount
;
2819 *EnumerationContext
= 0;
2823 if (EnumBuffer
!= NULL
)
2825 if (EnumBuffer
->Buffer
!= NULL
)
2827 if (EnumBuffer
->EntriesRead
!= 0)
2829 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2831 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2832 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2836 midl_user_free(EnumBuffer
->Buffer
);
2839 midl_user_free(EnumBuffer
);
2843 SampRegCloseKey(&NamesKeyHandle
);
2844 SampRegCloseKey(&UsersKeyHandle
);
2846 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2847 Status
= STATUS_MORE_ENTRIES
;
2849 RtlReleaseResource(&SampResource
);
2858 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2859 IN PRPC_UNICODE_STRING AccountName
,
2860 IN ACCESS_MASK DesiredAccess
,
2861 OUT SAMPR_HANDLE
*AliasHandle
,
2862 OUT
unsigned long *RelativeId
)
2864 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2865 PSAM_DB_OBJECT DomainObject
;
2866 PSAM_DB_OBJECT AliasObject
;
2867 PSECURITY_DESCRIPTOR Sd
= NULL
;
2874 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2875 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2877 /* Map generic access rights */
2878 RtlMapGenericMask(&DesiredAccess
,
2881 RtlAcquireResourceExclusive(&SampResource
,
2884 /* Validate the domain handle */
2885 Status
= SampValidateDbObject(DomainHandle
,
2887 DOMAIN_CREATE_ALIAS
,
2889 if (!NT_SUCCESS(Status
))
2891 TRACE("failed with status 0x%08lx\n", Status
);
2895 /* Check the alias acoount name */
2896 Status
= SampCheckAccountName(AccountName
, 256);
2897 if (!NT_SUCCESS(Status
))
2899 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
2903 /* Check if the alias name already exists in the domain */
2904 Status
= SampCheckAccountNameInDomain(DomainObject
,
2905 AccountName
->Buffer
);
2906 if (!NT_SUCCESS(Status
))
2908 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2909 AccountName
->Buffer
, Status
);
2913 /* Create the security descriptor */
2914 Status
= SampCreateAliasSD(&Sd
,
2916 if (!NT_SUCCESS(Status
))
2918 TRACE("SampCreateAliasSD failed (Status 0x%08lx)\n", Status
);
2922 /* Get the fixed domain attributes */
2923 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2924 Status
= SampGetObjectAttribute(DomainObject
,
2927 (PVOID
)&FixedDomainData
,
2929 if (!NT_SUCCESS(Status
))
2931 TRACE("failed with status 0x%08lx\n", Status
);
2935 /* Increment the NextRid attribute */
2936 ulRid
= FixedDomainData
.NextRid
;
2937 FixedDomainData
.NextRid
++;
2939 /* Store the fixed domain attributes */
2940 Status
= SampSetObjectAttribute(DomainObject
,
2945 if (!NT_SUCCESS(Status
))
2947 TRACE("failed with status 0x%08lx\n", Status
);
2951 TRACE("RID: %lx\n", ulRid
);
2953 /* Convert the RID into a string (hex) */
2954 swprintf(szRid
, L
"%08lX", ulRid
);
2956 /* Create the alias object */
2957 Status
= SampCreateDbObject(DomainObject
,
2964 if (!NT_SUCCESS(Status
))
2966 TRACE("failed with status 0x%08lx\n", Status
);
2970 /* Add the account name for the alias object */
2971 Status
= SampSetAccountNameInDomain(DomainObject
,
2973 AccountName
->Buffer
,
2975 if (!NT_SUCCESS(Status
))
2977 TRACE("failed with status 0x%08lx\n", Status
);
2981 /* Set the Name attribute */
2982 Status
= SampSetObjectAttributeString(AliasObject
,
2985 if (!NT_SUCCESS(Status
))
2987 TRACE("failed with status 0x%08lx\n", Status
);
2991 /* Set the Description attribute */
2992 Status
= SampSetObjectAttributeString(AliasObject
,
2995 if (!NT_SUCCESS(Status
))
2997 TRACE("failed with status 0x%08lx\n", Status
);
3001 /* Set the SecDesc attribute*/
3002 Status
= SampSetObjectAttribute(AliasObject
,
3007 if (!NT_SUCCESS(Status
))
3009 TRACE("failed with status 0x%08lx\n", Status
);
3013 if (NT_SUCCESS(Status
))
3015 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
3016 *RelativeId
= ulRid
;
3021 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
3023 RtlReleaseResource(&SampResource
);
3025 TRACE("returns with status 0x%08lx\n", Status
);
3034 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
3035 IN OUT
unsigned long *EnumerationContext
,
3036 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
3037 IN
unsigned long PreferedMaximumLength
,
3038 OUT
unsigned long *CountReturned
)
3040 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
3041 PSAM_DB_OBJECT DomainObject
;
3042 HANDLE AliasesKeyHandle
= NULL
;
3043 HANDLE NamesKeyHandle
= NULL
;
3044 WCHAR AliasName
[64];
3046 ULONG EnumCount
= 0;
3047 ULONG RequiredLength
= 0;
3052 BOOLEAN MoreEntries
= FALSE
;
3055 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
3056 DomainHandle
, EnumerationContext
, Buffer
,
3057 PreferedMaximumLength
, CountReturned
);
3059 RtlAcquireResourceShared(&SampResource
,
3062 /* Validate the domain handle */
3063 Status
= SampValidateDbObject(DomainHandle
,
3065 DOMAIN_LIST_ACCOUNTS
,
3067 if (!NT_SUCCESS(Status
))
3070 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3074 if (!NT_SUCCESS(Status
))
3077 Status
= SampRegOpenKey(AliasesKeyHandle
,
3081 if (!NT_SUCCESS(Status
))
3086 EnumIndex
= *EnumerationContext
;
3090 NameLength
= 64 * sizeof(WCHAR
);
3091 Status
= SampRegEnumerateValue(NamesKeyHandle
,
3098 if (!NT_SUCCESS(Status
))
3100 if (Status
== STATUS_NO_MORE_ENTRIES
)
3101 Status
= STATUS_SUCCESS
;
3105 TRACE("EnumIndex: %lu\n", EnumIndex
);
3106 TRACE("Alias name: %S\n", AliasName
);
3107 TRACE("Name length: %lu\n", NameLength
);
3109 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
3115 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
3121 TRACE("EnumCount: %lu\n", EnumCount
);
3122 TRACE("RequiredLength: %lu\n", RequiredLength
);
3124 if (!NT_SUCCESS(Status
))
3127 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
3128 if (EnumBuffer
== NULL
)
3130 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3134 EnumBuffer
->EntriesRead
= EnumCount
;
3138 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
3139 if (EnumBuffer
->Buffer
== NULL
)
3141 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3147 EnumIndex
= *EnumerationContext
;
3148 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
3150 NameLength
= 64 * sizeof(WCHAR
);
3151 DataLength
= sizeof(ULONG
);
3152 Status
= SampRegEnumerateValue(NamesKeyHandle
,
3159 if (!NT_SUCCESS(Status
))
3161 if (Status
== STATUS_NO_MORE_ENTRIES
)
3162 Status
= STATUS_SUCCESS
;
3166 TRACE("EnumIndex: %lu\n", EnumIndex
);
3167 TRACE("Alias name: %S\n", AliasName
);
3168 TRACE("Name length: %lu\n", NameLength
);
3169 TRACE("RID: %lu\n", Rid
);
3171 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
3173 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
3174 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(NameLength
+ sizeof(UNICODE_NULL
));
3176 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
3178 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
3179 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
3181 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3185 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
3187 EnumBuffer
->Buffer
[i
].Name
.Length
);
3192 if (NT_SUCCESS(Status
))
3194 *EnumerationContext
+= EnumCount
;
3195 *Buffer
= EnumBuffer
;
3196 *CountReturned
= EnumCount
;
3200 *EnumerationContext
= 0;
3204 if (EnumBuffer
!= NULL
)
3206 if (EnumBuffer
->Buffer
!= NULL
)
3208 if (EnumBuffer
->EntriesRead
!= 0)
3210 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
3212 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
3213 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
3217 midl_user_free(EnumBuffer
->Buffer
);
3220 midl_user_free(EnumBuffer
);
3224 SampRegCloseKey(&NamesKeyHandle
);
3225 SampRegCloseKey(&AliasesKeyHandle
);
3227 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
3228 Status
= STATUS_MORE_ENTRIES
;
3230 RtlReleaseResource(&SampResource
);
3239 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
3240 IN PSAMPR_PSID_ARRAY SidArray
,
3241 OUT PSAMPR_ULONG_ARRAY Membership
)
3243 PSAM_DB_OBJECT DomainObject
;
3244 HANDLE AliasesKeyHandle
= NULL
;
3245 HANDLE MembersKeyHandle
= NULL
;
3246 HANDLE MemberKeyHandle
= NULL
;
3247 LPWSTR MemberSidString
= NULL
;
3248 PULONG RidArray
= NULL
;
3249 ULONG MaxSidCount
= 0;
3255 WCHAR NameBuffer
[9];
3257 TRACE("SamrGetAliasMembership(%p %p %p)\n",
3258 DomainHandle
, SidArray
, Membership
);
3260 RtlAcquireResourceShared(&SampResource
,
3263 /* Validate the domain handle */
3264 Status
= SampValidateDbObject(DomainHandle
,
3266 DOMAIN_GET_ALIAS_MEMBERSHIP
,
3268 if (!NT_SUCCESS(Status
))
3271 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3275 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3276 if (!NT_SUCCESS(Status
))
3279 Status
= SampRegOpenKey(AliasesKeyHandle
,
3283 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3285 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3287 Status
= STATUS_SUCCESS
;
3291 if (!NT_SUCCESS(Status
))
3294 for (i
= 0; i
< SidArray
->Count
; i
++)
3296 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3297 TRACE("Open %S\n", MemberSidString
);
3299 Status
= SampRegOpenKey(MembersKeyHandle
,
3303 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3304 if (NT_SUCCESS(Status
))
3306 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3309 if (NT_SUCCESS(Status
))
3311 TRACE("Found %lu values\n", ValueCount
);
3312 MaxSidCount
+= ValueCount
;
3315 SampRegCloseKey(&MemberKeyHandle
);
3318 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3319 Status
= STATUS_SUCCESS
;
3321 LocalFree(MemberSidString
);
3324 if (MaxSidCount
== 0)
3326 Status
= STATUS_SUCCESS
;
3330 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
3331 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
3332 if (RidArray
== NULL
)
3334 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3339 for (i
= 0; i
< SidArray
->Count
; i
++)
3341 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3342 TRACE("Open %S\n", MemberSidString
);
3344 Status
= SampRegOpenKey(MembersKeyHandle
,
3348 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3349 if (NT_SUCCESS(Status
))
3351 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3354 if (NT_SUCCESS(Status
))
3356 TRACE("Found %lu values\n", ValueCount
);
3358 for (j
= 0; j
< ValueCount
; j
++)
3360 DataLength
= 9 * sizeof(WCHAR
);
3361 Status
= SampRegEnumerateValue(MemberKeyHandle
,
3368 if (NT_SUCCESS(Status
))
3370 /* FIXME: Do not return each RID more than once. */
3371 RidArray
[RidIndex
] = wcstoul(NameBuffer
, NULL
, 16);
3377 SampRegCloseKey(&MemberKeyHandle
);
3380 LocalFree(MemberSidString
);
3384 SampRegCloseKey(&MembersKeyHandle
);
3385 SampRegCloseKey(&AliasesKeyHandle
);
3387 if (NT_SUCCESS(Status
))
3389 Membership
->Count
= MaxSidCount
;
3390 Membership
->Element
= RidArray
;
3394 if (RidArray
!= NULL
)
3395 midl_user_free(RidArray
);
3398 RtlReleaseResource(&SampResource
);
3407 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
3409 IN RPC_UNICODE_STRING Names
[],
3410 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
3411 OUT PSAMPR_ULONG_ARRAY Use
)
3413 PSAM_DB_OBJECT DomainObject
;
3414 HANDLE AccountsKeyHandle
= NULL
;
3415 HANDLE NamesKeyHandle
= NULL
;
3416 ULONG MappedCount
= 0;
3422 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
3423 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
3425 RtlAcquireResourceShared(&SampResource
,
3428 /* Validate the domain handle */
3429 Status
= SampValidateDbObject(DomainHandle
,
3433 if (!NT_SUCCESS(Status
))
3435 TRACE("failed with status 0x%08lx\n", Status
);
3439 RelativeIds
->Count
= 0;
3444 Status
= STATUS_SUCCESS
;
3448 /* Allocate the relative IDs array */
3449 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3450 if (RelativeIds
->Element
== NULL
)
3452 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3456 /* Allocate the use array */
3457 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3458 if (Use
->Element
== NULL
)
3460 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3464 RelativeIds
->Count
= Count
;
3467 for (i
= 0; i
< Count
; i
++)
3469 TRACE("Name: %S\n", Names
[i
].Buffer
);
3473 /* Lookup aliases */
3474 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3477 &AccountsKeyHandle
);
3478 if (NT_SUCCESS(Status
))
3480 Status
= SampRegOpenKey(AccountsKeyHandle
,
3484 if (NT_SUCCESS(Status
))
3486 DataLength
= sizeof(ULONG
);
3487 Status
= SampRegQueryValue(NamesKeyHandle
,
3493 SampRegCloseKey(&NamesKeyHandle
);
3496 SampRegCloseKey(&AccountsKeyHandle
);
3499 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3502 /* Return alias account */
3503 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3505 TRACE("Rid: %lu\n", RelativeId
);
3506 RelativeIds
->Element
[i
] = RelativeId
;
3507 Use
->Element
[i
] = SidTypeAlias
;
3513 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3516 &AccountsKeyHandle
);
3517 if (NT_SUCCESS(Status
))
3519 Status
= SampRegOpenKey(AccountsKeyHandle
,
3523 if (NT_SUCCESS(Status
))
3525 DataLength
= sizeof(ULONG
);
3526 Status
= SampRegQueryValue(NamesKeyHandle
,
3532 SampRegCloseKey(&NamesKeyHandle
);
3535 SampRegCloseKey(&AccountsKeyHandle
);
3538 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3541 /* Return group account */
3542 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3544 TRACE("Rid: %lu\n", RelativeId
);
3545 RelativeIds
->Element
[i
] = RelativeId
;
3546 Use
->Element
[i
] = SidTypeGroup
;
3552 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3555 &AccountsKeyHandle
);
3556 if (NT_SUCCESS(Status
))
3558 Status
= SampRegOpenKey(AccountsKeyHandle
,
3562 if (NT_SUCCESS(Status
))
3564 DataLength
= sizeof(ULONG
);
3565 Status
= SampRegQueryValue(NamesKeyHandle
,
3571 SampRegCloseKey(&NamesKeyHandle
);
3574 SampRegCloseKey(&AccountsKeyHandle
);
3577 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3580 /* Return user account */
3581 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3583 TRACE("Rid: %lu\n", RelativeId
);
3584 RelativeIds
->Element
[i
] = RelativeId
;
3585 Use
->Element
[i
] = SidTypeUser
;
3590 /* Return unknown account */
3591 RelativeIds
->Element
[i
] = 0;
3592 Use
->Element
[i
] = SidTypeUnknown
;
3596 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3597 Status
= STATUS_SUCCESS
;
3599 if (NT_SUCCESS(Status
))
3601 if (MappedCount
== 0)
3602 Status
= STATUS_NONE_MAPPED
;
3603 else if (MappedCount
< Count
)
3604 Status
= STATUS_SOME_NOT_MAPPED
;
3608 if (RelativeIds
->Element
!= NULL
)
3610 midl_user_free(RelativeIds
->Element
);
3611 RelativeIds
->Element
= NULL
;
3614 RelativeIds
->Count
= 0;
3616 if (Use
->Element
!= NULL
)
3618 midl_user_free(Use
->Element
);
3619 Use
->Element
= NULL
;
3625 RtlReleaseResource(&SampResource
);
3627 TRACE("Returned Status %lx\n", Status
);
3636 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3638 IN ULONG
*RelativeIds
,
3639 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3640 OUT PSAMPR_ULONG_ARRAY Use
)
3642 PSAM_DB_OBJECT DomainObject
;
3644 HANDLE AccountsKeyHandle
= NULL
;
3645 HANDLE AccountKeyHandle
= NULL
;
3646 ULONG MappedCount
= 0;
3651 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3652 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3654 RtlAcquireResourceShared(&SampResource
,
3657 /* Validate the domain handle */
3658 Status
= SampValidateDbObject(DomainHandle
,
3662 if (!NT_SUCCESS(Status
))
3664 TRACE("failed with status 0x%08lx\n", Status
);
3673 Status
= STATUS_SUCCESS
;
3677 /* Allocate the names array */
3678 Names
->Element
= midl_user_allocate(Count
* sizeof(*Names
->Element
));
3679 if (Names
->Element
== NULL
)
3681 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3685 /* Allocate the use array */
3686 Use
->Element
= midl_user_allocate(Count
* sizeof(*Use
->Element
));
3687 if (Use
->Element
== NULL
)
3689 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3693 Names
->Count
= Count
;
3696 for (i
= 0; i
< Count
; i
++)
3698 TRACE("RID: %lu\n", RelativeIds
[i
]);
3700 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3702 /* Lookup aliases */
3703 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3706 &AccountsKeyHandle
);
3707 if (NT_SUCCESS(Status
))
3709 Status
= SampRegOpenKey(AccountsKeyHandle
,
3713 if (NT_SUCCESS(Status
))
3716 Status
= SampRegQueryValue(AccountKeyHandle
,
3721 if (NT_SUCCESS(Status
))
3723 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3724 if (Names
->Element
[i
].Buffer
== NULL
)
3725 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3727 if (NT_SUCCESS(Status
))
3729 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3730 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3732 Status
= SampRegQueryValue(AccountKeyHandle
,
3735 Names
->Element
[i
].Buffer
,
3740 SampRegCloseKey(&AccountKeyHandle
);
3743 SampRegCloseKey(&AccountsKeyHandle
);
3746 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3749 /* Return alias account */
3750 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3752 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3753 Use
->Element
[i
] = SidTypeAlias
;
3759 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3762 &AccountsKeyHandle
);
3763 if (NT_SUCCESS(Status
))
3765 Status
= SampRegOpenKey(AccountsKeyHandle
,
3769 if (NT_SUCCESS(Status
))
3772 Status
= SampRegQueryValue(AccountKeyHandle
,
3777 if (NT_SUCCESS(Status
))
3779 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3780 if (Names
->Element
[i
].Buffer
== NULL
)
3781 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3783 if (NT_SUCCESS(Status
))
3785 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3786 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3788 Status
= SampRegQueryValue(AccountKeyHandle
,
3791 Names
->Element
[i
].Buffer
,
3796 SampRegCloseKey(&AccountKeyHandle
);
3799 SampRegCloseKey(&AccountsKeyHandle
);
3802 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3805 /* Return group account */
3806 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3808 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3809 Use
->Element
[i
] = SidTypeGroup
;
3815 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3818 &AccountsKeyHandle
);
3819 if (NT_SUCCESS(Status
))
3821 Status
= SampRegOpenKey(AccountsKeyHandle
,
3825 if (NT_SUCCESS(Status
))
3828 Status
= SampRegQueryValue(AccountKeyHandle
,
3833 if (NT_SUCCESS(Status
))
3835 TRACE("DataLength: %lu\n", DataLength
);
3837 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3838 if (Names
->Element
[i
].Buffer
== NULL
)
3839 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3841 if (NT_SUCCESS(Status
))
3843 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3844 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3846 Status
= SampRegQueryValue(AccountKeyHandle
,
3849 Names
->Element
[i
].Buffer
,
3854 SampRegCloseKey(&AccountKeyHandle
);
3857 SampRegCloseKey(&AccountsKeyHandle
);
3860 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3863 /* Return user account */
3864 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3866 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3867 Use
->Element
[i
] = SidTypeUser
;
3872 /* Return unknown account */
3873 Use
->Element
[i
] = SidTypeUnknown
;
3877 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3878 Status
= STATUS_SUCCESS
;
3880 if (NT_SUCCESS(Status
))
3882 if (MappedCount
== 0)
3883 Status
= STATUS_NONE_MAPPED
;
3884 else if (MappedCount
< Count
)
3885 Status
= STATUS_SOME_NOT_MAPPED
;
3889 if (Names
->Element
!= NULL
)
3891 for (i
= 0; i
< Count
; i
++)
3893 if (Names
->Element
[i
].Buffer
!= NULL
)
3894 midl_user_free(Names
->Element
[i
].Buffer
);
3897 midl_user_free(Names
->Element
);
3898 Names
->Element
= NULL
;
3903 if (Use
->Element
!= NULL
)
3905 midl_user_free(Use
->Element
);
3906 Use
->Element
= NULL
;
3912 RtlReleaseResource(&SampResource
);
3921 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3922 IN ACCESS_MASK DesiredAccess
,
3923 IN
unsigned long GroupId
,
3924 OUT SAMPR_HANDLE
*GroupHandle
)
3926 PSAM_DB_OBJECT DomainObject
;
3927 PSAM_DB_OBJECT GroupObject
;
3931 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3932 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3934 /* Map generic access rights */
3935 RtlMapGenericMask(&DesiredAccess
,
3938 RtlAcquireResourceShared(&SampResource
,
3941 /* Validate the domain handle */
3942 Status
= SampValidateDbObject(DomainHandle
,
3946 if (!NT_SUCCESS(Status
))
3948 TRACE("failed with status 0x%08lx\n", Status
);
3952 /* Convert the RID into a string (hex) */
3953 swprintf(szRid
, L
"%08lX", GroupId
);
3955 /* Create the group object */
3956 Status
= SampOpenDbObject(DomainObject
,
3963 if (!NT_SUCCESS(Status
))
3965 TRACE("failed with status 0x%08lx\n", Status
);
3969 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3972 RtlReleaseResource(&SampResource
);
3979 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3980 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3982 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3983 SAM_GROUP_FIXED_DATA FixedData
;
3984 ULONG MembersLength
= 0;
3990 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3991 if (InfoBuffer
== NULL
)
3992 return STATUS_INSUFFICIENT_RESOURCES
;
3994 Status
= SampGetObjectAttributeString(GroupObject
,
3996 &InfoBuffer
->General
.Name
);
3997 if (!NT_SUCCESS(Status
))
3999 TRACE("Status 0x%08lx\n", Status
);
4003 Status
= SampGetObjectAttributeString(GroupObject
,
4005 &InfoBuffer
->General
.AdminComment
);
4006 if (!NT_SUCCESS(Status
))
4008 TRACE("Status 0x%08lx\n", Status
);
4012 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
4013 Status
= SampGetObjectAttribute(GroupObject
,
4018 if (!NT_SUCCESS(Status
))
4021 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
4023 Status
= SampGetObjectAttribute(GroupObject
,
4028 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
4031 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4032 InfoBuffer
->General
.MemberCount
= 0;
4034 InfoBuffer
->General
.MemberCount
= MembersLength
/ sizeof(ULONG
);
4036 *Buffer
= InfoBuffer
;
4039 if (!NT_SUCCESS(Status
))
4041 if (InfoBuffer
!= NULL
)
4043 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4044 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4046 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4047 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4049 midl_user_free(InfoBuffer
);
4058 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
4059 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4061 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
4066 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
4067 if (InfoBuffer
== NULL
)
4068 return STATUS_INSUFFICIENT_RESOURCES
;
4070 Status
= SampGetObjectAttributeString(GroupObject
,
4072 &InfoBuffer
->Name
.Name
);
4073 if (!NT_SUCCESS(Status
))
4075 TRACE("Status 0x%08lx\n", Status
);
4079 *Buffer
= InfoBuffer
;
4082 if (!NT_SUCCESS(Status
))
4084 if (InfoBuffer
!= NULL
)
4086 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4087 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4089 midl_user_free(InfoBuffer
);
4098 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
4099 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4101 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
4102 SAM_GROUP_FIXED_DATA FixedData
;
4108 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
4109 if (InfoBuffer
== NULL
)
4110 return STATUS_INSUFFICIENT_RESOURCES
;
4112 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
4113 Status
= SampGetObjectAttribute(GroupObject
,
4118 if (!NT_SUCCESS(Status
))
4121 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
4123 *Buffer
= InfoBuffer
;
4126 if (!NT_SUCCESS(Status
))
4128 if (InfoBuffer
!= NULL
)
4130 midl_user_free(InfoBuffer
);
4139 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
4140 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4142 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
4147 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
4148 if (InfoBuffer
== NULL
)
4149 return STATUS_INSUFFICIENT_RESOURCES
;
4151 Status
= SampGetObjectAttributeString(GroupObject
,
4153 &InfoBuffer
->AdminComment
.AdminComment
);
4154 if (!NT_SUCCESS(Status
))
4156 TRACE("Status 0x%08lx\n", Status
);
4160 *Buffer
= InfoBuffer
;
4163 if (!NT_SUCCESS(Status
))
4165 if (InfoBuffer
!= NULL
)
4167 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4168 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4170 midl_user_free(InfoBuffer
);
4181 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
4182 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
4183 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4185 PSAM_DB_OBJECT GroupObject
;
4188 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
4189 GroupHandle
, GroupInformationClass
, Buffer
);
4191 RtlAcquireResourceShared(&SampResource
,
4194 /* Validate the group handle */
4195 Status
= SampValidateDbObject(GroupHandle
,
4197 GROUP_READ_INFORMATION
,
4199 if (!NT_SUCCESS(Status
))
4202 switch (GroupInformationClass
)
4204 case GroupGeneralInformation
:
4205 Status
= SampQueryGroupGeneral(GroupObject
,
4209 case GroupNameInformation
:
4210 Status
= SampQueryGroupName(GroupObject
,
4214 case GroupAttributeInformation
:
4215 Status
= SampQueryGroupAttribute(GroupObject
,
4219 case GroupAdminCommentInformation
:
4220 Status
= SampQueryGroupAdminComment(GroupObject
,
4225 Status
= STATUS_INVALID_INFO_CLASS
;
4230 RtlReleaseResource(&SampResource
);
4237 SampSetGroupName(PSAM_DB_OBJECT GroupObject
,
4238 PSAMPR_GROUP_INFO_BUFFER Buffer
)
4240 UNICODE_STRING OldGroupName
= {0, 0, NULL
};
4241 UNICODE_STRING NewGroupName
;
4244 Status
= SampGetObjectAttributeString(GroupObject
,
4246 (PRPC_UNICODE_STRING
)&OldGroupName
);
4247 if (!NT_SUCCESS(Status
))
4249 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
4253 /* Check the new account name */
4254 Status
= SampCheckAccountName(&Buffer
->Name
.Name
, 256);
4255 if (!NT_SUCCESS(Status
))
4257 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
4261 NewGroupName
.Length
= Buffer
->Name
.Name
.Length
;
4262 NewGroupName
.MaximumLength
= Buffer
->Name
.Name
.MaximumLength
;
4263 NewGroupName
.Buffer
= Buffer
->Name
.Name
.Buffer
;
4265 if (!RtlEqualUnicodeString(&OldGroupName
, &NewGroupName
, TRUE
))
4267 Status
= SampCheckAccountNameInDomain(GroupObject
->ParentObject
,
4268 NewGroupName
.Buffer
);
4269 if (!NT_SUCCESS(Status
))
4271 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
4272 NewGroupName
.Buffer
, Status
);
4277 Status
= SampSetAccountNameInDomain(GroupObject
->ParentObject
,
4279 NewGroupName
.Buffer
,
4280 GroupObject
->RelativeId
);
4281 if (!NT_SUCCESS(Status
))
4283 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
4287 Status
= SampRemoveAccountNameFromDomain(GroupObject
->ParentObject
,
4289 OldGroupName
.Buffer
);
4290 if (!NT_SUCCESS(Status
))
4292 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
4296 Status
= SampSetObjectAttributeString(GroupObject
,
4298 (PRPC_UNICODE_STRING
)&NewGroupName
);
4299 if (!NT_SUCCESS(Status
))
4301 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
4305 if (OldGroupName
.Buffer
!= NULL
)
4306 midl_user_free(OldGroupName
.Buffer
);
4313 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
4314 PSAMPR_GROUP_INFO_BUFFER Buffer
)
4316 SAM_GROUP_FIXED_DATA FixedData
;
4320 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
4321 Status
= SampGetObjectAttribute(GroupObject
,
4326 if (!NT_SUCCESS(Status
))
4329 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
4331 Status
= SampSetObjectAttribute(GroupObject
,
4345 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
4346 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
4347 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
4349 PSAM_DB_OBJECT GroupObject
;
4352 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
4353 GroupHandle
, GroupInformationClass
, Buffer
);
4355 RtlAcquireResourceExclusive(&SampResource
,
4358 /* Validate the group handle */
4359 Status
= SampValidateDbObject(GroupHandle
,
4361 GROUP_WRITE_ACCOUNT
,
4363 if (!NT_SUCCESS(Status
))
4366 switch (GroupInformationClass
)
4368 case GroupNameInformation
:
4369 Status
= SampSetGroupName(GroupObject
,
4373 case GroupAttributeInformation
:
4374 Status
= SampSetGroupAttribute(GroupObject
,
4378 case GroupAdminCommentInformation
:
4379 Status
= SampSetObjectAttributeString(GroupObject
,
4381 &Buffer
->AdminComment
.AdminComment
);
4385 Status
= STATUS_INVALID_INFO_CLASS
;
4390 RtlReleaseResource(&SampResource
);
4399 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
4400 IN
unsigned long MemberId
,
4401 IN
unsigned long Attributes
)
4403 PSAM_DB_OBJECT GroupObject
;
4404 PSAM_DB_OBJECT UserObject
= NULL
;
4407 TRACE("(%p %lu %lx)\n",
4408 GroupHandle
, MemberId
, Attributes
);
4410 RtlAcquireResourceExclusive(&SampResource
,
4413 /* Validate the group handle */
4414 Status
= SampValidateDbObject(GroupHandle
,
4418 if (!NT_SUCCESS(Status
))
4421 /* Open the user object in the same domain */
4422 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4426 if (!NT_SUCCESS(Status
))
4428 TRACE("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4432 /* Add group membership to the user object */
4433 Status
= SampAddGroupMembershipToUser(UserObject
,
4434 GroupObject
->RelativeId
,
4436 if (!NT_SUCCESS(Status
))
4438 TRACE("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4442 /* Add the member to the group object */
4443 Status
= SampAddMemberToGroup(GroupObject
,
4445 if (!NT_SUCCESS(Status
))
4447 TRACE("SampAddMemberToGroup() failed (Status 0x%08lx)\n", Status
);
4452 SampCloseDbObject(UserObject
);
4454 RtlReleaseResource(&SampResource
);
4463 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
4465 PSAM_DB_OBJECT GroupObject
;
4469 TRACE("(%p)\n", GroupHandle
);
4471 RtlAcquireResourceExclusive(&SampResource
,
4474 /* Validate the group handle */
4475 Status
= SampValidateDbObject(*GroupHandle
,
4479 if (!NT_SUCCESS(Status
))
4481 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
4485 /* Fail, if the group is built-in */
4486 if (GroupObject
->RelativeId
< 1000)
4488 TRACE("You can not delete a special account!\n");
4489 Status
= STATUS_SPECIAL_ACCOUNT
;
4493 /* Get the length of the Members attribute */
4494 SampGetObjectAttribute(GroupObject
,
4500 /* Fail, if the group has members */
4503 TRACE("There are still members in the group!\n");
4504 Status
= STATUS_MEMBER_IN_GROUP
;
4508 /* FIXME: Remove the group from all aliases */
4510 /* Delete the group from the database */
4511 Status
= SampDeleteAccountDbObject(GroupObject
);
4512 if (!NT_SUCCESS(Status
))
4514 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4518 /* Invalidate the handle */
4519 *GroupHandle
= NULL
;
4522 RtlReleaseResource(&SampResource
);
4531 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
4532 IN
unsigned long MemberId
)
4534 PSAM_DB_OBJECT GroupObject
;
4535 PSAM_DB_OBJECT UserObject
= NULL
;
4539 GroupHandle
, MemberId
);
4541 RtlAcquireResourceExclusive(&SampResource
,
4544 /* Validate the group handle */
4545 Status
= SampValidateDbObject(GroupHandle
,
4547 GROUP_REMOVE_MEMBER
,
4549 if (!NT_SUCCESS(Status
))
4552 /* Open the user object in the same domain */
4553 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4557 if (!NT_SUCCESS(Status
))
4559 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4563 /* Remove group membership from the user object */
4564 Status
= SampRemoveGroupMembershipFromUser(UserObject
,
4565 GroupObject
->RelativeId
);
4566 if (!NT_SUCCESS(Status
))
4568 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4572 /* Remove the member from the group object */
4573 Status
= SampRemoveMemberFromGroup(GroupObject
,
4575 if (!NT_SUCCESS(Status
))
4577 ERR("SampRemoveMemberFromGroup() failed (Status 0x%08lx)\n", Status
);
4582 SampCloseDbObject(UserObject
);
4584 RtlReleaseResource(&SampResource
);
4593 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
4594 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
4596 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
4597 PSAM_DB_OBJECT GroupObject
;
4602 RtlAcquireResourceShared(&SampResource
,
4605 /* Validate the group handle */
4606 Status
= SampValidateDbObject(GroupHandle
,
4610 if (!NT_SUCCESS(Status
))
4613 MembersBuffer
= midl_user_allocate(sizeof(SAMPR_GET_MEMBERS_BUFFER
));
4614 if (MembersBuffer
== NULL
)
4616 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4620 SampGetObjectAttribute(GroupObject
,
4628 MembersBuffer
->MemberCount
= 0;
4629 MembersBuffer
->Members
= NULL
;
4630 MembersBuffer
->Attributes
= NULL
;
4632 *Members
= MembersBuffer
;
4634 Status
= STATUS_SUCCESS
;
4638 MembersBuffer
->Members
= midl_user_allocate(Length
);
4639 if (MembersBuffer
->Members
== NULL
)
4641 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4645 MembersBuffer
->Attributes
= midl_user_allocate(Length
);
4646 if (MembersBuffer
->Attributes
== NULL
)
4648 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4652 Status
= SampGetObjectAttribute(GroupObject
,
4655 MembersBuffer
->Members
,
4657 if (!NT_SUCCESS(Status
))
4659 TRACE("SampGetObjectAttributes() failed (Status 0x%08lx)\n", Status
);
4663 MembersBuffer
->MemberCount
= Length
/ sizeof(ULONG
);
4665 for (i
= 0; i
< MembersBuffer
->MemberCount
; i
++)
4667 Status
= SampGetUserGroupAttributes(GroupObject
->ParentObject
,
4668 MembersBuffer
->Members
[i
],
4669 GroupObject
->RelativeId
,
4670 &(MembersBuffer
->Attributes
[i
]));
4671 if (!NT_SUCCESS(Status
))
4673 TRACE("SampGetUserGroupAttributes() failed (Status 0x%08lx)\n", Status
);
4678 *Members
= MembersBuffer
;
4681 if (!NT_SUCCESS(Status
))
4683 if (MembersBuffer
!= NULL
)
4685 if (MembersBuffer
->Members
!= NULL
)
4686 midl_user_free(MembersBuffer
->Members
);
4688 if (MembersBuffer
->Attributes
!= NULL
)
4689 midl_user_free(MembersBuffer
->Attributes
);
4691 midl_user_free(MembersBuffer
);
4695 RtlReleaseResource(&SampResource
);
4704 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
4705 IN
unsigned long MemberId
,
4706 IN
unsigned long Attributes
)
4708 PSAM_DB_OBJECT GroupObject
;
4711 RtlAcquireResourceExclusive(&SampResource
,
4714 /* Validate the group handle */
4715 Status
= SampValidateDbObject(GroupHandle
,
4719 if (!NT_SUCCESS(Status
))
4721 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
4725 Status
= SampSetUserGroupAttributes(GroupObject
->ParentObject
,
4727 GroupObject
->RelativeId
,
4729 if (!NT_SUCCESS(Status
))
4731 TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status
);
4735 RtlReleaseResource(&SampResource
);
4744 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
4745 IN ACCESS_MASK DesiredAccess
,
4747 OUT SAMPR_HANDLE
*AliasHandle
)
4749 PSAM_DB_OBJECT DomainObject
;
4750 PSAM_DB_OBJECT AliasObject
;
4754 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4755 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4757 /* Map generic access rights */
4758 RtlMapGenericMask(&DesiredAccess
,
4761 RtlAcquireResourceShared(&SampResource
,
4764 /* Validate the domain handle */
4765 Status
= SampValidateDbObject(DomainHandle
,
4769 if (!NT_SUCCESS(Status
))
4771 TRACE("failed with status 0x%08lx\n", Status
);
4775 /* Convert the RID into a string (hex) */
4776 swprintf(szRid
, L
"%08lX", AliasId
);
4778 /* Create the alias object */
4779 Status
= SampOpenDbObject(DomainObject
,
4786 if (!NT_SUCCESS(Status
))
4788 TRACE("failed with status 0x%08lx\n", Status
);
4792 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4795 RtlReleaseResource(&SampResource
);
4802 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4803 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4805 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4806 HANDLE MembersKeyHandle
= NULL
;
4811 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4812 if (InfoBuffer
== NULL
)
4813 return STATUS_INSUFFICIENT_RESOURCES
;
4815 Status
= SampGetObjectAttributeString(AliasObject
,
4817 &InfoBuffer
->General
.Name
);
4818 if (!NT_SUCCESS(Status
))
4820 TRACE("Status 0x%08lx\n", Status
);
4824 Status
= SampGetObjectAttributeString(AliasObject
,
4826 &InfoBuffer
->General
.AdminComment
);
4827 if (!NT_SUCCESS(Status
))
4829 TRACE("Status 0x%08lx\n", Status
);
4833 /* Open the Members subkey */
4834 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4838 if (NT_SUCCESS(Status
))
4840 /* Retrieve the number of members of the alias */
4841 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4843 &InfoBuffer
->General
.MemberCount
);
4844 if (!NT_SUCCESS(Status
))
4846 TRACE("Status 0x%08lx\n", Status
);
4850 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4852 InfoBuffer
->General
.MemberCount
= 0;
4853 Status
= STATUS_SUCCESS
;
4857 TRACE("Status 0x%08lx\n", Status
);
4861 *Buffer
= InfoBuffer
;
4864 SampRegCloseKey(&MembersKeyHandle
);
4866 if (!NT_SUCCESS(Status
))
4868 if (InfoBuffer
!= NULL
)
4870 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4871 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4873 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4874 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4876 midl_user_free(InfoBuffer
);
4885 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4886 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4888 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4893 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4894 if (InfoBuffer
== NULL
)
4895 return STATUS_INSUFFICIENT_RESOURCES
;
4897 Status
= SampGetObjectAttributeString(AliasObject
,
4899 &InfoBuffer
->Name
.Name
);
4900 if (!NT_SUCCESS(Status
))
4902 TRACE("Status 0x%08lx\n", Status
);
4906 *Buffer
= InfoBuffer
;
4909 if (!NT_SUCCESS(Status
))
4911 if (InfoBuffer
!= NULL
)
4913 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4914 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4916 midl_user_free(InfoBuffer
);
4925 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4926 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4928 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4933 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4934 if (InfoBuffer
== NULL
)
4935 return STATUS_INSUFFICIENT_RESOURCES
;
4937 Status
= SampGetObjectAttributeString(AliasObject
,
4939 &InfoBuffer
->AdminComment
.AdminComment
);
4940 if (!NT_SUCCESS(Status
))
4942 TRACE("Status 0x%08lx\n", Status
);
4946 *Buffer
= InfoBuffer
;
4949 if (!NT_SUCCESS(Status
))
4951 if (InfoBuffer
!= NULL
)
4953 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4954 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4956 midl_user_free(InfoBuffer
);
4967 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4968 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4969 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4971 PSAM_DB_OBJECT AliasObject
;
4974 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4975 AliasHandle
, AliasInformationClass
, Buffer
);
4977 RtlAcquireResourceShared(&SampResource
,
4980 /* Validate the alias handle */
4981 Status
= SampValidateDbObject(AliasHandle
,
4983 ALIAS_READ_INFORMATION
,
4985 if (!NT_SUCCESS(Status
))
4988 switch (AliasInformationClass
)
4990 case AliasGeneralInformation
:
4991 Status
= SampQueryAliasGeneral(AliasObject
,
4995 case AliasNameInformation
:
4996 Status
= SampQueryAliasName(AliasObject
,
5000 case AliasAdminCommentInformation
:
5001 Status
= SampQueryAliasAdminComment(AliasObject
,
5006 Status
= STATUS_INVALID_INFO_CLASS
;
5011 RtlReleaseResource(&SampResource
);
5018 SampSetAliasName(PSAM_DB_OBJECT AliasObject
,
5019 PSAMPR_ALIAS_INFO_BUFFER Buffer
)
5021 UNICODE_STRING OldAliasName
= {0, 0, NULL
};
5022 UNICODE_STRING NewAliasName
;
5025 Status
= SampGetObjectAttributeString(AliasObject
,
5027 (PRPC_UNICODE_STRING
)&OldAliasName
);
5028 if (!NT_SUCCESS(Status
))
5030 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
5034 /* Check the new account name */
5035 Status
= SampCheckAccountName(&Buffer
->Name
.Name
, 256);
5036 if (!NT_SUCCESS(Status
))
5038 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
5042 NewAliasName
.Length
= Buffer
->Name
.Name
.Length
;
5043 NewAliasName
.MaximumLength
= Buffer
->Name
.Name
.MaximumLength
;
5044 NewAliasName
.Buffer
= Buffer
->Name
.Name
.Buffer
;
5046 if (!RtlEqualUnicodeString(&OldAliasName
, &NewAliasName
, TRUE
))
5048 Status
= SampCheckAccountNameInDomain(AliasObject
->ParentObject
,
5049 NewAliasName
.Buffer
);
5050 if (!NT_SUCCESS(Status
))
5052 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
5053 NewAliasName
.Buffer
, Status
);
5058 Status
= SampSetAccountNameInDomain(AliasObject
->ParentObject
,
5060 NewAliasName
.Buffer
,
5061 AliasObject
->RelativeId
);
5062 if (!NT_SUCCESS(Status
))
5064 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
5068 Status
= SampRemoveAccountNameFromDomain(AliasObject
->ParentObject
,
5070 OldAliasName
.Buffer
);
5071 if (!NT_SUCCESS(Status
))
5073 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
5077 Status
= SampSetObjectAttributeString(AliasObject
,
5079 (PRPC_UNICODE_STRING
)&NewAliasName
);
5080 if (!NT_SUCCESS(Status
))
5082 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
5086 if (OldAliasName
.Buffer
!= NULL
)
5087 midl_user_free(OldAliasName
.Buffer
);
5096 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
5097 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
5098 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
5100 PSAM_DB_OBJECT AliasObject
;
5103 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
5104 AliasHandle
, AliasInformationClass
, Buffer
);
5106 RtlAcquireResourceExclusive(&SampResource
,
5109 /* Validate the alias handle */
5110 Status
= SampValidateDbObject(AliasHandle
,
5112 ALIAS_WRITE_ACCOUNT
,
5114 if (!NT_SUCCESS(Status
))
5117 switch (AliasInformationClass
)
5119 case AliasNameInformation
:
5120 Status
= SampSetAliasName(AliasObject
,
5124 case AliasAdminCommentInformation
:
5125 Status
= SampSetObjectAttributeString(AliasObject
,
5127 &Buffer
->AdminComment
.AdminComment
);
5131 Status
= STATUS_INVALID_INFO_CLASS
;
5136 RtlReleaseResource(&SampResource
);
5145 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
5147 PSAM_DB_OBJECT AliasObject
;
5150 RtlAcquireResourceExclusive(&SampResource
,
5153 /* Validate the alias handle */
5154 Status
= SampValidateDbObject(*AliasHandle
,
5158 if (!NT_SUCCESS(Status
))
5160 TRACE("SampValidateDbObject failed (Status 0x%08lx)\n", Status
);
5164 /* Fail, if the alias is built-in */
5165 if (AliasObject
->RelativeId
< 1000)
5167 TRACE("You can not delete a special account!\n");
5168 Status
= STATUS_SPECIAL_ACCOUNT
;
5172 /* Remove all members from the alias */
5173 Status
= SampRemoveAllMembersFromAlias(AliasObject
);
5174 if (!NT_SUCCESS(Status
))
5176 TRACE("SampRemoveAllMembersFromAlias() failed (Status 0x%08lx)\n", Status
);
5180 /* Delete the alias from the database */
5181 Status
= SampDeleteAccountDbObject(AliasObject
);
5182 if (!NT_SUCCESS(Status
))
5184 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5188 /* Invalidate the handle */
5189 *AliasHandle
= NULL
;
5192 RtlReleaseResource(&SampResource
);
5201 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
5202 IN PRPC_SID MemberId
)
5204 PSAM_DB_OBJECT AliasObject
;
5207 TRACE("(%p %p)\n", AliasHandle
, MemberId
);
5209 RtlAcquireResourceExclusive(&SampResource
,
5212 /* Validate the alias handle */
5213 Status
= SampValidateDbObject(AliasHandle
,
5217 if (!NT_SUCCESS(Status
))
5219 TRACE("failed with status 0x%08lx\n", Status
);
5223 Status
= SampAddMemberToAlias(AliasObject
,
5225 if (!NT_SUCCESS(Status
))
5227 TRACE("failed with status 0x%08lx\n", Status
);
5231 RtlReleaseResource(&SampResource
);
5240 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
5241 IN PRPC_SID MemberId
)
5243 PSAM_DB_OBJECT AliasObject
;
5246 TRACE("(%p %p)\n", AliasHandle
, MemberId
);
5248 RtlAcquireResourceExclusive(&SampResource
,
5251 /* Validate the alias handle */
5252 Status
= SampValidateDbObject(AliasHandle
,
5254 ALIAS_REMOVE_MEMBER
,
5256 if (!NT_SUCCESS(Status
))
5258 TRACE("failed with status 0x%08lx\n", Status
);
5262 Status
= SampRemoveMemberFromAlias(AliasObject
,
5264 if (!NT_SUCCESS(Status
))
5266 TRACE("failed with status 0x%08lx\n", Status
);
5270 RtlReleaseResource(&SampResource
);
5279 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
5280 OUT PSAMPR_PSID_ARRAY_OUT Members
)
5282 PSAM_DB_OBJECT AliasObject
;
5283 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
5284 ULONG MemberCount
= 0;
5288 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
5289 AliasHandle
, Members
);
5291 RtlAcquireResourceShared(&SampResource
,
5294 /* Validate the alias handle */
5295 Status
= SampValidateDbObject(AliasHandle
,
5299 if (!NT_SUCCESS(Status
))
5301 ERR("failed with status 0x%08lx\n", Status
);
5305 Status
= SampGetMembersInAlias(AliasObject
,
5309 /* Return the number of members and the member array */
5310 if (NT_SUCCESS(Status
))
5312 Members
->Count
= MemberCount
;
5313 Members
->Sids
= MemberArray
;
5317 /* Clean up the members array and the SID buffers if something failed */
5318 if (!NT_SUCCESS(Status
))
5320 if (MemberArray
!= NULL
)
5322 for (Index
= 0; Index
< MemberCount
; Index
++)
5324 if (MemberArray
[Index
].SidPointer
!= NULL
)
5325 midl_user_free(MemberArray
[Index
].SidPointer
);
5328 midl_user_free(MemberArray
);
5332 RtlReleaseResource(&SampResource
);
5341 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
5342 IN ACCESS_MASK DesiredAccess
,
5343 IN
unsigned long UserId
,
5344 OUT SAMPR_HANDLE
*UserHandle
)
5346 PSAM_DB_OBJECT DomainObject
;
5347 PSAM_DB_OBJECT UserObject
;
5351 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
5352 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
5354 /* Map generic access rights */
5355 RtlMapGenericMask(&DesiredAccess
,
5358 RtlAcquireResourceShared(&SampResource
,
5361 /* Validate the domain handle */
5362 Status
= SampValidateDbObject(DomainHandle
,
5366 if (!NT_SUCCESS(Status
))
5368 TRACE("failed with status 0x%08lx\n", Status
);
5372 /* Convert the RID into a string (hex) */
5373 swprintf(szRid
, L
"%08lX", UserId
);
5375 /* Create the user object */
5376 Status
= SampOpenDbObject(DomainObject
,
5383 if (!NT_SUCCESS(Status
))
5385 TRACE("failed with status 0x%08lx\n", Status
);
5389 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
5392 RtlReleaseResource(&SampResource
);
5401 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
5403 PSAM_DB_OBJECT UserObject
;
5406 TRACE("(%p)\n", UserHandle
);
5408 RtlAcquireResourceExclusive(&SampResource
,
5411 /* Validate the user handle */
5412 Status
= SampValidateDbObject(*UserHandle
,
5416 if (!NT_SUCCESS(Status
))
5418 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
5422 /* Fail, if the user is built-in */
5423 if (UserObject
->RelativeId
< 1000)
5425 TRACE("You can not delete a special account!\n");
5426 Status
= STATUS_SPECIAL_ACCOUNT
;
5430 /* Remove the user from all groups */
5431 Status
= SampRemoveUserFromAllGroups(UserObject
);
5432 if (!NT_SUCCESS(Status
))
5434 TRACE("SampRemoveUserFromAllGroups() failed (Status 0x%08lx)\n", Status
);
5438 /* Remove the user from all aliases */
5439 Status
= SampRemoveUserFromAllAliases(UserObject
);
5440 if (!NT_SUCCESS(Status
))
5442 TRACE("SampRemoveUserFromAllAliases() failed (Status 0x%08lx)\n", Status
);
5446 /* Delete the user from the database */
5447 Status
= SampDeleteAccountDbObject(UserObject
);
5448 if (!NT_SUCCESS(Status
))
5450 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5454 /* Invalidate the handle */
5458 RtlReleaseResource(&SampResource
);
5466 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
5467 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5469 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5470 SAM_USER_FIXED_DATA FixedData
;
5476 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5477 if (InfoBuffer
== NULL
)
5478 return STATUS_INSUFFICIENT_RESOURCES
;
5480 Length
= sizeof(SAM_USER_FIXED_DATA
);
5481 Status
= SampGetObjectAttribute(UserObject
,
5486 if (!NT_SUCCESS(Status
))
5489 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5491 /* Get the Name string */
5492 Status
= SampGetObjectAttributeString(UserObject
,
5494 &InfoBuffer
->General
.UserName
);
5495 if (!NT_SUCCESS(Status
))
5497 TRACE("Status 0x%08lx\n", Status
);
5501 /* Get the FullName string */
5502 Status
= SampGetObjectAttributeString(UserObject
,
5504 &InfoBuffer
->General
.FullName
);
5505 if (!NT_SUCCESS(Status
))
5507 TRACE("Status 0x%08lx\n", Status
);
5511 /* Get the AdminComment string */
5512 Status
= SampGetObjectAttributeString(UserObject
,
5514 &InfoBuffer
->General
.AdminComment
);
5515 if (!NT_SUCCESS(Status
))
5517 TRACE("Status 0x%08lx\n", Status
);
5521 /* Get the UserComment string */
5522 Status
= SampGetObjectAttributeString(UserObject
,
5524 &InfoBuffer
->General
.UserComment
);
5525 if (!NT_SUCCESS(Status
))
5527 TRACE("Status 0x%08lx\n", Status
);
5531 *Buffer
= InfoBuffer
;
5534 if (!NT_SUCCESS(Status
))
5536 if (InfoBuffer
!= NULL
)
5538 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
5539 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
5541 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
5542 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
5544 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
5545 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
5547 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
5548 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
5550 midl_user_free(InfoBuffer
);
5560 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
5561 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5563 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5564 SAM_USER_FIXED_DATA FixedData
;
5570 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5571 if (InfoBuffer
== NULL
)
5572 return STATUS_INSUFFICIENT_RESOURCES
;
5574 Length
= sizeof(SAM_USER_FIXED_DATA
);
5575 Status
= SampGetObjectAttribute(UserObject
,
5580 if (!NT_SUCCESS(Status
))
5583 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
5584 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
5586 /* Get the UserComment string */
5587 Status
= SampGetObjectAttributeString(UserObject
,
5589 &InfoBuffer
->Preferences
.UserComment
);
5590 if (!NT_SUCCESS(Status
))
5592 TRACE("Status 0x%08lx\n", Status
);
5596 *Buffer
= InfoBuffer
;
5599 if (!NT_SUCCESS(Status
))
5601 if (InfoBuffer
!= NULL
)
5603 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
5604 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
5606 midl_user_free(InfoBuffer
);
5616 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
5617 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5619 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5620 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
5621 SAM_USER_FIXED_DATA FixedData
;
5622 LARGE_INTEGER PasswordCanChange
;
5623 LARGE_INTEGER PasswordMustChange
;
5629 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5630 if (InfoBuffer
== NULL
)
5631 return STATUS_INSUFFICIENT_RESOURCES
;
5633 /* Get the fixed size domain data */
5634 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
5635 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
5638 (PVOID
)&DomainFixedData
,
5640 if (!NT_SUCCESS(Status
))
5643 /* Get the fixed size user data */
5644 Length
= sizeof(SAM_USER_FIXED_DATA
);
5645 Status
= SampGetObjectAttribute(UserObject
,
5650 if (!NT_SUCCESS(Status
))
5653 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
5654 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5655 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5656 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5657 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5658 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5659 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5660 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5661 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5662 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
5663 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
5665 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5666 DomainFixedData
.MinPasswordAge
);
5667 InfoBuffer
->Logon
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
5668 InfoBuffer
->Logon
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
5670 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5671 DomainFixedData
.MaxPasswordAge
);
5672 InfoBuffer
->Logon
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
5673 InfoBuffer
->Logon
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
5675 /* Get the Name string */
5676 Status
= SampGetObjectAttributeString(UserObject
,
5678 &InfoBuffer
->Logon
.UserName
);
5679 if (!NT_SUCCESS(Status
))
5681 TRACE("Status 0x%08lx\n", Status
);
5685 /* Get the FullName string */
5686 Status
= SampGetObjectAttributeString(UserObject
,
5688 &InfoBuffer
->Logon
.FullName
);
5689 if (!NT_SUCCESS(Status
))
5691 TRACE("Status 0x%08lx\n", Status
);
5695 /* Get the HomeDirectory string */
5696 Status
= SampGetObjectAttributeString(UserObject
,
5698 &InfoBuffer
->Logon
.HomeDirectory
);
5699 if (!NT_SUCCESS(Status
))
5701 TRACE("Status 0x%08lx\n", Status
);
5705 /* Get the HomeDirectoryDrive string */
5706 Status
= SampGetObjectAttributeString(UserObject
,
5707 L
"HomeDirectoryDrive",
5708 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
5709 if (!NT_SUCCESS(Status
))
5711 TRACE("Status 0x%08lx\n", Status
);
5715 /* Get the ScriptPath string */
5716 Status
= SampGetObjectAttributeString(UserObject
,
5718 &InfoBuffer
->Logon
.ScriptPath
);
5719 if (!NT_SUCCESS(Status
))
5721 TRACE("Status 0x%08lx\n", Status
);
5725 /* Get the ProfilePath string */
5726 Status
= SampGetObjectAttributeString(UserObject
,
5728 &InfoBuffer
->Logon
.ProfilePath
);
5729 if (!NT_SUCCESS(Status
))
5731 TRACE("Status 0x%08lx\n", Status
);
5735 /* Get the WorkStations string */
5736 Status
= SampGetObjectAttributeString(UserObject
,
5738 &InfoBuffer
->Logon
.WorkStations
);
5739 if (!NT_SUCCESS(Status
))
5741 TRACE("Status 0x%08lx\n", Status
);
5745 /* Get the LogonHours attribute */
5746 Status
= SampGetLogonHoursAttrbute(UserObject
,
5747 &InfoBuffer
->Logon
.LogonHours
);
5748 if (!NT_SUCCESS(Status
))
5750 TRACE("Status 0x%08lx\n", Status
);
5754 *Buffer
= InfoBuffer
;
5757 if (!NT_SUCCESS(Status
))
5759 if (InfoBuffer
!= NULL
)
5761 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
5762 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
5764 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
5765 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
5767 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
5768 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5770 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5771 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5773 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5774 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5776 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5777 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5779 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5780 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5782 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5783 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5785 midl_user_free(InfoBuffer
);
5795 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5796 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5798 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5799 SAM_USER_FIXED_DATA FixedData
;
5805 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5806 if (InfoBuffer
== NULL
)
5807 return STATUS_INSUFFICIENT_RESOURCES
;
5809 Length
= sizeof(SAM_USER_FIXED_DATA
);
5810 Status
= SampGetObjectAttribute(UserObject
,
5815 if (!NT_SUCCESS(Status
))
5818 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5819 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5820 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5821 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5822 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5823 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5824 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5825 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5826 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5827 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5828 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5829 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
5830 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
5832 /* Get the Name string */
5833 Status
= SampGetObjectAttributeString(UserObject
,
5835 &InfoBuffer
->Account
.UserName
);
5836 if (!NT_SUCCESS(Status
))
5838 TRACE("Status 0x%08lx\n", Status
);
5842 /* Get the FullName string */
5843 Status
= SampGetObjectAttributeString(UserObject
,
5845 &InfoBuffer
->Account
.FullName
);
5846 if (!NT_SUCCESS(Status
))
5848 TRACE("Status 0x%08lx\n", Status
);
5852 /* Get the HomeDirectory string */
5853 Status
= SampGetObjectAttributeString(UserObject
,
5855 &InfoBuffer
->Account
.HomeDirectory
);
5856 if (!NT_SUCCESS(Status
))
5858 TRACE("Status 0x%08lx\n", Status
);
5862 /* Get the HomeDirectoryDrive string */
5863 Status
= SampGetObjectAttributeString(UserObject
,
5864 L
"HomeDirectoryDrive",
5865 &InfoBuffer
->Account
.HomeDirectoryDrive
);
5866 if (!NT_SUCCESS(Status
))
5868 TRACE("Status 0x%08lx\n", Status
);
5872 /* Get the ScriptPath string */
5873 Status
= SampGetObjectAttributeString(UserObject
,
5875 &InfoBuffer
->Account
.ScriptPath
);
5876 if (!NT_SUCCESS(Status
))
5878 TRACE("Status 0x%08lx\n", Status
);
5882 /* Get the ProfilePath string */
5883 Status
= SampGetObjectAttributeString(UserObject
,
5885 &InfoBuffer
->Account
.ProfilePath
);
5886 if (!NT_SUCCESS(Status
))
5888 TRACE("Status 0x%08lx\n", Status
);
5892 /* Get the AdminComment string */
5893 Status
= SampGetObjectAttributeString(UserObject
,
5895 &InfoBuffer
->Account
.AdminComment
);
5896 if (!NT_SUCCESS(Status
))
5898 TRACE("Status 0x%08lx\n", Status
);
5902 /* Get the WorkStations string */
5903 Status
= SampGetObjectAttributeString(UserObject
,
5905 &InfoBuffer
->Account
.WorkStations
);
5906 if (!NT_SUCCESS(Status
))
5908 TRACE("Status 0x%08lx\n", Status
);
5912 /* Get the LogonHours attribute */
5913 Status
= SampGetLogonHoursAttrbute(UserObject
,
5914 &InfoBuffer
->Account
.LogonHours
);
5915 if (!NT_SUCCESS(Status
))
5917 TRACE("Status 0x%08lx\n", Status
);
5921 *Buffer
= InfoBuffer
;
5924 if (!NT_SUCCESS(Status
))
5926 if (InfoBuffer
!= NULL
)
5928 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5929 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5931 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5932 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5934 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5935 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5937 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5938 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5940 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5941 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5943 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5944 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5946 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5947 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5949 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5950 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5952 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5953 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5955 midl_user_free(InfoBuffer
);
5965 SampQueryUserLogonHours(PSAM_DB_OBJECT UserObject
,
5966 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5968 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5971 TRACE("(%p %p)\n", UserObject
, Buffer
);
5975 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5976 if (InfoBuffer
== NULL
)
5978 TRACE("Failed to allocate InfoBuffer!\n");
5979 return STATUS_INSUFFICIENT_RESOURCES
;
5982 Status
= SampGetLogonHoursAttrbute(UserObject
,
5983 &InfoBuffer
->LogonHours
.LogonHours
);
5984 if (!NT_SUCCESS(Status
))
5986 TRACE("SampGetLogonHoursAttrbute failed (Status 0x%08lx)\n", Status
);
5990 *Buffer
= InfoBuffer
;
5993 if (!NT_SUCCESS(Status
))
5995 if (InfoBuffer
!= NULL
)
5997 if (InfoBuffer
->LogonHours
.LogonHours
.LogonHours
!= NULL
)
5998 midl_user_free(InfoBuffer
->LogonHours
.LogonHours
.LogonHours
);
6000 midl_user_free(InfoBuffer
);
6010 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
6011 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6013 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6018 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6019 if (InfoBuffer
== NULL
)
6020 return STATUS_INSUFFICIENT_RESOURCES
;
6022 /* Get the Name string */
6023 Status
= SampGetObjectAttributeString(UserObject
,
6025 &InfoBuffer
->Name
.UserName
);
6026 if (!NT_SUCCESS(Status
))
6028 TRACE("Status 0x%08lx\n", Status
);
6032 /* Get the FullName string */
6033 Status
= SampGetObjectAttributeString(UserObject
,
6035 &InfoBuffer
->Name
.FullName
);
6036 if (!NT_SUCCESS(Status
))
6038 TRACE("Status 0x%08lx\n", Status
);
6042 *Buffer
= InfoBuffer
;
6045 if (!NT_SUCCESS(Status
))
6047 if (InfoBuffer
!= NULL
)
6049 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
6050 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
6052 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
6053 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
6055 midl_user_free(InfoBuffer
);
6064 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
6065 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6067 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6072 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6073 if (InfoBuffer
== NULL
)
6074 return STATUS_INSUFFICIENT_RESOURCES
;
6076 /* Get the Name string */
6077 Status
= SampGetObjectAttributeString(UserObject
,
6079 &InfoBuffer
->AccountName
.UserName
);
6080 if (!NT_SUCCESS(Status
))
6082 TRACE("Status 0x%08lx\n", Status
);
6086 *Buffer
= InfoBuffer
;
6089 if (!NT_SUCCESS(Status
))
6091 if (InfoBuffer
!= NULL
)
6093 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
6094 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
6096 midl_user_free(InfoBuffer
);
6105 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
6106 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6108 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6113 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6114 if (InfoBuffer
== NULL
)
6115 return STATUS_INSUFFICIENT_RESOURCES
;
6117 /* Get the FullName string */
6118 Status
= SampGetObjectAttributeString(UserObject
,
6120 &InfoBuffer
->FullName
.FullName
);
6121 if (!NT_SUCCESS(Status
))
6123 TRACE("Status 0x%08lx\n", Status
);
6127 *Buffer
= InfoBuffer
;
6130 if (!NT_SUCCESS(Status
))
6132 if (InfoBuffer
!= NULL
)
6134 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
6135 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
6137 midl_user_free(InfoBuffer
);
6147 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
6148 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6150 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6151 SAM_USER_FIXED_DATA FixedData
;
6157 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6158 if (InfoBuffer
== NULL
)
6159 return STATUS_INSUFFICIENT_RESOURCES
;
6161 Length
= sizeof(SAM_USER_FIXED_DATA
);
6162 Status
= SampGetObjectAttribute(UserObject
,
6167 if (!NT_SUCCESS(Status
))
6170 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
6172 *Buffer
= InfoBuffer
;
6175 if (!NT_SUCCESS(Status
))
6177 if (InfoBuffer
!= NULL
)
6179 midl_user_free(InfoBuffer
);
6188 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
6189 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6191 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6196 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6197 if (InfoBuffer
== NULL
)
6198 return STATUS_INSUFFICIENT_RESOURCES
;
6200 /* Get the HomeDirectory string */
6201 Status
= SampGetObjectAttributeString(UserObject
,
6203 &InfoBuffer
->Home
.HomeDirectory
);
6204 if (!NT_SUCCESS(Status
))
6206 TRACE("Status 0x%08lx\n", Status
);
6210 /* Get the HomeDirectoryDrive string */
6211 Status
= SampGetObjectAttributeString(UserObject
,
6212 L
"HomeDirectoryDrive",
6213 &InfoBuffer
->Home
.HomeDirectoryDrive
);
6214 if (!NT_SUCCESS(Status
))
6216 TRACE("Status 0x%08lx\n", Status
);
6220 *Buffer
= InfoBuffer
;
6223 if (!NT_SUCCESS(Status
))
6225 if (InfoBuffer
!= NULL
)
6227 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
6228 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
6230 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
6231 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
6233 midl_user_free(InfoBuffer
);
6242 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
6243 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6245 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6250 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6251 if (InfoBuffer
== NULL
)
6252 return STATUS_INSUFFICIENT_RESOURCES
;
6254 /* Get the ScriptPath string */
6255 Status
= SampGetObjectAttributeString(UserObject
,
6257 &InfoBuffer
->Script
.ScriptPath
);
6258 if (!NT_SUCCESS(Status
))
6260 TRACE("Status 0x%08lx\n", Status
);
6264 *Buffer
= InfoBuffer
;
6267 if (!NT_SUCCESS(Status
))
6269 if (InfoBuffer
!= NULL
)
6271 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
6272 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
6274 midl_user_free(InfoBuffer
);
6283 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
6284 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6286 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6291 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6292 if (InfoBuffer
== NULL
)
6293 return STATUS_INSUFFICIENT_RESOURCES
;
6295 /* Get the ProfilePath string */
6296 Status
= SampGetObjectAttributeString(UserObject
,
6298 &InfoBuffer
->Profile
.ProfilePath
);
6299 if (!NT_SUCCESS(Status
))
6301 TRACE("Status 0x%08lx\n", Status
);
6305 *Buffer
= InfoBuffer
;
6308 if (!NT_SUCCESS(Status
))
6310 if (InfoBuffer
!= NULL
)
6312 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
6313 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
6315 midl_user_free(InfoBuffer
);
6324 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
6325 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6327 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6332 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6333 if (InfoBuffer
== NULL
)
6334 return STATUS_INSUFFICIENT_RESOURCES
;
6336 /* Get the AdminComment string */
6337 Status
= SampGetObjectAttributeString(UserObject
,
6339 &InfoBuffer
->AdminComment
.AdminComment
);
6340 if (!NT_SUCCESS(Status
))
6342 TRACE("Status 0x%08lx\n", Status
);
6346 *Buffer
= InfoBuffer
;
6349 if (!NT_SUCCESS(Status
))
6351 if (InfoBuffer
!= NULL
)
6353 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
6354 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
6356 midl_user_free(InfoBuffer
);
6365 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
6366 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6368 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6373 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6374 if (InfoBuffer
== NULL
)
6375 return STATUS_INSUFFICIENT_RESOURCES
;
6377 /* Get the WorkStations string */
6378 Status
= SampGetObjectAttributeString(UserObject
,
6380 &InfoBuffer
->WorkStations
.WorkStations
);
6381 if (!NT_SUCCESS(Status
))
6383 TRACE("Status 0x%08lx\n", Status
);
6387 *Buffer
= InfoBuffer
;
6390 if (!NT_SUCCESS(Status
))
6392 if (InfoBuffer
!= NULL
)
6394 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
6395 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
6397 midl_user_free(InfoBuffer
);
6407 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
6408 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6410 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6411 SAM_USER_FIXED_DATA FixedData
;
6417 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6418 if (InfoBuffer
== NULL
)
6419 return STATUS_INSUFFICIENT_RESOURCES
;
6421 Length
= sizeof(SAM_USER_FIXED_DATA
);
6422 Status
= SampGetObjectAttribute(UserObject
,
6427 if (!NT_SUCCESS(Status
))
6430 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
6432 *Buffer
= InfoBuffer
;
6435 if (!NT_SUCCESS(Status
))
6437 if (InfoBuffer
!= NULL
)
6439 midl_user_free(InfoBuffer
);
6449 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
6450 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6452 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6453 SAM_USER_FIXED_DATA FixedData
;
6459 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6460 if (InfoBuffer
== NULL
)
6461 return STATUS_INSUFFICIENT_RESOURCES
;
6463 Length
= sizeof(SAM_USER_FIXED_DATA
);
6464 Status
= SampGetObjectAttribute(UserObject
,
6469 if (!NT_SUCCESS(Status
))
6472 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6473 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6475 *Buffer
= InfoBuffer
;
6478 if (!NT_SUCCESS(Status
))
6480 if (InfoBuffer
!= NULL
)
6482 midl_user_free(InfoBuffer
);
6492 SampQueryUserInternal1(PSAM_DB_OBJECT UserObject
,
6493 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6495 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6497 NTSTATUS Status
= STATUS_SUCCESS
;
6499 /* Fail, if the caller is not a trusted caller */
6500 if (UserObject
->Trusted
== FALSE
)
6501 return STATUS_INVALID_INFO_CLASS
;
6505 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6506 if (InfoBuffer
== NULL
)
6507 return STATUS_INSUFFICIENT_RESOURCES
;
6509 InfoBuffer
->Internal1
.LmPasswordPresent
= FALSE
;
6510 InfoBuffer
->Internal1
.NtPasswordPresent
= FALSE
;
6512 /* Get the NT password */
6514 SampGetObjectAttribute(UserObject
,
6520 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6522 Status
= SampGetObjectAttribute(UserObject
,
6525 (PVOID
)&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6527 if (!NT_SUCCESS(Status
))
6530 if (memcmp(&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6532 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
6533 InfoBuffer
->Internal1
.NtPasswordPresent
= TRUE
;
6537 /* Get the LM password */
6539 SampGetObjectAttribute(UserObject
,
6545 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6547 Status
= SampGetObjectAttribute(UserObject
,
6550 (PVOID
)&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6552 if (!NT_SUCCESS(Status
))
6555 if (memcmp(&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6557 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
6558 InfoBuffer
->Internal1
.LmPasswordPresent
= TRUE
;
6561 InfoBuffer
->Internal1
.PasswordExpired
= FALSE
;
6563 *Buffer
= InfoBuffer
;
6566 if (!NT_SUCCESS(Status
))
6568 if (InfoBuffer
!= NULL
)
6570 midl_user_free(InfoBuffer
);
6579 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
6580 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6582 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6587 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6588 if (InfoBuffer
== NULL
)
6589 return STATUS_INSUFFICIENT_RESOURCES
;
6591 /* Get the Parameters string */
6592 Status
= SampGetObjectAttributeString(UserObject
,
6594 &InfoBuffer
->Parameters
.Parameters
);
6595 if (!NT_SUCCESS(Status
))
6597 TRACE("Status 0x%08lx\n", Status
);
6601 *Buffer
= InfoBuffer
;
6604 if (!NT_SUCCESS(Status
))
6606 if (InfoBuffer
!= NULL
)
6608 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
6609 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
6611 midl_user_free(InfoBuffer
);
6620 SampQueryUserAll(PSAM_DB_OBJECT UserObject
,
6621 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6623 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6624 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
6625 SAM_USER_FIXED_DATA FixedData
;
6626 LARGE_INTEGER PasswordCanChange
;
6627 LARGE_INTEGER PasswordMustChange
;
6633 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6634 if (InfoBuffer
== NULL
)
6635 return STATUS_INSUFFICIENT_RESOURCES
;
6637 /* Get the fixed size domain data */
6638 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6639 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
6642 (PVOID
)&DomainFixedData
,
6644 if (!NT_SUCCESS(Status
))
6647 /* Get the fixed size user data */
6648 Length
= sizeof(SAM_USER_FIXED_DATA
);
6649 Status
= SampGetObjectAttribute(UserObject
,
6654 if (!NT_SUCCESS(Status
))
6657 /* Set the fields to be returned */
6658 if (UserObject
->Trusted
)
6660 InfoBuffer
->All
.WhichFields
= USER_ALL_READ_GENERAL_MASK
|
6661 USER_ALL_READ_LOGON_MASK
|
6662 USER_ALL_READ_ACCOUNT_MASK
|
6663 USER_ALL_READ_PREFERENCES_MASK
|
6664 USER_ALL_READ_TRUSTED_MASK
;
6668 InfoBuffer
->All
.WhichFields
= 0;
6670 if (UserObject
->Access
& USER_READ_GENERAL
)
6671 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_GENERAL_MASK
;
6673 if (UserObject
->Access
& USER_READ_LOGON
)
6674 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_LOGON_MASK
;
6676 if (UserObject
->Access
& USER_READ_ACCOUNT
)
6677 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_ACCOUNT_MASK
;
6679 if (UserObject
->Access
& USER_READ_PREFERENCES
)
6680 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_PREFERENCES_MASK
;
6683 /* Fail, if no fields are to be returned */
6684 if (InfoBuffer
->All
.WhichFields
== 0)
6686 Status
= STATUS_ACCESS_DENIED
;
6690 /* Get the UserName attribute */
6691 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERNAME
)
6693 Status
= SampGetObjectAttributeString(UserObject
,
6695 &InfoBuffer
->All
.UserName
);
6696 if (!NT_SUCCESS(Status
))
6698 TRACE("Status 0x%08lx\n", Status
);
6703 /* Get the FullName attribute */
6704 if (InfoBuffer
->All
.WhichFields
& USER_ALL_FULLNAME
)
6706 Status
= SampGetObjectAttributeString(UserObject
,
6708 &InfoBuffer
->All
.FullName
);
6709 if (!NT_SUCCESS(Status
))
6711 TRACE("Status 0x%08lx\n", Status
);
6716 /* Get the UserId attribute */
6717 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERID
)
6719 InfoBuffer
->All
.UserId
= FixedData
.UserId
;
6722 /* Get the PrimaryGroupId attribute */
6723 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PRIMARYGROUPID
)
6725 InfoBuffer
->All
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
6728 /* Get the AdminComment attribute */
6729 if (InfoBuffer
->All
.WhichFields
& USER_ALL_ADMINCOMMENT
)
6731 Status
= SampGetObjectAttributeString(UserObject
,
6733 &InfoBuffer
->All
.AdminComment
);
6734 if (!NT_SUCCESS(Status
))
6736 TRACE("Status 0x%08lx\n", Status
);
6741 /* Get the UserComment attribute */
6742 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERCOMMENT
)
6744 Status
= SampGetObjectAttributeString(UserObject
,
6746 &InfoBuffer
->All
.UserComment
);
6747 if (!NT_SUCCESS(Status
))
6749 TRACE("Status 0x%08lx\n", Status
);
6754 /* Get the HomeDirectory attribute */
6755 if (InfoBuffer
->All
.WhichFields
& USER_ALL_HOMEDIRECTORY
)
6757 Status
= SampGetObjectAttributeString(UserObject
,
6759 &InfoBuffer
->All
.HomeDirectory
);
6760 if (!NT_SUCCESS(Status
))
6762 TRACE("Status 0x%08lx\n", Status
);
6767 /* Get the HomeDirectoryDrive attribute */
6768 if (InfoBuffer
->All
.WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6770 Status
= SampGetObjectAttributeString(UserObject
,
6771 L
"HomeDirectoryDrive",
6772 &InfoBuffer
->Home
.HomeDirectoryDrive
);
6773 if (!NT_SUCCESS(Status
))
6775 TRACE("Status 0x%08lx\n", Status
);
6780 /* Get the ScriptPath attribute */
6781 if (InfoBuffer
->All
.WhichFields
& USER_ALL_SCRIPTPATH
)
6783 Status
= SampGetObjectAttributeString(UserObject
,
6785 &InfoBuffer
->All
.ScriptPath
);
6786 if (!NT_SUCCESS(Status
))
6788 TRACE("Status 0x%08lx\n", Status
);
6793 /* Get the ProfilePath attribute */
6794 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PROFILEPATH
)
6796 Status
= SampGetObjectAttributeString(UserObject
,
6798 &InfoBuffer
->All
.ProfilePath
);
6799 if (!NT_SUCCESS(Status
))
6801 TRACE("Status 0x%08lx\n", Status
);
6806 /* Get the WorkStations attribute */
6807 if (InfoBuffer
->All
.WhichFields
& USER_ALL_WORKSTATIONS
)
6809 Status
= SampGetObjectAttributeString(UserObject
,
6811 &InfoBuffer
->All
.WorkStations
);
6812 if (!NT_SUCCESS(Status
))
6814 TRACE("Status 0x%08lx\n", Status
);
6819 /* Get the LastLogon attribute */
6820 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LASTLOGON
)
6822 InfoBuffer
->All
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
6823 InfoBuffer
->All
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
6826 /* Get the LastLogoff attribute */
6827 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LASTLOGOFF
)
6829 InfoBuffer
->All
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
6830 InfoBuffer
->All
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
6833 /* Get the LogonHours attribute */
6834 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LOGONHOURS
)
6836 Status
= SampGetLogonHoursAttrbute(UserObject
,
6837 &InfoBuffer
->All
.LogonHours
);
6838 if (!NT_SUCCESS(Status
))
6840 TRACE("Status 0x%08lx\n", Status
);
6845 /* Get the BadPasswordCount attribute */
6846 if (InfoBuffer
->All
.WhichFields
& USER_ALL_BADPASSWORDCOUNT
)
6848 InfoBuffer
->All
.BadPasswordCount
= FixedData
.BadPasswordCount
;
6851 /* Get the LogonCount attribute */
6852 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LOGONCOUNT
)
6854 InfoBuffer
->All
.LogonCount
= FixedData
.LogonCount
;
6857 /* Get the PasswordCanChange attribute */
6858 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDCANCHANGE
)
6860 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
6861 DomainFixedData
.MinPasswordAge
);
6862 InfoBuffer
->All
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
6863 InfoBuffer
->All
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
6866 /* Get the PasswordMustChange attribute */
6867 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDMUSTCHANGE
)
6869 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
6870 DomainFixedData
.MaxPasswordAge
);
6871 InfoBuffer
->All
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
6872 InfoBuffer
->All
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
6875 /* Get the PasswordLastSet attribute */
6876 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDLASTSET
)
6878 InfoBuffer
->All
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
6879 InfoBuffer
->All
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
6882 /* Get the AccountExpires attribute */
6883 if (InfoBuffer
->All
.WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
6885 InfoBuffer
->All
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6886 InfoBuffer
->All
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6889 /* Get the UserAccountControl attribute */
6890 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
6892 InfoBuffer
->All
.UserAccountControl
= FixedData
.UserAccountControl
;
6895 /* Get the Parameters attribute */
6896 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PARAMETERS
)
6898 Status
= SampGetObjectAttributeString(UserObject
,
6900 &InfoBuffer
->All
.Parameters
);
6901 if (!NT_SUCCESS(Status
))
6903 TRACE("Status 0x%08lx\n", Status
);
6908 /* Get the CountryCode attribute */
6909 if (InfoBuffer
->All
.WhichFields
& USER_ALL_COUNTRYCODE
)
6911 InfoBuffer
->All
.CountryCode
= FixedData
.CountryCode
;
6914 /* Get the CodePage attribute */
6915 if (InfoBuffer
->All
.WhichFields
& USER_ALL_CODEPAGE
)
6917 InfoBuffer
->All
.CodePage
= FixedData
.CodePage
;
6920 /* Get the LmPassword and NtPassword attributes */
6921 if (InfoBuffer
->All
.WhichFields
& (USER_ALL_NTPASSWORDPRESENT
| USER_ALL_LMPASSWORDPRESENT
))
6923 InfoBuffer
->All
.LmPasswordPresent
= FALSE
;
6924 InfoBuffer
->All
.NtPasswordPresent
= FALSE
;
6926 /* Get the NT password */
6928 SampGetObjectAttribute(UserObject
,
6934 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6936 InfoBuffer
->All
.NtOwfPassword
.Buffer
= midl_user_allocate(sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
6937 if (InfoBuffer
->All
.NtOwfPassword
.Buffer
== NULL
)
6939 Status
= STATUS_INSUFFICIENT_RESOURCES
;
6943 InfoBuffer
->All
.NtOwfPassword
.Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
6944 InfoBuffer
->All
.NtOwfPassword
.MaximumLength
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
6946 Status
= SampGetObjectAttribute(UserObject
,
6949 (PVOID
)InfoBuffer
->All
.NtOwfPassword
.Buffer
,
6951 if (!NT_SUCCESS(Status
))
6954 if (memcmp(InfoBuffer
->All
.NtOwfPassword
.Buffer
,
6956 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
6957 InfoBuffer
->All
.NtPasswordPresent
= TRUE
;
6960 /* Get the LM password */
6962 SampGetObjectAttribute(UserObject
,
6968 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6970 InfoBuffer
->All
.LmOwfPassword
.Buffer
= midl_user_allocate(sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
6971 if (InfoBuffer
->All
.LmOwfPassword
.Buffer
== NULL
)
6973 Status
= STATUS_INSUFFICIENT_RESOURCES
;
6977 InfoBuffer
->All
.LmOwfPassword
.Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
6978 InfoBuffer
->All
.LmOwfPassword
.MaximumLength
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
6980 Status
= SampGetObjectAttribute(UserObject
,
6983 (PVOID
)InfoBuffer
->All
.LmOwfPassword
.Buffer
,
6985 if (!NT_SUCCESS(Status
))
6988 if (memcmp(InfoBuffer
->All
.LmOwfPassword
.Buffer
,
6990 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
6991 InfoBuffer
->All
.LmPasswordPresent
= TRUE
;
6995 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PRIVATEDATA
)
6997 Status
= SampGetObjectAttributeString(UserObject
,
6999 &InfoBuffer
->All
.PrivateData
);
7000 if (!NT_SUCCESS(Status
))
7002 TRACE("Status 0x%08lx\n", Status
);
7007 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDEXPIRED
)
7012 if (InfoBuffer
->All
.WhichFields
& USER_ALL_SECURITYDESCRIPTOR
)
7015 SampGetObjectAttribute(UserObject
,
7023 InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
= midl_user_allocate(Length
);
7024 if (InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
== NULL
)
7026 Status
= STATUS_INSUFFICIENT_RESOURCES
;
7030 InfoBuffer
->All
.SecurityDescriptor
.Length
= Length
;
7032 Status
= SampGetObjectAttribute(UserObject
,
7035 (PVOID
)InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
,
7037 if (!NT_SUCCESS(Status
))
7042 *Buffer
= InfoBuffer
;
7045 if (!NT_SUCCESS(Status
))
7047 if (InfoBuffer
!= NULL
)
7049 if (InfoBuffer
->All
.UserName
.Buffer
!= NULL
)
7050 midl_user_free(InfoBuffer
->All
.UserName
.Buffer
);
7052 if (InfoBuffer
->All
.FullName
.Buffer
!= NULL
)
7053 midl_user_free(InfoBuffer
->All
.FullName
.Buffer
);
7055 if (InfoBuffer
->All
.AdminComment
.Buffer
!= NULL
)
7056 midl_user_free(InfoBuffer
->All
.AdminComment
.Buffer
);
7058 if (InfoBuffer
->All
.UserComment
.Buffer
!= NULL
)
7059 midl_user_free(InfoBuffer
->All
.UserComment
.Buffer
);
7061 if (InfoBuffer
->All
.HomeDirectory
.Buffer
!= NULL
)
7062 midl_user_free(InfoBuffer
->All
.HomeDirectory
.Buffer
);
7064 if (InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
!= NULL
)
7065 midl_user_free(InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
);
7067 if (InfoBuffer
->All
.ScriptPath
.Buffer
!= NULL
)
7068 midl_user_free(InfoBuffer
->All
.ScriptPath
.Buffer
);
7070 if (InfoBuffer
->All
.ProfilePath
.Buffer
!= NULL
)
7071 midl_user_free(InfoBuffer
->All
.ProfilePath
.Buffer
);
7073 if (InfoBuffer
->All
.WorkStations
.Buffer
!= NULL
)
7074 midl_user_free(InfoBuffer
->All
.WorkStations
.Buffer
);
7076 if (InfoBuffer
->All
.LogonHours
.LogonHours
!= NULL
)
7077 midl_user_free(InfoBuffer
->All
.LogonHours
.LogonHours
);
7079 if (InfoBuffer
->All
.Parameters
.Buffer
!= NULL
)
7080 midl_user_free(InfoBuffer
->All
.Parameters
.Buffer
);
7082 if (InfoBuffer
->All
.LmOwfPassword
.Buffer
!= NULL
)
7083 midl_user_free(InfoBuffer
->All
.LmOwfPassword
.Buffer
);
7085 if (InfoBuffer
->All
.NtOwfPassword
.Buffer
!= NULL
)
7086 midl_user_free(InfoBuffer
->All
.NtOwfPassword
.Buffer
);
7088 if (InfoBuffer
->All
.PrivateData
.Buffer
!= NULL
)
7089 midl_user_free(InfoBuffer
->All
.PrivateData
.Buffer
);
7091 if (InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
!= NULL
)
7092 midl_user_free(InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
);
7094 midl_user_free(InfoBuffer
);
7105 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
7106 IN USER_INFORMATION_CLASS UserInformationClass
,
7107 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
7109 PSAM_DB_OBJECT UserObject
;
7110 ACCESS_MASK DesiredAccess
;
7113 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
7114 UserHandle
, UserInformationClass
, Buffer
);
7116 switch (UserInformationClass
)
7118 case UserGeneralInformation
:
7119 case UserNameInformation
:
7120 case UserAccountNameInformation
:
7121 case UserFullNameInformation
:
7122 case UserPrimaryGroupInformation
:
7123 case UserAdminCommentInformation
:
7124 DesiredAccess
= USER_READ_GENERAL
;
7127 case UserLogonHoursInformation
:
7128 case UserHomeInformation
:
7129 case UserScriptInformation
:
7130 case UserProfileInformation
:
7131 case UserWorkStationsInformation
:
7132 DesiredAccess
= USER_READ_LOGON
;
7135 case UserControlInformation
:
7136 case UserExpiresInformation
:
7137 case UserParametersInformation
:
7138 DesiredAccess
= USER_READ_ACCOUNT
;
7141 case UserPreferencesInformation
:
7142 DesiredAccess
= USER_READ_GENERAL
|
7143 USER_READ_PREFERENCES
;
7146 case UserLogonInformation
:
7147 case UserAccountInformation
:
7148 DesiredAccess
= USER_READ_GENERAL
|
7149 USER_READ_PREFERENCES
|
7154 case UserInternal1Information
:
7155 case UserAllInformation
:
7160 return STATUS_INVALID_INFO_CLASS
;
7163 RtlAcquireResourceShared(&SampResource
,
7166 /* Validate the domain handle */
7167 Status
= SampValidateDbObject(UserHandle
,
7171 if (!NT_SUCCESS(Status
))
7173 TRACE("failed with status 0x%08lx\n", Status
);
7177 switch (UserInformationClass
)
7179 case UserGeneralInformation
:
7180 Status
= SampQueryUserGeneral(UserObject
,
7184 case UserPreferencesInformation
:
7185 Status
= SampQueryUserPreferences(UserObject
,
7189 case UserLogonInformation
:
7190 Status
= SampQueryUserLogon(UserObject
,
7194 case UserLogonHoursInformation
:
7195 Status
= SampQueryUserLogonHours(UserObject
,
7199 case UserAccountInformation
:
7200 Status
= SampQueryUserAccount(UserObject
,
7204 case UserNameInformation
:
7205 Status
= SampQueryUserName(UserObject
,
7209 case UserAccountNameInformation
:
7210 Status
= SampQueryUserAccountName(UserObject
,
7214 case UserFullNameInformation
:
7215 Status
= SampQueryUserFullName(UserObject
,
7219 case UserPrimaryGroupInformation
:
7220 Status
= SampQueryUserPrimaryGroup(UserObject
,
7224 case UserHomeInformation
:
7225 Status
= SampQueryUserHome(UserObject
,
7228 case UserScriptInformation
:
7229 Status
= SampQueryUserScript(UserObject
,
7233 case UserProfileInformation
:
7234 Status
= SampQueryUserProfile(UserObject
,
7238 case UserAdminCommentInformation
:
7239 Status
= SampQueryUserAdminComment(UserObject
,
7243 case UserWorkStationsInformation
:
7244 Status
= SampQueryUserWorkStations(UserObject
,
7248 case UserControlInformation
:
7249 Status
= SampQueryUserControl(UserObject
,
7253 case UserExpiresInformation
:
7254 Status
= SampQueryUserExpires(UserObject
,
7258 case UserInternal1Information
:
7259 Status
= SampQueryUserInternal1(UserObject
,
7263 case UserParametersInformation
:
7264 Status
= SampQueryUserParameters(UserObject
,
7268 case UserAllInformation
:
7269 Status
= SampQueryUserAll(UserObject
,
7273 // case UserInternal4Information:
7274 // case UserInternal5Information:
7275 // case UserInternal4InformationNew:
7276 // case UserInternal5InformationNew:
7279 Status
= STATUS_INVALID_INFO_CLASS
;
7283 RtlReleaseResource(&SampResource
);
7290 SampSetUserName(PSAM_DB_OBJECT UserObject
,
7291 PRPC_UNICODE_STRING NewUserName
)
7293 UNICODE_STRING OldUserName
= {0, 0, NULL
};
7296 /* Check the account name */
7297 Status
= SampCheckAccountName(NewUserName
, 20);
7298 if (!NT_SUCCESS(Status
))
7300 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
7304 Status
= SampGetObjectAttributeString(UserObject
,
7306 (PRPC_UNICODE_STRING
)&OldUserName
);
7307 if (!NT_SUCCESS(Status
))
7309 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
7313 if (!RtlEqualUnicodeString(&OldUserName
, (PCUNICODE_STRING
)NewUserName
, TRUE
))
7315 Status
= SampCheckAccountNameInDomain(UserObject
->ParentObject
,
7316 NewUserName
->Buffer
);
7317 if (!NT_SUCCESS(Status
))
7319 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
7320 NewUserName
->Buffer
, Status
);
7325 Status
= SampSetAccountNameInDomain(UserObject
->ParentObject
,
7327 NewUserName
->Buffer
,
7328 UserObject
->RelativeId
);
7329 if (!NT_SUCCESS(Status
))
7331 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
7335 Status
= SampRemoveAccountNameFromDomain(UserObject
->ParentObject
,
7337 OldUserName
.Buffer
);
7338 if (!NT_SUCCESS(Status
))
7340 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
7344 Status
= SampSetObjectAttributeString(UserObject
,
7347 if (!NT_SUCCESS(Status
))
7349 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
7353 if (OldUserName
.Buffer
!= NULL
)
7354 midl_user_free(OldUserName
.Buffer
);
7361 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
7362 PSAMPR_USER_INFO_BUFFER Buffer
)
7364 SAM_USER_FIXED_DATA FixedData
;
7368 Length
= sizeof(SAM_USER_FIXED_DATA
);
7369 Status
= SampGetObjectAttribute(UserObject
,
7374 if (!NT_SUCCESS(Status
))
7377 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
7379 Status
= SampSetObjectAttribute(UserObject
,
7384 if (!NT_SUCCESS(Status
))
7387 Status
= SampSetUserName(UserObject
,
7388 &Buffer
->General
.UserName
);
7389 if (!NT_SUCCESS(Status
))
7392 Status
= SampSetObjectAttributeString(UserObject
,
7394 &Buffer
->General
.FullName
);
7395 if (!NT_SUCCESS(Status
))
7398 Status
= SampSetObjectAttributeString(UserObject
,
7400 &Buffer
->General
.AdminComment
);
7401 if (!NT_SUCCESS(Status
))
7404 Status
= SampSetObjectAttributeString(UserObject
,
7406 &Buffer
->General
.UserComment
);
7414 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
7415 PSAMPR_USER_INFO_BUFFER Buffer
)
7417 SAM_USER_FIXED_DATA FixedData
;
7421 Length
= sizeof(SAM_USER_FIXED_DATA
);
7422 Status
= SampGetObjectAttribute(UserObject
,
7427 if (!NT_SUCCESS(Status
))
7430 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
7431 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
7433 Status
= SampSetObjectAttribute(UserObject
,
7438 if (!NT_SUCCESS(Status
))
7441 Status
= SampSetObjectAttributeString(UserObject
,
7443 &Buffer
->Preferences
.UserComment
);
7451 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
7452 PSAMPR_USER_INFO_BUFFER Buffer
)
7454 SAM_USER_FIXED_DATA FixedData
;
7458 Length
= sizeof(SAM_USER_FIXED_DATA
);
7459 Status
= SampGetObjectAttribute(UserObject
,
7464 if (!NT_SUCCESS(Status
))
7467 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
7469 Status
= SampSetObjectAttribute(UserObject
,
7481 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
7482 PSAMPR_USER_INFO_BUFFER Buffer
)
7484 SAM_USER_FIXED_DATA FixedData
;
7488 Length
= sizeof(SAM_USER_FIXED_DATA
);
7489 Status
= SampGetObjectAttribute(UserObject
,
7494 if (!NT_SUCCESS(Status
))
7497 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
7499 Status
= SampSetObjectAttribute(UserObject
,
7511 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
7512 PSAMPR_USER_INFO_BUFFER Buffer
)
7514 SAM_USER_FIXED_DATA FixedData
;
7518 Length
= sizeof(SAM_USER_FIXED_DATA
);
7519 Status
= SampGetObjectAttribute(UserObject
,
7524 if (!NT_SUCCESS(Status
))
7527 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
7528 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
7530 Status
= SampSetObjectAttribute(UserObject
,
7542 SampSetUserInternal1(PSAM_DB_OBJECT UserObject
,
7543 PSAMPR_USER_INFO_BUFFER Buffer
)
7545 SAM_USER_FIXED_DATA FixedData
;
7547 NTSTATUS Status
= STATUS_SUCCESS
;
7549 /* FIXME: Decrypt NT password */
7550 /* FIXME: Decrypt LM password */
7552 Status
= SampSetUserPassword(UserObject
,
7553 &Buffer
->Internal1
.EncryptedNtOwfPassword
,
7554 Buffer
->Internal1
.NtPasswordPresent
,
7555 &Buffer
->Internal1
.EncryptedLmOwfPassword
,
7556 Buffer
->Internal1
.LmPasswordPresent
);
7557 if (!NT_SUCCESS(Status
))
7560 /* Get the fixed user attributes */
7561 Length
= sizeof(SAM_USER_FIXED_DATA
);
7562 Status
= SampGetObjectAttribute(UserObject
,
7567 if (!NT_SUCCESS(Status
))
7570 if (Buffer
->Internal1
.PasswordExpired
)
7572 /* The password was last set ages ago */
7573 FixedData
.PasswordLastSet
.LowPart
= 0;
7574 FixedData
.PasswordLastSet
.HighPart
= 0;
7578 /* The password was last set right now */
7579 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7580 if (!NT_SUCCESS(Status
))
7584 /* Set the fixed user attributes */
7585 Status
= SampSetObjectAttribute(UserObject
,
7597 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
7598 PSAMPR_USER_INFO_BUFFER Buffer
)
7600 SAM_USER_FIXED_DATA FixedData
;
7603 PENCRYPTED_NT_OWF_PASSWORD NtPassword
= NULL
;
7604 PENCRYPTED_LM_OWF_PASSWORD LmPassword
= NULL
;
7605 BOOLEAN NtPasswordPresent
= FALSE
;
7606 BOOLEAN LmPasswordPresent
= FALSE
;
7607 BOOLEAN WriteFixedData
= FALSE
;
7608 NTSTATUS Status
= STATUS_SUCCESS
;
7610 WhichFields
= Buffer
->All
.WhichFields
;
7612 /* Get the fixed size attributes */
7613 Length
= sizeof(SAM_USER_FIXED_DATA
);
7614 Status
= SampGetObjectAttribute(UserObject
,
7619 if (!NT_SUCCESS(Status
))
7622 if (WhichFields
& USER_ALL_USERNAME
)
7624 Status
= SampSetUserName(UserObject
,
7625 &Buffer
->All
.UserName
);
7626 if (!NT_SUCCESS(Status
))
7630 if (WhichFields
& USER_ALL_FULLNAME
)
7632 Status
= SampSetObjectAttributeString(UserObject
,
7634 &Buffer
->All
.FullName
);
7635 if (!NT_SUCCESS(Status
))
7639 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
7641 Status
= SampSetObjectAttributeString(UserObject
,
7643 &Buffer
->All
.AdminComment
);
7644 if (!NT_SUCCESS(Status
))
7648 if (WhichFields
& USER_ALL_USERCOMMENT
)
7650 Status
= SampSetObjectAttributeString(UserObject
,
7652 &Buffer
->All
.UserComment
);
7653 if (!NT_SUCCESS(Status
))
7657 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
7659 Status
= SampSetObjectAttributeString(UserObject
,
7661 &Buffer
->All
.HomeDirectory
);
7662 if (!NT_SUCCESS(Status
))
7666 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
7668 Status
= SampSetObjectAttributeString(UserObject
,
7669 L
"HomeDirectoryDrive",
7670 &Buffer
->All
.HomeDirectoryDrive
);
7671 if (!NT_SUCCESS(Status
))
7675 if (WhichFields
& USER_ALL_SCRIPTPATH
)
7677 Status
= SampSetObjectAttributeString(UserObject
,
7679 &Buffer
->All
.ScriptPath
);
7680 if (!NT_SUCCESS(Status
))
7684 if (WhichFields
& USER_ALL_PROFILEPATH
)
7686 Status
= SampSetObjectAttributeString(UserObject
,
7688 &Buffer
->All
.ProfilePath
);
7689 if (!NT_SUCCESS(Status
))
7693 if (WhichFields
& USER_ALL_WORKSTATIONS
)
7695 Status
= SampSetObjectAttributeString(UserObject
,
7697 &Buffer
->All
.WorkStations
);
7698 if (!NT_SUCCESS(Status
))
7702 if (WhichFields
& USER_ALL_PARAMETERS
)
7704 Status
= SampSetObjectAttributeString(UserObject
,
7706 &Buffer
->All
.Parameters
);
7707 if (!NT_SUCCESS(Status
))
7711 if (WhichFields
& USER_ALL_LOGONHOURS
)
7713 Status
= SampSetLogonHoursAttrbute(UserObject
,
7714 &Buffer
->All
.LogonHours
);
7715 if (!NT_SUCCESS(Status
))
7719 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
7721 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
7722 WriteFixedData
= TRUE
;
7725 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
7727 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
7728 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
7729 WriteFixedData
= TRUE
;
7732 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
7734 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
7735 WriteFixedData
= TRUE
;
7738 if (WhichFields
& USER_ALL_COUNTRYCODE
)
7740 FixedData
.CountryCode
= Buffer
->All
.CountryCode
;
7741 WriteFixedData
= TRUE
;
7744 if (WhichFields
& USER_ALL_CODEPAGE
)
7746 FixedData
.CodePage
= Buffer
->All
.CodePage
;
7747 WriteFixedData
= TRUE
;
7750 if (WhichFields
& (USER_ALL_NTPASSWORDPRESENT
|
7751 USER_ALL_LMPASSWORDPRESENT
))
7753 if (WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
7755 NtPassword
= (PENCRYPTED_NT_OWF_PASSWORD
)Buffer
->All
.NtOwfPassword
.Buffer
;
7756 NtPasswordPresent
= Buffer
->All
.NtPasswordPresent
;
7759 if (WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
7761 LmPassword
= (PENCRYPTED_LM_OWF_PASSWORD
)Buffer
->All
.LmOwfPassword
.Buffer
;
7762 LmPasswordPresent
= Buffer
->All
.LmPasswordPresent
;
7765 Status
= SampSetUserPassword(UserObject
,
7770 if (!NT_SUCCESS(Status
))
7773 /* The password has just been set */
7774 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7775 if (!NT_SUCCESS(Status
))
7778 WriteFixedData
= TRUE
;
7781 if (WhichFields
& USER_ALL_PRIVATEDATA
)
7783 Status
= SampSetObjectAttributeString(UserObject
,
7785 &Buffer
->All
.PrivateData
);
7786 if (!NT_SUCCESS(Status
))
7790 if (WhichFields
& USER_ALL_PASSWORDEXPIRED
)
7792 if (Buffer
->All
.PasswordExpired
)
7794 /* The pasword was last set ages ago */
7795 FixedData
.PasswordLastSet
.LowPart
= 0;
7796 FixedData
.PasswordLastSet
.HighPart
= 0;
7800 /* The pasword was last set right now */
7801 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7802 if (!NT_SUCCESS(Status
))
7806 WriteFixedData
= TRUE
;
7809 if (WhichFields
& USER_ALL_SECURITYDESCRIPTOR
)
7811 Status
= SampSetObjectAttribute(UserObject
,
7814 Buffer
->All
.SecurityDescriptor
.SecurityDescriptor
,
7815 Buffer
->All
.SecurityDescriptor
.Length
);
7818 if (WriteFixedData
== TRUE
)
7820 Status
= SampSetObjectAttribute(UserObject
,
7825 if (!NT_SUCCESS(Status
))
7837 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
7838 IN USER_INFORMATION_CLASS UserInformationClass
,
7839 IN PSAMPR_USER_INFO_BUFFER Buffer
)
7841 PSAM_DB_OBJECT UserObject
;
7842 ACCESS_MASK DesiredAccess
;
7845 TRACE("SamrSetInformationUser(%p %lu %p)\n",
7846 UserHandle
, UserInformationClass
, Buffer
);
7848 switch (UserInformationClass
)
7850 case UserLogonHoursInformation
:
7851 case UserNameInformation
:
7852 case UserAccountNameInformation
:
7853 case UserFullNameInformation
:
7854 case UserPrimaryGroupInformation
:
7855 case UserHomeInformation
:
7856 case UserScriptInformation
:
7857 case UserProfileInformation
:
7858 case UserAdminCommentInformation
:
7859 case UserWorkStationsInformation
:
7860 case UserControlInformation
:
7861 case UserExpiresInformation
:
7862 case UserParametersInformation
:
7863 DesiredAccess
= USER_WRITE_ACCOUNT
;
7866 case UserGeneralInformation
:
7867 DesiredAccess
= USER_WRITE_ACCOUNT
|
7868 USER_WRITE_PREFERENCES
;
7871 case UserPreferencesInformation
:
7872 DesiredAccess
= USER_WRITE_PREFERENCES
;
7875 case UserSetPasswordInformation
:
7876 case UserInternal1Information
:
7877 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
7880 case UserAllInformation
:
7881 DesiredAccess
= 0; /* FIXME */
7885 return STATUS_INVALID_INFO_CLASS
;
7888 RtlAcquireResourceExclusive(&SampResource
,
7891 /* Validate the domain handle */
7892 Status
= SampValidateDbObject(UserHandle
,
7896 if (!NT_SUCCESS(Status
))
7898 TRACE("failed with status 0x%08lx\n", Status
);
7902 switch (UserInformationClass
)
7904 case UserGeneralInformation
:
7905 Status
= SampSetUserGeneral(UserObject
,
7909 case UserPreferencesInformation
:
7910 Status
= SampSetUserPreferences(UserObject
,
7914 case UserLogonHoursInformation
:
7915 Status
= SampSetLogonHoursAttrbute(UserObject
,
7916 &Buffer
->LogonHours
.LogonHours
);
7919 case UserNameInformation
:
7920 Status
= SampSetUserName(UserObject
,
7921 &Buffer
->Name
.UserName
);
7922 if (!NT_SUCCESS(Status
))
7925 Status
= SampSetObjectAttributeString(UserObject
,
7927 &Buffer
->Name
.FullName
);
7930 case UserAccountNameInformation
:
7931 Status
= SampSetUserName(UserObject
,
7932 &Buffer
->AccountName
.UserName
);
7935 case UserFullNameInformation
:
7936 Status
= SampSetObjectAttributeString(UserObject
,
7938 &Buffer
->FullName
.FullName
);
7941 case UserPrimaryGroupInformation
:
7942 Status
= SampSetUserPrimaryGroup(UserObject
,
7946 case UserHomeInformation
:
7947 Status
= SampSetObjectAttributeString(UserObject
,
7949 &Buffer
->Home
.HomeDirectory
);
7950 if (!NT_SUCCESS(Status
))
7953 Status
= SampSetObjectAttributeString(UserObject
,
7954 L
"HomeDirectoryDrive",
7955 &Buffer
->Home
.HomeDirectoryDrive
);
7958 case UserScriptInformation
:
7959 Status
= SampSetObjectAttributeString(UserObject
,
7961 &Buffer
->Script
.ScriptPath
);
7964 case UserProfileInformation
:
7965 Status
= SampSetObjectAttributeString(UserObject
,
7967 &Buffer
->Profile
.ProfilePath
);
7970 case UserAdminCommentInformation
:
7971 Status
= SampSetObjectAttributeString(UserObject
,
7973 &Buffer
->AdminComment
.AdminComment
);
7976 case UserWorkStationsInformation
:
7977 Status
= SampSetObjectAttributeString(UserObject
,
7979 &Buffer
->WorkStations
.WorkStations
);
7982 case UserSetPasswordInformation
:
7983 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
7984 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
7986 Status
= SampSetObjectAttributeString(UserObject
,
7988 &Buffer
->SetPassword
.Password
);
7991 case UserControlInformation
:
7992 Status
= SampSetUserControl(UserObject
,
7996 case UserExpiresInformation
:
7997 Status
= SampSetUserExpires(UserObject
,
8001 case UserInternal1Information
:
8002 Status
= SampSetUserInternal1(UserObject
,
8006 case UserParametersInformation
:
8007 Status
= SampSetObjectAttributeString(UserObject
,
8009 &Buffer
->Parameters
.Parameters
);
8012 case UserAllInformation
:
8013 Status
= SampSetUserAll(UserObject
,
8017 // case UserInternal4Information:
8018 // case UserInternal5Information:
8019 // case UserInternal4InformationNew:
8020 // case UserInternal5InformationNew:
8023 Status
= STATUS_INVALID_INFO_CLASS
;
8027 RtlReleaseResource(&SampResource
);
8036 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
8037 IN
unsigned char LmPresent
,
8038 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
8039 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
8040 IN
unsigned char NtPresent
,
8041 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
8042 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
8043 IN
unsigned char NtCrossEncryptionPresent
,
8044 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
8045 IN
unsigned char LmCrossEncryptionPresent
,
8046 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
8048 ENCRYPTED_LM_OWF_PASSWORD StoredLmPassword
;
8049 ENCRYPTED_NT_OWF_PASSWORD StoredNtPassword
;
8050 ENCRYPTED_LM_OWF_PASSWORD OldLmPassword
;
8051 ENCRYPTED_LM_OWF_PASSWORD NewLmPassword
;
8052 ENCRYPTED_NT_OWF_PASSWORD OldNtPassword
;
8053 ENCRYPTED_NT_OWF_PASSWORD NewNtPassword
;
8054 BOOLEAN StoredLmPresent
= FALSE
;
8055 BOOLEAN StoredNtPresent
= FALSE
;
8056 BOOLEAN StoredLmEmpty
= TRUE
;
8057 BOOLEAN StoredNtEmpty
= TRUE
;
8058 PSAM_DB_OBJECT UserObject
;
8060 SAM_USER_FIXED_DATA UserFixedData
;
8061 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
8062 LARGE_INTEGER SystemTime
;
8065 DBG_UNREFERENCED_LOCAL_VARIABLE(StoredLmPresent
);
8066 DBG_UNREFERENCED_LOCAL_VARIABLE(StoredNtPresent
);
8067 DBG_UNREFERENCED_LOCAL_VARIABLE(StoredLmEmpty
);
8069 TRACE("(%p %u %p %p %u %p %p %u %p %u %p)\n",
8070 UserHandle
, LmPresent
, OldLmEncryptedWithNewLm
, NewLmEncryptedWithOldLm
,
8071 NtPresent
, OldNtEncryptedWithNewNt
, NewNtEncryptedWithOldNt
, NtCrossEncryptionPresent
,
8072 NewNtEncryptedWithNewLm
, LmCrossEncryptionPresent
, NewLmEncryptedWithNewNt
);
8074 RtlAcquireResourceExclusive(&SampResource
,
8077 /* Validate the user handle */
8078 Status
= SampValidateDbObject(UserHandle
,
8080 USER_CHANGE_PASSWORD
,
8082 if (!NT_SUCCESS(Status
))
8084 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8088 /* Get the current time */
8089 Status
= NtQuerySystemTime(&SystemTime
);
8090 if (!NT_SUCCESS(Status
))
8092 TRACE("NtQuerySystemTime failed (Status 0x%08lx)\n", Status
);
8096 /* Retrieve the LM password */
8097 Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
8098 Status
= SampGetObjectAttribute(UserObject
,
8103 if (NT_SUCCESS(Status
))
8105 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
8107 StoredLmPresent
= TRUE
;
8108 if (!RtlEqualMemory(&StoredLmPassword
,
8110 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8111 StoredLmEmpty
= FALSE
;
8115 /* Retrieve the NT password */
8116 Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
8117 Status
= SampGetObjectAttribute(UserObject
,
8122 if (NT_SUCCESS(Status
))
8124 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
8126 StoredNtPresent
= TRUE
;
8127 if (!RtlEqualMemory(&StoredNtPassword
,
8129 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
8130 StoredNtEmpty
= FALSE
;
8134 /* Retrieve the fixed size user data */
8135 Length
= sizeof(SAM_USER_FIXED_DATA
);
8136 Status
= SampGetObjectAttribute(UserObject
,
8141 if (!NT_SUCCESS(Status
))
8143 TRACE("SampGetObjectAttribute failed to retrieve the fixed user data (Status 0x%08lx)\n", Status
);
8147 /* Check if we can change the password at this time */
8148 if ((StoredNtEmpty
== FALSE
) || (StoredNtEmpty
== FALSE
))
8150 /* Get fixed domain data */
8151 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8152 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
8157 if (!NT_SUCCESS(Status
))
8159 TRACE("SampGetObjectAttribute failed to retrieve the fixed domain data (Status 0x%08lx)\n", Status
);
8163 if (DomainFixedData
.MinPasswordAge
.QuadPart
> 0)
8165 if (SystemTime
.QuadPart
< (UserFixedData
.PasswordLastSet
.QuadPart
+ DomainFixedData
.MinPasswordAge
.QuadPart
))
8167 Status
= STATUS_ACCOUNT_RESTRICTION
;
8173 /* Decrypt the LM passwords, if present */
8176 Status
= SystemFunction013((const BYTE
*)NewLmEncryptedWithOldLm
,
8177 (const BYTE
*)&StoredLmPassword
,
8178 (LPBYTE
)&NewLmPassword
);
8179 if (!NT_SUCCESS(Status
))
8181 TRACE("SystemFunction013 failed (Status 0x%08lx)\n", Status
);
8185 Status
= SystemFunction013((const BYTE
*)OldLmEncryptedWithNewLm
,
8186 (const BYTE
*)&NewLmPassword
,
8187 (LPBYTE
)&OldLmPassword
);
8188 if (!NT_SUCCESS(Status
))
8190 TRACE("SystemFunction013 failed (Status 0x%08lx)\n", Status
);
8195 /* Decrypt the NT passwords, if present */
8198 Status
= SystemFunction013((const BYTE
*)NewNtEncryptedWithOldNt
,
8199 (const BYTE
*)&StoredNtPassword
,
8200 (LPBYTE
)&NewNtPassword
);
8201 if (!NT_SUCCESS(Status
))
8203 TRACE("SystemFunction013 failed (Status 0x%08lx)\n", Status
);
8207 Status
= SystemFunction013((const BYTE
*)OldNtEncryptedWithNewNt
,
8208 (const BYTE
*)&NewNtPassword
,
8209 (LPBYTE
)&OldNtPassword
);
8210 if (!NT_SUCCESS(Status
))
8212 TRACE("SystemFunction013 failed (Status 0x%08lx)\n", Status
);
8217 /* Check if the old passwords match the stored ones */
8222 if (!RtlEqualMemory(&StoredLmPassword
,
8224 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8226 TRACE("Old LM Password does not match!\n");
8227 Status
= STATUS_WRONG_PASSWORD
;
8231 if (!RtlEqualMemory(&StoredNtPassword
,
8233 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8235 TRACE("Old NT Password does not match!\n");
8236 Status
= STATUS_WRONG_PASSWORD
;
8242 if (!RtlEqualMemory(&StoredNtPassword
,
8244 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8246 TRACE("Old NT Password does not match!\n");
8247 Status
= STATUS_WRONG_PASSWORD
;
8255 if (!RtlEqualMemory(&StoredLmPassword
,
8257 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8259 TRACE("Old LM Password does not match!\n");
8260 Status
= STATUS_WRONG_PASSWORD
;
8265 Status
= STATUS_INVALID_PARAMETER
;
8269 /* Store the new password hashes */
8270 if (NT_SUCCESS(Status
))
8272 Status
= SampSetUserPassword(UserObject
,
8277 if (NT_SUCCESS(Status
))
8279 /* Update PasswordLastSet */
8280 UserFixedData
.PasswordLastSet
.QuadPart
= SystemTime
.QuadPart
;
8282 /* Set the fixed size user data */
8283 Length
= sizeof(SAM_USER_FIXED_DATA
);
8284 Status
= SampSetObjectAttribute(UserObject
,
8292 if (Status
== STATUS_WRONG_PASSWORD
)
8294 /* Update BadPasswordCount and LastBadPasswordTime */
8295 UserFixedData
.BadPasswordCount
++;
8296 UserFixedData
.LastBadPasswordTime
.QuadPart
= SystemTime
.QuadPart
;
8298 /* Set the fixed size user data */
8299 Length
= sizeof(SAM_USER_FIXED_DATA
);
8300 Status
= SampSetObjectAttribute(UserObject
,
8308 RtlReleaseResource(&SampResource
);
8317 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
8318 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
8320 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
8321 PSAM_DB_OBJECT UserObject
;
8325 TRACE("SamrGetGroupsForUser(%p %p)\n",
8326 UserHandle
, Groups
);
8328 RtlAcquireResourceShared(&SampResource
,
8331 /* Validate the user handle */
8332 Status
= SampValidateDbObject(UserHandle
,
8336 if (!NT_SUCCESS(Status
))
8338 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8342 /* Allocate the groups buffer */
8343 GroupsBuffer
= midl_user_allocate(sizeof(SAMPR_GET_GROUPS_BUFFER
));
8344 if (GroupsBuffer
== NULL
)
8346 Status
= STATUS_INSUFFICIENT_RESOURCES
;
8351 * Get the size of the Groups attribute.
8352 * Do not check the status code because in case of an error
8353 * Length will be 0. And that is all we need.
8355 SampGetObjectAttribute(UserObject
,
8361 /* If there is no Groups attribute, return a groups buffer without an array */
8364 GroupsBuffer
->MembershipCount
= 0;
8365 GroupsBuffer
->Groups
= NULL
;
8367 *Groups
= GroupsBuffer
;
8369 Status
= STATUS_SUCCESS
;
8373 /* Allocate a buffer for the Groups attribute */
8374 GroupsBuffer
->Groups
= midl_user_allocate(Length
);
8375 if (GroupsBuffer
->Groups
== NULL
)
8377 Status
= STATUS_INSUFFICIENT_RESOURCES
;
8381 /* Retrieve the Grous attribute */
8382 Status
= SampGetObjectAttribute(UserObject
,
8385 GroupsBuffer
->Groups
,
8387 if (!NT_SUCCESS(Status
))
8389 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8393 /* Calculate the membership count */
8394 GroupsBuffer
->MembershipCount
= Length
/ sizeof(GROUP_MEMBERSHIP
);
8396 /* Return the groups buffer to the caller */
8397 *Groups
= GroupsBuffer
;
8400 if (!NT_SUCCESS(Status
))
8402 if (GroupsBuffer
!= NULL
)
8404 if (GroupsBuffer
->Groups
!= NULL
)
8405 midl_user_free(GroupsBuffer
->Groups
);
8407 midl_user_free(GroupsBuffer
);
8411 RtlReleaseResource(&SampResource
);
8420 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
8421 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8422 IN
unsigned long Index
,
8423 IN
unsigned long EntryCount
,
8424 IN
unsigned long PreferredMaximumLength
,
8425 OUT
unsigned long *TotalAvailable
,
8426 OUT
unsigned long *TotalReturned
,
8427 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8430 return STATUS_NOT_IMPLEMENTED
;
8436 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
8437 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8438 IN PRPC_UNICODE_STRING Prefix
,
8439 OUT
unsigned long *Index
)
8442 return STATUS_NOT_IMPLEMENTED
;
8448 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
8451 return STATUS_NOT_IMPLEMENTED
;
8457 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
8460 return STATUS_NOT_IMPLEMENTED
;
8467 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
8468 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
8470 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
8471 SAM_USER_FIXED_DATA UserFixedData
;
8472 PSAM_DB_OBJECT DomainObject
;
8473 PSAM_DB_OBJECT UserObject
;
8478 UserHandle
, PasswordInformation
);
8480 RtlAcquireResourceShared(&SampResource
,
8483 /* Validate the user handle */
8484 Status
= SampValidateDbObject(UserHandle
,
8488 if (!NT_SUCCESS(Status
))
8490 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8494 /* Validate the domain object */
8495 Status
= SampValidateDbObject((SAMPR_HANDLE
)UserObject
->ParentObject
,
8497 DOMAIN_READ_PASSWORD_PARAMETERS
,
8499 if (!NT_SUCCESS(Status
))
8501 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8505 /* Get fixed user data */
8506 Length
= sizeof(SAM_USER_FIXED_DATA
);
8507 Status
= SampGetObjectAttribute(UserObject
,
8510 (PVOID
)&UserFixedData
,
8512 if (!NT_SUCCESS(Status
))
8514 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8518 if ((UserObject
->RelativeId
== DOMAIN_USER_RID_KRBTGT
) ||
8519 (UserFixedData
.UserAccountControl
& (USER_INTERDOMAIN_TRUST_ACCOUNT
|
8520 USER_WORKSTATION_TRUST_ACCOUNT
|
8521 USER_SERVER_TRUST_ACCOUNT
)))
8523 PasswordInformation
->MinPasswordLength
= 0;
8524 PasswordInformation
->PasswordProperties
= 0;
8528 /* Get fixed domain data */
8529 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8530 Status
= SampGetObjectAttribute(DomainObject
,
8533 (PVOID
)&DomainFixedData
,
8535 if (!NT_SUCCESS(Status
))
8537 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8541 PasswordInformation
->MinPasswordLength
= DomainFixedData
.MinPasswordLength
;
8542 PasswordInformation
->PasswordProperties
= DomainFixedData
.PasswordProperties
;
8546 RtlReleaseResource(&SampResource
);
8548 return STATUS_SUCCESS
;
8555 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
8556 IN PRPC_SID MemberSid
)
8558 PSAM_DB_OBJECT DomainObject
;
8563 DomainHandle
, MemberSid
);
8565 RtlAcquireResourceExclusive(&SampResource
,
8568 /* Validate the domain object */
8569 Status
= SampValidateDbObject(DomainHandle
,
8573 if (!NT_SUCCESS(Status
))
8575 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8579 /* Retrieve the RID from the MemberSID */
8580 Status
= SampGetRidFromSid((PSID
)MemberSid
,
8582 if (!NT_SUCCESS(Status
))
8584 TRACE("SampGetRidFromSid failed with status 0x%08lx\n", Status
);
8588 /* Fail, if the RID represents a special account */
8591 TRACE("Cannot remove a special account (RID: %lu)\n", Rid
);
8592 Status
= STATUS_SPECIAL_ACCOUNT
;
8596 /* Remove the member from all aliases in the domain */
8597 Status
= SampRemoveMemberFromAllAliases(DomainObject
,
8599 if (!NT_SUCCESS(Status
))
8601 TRACE("SampRemoveMemberFromAllAliases failed with status 0x%08lx\n", Status
);
8605 RtlReleaseResource(&SampResource
);
8614 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
8615 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
8616 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
8618 TRACE("(%p %lu %p)\n", DomainHandle
, DomainInformationClass
, Buffer
);
8620 return SamrQueryInformationDomain(DomainHandle
,
8621 DomainInformationClass
,
8629 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
8630 IN USER_INFORMATION_CLASS UserInformationClass
,
8631 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
8633 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
8635 return SamrQueryInformationUser(UserHandle
,
8636 UserInformationClass
,
8644 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
8645 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8646 IN
unsigned long Index
,
8647 IN
unsigned long EntryCount
,
8648 IN
unsigned long PreferredMaximumLength
,
8649 OUT
unsigned long *TotalAvailable
,
8650 OUT
unsigned long *TotalReturned
,
8651 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8653 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
8654 DomainHandle
, DisplayInformationClass
, Index
,
8655 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
8656 TotalReturned
, Buffer
);
8658 return SamrQueryDisplayInformation(DomainHandle
,
8659 DisplayInformationClass
,
8662 PreferredMaximumLength
,
8672 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
8673 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8674 IN PRPC_UNICODE_STRING Prefix
,
8675 OUT
unsigned long *Index
)
8677 TRACE("(%p %lu %p %p)\n",
8678 DomainHandle
, DisplayInformationClass
, Prefix
, Index
);
8680 return SamrGetDisplayEnumerationIndex(DomainHandle
,
8681 DisplayInformationClass
,
8690 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
8691 IN PRPC_UNICODE_STRING Name
,
8692 IN
unsigned long AccountType
,
8693 IN ACCESS_MASK DesiredAccess
,
8694 OUT SAMPR_HANDLE
*UserHandle
,
8695 OUT
unsigned long *GrantedAccess
,
8696 OUT
unsigned long *RelativeId
)
8698 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
8699 SAM_USER_FIXED_DATA FixedUserData
;
8700 PSAM_DB_OBJECT DomainObject
;
8701 PSAM_DB_OBJECT UserObject
;
8702 GROUP_MEMBERSHIP GroupMembership
;
8703 UCHAR LogonHours
[23];
8707 PSECURITY_DESCRIPTOR Sd
= NULL
;
8709 PSID UserSid
= NULL
;
8712 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
8713 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
8716 Name
->Length
== 0 ||
8717 Name
->Buffer
== NULL
||
8718 UserHandle
== NULL
||
8720 return STATUS_INVALID_PARAMETER
;
8722 /* Check for valid account type */
8723 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
8724 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
8725 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
8726 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
8727 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
8728 return STATUS_INVALID_PARAMETER
;
8730 /* Map generic access rights */
8731 RtlMapGenericMask(&DesiredAccess
,
8734 RtlAcquireResourceExclusive(&SampResource
,
8737 /* Validate the domain handle */
8738 Status
= SampValidateDbObject(DomainHandle
,
8742 if (!NT_SUCCESS(Status
))
8744 TRACE("failed with status 0x%08lx\n", Status
);
8748 /* Check the user account name */
8749 Status
= SampCheckAccountName(Name
, 20);
8750 if (!NT_SUCCESS(Status
))
8752 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
8756 /* Check if the user name already exists in the domain */
8757 Status
= SampCheckAccountNameInDomain(DomainObject
,
8759 if (!NT_SUCCESS(Status
))
8761 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
8762 Name
->Buffer
, Status
);
8766 /* Get the fixed domain attributes */
8767 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8768 Status
= SampGetObjectAttribute(DomainObject
,
8771 (PVOID
)&FixedDomainData
,
8773 if (!NT_SUCCESS(Status
))
8775 TRACE("failed with status 0x%08lx\n", Status
);
8779 /* Increment the NextRid attribute */
8780 ulRid
= FixedDomainData
.NextRid
;
8781 FixedDomainData
.NextRid
++;
8783 TRACE("RID: %lx\n", ulRid
);
8785 /* Create the user SID */
8786 Status
= SampCreateAccountSid(DomainObject
,
8789 if (!NT_SUCCESS(Status
))
8791 TRACE("SampCreateAccountSid failed (Status 0x%08lx)\n", Status
);
8795 /* Create the security descriptor */
8796 Status
= SampCreateUserSD(UserSid
,
8799 if (!NT_SUCCESS(Status
))
8801 TRACE("SampCreateUserSD failed (Status 0x%08lx)\n", Status
);
8805 /* Store the fixed domain attributes */
8806 Status
= SampSetObjectAttribute(DomainObject
,
8811 if (!NT_SUCCESS(Status
))
8813 TRACE("failed with status 0x%08lx\n", Status
);
8817 /* Convert the RID into a string (hex) */
8818 swprintf(szRid
, L
"%08lX", ulRid
);
8820 /* Create the user object */
8821 Status
= SampCreateDbObject(DomainObject
,
8828 if (!NT_SUCCESS(Status
))
8830 TRACE("failed with status 0x%08lx\n", Status
);
8834 /* Add the account name for the user object */
8835 Status
= SampSetAccountNameInDomain(DomainObject
,
8839 if (!NT_SUCCESS(Status
))
8841 TRACE("failed with status 0x%08lx\n", Status
);
8845 /* Initialize fixed user data */
8846 FixedUserData
.Version
= 1;
8847 FixedUserData
.Reserved
= 0;
8848 FixedUserData
.LastLogon
.QuadPart
= 0;
8849 FixedUserData
.LastLogoff
.QuadPart
= 0;
8850 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
8851 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
8852 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
8853 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
8854 FixedUserData
.UserId
= ulRid
;
8855 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
8856 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
8857 USER_PASSWORD_NOT_REQUIRED
|
8859 FixedUserData
.CountryCode
= 0;
8860 FixedUserData
.CodePage
= 0;
8861 FixedUserData
.BadPasswordCount
= 0;
8862 FixedUserData
.LogonCount
= 0;
8863 FixedUserData
.AdminCount
= 0;
8864 FixedUserData
.OperatorCount
= 0;
8866 /* Set fixed user data attribute */
8867 Status
= SampSetObjectAttribute(UserObject
,
8870 (LPVOID
)&FixedUserData
,
8871 sizeof(SAM_USER_FIXED_DATA
));
8872 if (!NT_SUCCESS(Status
))
8874 TRACE("failed with status 0x%08lx\n", Status
);
8878 /* Set the Name attribute */
8879 Status
= SampSetObjectAttributeString(UserObject
,
8882 if (!NT_SUCCESS(Status
))
8884 TRACE("failed with status 0x%08lx\n", Status
);
8888 /* Set the FullName attribute */
8889 Status
= SampSetObjectAttributeString(UserObject
,
8892 if (!NT_SUCCESS(Status
))
8894 TRACE("failed with status 0x%08lx\n", Status
);
8898 /* Set the HomeDirectory attribute */
8899 Status
= SampSetObjectAttributeString(UserObject
,
8902 if (!NT_SUCCESS(Status
))
8904 TRACE("failed with status 0x%08lx\n", Status
);
8908 /* Set the HomeDirectoryDrive attribute */
8909 Status
= SampSetObjectAttributeString(UserObject
,
8910 L
"HomeDirectoryDrive",
8912 if (!NT_SUCCESS(Status
))
8914 TRACE("failed with status 0x%08lx\n", Status
);
8918 /* Set the ScriptPath attribute */
8919 Status
= SampSetObjectAttributeString(UserObject
,
8922 if (!NT_SUCCESS(Status
))
8924 TRACE("failed with status 0x%08lx\n", Status
);
8928 /* Set the ProfilePath attribute */
8929 Status
= SampSetObjectAttributeString(UserObject
,
8932 if (!NT_SUCCESS(Status
))
8934 TRACE("failed with status 0x%08lx\n", Status
);
8938 /* Set the AdminComment attribute */
8939 Status
= SampSetObjectAttributeString(UserObject
,
8942 if (!NT_SUCCESS(Status
))
8944 TRACE("failed with status 0x%08lx\n", Status
);
8948 /* Set the UserComment attribute */
8949 Status
= SampSetObjectAttributeString(UserObject
,
8952 if (!NT_SUCCESS(Status
))
8954 TRACE("failed with status 0x%08lx\n", Status
);
8958 /* Set the WorkStations attribute */
8959 Status
= SampSetObjectAttributeString(UserObject
,
8962 if (!NT_SUCCESS(Status
))
8964 TRACE("failed with status 0x%08lx\n", Status
);
8968 /* Set the Parameters attribute */
8969 Status
= SampSetObjectAttributeString(UserObject
,
8972 if (!NT_SUCCESS(Status
))
8974 TRACE("failed with status 0x%08lx\n", Status
);
8978 /* Set LogonHours attribute*/
8979 *((PUSHORT
)LogonHours
) = 168;
8980 memset(&(LogonHours
[2]), 0xff, 21);
8982 Status
= SampSetObjectAttribute(UserObject
,
8986 sizeof(LogonHours
));
8987 if (!NT_SUCCESS(Status
))
8989 TRACE("failed with status 0x%08lx\n", Status
);
8993 /* Set Groups attribute*/
8994 GroupMembership
.RelativeId
= DOMAIN_GROUP_RID_USERS
;
8995 GroupMembership
.Attributes
= SE_GROUP_MANDATORY
|
8997 SE_GROUP_ENABLED_BY_DEFAULT
;
8999 Status
= SampSetObjectAttribute(UserObject
,
9003 sizeof(GROUP_MEMBERSHIP
));
9004 if (!NT_SUCCESS(Status
))
9006 TRACE("failed with status 0x%08lx\n", Status
);
9010 /* Set LMPwd attribute*/
9011 Status
= SampSetObjectAttribute(UserObject
,
9016 if (!NT_SUCCESS(Status
))
9018 TRACE("failed with status 0x%08lx\n", Status
);
9022 /* Set NTPwd attribute*/
9023 Status
= SampSetObjectAttribute(UserObject
,
9028 if (!NT_SUCCESS(Status
))
9030 TRACE("failed with status 0x%08lx\n", Status
);
9034 /* Set LMPwdHistory attribute*/
9035 Status
= SampSetObjectAttribute(UserObject
,
9040 if (!NT_SUCCESS(Status
))
9042 TRACE("failed with status 0x%08lx\n", Status
);
9046 /* Set NTPwdHistory attribute*/
9047 Status
= SampSetObjectAttribute(UserObject
,
9052 if (!NT_SUCCESS(Status
))
9054 TRACE("failed with status 0x%08lx\n", Status
);
9058 /* Set the PrivateData attribute */
9059 Status
= SampSetObjectAttributeString(UserObject
,
9062 if (!NT_SUCCESS(Status
))
9064 TRACE("failed with status 0x%08lx\n", Status
);
9068 /* Set the SecDesc attribute*/
9069 Status
= SampSetObjectAttribute(UserObject
,
9074 if (!NT_SUCCESS(Status
))
9076 TRACE("failed with status 0x%08lx\n", Status
);
9080 if (NT_SUCCESS(Status
))
9082 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
9083 *RelativeId
= ulRid
;
9084 *GrantedAccess
= UserObject
->Access
;
9089 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
9091 if (UserSid
!= NULL
)
9092 RtlFreeHeap(RtlGetProcessHeap(), 0, UserSid
);
9094 RtlReleaseResource(&SampResource
);
9096 TRACE("returns with status 0x%08lx\n", Status
);
9105 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
9106 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
9107 IN
unsigned long Index
,
9108 IN
unsigned long EntryCount
,
9109 IN
unsigned long PreferredMaximumLength
,
9110 OUT
unsigned long *TotalAvailable
,
9111 OUT
unsigned long *TotalReturned
,
9112 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
9114 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
9115 DomainHandle
, DisplayInformationClass
, Index
,
9116 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
9117 TotalReturned
, Buffer
);
9119 return SamrQueryDisplayInformation(DomainHandle
,
9120 DisplayInformationClass
,
9123 PreferredMaximumLength
,
9133 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
9134 IN PSAMPR_PSID_ARRAY MembersBuffer
)
9137 NTSTATUS Status
= STATUS_SUCCESS
;
9139 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
9140 AliasHandle
, MembersBuffer
);
9142 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
9144 Status
= SamrAddMemberToAlias(AliasHandle
,
9145 ((PSID
*)MembersBuffer
->Sids
)[i
]);
9147 if (Status
== STATUS_MEMBER_IN_ALIAS
)
9148 Status
= STATUS_SUCCESS
;
9150 if (!NT_SUCCESS(Status
))
9161 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
9162 IN PSAMPR_PSID_ARRAY MembersBuffer
)
9165 NTSTATUS Status
= STATUS_SUCCESS
;
9167 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
9168 AliasHandle
, MembersBuffer
);
9170 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
9172 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
9173 ((PSID
*)MembersBuffer
->Sids
)[i
]);
9175 if (Status
== STATUS_MEMBER_IN_ALIAS
)
9176 Status
= STATUS_SUCCESS
;
9178 if (!NT_SUCCESS(Status
))
9189 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
9190 IN PRPC_STRING ServerName
,
9191 IN PRPC_STRING UserName
,
9192 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
9193 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
9196 return STATUS_NOT_IMPLEMENTED
;
9202 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
9203 IN PRPC_UNICODE_STRING ServerName
,
9204 IN PRPC_UNICODE_STRING UserName
,
9205 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
9206 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
9207 IN
unsigned char LmPresent
,
9208 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
9209 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
9212 return STATUS_NOT_IMPLEMENTED
;
9218 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
9219 IN PRPC_UNICODE_STRING Unused
,
9220 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
9223 return STATUS_NOT_IMPLEMENTED
;
9230 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
9231 OUT SAMPR_HANDLE
*ServerHandle
,
9232 IN ACCESS_MASK DesiredAccess
)
9234 TRACE("(%p %p %lx)\n", ServerName
, ServerHandle
, DesiredAccess
);
9236 return SamrConnect(ServerName
,
9245 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
9246 IN USER_INFORMATION_CLASS UserInformationClass
,
9247 IN PSAMPR_USER_INFO_BUFFER Buffer
)
9249 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
9251 return SamrSetInformationUser(UserHandle
,
9252 UserInformationClass
,
9260 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
9263 return STATUS_NOT_IMPLEMENTED
;
9269 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
9272 return STATUS_NOT_IMPLEMENTED
;
9278 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
9281 return STATUS_NOT_IMPLEMENTED
;
9287 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
9288 OUT SAMPR_HANDLE
*ServerHandle
,
9289 IN
unsigned long ClientRevision
,
9290 IN ACCESS_MASK DesiredAccess
)
9293 return STATUS_NOT_IMPLEMENTED
;
9299 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
9302 return STATUS_NOT_IMPLEMENTED
;
9308 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
9309 IN ACCESS_MASK DesiredAccess
,
9310 IN
unsigned long InVersion
,
9311 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
9312 OUT
unsigned long *OutVersion
,
9313 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
9314 OUT SAMPR_HANDLE
*ServerHandle
)
9317 return STATUS_NOT_IMPLEMENTED
;
9323 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
9324 IN
unsigned long Rid
,
9328 return STATUS_NOT_IMPLEMENTED
;
9334 SamrSetDSRMPassword(IN handle_t BindingHandle
,
9335 IN PRPC_UNICODE_STRING Unused
,
9336 IN
unsigned long UserId
,
9337 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
9340 return STATUS_NOT_IMPLEMENTED
;
9346 SamrValidatePassword(IN handle_t Handle
,
9347 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
9348 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
9349 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
9352 return STATUS_NOT_IMPLEMENTED
;