2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Security Account Manager (SAM) Server
4 * FILE: reactos/dll/win32/samsrv/samrpc.c
5 * PURPOSE: RPC interface functions
7 * PROGRAMMERS: Eric Kohl
10 /* INCLUDES ******************************************************************/
14 WINE_DEFAULT_DEBUG_CHANNEL(samsrv
);
16 /* GLOBALS *******************************************************************/
18 static SID_IDENTIFIER_AUTHORITY NtSidAuthority
= {SECURITY_NT_AUTHORITY
};
20 static GENERIC_MAPPING ServerMapping
=
28 static GENERIC_MAPPING DomainMapping
=
36 static GENERIC_MAPPING AliasMapping
=
44 static GENERIC_MAPPING GroupMapping
=
52 static GENERIC_MAPPING UserMapping
=
60 PGENERIC_MAPPING pServerMapping
= &ServerMapping
;
63 /* FUNCTIONS *****************************************************************/
66 SampStartRpcServer(VOID
)
70 TRACE("SampStartRpcServer() called\n");
72 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
76 if (Status
!= RPC_S_OK
)
78 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
82 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
85 if (Status
!= RPC_S_OK
)
87 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
91 Status
= RpcServerListen(1, 20, TRUE
);
92 if (Status
!= RPC_S_OK
)
94 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
98 TRACE("SampStartRpcServer() done\n");
102 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
104 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
108 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
110 HeapFree(GetProcessHeap(), 0, ptr
);
114 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
122 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
123 OUT SAMPR_HANDLE
*ServerHandle
,
124 IN ACCESS_MASK DesiredAccess
)
126 PSAM_DB_OBJECT ServerObject
;
129 TRACE("SamrConnect(%p %p %lx)\n",
130 ServerName
, ServerHandle
, DesiredAccess
);
132 /* Map generic access rights */
133 RtlMapGenericMask(&DesiredAccess
,
136 /* Open the Server Object */
137 Status
= SampOpenDbObject(NULL
,
144 if (NT_SUCCESS(Status
))
145 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
147 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
156 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
158 PSAM_DB_OBJECT DbObject
;
159 NTSTATUS Status
= STATUS_SUCCESS
;
161 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
163 Status
= SampValidateDbObject(*SamHandle
,
167 if (Status
== STATUS_SUCCESS
)
169 Status
= SampCloseDbObject(DbObject
);
173 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
182 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
183 IN SECURITY_INFORMATION SecurityInformation
,
184 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
187 return STATUS_NOT_IMPLEMENTED
;
194 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
195 IN SECURITY_INFORMATION SecurityInformation
,
196 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
*SecurityDescriptor
)
199 return STATUS_NOT_IMPLEMENTED
;
206 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
209 return STATUS_NOT_IMPLEMENTED
;
216 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
217 IN PRPC_UNICODE_STRING Name
,
218 OUT PRPC_SID
*DomainId
)
220 PSAM_DB_OBJECT ServerObject
;
221 HANDLE DomainsKeyHandle
= NULL
;
222 HANDLE DomainKeyHandle
= NULL
;
223 WCHAR DomainKeyName
[64];
225 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
226 UNICODE_STRING DomainName
;
231 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
232 ServerHandle
, Name
, DomainId
);
234 /* Validate the server handle */
235 Status
= SampValidateDbObject(ServerHandle
,
237 SAM_SERVER_LOOKUP_DOMAIN
,
239 if (!NT_SUCCESS(Status
))
244 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
248 if (!NT_SUCCESS(Status
))
252 while (Found
== FALSE
)
254 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
258 if (!NT_SUCCESS(Status
))
260 if (Status
== STATUS_NO_MORE_ENTRIES
)
261 Status
= STATUS_NO_SUCH_DOMAIN
;
265 TRACE("Domain key name: %S\n", DomainKeyName
);
267 Status
= SampRegOpenKey(DomainsKeyHandle
,
271 if (NT_SUCCESS(Status
))
273 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
274 Status
= SampRegQueryValue(DomainKeyHandle
,
277 (PVOID
)&DomainNameString
,
279 if (NT_SUCCESS(Status
))
281 TRACE("Domain name: %S\n", DomainNameString
);
283 RtlInitUnicodeString(&DomainName
,
285 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
287 TRACE("Found it!\n");
290 Status
= SampRegQueryValue(DomainKeyHandle
,
295 if (NT_SUCCESS(Status
))
297 *DomainId
= midl_user_allocate(Length
);
299 SampRegQueryValue(DomainKeyHandle
,
305 Status
= STATUS_SUCCESS
;
311 NtClose(DomainKeyHandle
);
317 NtClose(DomainsKeyHandle
);
326 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
327 IN OUT
unsigned long *EnumerationContext
,
328 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
329 IN ULONG PreferedMaximumLength
,
330 OUT PULONG CountReturned
)
332 PSAM_DB_OBJECT ServerObject
;
333 WCHAR DomainKeyName
[64];
334 HANDLE DomainsKeyHandle
;
335 HANDLE DomainKeyHandle
;
338 ULONG RequiredLength
;
341 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
344 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
345 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
348 /* Validate the server handle */
349 Status
= SampValidateDbObject(ServerHandle
,
351 SAM_SERVER_ENUMERATE_DOMAINS
,
353 if (!NT_SUCCESS(Status
))
356 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
360 if (!NT_SUCCESS(Status
))
363 EnumIndex
= *EnumerationContext
;
369 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
373 if (!NT_SUCCESS(Status
))
376 TRACE("EnumIndex: %lu\n", EnumIndex
);
377 TRACE("Domain key name: %S\n", DomainKeyName
);
379 Status
= SampRegOpenKey(DomainsKeyHandle
,
383 TRACE("SampRegOpenKey returned %08lX\n", Status
);
384 if (NT_SUCCESS(Status
))
387 Status
= SampRegQueryValue(DomainKeyHandle
,
392 TRACE("SampRegQueryValue returned %08lX\n", Status
);
393 if (NT_SUCCESS(Status
))
395 TRACE("Data length: %lu\n", DataLength
);
397 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
400 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
404 NtClose(DomainKeyHandle
);
410 TRACE("EnumCount: %lu\n", EnumCount
);
411 TRACE("RequiredLength: %lu\n", RequiredLength
);
413 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
414 if (EnumBuffer
== NULL
)
416 Status
= STATUS_INSUFFICIENT_RESOURCES
;
420 EnumBuffer
->EntriesRead
= EnumCount
;
421 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
422 if (EnumBuffer
->Buffer
== NULL
)
424 Status
= STATUS_INSUFFICIENT_RESOURCES
;
428 EnumIndex
= *EnumerationContext
;
429 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
431 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
435 if (!NT_SUCCESS(Status
))
438 TRACE("EnumIndex: %lu\n", EnumIndex
);
439 TRACE("Domain key name: %S\n", DomainKeyName
);
441 Status
= SampRegOpenKey(DomainsKeyHandle
,
445 TRACE("SampRegOpenKey returned %08lX\n", Status
);
446 if (NT_SUCCESS(Status
))
449 Status
= SampRegQueryValue(DomainKeyHandle
,
454 TRACE("SampRegQueryValue returned %08lX\n", Status
);
455 if (NT_SUCCESS(Status
))
457 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
458 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
459 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
460 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
461 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
463 NtClose(DomainKeyHandle
);
464 Status
= STATUS_INSUFFICIENT_RESOURCES
;
468 Status
= SampRegQueryValue(DomainKeyHandle
,
471 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
473 TRACE("SampRegQueryValue returned %08lX\n", Status
);
474 if (NT_SUCCESS(Status
))
476 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
480 NtClose(DomainKeyHandle
);
482 if (!NT_SUCCESS(Status
))
487 if (NT_SUCCESS(Status
))
489 *EnumerationContext
+= EnumCount
;
490 *Buffer
= EnumBuffer
;
491 *CountReturned
= EnumCount
;
495 if (!NT_SUCCESS(Status
))
497 *EnumerationContext
= 0;
501 if (EnumBuffer
!= NULL
)
503 if (EnumBuffer
->Buffer
!= NULL
)
505 if (EnumBuffer
->EntriesRead
!= 0)
507 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
509 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
510 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
514 midl_user_free(EnumBuffer
->Buffer
);
517 midl_user_free(EnumBuffer
);
521 NtClose(DomainsKeyHandle
);
530 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
531 IN ACCESS_MASK DesiredAccess
,
532 IN PRPC_SID DomainId
,
533 OUT SAMPR_HANDLE
*DomainHandle
)
535 PSAM_DB_OBJECT ServerObject
;
536 PSAM_DB_OBJECT DomainObject
;
539 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
540 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
542 /* Map generic access rights */
543 RtlMapGenericMask(&DesiredAccess
,
546 /* Validate the server handle */
547 Status
= SampValidateDbObject(ServerHandle
,
549 SAM_SERVER_LOOKUP_DOMAIN
,
551 if (!NT_SUCCESS(Status
))
554 /* Validate the Domain SID */
555 if ((DomainId
->Revision
!= SID_REVISION
) ||
556 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
557 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
558 return STATUS_INVALID_PARAMETER
;
560 /* Open the domain object */
561 if ((DomainId
->SubAuthorityCount
== 1) &&
562 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
564 /* Builtin domain object */
565 TRACE("Opening the builtin domain object.\n");
567 Status
= SampOpenDbObject(ServerObject
,
575 else if ((DomainId
->SubAuthorityCount
== 4) &&
576 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
578 /* Account domain object */
579 TRACE("Opening the account domain object.\n");
581 /* FIXME: Check the account domain sub authorities!!! */
583 Status
= SampOpenDbObject(ServerObject
,
593 /* No vaild domain SID */
594 Status
= STATUS_INVALID_PARAMETER
;
597 if (NT_SUCCESS(Status
))
598 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
600 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
607 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
608 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
610 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
611 SAM_DOMAIN_FIXED_DATA FixedData
;
617 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
618 if (InfoBuffer
== NULL
)
619 return STATUS_INSUFFICIENT_RESOURCES
;
621 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
622 Status
= SampGetObjectAttribute(DomainObject
,
627 if (!NT_SUCCESS(Status
))
630 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
631 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
632 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
633 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
634 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
635 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
636 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
638 *Buffer
= InfoBuffer
;
641 if (!NT_SUCCESS(Status
))
643 if (InfoBuffer
!= NULL
)
645 midl_user_free(InfoBuffer
);
654 SampGetNumberOfAccounts(PSAM_DB_OBJECT DomainObject
,
658 HANDLE AccountKeyHandle
= NULL
;
659 HANDLE NamesKeyHandle
= NULL
;
664 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
668 if (!NT_SUCCESS(Status
))
671 Status
= SampRegOpenKey(AccountKeyHandle
,
675 if (!NT_SUCCESS(Status
))
678 Status
= SampRegQueryKeyInfo(NamesKeyHandle
,
682 if (NamesKeyHandle
!= NULL
)
683 SampRegCloseKey(NamesKeyHandle
);
685 if (AccountKeyHandle
!= NULL
)
686 SampRegCloseKey(AccountKeyHandle
);
693 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
694 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
696 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
697 SAM_DOMAIN_FIXED_DATA FixedData
;
703 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
704 if (InfoBuffer
== NULL
)
705 return STATUS_INSUFFICIENT_RESOURCES
;
707 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
708 Status
= SampGetObjectAttribute(DomainObject
,
713 if (!NT_SUCCESS(Status
))
716 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
717 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
718 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
719 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
720 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
721 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
722 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
724 /* Get the OemInformation string */
725 Status
= SampGetObjectAttributeString(DomainObject
,
727 &InfoBuffer
->General
.OemInformation
);
728 if (!NT_SUCCESS(Status
))
730 TRACE("Status 0x%08lx\n", Status
);
734 /* Get the Name string */
735 Status
= SampGetObjectAttributeString(DomainObject
,
737 &InfoBuffer
->General
.DomainName
);
738 if (!NT_SUCCESS(Status
))
740 TRACE("Status 0x%08lx\n", Status
);
744 /* Get the ReplicaSourceNodeName string */
745 Status
= SampGetObjectAttributeString(DomainObject
,
746 L
"ReplicaSourceNodeName",
747 &InfoBuffer
->General
.ReplicaSourceNodeName
);
748 if (!NT_SUCCESS(Status
))
750 TRACE("Status 0x%08lx\n", Status
);
754 /* Get the number of Users in the Domain */
755 Status
= SampGetNumberOfAccounts(DomainObject
,
757 &InfoBuffer
->General
.UserCount
);
758 if (!NT_SUCCESS(Status
))
760 TRACE("Status 0x%08lx\n", Status
);
764 /* Get the number of Groups in the Domain */
765 Status
= SampGetNumberOfAccounts(DomainObject
,
767 &InfoBuffer
->General
.GroupCount
);
768 if (!NT_SUCCESS(Status
))
770 TRACE("Status 0x%08lx\n", Status
);
774 /* Get the number of Aliases in the Domain */
775 Status
= SampGetNumberOfAccounts(DomainObject
,
777 &InfoBuffer
->General
.AliasCount
);
778 if (!NT_SUCCESS(Status
))
780 TRACE("Status 0x%08lx\n", Status
);
784 *Buffer
= InfoBuffer
;
787 if (!NT_SUCCESS(Status
))
789 if (InfoBuffer
!= NULL
)
791 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
792 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
794 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
795 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
797 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
798 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
800 midl_user_free(InfoBuffer
);
809 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
810 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
812 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
813 SAM_DOMAIN_FIXED_DATA FixedData
;
819 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
820 if (InfoBuffer
== NULL
)
821 return STATUS_INSUFFICIENT_RESOURCES
;
823 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
824 Status
= SampGetObjectAttribute(DomainObject
,
829 if (!NT_SUCCESS(Status
))
832 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
833 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
835 *Buffer
= InfoBuffer
;
838 if (!NT_SUCCESS(Status
))
840 if (InfoBuffer
!= NULL
)
842 midl_user_free(InfoBuffer
);
851 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
852 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
854 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
859 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
860 if (InfoBuffer
== NULL
)
861 return STATUS_INSUFFICIENT_RESOURCES
;
863 /* Get the OemInformation string */
864 Status
= SampGetObjectAttributeString(DomainObject
,
866 &InfoBuffer
->Oem
.OemInformation
);
867 if (!NT_SUCCESS(Status
))
869 TRACE("Status 0x%08lx\n", Status
);
873 *Buffer
= InfoBuffer
;
876 if (!NT_SUCCESS(Status
))
878 if (InfoBuffer
!= NULL
)
880 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
881 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
883 midl_user_free(InfoBuffer
);
892 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
893 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
895 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
900 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
901 if (InfoBuffer
== NULL
)
902 return STATUS_INSUFFICIENT_RESOURCES
;
904 /* Get the Name string */
905 Status
= SampGetObjectAttributeString(DomainObject
,
907 &InfoBuffer
->Name
.DomainName
);
908 if (!NT_SUCCESS(Status
))
910 TRACE("Status 0x%08lx\n", Status
);
914 *Buffer
= InfoBuffer
;
917 if (!NT_SUCCESS(Status
))
919 if (InfoBuffer
!= NULL
)
921 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
922 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
924 midl_user_free(InfoBuffer
);
933 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
934 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
936 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
941 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
942 if (InfoBuffer
== NULL
)
943 return STATUS_INSUFFICIENT_RESOURCES
;
945 /* Get the ReplicaSourceNodeName string */
946 Status
= SampGetObjectAttributeString(DomainObject
,
947 L
"ReplicaSourceNodeName",
948 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
949 if (!NT_SUCCESS(Status
))
951 TRACE("Status 0x%08lx\n", Status
);
955 *Buffer
= InfoBuffer
;
958 if (!NT_SUCCESS(Status
))
960 if (InfoBuffer
!= NULL
)
962 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
963 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
965 midl_user_free(InfoBuffer
);
974 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
975 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
977 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
978 SAM_DOMAIN_FIXED_DATA FixedData
;
984 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
985 if (InfoBuffer
== NULL
)
986 return STATUS_INSUFFICIENT_RESOURCES
;
988 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
989 Status
= SampGetObjectAttribute(DomainObject
,
994 if (!NT_SUCCESS(Status
))
997 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
999 *Buffer
= InfoBuffer
;
1002 if (!NT_SUCCESS(Status
))
1004 if (InfoBuffer
!= NULL
)
1006 midl_user_free(InfoBuffer
);
1015 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
1016 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1018 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1019 SAM_DOMAIN_FIXED_DATA FixedData
;
1025 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1026 if (InfoBuffer
== NULL
)
1027 return STATUS_INSUFFICIENT_RESOURCES
;
1029 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1030 Status
= SampGetObjectAttribute(DomainObject
,
1035 if (!NT_SUCCESS(Status
))
1038 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1039 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1040 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1041 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1043 *Buffer
= InfoBuffer
;
1046 if (!NT_SUCCESS(Status
))
1048 if (InfoBuffer
!= NULL
)
1050 midl_user_free(InfoBuffer
);
1059 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1060 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1062 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1063 SAM_DOMAIN_FIXED_DATA FixedData
;
1069 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1070 if (InfoBuffer
== NULL
)
1071 return STATUS_INSUFFICIENT_RESOURCES
;
1073 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1074 Status
= SampGetObjectAttribute(DomainObject
,
1079 if (!NT_SUCCESS(Status
))
1082 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1084 *Buffer
= InfoBuffer
;
1087 if (!NT_SUCCESS(Status
))
1089 if (InfoBuffer
!= NULL
)
1091 midl_user_free(InfoBuffer
);
1100 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1101 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1103 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1104 SAM_DOMAIN_FIXED_DATA FixedData
;
1110 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1111 if (InfoBuffer
== NULL
)
1112 return STATUS_INSUFFICIENT_RESOURCES
;
1114 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1115 Status
= SampGetObjectAttribute(DomainObject
,
1120 if (!NT_SUCCESS(Status
))
1123 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1124 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1125 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1126 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1127 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1128 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1129 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1131 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1132 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1133 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1135 /* Get the OemInformation string */
1136 Status
= SampGetObjectAttributeString(DomainObject
,
1138 &InfoBuffer
->General2
.I1
.OemInformation
);
1139 if (!NT_SUCCESS(Status
))
1141 TRACE("Status 0x%08lx\n", Status
);
1145 /* Get the Name string */
1146 Status
= SampGetObjectAttributeString(DomainObject
,
1148 &InfoBuffer
->General2
.I1
.DomainName
);
1149 if (!NT_SUCCESS(Status
))
1151 TRACE("Status 0x%08lx\n", Status
);
1155 /* Get the ReplicaSourceNodeName string */
1156 Status
= SampGetObjectAttributeString(DomainObject
,
1157 L
"ReplicaSourceNodeName",
1158 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1159 if (!NT_SUCCESS(Status
))
1161 TRACE("Status 0x%08lx\n", Status
);
1165 /* Get the number of Users in the Domain */
1166 Status
= SampGetNumberOfAccounts(DomainObject
,
1168 &InfoBuffer
->General2
.I1
.UserCount
);
1169 if (!NT_SUCCESS(Status
))
1171 TRACE("Status 0x%08lx\n", Status
);
1175 /* Get the number of Groups in the Domain */
1176 Status
= SampGetNumberOfAccounts(DomainObject
,
1178 &InfoBuffer
->General2
.I1
.GroupCount
);
1179 if (!NT_SUCCESS(Status
))
1181 TRACE("Status 0x%08lx\n", Status
);
1185 /* Get the number of Aliases in the Domain */
1186 Status
= SampGetNumberOfAccounts(DomainObject
,
1188 &InfoBuffer
->General2
.I1
.AliasCount
);
1189 if (!NT_SUCCESS(Status
))
1191 TRACE("Status 0x%08lx\n", Status
);
1195 *Buffer
= InfoBuffer
;
1198 if (!NT_SUCCESS(Status
))
1200 if (InfoBuffer
!= NULL
)
1202 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1203 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1205 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1206 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1208 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1209 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1211 midl_user_free(InfoBuffer
);
1220 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1221 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1223 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1224 SAM_DOMAIN_FIXED_DATA FixedData
;
1230 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1231 if (InfoBuffer
== NULL
)
1232 return STATUS_INSUFFICIENT_RESOURCES
;
1234 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1235 Status
= SampGetObjectAttribute(DomainObject
,
1240 if (!NT_SUCCESS(Status
))
1243 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1244 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1245 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1247 *Buffer
= InfoBuffer
;
1250 if (!NT_SUCCESS(Status
))
1252 if (InfoBuffer
!= NULL
)
1254 midl_user_free(InfoBuffer
);
1263 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1264 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1266 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1267 SAM_DOMAIN_FIXED_DATA FixedData
;
1273 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1274 if (InfoBuffer
== NULL
)
1275 return STATUS_INSUFFICIENT_RESOURCES
;
1277 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1278 Status
= SampGetObjectAttribute(DomainObject
,
1283 if (!NT_SUCCESS(Status
))
1286 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1287 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1288 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1289 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1290 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1291 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1293 *Buffer
= InfoBuffer
;
1296 if (!NT_SUCCESS(Status
))
1298 if (InfoBuffer
!= NULL
)
1300 midl_user_free(InfoBuffer
);
1311 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1312 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1313 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1315 PSAM_DB_OBJECT DomainObject
;
1316 ACCESS_MASK DesiredAccess
;
1319 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1320 DomainHandle
, DomainInformationClass
, Buffer
);
1322 switch (DomainInformationClass
)
1324 case DomainPasswordInformation
:
1325 case DomainLockoutInformation
:
1326 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1329 case DomainGeneralInformation
:
1330 case DomainLogoffInformation
:
1331 case DomainOemInformation
:
1332 case DomainNameInformation
:
1333 case DomainReplicationInformation
:
1334 case DomainServerRoleInformation
:
1335 case DomainModifiedInformation
:
1336 case DomainStateInformation
:
1337 case DomainModifiedInformation2
:
1338 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1341 case DomainGeneralInformation2
:
1342 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1343 DOMAIN_READ_OTHER_PARAMETERS
;
1347 return STATUS_INVALID_INFO_CLASS
;
1350 /* Validate the server handle */
1351 Status
= SampValidateDbObject(DomainHandle
,
1355 if (!NT_SUCCESS(Status
))
1358 switch (DomainInformationClass
)
1360 case DomainPasswordInformation
:
1361 Status
= SampQueryDomainPassword(DomainObject
,
1365 case DomainGeneralInformation
:
1366 Status
= SampQueryDomainGeneral(DomainObject
,
1370 case DomainLogoffInformation
:
1371 Status
= SampQueryDomainLogoff(DomainObject
,
1375 case DomainOemInformation
:
1376 Status
= SampQueryDomainOem(DomainObject
,
1380 case DomainNameInformation
:
1381 Status
= SampQueryDomainName(DomainObject
,
1385 case DomainReplicationInformation
:
1386 Status
= SampQueryDomainReplication(DomainObject
,
1390 case DomainServerRoleInformation
:
1391 Status
= SampQueryDomainServerRole(DomainObject
,
1395 case DomainModifiedInformation
:
1396 Status
= SampQueryDomainModified(DomainObject
,
1400 case DomainStateInformation
:
1401 Status
= SampQueryDomainState(DomainObject
,
1405 case DomainGeneralInformation2
:
1406 Status
= SampQueryDomainGeneral2(DomainObject
,
1410 case DomainLockoutInformation
:
1411 Status
= SampQueryDomainLockout(DomainObject
,
1415 case DomainModifiedInformation2
:
1416 Status
= SampQueryDomainModified2(DomainObject
,
1421 Status
= STATUS_NOT_IMPLEMENTED
;
1429 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1430 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1432 SAM_DOMAIN_FIXED_DATA FixedData
;
1436 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1437 Status
= SampGetObjectAttribute(DomainObject
,
1442 if (!NT_SUCCESS(Status
))
1445 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1446 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1447 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1448 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1449 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1450 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1451 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1453 Status
= SampSetObjectAttribute(DomainObject
,
1465 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1466 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1468 SAM_DOMAIN_FIXED_DATA FixedData
;
1472 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1473 Status
= SampGetObjectAttribute(DomainObject
,
1478 if (!NT_SUCCESS(Status
))
1481 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1482 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1484 Status
= SampSetObjectAttribute(DomainObject
,
1496 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1497 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1499 SAM_DOMAIN_FIXED_DATA FixedData
;
1503 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1504 Status
= SampGetObjectAttribute(DomainObject
,
1509 if (!NT_SUCCESS(Status
))
1512 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1514 Status
= SampSetObjectAttribute(DomainObject
,
1526 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1527 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1529 SAM_DOMAIN_FIXED_DATA FixedData
;
1533 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1534 Status
= SampGetObjectAttribute(DomainObject
,
1539 if (!NT_SUCCESS(Status
))
1542 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1544 Status
= SampSetObjectAttribute(DomainObject
,
1556 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1557 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1559 SAM_DOMAIN_FIXED_DATA FixedData
;
1563 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1564 Status
= SampGetObjectAttribute(DomainObject
,
1569 if (!NT_SUCCESS(Status
))
1572 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1573 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1574 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1576 Status
= SampSetObjectAttribute(DomainObject
,
1590 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1591 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1592 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1594 PSAM_DB_OBJECT DomainObject
;
1595 ACCESS_MASK DesiredAccess
;
1598 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1599 DomainHandle
, DomainInformationClass
, DomainInformation
);
1601 switch (DomainInformationClass
)
1603 case DomainPasswordInformation
:
1604 case DomainLockoutInformation
:
1605 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1608 case DomainLogoffInformation
:
1609 case DomainOemInformation
:
1610 case DomainNameInformation
:
1611 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1614 case DomainReplicationInformation
:
1615 case DomainServerRoleInformation
:
1616 case DomainStateInformation
:
1617 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1621 return STATUS_INVALID_INFO_CLASS
;
1624 /* Validate the server handle */
1625 Status
= SampValidateDbObject(DomainHandle
,
1629 if (!NT_SUCCESS(Status
))
1632 switch (DomainInformationClass
)
1634 case DomainPasswordInformation
:
1635 Status
= SampSetDomainPassword(DomainObject
,
1639 case DomainLogoffInformation
:
1640 Status
= SampSetDomainLogoff(DomainObject
,
1644 case DomainOemInformation
:
1645 Status
= SampSetObjectAttribute(DomainObject
,
1648 DomainInformation
->Oem
.OemInformation
.Buffer
,
1649 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1652 case DomainNameInformation
:
1653 Status
= SampSetObjectAttribute(DomainObject
,
1656 DomainInformation
->Name
.DomainName
.Buffer
,
1657 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1660 case DomainReplicationInformation
:
1661 Status
= SampSetObjectAttribute(DomainObject
,
1662 L
"ReplicaSourceNodeName",
1664 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1665 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1668 case DomainServerRoleInformation
:
1669 Status
= SampSetDomainServerRole(DomainObject
,
1673 case DomainStateInformation
:
1674 Status
= SampSetDomainState(DomainObject
,
1678 case DomainLockoutInformation
:
1679 Status
= SampSetDomainLockout(DomainObject
,
1684 Status
= STATUS_NOT_IMPLEMENTED
;
1694 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1695 IN PRPC_UNICODE_STRING Name
,
1696 IN ACCESS_MASK DesiredAccess
,
1697 OUT SAMPR_HANDLE
*GroupHandle
,
1698 OUT
unsigned long *RelativeId
)
1700 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1701 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1702 SAM_GROUP_FIXED_DATA FixedGroupData
;
1703 PSAM_DB_OBJECT DomainObject
;
1704 PSAM_DB_OBJECT GroupObject
;
1710 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1711 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1713 /* Map generic access rights */
1714 RtlMapGenericMask(&DesiredAccess
,
1717 /* Validate the domain handle */
1718 Status
= SampValidateDbObject(DomainHandle
,
1720 DOMAIN_CREATE_GROUP
,
1722 if (!NT_SUCCESS(Status
))
1724 TRACE("failed with status 0x%08lx\n", Status
);
1728 /* Check if the group name already exists in the domain */
1729 Status
= SampCheckAccountNameInDomain(DomainObject
,
1731 if (!NT_SUCCESS(Status
))
1733 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1734 Name
->Buffer
, Status
);
1738 /* Get the fixed domain attributes */
1739 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1740 Status
= SampGetObjectAttribute(DomainObject
,
1743 (PVOID
)&FixedDomainData
,
1745 if (!NT_SUCCESS(Status
))
1747 TRACE("failed with status 0x%08lx\n", Status
);
1751 /* Increment the NextRid attribute */
1752 ulRid
= FixedDomainData
.NextRid
;
1753 FixedDomainData
.NextRid
++;
1755 /* Store the fixed domain attributes */
1756 Status
= SampSetObjectAttribute(DomainObject
,
1761 if (!NT_SUCCESS(Status
))
1763 TRACE("failed with status 0x%08lx\n", Status
);
1767 TRACE("RID: %lx\n", ulRid
);
1769 /* Convert the RID into a string (hex) */
1770 swprintf(szRid
, L
"%08lX", ulRid
);
1772 /* Create the group object */
1773 Status
= SampCreateDbObject(DomainObject
,
1780 if (!NT_SUCCESS(Status
))
1782 TRACE("failed with status 0x%08lx\n", Status
);
1786 /* Add the account name of the user object */
1787 Status
= SampSetAccountNameInDomain(DomainObject
,
1791 if (!NT_SUCCESS(Status
))
1793 TRACE("failed with status 0x%08lx\n", Status
);
1797 /* Initialize fixed user data */
1798 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1799 FixedGroupData
.Version
= 1;
1801 FixedGroupData
.GroupId
= ulRid
;
1803 /* Set fixed user data attribute */
1804 Status
= SampSetObjectAttribute(GroupObject
,
1807 (LPVOID
)&FixedGroupData
,
1808 sizeof(SAM_GROUP_FIXED_DATA
));
1809 if (!NT_SUCCESS(Status
))
1811 TRACE("failed with status 0x%08lx\n", Status
);
1815 /* Set the Name attribute */
1816 Status
= SampSetObjectAttribute(GroupObject
,
1819 (LPVOID
)Name
->Buffer
,
1820 Name
->MaximumLength
);
1821 if (!NT_SUCCESS(Status
))
1823 TRACE("failed with status 0x%08lx\n", Status
);
1827 /* Set the AdminComment attribute */
1828 Status
= SampSetObjectAttribute(GroupObject
,
1832 EmptyString
.MaximumLength
);
1833 if (!NT_SUCCESS(Status
))
1835 TRACE("failed with status 0x%08lx\n", Status
);
1839 if (NT_SUCCESS(Status
))
1841 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1842 *RelativeId
= ulRid
;
1845 TRACE("returns with status 0x%08lx\n", Status
);
1854 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1855 IN OUT
unsigned long *EnumerationContext
,
1856 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1857 IN
unsigned long PreferedMaximumLength
,
1858 OUT
unsigned long *CountReturned
)
1860 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1861 PSAM_DB_OBJECT DomainObject
;
1862 HANDLE GroupsKeyHandle
= NULL
;
1863 HANDLE NamesKeyHandle
= NULL
;
1864 WCHAR GroupName
[64];
1866 ULONG EnumCount
= 0;
1867 ULONG RequiredLength
= 0;
1872 BOOLEAN MoreEntries
= FALSE
;
1875 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1876 DomainHandle
, EnumerationContext
, Buffer
,
1877 PreferedMaximumLength
, CountReturned
);
1879 /* Validate the domain handle */
1880 Status
= SampValidateDbObject(DomainHandle
,
1882 DOMAIN_LIST_ACCOUNTS
,
1884 if (!NT_SUCCESS(Status
))
1887 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1891 if (!NT_SUCCESS(Status
))
1894 Status
= SampRegOpenKey(GroupsKeyHandle
,
1898 if (!NT_SUCCESS(Status
))
1903 EnumIndex
= *EnumerationContext
;
1907 NameLength
= 64 * sizeof(WCHAR
);
1908 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1915 if (!NT_SUCCESS(Status
))
1917 if (Status
== STATUS_NO_MORE_ENTRIES
)
1918 Status
= STATUS_SUCCESS
;
1922 TRACE("EnumIndex: %lu\n", EnumIndex
);
1923 TRACE("Group name: %S\n", GroupName
);
1924 TRACE("Name length: %lu\n", NameLength
);
1926 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
1932 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
1938 TRACE("EnumCount: %lu\n", EnumCount
);
1939 TRACE("RequiredLength: %lu\n", RequiredLength
);
1941 if (!NT_SUCCESS(Status
))
1944 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
1945 if (EnumBuffer
== NULL
)
1947 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1951 EnumBuffer
->EntriesRead
= EnumCount
;
1955 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
1956 if (EnumBuffer
->Buffer
== NULL
)
1958 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1964 EnumIndex
= *EnumerationContext
;
1965 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
1967 NameLength
= 64 * sizeof(WCHAR
);
1968 DataLength
= sizeof(ULONG
);
1969 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1976 if (!NT_SUCCESS(Status
))
1978 if (Status
== STATUS_NO_MORE_ENTRIES
)
1979 Status
= STATUS_SUCCESS
;
1983 TRACE("EnumIndex: %lu\n", EnumIndex
);
1984 TRACE("Group name: %S\n", GroupName
);
1985 TRACE("Name length: %lu\n", NameLength
);
1986 TRACE("RID: %lu\n", Rid
);
1988 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
1990 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
1991 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
1993 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
1995 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
1996 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
1998 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2002 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2004 EnumBuffer
->Buffer
[i
].Name
.Length
);
2009 if (NT_SUCCESS(Status
))
2011 *EnumerationContext
+= EnumCount
;
2012 *Buffer
= EnumBuffer
;
2013 *CountReturned
= EnumCount
;
2017 *EnumerationContext
= 0;
2021 if (EnumBuffer
!= NULL
)
2023 if (EnumBuffer
->Buffer
!= NULL
)
2025 if (EnumBuffer
->EntriesRead
!= 0)
2027 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2029 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2030 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2034 midl_user_free(EnumBuffer
->Buffer
);
2037 midl_user_free(EnumBuffer
);
2041 if (NamesKeyHandle
!= NULL
)
2042 SampRegCloseKey(NamesKeyHandle
);
2044 if (GroupsKeyHandle
!= NULL
)
2045 SampRegCloseKey(GroupsKeyHandle
);
2047 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2048 Status
= STATUS_MORE_ENTRIES
;
2057 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
2058 IN PRPC_UNICODE_STRING Name
,
2059 IN ACCESS_MASK DesiredAccess
,
2060 OUT SAMPR_HANDLE
*UserHandle
,
2061 OUT
unsigned long *RelativeId
)
2063 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2064 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2065 SAM_USER_FIXED_DATA FixedUserData
;
2066 PSAM_DB_OBJECT DomainObject
;
2067 PSAM_DB_OBJECT UserObject
;
2073 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2074 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2077 Name
->Length
== 0 ||
2078 Name
->Buffer
== NULL
||
2079 UserHandle
== NULL
||
2081 return STATUS_INVALID_PARAMETER
;
2083 /* Map generic access rights */
2084 RtlMapGenericMask(&DesiredAccess
,
2087 /* Validate the domain handle */
2088 Status
= SampValidateDbObject(DomainHandle
,
2092 if (!NT_SUCCESS(Status
))
2094 TRACE("failed with status 0x%08lx\n", Status
);
2098 /* Check if the user name already exists in the domain */
2099 Status
= SampCheckAccountNameInDomain(DomainObject
,
2101 if (!NT_SUCCESS(Status
))
2103 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2104 Name
->Buffer
, Status
);
2108 /* Get the fixed domain attributes */
2109 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2110 Status
= SampGetObjectAttribute(DomainObject
,
2113 (PVOID
)&FixedDomainData
,
2115 if (!NT_SUCCESS(Status
))
2117 TRACE("failed with status 0x%08lx\n", Status
);
2121 /* Increment the NextRid attribute */
2122 ulRid
= FixedDomainData
.NextRid
;
2123 FixedDomainData
.NextRid
++;
2125 /* Store the fixed domain attributes */
2126 Status
= SampSetObjectAttribute(DomainObject
,
2131 if (!NT_SUCCESS(Status
))
2133 TRACE("failed with status 0x%08lx\n", Status
);
2137 TRACE("RID: %lx\n", ulRid
);
2139 /* Convert the RID into a string (hex) */
2140 swprintf(szRid
, L
"%08lX", ulRid
);
2142 /* Create the user object */
2143 Status
= SampCreateDbObject(DomainObject
,
2150 if (!NT_SUCCESS(Status
))
2152 TRACE("failed with status 0x%08lx\n", Status
);
2156 /* Add the account name for the user object */
2157 Status
= SampSetAccountNameInDomain(DomainObject
,
2161 if (!NT_SUCCESS(Status
))
2163 TRACE("failed with status 0x%08lx\n", Status
);
2167 /* Initialize fixed user data */
2168 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2169 FixedUserData
.Version
= 1;
2170 FixedUserData
.Reserved
= 0;
2171 FixedUserData
.LastLogon
.QuadPart
= 0;
2172 FixedUserData
.LastLogoff
.QuadPart
= 0;
2173 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2174 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2175 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2176 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2177 FixedUserData
.UserId
= ulRid
;
2178 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2179 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2180 USER_PASSWORD_NOT_REQUIRED
|
2181 USER_NORMAL_ACCOUNT
;
2182 FixedUserData
.CountryCode
= 0;
2183 FixedUserData
.CodePage
= 0;
2184 FixedUserData
.BadPasswordCount
= 0;
2185 FixedUserData
.LogonCount
= 0;
2186 FixedUserData
.AdminCount
= 0;
2187 FixedUserData
.OperatorCount
= 0;
2189 /* Set fixed user data attribute */
2190 Status
= SampSetObjectAttribute(UserObject
,
2193 (LPVOID
)&FixedUserData
,
2194 sizeof(SAM_USER_FIXED_DATA
));
2195 if (!NT_SUCCESS(Status
))
2197 TRACE("failed with status 0x%08lx\n", Status
);
2201 /* Set the Name attribute */
2202 Status
= SampSetObjectAttribute(UserObject
,
2205 (LPVOID
)Name
->Buffer
,
2206 Name
->MaximumLength
);
2207 if (!NT_SUCCESS(Status
))
2209 TRACE("failed with status 0x%08lx\n", Status
);
2213 /* Set the FullName attribute */
2214 Status
= SampSetObjectAttribute(UserObject
,
2218 EmptyString
.MaximumLength
);
2219 if (!NT_SUCCESS(Status
))
2221 TRACE("failed with status 0x%08lx\n", Status
);
2225 /* Set the HomeDirectory attribute */
2226 Status
= SampSetObjectAttribute(UserObject
,
2230 EmptyString
.MaximumLength
);
2231 if (!NT_SUCCESS(Status
))
2233 TRACE("failed with status 0x%08lx\n", Status
);
2237 /* Set the HomeDirectoryDrive attribute */
2238 Status
= SampSetObjectAttribute(UserObject
,
2239 L
"HomeDirectoryDrive",
2242 EmptyString
.MaximumLength
);
2243 if (!NT_SUCCESS(Status
))
2245 TRACE("failed with status 0x%08lx\n", Status
);
2249 /* Set the ScriptPath attribute */
2250 Status
= SampSetObjectAttribute(UserObject
,
2254 EmptyString
.MaximumLength
);
2255 if (!NT_SUCCESS(Status
))
2257 TRACE("failed with status 0x%08lx\n", Status
);
2261 /* Set the ProfilePath attribute */
2262 Status
= SampSetObjectAttribute(UserObject
,
2266 EmptyString
.MaximumLength
);
2267 if (!NT_SUCCESS(Status
))
2269 TRACE("failed with status 0x%08lx\n", Status
);
2273 /* Set the AdminComment attribute */
2274 Status
= SampSetObjectAttribute(UserObject
,
2278 EmptyString
.MaximumLength
);
2279 if (!NT_SUCCESS(Status
))
2281 TRACE("failed with status 0x%08lx\n", Status
);
2285 /* Set the UserComment attribute */
2286 Status
= SampSetObjectAttribute(UserObject
,
2290 EmptyString
.MaximumLength
);
2291 if (!NT_SUCCESS(Status
))
2293 TRACE("failed with status 0x%08lx\n", Status
);
2297 /* Set the WorkStations attribute */
2298 Status
= SampSetObjectAttribute(UserObject
,
2302 EmptyString
.MaximumLength
);
2303 if (!NT_SUCCESS(Status
))
2305 TRACE("failed with status 0x%08lx\n", Status
);
2309 /* Set the Parameters attribute */
2310 Status
= SampSetObjectAttribute(UserObject
,
2314 EmptyString
.MaximumLength
);
2315 if (!NT_SUCCESS(Status
))
2317 TRACE("failed with status 0x%08lx\n", Status
);
2321 /* FIXME: Set LogonHours attribute*/
2322 /* FIXME: Set Groups attribute*/
2324 /* Set LMPwd attribute*/
2325 Status
= SampSetObjectAttribute(UserObject
,
2330 if (!NT_SUCCESS(Status
))
2332 TRACE("failed with status 0x%08lx\n", Status
);
2336 /* Set NTPwd attribute*/
2337 Status
= SampSetObjectAttribute(UserObject
,
2342 if (!NT_SUCCESS(Status
))
2344 TRACE("failed with status 0x%08lx\n", Status
);
2348 /* Set LMPwdHistory attribute*/
2349 Status
= SampSetObjectAttribute(UserObject
,
2354 if (!NT_SUCCESS(Status
))
2356 TRACE("failed with status 0x%08lx\n", Status
);
2360 /* Set NTPwdHistory attribute*/
2361 Status
= SampSetObjectAttribute(UserObject
,
2366 if (!NT_SUCCESS(Status
))
2368 TRACE("failed with status 0x%08lx\n", Status
);
2372 /* FIXME: Set SecDesc attribute*/
2374 if (NT_SUCCESS(Status
))
2376 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2377 *RelativeId
= ulRid
;
2380 TRACE("returns with status 0x%08lx\n", Status
);
2389 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2390 IN OUT
unsigned long *EnumerationContext
,
2391 IN
unsigned long UserAccountControl
,
2392 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2393 IN
unsigned long PreferedMaximumLength
,
2394 OUT
unsigned long *CountReturned
)
2396 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2397 PSAM_DB_OBJECT DomainObject
;
2398 HANDLE UsersKeyHandle
= NULL
;
2399 HANDLE NamesKeyHandle
= NULL
;
2402 ULONG EnumCount
= 0;
2403 ULONG RequiredLength
= 0;
2408 BOOLEAN MoreEntries
= FALSE
;
2411 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2412 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2413 PreferedMaximumLength
, CountReturned
);
2415 /* Validate the domain handle */
2416 Status
= SampValidateDbObject(DomainHandle
,
2418 DOMAIN_LIST_ACCOUNTS
,
2420 if (!NT_SUCCESS(Status
))
2423 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2427 if (!NT_SUCCESS(Status
))
2430 Status
= SampRegOpenKey(UsersKeyHandle
,
2434 if (!NT_SUCCESS(Status
))
2439 EnumIndex
= *EnumerationContext
;
2443 NameLength
= 64 * sizeof(WCHAR
);
2444 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2451 if (!NT_SUCCESS(Status
))
2453 if (Status
== STATUS_NO_MORE_ENTRIES
)
2454 Status
= STATUS_SUCCESS
;
2458 TRACE("EnumIndex: %lu\n", EnumIndex
);
2459 TRACE("User name: %S\n", UserName
);
2460 TRACE("Name length: %lu\n", NameLength
);
2462 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2468 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2474 TRACE("EnumCount: %lu\n", EnumCount
);
2475 TRACE("RequiredLength: %lu\n", RequiredLength
);
2477 if (!NT_SUCCESS(Status
))
2480 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2481 if (EnumBuffer
== NULL
)
2483 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2487 EnumBuffer
->EntriesRead
= EnumCount
;
2491 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2492 if (EnumBuffer
->Buffer
== NULL
)
2494 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2500 EnumIndex
= *EnumerationContext
;
2501 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2503 NameLength
= 64 * sizeof(WCHAR
);
2504 DataLength
= sizeof(ULONG
);
2505 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2512 if (!NT_SUCCESS(Status
))
2514 if (Status
== STATUS_NO_MORE_ENTRIES
)
2515 Status
= STATUS_SUCCESS
;
2519 TRACE("EnumIndex: %lu\n", EnumIndex
);
2520 TRACE("User name: %S\n", UserName
);
2521 TRACE("Name length: %lu\n", NameLength
);
2522 TRACE("RID: %lu\n", Rid
);
2524 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2526 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2527 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2529 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2531 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2532 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2534 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2538 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2540 EnumBuffer
->Buffer
[i
].Name
.Length
);
2545 if (NT_SUCCESS(Status
))
2547 *EnumerationContext
+= EnumCount
;
2548 *Buffer
= EnumBuffer
;
2549 *CountReturned
= EnumCount
;
2553 *EnumerationContext
= 0;
2557 if (EnumBuffer
!= NULL
)
2559 if (EnumBuffer
->Buffer
!= NULL
)
2561 if (EnumBuffer
->EntriesRead
!= 0)
2563 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2565 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2566 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2570 midl_user_free(EnumBuffer
->Buffer
);
2573 midl_user_free(EnumBuffer
);
2577 if (NamesKeyHandle
!= NULL
)
2578 SampRegCloseKey(NamesKeyHandle
);
2580 if (UsersKeyHandle
!= NULL
)
2581 SampRegCloseKey(UsersKeyHandle
);
2583 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2584 Status
= STATUS_MORE_ENTRIES
;
2593 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2594 IN PRPC_UNICODE_STRING AccountName
,
2595 IN ACCESS_MASK DesiredAccess
,
2596 OUT SAMPR_HANDLE
*AliasHandle
,
2597 OUT
unsigned long *RelativeId
)
2599 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2600 PSAM_DB_OBJECT DomainObject
;
2601 PSAM_DB_OBJECT AliasObject
;
2602 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2608 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2609 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2611 /* Map generic access rights */
2612 RtlMapGenericMask(&DesiredAccess
,
2615 /* Validate the domain handle */
2616 Status
= SampValidateDbObject(DomainHandle
,
2618 DOMAIN_CREATE_ALIAS
,
2620 if (!NT_SUCCESS(Status
))
2622 TRACE("failed with status 0x%08lx\n", Status
);
2626 /* Check if the alias name already exists in the domain */
2627 Status
= SampCheckAccountNameInDomain(DomainObject
,
2628 AccountName
->Buffer
);
2629 if (!NT_SUCCESS(Status
))
2631 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2632 AccountName
->Buffer
, Status
);
2636 /* Get the fixed domain attributes */
2637 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2638 Status
= SampGetObjectAttribute(DomainObject
,
2641 (PVOID
)&FixedDomainData
,
2643 if (!NT_SUCCESS(Status
))
2645 TRACE("failed with status 0x%08lx\n", Status
);
2649 /* Increment the NextRid attribute */
2650 ulRid
= FixedDomainData
.NextRid
;
2651 FixedDomainData
.NextRid
++;
2653 /* Store the fixed domain attributes */
2654 Status
= SampSetObjectAttribute(DomainObject
,
2659 if (!NT_SUCCESS(Status
))
2661 TRACE("failed with status 0x%08lx\n", Status
);
2665 TRACE("RID: %lx\n", ulRid
);
2667 /* Convert the RID into a string (hex) */
2668 swprintf(szRid
, L
"%08lX", ulRid
);
2670 /* Create the alias object */
2671 Status
= SampCreateDbObject(DomainObject
,
2678 if (!NT_SUCCESS(Status
))
2680 TRACE("failed with status 0x%08lx\n", Status
);
2684 /* Add the account name for the alias object */
2685 Status
= SampSetAccountNameInDomain(DomainObject
,
2687 AccountName
->Buffer
,
2689 if (!NT_SUCCESS(Status
))
2691 TRACE("failed with status 0x%08lx\n", Status
);
2695 /* Set the Name attribute */
2696 Status
= SampSetObjectAttribute(AliasObject
,
2699 (LPVOID
)AccountName
->Buffer
,
2700 AccountName
->MaximumLength
);
2701 if (!NT_SUCCESS(Status
))
2703 TRACE("failed with status 0x%08lx\n", Status
);
2707 /* Set the Description attribute */
2708 Status
= SampSetObjectAttribute(AliasObject
,
2712 EmptyString
.MaximumLength
);
2713 if (!NT_SUCCESS(Status
))
2715 TRACE("failed with status 0x%08lx\n", Status
);
2719 if (NT_SUCCESS(Status
))
2721 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2722 *RelativeId
= ulRid
;
2725 TRACE("returns with status 0x%08lx\n", Status
);
2734 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2735 IN OUT
unsigned long *EnumerationContext
,
2736 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2737 IN
unsigned long PreferedMaximumLength
,
2738 OUT
unsigned long *CountReturned
)
2740 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2741 PSAM_DB_OBJECT DomainObject
;
2742 HANDLE AliasesKeyHandle
= NULL
;
2743 HANDLE NamesKeyHandle
= NULL
;
2744 WCHAR AliasName
[64];
2746 ULONG EnumCount
= 0;
2747 ULONG RequiredLength
= 0;
2752 BOOLEAN MoreEntries
= FALSE
;
2755 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2756 DomainHandle
, EnumerationContext
, Buffer
,
2757 PreferedMaximumLength
, CountReturned
);
2759 /* Validate the domain handle */
2760 Status
= SampValidateDbObject(DomainHandle
,
2762 DOMAIN_LIST_ACCOUNTS
,
2764 if (!NT_SUCCESS(Status
))
2767 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2771 if (!NT_SUCCESS(Status
))
2774 Status
= SampRegOpenKey(AliasesKeyHandle
,
2778 if (!NT_SUCCESS(Status
))
2783 EnumIndex
= *EnumerationContext
;
2787 NameLength
= 64 * sizeof(WCHAR
);
2788 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2795 if (!NT_SUCCESS(Status
))
2797 if (Status
== STATUS_NO_MORE_ENTRIES
)
2798 Status
= STATUS_SUCCESS
;
2802 TRACE("EnumIndex: %lu\n", EnumIndex
);
2803 TRACE("Alias name: %S\n", AliasName
);
2804 TRACE("Name length: %lu\n", NameLength
);
2806 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2812 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2818 TRACE("EnumCount: %lu\n", EnumCount
);
2819 TRACE("RequiredLength: %lu\n", RequiredLength
);
2821 if (!NT_SUCCESS(Status
))
2824 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2825 if (EnumBuffer
== NULL
)
2827 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2831 EnumBuffer
->EntriesRead
= EnumCount
;
2835 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2836 if (EnumBuffer
->Buffer
== NULL
)
2838 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2844 EnumIndex
= *EnumerationContext
;
2845 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2847 NameLength
= 64 * sizeof(WCHAR
);
2848 DataLength
= sizeof(ULONG
);
2849 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2856 if (!NT_SUCCESS(Status
))
2858 if (Status
== STATUS_NO_MORE_ENTRIES
)
2859 Status
= STATUS_SUCCESS
;
2863 TRACE("EnumIndex: %lu\n", EnumIndex
);
2864 TRACE("Alias name: %S\n", AliasName
);
2865 TRACE("Name length: %lu\n", NameLength
);
2866 TRACE("RID: %lu\n", Rid
);
2868 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2870 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2871 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2873 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2875 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2876 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2878 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2882 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2884 EnumBuffer
->Buffer
[i
].Name
.Length
);
2889 if (NT_SUCCESS(Status
))
2891 *EnumerationContext
+= EnumCount
;
2892 *Buffer
= EnumBuffer
;
2893 *CountReturned
= EnumCount
;
2897 *EnumerationContext
= 0;
2901 if (EnumBuffer
!= NULL
)
2903 if (EnumBuffer
->Buffer
!= NULL
)
2905 if (EnumBuffer
->EntriesRead
!= 0)
2907 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2909 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2910 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2914 midl_user_free(EnumBuffer
->Buffer
);
2917 midl_user_free(EnumBuffer
);
2921 if (NamesKeyHandle
!= NULL
)
2922 SampRegCloseKey(NamesKeyHandle
);
2924 if (AliasesKeyHandle
!= NULL
)
2925 SampRegCloseKey(AliasesKeyHandle
);
2927 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2928 Status
= STATUS_MORE_ENTRIES
;
2937 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2938 IN PSAMPR_PSID_ARRAY SidArray
,
2939 OUT PSAMPR_ULONG_ARRAY Membership
)
2941 PSAM_DB_OBJECT DomainObject
;
2942 HANDLE AliasesKeyHandle
= NULL
;
2943 HANDLE MembersKeyHandle
= NULL
;
2944 HANDLE MemberKeyHandle
= NULL
;
2945 LPWSTR MemberSidString
= NULL
;
2946 PULONG RidArray
= NULL
;
2947 ULONG MaxSidCount
= 0;
2952 WCHAR NameBuffer
[9];
2954 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2955 DomainHandle
, SidArray
, Membership
);
2957 /* Validate the domain handle */
2958 Status
= SampValidateDbObject(DomainHandle
,
2960 DOMAIN_GET_ALIAS_MEMBERSHIP
,
2962 if (!NT_SUCCESS(Status
))
2965 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2969 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2970 if (!NT_SUCCESS(Status
))
2973 Status
= SampRegOpenKey(AliasesKeyHandle
,
2977 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2979 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
2981 Status
= STATUS_SUCCESS
;
2985 if (!NT_SUCCESS(Status
))
2988 for (i
= 0; i
< SidArray
->Count
; i
++)
2990 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2991 TRACE("Open %S\n", MemberSidString
);
2993 Status
= SampRegOpenKey(MembersKeyHandle
,
2997 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2998 if (NT_SUCCESS(Status
))
3000 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3003 if (NT_SUCCESS(Status
))
3005 TRACE("Found %lu values\n", ValueCount
);
3006 MaxSidCount
+= ValueCount
;
3009 NtClose(MemberKeyHandle
);
3012 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3013 Status
= STATUS_SUCCESS
;
3015 LocalFree(MemberSidString
);
3018 if (MaxSidCount
== 0)
3020 Status
= STATUS_SUCCESS
;
3024 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
3025 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
3026 if (RidArray
== NULL
)
3028 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3032 for (i
= 0; i
< SidArray
->Count
; i
++)
3034 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3035 TRACE("Open %S\n", MemberSidString
);
3037 Status
= SampRegOpenKey(MembersKeyHandle
,
3041 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3042 if (NT_SUCCESS(Status
))
3044 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3047 if (NT_SUCCESS(Status
))
3049 TRACE("Found %lu values\n", ValueCount
);
3051 for (j
= 0; j
< ValueCount
; j
++)
3053 DataLength
= 9 * sizeof(WCHAR
);
3054 Status
= SampRegEnumerateValue(MemberKeyHandle
,
3061 if (NT_SUCCESS(Status
))
3063 RidArray
[j
] = wcstoul(NameBuffer
, NULL
, 16);
3068 NtClose(MemberKeyHandle
);
3071 LocalFree(MemberSidString
);
3075 if (NT_SUCCESS(Status
))
3077 Membership
->Count
= MaxSidCount
;
3078 Membership
->Element
= RidArray
;
3082 if (RidArray
!= NULL
)
3083 midl_user_free(RidArray
);
3086 if (MembersKeyHandle
!= NULL
)
3087 NtClose(MembersKeyHandle
);
3089 if (MembersKeyHandle
!= NULL
)
3090 NtClose(MembersKeyHandle
);
3092 if (AliasesKeyHandle
!= NULL
)
3093 NtClose(AliasesKeyHandle
);
3102 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
3104 IN RPC_UNICODE_STRING Names
[],
3105 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
3106 OUT PSAMPR_ULONG_ARRAY Use
)
3108 PSAM_DB_OBJECT DomainObject
;
3109 HANDLE AccountsKeyHandle
;
3110 HANDLE NamesKeyHandle
;
3111 ULONG MappedCount
= 0;
3117 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
3118 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
3120 /* Validate the domain handle */
3121 Status
= SampValidateDbObject(DomainHandle
,
3125 if (!NT_SUCCESS(Status
))
3127 TRACE("failed with status 0x%08lx\n", Status
);
3131 RelativeIds
->Count
= 0;
3135 return STATUS_SUCCESS
;
3137 /* Allocate the relative IDs array */
3138 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3139 if (RelativeIds
->Element
== NULL
)
3141 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3145 /* Allocate the use array */
3146 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3147 if (Use
->Element
== NULL
)
3149 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3153 RelativeIds
->Count
= Count
;
3156 for (i
= 0; i
< Count
; i
++)
3158 TRACE("Name: %S\n", Names
[i
].Buffer
);
3162 /* Lookup aliases */
3163 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3166 &AccountsKeyHandle
);
3167 if (NT_SUCCESS(Status
))
3169 Status
= SampRegOpenKey(AccountsKeyHandle
,
3173 if (NT_SUCCESS(Status
))
3175 DataLength
= sizeof(ULONG
);
3176 Status
= SampRegQueryValue(NamesKeyHandle
,
3182 SampRegCloseKey(NamesKeyHandle
);
3185 SampRegCloseKey(AccountsKeyHandle
);
3188 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3191 /* Return alias account */
3192 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3194 TRACE("Rid: %lu\n", RelativeId
);
3195 RelativeIds
->Element
[i
] = RelativeId
;
3196 Use
->Element
[i
] = SidTypeAlias
;
3202 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3205 &AccountsKeyHandle
);
3206 if (NT_SUCCESS(Status
))
3208 Status
= SampRegOpenKey(AccountsKeyHandle
,
3212 if (NT_SUCCESS(Status
))
3214 DataLength
= sizeof(ULONG
);
3215 Status
= SampRegQueryValue(NamesKeyHandle
,
3221 SampRegCloseKey(NamesKeyHandle
);
3224 SampRegCloseKey(AccountsKeyHandle
);
3227 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3230 /* Return group account */
3231 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3233 TRACE("Rid: %lu\n", RelativeId
);
3234 RelativeIds
->Element
[i
] = RelativeId
;
3235 Use
->Element
[i
] = SidTypeGroup
;
3241 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3244 &AccountsKeyHandle
);
3245 if (NT_SUCCESS(Status
))
3247 Status
= SampRegOpenKey(AccountsKeyHandle
,
3251 if (NT_SUCCESS(Status
))
3253 DataLength
= sizeof(ULONG
);
3254 Status
= SampRegQueryValue(NamesKeyHandle
,
3260 SampRegCloseKey(NamesKeyHandle
);
3263 SampRegCloseKey(AccountsKeyHandle
);
3266 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3269 /* Return user account */
3270 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3272 TRACE("Rid: %lu\n", RelativeId
);
3273 RelativeIds
->Element
[i
] = RelativeId
;
3274 Use
->Element
[i
] = SidTypeUser
;
3279 /* Return unknown account */
3280 RelativeIds
->Element
[i
] = 0;
3281 Use
->Element
[i
] = SidTypeUnknown
;
3285 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3286 Status
= STATUS_SUCCESS
;
3288 if (NT_SUCCESS(Status
))
3290 if (MappedCount
== 0)
3291 Status
= STATUS_NONE_MAPPED
;
3292 else if (MappedCount
< Count
)
3293 Status
= STATUS_SOME_NOT_MAPPED
;
3297 if (RelativeIds
->Element
!= NULL
)
3299 midl_user_free(RelativeIds
->Element
);
3300 RelativeIds
->Element
= NULL
;
3303 RelativeIds
->Count
= 0;
3305 if (Use
->Element
!= NULL
)
3307 midl_user_free(Use
->Element
);
3308 Use
->Element
= NULL
;
3314 TRACE("Returned Status %lx\n", Status
);
3323 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3325 IN ULONG
*RelativeIds
,
3326 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3327 OUT PSAMPR_ULONG_ARRAY Use
)
3329 PSAM_DB_OBJECT DomainObject
;
3331 HANDLE AccountsKeyHandle
;
3332 HANDLE AccountKeyHandle
;
3333 ULONG MappedCount
= 0;
3338 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3339 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3341 /* Validate the domain handle */
3342 Status
= SampValidateDbObject(DomainHandle
,
3346 if (!NT_SUCCESS(Status
))
3348 TRACE("failed with status 0x%08lx\n", Status
);
3356 return STATUS_SUCCESS
;
3358 /* Allocate the names array */
3359 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3360 if (Names
->Element
== NULL
)
3362 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3366 /* Allocate the use array */
3367 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3368 if (Use
->Element
== NULL
)
3370 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3374 Names
->Count
= Count
;
3377 for (i
= 0; i
< Count
; i
++)
3379 TRACE("RID: %lu\n", RelativeIds
[i
]);
3381 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3383 /* Lookup aliases */
3384 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3387 &AccountsKeyHandle
);
3388 if (NT_SUCCESS(Status
))
3390 Status
= SampRegOpenKey(AccountsKeyHandle
,
3394 if (NT_SUCCESS(Status
))
3397 Status
= SampRegQueryValue(AccountKeyHandle
,
3402 if (NT_SUCCESS(Status
))
3404 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3405 if (Names
->Element
[i
].Buffer
== NULL
)
3406 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3408 if (NT_SUCCESS(Status
))
3410 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3411 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3413 Status
= SampRegQueryValue(AccountKeyHandle
,
3416 Names
->Element
[i
].Buffer
,
3421 SampRegCloseKey(AccountKeyHandle
);
3424 SampRegCloseKey(AccountsKeyHandle
);
3427 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3430 /* Return alias account */
3431 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3433 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3434 Use
->Element
[i
] = SidTypeAlias
;
3440 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3443 &AccountsKeyHandle
);
3444 if (NT_SUCCESS(Status
))
3446 Status
= SampRegOpenKey(AccountsKeyHandle
,
3450 if (NT_SUCCESS(Status
))
3453 Status
= SampRegQueryValue(AccountKeyHandle
,
3458 if (NT_SUCCESS(Status
))
3460 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3461 if (Names
->Element
[i
].Buffer
== NULL
)
3462 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3464 if (NT_SUCCESS(Status
))
3466 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3467 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3469 Status
= SampRegQueryValue(AccountKeyHandle
,
3472 Names
->Element
[i
].Buffer
,
3477 SampRegCloseKey(AccountKeyHandle
);
3480 SampRegCloseKey(AccountsKeyHandle
);
3483 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3486 /* Return group account */
3487 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3489 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3490 Use
->Element
[i
] = SidTypeGroup
;
3496 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3499 &AccountsKeyHandle
);
3500 if (NT_SUCCESS(Status
))
3502 Status
= SampRegOpenKey(AccountsKeyHandle
,
3506 if (NT_SUCCESS(Status
))
3509 Status
= SampRegQueryValue(AccountKeyHandle
,
3514 if (NT_SUCCESS(Status
))
3516 TRACE("DataLength: %lu\n", DataLength
);
3518 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3519 if (Names
->Element
[i
].Buffer
== NULL
)
3520 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3522 if (NT_SUCCESS(Status
))
3524 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3525 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3527 Status
= SampRegQueryValue(AccountKeyHandle
,
3530 Names
->Element
[i
].Buffer
,
3535 SampRegCloseKey(AccountKeyHandle
);
3538 SampRegCloseKey(AccountsKeyHandle
);
3541 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3544 /* Return user account */
3545 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3547 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3548 Use
->Element
[i
] = SidTypeUser
;
3553 /* Return unknown account */
3554 Use
->Element
[i
] = SidTypeUnknown
;
3558 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3559 Status
= STATUS_SUCCESS
;
3561 if (NT_SUCCESS(Status
))
3563 if (MappedCount
== 0)
3564 Status
= STATUS_NONE_MAPPED
;
3565 else if (MappedCount
< Count
)
3566 Status
= STATUS_SOME_NOT_MAPPED
;
3570 if (Names
->Element
!= NULL
)
3572 for (i
= 0; i
< Count
; i
++)
3574 if (Names
->Element
[i
].Buffer
!= NULL
)
3575 midl_user_free(Names
->Element
[i
].Buffer
);
3578 midl_user_free(Names
->Element
);
3579 Names
->Element
= NULL
;
3584 if (Use
->Element
!= NULL
)
3586 midl_user_free(Use
->Element
);
3587 Use
->Element
= NULL
;
3600 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3601 IN ACCESS_MASK DesiredAccess
,
3602 IN
unsigned long GroupId
,
3603 OUT SAMPR_HANDLE
*GroupHandle
)
3605 PSAM_DB_OBJECT DomainObject
;
3606 PSAM_DB_OBJECT GroupObject
;
3610 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3611 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3613 /* Map generic access rights */
3614 RtlMapGenericMask(&DesiredAccess
,
3617 /* Validate the domain handle */
3618 Status
= SampValidateDbObject(DomainHandle
,
3622 if (!NT_SUCCESS(Status
))
3624 TRACE("failed with status 0x%08lx\n", Status
);
3628 /* Convert the RID into a string (hex) */
3629 swprintf(szRid
, L
"%08lX", GroupId
);
3631 /* Create the group object */
3632 Status
= SampOpenDbObject(DomainObject
,
3639 if (!NT_SUCCESS(Status
))
3641 TRACE("failed with status 0x%08lx\n", Status
);
3645 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3647 return STATUS_SUCCESS
;
3652 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3653 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3655 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3656 SAM_GROUP_FIXED_DATA FixedData
;
3657 ULONG MembersLength
= 0;
3663 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3664 if (InfoBuffer
== NULL
)
3665 return STATUS_INSUFFICIENT_RESOURCES
;
3667 Status
= SampGetObjectAttributeString(GroupObject
,
3669 &InfoBuffer
->General
.Name
);
3670 if (!NT_SUCCESS(Status
))
3672 TRACE("Status 0x%08lx\n", Status
);
3676 Status
= SampGetObjectAttributeString(GroupObject
,
3678 &InfoBuffer
->General
.AdminComment
);
3679 if (!NT_SUCCESS(Status
))
3681 TRACE("Status 0x%08lx\n", Status
);
3685 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3686 Status
= SampGetObjectAttribute(GroupObject
,
3691 if (!NT_SUCCESS(Status
))
3694 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3696 Status
= SampGetObjectAttribute(GroupObject
,
3701 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3704 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3705 InfoBuffer
->General
.MemberCount
= 0;
3707 InfoBuffer
->General
.MemberCount
= MembersLength
/ sizeof(ULONG
);
3709 *Buffer
= InfoBuffer
;
3712 if (!NT_SUCCESS(Status
))
3714 if (InfoBuffer
!= NULL
)
3716 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3717 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3719 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3720 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3722 midl_user_free(InfoBuffer
);
3731 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3732 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3734 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3739 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3740 if (InfoBuffer
== NULL
)
3741 return STATUS_INSUFFICIENT_RESOURCES
;
3743 Status
= SampGetObjectAttributeString(GroupObject
,
3745 &InfoBuffer
->Name
.Name
);
3746 if (!NT_SUCCESS(Status
))
3748 TRACE("Status 0x%08lx\n", Status
);
3752 *Buffer
= InfoBuffer
;
3755 if (!NT_SUCCESS(Status
))
3757 if (InfoBuffer
!= NULL
)
3759 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3760 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3762 midl_user_free(InfoBuffer
);
3771 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3772 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3774 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3775 SAM_GROUP_FIXED_DATA FixedData
;
3781 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3782 if (InfoBuffer
== NULL
)
3783 return STATUS_INSUFFICIENT_RESOURCES
;
3785 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3786 Status
= SampGetObjectAttribute(GroupObject
,
3791 if (!NT_SUCCESS(Status
))
3794 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3796 *Buffer
= InfoBuffer
;
3799 if (!NT_SUCCESS(Status
))
3801 if (InfoBuffer
!= NULL
)
3803 midl_user_free(InfoBuffer
);
3812 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3813 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3815 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3820 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3821 if (InfoBuffer
== NULL
)
3822 return STATUS_INSUFFICIENT_RESOURCES
;
3824 Status
= SampGetObjectAttributeString(GroupObject
,
3826 &InfoBuffer
->AdminComment
.AdminComment
);
3827 if (!NT_SUCCESS(Status
))
3829 TRACE("Status 0x%08lx\n", Status
);
3833 *Buffer
= InfoBuffer
;
3836 if (!NT_SUCCESS(Status
))
3838 if (InfoBuffer
!= NULL
)
3840 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3841 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3843 midl_user_free(InfoBuffer
);
3854 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3855 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3856 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3858 PSAM_DB_OBJECT GroupObject
;
3861 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
3862 GroupHandle
, GroupInformationClass
, Buffer
);
3864 /* Validate the group handle */
3865 Status
= SampValidateDbObject(GroupHandle
,
3867 GROUP_READ_INFORMATION
,
3869 if (!NT_SUCCESS(Status
))
3872 switch (GroupInformationClass
)
3874 case GroupGeneralInformation
:
3875 Status
= SampQueryGroupGeneral(GroupObject
,
3879 case GroupNameInformation
:
3880 Status
= SampQueryGroupName(GroupObject
,
3884 case GroupAttributeInformation
:
3885 Status
= SampQueryGroupAttribute(GroupObject
,
3889 case GroupAdminCommentInformation
:
3890 Status
= SampQueryGroupAdminComment(GroupObject
,
3895 Status
= STATUS_INVALID_INFO_CLASS
;
3904 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3905 PSAMPR_GROUP_INFO_BUFFER Buffer
)
3907 SAM_GROUP_FIXED_DATA FixedData
;
3911 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3912 Status
= SampGetObjectAttribute(GroupObject
,
3917 if (!NT_SUCCESS(Status
))
3920 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
3922 Status
= SampSetObjectAttribute(GroupObject
,
3936 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3937 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3938 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
3940 PSAM_DB_OBJECT GroupObject
;
3943 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
3944 GroupHandle
, GroupInformationClass
, Buffer
);
3946 /* Validate the group handle */
3947 Status
= SampValidateDbObject(GroupHandle
,
3949 GROUP_WRITE_ACCOUNT
,
3951 if (!NT_SUCCESS(Status
))
3954 switch (GroupInformationClass
)
3956 case GroupNameInformation
:
3957 Status
= SampSetObjectAttribute(GroupObject
,
3960 Buffer
->Name
.Name
.Buffer
,
3961 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3964 case GroupAttributeInformation
:
3965 Status
= SampSetGroupAttribute(GroupObject
,
3969 case GroupAdminCommentInformation
:
3970 Status
= SampSetObjectAttribute(GroupObject
,
3973 Buffer
->AdminComment
.AdminComment
.Buffer
,
3974 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
3978 Status
= STATUS_INVALID_INFO_CLASS
;
3989 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
3990 IN
unsigned long MemberId
,
3991 IN
unsigned long Attributes
)
3993 PSAM_DB_OBJECT GroupObject
;
3994 PSAM_DB_OBJECT UserObject
= NULL
;
3997 TRACE("(%p %lu %lx)\n",
3998 GroupHandle
, MemberId
, Attributes
);
4000 /* Validate the group handle */
4001 Status
= SampValidateDbObject(GroupHandle
,
4005 if (!NT_SUCCESS(Status
))
4008 /* Open the user object in the same domain */
4009 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4013 if (!NT_SUCCESS(Status
))
4015 TRACE("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4019 /* Add group membership to the user object */
4020 Status
= SampAddGroupMembershipToUser(UserObject
,
4021 GroupObject
->RelativeId
,
4023 if (!NT_SUCCESS(Status
))
4025 TRACE("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4029 /* Add the member to the group object */
4030 Status
= SampAddMemberToGroup(GroupObject
,
4032 if (!NT_SUCCESS(Status
))
4034 TRACE("SampAddMemberToGroup() failed (Status 0x%08lx)\n", Status
);
4039 SampCloseDbObject(UserObject
);
4048 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
4050 PSAM_DB_OBJECT GroupObject
;
4054 TRACE("(%p)\n", GroupHandle
);
4056 /* Validate the group handle */
4057 Status
= SampValidateDbObject(*GroupHandle
,
4061 if (!NT_SUCCESS(Status
))
4063 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
4067 /* Fail, if the group is built-in */
4068 if (GroupObject
->RelativeId
< 1000)
4070 TRACE("You can not delete a special account!\n");
4071 return STATUS_SPECIAL_ACCOUNT
;
4074 /* Get the length of the Members attribute */
4075 SampGetObjectAttribute(GroupObject
,
4081 /* Fail, if the group has members */
4084 TRACE("There are still members in the group!\n");
4085 return STATUS_MEMBER_IN_GROUP
;
4088 /* FIXME: Remove the group from all aliases */
4090 /* Delete the group from the database */
4091 Status
= SampDeleteAccountDbObject(GroupObject
);
4092 if (!NT_SUCCESS(Status
))
4094 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4098 /* Invalidate the handle */
4099 *GroupHandle
= NULL
;
4101 return STATUS_SUCCESS
;
4108 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
4109 IN
unsigned long MemberId
)
4111 PSAM_DB_OBJECT GroupObject
;
4112 PSAM_DB_OBJECT UserObject
= NULL
;
4116 GroupHandle
, MemberId
);
4118 /* Validate the group handle */
4119 Status
= SampValidateDbObject(GroupHandle
,
4121 GROUP_REMOVE_MEMBER
,
4123 if (!NT_SUCCESS(Status
))
4126 /* Open the user object in the same domain */
4127 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4131 if (!NT_SUCCESS(Status
))
4133 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4137 /* Remove group membership from the user object */
4138 Status
= SampRemoveGroupMembershipFromUser(UserObject
,
4139 GroupObject
->RelativeId
);
4140 if (!NT_SUCCESS(Status
))
4142 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4146 /* Remove the member from the group object */
4147 Status
= SampRemoveMemberFromGroup(GroupObject
,
4149 if (!NT_SUCCESS(Status
))
4151 ERR("SampRemoveMemberFromGroup() failed (Status 0x%08lx)\n", Status
);
4156 SampCloseDbObject(UserObject
);
4165 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
4166 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
4168 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
4169 PSAM_DB_OBJECT GroupObject
;
4174 /* Validate the group handle */
4175 Status
= SampValidateDbObject(GroupHandle
,
4179 if (!NT_SUCCESS(Status
))
4182 MembersBuffer
= midl_user_allocate(sizeof(SAMPR_GET_MEMBERS_BUFFER
));
4183 if (MembersBuffer
== NULL
)
4184 return STATUS_INSUFFICIENT_RESOURCES
;
4186 SampGetObjectAttribute(GroupObject
,
4194 MembersBuffer
->MemberCount
= 0;
4195 MembersBuffer
->Members
= NULL
;
4196 MembersBuffer
->Attributes
= NULL
;
4198 *Members
= MembersBuffer
;
4200 return STATUS_SUCCESS
;
4203 MembersBuffer
->Members
= midl_user_allocate(Length
);
4204 if (MembersBuffer
->Members
== NULL
)
4206 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4210 MembersBuffer
->Attributes
= midl_user_allocate(Length
);
4211 if (MembersBuffer
->Attributes
== NULL
)
4213 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4217 Status
= SampGetObjectAttribute(GroupObject
,
4220 MembersBuffer
->Members
,
4222 if (!NT_SUCCESS(Status
))
4224 TRACE("SampGetObjectAttributes() failed (Status 0x%08lx)\n", Status
);
4228 MembersBuffer
->MemberCount
= Length
/ sizeof(ULONG
);
4230 for (i
= 0; i
< MembersBuffer
->MemberCount
; i
++)
4232 Status
= SampGetUserGroupAttributes(GroupObject
->ParentObject
,
4233 MembersBuffer
->Members
[i
],
4234 GroupObject
->RelativeId
,
4235 &(MembersBuffer
->Attributes
[i
]));
4236 if (!NT_SUCCESS(Status
))
4238 TRACE("SampGetUserGroupAttributes() failed (Status 0x%08lx)\n", Status
);
4243 *Members
= MembersBuffer
;
4246 if (!NT_SUCCESS(Status
))
4248 if (MembersBuffer
!= NULL
)
4250 if (MembersBuffer
->Members
!= NULL
)
4251 midl_user_free(MembersBuffer
->Members
);
4253 if (MembersBuffer
->Attributes
!= NULL
)
4254 midl_user_free(MembersBuffer
->Attributes
);
4256 midl_user_free(MembersBuffer
);
4267 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
4268 IN
unsigned long MemberId
,
4269 IN
unsigned long Attributes
)
4271 PSAM_DB_OBJECT GroupObject
;
4274 /* Validate the group handle */
4275 Status
= SampValidateDbObject(GroupHandle
,
4279 if (!NT_SUCCESS(Status
))
4281 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
4285 Status
= SampSetUserGroupAttributes(GroupObject
->ParentObject
,
4287 GroupObject
->RelativeId
,
4289 if (!NT_SUCCESS(Status
))
4291 TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status
);
4301 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
4302 IN ACCESS_MASK DesiredAccess
,
4304 OUT SAMPR_HANDLE
*AliasHandle
)
4306 PSAM_DB_OBJECT DomainObject
;
4307 PSAM_DB_OBJECT AliasObject
;
4311 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4312 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4314 /* Map generic access rights */
4315 RtlMapGenericMask(&DesiredAccess
,
4318 /* Validate the domain handle */
4319 Status
= SampValidateDbObject(DomainHandle
,
4323 if (!NT_SUCCESS(Status
))
4325 TRACE("failed with status 0x%08lx\n", Status
);
4329 /* Convert the RID into a string (hex) */
4330 swprintf(szRid
, L
"%08lX", AliasId
);
4332 /* Create the alias object */
4333 Status
= SampOpenDbObject(DomainObject
,
4340 if (!NT_SUCCESS(Status
))
4342 TRACE("failed with status 0x%08lx\n", Status
);
4346 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4348 return STATUS_SUCCESS
;
4353 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4354 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4356 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4357 HANDLE MembersKeyHandle
= NULL
;
4362 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4363 if (InfoBuffer
== NULL
)
4364 return STATUS_INSUFFICIENT_RESOURCES
;
4366 Status
= SampGetObjectAttributeString(AliasObject
,
4368 &InfoBuffer
->General
.Name
);
4369 if (!NT_SUCCESS(Status
))
4371 TRACE("Status 0x%08lx\n", Status
);
4375 Status
= SampGetObjectAttributeString(AliasObject
,
4377 &InfoBuffer
->General
.AdminComment
);
4378 if (!NT_SUCCESS(Status
))
4380 TRACE("Status 0x%08lx\n", Status
);
4384 /* Open the Members subkey */
4385 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4389 if (NT_SUCCESS(Status
))
4391 /* Retrieve the number of members of the alias */
4392 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4394 &InfoBuffer
->General
.MemberCount
);
4395 if (!NT_SUCCESS(Status
))
4397 TRACE("Status 0x%08lx\n", Status
);
4401 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4403 InfoBuffer
->General
.MemberCount
= 0;
4404 Status
= STATUS_SUCCESS
;
4408 TRACE("Status 0x%08lx\n", Status
);
4412 *Buffer
= InfoBuffer
;
4415 if (MembersKeyHandle
!= NULL
)
4416 SampRegCloseKey(MembersKeyHandle
);
4418 if (!NT_SUCCESS(Status
))
4420 if (InfoBuffer
!= NULL
)
4422 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4423 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4425 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4426 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4428 midl_user_free(InfoBuffer
);
4437 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4438 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4440 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4445 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4446 if (InfoBuffer
== NULL
)
4447 return STATUS_INSUFFICIENT_RESOURCES
;
4449 Status
= SampGetObjectAttributeString(AliasObject
,
4451 &InfoBuffer
->Name
.Name
);
4452 if (!NT_SUCCESS(Status
))
4454 TRACE("Status 0x%08lx\n", Status
);
4458 *Buffer
= InfoBuffer
;
4461 if (!NT_SUCCESS(Status
))
4463 if (InfoBuffer
!= NULL
)
4465 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4466 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4468 midl_user_free(InfoBuffer
);
4477 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4478 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4480 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4485 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4486 if (InfoBuffer
== NULL
)
4487 return STATUS_INSUFFICIENT_RESOURCES
;
4489 Status
= SampGetObjectAttributeString(AliasObject
,
4491 &InfoBuffer
->AdminComment
.AdminComment
);
4492 if (!NT_SUCCESS(Status
))
4494 TRACE("Status 0x%08lx\n", Status
);
4498 *Buffer
= InfoBuffer
;
4501 if (!NT_SUCCESS(Status
))
4503 if (InfoBuffer
!= NULL
)
4505 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4506 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4508 midl_user_free(InfoBuffer
);
4519 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4520 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4521 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4523 PSAM_DB_OBJECT AliasObject
;
4526 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4527 AliasHandle
, AliasInformationClass
, Buffer
);
4529 /* Validate the alias handle */
4530 Status
= SampValidateDbObject(AliasHandle
,
4532 ALIAS_READ_INFORMATION
,
4534 if (!NT_SUCCESS(Status
))
4537 switch (AliasInformationClass
)
4539 case AliasGeneralInformation
:
4540 Status
= SampQueryAliasGeneral(AliasObject
,
4544 case AliasNameInformation
:
4545 Status
= SampQueryAliasName(AliasObject
,
4549 case AliasAdminCommentInformation
:
4550 Status
= SampQueryAliasAdminComment(AliasObject
,
4555 Status
= STATUS_INVALID_INFO_CLASS
;
4566 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4567 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4568 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4570 PSAM_DB_OBJECT AliasObject
;
4573 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4574 AliasHandle
, AliasInformationClass
, Buffer
);
4576 /* Validate the alias handle */
4577 Status
= SampValidateDbObject(AliasHandle
,
4579 ALIAS_WRITE_ACCOUNT
,
4581 if (!NT_SUCCESS(Status
))
4584 switch (AliasInformationClass
)
4586 case AliasNameInformation
:
4587 Status
= SampSetObjectAttribute(AliasObject
,
4590 Buffer
->Name
.Name
.Buffer
,
4591 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4594 case AliasAdminCommentInformation
:
4595 Status
= SampSetObjectAttribute(AliasObject
,
4598 Buffer
->AdminComment
.AdminComment
.Buffer
,
4599 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4603 Status
= STATUS_INVALID_INFO_CLASS
;
4614 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4616 PSAM_DB_OBJECT AliasObject
;
4619 /* Validate the alias handle */
4620 Status
= SampValidateDbObject(AliasHandle
,
4624 if (!NT_SUCCESS(Status
))
4626 TRACE("failed with status 0x%08lx\n", Status
);
4630 /* Fail, if the alias is built-in */
4631 if (AliasObject
->RelativeId
< 1000)
4633 TRACE("You can not delete a special account!\n");
4634 return STATUS_SPECIAL_ACCOUNT
;
4637 /* FIXME: Remove all members from the alias */
4639 /* Delete the alias from the database */
4640 Status
= SampDeleteAccountDbObject(AliasObject
);
4641 if (!NT_SUCCESS(Status
))
4643 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4647 /* Invalidate the handle */
4648 *AliasHandle
= NULL
;
4657 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4658 IN PRPC_SID MemberId
)
4660 PSAM_DB_OBJECT AliasObject
;
4661 LPWSTR MemberIdString
= NULL
;
4662 HANDLE MembersKeyHandle
= NULL
;
4663 HANDLE MemberKeyHandle
= NULL
;
4664 ULONG MemberIdLength
;
4667 TRACE("SamrAddMemberToAlias(%p %p)\n",
4668 AliasHandle
, MemberId
);
4670 /* Validate the alias handle */
4671 Status
= SampValidateDbObject(AliasHandle
,
4675 if (!NT_SUCCESS(Status
))
4677 TRACE("failed with status 0x%08lx\n", Status
);
4681 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4682 TRACE("Member SID: %S\n", MemberIdString
);
4684 MemberIdLength
= RtlLengthSid(MemberId
);
4686 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4690 if (!NT_SUCCESS(Status
))
4692 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4696 Status
= SampRegSetValue(MembersKeyHandle
,
4701 if (!NT_SUCCESS(Status
))
4703 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4707 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4711 if (!NT_SUCCESS(Status
))
4713 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4717 Status
= SampRegSetValue(MemberKeyHandle
,
4722 if (!NT_SUCCESS(Status
))
4724 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4729 if (MemberKeyHandle
!= NULL
)
4730 SampRegCloseKey(MemberKeyHandle
);
4732 if (MembersKeyHandle
!= NULL
)
4733 SampRegCloseKey(MembersKeyHandle
);
4735 if (MemberIdString
!= NULL
)
4736 LocalFree(MemberIdString
);
4745 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4746 IN PRPC_SID MemberId
)
4748 PSAM_DB_OBJECT AliasObject
;
4749 LPWSTR MemberIdString
= NULL
;
4750 HANDLE MembersKeyHandle
= NULL
;
4751 HANDLE MemberKeyHandle
= NULL
;
4755 TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
4756 AliasHandle
, MemberId
);
4758 /* Validate the alias handle */
4759 Status
= SampValidateDbObject(AliasHandle
,
4761 ALIAS_REMOVE_MEMBER
,
4763 if (!NT_SUCCESS(Status
))
4765 TRACE("failed with status 0x%08lx\n", Status
);
4769 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4770 TRACE("Member SID: %S\n", MemberIdString
);
4772 Status
= SampRegOpenKey(AliasObject
->MembersKeyHandle
,
4774 KEY_WRITE
| KEY_QUERY_VALUE
,
4776 if (!NT_SUCCESS(Status
))
4778 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4782 Status
= SampRegDeleteValue(MemberKeyHandle
,
4784 if (!NT_SUCCESS(Status
))
4786 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4790 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
4793 if (!NT_SUCCESS(Status
))
4795 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4799 if (ulValueCount
== 0)
4801 SampRegCloseKey(MemberKeyHandle
);
4802 MemberKeyHandle
= NULL
;
4804 Status
= SampRegDeleteKey(AliasObject
->MembersKeyHandle
,
4806 if (!NT_SUCCESS(Status
))
4808 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4813 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4815 KEY_WRITE
| KEY_QUERY_VALUE
,
4817 if (!NT_SUCCESS(Status
))
4819 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4823 Status
= SampRegDeleteValue(MembersKeyHandle
,
4825 if (!NT_SUCCESS(Status
))
4827 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4831 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4834 if (!NT_SUCCESS(Status
))
4836 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4840 if (ulValueCount
== 0)
4842 SampRegCloseKey(MembersKeyHandle
);
4843 MembersKeyHandle
= NULL
;
4845 Status
= SampRegDeleteKey(AliasObject
->KeyHandle
,
4847 if (!NT_SUCCESS(Status
))
4849 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4855 if (MemberKeyHandle
!= NULL
)
4856 SampRegCloseKey(MemberKeyHandle
);
4858 if (MembersKeyHandle
!= NULL
)
4859 SampRegCloseKey(MembersKeyHandle
);
4861 if (MemberIdString
!= NULL
)
4862 LocalFree(MemberIdString
);
4871 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4872 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4874 PSAM_DB_OBJECT AliasObject
;
4875 HANDLE MembersKeyHandle
= NULL
;
4876 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4877 ULONG ValueCount
= 0;
4882 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4883 AliasHandle
, Members
);
4885 /* Validate the alias handle */
4886 Status
= SampValidateDbObject(AliasHandle
,
4890 if (!NT_SUCCESS(Status
))
4892 ERR("failed with status 0x%08lx\n", Status
);
4896 /* Open the members key of the alias objct */
4897 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4901 if (!NT_SUCCESS(Status
))
4903 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4907 /* Get the number of members */
4908 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4911 if (!NT_SUCCESS(Status
))
4913 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4917 /* Allocate the member array */
4918 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4919 if (MemberArray
== NULL
)
4921 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4925 /* Enumerate the members */
4929 /* Get the size of the next SID */
4931 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4938 if (!NT_SUCCESS(Status
))
4940 if (Status
== STATUS_NO_MORE_ENTRIES
)
4941 Status
= STATUS_SUCCESS
;
4945 /* Allocate a buffer for the SID */
4946 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4947 if (MemberArray
[Index
].SidPointer
== NULL
)
4949 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4953 /* Read the SID into the buffer */
4954 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4959 (PVOID
)MemberArray
[Index
].SidPointer
,
4961 if (!NT_SUCCESS(Status
))
4969 /* Return the number of members and the member array */
4970 if (NT_SUCCESS(Status
))
4972 Members
->Count
= ValueCount
;
4973 Members
->Sids
= MemberArray
;
4977 /* Clean up the members array and the SID buffers if something failed */
4978 if (!NT_SUCCESS(Status
))
4980 if (MemberArray
!= NULL
)
4982 for (Index
= 0; Index
< ValueCount
; Index
++)
4984 if (MemberArray
[Index
].SidPointer
!= NULL
)
4985 midl_user_free(MemberArray
[Index
].SidPointer
);
4988 midl_user_free(MemberArray
);
4992 /* Close the members key */
4993 if (MembersKeyHandle
!= NULL
)
4994 SampRegCloseKey(MembersKeyHandle
);
5003 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
5004 IN ACCESS_MASK DesiredAccess
,
5005 IN
unsigned long UserId
,
5006 OUT SAMPR_HANDLE
*UserHandle
)
5008 PSAM_DB_OBJECT DomainObject
;
5009 PSAM_DB_OBJECT UserObject
;
5013 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
5014 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
5016 /* Map generic access rights */
5017 RtlMapGenericMask(&DesiredAccess
,
5020 /* Validate the domain handle */
5021 Status
= SampValidateDbObject(DomainHandle
,
5025 if (!NT_SUCCESS(Status
))
5027 TRACE("failed with status 0x%08lx\n", Status
);
5031 /* Convert the RID into a string (hex) */
5032 swprintf(szRid
, L
"%08lX", UserId
);
5034 /* Create the user object */
5035 Status
= SampOpenDbObject(DomainObject
,
5042 if (!NT_SUCCESS(Status
))
5044 TRACE("failed with status 0x%08lx\n", Status
);
5048 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
5050 return STATUS_SUCCESS
;
5057 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
5059 PSAM_DB_OBJECT UserObject
;
5062 TRACE("(%p)\n", UserHandle
);
5064 /* Validate the user handle */
5065 Status
= SampValidateDbObject(*UserHandle
,
5069 if (!NT_SUCCESS(Status
))
5071 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
5075 /* Fail, if the user is built-in */
5076 if (UserObject
->RelativeId
< 1000)
5078 TRACE("You can not delete a special account!\n");
5079 return STATUS_SPECIAL_ACCOUNT
;
5082 /* FIXME: Remove the user from all groups */
5084 /* FIXME: Remove the user from all aliases */
5086 /* Delete the user from the database */
5087 Status
= SampDeleteAccountDbObject(UserObject
);
5088 if (!NT_SUCCESS(Status
))
5090 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5094 /* Invalidate the handle */
5097 return STATUS_SUCCESS
;
5103 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
5104 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5106 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5107 SAM_USER_FIXED_DATA FixedData
;
5113 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5114 if (InfoBuffer
== NULL
)
5115 return STATUS_INSUFFICIENT_RESOURCES
;
5117 Length
= sizeof(SAM_USER_FIXED_DATA
);
5118 Status
= SampGetObjectAttribute(UserObject
,
5123 if (!NT_SUCCESS(Status
))
5126 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5128 /* Get the Name string */
5129 Status
= SampGetObjectAttributeString(UserObject
,
5131 &InfoBuffer
->General
.UserName
);
5132 if (!NT_SUCCESS(Status
))
5134 TRACE("Status 0x%08lx\n", Status
);
5138 /* Get the FullName string */
5139 Status
= SampGetObjectAttributeString(UserObject
,
5141 &InfoBuffer
->General
.FullName
);
5142 if (!NT_SUCCESS(Status
))
5144 TRACE("Status 0x%08lx\n", Status
);
5148 /* Get the AdminComment string */
5149 Status
= SampGetObjectAttributeString(UserObject
,
5151 &InfoBuffer
->General
.AdminComment
);
5152 if (!NT_SUCCESS(Status
))
5154 TRACE("Status 0x%08lx\n", Status
);
5158 /* Get the UserComment string */
5159 Status
= SampGetObjectAttributeString(UserObject
,
5161 &InfoBuffer
->General
.UserComment
);
5162 if (!NT_SUCCESS(Status
))
5164 TRACE("Status 0x%08lx\n", Status
);
5168 *Buffer
= InfoBuffer
;
5171 if (!NT_SUCCESS(Status
))
5173 if (InfoBuffer
!= NULL
)
5175 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
5176 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
5178 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
5179 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
5181 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
5182 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
5184 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
5185 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
5187 midl_user_free(InfoBuffer
);
5197 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
5198 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5200 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5201 SAM_USER_FIXED_DATA FixedData
;
5207 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5208 if (InfoBuffer
== NULL
)
5209 return STATUS_INSUFFICIENT_RESOURCES
;
5211 Length
= sizeof(SAM_USER_FIXED_DATA
);
5212 Status
= SampGetObjectAttribute(UserObject
,
5217 if (!NT_SUCCESS(Status
))
5220 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
5221 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
5223 /* Get the UserComment string */
5224 Status
= SampGetObjectAttributeString(UserObject
,
5226 &InfoBuffer
->Preferences
.UserComment
);
5227 if (!NT_SUCCESS(Status
))
5229 TRACE("Status 0x%08lx\n", Status
);
5233 *Buffer
= InfoBuffer
;
5236 if (!NT_SUCCESS(Status
))
5238 if (InfoBuffer
!= NULL
)
5240 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
5241 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
5243 midl_user_free(InfoBuffer
);
5253 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
5254 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5256 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5257 SAM_USER_FIXED_DATA FixedData
;
5263 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5264 if (InfoBuffer
== NULL
)
5265 return STATUS_INSUFFICIENT_RESOURCES
;
5267 Length
= sizeof(SAM_USER_FIXED_DATA
);
5268 Status
= SampGetObjectAttribute(UserObject
,
5273 if (!NT_SUCCESS(Status
))
5276 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
5277 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5278 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5279 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5280 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5281 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5282 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5283 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5284 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5285 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
5286 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
5288 // OLD_LARGE_INTEGER PasswordCanChange;
5289 // OLD_LARGE_INTEGER PasswordMustChange;
5291 /* Get the Name string */
5292 Status
= SampGetObjectAttributeString(UserObject
,
5294 &InfoBuffer
->Logon
.UserName
);
5295 if (!NT_SUCCESS(Status
))
5297 TRACE("Status 0x%08lx\n", Status
);
5301 /* Get the FullName string */
5302 Status
= SampGetObjectAttributeString(UserObject
,
5304 &InfoBuffer
->Logon
.FullName
);
5305 if (!NT_SUCCESS(Status
))
5307 TRACE("Status 0x%08lx\n", Status
);
5311 /* Get the HomeDirectory string */
5312 Status
= SampGetObjectAttributeString(UserObject
,
5314 &InfoBuffer
->Logon
.HomeDirectory
);
5315 if (!NT_SUCCESS(Status
))
5317 TRACE("Status 0x%08lx\n", Status
);
5321 /* Get the HomeDirectoryDrive string */
5322 Status
= SampGetObjectAttributeString(UserObject
,
5323 L
"HomeDirectoryDrive",
5324 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
5325 if (!NT_SUCCESS(Status
))
5327 TRACE("Status 0x%08lx\n", Status
);
5331 /* Get the ScriptPath string */
5332 Status
= SampGetObjectAttributeString(UserObject
,
5334 &InfoBuffer
->Logon
.ScriptPath
);
5335 if (!NT_SUCCESS(Status
))
5337 TRACE("Status 0x%08lx\n", Status
);
5341 /* Get the ProfilePath string */
5342 Status
= SampGetObjectAttributeString(UserObject
,
5344 &InfoBuffer
->Logon
.ProfilePath
);
5345 if (!NT_SUCCESS(Status
))
5347 TRACE("Status 0x%08lx\n", Status
);
5351 /* Get the WorkStations string */
5352 Status
= SampGetObjectAttributeString(UserObject
,
5354 &InfoBuffer
->Logon
.WorkStations
);
5355 if (!NT_SUCCESS(Status
))
5357 TRACE("Status 0x%08lx\n", Status
);
5361 /* FIXME: LogonHours */
5363 *Buffer
= InfoBuffer
;
5366 if (!NT_SUCCESS(Status
))
5368 if (InfoBuffer
!= NULL
)
5370 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
5371 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
5373 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
5374 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
5376 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
5377 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5379 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5380 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5382 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5383 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5385 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5386 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5388 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5389 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5391 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5392 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5394 midl_user_free(InfoBuffer
);
5404 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5405 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5407 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5408 SAM_USER_FIXED_DATA FixedData
;
5414 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5415 if (InfoBuffer
== NULL
)
5416 return STATUS_INSUFFICIENT_RESOURCES
;
5418 Length
= sizeof(SAM_USER_FIXED_DATA
);
5419 Status
= SampGetObjectAttribute(UserObject
,
5424 if (!NT_SUCCESS(Status
))
5427 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5428 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5429 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5430 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5431 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5432 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5433 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5434 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5435 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5436 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5437 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5438 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
5439 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
5441 /* Get the Name string */
5442 Status
= SampGetObjectAttributeString(UserObject
,
5444 &InfoBuffer
->Account
.UserName
);
5445 if (!NT_SUCCESS(Status
))
5447 TRACE("Status 0x%08lx\n", Status
);
5451 /* Get the FullName string */
5452 Status
= SampGetObjectAttributeString(UserObject
,
5454 &InfoBuffer
->Account
.FullName
);
5455 if (!NT_SUCCESS(Status
))
5457 TRACE("Status 0x%08lx\n", Status
);
5461 /* Get the HomeDirectory string */
5462 Status
= SampGetObjectAttributeString(UserObject
,
5464 &InfoBuffer
->Account
.HomeDirectory
);
5465 if (!NT_SUCCESS(Status
))
5467 TRACE("Status 0x%08lx\n", Status
);
5471 /* Get the HomeDirectoryDrive string */
5472 Status
= SampGetObjectAttributeString(UserObject
,
5473 L
"HomeDirectoryDrive",
5474 &InfoBuffer
->Account
.HomeDirectoryDrive
);
5475 if (!NT_SUCCESS(Status
))
5477 TRACE("Status 0x%08lx\n", Status
);
5481 /* Get the ScriptPath string */
5482 Status
= SampGetObjectAttributeString(UserObject
,
5484 &InfoBuffer
->Account
.ScriptPath
);
5485 if (!NT_SUCCESS(Status
))
5487 TRACE("Status 0x%08lx\n", Status
);
5491 /* Get the ProfilePath string */
5492 Status
= SampGetObjectAttributeString(UserObject
,
5494 &InfoBuffer
->Account
.ProfilePath
);
5495 if (!NT_SUCCESS(Status
))
5497 TRACE("Status 0x%08lx\n", Status
);
5501 /* Get the AdminComment string */
5502 Status
= SampGetObjectAttributeString(UserObject
,
5504 &InfoBuffer
->Account
.AdminComment
);
5505 if (!NT_SUCCESS(Status
))
5507 TRACE("Status 0x%08lx\n", Status
);
5511 /* Get the WorkStations string */
5512 Status
= SampGetObjectAttributeString(UserObject
,
5514 &InfoBuffer
->Account
.WorkStations
);
5515 if (!NT_SUCCESS(Status
))
5517 TRACE("Status 0x%08lx\n", Status
);
5521 /* FIXME: LogonHours */
5523 *Buffer
= InfoBuffer
;
5526 if (!NT_SUCCESS(Status
))
5528 if (InfoBuffer
!= NULL
)
5530 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5531 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5533 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5534 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5536 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5537 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5539 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5540 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5542 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5543 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5545 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5546 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5548 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5549 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5551 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5552 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5554 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5555 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5557 midl_user_free(InfoBuffer
);
5564 /* FIXME: SampQueryUserLogonHours */
5568 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
5569 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5571 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5576 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5577 if (InfoBuffer
== NULL
)
5578 return STATUS_INSUFFICIENT_RESOURCES
;
5580 /* Get the Name string */
5581 Status
= SampGetObjectAttributeString(UserObject
,
5583 &InfoBuffer
->Name
.UserName
);
5584 if (!NT_SUCCESS(Status
))
5586 TRACE("Status 0x%08lx\n", Status
);
5590 /* Get the FullName string */
5591 Status
= SampGetObjectAttributeString(UserObject
,
5593 &InfoBuffer
->Name
.FullName
);
5594 if (!NT_SUCCESS(Status
))
5596 TRACE("Status 0x%08lx\n", Status
);
5600 *Buffer
= InfoBuffer
;
5603 if (!NT_SUCCESS(Status
))
5605 if (InfoBuffer
!= NULL
)
5607 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5608 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5610 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5611 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5613 midl_user_free(InfoBuffer
);
5622 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5623 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5625 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5630 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5631 if (InfoBuffer
== NULL
)
5632 return STATUS_INSUFFICIENT_RESOURCES
;
5634 /* Get the Name string */
5635 Status
= SampGetObjectAttributeString(UserObject
,
5637 &InfoBuffer
->AccountName
.UserName
);
5638 if (!NT_SUCCESS(Status
))
5640 TRACE("Status 0x%08lx\n", Status
);
5644 *Buffer
= InfoBuffer
;
5647 if (!NT_SUCCESS(Status
))
5649 if (InfoBuffer
!= NULL
)
5651 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5652 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5654 midl_user_free(InfoBuffer
);
5663 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5664 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5666 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5671 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5672 if (InfoBuffer
== NULL
)
5673 return STATUS_INSUFFICIENT_RESOURCES
;
5675 /* Get the FullName string */
5676 Status
= SampGetObjectAttributeString(UserObject
,
5678 &InfoBuffer
->FullName
.FullName
);
5679 if (!NT_SUCCESS(Status
))
5681 TRACE("Status 0x%08lx\n", Status
);
5685 *Buffer
= InfoBuffer
;
5688 if (!NT_SUCCESS(Status
))
5690 if (InfoBuffer
!= NULL
)
5692 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
5693 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5695 midl_user_free(InfoBuffer
);
5705 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5706 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5708 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5709 SAM_USER_FIXED_DATA FixedData
;
5715 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5716 if (InfoBuffer
== NULL
)
5717 return STATUS_INSUFFICIENT_RESOURCES
;
5719 Length
= sizeof(SAM_USER_FIXED_DATA
);
5720 Status
= SampGetObjectAttribute(UserObject
,
5725 if (!NT_SUCCESS(Status
))
5728 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5730 *Buffer
= InfoBuffer
;
5733 if (!NT_SUCCESS(Status
))
5735 if (InfoBuffer
!= NULL
)
5737 midl_user_free(InfoBuffer
);
5746 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5747 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5749 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5754 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5755 if (InfoBuffer
== NULL
)
5756 return STATUS_INSUFFICIENT_RESOURCES
;
5758 /* Get the HomeDirectory string */
5759 Status
= SampGetObjectAttributeString(UserObject
,
5761 &InfoBuffer
->Home
.HomeDirectory
);
5762 if (!NT_SUCCESS(Status
))
5764 TRACE("Status 0x%08lx\n", Status
);
5768 /* Get the HomeDirectoryDrive string */
5769 Status
= SampGetObjectAttributeString(UserObject
,
5770 L
"HomeDirectoryDrive",
5771 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5772 if (!NT_SUCCESS(Status
))
5774 TRACE("Status 0x%08lx\n", Status
);
5778 *Buffer
= InfoBuffer
;
5781 if (!NT_SUCCESS(Status
))
5783 if (InfoBuffer
!= NULL
)
5785 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5786 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5788 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5789 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5791 midl_user_free(InfoBuffer
);
5800 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5801 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5803 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5808 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5809 if (InfoBuffer
== NULL
)
5810 return STATUS_INSUFFICIENT_RESOURCES
;
5812 /* Get the ScriptPath string */
5813 Status
= SampGetObjectAttributeString(UserObject
,
5815 &InfoBuffer
->Script
.ScriptPath
);
5816 if (!NT_SUCCESS(Status
))
5818 TRACE("Status 0x%08lx\n", Status
);
5822 *Buffer
= InfoBuffer
;
5825 if (!NT_SUCCESS(Status
))
5827 if (InfoBuffer
!= NULL
)
5829 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5830 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5832 midl_user_free(InfoBuffer
);
5841 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5842 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5844 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5849 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5850 if (InfoBuffer
== NULL
)
5851 return STATUS_INSUFFICIENT_RESOURCES
;
5853 /* Get the ProfilePath string */
5854 Status
= SampGetObjectAttributeString(UserObject
,
5856 &InfoBuffer
->Profile
.ProfilePath
);
5857 if (!NT_SUCCESS(Status
))
5859 TRACE("Status 0x%08lx\n", Status
);
5863 *Buffer
= InfoBuffer
;
5866 if (!NT_SUCCESS(Status
))
5868 if (InfoBuffer
!= NULL
)
5870 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
5871 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5873 midl_user_free(InfoBuffer
);
5882 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5883 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5885 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5890 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5891 if (InfoBuffer
== NULL
)
5892 return STATUS_INSUFFICIENT_RESOURCES
;
5894 /* Get the AdminComment string */
5895 Status
= SampGetObjectAttributeString(UserObject
,
5897 &InfoBuffer
->AdminComment
.AdminComment
);
5898 if (!NT_SUCCESS(Status
))
5900 TRACE("Status 0x%08lx\n", Status
);
5904 *Buffer
= InfoBuffer
;
5907 if (!NT_SUCCESS(Status
))
5909 if (InfoBuffer
!= NULL
)
5911 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5912 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5914 midl_user_free(InfoBuffer
);
5923 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5924 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5926 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5931 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5932 if (InfoBuffer
== NULL
)
5933 return STATUS_INSUFFICIENT_RESOURCES
;
5935 /* Get the WorkStations string */
5936 Status
= SampGetObjectAttributeString(UserObject
,
5938 &InfoBuffer
->WorkStations
.WorkStations
);
5939 if (!NT_SUCCESS(Status
))
5941 TRACE("Status 0x%08lx\n", Status
);
5945 *Buffer
= InfoBuffer
;
5948 if (!NT_SUCCESS(Status
))
5950 if (InfoBuffer
!= NULL
)
5952 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
5953 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
5955 midl_user_free(InfoBuffer
);
5965 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
5966 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5968 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5969 SAM_USER_FIXED_DATA FixedData
;
5975 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5976 if (InfoBuffer
== NULL
)
5977 return STATUS_INSUFFICIENT_RESOURCES
;
5979 Length
= sizeof(SAM_USER_FIXED_DATA
);
5980 Status
= SampGetObjectAttribute(UserObject
,
5985 if (!NT_SUCCESS(Status
))
5988 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
5990 *Buffer
= InfoBuffer
;
5993 if (!NT_SUCCESS(Status
))
5995 if (InfoBuffer
!= NULL
)
5997 midl_user_free(InfoBuffer
);
6007 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
6008 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6010 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6011 SAM_USER_FIXED_DATA FixedData
;
6017 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6018 if (InfoBuffer
== NULL
)
6019 return STATUS_INSUFFICIENT_RESOURCES
;
6021 Length
= sizeof(SAM_USER_FIXED_DATA
);
6022 Status
= SampGetObjectAttribute(UserObject
,
6027 if (!NT_SUCCESS(Status
))
6030 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6031 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6033 *Buffer
= InfoBuffer
;
6036 if (!NT_SUCCESS(Status
))
6038 if (InfoBuffer
!= NULL
)
6040 midl_user_free(InfoBuffer
);
6050 SampQueryUserInternal1(PSAM_DB_OBJECT UserObject
,
6051 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6053 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6055 NTSTATUS Status
= STATUS_SUCCESS
;
6057 /* Fail, if the caller is not a trusted caller */
6058 if (UserObject
->Trusted
== FALSE
)
6059 return STATUS_INVALID_INFO_CLASS
;
6063 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6064 if (InfoBuffer
== NULL
)
6065 return STATUS_INSUFFICIENT_RESOURCES
;
6067 /* Get the NT password */
6069 SampGetObjectAttribute(UserObject
,
6075 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6077 Status
= SampGetObjectAttribute(UserObject
,
6080 (PVOID
)&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6082 if (!NT_SUCCESS(Status
))
6086 InfoBuffer
->Internal1
.NtPasswordPresent
= (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
6088 /* Get the LM password */
6090 SampGetObjectAttribute(UserObject
,
6096 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6098 Status
= SampGetObjectAttribute(UserObject
,
6101 (PVOID
)&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6103 if (!NT_SUCCESS(Status
))
6107 InfoBuffer
->Internal1
.LmPasswordPresent
= (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
6109 InfoBuffer
->Internal1
.PasswordExpired
= FALSE
;
6111 *Buffer
= InfoBuffer
;
6114 if (!NT_SUCCESS(Status
))
6116 if (InfoBuffer
!= NULL
)
6118 midl_user_free(InfoBuffer
);
6127 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
6128 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6130 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6135 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6136 if (InfoBuffer
== NULL
)
6137 return STATUS_INSUFFICIENT_RESOURCES
;
6139 /* Get the Parameters string */
6140 Status
= SampGetObjectAttributeString(UserObject
,
6142 &InfoBuffer
->Parameters
.Parameters
);
6143 if (!NT_SUCCESS(Status
))
6145 TRACE("Status 0x%08lx\n", Status
);
6149 *Buffer
= InfoBuffer
;
6152 if (!NT_SUCCESS(Status
))
6154 if (InfoBuffer
!= NULL
)
6156 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
6157 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
6159 midl_user_free(InfoBuffer
);
6170 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
6171 IN USER_INFORMATION_CLASS UserInformationClass
,
6172 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6174 PSAM_DB_OBJECT UserObject
;
6175 ACCESS_MASK DesiredAccess
;
6178 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
6179 UserHandle
, UserInformationClass
, Buffer
);
6181 switch (UserInformationClass
)
6183 case UserGeneralInformation
:
6184 case UserNameInformation
:
6185 case UserAccountNameInformation
:
6186 case UserFullNameInformation
:
6187 case UserPrimaryGroupInformation
:
6188 case UserAdminCommentInformation
:
6189 DesiredAccess
= USER_READ_GENERAL
;
6192 case UserLogonHoursInformation
:
6193 case UserHomeInformation
:
6194 case UserScriptInformation
:
6195 case UserProfileInformation
:
6196 case UserWorkStationsInformation
:
6197 DesiredAccess
= USER_READ_LOGON
;
6200 case UserControlInformation
:
6201 case UserExpiresInformation
:
6202 case UserParametersInformation
:
6203 DesiredAccess
= USER_READ_ACCOUNT
;
6206 case UserPreferencesInformation
:
6207 DesiredAccess
= USER_READ_GENERAL
|
6208 USER_READ_PREFERENCES
;
6211 case UserLogonInformation
:
6212 case UserAccountInformation
:
6213 DesiredAccess
= USER_READ_GENERAL
|
6214 USER_READ_PREFERENCES
|
6219 case UserInternal1Information
:
6224 return STATUS_INVALID_INFO_CLASS
;
6227 /* Validate the domain handle */
6228 Status
= SampValidateDbObject(UserHandle
,
6232 if (!NT_SUCCESS(Status
))
6234 TRACE("failed with status 0x%08lx\n", Status
);
6238 switch (UserInformationClass
)
6240 case UserGeneralInformation
:
6241 Status
= SampQueryUserGeneral(UserObject
,
6245 case UserPreferencesInformation
:
6246 Status
= SampQueryUserPreferences(UserObject
,
6250 case UserLogonInformation
:
6251 Status
= SampQueryUserLogon(UserObject
,
6255 // case UserLogonHoursInformation:
6256 // Status = SampQueryUserLogonHours(UserObject,
6260 case UserAccountInformation
:
6261 Status
= SampQueryUserAccount(UserObject
,
6265 case UserNameInformation
:
6266 Status
= SampQueryUserName(UserObject
,
6270 case UserAccountNameInformation
:
6271 Status
= SampQueryUserAccountName(UserObject
,
6275 case UserFullNameInformation
:
6276 Status
= SampQueryUserFullName(UserObject
,
6280 case UserPrimaryGroupInformation
:
6281 Status
= SampQueryUserPrimaryGroup(UserObject
,
6285 case UserHomeInformation
:
6286 Status
= SampQueryUserHome(UserObject
,
6289 case UserScriptInformation
:
6290 Status
= SampQueryUserScript(UserObject
,
6294 case UserProfileInformation
:
6295 Status
= SampQueryUserProfile(UserObject
,
6299 case UserAdminCommentInformation
:
6300 Status
= SampQueryUserAdminComment(UserObject
,
6304 case UserWorkStationsInformation
:
6305 Status
= SampQueryUserWorkStations(UserObject
,
6309 case UserControlInformation
:
6310 Status
= SampQueryUserControl(UserObject
,
6314 case UserExpiresInformation
:
6315 Status
= SampQueryUserExpires(UserObject
,
6319 case UserInternal1Information
:
6320 Status
= SampQueryUserInternal1(UserObject
,
6324 case UserParametersInformation
:
6325 Status
= SampQueryUserParameters(UserObject
,
6329 // case UserAllInformation:
6330 // case UserInternal4Information:
6331 // case UserInternal5Information:
6332 // case UserInternal4InformationNew:
6333 // case UserInternal5InformationNew:
6336 Status
= STATUS_INVALID_INFO_CLASS
;
6344 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
6345 PSAMPR_USER_INFO_BUFFER Buffer
)
6347 SAM_USER_FIXED_DATA FixedData
;
6351 Length
= sizeof(SAM_USER_FIXED_DATA
);
6352 Status
= SampGetObjectAttribute(UserObject
,
6357 if (!NT_SUCCESS(Status
))
6360 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
6362 Status
= SampSetObjectAttribute(UserObject
,
6367 if (!NT_SUCCESS(Status
))
6370 Status
= SampSetObjectAttribute(UserObject
,
6373 Buffer
->General
.UserName
.Buffer
,
6374 Buffer
->General
.UserName
.MaximumLength
);
6375 if (!NT_SUCCESS(Status
))
6378 Status
= SampSetObjectAttribute(UserObject
,
6381 Buffer
->General
.FullName
.Buffer
,
6382 Buffer
->General
.FullName
.MaximumLength
);
6383 if (!NT_SUCCESS(Status
))
6386 Status
= SampSetObjectAttribute(UserObject
,
6389 Buffer
->General
.AdminComment
.Buffer
,
6390 Buffer
->General
.AdminComment
.MaximumLength
);
6391 if (!NT_SUCCESS(Status
))
6394 Status
= SampSetObjectAttribute(UserObject
,
6397 Buffer
->General
.UserComment
.Buffer
,
6398 Buffer
->General
.UserComment
.MaximumLength
);
6406 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
6407 PSAMPR_USER_INFO_BUFFER Buffer
)
6409 SAM_USER_FIXED_DATA FixedData
;
6413 Length
= sizeof(SAM_USER_FIXED_DATA
);
6414 Status
= SampGetObjectAttribute(UserObject
,
6419 if (!NT_SUCCESS(Status
))
6422 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6423 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6425 Status
= SampSetObjectAttribute(UserObject
,
6430 if (!NT_SUCCESS(Status
))
6433 Status
= SampSetObjectAttribute(UserObject
,
6436 Buffer
->Preferences
.UserComment
.Buffer
,
6437 Buffer
->Preferences
.UserComment
.MaximumLength
);
6445 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
6446 PSAMPR_USER_INFO_BUFFER Buffer
)
6448 SAM_USER_FIXED_DATA FixedData
;
6452 Length
= sizeof(SAM_USER_FIXED_DATA
);
6453 Status
= SampGetObjectAttribute(UserObject
,
6458 if (!NT_SUCCESS(Status
))
6461 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
6463 Status
= SampSetObjectAttribute(UserObject
,
6475 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
6476 PSAMPR_USER_INFO_BUFFER Buffer
)
6478 SAM_USER_FIXED_DATA FixedData
;
6482 Length
= sizeof(SAM_USER_FIXED_DATA
);
6483 Status
= SampGetObjectAttribute(UserObject
,
6488 if (!NT_SUCCESS(Status
))
6491 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
6493 Status
= SampSetObjectAttribute(UserObject
,
6505 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
6506 PSAMPR_USER_INFO_BUFFER Buffer
)
6508 SAM_USER_FIXED_DATA FixedData
;
6512 Length
= sizeof(SAM_USER_FIXED_DATA
);
6513 Status
= SampGetObjectAttribute(UserObject
,
6518 if (!NT_SUCCESS(Status
))
6521 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
6522 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
6524 Status
= SampSetObjectAttribute(UserObject
,
6536 SampSetUserInternal1(PSAM_DB_OBJECT UserObject
,
6537 PSAMPR_USER_INFO_BUFFER Buffer
)
6539 SAM_USER_FIXED_DATA FixedData
;
6541 NTSTATUS Status
= STATUS_SUCCESS
;
6543 /* FIXME: Decrypt NT password */
6544 /* FIXME: Decrypt LM password */
6546 Status
= SampSetUserPassword(UserObject
,
6547 &Buffer
->Internal1
.EncryptedNtOwfPassword
,
6548 Buffer
->Internal1
.NtPasswordPresent
,
6549 &Buffer
->Internal1
.EncryptedLmOwfPassword
,
6550 Buffer
->Internal1
.LmPasswordPresent
);
6551 if (!NT_SUCCESS(Status
))
6554 /* Get the fixed user attributes */
6555 Length
= sizeof(SAM_USER_FIXED_DATA
);
6556 Status
= SampGetObjectAttribute(UserObject
,
6561 if (!NT_SUCCESS(Status
))
6564 if (Buffer
->Internal1
.PasswordExpired
)
6566 /* The pasword was last set ages ago */
6567 FixedData
.PasswordLastSet
.LowPart
= 0;
6568 FixedData
.PasswordLastSet
.HighPart
= 0;
6572 /* The pasword was last set right now */
6573 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
6574 if (!NT_SUCCESS(Status
))
6578 /* Set the fixed user attributes */
6579 Status
= SampSetObjectAttribute(UserObject
,
6591 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
6592 PSAMPR_USER_INFO_BUFFER Buffer
)
6594 SAM_USER_FIXED_DATA FixedData
;
6597 NTSTATUS Status
= STATUS_SUCCESS
;
6599 WhichFields
= Buffer
->All
.WhichFields
;
6601 if (WhichFields
& USER_ALL_USERNAME
)
6603 Status
= SampSetObjectAttribute(UserObject
,
6606 Buffer
->All
.UserName
.Buffer
,
6607 Buffer
->All
.UserName
.MaximumLength
);
6608 if (!NT_SUCCESS(Status
))
6612 if (WhichFields
& USER_ALL_FULLNAME
)
6614 Status
= SampSetObjectAttribute(UserObject
,
6617 Buffer
->All
.FullName
.Buffer
,
6618 Buffer
->All
.FullName
.MaximumLength
);
6619 if (!NT_SUCCESS(Status
))
6623 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
6625 Status
= SampSetObjectAttribute(UserObject
,
6628 Buffer
->All
.AdminComment
.Buffer
,
6629 Buffer
->All
.AdminComment
.MaximumLength
);
6630 if (!NT_SUCCESS(Status
))
6634 if (WhichFields
& USER_ALL_USERCOMMENT
)
6636 Status
= SampSetObjectAttribute(UserObject
,
6639 Buffer
->All
.UserComment
.Buffer
,
6640 Buffer
->All
.UserComment
.MaximumLength
);
6641 if (!NT_SUCCESS(Status
))
6645 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
6647 Status
= SampSetObjectAttribute(UserObject
,
6650 Buffer
->All
.HomeDirectory
.Buffer
,
6651 Buffer
->All
.HomeDirectory
.MaximumLength
);
6652 if (!NT_SUCCESS(Status
))
6656 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6658 Status
= SampSetObjectAttribute(UserObject
,
6659 L
"HomeDirectoryDrive",
6661 Buffer
->All
.HomeDirectoryDrive
.Buffer
,
6662 Buffer
->All
.HomeDirectoryDrive
.MaximumLength
);
6663 if (!NT_SUCCESS(Status
))
6667 if (WhichFields
& USER_ALL_SCRIPTPATH
)
6669 Status
= SampSetObjectAttribute(UserObject
,
6672 Buffer
->All
.ScriptPath
.Buffer
,
6673 Buffer
->All
.ScriptPath
.MaximumLength
);
6674 if (!NT_SUCCESS(Status
))
6678 if (WhichFields
& USER_ALL_PROFILEPATH
)
6680 Status
= SampSetObjectAttribute(UserObject
,
6683 Buffer
->All
.ProfilePath
.Buffer
,
6684 Buffer
->All
.ProfilePath
.MaximumLength
);
6685 if (!NT_SUCCESS(Status
))
6689 if (WhichFields
& USER_ALL_WORKSTATIONS
)
6691 Status
= SampSetObjectAttribute(UserObject
,
6694 Buffer
->All
.WorkStations
.Buffer
,
6695 Buffer
->All
.WorkStations
.MaximumLength
);
6696 if (!NT_SUCCESS(Status
))
6700 if (WhichFields
& USER_ALL_PARAMETERS
)
6702 Status
= SampSetObjectAttribute(UserObject
,
6705 Buffer
->All
.Parameters
.Buffer
,
6706 Buffer
->All
.Parameters
.MaximumLength
);
6709 if (WhichFields
& (USER_ALL_PRIMARYGROUPID
|
6710 USER_ALL_ACCOUNTEXPIRES
|
6711 USER_ALL_USERACCOUNTCONTROL
|
6712 USER_ALL_COUNTRYCODE
|
6715 Length
= sizeof(SAM_USER_FIXED_DATA
);
6716 Status
= SampGetObjectAttribute(UserObject
,
6721 if (!NT_SUCCESS(Status
))
6724 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
6725 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
6727 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
6729 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
6730 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
6733 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
6734 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
6736 if (WhichFields
& USER_ALL_COUNTRYCODE
)
6737 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6739 if (WhichFields
& USER_ALL_CODEPAGE
)
6740 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6742 Status
= SampSetObjectAttribute(UserObject
,
6747 if (!NT_SUCCESS(Status
))
6754 USER_ALL_NTPASSWORDPRESENT
6755 USER_ALL_LMPASSWORDPRESENT
6756 USER_ALL_PASSWORDEXPIRED
6768 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
6769 IN USER_INFORMATION_CLASS UserInformationClass
,
6770 IN PSAMPR_USER_INFO_BUFFER Buffer
)
6772 PSAM_DB_OBJECT UserObject
;
6773 ACCESS_MASK DesiredAccess
;
6776 TRACE("SamrSetInformationUser(%p %lu %p)\n",
6777 UserHandle
, UserInformationClass
, Buffer
);
6779 switch (UserInformationClass
)
6781 case UserLogonHoursInformation
:
6782 case UserNameInformation
:
6783 case UserAccountNameInformation
:
6784 case UserFullNameInformation
:
6785 case UserPrimaryGroupInformation
:
6786 case UserHomeInformation
:
6787 case UserScriptInformation
:
6788 case UserProfileInformation
:
6789 case UserAdminCommentInformation
:
6790 case UserWorkStationsInformation
:
6791 case UserControlInformation
:
6792 case UserExpiresInformation
:
6793 case UserParametersInformation
:
6794 DesiredAccess
= USER_WRITE_ACCOUNT
;
6797 case UserGeneralInformation
:
6798 DesiredAccess
= USER_WRITE_ACCOUNT
|
6799 USER_WRITE_PREFERENCES
;
6802 case UserPreferencesInformation
:
6803 DesiredAccess
= USER_WRITE_PREFERENCES
;
6806 case UserSetPasswordInformation
:
6807 case UserInternal1Information
:
6808 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
6811 case UserAllInformation
:
6812 DesiredAccess
= 0; /* FIXME */
6816 return STATUS_INVALID_INFO_CLASS
;
6819 /* Validate the domain handle */
6820 Status
= SampValidateDbObject(UserHandle
,
6824 if (!NT_SUCCESS(Status
))
6826 TRACE("failed with status 0x%08lx\n", Status
);
6830 switch (UserInformationClass
)
6832 case UserGeneralInformation
:
6833 Status
= SampSetUserGeneral(UserObject
,
6837 case UserPreferencesInformation
:
6838 Status
= SampSetUserPreferences(UserObject
,
6842 case UserLogonHoursInformation:
6843 Status = SampSetUserLogonHours(UserObject,
6847 case UserNameInformation
:
6848 Status
= SampSetObjectAttribute(UserObject
,
6851 Buffer
->Name
.UserName
.Buffer
,
6852 Buffer
->Name
.UserName
.MaximumLength
);
6853 if (!NT_SUCCESS(Status
))
6856 Status
= SampSetObjectAttribute(UserObject
,
6859 Buffer
->Name
.FullName
.Buffer
,
6860 Buffer
->Name
.FullName
.MaximumLength
);
6863 case UserAccountNameInformation
:
6864 Status
= SampSetObjectAttribute(UserObject
,
6867 Buffer
->AccountName
.UserName
.Buffer
,
6868 Buffer
->AccountName
.UserName
.MaximumLength
);
6871 case UserFullNameInformation
:
6872 Status
= SampSetObjectAttribute(UserObject
,
6875 Buffer
->FullName
.FullName
.Buffer
,
6876 Buffer
->FullName
.FullName
.MaximumLength
);
6879 case UserPrimaryGroupInformation
:
6880 Status
= SampSetUserPrimaryGroup(UserObject
,
6884 case UserHomeInformation
:
6885 Status
= SampSetObjectAttribute(UserObject
,
6888 Buffer
->Home
.HomeDirectory
.Buffer
,
6889 Buffer
->Home
.HomeDirectory
.MaximumLength
);
6890 if (!NT_SUCCESS(Status
))
6893 Status
= SampSetObjectAttribute(UserObject
,
6894 L
"HomeDirectoryDrive",
6896 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
6897 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
6900 case UserScriptInformation
:
6901 Status
= SampSetObjectAttribute(UserObject
,
6904 Buffer
->Script
.ScriptPath
.Buffer
,
6905 Buffer
->Script
.ScriptPath
.MaximumLength
);
6908 case UserProfileInformation
:
6909 Status
= SampSetObjectAttribute(UserObject
,
6912 Buffer
->Profile
.ProfilePath
.Buffer
,
6913 Buffer
->Profile
.ProfilePath
.MaximumLength
);
6916 case UserAdminCommentInformation
:
6917 Status
= SampSetObjectAttribute(UserObject
,
6920 Buffer
->AdminComment
.AdminComment
.Buffer
,
6921 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
6924 case UserWorkStationsInformation
:
6925 Status
= SampSetObjectAttribute(UserObject
,
6928 Buffer
->WorkStations
.WorkStations
.Buffer
,
6929 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
6932 case UserSetPasswordInformation
:
6933 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
6934 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
6936 Status
= SampSetObjectAttribute(UserObject
,
6939 Buffer
->SetPassword
.Password
.Buffer
,
6940 Buffer
->SetPassword
.Password
.MaximumLength
);
6943 case UserControlInformation
:
6944 Status
= SampSetUserControl(UserObject
,
6948 case UserExpiresInformation
:
6949 Status
= SampSetUserExpires(UserObject
,
6953 case UserInternal1Information
:
6954 Status
= SampSetUserInternal1(UserObject
,
6958 case UserParametersInformation
:
6959 Status
= SampSetObjectAttribute(UserObject
,
6962 Buffer
->Parameters
.Parameters
.Buffer
,
6963 Buffer
->Parameters
.Parameters
.MaximumLength
);
6966 case UserAllInformation
:
6967 Status
= SampSetUserAll(UserObject
,
6971 // case UserInternal4Information:
6972 // case UserInternal5Information:
6973 // case UserInternal4InformationNew:
6974 // case UserInternal5InformationNew:
6977 Status
= STATUS_INVALID_INFO_CLASS
;
6987 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
6988 IN
unsigned char LmPresent
,
6989 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
6990 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
6991 IN
unsigned char NtPresent
,
6992 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
6993 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
6994 IN
unsigned char NtCrossEncryptionPresent
,
6995 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
6996 IN
unsigned char LmCrossEncryptionPresent
,
6997 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
7000 return STATUS_NOT_IMPLEMENTED
;
7007 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
7008 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
7010 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
7011 PSAM_DB_OBJECT UserObject
;
7015 TRACE("SamrGetGroupsForUser(%p %p)\n",
7016 UserHandle
, Groups
);
7018 /* Validate the user handle */
7019 Status
= SampValidateDbObject(UserHandle
,
7023 if (!NT_SUCCESS(Status
))
7025 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7029 /* Allocate the groups buffer */
7030 GroupsBuffer
= midl_user_allocate(sizeof(SAMPR_GET_GROUPS_BUFFER
));
7031 if (GroupsBuffer
== NULL
)
7032 return STATUS_INSUFFICIENT_RESOURCES
;
7035 * Get the size of the Groups attribute.
7036 * Do not check the status code because in case of an error
7037 * Length will be 0. And that is all we need.
7039 SampGetObjectAttribute(UserObject
,
7045 /* If there is no Groups attribute, return a groups buffer without an array */
7048 GroupsBuffer
->MembershipCount
= 0;
7049 GroupsBuffer
->Groups
= NULL
;
7051 *Groups
= GroupsBuffer
;
7053 return STATUS_SUCCESS
;
7056 /* Allocate a buffer for the Groups attribute */
7057 GroupsBuffer
->Groups
= midl_user_allocate(Length
);
7058 if (GroupsBuffer
->Groups
== NULL
)
7060 Status
= STATUS_INSUFFICIENT_RESOURCES
;
7064 /* Retrieve the Grous attribute */
7065 Status
= SampGetObjectAttribute(UserObject
,
7068 GroupsBuffer
->Groups
,
7070 if (!NT_SUCCESS(Status
))
7072 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
7076 /* Calculate the membership count */
7077 GroupsBuffer
->MembershipCount
= Length
/ sizeof(GROUP_MEMBERSHIP
);
7079 /* Return the groups buffer to the caller */
7080 *Groups
= GroupsBuffer
;
7083 if (!NT_SUCCESS(Status
))
7085 if (GroupsBuffer
!= NULL
)
7087 if (GroupsBuffer
->Groups
!= NULL
)
7088 midl_user_free(GroupsBuffer
->Groups
);
7090 midl_user_free(GroupsBuffer
);
7101 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
7102 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7103 IN
unsigned long Index
,
7104 IN
unsigned long EntryCount
,
7105 IN
unsigned long PreferredMaximumLength
,
7106 OUT
unsigned long *TotalAvailable
,
7107 OUT
unsigned long *TotalReturned
,
7108 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7111 return STATUS_NOT_IMPLEMENTED
;
7117 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
7118 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7119 IN PRPC_UNICODE_STRING Prefix
,
7120 OUT
unsigned long *Index
)
7123 return STATUS_NOT_IMPLEMENTED
;
7129 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
7132 return STATUS_NOT_IMPLEMENTED
;
7138 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
7141 return STATUS_NOT_IMPLEMENTED
;
7148 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
7149 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
7151 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
7152 SAM_USER_FIXED_DATA UserFixedData
;
7153 PSAM_DB_OBJECT DomainObject
;
7154 PSAM_DB_OBJECT UserObject
;
7159 UserHandle
, PasswordInformation
);
7161 /* Validate the user handle */
7162 Status
= SampValidateDbObject(UserHandle
,
7166 if (!NT_SUCCESS(Status
))
7168 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7172 /* Validate the domain object */
7173 Status
= SampValidateDbObject((SAMPR_HANDLE
)UserObject
->ParentObject
,
7175 DOMAIN_READ_PASSWORD_PARAMETERS
,
7177 if (!NT_SUCCESS(Status
))
7179 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7183 /* Get fixed user data */
7184 Length
= sizeof(SAM_USER_FIXED_DATA
);
7185 Status
= SampGetObjectAttribute(UserObject
,
7188 (PVOID
)&UserFixedData
,
7190 if (!NT_SUCCESS(Status
))
7192 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
7196 if ((UserObject
->RelativeId
== DOMAIN_USER_RID_KRBTGT
) ||
7197 (UserFixedData
.UserAccountControl
& (USER_INTERDOMAIN_TRUST_ACCOUNT
|
7198 USER_WORKSTATION_TRUST_ACCOUNT
|
7199 USER_SERVER_TRUST_ACCOUNT
)))
7201 PasswordInformation
->MinPasswordLength
= 0;
7202 PasswordInformation
->PasswordProperties
= 0;
7206 /* Get fixed domain data */
7207 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
7208 Status
= SampGetObjectAttribute(DomainObject
,
7211 (PVOID
)&DomainFixedData
,
7213 if (!NT_SUCCESS(Status
))
7215 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
7219 PasswordInformation
->MinPasswordLength
= DomainFixedData
.MinPasswordLength
;
7220 PasswordInformation
->PasswordProperties
= DomainFixedData
.PasswordProperties
;
7223 return STATUS_SUCCESS
;
7230 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
7231 IN PRPC_SID MemberSid
)
7234 return STATUS_NOT_IMPLEMENTED
;
7241 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
7242 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
7243 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
7245 TRACE("(%p %lu %p)\n", DomainHandle
, DomainInformationClass
, Buffer
);
7247 return SamrQueryInformationDomain(DomainHandle
,
7248 DomainInformationClass
,
7256 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
7257 IN USER_INFORMATION_CLASS UserInformationClass
,
7258 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
7260 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
7262 return SamrQueryInformationUser(UserHandle
,
7263 UserInformationClass
,
7271 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
7272 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7273 IN
unsigned long Index
,
7274 IN
unsigned long EntryCount
,
7275 IN
unsigned long PreferredMaximumLength
,
7276 OUT
unsigned long *TotalAvailable
,
7277 OUT
unsigned long *TotalReturned
,
7278 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7280 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
7281 DomainHandle
, DisplayInformationClass
, Index
,
7282 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
7283 TotalReturned
, Buffer
);
7285 return SamrQueryDisplayInformation(DomainHandle
,
7286 DisplayInformationClass
,
7289 PreferredMaximumLength
,
7299 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
7300 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7301 IN PRPC_UNICODE_STRING Prefix
,
7302 OUT
unsigned long *Index
)
7304 TRACE("(%p %lu %p %p)\n",
7305 DomainHandle
, DisplayInformationClass
, Prefix
, Index
);
7307 return SamrGetDisplayEnumerationIndex(DomainHandle
,
7308 DisplayInformationClass
,
7317 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
7318 IN PRPC_UNICODE_STRING Name
,
7319 IN
unsigned long AccountType
,
7320 IN ACCESS_MASK DesiredAccess
,
7321 OUT SAMPR_HANDLE
*UserHandle
,
7322 OUT
unsigned long *GrantedAccess
,
7323 OUT
unsigned long *RelativeId
)
7325 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
7326 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
7327 SAM_USER_FIXED_DATA FixedUserData
;
7328 PSAM_DB_OBJECT DomainObject
;
7329 PSAM_DB_OBJECT UserObject
;
7335 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
7336 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
7339 Name
->Length
== 0 ||
7340 Name
->Buffer
== NULL
||
7341 UserHandle
== NULL
||
7343 return STATUS_INVALID_PARAMETER
;
7345 /* Check for valid account type */
7346 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
7347 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
7348 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
7349 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
7350 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
7351 return STATUS_INVALID_PARAMETER
;
7353 /* Map generic access rights */
7354 RtlMapGenericMask(&DesiredAccess
,
7357 /* Validate the domain handle */
7358 Status
= SampValidateDbObject(DomainHandle
,
7362 if (!NT_SUCCESS(Status
))
7364 TRACE("failed with status 0x%08lx\n", Status
);
7368 /* Check if the user name already exists in the domain */
7369 Status
= SampCheckAccountNameInDomain(DomainObject
,
7371 if (!NT_SUCCESS(Status
))
7373 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
7374 Name
->Buffer
, Status
);
7378 /* Get the fixed domain attributes */
7379 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
7380 Status
= SampGetObjectAttribute(DomainObject
,
7383 (PVOID
)&FixedDomainData
,
7385 if (!NT_SUCCESS(Status
))
7387 TRACE("failed with status 0x%08lx\n", Status
);
7391 /* Increment the NextRid attribute */
7392 ulRid
= FixedDomainData
.NextRid
;
7393 FixedDomainData
.NextRid
++;
7395 /* Store the fixed domain attributes */
7396 Status
= SampSetObjectAttribute(DomainObject
,
7401 if (!NT_SUCCESS(Status
))
7403 TRACE("failed with status 0x%08lx\n", Status
);
7407 TRACE("RID: %lx\n", ulRid
);
7409 /* Convert the RID into a string (hex) */
7410 swprintf(szRid
, L
"%08lX", ulRid
);
7412 /* Create the user object */
7413 Status
= SampCreateDbObject(DomainObject
,
7420 if (!NT_SUCCESS(Status
))
7422 TRACE("failed with status 0x%08lx\n", Status
);
7426 /* Add the account name for the user object */
7427 Status
= SampSetAccountNameInDomain(DomainObject
,
7431 if (!NT_SUCCESS(Status
))
7433 TRACE("failed with status 0x%08lx\n", Status
);
7437 /* Initialize fixed user data */
7438 FixedUserData
.Version
= 1;
7439 FixedUserData
.Reserved
= 0;
7440 FixedUserData
.LastLogon
.QuadPart
= 0;
7441 FixedUserData
.LastLogoff
.QuadPart
= 0;
7442 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
7443 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
7444 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
7445 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
7446 FixedUserData
.UserId
= ulRid
;
7447 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
7448 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
7449 USER_PASSWORD_NOT_REQUIRED
|
7451 FixedUserData
.CountryCode
= 0;
7452 FixedUserData
.CodePage
= 0;
7453 FixedUserData
.BadPasswordCount
= 0;
7454 FixedUserData
.LogonCount
= 0;
7455 FixedUserData
.AdminCount
= 0;
7456 FixedUserData
.OperatorCount
= 0;
7458 /* Set fixed user data attribute */
7459 Status
= SampSetObjectAttribute(UserObject
,
7462 (LPVOID
)&FixedUserData
,
7463 sizeof(SAM_USER_FIXED_DATA
));
7464 if (!NT_SUCCESS(Status
))
7466 TRACE("failed with status 0x%08lx\n", Status
);
7470 /* Set the Name attribute */
7471 Status
= SampSetObjectAttribute(UserObject
,
7474 (LPVOID
)Name
->Buffer
,
7475 Name
->MaximumLength
);
7476 if (!NT_SUCCESS(Status
))
7478 TRACE("failed with status 0x%08lx\n", Status
);
7482 /* Set the FullName attribute */
7483 Status
= SampSetObjectAttribute(UserObject
,
7487 EmptyString
.MaximumLength
);
7488 if (!NT_SUCCESS(Status
))
7490 TRACE("failed with status 0x%08lx\n", Status
);
7494 /* Set the HomeDirectory attribute */
7495 Status
= SampSetObjectAttribute(UserObject
,
7499 EmptyString
.MaximumLength
);
7500 if (!NT_SUCCESS(Status
))
7502 TRACE("failed with status 0x%08lx\n", Status
);
7506 /* Set the HomeDirectoryDrive attribute */
7507 Status
= SampSetObjectAttribute(UserObject
,
7508 L
"HomeDirectoryDrive",
7511 EmptyString
.MaximumLength
);
7512 if (!NT_SUCCESS(Status
))
7514 TRACE("failed with status 0x%08lx\n", Status
);
7518 /* Set the ScriptPath attribute */
7519 Status
= SampSetObjectAttribute(UserObject
,
7523 EmptyString
.MaximumLength
);
7524 if (!NT_SUCCESS(Status
))
7526 TRACE("failed with status 0x%08lx\n", Status
);
7530 /* Set the ProfilePath attribute */
7531 Status
= SampSetObjectAttribute(UserObject
,
7535 EmptyString
.MaximumLength
);
7536 if (!NT_SUCCESS(Status
))
7538 TRACE("failed with status 0x%08lx\n", Status
);
7542 /* Set the AdminComment attribute */
7543 Status
= SampSetObjectAttribute(UserObject
,
7547 EmptyString
.MaximumLength
);
7548 if (!NT_SUCCESS(Status
))
7550 TRACE("failed with status 0x%08lx\n", Status
);
7554 /* Set the UserComment attribute */
7555 Status
= SampSetObjectAttribute(UserObject
,
7559 EmptyString
.MaximumLength
);
7560 if (!NT_SUCCESS(Status
))
7562 TRACE("failed with status 0x%08lx\n", Status
);
7566 /* Set the WorkStations attribute */
7567 Status
= SampSetObjectAttribute(UserObject
,
7571 EmptyString
.MaximumLength
);
7572 if (!NT_SUCCESS(Status
))
7574 TRACE("failed with status 0x%08lx\n", Status
);
7578 /* Set the Parameters attribute */
7579 Status
= SampSetObjectAttribute(UserObject
,
7583 EmptyString
.MaximumLength
);
7584 if (!NT_SUCCESS(Status
))
7586 TRACE("failed with status 0x%08lx\n", Status
);
7590 /* FIXME: Set LogonHours attribute*/
7591 /* FIXME: Set Groups attribute*/
7593 /* Set LMPwd attribute*/
7594 Status
= SampSetObjectAttribute(UserObject
,
7599 if (!NT_SUCCESS(Status
))
7601 TRACE("failed with status 0x%08lx\n", Status
);
7605 /* Set NTPwd attribute*/
7606 Status
= SampSetObjectAttribute(UserObject
,
7611 if (!NT_SUCCESS(Status
))
7613 TRACE("failed with status 0x%08lx\n", Status
);
7617 /* Set LMPwdHistory attribute*/
7618 Status
= SampSetObjectAttribute(UserObject
,
7623 if (!NT_SUCCESS(Status
))
7625 TRACE("failed with status 0x%08lx\n", Status
);
7629 /* Set NTPwdHistory attribute*/
7630 Status
= SampSetObjectAttribute(UserObject
,
7635 if (!NT_SUCCESS(Status
))
7637 TRACE("failed with status 0x%08lx\n", Status
);
7641 /* FIXME: Set SecDesc attribute*/
7643 if (NT_SUCCESS(Status
))
7645 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
7646 *RelativeId
= ulRid
;
7647 *GrantedAccess
= UserObject
->Access
;
7650 TRACE("returns with status 0x%08lx\n", Status
);
7659 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
7660 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7661 IN
unsigned long Index
,
7662 IN
unsigned long EntryCount
,
7663 IN
unsigned long PreferredMaximumLength
,
7664 OUT
unsigned long *TotalAvailable
,
7665 OUT
unsigned long *TotalReturned
,
7666 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7668 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
7669 DomainHandle
, DisplayInformationClass
, Index
,
7670 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
7671 TotalReturned
, Buffer
);
7673 return SamrQueryDisplayInformation(DomainHandle
,
7674 DisplayInformationClass
,
7677 PreferredMaximumLength
,
7687 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
7688 IN PSAMPR_PSID_ARRAY MembersBuffer
)
7691 NTSTATUS Status
= STATUS_SUCCESS
;
7693 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
7694 AliasHandle
, MembersBuffer
);
7696 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
7698 Status
= SamrAddMemberToAlias(AliasHandle
,
7699 ((PSID
*)MembersBuffer
->Sids
)[i
]);
7701 if (Status
== STATUS_MEMBER_IN_ALIAS
)
7702 Status
= STATUS_SUCCESS
;
7704 if (!NT_SUCCESS(Status
))
7715 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
7716 IN PSAMPR_PSID_ARRAY MembersBuffer
)
7719 NTSTATUS Status
= STATUS_SUCCESS
;
7721 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
7722 AliasHandle
, MembersBuffer
);
7724 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
7726 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
7727 ((PSID
*)MembersBuffer
->Sids
)[i
]);
7729 if (Status
== STATUS_MEMBER_IN_ALIAS
)
7730 Status
= STATUS_SUCCESS
;
7732 if (!NT_SUCCESS(Status
))
7743 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
7744 IN PRPC_STRING ServerName
,
7745 IN PRPC_STRING UserName
,
7746 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
7747 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
7750 return STATUS_NOT_IMPLEMENTED
;
7756 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
7757 IN PRPC_UNICODE_STRING ServerName
,
7758 IN PRPC_UNICODE_STRING UserName
,
7759 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
7760 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
7761 IN
unsigned char LmPresent
,
7762 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
7763 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
7766 return STATUS_NOT_IMPLEMENTED
;
7772 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
7773 IN PRPC_UNICODE_STRING Unused
,
7774 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
7777 return STATUS_NOT_IMPLEMENTED
;
7783 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
7784 OUT SAMPR_HANDLE
*ServerHandle
,
7785 IN ACCESS_MASK DesiredAccess
)
7788 return STATUS_NOT_IMPLEMENTED
;
7795 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
7796 IN USER_INFORMATION_CLASS UserInformationClass
,
7797 IN PSAMPR_USER_INFO_BUFFER Buffer
)
7799 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
7801 return SamrSetInformationUser(UserHandle
,
7802 UserInformationClass
,
7810 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7813 return STATUS_NOT_IMPLEMENTED
;
7819 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7822 return STATUS_NOT_IMPLEMENTED
;
7828 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
7831 return STATUS_NOT_IMPLEMENTED
;
7837 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
7838 OUT SAMPR_HANDLE
*ServerHandle
,
7839 IN
unsigned long ClientRevision
,
7840 IN ACCESS_MASK DesiredAccess
)
7843 return STATUS_NOT_IMPLEMENTED
;
7849 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
7852 return STATUS_NOT_IMPLEMENTED
;
7858 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
7859 IN ACCESS_MASK DesiredAccess
,
7860 IN
unsigned long InVersion
,
7861 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
7862 OUT
unsigned long *OutVersion
,
7863 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
7864 OUT SAMPR_HANDLE
*ServerHandle
)
7867 return STATUS_NOT_IMPLEMENTED
;
7873 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
7874 IN
unsigned long Rid
,
7878 return STATUS_NOT_IMPLEMENTED
;
7884 SamrSetDSRMPassword(IN handle_t BindingHandle
,
7885 IN PRPC_UNICODE_STRING Unused
,
7886 IN
unsigned long UserId
,
7887 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
7890 return STATUS_NOT_IMPLEMENTED
;
7896 SamrValidatePassword(IN handle_t Handle
,
7897 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
7898 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
7899 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
7902 return STATUS_NOT_IMPLEMENTED
;