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
)
208 PSAM_DB_OBJECT ServerObject
;
211 TRACE("(%p)\n", ServerHandle
);
213 /* Validate the server handle */
214 Status
= SampValidateDbObject(ServerHandle
,
218 if (!NT_SUCCESS(Status
))
221 /* Shut the server down */
222 RpcMgmtStopServerListening(0);
224 return STATUS_SUCCESS
;
231 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
232 IN PRPC_UNICODE_STRING Name
,
233 OUT PRPC_SID
*DomainId
)
235 PSAM_DB_OBJECT ServerObject
;
236 HANDLE DomainsKeyHandle
= NULL
;
237 HANDLE DomainKeyHandle
= NULL
;
238 WCHAR DomainKeyName
[64];
240 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
241 UNICODE_STRING DomainName
;
246 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
247 ServerHandle
, Name
, DomainId
);
249 /* Validate the server handle */
250 Status
= SampValidateDbObject(ServerHandle
,
252 SAM_SERVER_LOOKUP_DOMAIN
,
254 if (!NT_SUCCESS(Status
))
259 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
263 if (!NT_SUCCESS(Status
))
267 while (Found
== FALSE
)
269 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
273 if (!NT_SUCCESS(Status
))
275 if (Status
== STATUS_NO_MORE_ENTRIES
)
276 Status
= STATUS_NO_SUCH_DOMAIN
;
280 TRACE("Domain key name: %S\n", DomainKeyName
);
282 Status
= SampRegOpenKey(DomainsKeyHandle
,
286 if (NT_SUCCESS(Status
))
288 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
289 Status
= SampRegQueryValue(DomainKeyHandle
,
292 (PVOID
)&DomainNameString
,
294 if (NT_SUCCESS(Status
))
296 TRACE("Domain name: %S\n", DomainNameString
);
298 RtlInitUnicodeString(&DomainName
,
300 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
302 TRACE("Found it!\n");
305 Status
= SampRegQueryValue(DomainKeyHandle
,
310 if (NT_SUCCESS(Status
))
312 *DomainId
= midl_user_allocate(Length
);
314 SampRegQueryValue(DomainKeyHandle
,
320 Status
= STATUS_SUCCESS
;
326 NtClose(DomainKeyHandle
);
332 NtClose(DomainsKeyHandle
);
341 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
342 IN OUT
unsigned long *EnumerationContext
,
343 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
344 IN ULONG PreferedMaximumLength
,
345 OUT PULONG CountReturned
)
347 PSAM_DB_OBJECT ServerObject
;
348 WCHAR DomainKeyName
[64];
349 HANDLE DomainsKeyHandle
;
350 HANDLE DomainKeyHandle
;
353 ULONG RequiredLength
;
356 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
359 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
360 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
363 /* Validate the server handle */
364 Status
= SampValidateDbObject(ServerHandle
,
366 SAM_SERVER_ENUMERATE_DOMAINS
,
368 if (!NT_SUCCESS(Status
))
371 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
375 if (!NT_SUCCESS(Status
))
378 EnumIndex
= *EnumerationContext
;
384 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
388 if (!NT_SUCCESS(Status
))
391 TRACE("EnumIndex: %lu\n", EnumIndex
);
392 TRACE("Domain key name: %S\n", DomainKeyName
);
394 Status
= SampRegOpenKey(DomainsKeyHandle
,
398 TRACE("SampRegOpenKey returned %08lX\n", Status
);
399 if (NT_SUCCESS(Status
))
402 Status
= SampRegQueryValue(DomainKeyHandle
,
407 TRACE("SampRegQueryValue returned %08lX\n", Status
);
408 if (NT_SUCCESS(Status
))
410 TRACE("Data length: %lu\n", DataLength
);
412 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
415 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
419 NtClose(DomainKeyHandle
);
425 TRACE("EnumCount: %lu\n", EnumCount
);
426 TRACE("RequiredLength: %lu\n", RequiredLength
);
428 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
429 if (EnumBuffer
== NULL
)
431 Status
= STATUS_INSUFFICIENT_RESOURCES
;
435 EnumBuffer
->EntriesRead
= EnumCount
;
436 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
437 if (EnumBuffer
->Buffer
== NULL
)
439 Status
= STATUS_INSUFFICIENT_RESOURCES
;
443 EnumIndex
= *EnumerationContext
;
444 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
446 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
450 if (!NT_SUCCESS(Status
))
453 TRACE("EnumIndex: %lu\n", EnumIndex
);
454 TRACE("Domain key name: %S\n", DomainKeyName
);
456 Status
= SampRegOpenKey(DomainsKeyHandle
,
460 TRACE("SampRegOpenKey returned %08lX\n", Status
);
461 if (NT_SUCCESS(Status
))
464 Status
= SampRegQueryValue(DomainKeyHandle
,
469 TRACE("SampRegQueryValue returned %08lX\n", Status
);
470 if (NT_SUCCESS(Status
))
472 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
473 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
474 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
475 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
476 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
478 NtClose(DomainKeyHandle
);
479 Status
= STATUS_INSUFFICIENT_RESOURCES
;
483 Status
= SampRegQueryValue(DomainKeyHandle
,
486 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
488 TRACE("SampRegQueryValue returned %08lX\n", Status
);
489 if (NT_SUCCESS(Status
))
491 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
495 NtClose(DomainKeyHandle
);
497 if (!NT_SUCCESS(Status
))
502 if (NT_SUCCESS(Status
))
504 *EnumerationContext
+= EnumCount
;
505 *Buffer
= EnumBuffer
;
506 *CountReturned
= EnumCount
;
510 if (!NT_SUCCESS(Status
))
512 *EnumerationContext
= 0;
516 if (EnumBuffer
!= NULL
)
518 if (EnumBuffer
->Buffer
!= NULL
)
520 if (EnumBuffer
->EntriesRead
!= 0)
522 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
524 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
525 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
529 midl_user_free(EnumBuffer
->Buffer
);
532 midl_user_free(EnumBuffer
);
536 NtClose(DomainsKeyHandle
);
545 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
546 IN ACCESS_MASK DesiredAccess
,
547 IN PRPC_SID DomainId
,
548 OUT SAMPR_HANDLE
*DomainHandle
)
550 PSAM_DB_OBJECT ServerObject
;
551 PSAM_DB_OBJECT DomainObject
;
554 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
555 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
557 /* Map generic access rights */
558 RtlMapGenericMask(&DesiredAccess
,
561 /* Validate the server handle */
562 Status
= SampValidateDbObject(ServerHandle
,
564 SAM_SERVER_LOOKUP_DOMAIN
,
566 if (!NT_SUCCESS(Status
))
569 /* Validate the Domain SID */
570 if ((DomainId
->Revision
!= SID_REVISION
) ||
571 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
572 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
573 return STATUS_INVALID_PARAMETER
;
575 /* Open the domain object */
576 if ((DomainId
->SubAuthorityCount
== 1) &&
577 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
579 /* Builtin domain object */
580 TRACE("Opening the builtin domain object.\n");
582 Status
= SampOpenDbObject(ServerObject
,
590 else if ((DomainId
->SubAuthorityCount
== 4) &&
591 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
593 /* Account domain object */
594 TRACE("Opening the account domain object.\n");
596 /* FIXME: Check the account domain sub authorities!!! */
598 Status
= SampOpenDbObject(ServerObject
,
608 /* No vaild domain SID */
609 Status
= STATUS_INVALID_PARAMETER
;
612 if (NT_SUCCESS(Status
))
613 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
615 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
622 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
623 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
625 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
626 SAM_DOMAIN_FIXED_DATA FixedData
;
632 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
633 if (InfoBuffer
== NULL
)
634 return STATUS_INSUFFICIENT_RESOURCES
;
636 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
637 Status
= SampGetObjectAttribute(DomainObject
,
642 if (!NT_SUCCESS(Status
))
645 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
646 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
647 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
648 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
649 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
650 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
651 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
653 *Buffer
= InfoBuffer
;
656 if (!NT_SUCCESS(Status
))
658 if (InfoBuffer
!= NULL
)
660 midl_user_free(InfoBuffer
);
669 SampGetNumberOfAccounts(PSAM_DB_OBJECT DomainObject
,
673 HANDLE AccountKeyHandle
= NULL
;
674 HANDLE NamesKeyHandle
= NULL
;
679 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
683 if (!NT_SUCCESS(Status
))
686 Status
= SampRegOpenKey(AccountKeyHandle
,
690 if (!NT_SUCCESS(Status
))
693 Status
= SampRegQueryKeyInfo(NamesKeyHandle
,
697 if (NamesKeyHandle
!= NULL
)
698 SampRegCloseKey(NamesKeyHandle
);
700 if (AccountKeyHandle
!= NULL
)
701 SampRegCloseKey(AccountKeyHandle
);
708 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
709 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
711 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
712 SAM_DOMAIN_FIXED_DATA FixedData
;
718 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
719 if (InfoBuffer
== NULL
)
720 return STATUS_INSUFFICIENT_RESOURCES
;
722 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
723 Status
= SampGetObjectAttribute(DomainObject
,
728 if (!NT_SUCCESS(Status
))
731 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
732 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
733 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
734 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
735 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
736 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
737 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
739 /* Get the OemInformation string */
740 Status
= SampGetObjectAttributeString(DomainObject
,
742 &InfoBuffer
->General
.OemInformation
);
743 if (!NT_SUCCESS(Status
))
745 TRACE("Status 0x%08lx\n", Status
);
749 /* Get the Name string */
750 Status
= SampGetObjectAttributeString(DomainObject
,
752 &InfoBuffer
->General
.DomainName
);
753 if (!NT_SUCCESS(Status
))
755 TRACE("Status 0x%08lx\n", Status
);
759 /* Get the ReplicaSourceNodeName string */
760 Status
= SampGetObjectAttributeString(DomainObject
,
761 L
"ReplicaSourceNodeName",
762 &InfoBuffer
->General
.ReplicaSourceNodeName
);
763 if (!NT_SUCCESS(Status
))
765 TRACE("Status 0x%08lx\n", Status
);
769 /* Get the number of Users in the Domain */
770 Status
= SampGetNumberOfAccounts(DomainObject
,
772 &InfoBuffer
->General
.UserCount
);
773 if (!NT_SUCCESS(Status
))
775 TRACE("Status 0x%08lx\n", Status
);
779 /* Get the number of Groups in the Domain */
780 Status
= SampGetNumberOfAccounts(DomainObject
,
782 &InfoBuffer
->General
.GroupCount
);
783 if (!NT_SUCCESS(Status
))
785 TRACE("Status 0x%08lx\n", Status
);
789 /* Get the number of Aliases in the Domain */
790 Status
= SampGetNumberOfAccounts(DomainObject
,
792 &InfoBuffer
->General
.AliasCount
);
793 if (!NT_SUCCESS(Status
))
795 TRACE("Status 0x%08lx\n", Status
);
799 *Buffer
= InfoBuffer
;
802 if (!NT_SUCCESS(Status
))
804 if (InfoBuffer
!= NULL
)
806 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
807 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
809 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
810 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
812 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
813 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
815 midl_user_free(InfoBuffer
);
824 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
825 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
827 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
828 SAM_DOMAIN_FIXED_DATA FixedData
;
834 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
835 if (InfoBuffer
== NULL
)
836 return STATUS_INSUFFICIENT_RESOURCES
;
838 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
839 Status
= SampGetObjectAttribute(DomainObject
,
844 if (!NT_SUCCESS(Status
))
847 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
848 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
850 *Buffer
= InfoBuffer
;
853 if (!NT_SUCCESS(Status
))
855 if (InfoBuffer
!= NULL
)
857 midl_user_free(InfoBuffer
);
866 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
867 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
869 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
874 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
875 if (InfoBuffer
== NULL
)
876 return STATUS_INSUFFICIENT_RESOURCES
;
878 /* Get the OemInformation string */
879 Status
= SampGetObjectAttributeString(DomainObject
,
881 &InfoBuffer
->Oem
.OemInformation
);
882 if (!NT_SUCCESS(Status
))
884 TRACE("Status 0x%08lx\n", Status
);
888 *Buffer
= InfoBuffer
;
891 if (!NT_SUCCESS(Status
))
893 if (InfoBuffer
!= NULL
)
895 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
896 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
898 midl_user_free(InfoBuffer
);
907 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
908 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
910 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
915 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
916 if (InfoBuffer
== NULL
)
917 return STATUS_INSUFFICIENT_RESOURCES
;
919 /* Get the Name string */
920 Status
= SampGetObjectAttributeString(DomainObject
,
922 &InfoBuffer
->Name
.DomainName
);
923 if (!NT_SUCCESS(Status
))
925 TRACE("Status 0x%08lx\n", Status
);
929 *Buffer
= InfoBuffer
;
932 if (!NT_SUCCESS(Status
))
934 if (InfoBuffer
!= NULL
)
936 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
937 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
939 midl_user_free(InfoBuffer
);
948 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
949 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
951 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
956 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
957 if (InfoBuffer
== NULL
)
958 return STATUS_INSUFFICIENT_RESOURCES
;
960 /* Get the ReplicaSourceNodeName string */
961 Status
= SampGetObjectAttributeString(DomainObject
,
962 L
"ReplicaSourceNodeName",
963 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
964 if (!NT_SUCCESS(Status
))
966 TRACE("Status 0x%08lx\n", Status
);
970 *Buffer
= InfoBuffer
;
973 if (!NT_SUCCESS(Status
))
975 if (InfoBuffer
!= NULL
)
977 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
978 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
980 midl_user_free(InfoBuffer
);
989 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
990 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
992 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
993 SAM_DOMAIN_FIXED_DATA FixedData
;
999 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1000 if (InfoBuffer
== NULL
)
1001 return STATUS_INSUFFICIENT_RESOURCES
;
1003 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1004 Status
= SampGetObjectAttribute(DomainObject
,
1009 if (!NT_SUCCESS(Status
))
1012 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
1014 *Buffer
= InfoBuffer
;
1017 if (!NT_SUCCESS(Status
))
1019 if (InfoBuffer
!= NULL
)
1021 midl_user_free(InfoBuffer
);
1030 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
1031 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1033 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1034 SAM_DOMAIN_FIXED_DATA FixedData
;
1040 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1041 if (InfoBuffer
== NULL
)
1042 return STATUS_INSUFFICIENT_RESOURCES
;
1044 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1045 Status
= SampGetObjectAttribute(DomainObject
,
1050 if (!NT_SUCCESS(Status
))
1053 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1054 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1055 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1056 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1058 *Buffer
= InfoBuffer
;
1061 if (!NT_SUCCESS(Status
))
1063 if (InfoBuffer
!= NULL
)
1065 midl_user_free(InfoBuffer
);
1074 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1075 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1077 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1078 SAM_DOMAIN_FIXED_DATA FixedData
;
1084 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1085 if (InfoBuffer
== NULL
)
1086 return STATUS_INSUFFICIENT_RESOURCES
;
1088 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1089 Status
= SampGetObjectAttribute(DomainObject
,
1094 if (!NT_SUCCESS(Status
))
1097 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1099 *Buffer
= InfoBuffer
;
1102 if (!NT_SUCCESS(Status
))
1104 if (InfoBuffer
!= NULL
)
1106 midl_user_free(InfoBuffer
);
1115 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1116 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1118 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1119 SAM_DOMAIN_FIXED_DATA FixedData
;
1125 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1126 if (InfoBuffer
== NULL
)
1127 return STATUS_INSUFFICIENT_RESOURCES
;
1129 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1130 Status
= SampGetObjectAttribute(DomainObject
,
1135 if (!NT_SUCCESS(Status
))
1138 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1139 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1140 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1141 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1142 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1143 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1144 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1146 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1147 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1148 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1150 /* Get the OemInformation string */
1151 Status
= SampGetObjectAttributeString(DomainObject
,
1153 &InfoBuffer
->General2
.I1
.OemInformation
);
1154 if (!NT_SUCCESS(Status
))
1156 TRACE("Status 0x%08lx\n", Status
);
1160 /* Get the Name string */
1161 Status
= SampGetObjectAttributeString(DomainObject
,
1163 &InfoBuffer
->General2
.I1
.DomainName
);
1164 if (!NT_SUCCESS(Status
))
1166 TRACE("Status 0x%08lx\n", Status
);
1170 /* Get the ReplicaSourceNodeName string */
1171 Status
= SampGetObjectAttributeString(DomainObject
,
1172 L
"ReplicaSourceNodeName",
1173 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1174 if (!NT_SUCCESS(Status
))
1176 TRACE("Status 0x%08lx\n", Status
);
1180 /* Get the number of Users in the Domain */
1181 Status
= SampGetNumberOfAccounts(DomainObject
,
1183 &InfoBuffer
->General2
.I1
.UserCount
);
1184 if (!NT_SUCCESS(Status
))
1186 TRACE("Status 0x%08lx\n", Status
);
1190 /* Get the number of Groups in the Domain */
1191 Status
= SampGetNumberOfAccounts(DomainObject
,
1193 &InfoBuffer
->General2
.I1
.GroupCount
);
1194 if (!NT_SUCCESS(Status
))
1196 TRACE("Status 0x%08lx\n", Status
);
1200 /* Get the number of Aliases in the Domain */
1201 Status
= SampGetNumberOfAccounts(DomainObject
,
1203 &InfoBuffer
->General2
.I1
.AliasCount
);
1204 if (!NT_SUCCESS(Status
))
1206 TRACE("Status 0x%08lx\n", Status
);
1210 *Buffer
= InfoBuffer
;
1213 if (!NT_SUCCESS(Status
))
1215 if (InfoBuffer
!= NULL
)
1217 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1218 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1220 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1221 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1223 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1224 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1226 midl_user_free(InfoBuffer
);
1235 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1236 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1238 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1239 SAM_DOMAIN_FIXED_DATA FixedData
;
1245 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1246 if (InfoBuffer
== NULL
)
1247 return STATUS_INSUFFICIENT_RESOURCES
;
1249 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1250 Status
= SampGetObjectAttribute(DomainObject
,
1255 if (!NT_SUCCESS(Status
))
1258 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1259 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1260 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1262 *Buffer
= InfoBuffer
;
1265 if (!NT_SUCCESS(Status
))
1267 if (InfoBuffer
!= NULL
)
1269 midl_user_free(InfoBuffer
);
1278 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1279 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1281 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1282 SAM_DOMAIN_FIXED_DATA FixedData
;
1288 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1289 if (InfoBuffer
== NULL
)
1290 return STATUS_INSUFFICIENT_RESOURCES
;
1292 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1293 Status
= SampGetObjectAttribute(DomainObject
,
1298 if (!NT_SUCCESS(Status
))
1301 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1302 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1303 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1304 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1305 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1306 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1308 *Buffer
= InfoBuffer
;
1311 if (!NT_SUCCESS(Status
))
1313 if (InfoBuffer
!= NULL
)
1315 midl_user_free(InfoBuffer
);
1326 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1327 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1328 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1330 PSAM_DB_OBJECT DomainObject
;
1331 ACCESS_MASK DesiredAccess
;
1334 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1335 DomainHandle
, DomainInformationClass
, Buffer
);
1337 switch (DomainInformationClass
)
1339 case DomainPasswordInformation
:
1340 case DomainLockoutInformation
:
1341 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1344 case DomainGeneralInformation
:
1345 case DomainLogoffInformation
:
1346 case DomainOemInformation
:
1347 case DomainNameInformation
:
1348 case DomainReplicationInformation
:
1349 case DomainServerRoleInformation
:
1350 case DomainModifiedInformation
:
1351 case DomainStateInformation
:
1352 case DomainModifiedInformation2
:
1353 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1356 case DomainGeneralInformation2
:
1357 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1358 DOMAIN_READ_OTHER_PARAMETERS
;
1362 return STATUS_INVALID_INFO_CLASS
;
1365 /* Validate the server handle */
1366 Status
= SampValidateDbObject(DomainHandle
,
1370 if (!NT_SUCCESS(Status
))
1373 switch (DomainInformationClass
)
1375 case DomainPasswordInformation
:
1376 Status
= SampQueryDomainPassword(DomainObject
,
1380 case DomainGeneralInformation
:
1381 Status
= SampQueryDomainGeneral(DomainObject
,
1385 case DomainLogoffInformation
:
1386 Status
= SampQueryDomainLogoff(DomainObject
,
1390 case DomainOemInformation
:
1391 Status
= SampQueryDomainOem(DomainObject
,
1395 case DomainNameInformation
:
1396 Status
= SampQueryDomainName(DomainObject
,
1400 case DomainReplicationInformation
:
1401 Status
= SampQueryDomainReplication(DomainObject
,
1405 case DomainServerRoleInformation
:
1406 Status
= SampQueryDomainServerRole(DomainObject
,
1410 case DomainModifiedInformation
:
1411 Status
= SampQueryDomainModified(DomainObject
,
1415 case DomainStateInformation
:
1416 Status
= SampQueryDomainState(DomainObject
,
1420 case DomainGeneralInformation2
:
1421 Status
= SampQueryDomainGeneral2(DomainObject
,
1425 case DomainLockoutInformation
:
1426 Status
= SampQueryDomainLockout(DomainObject
,
1430 case DomainModifiedInformation2
:
1431 Status
= SampQueryDomainModified2(DomainObject
,
1436 Status
= STATUS_NOT_IMPLEMENTED
;
1444 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1445 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1447 SAM_DOMAIN_FIXED_DATA FixedData
;
1451 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1452 Status
= SampGetObjectAttribute(DomainObject
,
1457 if (!NT_SUCCESS(Status
))
1460 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1461 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1462 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1463 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1464 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1465 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1466 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1468 Status
= SampSetObjectAttribute(DomainObject
,
1480 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1481 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1483 SAM_DOMAIN_FIXED_DATA FixedData
;
1487 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1488 Status
= SampGetObjectAttribute(DomainObject
,
1493 if (!NT_SUCCESS(Status
))
1496 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1497 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1499 Status
= SampSetObjectAttribute(DomainObject
,
1511 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1512 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1514 SAM_DOMAIN_FIXED_DATA FixedData
;
1518 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1519 Status
= SampGetObjectAttribute(DomainObject
,
1524 if (!NT_SUCCESS(Status
))
1527 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1529 Status
= SampSetObjectAttribute(DomainObject
,
1541 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1542 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1544 SAM_DOMAIN_FIXED_DATA FixedData
;
1548 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1549 Status
= SampGetObjectAttribute(DomainObject
,
1554 if (!NT_SUCCESS(Status
))
1557 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1559 Status
= SampSetObjectAttribute(DomainObject
,
1571 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1572 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1574 SAM_DOMAIN_FIXED_DATA FixedData
;
1578 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1579 Status
= SampGetObjectAttribute(DomainObject
,
1584 if (!NT_SUCCESS(Status
))
1587 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1588 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1589 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1591 Status
= SampSetObjectAttribute(DomainObject
,
1605 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1606 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1607 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1609 PSAM_DB_OBJECT DomainObject
;
1610 ACCESS_MASK DesiredAccess
;
1613 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1614 DomainHandle
, DomainInformationClass
, DomainInformation
);
1616 switch (DomainInformationClass
)
1618 case DomainPasswordInformation
:
1619 case DomainLockoutInformation
:
1620 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1623 case DomainLogoffInformation
:
1624 case DomainOemInformation
:
1625 case DomainNameInformation
:
1626 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1629 case DomainReplicationInformation
:
1630 case DomainServerRoleInformation
:
1631 case DomainStateInformation
:
1632 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1636 return STATUS_INVALID_INFO_CLASS
;
1639 /* Validate the server handle */
1640 Status
= SampValidateDbObject(DomainHandle
,
1644 if (!NT_SUCCESS(Status
))
1647 switch (DomainInformationClass
)
1649 case DomainPasswordInformation
:
1650 Status
= SampSetDomainPassword(DomainObject
,
1654 case DomainLogoffInformation
:
1655 Status
= SampSetDomainLogoff(DomainObject
,
1659 case DomainOemInformation
:
1660 Status
= SampSetObjectAttribute(DomainObject
,
1663 DomainInformation
->Oem
.OemInformation
.Buffer
,
1664 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1667 case DomainNameInformation
:
1668 Status
= SampSetObjectAttribute(DomainObject
,
1671 DomainInformation
->Name
.DomainName
.Buffer
,
1672 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1675 case DomainReplicationInformation
:
1676 Status
= SampSetObjectAttribute(DomainObject
,
1677 L
"ReplicaSourceNodeName",
1679 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1680 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1683 case DomainServerRoleInformation
:
1684 Status
= SampSetDomainServerRole(DomainObject
,
1688 case DomainStateInformation
:
1689 Status
= SampSetDomainState(DomainObject
,
1693 case DomainLockoutInformation
:
1694 Status
= SampSetDomainLockout(DomainObject
,
1699 Status
= STATUS_NOT_IMPLEMENTED
;
1709 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1710 IN PRPC_UNICODE_STRING Name
,
1711 IN ACCESS_MASK DesiredAccess
,
1712 OUT SAMPR_HANDLE
*GroupHandle
,
1713 OUT
unsigned long *RelativeId
)
1715 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1716 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1717 SAM_GROUP_FIXED_DATA FixedGroupData
;
1718 PSAM_DB_OBJECT DomainObject
;
1719 PSAM_DB_OBJECT GroupObject
;
1725 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1726 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1728 /* Map generic access rights */
1729 RtlMapGenericMask(&DesiredAccess
,
1732 /* Validate the domain handle */
1733 Status
= SampValidateDbObject(DomainHandle
,
1735 DOMAIN_CREATE_GROUP
,
1737 if (!NT_SUCCESS(Status
))
1739 TRACE("failed with status 0x%08lx\n", Status
);
1743 /* Check if the group name already exists in the domain */
1744 Status
= SampCheckAccountNameInDomain(DomainObject
,
1746 if (!NT_SUCCESS(Status
))
1748 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1749 Name
->Buffer
, Status
);
1753 /* Get the fixed domain attributes */
1754 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1755 Status
= SampGetObjectAttribute(DomainObject
,
1758 (PVOID
)&FixedDomainData
,
1760 if (!NT_SUCCESS(Status
))
1762 TRACE("failed with status 0x%08lx\n", Status
);
1766 /* Increment the NextRid attribute */
1767 ulRid
= FixedDomainData
.NextRid
;
1768 FixedDomainData
.NextRid
++;
1770 /* Store the fixed domain attributes */
1771 Status
= SampSetObjectAttribute(DomainObject
,
1776 if (!NT_SUCCESS(Status
))
1778 TRACE("failed with status 0x%08lx\n", Status
);
1782 TRACE("RID: %lx\n", ulRid
);
1784 /* Convert the RID into a string (hex) */
1785 swprintf(szRid
, L
"%08lX", ulRid
);
1787 /* Create the group object */
1788 Status
= SampCreateDbObject(DomainObject
,
1795 if (!NT_SUCCESS(Status
))
1797 TRACE("failed with status 0x%08lx\n", Status
);
1801 /* Add the account name of the user object */
1802 Status
= SampSetAccountNameInDomain(DomainObject
,
1806 if (!NT_SUCCESS(Status
))
1808 TRACE("failed with status 0x%08lx\n", Status
);
1812 /* Initialize fixed user data */
1813 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1814 FixedGroupData
.Version
= 1;
1816 FixedGroupData
.GroupId
= ulRid
;
1818 /* Set fixed user data attribute */
1819 Status
= SampSetObjectAttribute(GroupObject
,
1822 (LPVOID
)&FixedGroupData
,
1823 sizeof(SAM_GROUP_FIXED_DATA
));
1824 if (!NT_SUCCESS(Status
))
1826 TRACE("failed with status 0x%08lx\n", Status
);
1830 /* Set the Name attribute */
1831 Status
= SampSetObjectAttribute(GroupObject
,
1834 (LPVOID
)Name
->Buffer
,
1835 Name
->MaximumLength
);
1836 if (!NT_SUCCESS(Status
))
1838 TRACE("failed with status 0x%08lx\n", Status
);
1842 /* Set the AdminComment attribute */
1843 Status
= SampSetObjectAttribute(GroupObject
,
1847 EmptyString
.MaximumLength
);
1848 if (!NT_SUCCESS(Status
))
1850 TRACE("failed with status 0x%08lx\n", Status
);
1854 if (NT_SUCCESS(Status
))
1856 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1857 *RelativeId
= ulRid
;
1860 TRACE("returns with status 0x%08lx\n", Status
);
1869 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1870 IN OUT
unsigned long *EnumerationContext
,
1871 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1872 IN
unsigned long PreferedMaximumLength
,
1873 OUT
unsigned long *CountReturned
)
1875 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1876 PSAM_DB_OBJECT DomainObject
;
1877 HANDLE GroupsKeyHandle
= NULL
;
1878 HANDLE NamesKeyHandle
= NULL
;
1879 WCHAR GroupName
[64];
1881 ULONG EnumCount
= 0;
1882 ULONG RequiredLength
= 0;
1887 BOOLEAN MoreEntries
= FALSE
;
1890 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1891 DomainHandle
, EnumerationContext
, Buffer
,
1892 PreferedMaximumLength
, CountReturned
);
1894 /* Validate the domain handle */
1895 Status
= SampValidateDbObject(DomainHandle
,
1897 DOMAIN_LIST_ACCOUNTS
,
1899 if (!NT_SUCCESS(Status
))
1902 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1906 if (!NT_SUCCESS(Status
))
1909 Status
= SampRegOpenKey(GroupsKeyHandle
,
1913 if (!NT_SUCCESS(Status
))
1918 EnumIndex
= *EnumerationContext
;
1922 NameLength
= 64 * sizeof(WCHAR
);
1923 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1930 if (!NT_SUCCESS(Status
))
1932 if (Status
== STATUS_NO_MORE_ENTRIES
)
1933 Status
= STATUS_SUCCESS
;
1937 TRACE("EnumIndex: %lu\n", EnumIndex
);
1938 TRACE("Group name: %S\n", GroupName
);
1939 TRACE("Name length: %lu\n", NameLength
);
1941 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
1947 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
1953 TRACE("EnumCount: %lu\n", EnumCount
);
1954 TRACE("RequiredLength: %lu\n", RequiredLength
);
1956 if (!NT_SUCCESS(Status
))
1959 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
1960 if (EnumBuffer
== NULL
)
1962 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1966 EnumBuffer
->EntriesRead
= EnumCount
;
1970 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
1971 if (EnumBuffer
->Buffer
== NULL
)
1973 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1979 EnumIndex
= *EnumerationContext
;
1980 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
1982 NameLength
= 64 * sizeof(WCHAR
);
1983 DataLength
= sizeof(ULONG
);
1984 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1991 if (!NT_SUCCESS(Status
))
1993 if (Status
== STATUS_NO_MORE_ENTRIES
)
1994 Status
= STATUS_SUCCESS
;
1998 TRACE("EnumIndex: %lu\n", EnumIndex
);
1999 TRACE("Group name: %S\n", GroupName
);
2000 TRACE("Name length: %lu\n", NameLength
);
2001 TRACE("RID: %lu\n", Rid
);
2003 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2005 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2006 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2008 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2010 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2011 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2013 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2017 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2019 EnumBuffer
->Buffer
[i
].Name
.Length
);
2024 if (NT_SUCCESS(Status
))
2026 *EnumerationContext
+= EnumCount
;
2027 *Buffer
= EnumBuffer
;
2028 *CountReturned
= EnumCount
;
2032 *EnumerationContext
= 0;
2036 if (EnumBuffer
!= NULL
)
2038 if (EnumBuffer
->Buffer
!= NULL
)
2040 if (EnumBuffer
->EntriesRead
!= 0)
2042 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2044 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2045 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2049 midl_user_free(EnumBuffer
->Buffer
);
2052 midl_user_free(EnumBuffer
);
2056 if (NamesKeyHandle
!= NULL
)
2057 SampRegCloseKey(NamesKeyHandle
);
2059 if (GroupsKeyHandle
!= NULL
)
2060 SampRegCloseKey(GroupsKeyHandle
);
2062 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2063 Status
= STATUS_MORE_ENTRIES
;
2072 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
2073 IN PRPC_UNICODE_STRING Name
,
2074 IN ACCESS_MASK DesiredAccess
,
2075 OUT SAMPR_HANDLE
*UserHandle
,
2076 OUT
unsigned long *RelativeId
)
2078 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2079 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2080 SAM_USER_FIXED_DATA FixedUserData
;
2081 PSAM_DB_OBJECT DomainObject
;
2082 PSAM_DB_OBJECT UserObject
;
2088 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2089 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2092 Name
->Length
== 0 ||
2093 Name
->Buffer
== NULL
||
2094 UserHandle
== NULL
||
2096 return STATUS_INVALID_PARAMETER
;
2098 /* Map generic access rights */
2099 RtlMapGenericMask(&DesiredAccess
,
2102 /* Validate the domain handle */
2103 Status
= SampValidateDbObject(DomainHandle
,
2107 if (!NT_SUCCESS(Status
))
2109 TRACE("failed with status 0x%08lx\n", Status
);
2113 /* Check if the user name already exists in the domain */
2114 Status
= SampCheckAccountNameInDomain(DomainObject
,
2116 if (!NT_SUCCESS(Status
))
2118 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2119 Name
->Buffer
, Status
);
2123 /* Get the fixed domain attributes */
2124 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2125 Status
= SampGetObjectAttribute(DomainObject
,
2128 (PVOID
)&FixedDomainData
,
2130 if (!NT_SUCCESS(Status
))
2132 TRACE("failed with status 0x%08lx\n", Status
);
2136 /* Increment the NextRid attribute */
2137 ulRid
= FixedDomainData
.NextRid
;
2138 FixedDomainData
.NextRid
++;
2140 /* Store the fixed domain attributes */
2141 Status
= SampSetObjectAttribute(DomainObject
,
2146 if (!NT_SUCCESS(Status
))
2148 TRACE("failed with status 0x%08lx\n", Status
);
2152 TRACE("RID: %lx\n", ulRid
);
2154 /* Convert the RID into a string (hex) */
2155 swprintf(szRid
, L
"%08lX", ulRid
);
2157 /* Create the user object */
2158 Status
= SampCreateDbObject(DomainObject
,
2165 if (!NT_SUCCESS(Status
))
2167 TRACE("failed with status 0x%08lx\n", Status
);
2171 /* Add the account name for the user object */
2172 Status
= SampSetAccountNameInDomain(DomainObject
,
2176 if (!NT_SUCCESS(Status
))
2178 TRACE("failed with status 0x%08lx\n", Status
);
2182 /* Initialize fixed user data */
2183 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2184 FixedUserData
.Version
= 1;
2185 FixedUserData
.Reserved
= 0;
2186 FixedUserData
.LastLogon
.QuadPart
= 0;
2187 FixedUserData
.LastLogoff
.QuadPart
= 0;
2188 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2189 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2190 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2191 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2192 FixedUserData
.UserId
= ulRid
;
2193 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2194 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2195 USER_PASSWORD_NOT_REQUIRED
|
2196 USER_NORMAL_ACCOUNT
;
2197 FixedUserData
.CountryCode
= 0;
2198 FixedUserData
.CodePage
= 0;
2199 FixedUserData
.BadPasswordCount
= 0;
2200 FixedUserData
.LogonCount
= 0;
2201 FixedUserData
.AdminCount
= 0;
2202 FixedUserData
.OperatorCount
= 0;
2204 /* Set fixed user data attribute */
2205 Status
= SampSetObjectAttribute(UserObject
,
2208 (LPVOID
)&FixedUserData
,
2209 sizeof(SAM_USER_FIXED_DATA
));
2210 if (!NT_SUCCESS(Status
))
2212 TRACE("failed with status 0x%08lx\n", Status
);
2216 /* Set the Name attribute */
2217 Status
= SampSetObjectAttribute(UserObject
,
2220 (LPVOID
)Name
->Buffer
,
2221 Name
->MaximumLength
);
2222 if (!NT_SUCCESS(Status
))
2224 TRACE("failed with status 0x%08lx\n", Status
);
2228 /* Set the FullName attribute */
2229 Status
= SampSetObjectAttribute(UserObject
,
2233 EmptyString
.MaximumLength
);
2234 if (!NT_SUCCESS(Status
))
2236 TRACE("failed with status 0x%08lx\n", Status
);
2240 /* Set the HomeDirectory attribute */
2241 Status
= SampSetObjectAttribute(UserObject
,
2245 EmptyString
.MaximumLength
);
2246 if (!NT_SUCCESS(Status
))
2248 TRACE("failed with status 0x%08lx\n", Status
);
2252 /* Set the HomeDirectoryDrive attribute */
2253 Status
= SampSetObjectAttribute(UserObject
,
2254 L
"HomeDirectoryDrive",
2257 EmptyString
.MaximumLength
);
2258 if (!NT_SUCCESS(Status
))
2260 TRACE("failed with status 0x%08lx\n", Status
);
2264 /* Set the ScriptPath attribute */
2265 Status
= SampSetObjectAttribute(UserObject
,
2269 EmptyString
.MaximumLength
);
2270 if (!NT_SUCCESS(Status
))
2272 TRACE("failed with status 0x%08lx\n", Status
);
2276 /* Set the ProfilePath attribute */
2277 Status
= SampSetObjectAttribute(UserObject
,
2281 EmptyString
.MaximumLength
);
2282 if (!NT_SUCCESS(Status
))
2284 TRACE("failed with status 0x%08lx\n", Status
);
2288 /* Set the AdminComment attribute */
2289 Status
= SampSetObjectAttribute(UserObject
,
2293 EmptyString
.MaximumLength
);
2294 if (!NT_SUCCESS(Status
))
2296 TRACE("failed with status 0x%08lx\n", Status
);
2300 /* Set the UserComment attribute */
2301 Status
= SampSetObjectAttribute(UserObject
,
2305 EmptyString
.MaximumLength
);
2306 if (!NT_SUCCESS(Status
))
2308 TRACE("failed with status 0x%08lx\n", Status
);
2312 /* Set the WorkStations attribute */
2313 Status
= SampSetObjectAttribute(UserObject
,
2317 EmptyString
.MaximumLength
);
2318 if (!NT_SUCCESS(Status
))
2320 TRACE("failed with status 0x%08lx\n", Status
);
2324 /* Set the Parameters attribute */
2325 Status
= SampSetObjectAttribute(UserObject
,
2329 EmptyString
.MaximumLength
);
2330 if (!NT_SUCCESS(Status
))
2332 TRACE("failed with status 0x%08lx\n", Status
);
2336 /* FIXME: Set LogonHours attribute*/
2337 /* FIXME: Set Groups attribute*/
2339 /* Set LMPwd attribute*/
2340 Status
= SampSetObjectAttribute(UserObject
,
2345 if (!NT_SUCCESS(Status
))
2347 TRACE("failed with status 0x%08lx\n", Status
);
2351 /* Set NTPwd attribute*/
2352 Status
= SampSetObjectAttribute(UserObject
,
2357 if (!NT_SUCCESS(Status
))
2359 TRACE("failed with status 0x%08lx\n", Status
);
2363 /* Set LMPwdHistory attribute*/
2364 Status
= SampSetObjectAttribute(UserObject
,
2369 if (!NT_SUCCESS(Status
))
2371 TRACE("failed with status 0x%08lx\n", Status
);
2375 /* Set NTPwdHistory attribute*/
2376 Status
= SampSetObjectAttribute(UserObject
,
2381 if (!NT_SUCCESS(Status
))
2383 TRACE("failed with status 0x%08lx\n", Status
);
2387 /* FIXME: Set SecDesc attribute*/
2389 if (NT_SUCCESS(Status
))
2391 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2392 *RelativeId
= ulRid
;
2395 TRACE("returns with status 0x%08lx\n", Status
);
2404 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2405 IN OUT
unsigned long *EnumerationContext
,
2406 IN
unsigned long UserAccountControl
,
2407 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2408 IN
unsigned long PreferedMaximumLength
,
2409 OUT
unsigned long *CountReturned
)
2411 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2412 PSAM_DB_OBJECT DomainObject
;
2413 HANDLE UsersKeyHandle
= NULL
;
2414 HANDLE NamesKeyHandle
= NULL
;
2417 ULONG EnumCount
= 0;
2418 ULONG RequiredLength
= 0;
2423 BOOLEAN MoreEntries
= FALSE
;
2426 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2427 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2428 PreferedMaximumLength
, CountReturned
);
2430 /* Validate the domain handle */
2431 Status
= SampValidateDbObject(DomainHandle
,
2433 DOMAIN_LIST_ACCOUNTS
,
2435 if (!NT_SUCCESS(Status
))
2438 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2442 if (!NT_SUCCESS(Status
))
2445 Status
= SampRegOpenKey(UsersKeyHandle
,
2449 if (!NT_SUCCESS(Status
))
2454 EnumIndex
= *EnumerationContext
;
2458 NameLength
= 64 * sizeof(WCHAR
);
2459 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2466 if (!NT_SUCCESS(Status
))
2468 if (Status
== STATUS_NO_MORE_ENTRIES
)
2469 Status
= STATUS_SUCCESS
;
2473 TRACE("EnumIndex: %lu\n", EnumIndex
);
2474 TRACE("User name: %S\n", UserName
);
2475 TRACE("Name length: %lu\n", NameLength
);
2477 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2483 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2489 TRACE("EnumCount: %lu\n", EnumCount
);
2490 TRACE("RequiredLength: %lu\n", RequiredLength
);
2492 if (!NT_SUCCESS(Status
))
2495 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2496 if (EnumBuffer
== NULL
)
2498 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2502 EnumBuffer
->EntriesRead
= EnumCount
;
2506 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2507 if (EnumBuffer
->Buffer
== NULL
)
2509 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2515 EnumIndex
= *EnumerationContext
;
2516 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2518 NameLength
= 64 * sizeof(WCHAR
);
2519 DataLength
= sizeof(ULONG
);
2520 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2527 if (!NT_SUCCESS(Status
))
2529 if (Status
== STATUS_NO_MORE_ENTRIES
)
2530 Status
= STATUS_SUCCESS
;
2534 TRACE("EnumIndex: %lu\n", EnumIndex
);
2535 TRACE("User name: %S\n", UserName
);
2536 TRACE("Name length: %lu\n", NameLength
);
2537 TRACE("RID: %lu\n", Rid
);
2539 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2541 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2542 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2544 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2546 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2547 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2549 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2553 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2555 EnumBuffer
->Buffer
[i
].Name
.Length
);
2560 if (NT_SUCCESS(Status
))
2562 *EnumerationContext
+= EnumCount
;
2563 *Buffer
= EnumBuffer
;
2564 *CountReturned
= EnumCount
;
2568 *EnumerationContext
= 0;
2572 if (EnumBuffer
!= NULL
)
2574 if (EnumBuffer
->Buffer
!= NULL
)
2576 if (EnumBuffer
->EntriesRead
!= 0)
2578 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2580 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2581 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2585 midl_user_free(EnumBuffer
->Buffer
);
2588 midl_user_free(EnumBuffer
);
2592 if (NamesKeyHandle
!= NULL
)
2593 SampRegCloseKey(NamesKeyHandle
);
2595 if (UsersKeyHandle
!= NULL
)
2596 SampRegCloseKey(UsersKeyHandle
);
2598 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2599 Status
= STATUS_MORE_ENTRIES
;
2608 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2609 IN PRPC_UNICODE_STRING AccountName
,
2610 IN ACCESS_MASK DesiredAccess
,
2611 OUT SAMPR_HANDLE
*AliasHandle
,
2612 OUT
unsigned long *RelativeId
)
2614 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2615 PSAM_DB_OBJECT DomainObject
;
2616 PSAM_DB_OBJECT AliasObject
;
2617 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2623 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2624 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2626 /* Map generic access rights */
2627 RtlMapGenericMask(&DesiredAccess
,
2630 /* Validate the domain handle */
2631 Status
= SampValidateDbObject(DomainHandle
,
2633 DOMAIN_CREATE_ALIAS
,
2635 if (!NT_SUCCESS(Status
))
2637 TRACE("failed with status 0x%08lx\n", Status
);
2641 /* Check if the alias name already exists in the domain */
2642 Status
= SampCheckAccountNameInDomain(DomainObject
,
2643 AccountName
->Buffer
);
2644 if (!NT_SUCCESS(Status
))
2646 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2647 AccountName
->Buffer
, Status
);
2651 /* Get the fixed domain attributes */
2652 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2653 Status
= SampGetObjectAttribute(DomainObject
,
2656 (PVOID
)&FixedDomainData
,
2658 if (!NT_SUCCESS(Status
))
2660 TRACE("failed with status 0x%08lx\n", Status
);
2664 /* Increment the NextRid attribute */
2665 ulRid
= FixedDomainData
.NextRid
;
2666 FixedDomainData
.NextRid
++;
2668 /* Store the fixed domain attributes */
2669 Status
= SampSetObjectAttribute(DomainObject
,
2674 if (!NT_SUCCESS(Status
))
2676 TRACE("failed with status 0x%08lx\n", Status
);
2680 TRACE("RID: %lx\n", ulRid
);
2682 /* Convert the RID into a string (hex) */
2683 swprintf(szRid
, L
"%08lX", ulRid
);
2685 /* Create the alias object */
2686 Status
= SampCreateDbObject(DomainObject
,
2693 if (!NT_SUCCESS(Status
))
2695 TRACE("failed with status 0x%08lx\n", Status
);
2699 /* Add the account name for the alias object */
2700 Status
= SampSetAccountNameInDomain(DomainObject
,
2702 AccountName
->Buffer
,
2704 if (!NT_SUCCESS(Status
))
2706 TRACE("failed with status 0x%08lx\n", Status
);
2710 /* Set the Name attribute */
2711 Status
= SampSetObjectAttribute(AliasObject
,
2714 (LPVOID
)AccountName
->Buffer
,
2715 AccountName
->MaximumLength
);
2716 if (!NT_SUCCESS(Status
))
2718 TRACE("failed with status 0x%08lx\n", Status
);
2722 /* Set the Description attribute */
2723 Status
= SampSetObjectAttribute(AliasObject
,
2727 EmptyString
.MaximumLength
);
2728 if (!NT_SUCCESS(Status
))
2730 TRACE("failed with status 0x%08lx\n", Status
);
2734 if (NT_SUCCESS(Status
))
2736 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2737 *RelativeId
= ulRid
;
2740 TRACE("returns with status 0x%08lx\n", Status
);
2749 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2750 IN OUT
unsigned long *EnumerationContext
,
2751 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2752 IN
unsigned long PreferedMaximumLength
,
2753 OUT
unsigned long *CountReturned
)
2755 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2756 PSAM_DB_OBJECT DomainObject
;
2757 HANDLE AliasesKeyHandle
= NULL
;
2758 HANDLE NamesKeyHandle
= NULL
;
2759 WCHAR AliasName
[64];
2761 ULONG EnumCount
= 0;
2762 ULONG RequiredLength
= 0;
2767 BOOLEAN MoreEntries
= FALSE
;
2770 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2771 DomainHandle
, EnumerationContext
, Buffer
,
2772 PreferedMaximumLength
, CountReturned
);
2774 /* Validate the domain handle */
2775 Status
= SampValidateDbObject(DomainHandle
,
2777 DOMAIN_LIST_ACCOUNTS
,
2779 if (!NT_SUCCESS(Status
))
2782 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2786 if (!NT_SUCCESS(Status
))
2789 Status
= SampRegOpenKey(AliasesKeyHandle
,
2793 if (!NT_SUCCESS(Status
))
2798 EnumIndex
= *EnumerationContext
;
2802 NameLength
= 64 * sizeof(WCHAR
);
2803 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2810 if (!NT_SUCCESS(Status
))
2812 if (Status
== STATUS_NO_MORE_ENTRIES
)
2813 Status
= STATUS_SUCCESS
;
2817 TRACE("EnumIndex: %lu\n", EnumIndex
);
2818 TRACE("Alias name: %S\n", AliasName
);
2819 TRACE("Name length: %lu\n", NameLength
);
2821 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2827 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2833 TRACE("EnumCount: %lu\n", EnumCount
);
2834 TRACE("RequiredLength: %lu\n", RequiredLength
);
2836 if (!NT_SUCCESS(Status
))
2839 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2840 if (EnumBuffer
== NULL
)
2842 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2846 EnumBuffer
->EntriesRead
= EnumCount
;
2850 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2851 if (EnumBuffer
->Buffer
== NULL
)
2853 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2859 EnumIndex
= *EnumerationContext
;
2860 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2862 NameLength
= 64 * sizeof(WCHAR
);
2863 DataLength
= sizeof(ULONG
);
2864 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2871 if (!NT_SUCCESS(Status
))
2873 if (Status
== STATUS_NO_MORE_ENTRIES
)
2874 Status
= STATUS_SUCCESS
;
2878 TRACE("EnumIndex: %lu\n", EnumIndex
);
2879 TRACE("Alias name: %S\n", AliasName
);
2880 TRACE("Name length: %lu\n", NameLength
);
2881 TRACE("RID: %lu\n", Rid
);
2883 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2885 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2886 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2888 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2890 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2891 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2893 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2897 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2899 EnumBuffer
->Buffer
[i
].Name
.Length
);
2904 if (NT_SUCCESS(Status
))
2906 *EnumerationContext
+= EnumCount
;
2907 *Buffer
= EnumBuffer
;
2908 *CountReturned
= EnumCount
;
2912 *EnumerationContext
= 0;
2916 if (EnumBuffer
!= NULL
)
2918 if (EnumBuffer
->Buffer
!= NULL
)
2920 if (EnumBuffer
->EntriesRead
!= 0)
2922 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2924 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2925 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2929 midl_user_free(EnumBuffer
->Buffer
);
2932 midl_user_free(EnumBuffer
);
2936 if (NamesKeyHandle
!= NULL
)
2937 SampRegCloseKey(NamesKeyHandle
);
2939 if (AliasesKeyHandle
!= NULL
)
2940 SampRegCloseKey(AliasesKeyHandle
);
2942 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2943 Status
= STATUS_MORE_ENTRIES
;
2952 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2953 IN PSAMPR_PSID_ARRAY SidArray
,
2954 OUT PSAMPR_ULONG_ARRAY Membership
)
2956 PSAM_DB_OBJECT DomainObject
;
2957 HANDLE AliasesKeyHandle
= NULL
;
2958 HANDLE MembersKeyHandle
= NULL
;
2959 HANDLE MemberKeyHandle
= NULL
;
2960 LPWSTR MemberSidString
= NULL
;
2961 PULONG RidArray
= NULL
;
2962 ULONG MaxSidCount
= 0;
2967 WCHAR NameBuffer
[9];
2969 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2970 DomainHandle
, SidArray
, Membership
);
2972 /* Validate the domain handle */
2973 Status
= SampValidateDbObject(DomainHandle
,
2975 DOMAIN_GET_ALIAS_MEMBERSHIP
,
2977 if (!NT_SUCCESS(Status
))
2980 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2984 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2985 if (!NT_SUCCESS(Status
))
2988 Status
= SampRegOpenKey(AliasesKeyHandle
,
2992 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2994 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
2996 Status
= STATUS_SUCCESS
;
3000 if (!NT_SUCCESS(Status
))
3003 for (i
= 0; i
< SidArray
->Count
; i
++)
3005 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3006 TRACE("Open %S\n", MemberSidString
);
3008 Status
= SampRegOpenKey(MembersKeyHandle
,
3012 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3013 if (NT_SUCCESS(Status
))
3015 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3018 if (NT_SUCCESS(Status
))
3020 TRACE("Found %lu values\n", ValueCount
);
3021 MaxSidCount
+= ValueCount
;
3024 NtClose(MemberKeyHandle
);
3027 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3028 Status
= STATUS_SUCCESS
;
3030 LocalFree(MemberSidString
);
3033 if (MaxSidCount
== 0)
3035 Status
= STATUS_SUCCESS
;
3039 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
3040 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
3041 if (RidArray
== NULL
)
3043 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3047 for (i
= 0; i
< SidArray
->Count
; i
++)
3049 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3050 TRACE("Open %S\n", MemberSidString
);
3052 Status
= SampRegOpenKey(MembersKeyHandle
,
3056 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3057 if (NT_SUCCESS(Status
))
3059 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3062 if (NT_SUCCESS(Status
))
3064 TRACE("Found %lu values\n", ValueCount
);
3066 for (j
= 0; j
< ValueCount
; j
++)
3068 DataLength
= 9 * sizeof(WCHAR
);
3069 Status
= SampRegEnumerateValue(MemberKeyHandle
,
3076 if (NT_SUCCESS(Status
))
3078 RidArray
[j
] = wcstoul(NameBuffer
, NULL
, 16);
3083 NtClose(MemberKeyHandle
);
3086 LocalFree(MemberSidString
);
3090 if (NT_SUCCESS(Status
))
3092 Membership
->Count
= MaxSidCount
;
3093 Membership
->Element
= RidArray
;
3097 if (RidArray
!= NULL
)
3098 midl_user_free(RidArray
);
3101 if (MembersKeyHandle
!= NULL
)
3102 NtClose(MembersKeyHandle
);
3104 if (MembersKeyHandle
!= NULL
)
3105 NtClose(MembersKeyHandle
);
3107 if (AliasesKeyHandle
!= NULL
)
3108 NtClose(AliasesKeyHandle
);
3117 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
3119 IN RPC_UNICODE_STRING Names
[],
3120 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
3121 OUT PSAMPR_ULONG_ARRAY Use
)
3123 PSAM_DB_OBJECT DomainObject
;
3124 HANDLE AccountsKeyHandle
;
3125 HANDLE NamesKeyHandle
;
3126 ULONG MappedCount
= 0;
3132 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
3133 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
3135 /* Validate the domain handle */
3136 Status
= SampValidateDbObject(DomainHandle
,
3140 if (!NT_SUCCESS(Status
))
3142 TRACE("failed with status 0x%08lx\n", Status
);
3146 RelativeIds
->Count
= 0;
3150 return STATUS_SUCCESS
;
3152 /* Allocate the relative IDs array */
3153 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3154 if (RelativeIds
->Element
== NULL
)
3156 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3160 /* Allocate the use array */
3161 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3162 if (Use
->Element
== NULL
)
3164 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3168 RelativeIds
->Count
= Count
;
3171 for (i
= 0; i
< Count
; i
++)
3173 TRACE("Name: %S\n", Names
[i
].Buffer
);
3177 /* Lookup aliases */
3178 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3181 &AccountsKeyHandle
);
3182 if (NT_SUCCESS(Status
))
3184 Status
= SampRegOpenKey(AccountsKeyHandle
,
3188 if (NT_SUCCESS(Status
))
3190 DataLength
= sizeof(ULONG
);
3191 Status
= SampRegQueryValue(NamesKeyHandle
,
3197 SampRegCloseKey(NamesKeyHandle
);
3200 SampRegCloseKey(AccountsKeyHandle
);
3203 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3206 /* Return alias account */
3207 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3209 TRACE("Rid: %lu\n", RelativeId
);
3210 RelativeIds
->Element
[i
] = RelativeId
;
3211 Use
->Element
[i
] = SidTypeAlias
;
3217 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3220 &AccountsKeyHandle
);
3221 if (NT_SUCCESS(Status
))
3223 Status
= SampRegOpenKey(AccountsKeyHandle
,
3227 if (NT_SUCCESS(Status
))
3229 DataLength
= sizeof(ULONG
);
3230 Status
= SampRegQueryValue(NamesKeyHandle
,
3236 SampRegCloseKey(NamesKeyHandle
);
3239 SampRegCloseKey(AccountsKeyHandle
);
3242 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3245 /* Return group account */
3246 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3248 TRACE("Rid: %lu\n", RelativeId
);
3249 RelativeIds
->Element
[i
] = RelativeId
;
3250 Use
->Element
[i
] = SidTypeGroup
;
3256 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3259 &AccountsKeyHandle
);
3260 if (NT_SUCCESS(Status
))
3262 Status
= SampRegOpenKey(AccountsKeyHandle
,
3266 if (NT_SUCCESS(Status
))
3268 DataLength
= sizeof(ULONG
);
3269 Status
= SampRegQueryValue(NamesKeyHandle
,
3275 SampRegCloseKey(NamesKeyHandle
);
3278 SampRegCloseKey(AccountsKeyHandle
);
3281 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3284 /* Return user account */
3285 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3287 TRACE("Rid: %lu\n", RelativeId
);
3288 RelativeIds
->Element
[i
] = RelativeId
;
3289 Use
->Element
[i
] = SidTypeUser
;
3294 /* Return unknown account */
3295 RelativeIds
->Element
[i
] = 0;
3296 Use
->Element
[i
] = SidTypeUnknown
;
3300 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3301 Status
= STATUS_SUCCESS
;
3303 if (NT_SUCCESS(Status
))
3305 if (MappedCount
== 0)
3306 Status
= STATUS_NONE_MAPPED
;
3307 else if (MappedCount
< Count
)
3308 Status
= STATUS_SOME_NOT_MAPPED
;
3312 if (RelativeIds
->Element
!= NULL
)
3314 midl_user_free(RelativeIds
->Element
);
3315 RelativeIds
->Element
= NULL
;
3318 RelativeIds
->Count
= 0;
3320 if (Use
->Element
!= NULL
)
3322 midl_user_free(Use
->Element
);
3323 Use
->Element
= NULL
;
3329 TRACE("Returned Status %lx\n", Status
);
3338 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3340 IN ULONG
*RelativeIds
,
3341 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3342 OUT PSAMPR_ULONG_ARRAY Use
)
3344 PSAM_DB_OBJECT DomainObject
;
3346 HANDLE AccountsKeyHandle
;
3347 HANDLE AccountKeyHandle
;
3348 ULONG MappedCount
= 0;
3353 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3354 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3356 /* Validate the domain handle */
3357 Status
= SampValidateDbObject(DomainHandle
,
3361 if (!NT_SUCCESS(Status
))
3363 TRACE("failed with status 0x%08lx\n", Status
);
3371 return STATUS_SUCCESS
;
3373 /* Allocate the names array */
3374 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3375 if (Names
->Element
== NULL
)
3377 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3381 /* Allocate the use array */
3382 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3383 if (Use
->Element
== NULL
)
3385 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3389 Names
->Count
= Count
;
3392 for (i
= 0; i
< Count
; i
++)
3394 TRACE("RID: %lu\n", RelativeIds
[i
]);
3396 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3398 /* Lookup aliases */
3399 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3402 &AccountsKeyHandle
);
3403 if (NT_SUCCESS(Status
))
3405 Status
= SampRegOpenKey(AccountsKeyHandle
,
3409 if (NT_SUCCESS(Status
))
3412 Status
= SampRegQueryValue(AccountKeyHandle
,
3417 if (NT_SUCCESS(Status
))
3419 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3420 if (Names
->Element
[i
].Buffer
== NULL
)
3421 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3423 if (NT_SUCCESS(Status
))
3425 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3426 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3428 Status
= SampRegQueryValue(AccountKeyHandle
,
3431 Names
->Element
[i
].Buffer
,
3436 SampRegCloseKey(AccountKeyHandle
);
3439 SampRegCloseKey(AccountsKeyHandle
);
3442 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3445 /* Return alias account */
3446 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3448 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3449 Use
->Element
[i
] = SidTypeAlias
;
3455 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3458 &AccountsKeyHandle
);
3459 if (NT_SUCCESS(Status
))
3461 Status
= SampRegOpenKey(AccountsKeyHandle
,
3465 if (NT_SUCCESS(Status
))
3468 Status
= SampRegQueryValue(AccountKeyHandle
,
3473 if (NT_SUCCESS(Status
))
3475 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3476 if (Names
->Element
[i
].Buffer
== NULL
)
3477 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3479 if (NT_SUCCESS(Status
))
3481 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3482 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3484 Status
= SampRegQueryValue(AccountKeyHandle
,
3487 Names
->Element
[i
].Buffer
,
3492 SampRegCloseKey(AccountKeyHandle
);
3495 SampRegCloseKey(AccountsKeyHandle
);
3498 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3501 /* Return group account */
3502 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3504 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3505 Use
->Element
[i
] = SidTypeGroup
;
3511 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3514 &AccountsKeyHandle
);
3515 if (NT_SUCCESS(Status
))
3517 Status
= SampRegOpenKey(AccountsKeyHandle
,
3521 if (NT_SUCCESS(Status
))
3524 Status
= SampRegQueryValue(AccountKeyHandle
,
3529 if (NT_SUCCESS(Status
))
3531 TRACE("DataLength: %lu\n", DataLength
);
3533 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3534 if (Names
->Element
[i
].Buffer
== NULL
)
3535 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3537 if (NT_SUCCESS(Status
))
3539 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3540 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3542 Status
= SampRegQueryValue(AccountKeyHandle
,
3545 Names
->Element
[i
].Buffer
,
3550 SampRegCloseKey(AccountKeyHandle
);
3553 SampRegCloseKey(AccountsKeyHandle
);
3556 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3559 /* Return user account */
3560 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3562 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3563 Use
->Element
[i
] = SidTypeUser
;
3568 /* Return unknown account */
3569 Use
->Element
[i
] = SidTypeUnknown
;
3573 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3574 Status
= STATUS_SUCCESS
;
3576 if (NT_SUCCESS(Status
))
3578 if (MappedCount
== 0)
3579 Status
= STATUS_NONE_MAPPED
;
3580 else if (MappedCount
< Count
)
3581 Status
= STATUS_SOME_NOT_MAPPED
;
3585 if (Names
->Element
!= NULL
)
3587 for (i
= 0; i
< Count
; i
++)
3589 if (Names
->Element
[i
].Buffer
!= NULL
)
3590 midl_user_free(Names
->Element
[i
].Buffer
);
3593 midl_user_free(Names
->Element
);
3594 Names
->Element
= NULL
;
3599 if (Use
->Element
!= NULL
)
3601 midl_user_free(Use
->Element
);
3602 Use
->Element
= NULL
;
3615 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3616 IN ACCESS_MASK DesiredAccess
,
3617 IN
unsigned long GroupId
,
3618 OUT SAMPR_HANDLE
*GroupHandle
)
3620 PSAM_DB_OBJECT DomainObject
;
3621 PSAM_DB_OBJECT GroupObject
;
3625 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3626 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3628 /* Map generic access rights */
3629 RtlMapGenericMask(&DesiredAccess
,
3632 /* Validate the domain handle */
3633 Status
= SampValidateDbObject(DomainHandle
,
3637 if (!NT_SUCCESS(Status
))
3639 TRACE("failed with status 0x%08lx\n", Status
);
3643 /* Convert the RID into a string (hex) */
3644 swprintf(szRid
, L
"%08lX", GroupId
);
3646 /* Create the group object */
3647 Status
= SampOpenDbObject(DomainObject
,
3654 if (!NT_SUCCESS(Status
))
3656 TRACE("failed with status 0x%08lx\n", Status
);
3660 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3662 return STATUS_SUCCESS
;
3667 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3668 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3670 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3671 SAM_GROUP_FIXED_DATA FixedData
;
3672 ULONG MembersLength
= 0;
3678 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3679 if (InfoBuffer
== NULL
)
3680 return STATUS_INSUFFICIENT_RESOURCES
;
3682 Status
= SampGetObjectAttributeString(GroupObject
,
3684 &InfoBuffer
->General
.Name
);
3685 if (!NT_SUCCESS(Status
))
3687 TRACE("Status 0x%08lx\n", Status
);
3691 Status
= SampGetObjectAttributeString(GroupObject
,
3693 &InfoBuffer
->General
.AdminComment
);
3694 if (!NT_SUCCESS(Status
))
3696 TRACE("Status 0x%08lx\n", Status
);
3700 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3701 Status
= SampGetObjectAttribute(GroupObject
,
3706 if (!NT_SUCCESS(Status
))
3709 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3711 Status
= SampGetObjectAttribute(GroupObject
,
3716 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3719 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3720 InfoBuffer
->General
.MemberCount
= 0;
3722 InfoBuffer
->General
.MemberCount
= MembersLength
/ sizeof(ULONG
);
3724 *Buffer
= InfoBuffer
;
3727 if (!NT_SUCCESS(Status
))
3729 if (InfoBuffer
!= NULL
)
3731 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3732 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3734 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3735 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3737 midl_user_free(InfoBuffer
);
3746 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3747 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3749 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3754 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3755 if (InfoBuffer
== NULL
)
3756 return STATUS_INSUFFICIENT_RESOURCES
;
3758 Status
= SampGetObjectAttributeString(GroupObject
,
3760 &InfoBuffer
->Name
.Name
);
3761 if (!NT_SUCCESS(Status
))
3763 TRACE("Status 0x%08lx\n", Status
);
3767 *Buffer
= InfoBuffer
;
3770 if (!NT_SUCCESS(Status
))
3772 if (InfoBuffer
!= NULL
)
3774 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3775 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3777 midl_user_free(InfoBuffer
);
3786 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3787 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3789 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3790 SAM_GROUP_FIXED_DATA FixedData
;
3796 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3797 if (InfoBuffer
== NULL
)
3798 return STATUS_INSUFFICIENT_RESOURCES
;
3800 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3801 Status
= SampGetObjectAttribute(GroupObject
,
3806 if (!NT_SUCCESS(Status
))
3809 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3811 *Buffer
= InfoBuffer
;
3814 if (!NT_SUCCESS(Status
))
3816 if (InfoBuffer
!= NULL
)
3818 midl_user_free(InfoBuffer
);
3827 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3828 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3830 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3835 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3836 if (InfoBuffer
== NULL
)
3837 return STATUS_INSUFFICIENT_RESOURCES
;
3839 Status
= SampGetObjectAttributeString(GroupObject
,
3841 &InfoBuffer
->AdminComment
.AdminComment
);
3842 if (!NT_SUCCESS(Status
))
3844 TRACE("Status 0x%08lx\n", Status
);
3848 *Buffer
= InfoBuffer
;
3851 if (!NT_SUCCESS(Status
))
3853 if (InfoBuffer
!= NULL
)
3855 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3856 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3858 midl_user_free(InfoBuffer
);
3869 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3870 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3871 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3873 PSAM_DB_OBJECT GroupObject
;
3876 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
3877 GroupHandle
, GroupInformationClass
, Buffer
);
3879 /* Validate the group handle */
3880 Status
= SampValidateDbObject(GroupHandle
,
3882 GROUP_READ_INFORMATION
,
3884 if (!NT_SUCCESS(Status
))
3887 switch (GroupInformationClass
)
3889 case GroupGeneralInformation
:
3890 Status
= SampQueryGroupGeneral(GroupObject
,
3894 case GroupNameInformation
:
3895 Status
= SampQueryGroupName(GroupObject
,
3899 case GroupAttributeInformation
:
3900 Status
= SampQueryGroupAttribute(GroupObject
,
3904 case GroupAdminCommentInformation
:
3905 Status
= SampQueryGroupAdminComment(GroupObject
,
3910 Status
= STATUS_INVALID_INFO_CLASS
;
3919 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3920 PSAMPR_GROUP_INFO_BUFFER Buffer
)
3922 SAM_GROUP_FIXED_DATA FixedData
;
3926 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3927 Status
= SampGetObjectAttribute(GroupObject
,
3932 if (!NT_SUCCESS(Status
))
3935 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
3937 Status
= SampSetObjectAttribute(GroupObject
,
3951 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3952 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3953 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
3955 PSAM_DB_OBJECT GroupObject
;
3958 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
3959 GroupHandle
, GroupInformationClass
, Buffer
);
3961 /* Validate the group handle */
3962 Status
= SampValidateDbObject(GroupHandle
,
3964 GROUP_WRITE_ACCOUNT
,
3966 if (!NT_SUCCESS(Status
))
3969 switch (GroupInformationClass
)
3971 case GroupNameInformation
:
3972 Status
= SampSetObjectAttribute(GroupObject
,
3975 Buffer
->Name
.Name
.Buffer
,
3976 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3979 case GroupAttributeInformation
:
3980 Status
= SampSetGroupAttribute(GroupObject
,
3984 case GroupAdminCommentInformation
:
3985 Status
= SampSetObjectAttribute(GroupObject
,
3988 Buffer
->AdminComment
.AdminComment
.Buffer
,
3989 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
3993 Status
= STATUS_INVALID_INFO_CLASS
;
4004 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
4005 IN
unsigned long MemberId
,
4006 IN
unsigned long Attributes
)
4008 PSAM_DB_OBJECT GroupObject
;
4009 PSAM_DB_OBJECT UserObject
= NULL
;
4012 TRACE("(%p %lu %lx)\n",
4013 GroupHandle
, MemberId
, Attributes
);
4015 /* Validate the group handle */
4016 Status
= SampValidateDbObject(GroupHandle
,
4020 if (!NT_SUCCESS(Status
))
4023 /* Open the user object in the same domain */
4024 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4028 if (!NT_SUCCESS(Status
))
4030 TRACE("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4034 /* Add group membership to the user object */
4035 Status
= SampAddGroupMembershipToUser(UserObject
,
4036 GroupObject
->RelativeId
,
4038 if (!NT_SUCCESS(Status
))
4040 TRACE("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4044 /* Add the member to the group object */
4045 Status
= SampAddMemberToGroup(GroupObject
,
4047 if (!NT_SUCCESS(Status
))
4049 TRACE("SampAddMemberToGroup() failed (Status 0x%08lx)\n", Status
);
4054 SampCloseDbObject(UserObject
);
4063 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
4065 PSAM_DB_OBJECT GroupObject
;
4069 TRACE("(%p)\n", GroupHandle
);
4071 /* Validate the group handle */
4072 Status
= SampValidateDbObject(*GroupHandle
,
4076 if (!NT_SUCCESS(Status
))
4078 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
4082 /* Fail, if the group is built-in */
4083 if (GroupObject
->RelativeId
< 1000)
4085 TRACE("You can not delete a special account!\n");
4086 return STATUS_SPECIAL_ACCOUNT
;
4089 /* Get the length of the Members attribute */
4090 SampGetObjectAttribute(GroupObject
,
4096 /* Fail, if the group has members */
4099 TRACE("There are still members in the group!\n");
4100 return STATUS_MEMBER_IN_GROUP
;
4103 /* FIXME: Remove the group from all aliases */
4105 /* Delete the group from the database */
4106 Status
= SampDeleteAccountDbObject(GroupObject
);
4107 if (!NT_SUCCESS(Status
))
4109 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4113 /* Invalidate the handle */
4114 *GroupHandle
= NULL
;
4116 return STATUS_SUCCESS
;
4123 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
4124 IN
unsigned long MemberId
)
4126 PSAM_DB_OBJECT GroupObject
;
4127 PSAM_DB_OBJECT UserObject
= NULL
;
4131 GroupHandle
, MemberId
);
4133 /* Validate the group handle */
4134 Status
= SampValidateDbObject(GroupHandle
,
4136 GROUP_REMOVE_MEMBER
,
4138 if (!NT_SUCCESS(Status
))
4141 /* Open the user object in the same domain */
4142 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4146 if (!NT_SUCCESS(Status
))
4148 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4152 /* Remove group membership from the user object */
4153 Status
= SampRemoveGroupMembershipFromUser(UserObject
,
4154 GroupObject
->RelativeId
);
4155 if (!NT_SUCCESS(Status
))
4157 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4161 /* Remove the member from the group object */
4162 Status
= SampRemoveMemberFromGroup(GroupObject
,
4164 if (!NT_SUCCESS(Status
))
4166 ERR("SampRemoveMemberFromGroup() failed (Status 0x%08lx)\n", Status
);
4171 SampCloseDbObject(UserObject
);
4180 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
4181 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
4183 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
4184 PSAM_DB_OBJECT GroupObject
;
4189 /* Validate the group handle */
4190 Status
= SampValidateDbObject(GroupHandle
,
4194 if (!NT_SUCCESS(Status
))
4197 MembersBuffer
= midl_user_allocate(sizeof(SAMPR_GET_MEMBERS_BUFFER
));
4198 if (MembersBuffer
== NULL
)
4199 return STATUS_INSUFFICIENT_RESOURCES
;
4201 SampGetObjectAttribute(GroupObject
,
4209 MembersBuffer
->MemberCount
= 0;
4210 MembersBuffer
->Members
= NULL
;
4211 MembersBuffer
->Attributes
= NULL
;
4213 *Members
= MembersBuffer
;
4215 return STATUS_SUCCESS
;
4218 MembersBuffer
->Members
= midl_user_allocate(Length
);
4219 if (MembersBuffer
->Members
== NULL
)
4221 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4225 MembersBuffer
->Attributes
= midl_user_allocate(Length
);
4226 if (MembersBuffer
->Attributes
== NULL
)
4228 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4232 Status
= SampGetObjectAttribute(GroupObject
,
4235 MembersBuffer
->Members
,
4237 if (!NT_SUCCESS(Status
))
4239 TRACE("SampGetObjectAttributes() failed (Status 0x%08lx)\n", Status
);
4243 MembersBuffer
->MemberCount
= Length
/ sizeof(ULONG
);
4245 for (i
= 0; i
< MembersBuffer
->MemberCount
; i
++)
4247 Status
= SampGetUserGroupAttributes(GroupObject
->ParentObject
,
4248 MembersBuffer
->Members
[i
],
4249 GroupObject
->RelativeId
,
4250 &(MembersBuffer
->Attributes
[i
]));
4251 if (!NT_SUCCESS(Status
))
4253 TRACE("SampGetUserGroupAttributes() failed (Status 0x%08lx)\n", Status
);
4258 *Members
= MembersBuffer
;
4261 if (!NT_SUCCESS(Status
))
4263 if (MembersBuffer
!= NULL
)
4265 if (MembersBuffer
->Members
!= NULL
)
4266 midl_user_free(MembersBuffer
->Members
);
4268 if (MembersBuffer
->Attributes
!= NULL
)
4269 midl_user_free(MembersBuffer
->Attributes
);
4271 midl_user_free(MembersBuffer
);
4282 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
4283 IN
unsigned long MemberId
,
4284 IN
unsigned long Attributes
)
4286 PSAM_DB_OBJECT GroupObject
;
4289 /* Validate the group handle */
4290 Status
= SampValidateDbObject(GroupHandle
,
4294 if (!NT_SUCCESS(Status
))
4296 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
4300 Status
= SampSetUserGroupAttributes(GroupObject
->ParentObject
,
4302 GroupObject
->RelativeId
,
4304 if (!NT_SUCCESS(Status
))
4306 TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status
);
4316 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
4317 IN ACCESS_MASK DesiredAccess
,
4319 OUT SAMPR_HANDLE
*AliasHandle
)
4321 PSAM_DB_OBJECT DomainObject
;
4322 PSAM_DB_OBJECT AliasObject
;
4326 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4327 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4329 /* Map generic access rights */
4330 RtlMapGenericMask(&DesiredAccess
,
4333 /* Validate the domain handle */
4334 Status
= SampValidateDbObject(DomainHandle
,
4338 if (!NT_SUCCESS(Status
))
4340 TRACE("failed with status 0x%08lx\n", Status
);
4344 /* Convert the RID into a string (hex) */
4345 swprintf(szRid
, L
"%08lX", AliasId
);
4347 /* Create the alias object */
4348 Status
= SampOpenDbObject(DomainObject
,
4355 if (!NT_SUCCESS(Status
))
4357 TRACE("failed with status 0x%08lx\n", Status
);
4361 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4363 return STATUS_SUCCESS
;
4368 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4369 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4371 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4372 HANDLE MembersKeyHandle
= NULL
;
4377 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4378 if (InfoBuffer
== NULL
)
4379 return STATUS_INSUFFICIENT_RESOURCES
;
4381 Status
= SampGetObjectAttributeString(AliasObject
,
4383 &InfoBuffer
->General
.Name
);
4384 if (!NT_SUCCESS(Status
))
4386 TRACE("Status 0x%08lx\n", Status
);
4390 Status
= SampGetObjectAttributeString(AliasObject
,
4392 &InfoBuffer
->General
.AdminComment
);
4393 if (!NT_SUCCESS(Status
))
4395 TRACE("Status 0x%08lx\n", Status
);
4399 /* Open the Members subkey */
4400 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4404 if (NT_SUCCESS(Status
))
4406 /* Retrieve the number of members of the alias */
4407 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4409 &InfoBuffer
->General
.MemberCount
);
4410 if (!NT_SUCCESS(Status
))
4412 TRACE("Status 0x%08lx\n", Status
);
4416 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4418 InfoBuffer
->General
.MemberCount
= 0;
4419 Status
= STATUS_SUCCESS
;
4423 TRACE("Status 0x%08lx\n", Status
);
4427 *Buffer
= InfoBuffer
;
4430 if (MembersKeyHandle
!= NULL
)
4431 SampRegCloseKey(MembersKeyHandle
);
4433 if (!NT_SUCCESS(Status
))
4435 if (InfoBuffer
!= NULL
)
4437 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4438 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4440 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4441 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4443 midl_user_free(InfoBuffer
);
4452 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4453 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4455 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4460 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4461 if (InfoBuffer
== NULL
)
4462 return STATUS_INSUFFICIENT_RESOURCES
;
4464 Status
= SampGetObjectAttributeString(AliasObject
,
4466 &InfoBuffer
->Name
.Name
);
4467 if (!NT_SUCCESS(Status
))
4469 TRACE("Status 0x%08lx\n", Status
);
4473 *Buffer
= InfoBuffer
;
4476 if (!NT_SUCCESS(Status
))
4478 if (InfoBuffer
!= NULL
)
4480 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4481 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4483 midl_user_free(InfoBuffer
);
4492 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4493 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4495 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4500 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4501 if (InfoBuffer
== NULL
)
4502 return STATUS_INSUFFICIENT_RESOURCES
;
4504 Status
= SampGetObjectAttributeString(AliasObject
,
4506 &InfoBuffer
->AdminComment
.AdminComment
);
4507 if (!NT_SUCCESS(Status
))
4509 TRACE("Status 0x%08lx\n", Status
);
4513 *Buffer
= InfoBuffer
;
4516 if (!NT_SUCCESS(Status
))
4518 if (InfoBuffer
!= NULL
)
4520 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4521 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4523 midl_user_free(InfoBuffer
);
4534 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4535 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4536 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4538 PSAM_DB_OBJECT AliasObject
;
4541 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4542 AliasHandle
, AliasInformationClass
, Buffer
);
4544 /* Validate the alias handle */
4545 Status
= SampValidateDbObject(AliasHandle
,
4547 ALIAS_READ_INFORMATION
,
4549 if (!NT_SUCCESS(Status
))
4552 switch (AliasInformationClass
)
4554 case AliasGeneralInformation
:
4555 Status
= SampQueryAliasGeneral(AliasObject
,
4559 case AliasNameInformation
:
4560 Status
= SampQueryAliasName(AliasObject
,
4564 case AliasAdminCommentInformation
:
4565 Status
= SampQueryAliasAdminComment(AliasObject
,
4570 Status
= STATUS_INVALID_INFO_CLASS
;
4581 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4582 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4583 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4585 PSAM_DB_OBJECT AliasObject
;
4588 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4589 AliasHandle
, AliasInformationClass
, Buffer
);
4591 /* Validate the alias handle */
4592 Status
= SampValidateDbObject(AliasHandle
,
4594 ALIAS_WRITE_ACCOUNT
,
4596 if (!NT_SUCCESS(Status
))
4599 switch (AliasInformationClass
)
4601 case AliasNameInformation
:
4602 Status
= SampSetObjectAttribute(AliasObject
,
4605 Buffer
->Name
.Name
.Buffer
,
4606 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4609 case AliasAdminCommentInformation
:
4610 Status
= SampSetObjectAttribute(AliasObject
,
4613 Buffer
->AdminComment
.AdminComment
.Buffer
,
4614 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4618 Status
= STATUS_INVALID_INFO_CLASS
;
4629 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4631 PSAM_DB_OBJECT AliasObject
;
4634 /* Validate the alias handle */
4635 Status
= SampValidateDbObject(AliasHandle
,
4639 if (!NT_SUCCESS(Status
))
4641 TRACE("failed with status 0x%08lx\n", Status
);
4645 /* Fail, if the alias is built-in */
4646 if (AliasObject
->RelativeId
< 1000)
4648 TRACE("You can not delete a special account!\n");
4649 return STATUS_SPECIAL_ACCOUNT
;
4652 /* FIXME: Remove all members from the alias */
4654 /* Delete the alias from the database */
4655 Status
= SampDeleteAccountDbObject(AliasObject
);
4656 if (!NT_SUCCESS(Status
))
4658 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4662 /* Invalidate the handle */
4663 *AliasHandle
= NULL
;
4672 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4673 IN PRPC_SID MemberId
)
4675 PSAM_DB_OBJECT AliasObject
;
4676 LPWSTR MemberIdString
= NULL
;
4677 HANDLE MembersKeyHandle
= NULL
;
4678 HANDLE MemberKeyHandle
= NULL
;
4679 ULONG MemberIdLength
;
4682 TRACE("SamrAddMemberToAlias(%p %p)\n",
4683 AliasHandle
, MemberId
);
4685 /* Validate the alias handle */
4686 Status
= SampValidateDbObject(AliasHandle
,
4690 if (!NT_SUCCESS(Status
))
4692 TRACE("failed with status 0x%08lx\n", Status
);
4696 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4697 TRACE("Member SID: %S\n", MemberIdString
);
4699 MemberIdLength
= RtlLengthSid(MemberId
);
4701 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4705 if (!NT_SUCCESS(Status
))
4707 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4711 Status
= SampRegSetValue(MembersKeyHandle
,
4716 if (!NT_SUCCESS(Status
))
4718 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4722 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4726 if (!NT_SUCCESS(Status
))
4728 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4732 Status
= SampRegSetValue(MemberKeyHandle
,
4737 if (!NT_SUCCESS(Status
))
4739 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4744 if (MemberKeyHandle
!= NULL
)
4745 SampRegCloseKey(MemberKeyHandle
);
4747 if (MembersKeyHandle
!= NULL
)
4748 SampRegCloseKey(MembersKeyHandle
);
4750 if (MemberIdString
!= NULL
)
4751 LocalFree(MemberIdString
);
4760 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4761 IN PRPC_SID MemberId
)
4763 PSAM_DB_OBJECT AliasObject
;
4764 LPWSTR MemberIdString
= NULL
;
4765 HANDLE MembersKeyHandle
= NULL
;
4766 HANDLE MemberKeyHandle
= NULL
;
4770 TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
4771 AliasHandle
, MemberId
);
4773 /* Validate the alias handle */
4774 Status
= SampValidateDbObject(AliasHandle
,
4776 ALIAS_REMOVE_MEMBER
,
4778 if (!NT_SUCCESS(Status
))
4780 TRACE("failed with status 0x%08lx\n", Status
);
4784 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4785 TRACE("Member SID: %S\n", MemberIdString
);
4787 Status
= SampRegOpenKey(AliasObject
->MembersKeyHandle
,
4789 KEY_WRITE
| KEY_QUERY_VALUE
,
4791 if (!NT_SUCCESS(Status
))
4793 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4797 Status
= SampRegDeleteValue(MemberKeyHandle
,
4799 if (!NT_SUCCESS(Status
))
4801 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4805 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
4808 if (!NT_SUCCESS(Status
))
4810 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4814 if (ulValueCount
== 0)
4816 SampRegCloseKey(MemberKeyHandle
);
4817 MemberKeyHandle
= NULL
;
4819 Status
= SampRegDeleteKey(AliasObject
->MembersKeyHandle
,
4821 if (!NT_SUCCESS(Status
))
4823 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4828 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4830 KEY_WRITE
| KEY_QUERY_VALUE
,
4832 if (!NT_SUCCESS(Status
))
4834 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4838 Status
= SampRegDeleteValue(MembersKeyHandle
,
4840 if (!NT_SUCCESS(Status
))
4842 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4846 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4849 if (!NT_SUCCESS(Status
))
4851 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4855 if (ulValueCount
== 0)
4857 SampRegCloseKey(MembersKeyHandle
);
4858 MembersKeyHandle
= NULL
;
4860 Status
= SampRegDeleteKey(AliasObject
->KeyHandle
,
4862 if (!NT_SUCCESS(Status
))
4864 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4870 if (MemberKeyHandle
!= NULL
)
4871 SampRegCloseKey(MemberKeyHandle
);
4873 if (MembersKeyHandle
!= NULL
)
4874 SampRegCloseKey(MembersKeyHandle
);
4876 if (MemberIdString
!= NULL
)
4877 LocalFree(MemberIdString
);
4886 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4887 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4889 PSAM_DB_OBJECT AliasObject
;
4890 HANDLE MembersKeyHandle
= NULL
;
4891 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4892 ULONG ValueCount
= 0;
4897 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4898 AliasHandle
, Members
);
4900 /* Validate the alias handle */
4901 Status
= SampValidateDbObject(AliasHandle
,
4905 if (!NT_SUCCESS(Status
))
4907 ERR("failed with status 0x%08lx\n", Status
);
4911 /* Open the members key of the alias objct */
4912 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4916 if (!NT_SUCCESS(Status
))
4918 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4922 /* Get the number of members */
4923 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4926 if (!NT_SUCCESS(Status
))
4928 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4932 /* Allocate the member array */
4933 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4934 if (MemberArray
== NULL
)
4936 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4940 /* Enumerate the members */
4944 /* Get the size of the next SID */
4946 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4953 if (!NT_SUCCESS(Status
))
4955 if (Status
== STATUS_NO_MORE_ENTRIES
)
4956 Status
= STATUS_SUCCESS
;
4960 /* Allocate a buffer for the SID */
4961 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4962 if (MemberArray
[Index
].SidPointer
== NULL
)
4964 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4968 /* Read the SID into the buffer */
4969 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4974 (PVOID
)MemberArray
[Index
].SidPointer
,
4976 if (!NT_SUCCESS(Status
))
4984 /* Return the number of members and the member array */
4985 if (NT_SUCCESS(Status
))
4987 Members
->Count
= ValueCount
;
4988 Members
->Sids
= MemberArray
;
4992 /* Clean up the members array and the SID buffers if something failed */
4993 if (!NT_SUCCESS(Status
))
4995 if (MemberArray
!= NULL
)
4997 for (Index
= 0; Index
< ValueCount
; Index
++)
4999 if (MemberArray
[Index
].SidPointer
!= NULL
)
5000 midl_user_free(MemberArray
[Index
].SidPointer
);
5003 midl_user_free(MemberArray
);
5007 /* Close the members key */
5008 if (MembersKeyHandle
!= NULL
)
5009 SampRegCloseKey(MembersKeyHandle
);
5018 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
5019 IN ACCESS_MASK DesiredAccess
,
5020 IN
unsigned long UserId
,
5021 OUT SAMPR_HANDLE
*UserHandle
)
5023 PSAM_DB_OBJECT DomainObject
;
5024 PSAM_DB_OBJECT UserObject
;
5028 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
5029 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
5031 /* Map generic access rights */
5032 RtlMapGenericMask(&DesiredAccess
,
5035 /* Validate the domain handle */
5036 Status
= SampValidateDbObject(DomainHandle
,
5040 if (!NT_SUCCESS(Status
))
5042 TRACE("failed with status 0x%08lx\n", Status
);
5046 /* Convert the RID into a string (hex) */
5047 swprintf(szRid
, L
"%08lX", UserId
);
5049 /* Create the user object */
5050 Status
= SampOpenDbObject(DomainObject
,
5057 if (!NT_SUCCESS(Status
))
5059 TRACE("failed with status 0x%08lx\n", Status
);
5063 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
5065 return STATUS_SUCCESS
;
5072 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
5074 PSAM_DB_OBJECT UserObject
;
5077 TRACE("(%p)\n", UserHandle
);
5079 /* Validate the user handle */
5080 Status
= SampValidateDbObject(*UserHandle
,
5084 if (!NT_SUCCESS(Status
))
5086 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
5090 /* Fail, if the user is built-in */
5091 if (UserObject
->RelativeId
< 1000)
5093 TRACE("You can not delete a special account!\n");
5094 return STATUS_SPECIAL_ACCOUNT
;
5097 /* FIXME: Remove the user from all groups */
5099 /* FIXME: Remove the user from all aliases */
5101 /* Delete the user from the database */
5102 Status
= SampDeleteAccountDbObject(UserObject
);
5103 if (!NT_SUCCESS(Status
))
5105 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5109 /* Invalidate the handle */
5112 return STATUS_SUCCESS
;
5118 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
5119 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5121 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5122 SAM_USER_FIXED_DATA FixedData
;
5128 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5129 if (InfoBuffer
== NULL
)
5130 return STATUS_INSUFFICIENT_RESOURCES
;
5132 Length
= sizeof(SAM_USER_FIXED_DATA
);
5133 Status
= SampGetObjectAttribute(UserObject
,
5138 if (!NT_SUCCESS(Status
))
5141 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5143 /* Get the Name string */
5144 Status
= SampGetObjectAttributeString(UserObject
,
5146 &InfoBuffer
->General
.UserName
);
5147 if (!NT_SUCCESS(Status
))
5149 TRACE("Status 0x%08lx\n", Status
);
5153 /* Get the FullName string */
5154 Status
= SampGetObjectAttributeString(UserObject
,
5156 &InfoBuffer
->General
.FullName
);
5157 if (!NT_SUCCESS(Status
))
5159 TRACE("Status 0x%08lx\n", Status
);
5163 /* Get the AdminComment string */
5164 Status
= SampGetObjectAttributeString(UserObject
,
5166 &InfoBuffer
->General
.AdminComment
);
5167 if (!NT_SUCCESS(Status
))
5169 TRACE("Status 0x%08lx\n", Status
);
5173 /* Get the UserComment string */
5174 Status
= SampGetObjectAttributeString(UserObject
,
5176 &InfoBuffer
->General
.UserComment
);
5177 if (!NT_SUCCESS(Status
))
5179 TRACE("Status 0x%08lx\n", Status
);
5183 *Buffer
= InfoBuffer
;
5186 if (!NT_SUCCESS(Status
))
5188 if (InfoBuffer
!= NULL
)
5190 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
5191 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
5193 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
5194 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
5196 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
5197 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
5199 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
5200 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
5202 midl_user_free(InfoBuffer
);
5212 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
5213 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5215 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5216 SAM_USER_FIXED_DATA FixedData
;
5222 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5223 if (InfoBuffer
== NULL
)
5224 return STATUS_INSUFFICIENT_RESOURCES
;
5226 Length
= sizeof(SAM_USER_FIXED_DATA
);
5227 Status
= SampGetObjectAttribute(UserObject
,
5232 if (!NT_SUCCESS(Status
))
5235 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
5236 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
5238 /* Get the UserComment string */
5239 Status
= SampGetObjectAttributeString(UserObject
,
5241 &InfoBuffer
->Preferences
.UserComment
);
5242 if (!NT_SUCCESS(Status
))
5244 TRACE("Status 0x%08lx\n", Status
);
5248 *Buffer
= InfoBuffer
;
5251 if (!NT_SUCCESS(Status
))
5253 if (InfoBuffer
!= NULL
)
5255 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
5256 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
5258 midl_user_free(InfoBuffer
);
5268 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
5269 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5271 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5272 SAM_USER_FIXED_DATA FixedData
;
5278 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5279 if (InfoBuffer
== NULL
)
5280 return STATUS_INSUFFICIENT_RESOURCES
;
5282 Length
= sizeof(SAM_USER_FIXED_DATA
);
5283 Status
= SampGetObjectAttribute(UserObject
,
5288 if (!NT_SUCCESS(Status
))
5291 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
5292 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5293 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5294 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5295 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5296 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5297 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5298 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5299 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5300 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
5301 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
5303 // OLD_LARGE_INTEGER PasswordCanChange;
5304 // OLD_LARGE_INTEGER PasswordMustChange;
5306 /* Get the Name string */
5307 Status
= SampGetObjectAttributeString(UserObject
,
5309 &InfoBuffer
->Logon
.UserName
);
5310 if (!NT_SUCCESS(Status
))
5312 TRACE("Status 0x%08lx\n", Status
);
5316 /* Get the FullName string */
5317 Status
= SampGetObjectAttributeString(UserObject
,
5319 &InfoBuffer
->Logon
.FullName
);
5320 if (!NT_SUCCESS(Status
))
5322 TRACE("Status 0x%08lx\n", Status
);
5326 /* Get the HomeDirectory string */
5327 Status
= SampGetObjectAttributeString(UserObject
,
5329 &InfoBuffer
->Logon
.HomeDirectory
);
5330 if (!NT_SUCCESS(Status
))
5332 TRACE("Status 0x%08lx\n", Status
);
5336 /* Get the HomeDirectoryDrive string */
5337 Status
= SampGetObjectAttributeString(UserObject
,
5338 L
"HomeDirectoryDrive",
5339 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
5340 if (!NT_SUCCESS(Status
))
5342 TRACE("Status 0x%08lx\n", Status
);
5346 /* Get the ScriptPath string */
5347 Status
= SampGetObjectAttributeString(UserObject
,
5349 &InfoBuffer
->Logon
.ScriptPath
);
5350 if (!NT_SUCCESS(Status
))
5352 TRACE("Status 0x%08lx\n", Status
);
5356 /* Get the ProfilePath string */
5357 Status
= SampGetObjectAttributeString(UserObject
,
5359 &InfoBuffer
->Logon
.ProfilePath
);
5360 if (!NT_SUCCESS(Status
))
5362 TRACE("Status 0x%08lx\n", Status
);
5366 /* Get the WorkStations string */
5367 Status
= SampGetObjectAttributeString(UserObject
,
5369 &InfoBuffer
->Logon
.WorkStations
);
5370 if (!NT_SUCCESS(Status
))
5372 TRACE("Status 0x%08lx\n", Status
);
5376 /* FIXME: LogonHours */
5378 *Buffer
= InfoBuffer
;
5381 if (!NT_SUCCESS(Status
))
5383 if (InfoBuffer
!= NULL
)
5385 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
5386 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
5388 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
5389 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
5391 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
5392 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5394 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5395 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5397 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5398 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5400 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5401 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5403 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5404 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5406 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5407 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5409 midl_user_free(InfoBuffer
);
5419 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5420 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5422 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5423 SAM_USER_FIXED_DATA FixedData
;
5429 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5430 if (InfoBuffer
== NULL
)
5431 return STATUS_INSUFFICIENT_RESOURCES
;
5433 Length
= sizeof(SAM_USER_FIXED_DATA
);
5434 Status
= SampGetObjectAttribute(UserObject
,
5439 if (!NT_SUCCESS(Status
))
5442 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5443 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5444 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5445 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5446 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5447 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5448 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5449 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5450 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5451 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5452 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5453 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
5454 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
5456 /* Get the Name string */
5457 Status
= SampGetObjectAttributeString(UserObject
,
5459 &InfoBuffer
->Account
.UserName
);
5460 if (!NT_SUCCESS(Status
))
5462 TRACE("Status 0x%08lx\n", Status
);
5466 /* Get the FullName string */
5467 Status
= SampGetObjectAttributeString(UserObject
,
5469 &InfoBuffer
->Account
.FullName
);
5470 if (!NT_SUCCESS(Status
))
5472 TRACE("Status 0x%08lx\n", Status
);
5476 /* Get the HomeDirectory string */
5477 Status
= SampGetObjectAttributeString(UserObject
,
5479 &InfoBuffer
->Account
.HomeDirectory
);
5480 if (!NT_SUCCESS(Status
))
5482 TRACE("Status 0x%08lx\n", Status
);
5486 /* Get the HomeDirectoryDrive string */
5487 Status
= SampGetObjectAttributeString(UserObject
,
5488 L
"HomeDirectoryDrive",
5489 &InfoBuffer
->Account
.HomeDirectoryDrive
);
5490 if (!NT_SUCCESS(Status
))
5492 TRACE("Status 0x%08lx\n", Status
);
5496 /* Get the ScriptPath string */
5497 Status
= SampGetObjectAttributeString(UserObject
,
5499 &InfoBuffer
->Account
.ScriptPath
);
5500 if (!NT_SUCCESS(Status
))
5502 TRACE("Status 0x%08lx\n", Status
);
5506 /* Get the ProfilePath string */
5507 Status
= SampGetObjectAttributeString(UserObject
,
5509 &InfoBuffer
->Account
.ProfilePath
);
5510 if (!NT_SUCCESS(Status
))
5512 TRACE("Status 0x%08lx\n", Status
);
5516 /* Get the AdminComment string */
5517 Status
= SampGetObjectAttributeString(UserObject
,
5519 &InfoBuffer
->Account
.AdminComment
);
5520 if (!NT_SUCCESS(Status
))
5522 TRACE("Status 0x%08lx\n", Status
);
5526 /* Get the WorkStations string */
5527 Status
= SampGetObjectAttributeString(UserObject
,
5529 &InfoBuffer
->Account
.WorkStations
);
5530 if (!NT_SUCCESS(Status
))
5532 TRACE("Status 0x%08lx\n", Status
);
5536 /* FIXME: LogonHours */
5538 *Buffer
= InfoBuffer
;
5541 if (!NT_SUCCESS(Status
))
5543 if (InfoBuffer
!= NULL
)
5545 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5546 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5548 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5549 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5551 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5552 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5554 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5555 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5557 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5558 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5560 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5561 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5563 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5564 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5566 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5567 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5569 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5570 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5572 midl_user_free(InfoBuffer
);
5579 /* FIXME: SampQueryUserLogonHours */
5583 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
5584 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5586 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5591 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5592 if (InfoBuffer
== NULL
)
5593 return STATUS_INSUFFICIENT_RESOURCES
;
5595 /* Get the Name string */
5596 Status
= SampGetObjectAttributeString(UserObject
,
5598 &InfoBuffer
->Name
.UserName
);
5599 if (!NT_SUCCESS(Status
))
5601 TRACE("Status 0x%08lx\n", Status
);
5605 /* Get the FullName string */
5606 Status
= SampGetObjectAttributeString(UserObject
,
5608 &InfoBuffer
->Name
.FullName
);
5609 if (!NT_SUCCESS(Status
))
5611 TRACE("Status 0x%08lx\n", Status
);
5615 *Buffer
= InfoBuffer
;
5618 if (!NT_SUCCESS(Status
))
5620 if (InfoBuffer
!= NULL
)
5622 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5623 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5625 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5626 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5628 midl_user_free(InfoBuffer
);
5637 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5638 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5640 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5645 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5646 if (InfoBuffer
== NULL
)
5647 return STATUS_INSUFFICIENT_RESOURCES
;
5649 /* Get the Name string */
5650 Status
= SampGetObjectAttributeString(UserObject
,
5652 &InfoBuffer
->AccountName
.UserName
);
5653 if (!NT_SUCCESS(Status
))
5655 TRACE("Status 0x%08lx\n", Status
);
5659 *Buffer
= InfoBuffer
;
5662 if (!NT_SUCCESS(Status
))
5664 if (InfoBuffer
!= NULL
)
5666 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5667 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5669 midl_user_free(InfoBuffer
);
5678 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5679 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5681 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5686 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5687 if (InfoBuffer
== NULL
)
5688 return STATUS_INSUFFICIENT_RESOURCES
;
5690 /* Get the FullName string */
5691 Status
= SampGetObjectAttributeString(UserObject
,
5693 &InfoBuffer
->FullName
.FullName
);
5694 if (!NT_SUCCESS(Status
))
5696 TRACE("Status 0x%08lx\n", Status
);
5700 *Buffer
= InfoBuffer
;
5703 if (!NT_SUCCESS(Status
))
5705 if (InfoBuffer
!= NULL
)
5707 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
5708 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5710 midl_user_free(InfoBuffer
);
5720 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5721 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5723 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5724 SAM_USER_FIXED_DATA FixedData
;
5730 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5731 if (InfoBuffer
== NULL
)
5732 return STATUS_INSUFFICIENT_RESOURCES
;
5734 Length
= sizeof(SAM_USER_FIXED_DATA
);
5735 Status
= SampGetObjectAttribute(UserObject
,
5740 if (!NT_SUCCESS(Status
))
5743 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5745 *Buffer
= InfoBuffer
;
5748 if (!NT_SUCCESS(Status
))
5750 if (InfoBuffer
!= NULL
)
5752 midl_user_free(InfoBuffer
);
5761 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5762 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5764 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5769 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5770 if (InfoBuffer
== NULL
)
5771 return STATUS_INSUFFICIENT_RESOURCES
;
5773 /* Get the HomeDirectory string */
5774 Status
= SampGetObjectAttributeString(UserObject
,
5776 &InfoBuffer
->Home
.HomeDirectory
);
5777 if (!NT_SUCCESS(Status
))
5779 TRACE("Status 0x%08lx\n", Status
);
5783 /* Get the HomeDirectoryDrive string */
5784 Status
= SampGetObjectAttributeString(UserObject
,
5785 L
"HomeDirectoryDrive",
5786 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5787 if (!NT_SUCCESS(Status
))
5789 TRACE("Status 0x%08lx\n", Status
);
5793 *Buffer
= InfoBuffer
;
5796 if (!NT_SUCCESS(Status
))
5798 if (InfoBuffer
!= NULL
)
5800 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5801 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5803 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5804 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5806 midl_user_free(InfoBuffer
);
5815 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5816 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5818 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5823 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5824 if (InfoBuffer
== NULL
)
5825 return STATUS_INSUFFICIENT_RESOURCES
;
5827 /* Get the ScriptPath string */
5828 Status
= SampGetObjectAttributeString(UserObject
,
5830 &InfoBuffer
->Script
.ScriptPath
);
5831 if (!NT_SUCCESS(Status
))
5833 TRACE("Status 0x%08lx\n", Status
);
5837 *Buffer
= InfoBuffer
;
5840 if (!NT_SUCCESS(Status
))
5842 if (InfoBuffer
!= NULL
)
5844 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5845 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5847 midl_user_free(InfoBuffer
);
5856 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5857 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5859 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5864 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5865 if (InfoBuffer
== NULL
)
5866 return STATUS_INSUFFICIENT_RESOURCES
;
5868 /* Get the ProfilePath string */
5869 Status
= SampGetObjectAttributeString(UserObject
,
5871 &InfoBuffer
->Profile
.ProfilePath
);
5872 if (!NT_SUCCESS(Status
))
5874 TRACE("Status 0x%08lx\n", Status
);
5878 *Buffer
= InfoBuffer
;
5881 if (!NT_SUCCESS(Status
))
5883 if (InfoBuffer
!= NULL
)
5885 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
5886 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5888 midl_user_free(InfoBuffer
);
5897 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5898 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5900 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5905 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5906 if (InfoBuffer
== NULL
)
5907 return STATUS_INSUFFICIENT_RESOURCES
;
5909 /* Get the AdminComment string */
5910 Status
= SampGetObjectAttributeString(UserObject
,
5912 &InfoBuffer
->AdminComment
.AdminComment
);
5913 if (!NT_SUCCESS(Status
))
5915 TRACE("Status 0x%08lx\n", Status
);
5919 *Buffer
= InfoBuffer
;
5922 if (!NT_SUCCESS(Status
))
5924 if (InfoBuffer
!= NULL
)
5926 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5927 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5929 midl_user_free(InfoBuffer
);
5938 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5939 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5941 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5946 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5947 if (InfoBuffer
== NULL
)
5948 return STATUS_INSUFFICIENT_RESOURCES
;
5950 /* Get the WorkStations string */
5951 Status
= SampGetObjectAttributeString(UserObject
,
5953 &InfoBuffer
->WorkStations
.WorkStations
);
5954 if (!NT_SUCCESS(Status
))
5956 TRACE("Status 0x%08lx\n", Status
);
5960 *Buffer
= InfoBuffer
;
5963 if (!NT_SUCCESS(Status
))
5965 if (InfoBuffer
!= NULL
)
5967 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
5968 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
5970 midl_user_free(InfoBuffer
);
5980 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
5981 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5983 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5984 SAM_USER_FIXED_DATA FixedData
;
5990 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5991 if (InfoBuffer
== NULL
)
5992 return STATUS_INSUFFICIENT_RESOURCES
;
5994 Length
= sizeof(SAM_USER_FIXED_DATA
);
5995 Status
= SampGetObjectAttribute(UserObject
,
6000 if (!NT_SUCCESS(Status
))
6003 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
6005 *Buffer
= InfoBuffer
;
6008 if (!NT_SUCCESS(Status
))
6010 if (InfoBuffer
!= NULL
)
6012 midl_user_free(InfoBuffer
);
6022 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
6023 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6025 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6026 SAM_USER_FIXED_DATA FixedData
;
6032 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6033 if (InfoBuffer
== NULL
)
6034 return STATUS_INSUFFICIENT_RESOURCES
;
6036 Length
= sizeof(SAM_USER_FIXED_DATA
);
6037 Status
= SampGetObjectAttribute(UserObject
,
6042 if (!NT_SUCCESS(Status
))
6045 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6046 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6048 *Buffer
= InfoBuffer
;
6051 if (!NT_SUCCESS(Status
))
6053 if (InfoBuffer
!= NULL
)
6055 midl_user_free(InfoBuffer
);
6065 SampQueryUserInternal1(PSAM_DB_OBJECT UserObject
,
6066 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6068 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6070 NTSTATUS Status
= STATUS_SUCCESS
;
6072 /* Fail, if the caller is not a trusted caller */
6073 if (UserObject
->Trusted
== FALSE
)
6074 return STATUS_INVALID_INFO_CLASS
;
6078 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6079 if (InfoBuffer
== NULL
)
6080 return STATUS_INSUFFICIENT_RESOURCES
;
6082 /* Get the NT password */
6084 SampGetObjectAttribute(UserObject
,
6090 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6092 Status
= SampGetObjectAttribute(UserObject
,
6095 (PVOID
)&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6097 if (!NT_SUCCESS(Status
))
6101 InfoBuffer
->Internal1
.NtPasswordPresent
= (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
6103 /* Get the LM password */
6105 SampGetObjectAttribute(UserObject
,
6111 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6113 Status
= SampGetObjectAttribute(UserObject
,
6116 (PVOID
)&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6118 if (!NT_SUCCESS(Status
))
6122 InfoBuffer
->Internal1
.LmPasswordPresent
= (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
6124 InfoBuffer
->Internal1
.PasswordExpired
= FALSE
;
6126 *Buffer
= InfoBuffer
;
6129 if (!NT_SUCCESS(Status
))
6131 if (InfoBuffer
!= NULL
)
6133 midl_user_free(InfoBuffer
);
6142 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
6143 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6145 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6150 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6151 if (InfoBuffer
== NULL
)
6152 return STATUS_INSUFFICIENT_RESOURCES
;
6154 /* Get the Parameters string */
6155 Status
= SampGetObjectAttributeString(UserObject
,
6157 &InfoBuffer
->Parameters
.Parameters
);
6158 if (!NT_SUCCESS(Status
))
6160 TRACE("Status 0x%08lx\n", Status
);
6164 *Buffer
= InfoBuffer
;
6167 if (!NT_SUCCESS(Status
))
6169 if (InfoBuffer
!= NULL
)
6171 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
6172 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
6174 midl_user_free(InfoBuffer
);
6185 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
6186 IN USER_INFORMATION_CLASS UserInformationClass
,
6187 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6189 PSAM_DB_OBJECT UserObject
;
6190 ACCESS_MASK DesiredAccess
;
6193 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
6194 UserHandle
, UserInformationClass
, Buffer
);
6196 switch (UserInformationClass
)
6198 case UserGeneralInformation
:
6199 case UserNameInformation
:
6200 case UserAccountNameInformation
:
6201 case UserFullNameInformation
:
6202 case UserPrimaryGroupInformation
:
6203 case UserAdminCommentInformation
:
6204 DesiredAccess
= USER_READ_GENERAL
;
6207 case UserLogonHoursInformation
:
6208 case UserHomeInformation
:
6209 case UserScriptInformation
:
6210 case UserProfileInformation
:
6211 case UserWorkStationsInformation
:
6212 DesiredAccess
= USER_READ_LOGON
;
6215 case UserControlInformation
:
6216 case UserExpiresInformation
:
6217 case UserParametersInformation
:
6218 DesiredAccess
= USER_READ_ACCOUNT
;
6221 case UserPreferencesInformation
:
6222 DesiredAccess
= USER_READ_GENERAL
|
6223 USER_READ_PREFERENCES
;
6226 case UserLogonInformation
:
6227 case UserAccountInformation
:
6228 DesiredAccess
= USER_READ_GENERAL
|
6229 USER_READ_PREFERENCES
|
6234 case UserInternal1Information
:
6239 return STATUS_INVALID_INFO_CLASS
;
6242 /* Validate the domain handle */
6243 Status
= SampValidateDbObject(UserHandle
,
6247 if (!NT_SUCCESS(Status
))
6249 TRACE("failed with status 0x%08lx\n", Status
);
6253 switch (UserInformationClass
)
6255 case UserGeneralInformation
:
6256 Status
= SampQueryUserGeneral(UserObject
,
6260 case UserPreferencesInformation
:
6261 Status
= SampQueryUserPreferences(UserObject
,
6265 case UserLogonInformation
:
6266 Status
= SampQueryUserLogon(UserObject
,
6270 // case UserLogonHoursInformation:
6271 // Status = SampQueryUserLogonHours(UserObject,
6275 case UserAccountInformation
:
6276 Status
= SampQueryUserAccount(UserObject
,
6280 case UserNameInformation
:
6281 Status
= SampQueryUserName(UserObject
,
6285 case UserAccountNameInformation
:
6286 Status
= SampQueryUserAccountName(UserObject
,
6290 case UserFullNameInformation
:
6291 Status
= SampQueryUserFullName(UserObject
,
6295 case UserPrimaryGroupInformation
:
6296 Status
= SampQueryUserPrimaryGroup(UserObject
,
6300 case UserHomeInformation
:
6301 Status
= SampQueryUserHome(UserObject
,
6304 case UserScriptInformation
:
6305 Status
= SampQueryUserScript(UserObject
,
6309 case UserProfileInformation
:
6310 Status
= SampQueryUserProfile(UserObject
,
6314 case UserAdminCommentInformation
:
6315 Status
= SampQueryUserAdminComment(UserObject
,
6319 case UserWorkStationsInformation
:
6320 Status
= SampQueryUserWorkStations(UserObject
,
6324 case UserControlInformation
:
6325 Status
= SampQueryUserControl(UserObject
,
6329 case UserExpiresInformation
:
6330 Status
= SampQueryUserExpires(UserObject
,
6334 case UserInternal1Information
:
6335 Status
= SampQueryUserInternal1(UserObject
,
6339 case UserParametersInformation
:
6340 Status
= SampQueryUserParameters(UserObject
,
6344 // case UserAllInformation:
6345 // case UserInternal4Information:
6346 // case UserInternal5Information:
6347 // case UserInternal4InformationNew:
6348 // case UserInternal5InformationNew:
6351 Status
= STATUS_INVALID_INFO_CLASS
;
6359 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
6360 PSAMPR_USER_INFO_BUFFER Buffer
)
6362 SAM_USER_FIXED_DATA FixedData
;
6366 Length
= sizeof(SAM_USER_FIXED_DATA
);
6367 Status
= SampGetObjectAttribute(UserObject
,
6372 if (!NT_SUCCESS(Status
))
6375 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
6377 Status
= SampSetObjectAttribute(UserObject
,
6382 if (!NT_SUCCESS(Status
))
6385 Status
= SampSetObjectAttribute(UserObject
,
6388 Buffer
->General
.UserName
.Buffer
,
6389 Buffer
->General
.UserName
.MaximumLength
);
6390 if (!NT_SUCCESS(Status
))
6393 Status
= SampSetObjectAttribute(UserObject
,
6396 Buffer
->General
.FullName
.Buffer
,
6397 Buffer
->General
.FullName
.MaximumLength
);
6398 if (!NT_SUCCESS(Status
))
6401 Status
= SampSetObjectAttribute(UserObject
,
6404 Buffer
->General
.AdminComment
.Buffer
,
6405 Buffer
->General
.AdminComment
.MaximumLength
);
6406 if (!NT_SUCCESS(Status
))
6409 Status
= SampSetObjectAttribute(UserObject
,
6412 Buffer
->General
.UserComment
.Buffer
,
6413 Buffer
->General
.UserComment
.MaximumLength
);
6421 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
6422 PSAMPR_USER_INFO_BUFFER Buffer
)
6424 SAM_USER_FIXED_DATA FixedData
;
6428 Length
= sizeof(SAM_USER_FIXED_DATA
);
6429 Status
= SampGetObjectAttribute(UserObject
,
6434 if (!NT_SUCCESS(Status
))
6437 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6438 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6440 Status
= SampSetObjectAttribute(UserObject
,
6445 if (!NT_SUCCESS(Status
))
6448 Status
= SampSetObjectAttribute(UserObject
,
6451 Buffer
->Preferences
.UserComment
.Buffer
,
6452 Buffer
->Preferences
.UserComment
.MaximumLength
);
6460 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
6461 PSAMPR_USER_INFO_BUFFER Buffer
)
6463 SAM_USER_FIXED_DATA FixedData
;
6467 Length
= sizeof(SAM_USER_FIXED_DATA
);
6468 Status
= SampGetObjectAttribute(UserObject
,
6473 if (!NT_SUCCESS(Status
))
6476 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
6478 Status
= SampSetObjectAttribute(UserObject
,
6490 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
6491 PSAMPR_USER_INFO_BUFFER Buffer
)
6493 SAM_USER_FIXED_DATA FixedData
;
6497 Length
= sizeof(SAM_USER_FIXED_DATA
);
6498 Status
= SampGetObjectAttribute(UserObject
,
6503 if (!NT_SUCCESS(Status
))
6506 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
6508 Status
= SampSetObjectAttribute(UserObject
,
6520 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
6521 PSAMPR_USER_INFO_BUFFER Buffer
)
6523 SAM_USER_FIXED_DATA FixedData
;
6527 Length
= sizeof(SAM_USER_FIXED_DATA
);
6528 Status
= SampGetObjectAttribute(UserObject
,
6533 if (!NT_SUCCESS(Status
))
6536 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
6537 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
6539 Status
= SampSetObjectAttribute(UserObject
,
6551 SampSetUserInternal1(PSAM_DB_OBJECT UserObject
,
6552 PSAMPR_USER_INFO_BUFFER Buffer
)
6554 SAM_USER_FIXED_DATA FixedData
;
6556 NTSTATUS Status
= STATUS_SUCCESS
;
6558 /* FIXME: Decrypt NT password */
6559 /* FIXME: Decrypt LM password */
6561 Status
= SampSetUserPassword(UserObject
,
6562 &Buffer
->Internal1
.EncryptedNtOwfPassword
,
6563 Buffer
->Internal1
.NtPasswordPresent
,
6564 &Buffer
->Internal1
.EncryptedLmOwfPassword
,
6565 Buffer
->Internal1
.LmPasswordPresent
);
6566 if (!NT_SUCCESS(Status
))
6569 /* Get the fixed user attributes */
6570 Length
= sizeof(SAM_USER_FIXED_DATA
);
6571 Status
= SampGetObjectAttribute(UserObject
,
6576 if (!NT_SUCCESS(Status
))
6579 if (Buffer
->Internal1
.PasswordExpired
)
6581 /* The pasword was last set ages ago */
6582 FixedData
.PasswordLastSet
.LowPart
= 0;
6583 FixedData
.PasswordLastSet
.HighPart
= 0;
6587 /* The pasword was last set right now */
6588 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
6589 if (!NT_SUCCESS(Status
))
6593 /* Set the fixed user attributes */
6594 Status
= SampSetObjectAttribute(UserObject
,
6606 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
6607 PSAMPR_USER_INFO_BUFFER Buffer
)
6609 SAM_USER_FIXED_DATA FixedData
;
6612 NTSTATUS Status
= STATUS_SUCCESS
;
6614 WhichFields
= Buffer
->All
.WhichFields
;
6616 if (WhichFields
& USER_ALL_USERNAME
)
6618 Status
= SampSetObjectAttribute(UserObject
,
6621 Buffer
->All
.UserName
.Buffer
,
6622 Buffer
->All
.UserName
.MaximumLength
);
6623 if (!NT_SUCCESS(Status
))
6627 if (WhichFields
& USER_ALL_FULLNAME
)
6629 Status
= SampSetObjectAttribute(UserObject
,
6632 Buffer
->All
.FullName
.Buffer
,
6633 Buffer
->All
.FullName
.MaximumLength
);
6634 if (!NT_SUCCESS(Status
))
6638 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
6640 Status
= SampSetObjectAttribute(UserObject
,
6643 Buffer
->All
.AdminComment
.Buffer
,
6644 Buffer
->All
.AdminComment
.MaximumLength
);
6645 if (!NT_SUCCESS(Status
))
6649 if (WhichFields
& USER_ALL_USERCOMMENT
)
6651 Status
= SampSetObjectAttribute(UserObject
,
6654 Buffer
->All
.UserComment
.Buffer
,
6655 Buffer
->All
.UserComment
.MaximumLength
);
6656 if (!NT_SUCCESS(Status
))
6660 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
6662 Status
= SampSetObjectAttribute(UserObject
,
6665 Buffer
->All
.HomeDirectory
.Buffer
,
6666 Buffer
->All
.HomeDirectory
.MaximumLength
);
6667 if (!NT_SUCCESS(Status
))
6671 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6673 Status
= SampSetObjectAttribute(UserObject
,
6674 L
"HomeDirectoryDrive",
6676 Buffer
->All
.HomeDirectoryDrive
.Buffer
,
6677 Buffer
->All
.HomeDirectoryDrive
.MaximumLength
);
6678 if (!NT_SUCCESS(Status
))
6682 if (WhichFields
& USER_ALL_SCRIPTPATH
)
6684 Status
= SampSetObjectAttribute(UserObject
,
6687 Buffer
->All
.ScriptPath
.Buffer
,
6688 Buffer
->All
.ScriptPath
.MaximumLength
);
6689 if (!NT_SUCCESS(Status
))
6693 if (WhichFields
& USER_ALL_PROFILEPATH
)
6695 Status
= SampSetObjectAttribute(UserObject
,
6698 Buffer
->All
.ProfilePath
.Buffer
,
6699 Buffer
->All
.ProfilePath
.MaximumLength
);
6700 if (!NT_SUCCESS(Status
))
6704 if (WhichFields
& USER_ALL_WORKSTATIONS
)
6706 Status
= SampSetObjectAttribute(UserObject
,
6709 Buffer
->All
.WorkStations
.Buffer
,
6710 Buffer
->All
.WorkStations
.MaximumLength
);
6711 if (!NT_SUCCESS(Status
))
6715 if (WhichFields
& USER_ALL_PARAMETERS
)
6717 Status
= SampSetObjectAttribute(UserObject
,
6720 Buffer
->All
.Parameters
.Buffer
,
6721 Buffer
->All
.Parameters
.MaximumLength
);
6724 if (WhichFields
& (USER_ALL_PRIMARYGROUPID
|
6725 USER_ALL_ACCOUNTEXPIRES
|
6726 USER_ALL_USERACCOUNTCONTROL
|
6727 USER_ALL_COUNTRYCODE
|
6730 Length
= sizeof(SAM_USER_FIXED_DATA
);
6731 Status
= SampGetObjectAttribute(UserObject
,
6736 if (!NT_SUCCESS(Status
))
6739 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
6740 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
6742 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
6744 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
6745 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
6748 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
6749 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
6751 if (WhichFields
& USER_ALL_COUNTRYCODE
)
6752 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6754 if (WhichFields
& USER_ALL_CODEPAGE
)
6755 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6757 Status
= SampSetObjectAttribute(UserObject
,
6762 if (!NT_SUCCESS(Status
))
6769 USER_ALL_NTPASSWORDPRESENT
6770 USER_ALL_LMPASSWORDPRESENT
6771 USER_ALL_PASSWORDEXPIRED
6783 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
6784 IN USER_INFORMATION_CLASS UserInformationClass
,
6785 IN PSAMPR_USER_INFO_BUFFER Buffer
)
6787 PSAM_DB_OBJECT UserObject
;
6788 ACCESS_MASK DesiredAccess
;
6791 TRACE("SamrSetInformationUser(%p %lu %p)\n",
6792 UserHandle
, UserInformationClass
, Buffer
);
6794 switch (UserInformationClass
)
6796 case UserLogonHoursInformation
:
6797 case UserNameInformation
:
6798 case UserAccountNameInformation
:
6799 case UserFullNameInformation
:
6800 case UserPrimaryGroupInformation
:
6801 case UserHomeInformation
:
6802 case UserScriptInformation
:
6803 case UserProfileInformation
:
6804 case UserAdminCommentInformation
:
6805 case UserWorkStationsInformation
:
6806 case UserControlInformation
:
6807 case UserExpiresInformation
:
6808 case UserParametersInformation
:
6809 DesiredAccess
= USER_WRITE_ACCOUNT
;
6812 case UserGeneralInformation
:
6813 DesiredAccess
= USER_WRITE_ACCOUNT
|
6814 USER_WRITE_PREFERENCES
;
6817 case UserPreferencesInformation
:
6818 DesiredAccess
= USER_WRITE_PREFERENCES
;
6821 case UserSetPasswordInformation
:
6822 case UserInternal1Information
:
6823 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
6826 case UserAllInformation
:
6827 DesiredAccess
= 0; /* FIXME */
6831 return STATUS_INVALID_INFO_CLASS
;
6834 /* Validate the domain handle */
6835 Status
= SampValidateDbObject(UserHandle
,
6839 if (!NT_SUCCESS(Status
))
6841 TRACE("failed with status 0x%08lx\n", Status
);
6845 switch (UserInformationClass
)
6847 case UserGeneralInformation
:
6848 Status
= SampSetUserGeneral(UserObject
,
6852 case UserPreferencesInformation
:
6853 Status
= SampSetUserPreferences(UserObject
,
6857 case UserLogonHoursInformation:
6858 Status = SampSetUserLogonHours(UserObject,
6862 case UserNameInformation
:
6863 Status
= SampSetObjectAttribute(UserObject
,
6866 Buffer
->Name
.UserName
.Buffer
,
6867 Buffer
->Name
.UserName
.MaximumLength
);
6868 if (!NT_SUCCESS(Status
))
6871 Status
= SampSetObjectAttribute(UserObject
,
6874 Buffer
->Name
.FullName
.Buffer
,
6875 Buffer
->Name
.FullName
.MaximumLength
);
6878 case UserAccountNameInformation
:
6879 Status
= SampSetObjectAttribute(UserObject
,
6882 Buffer
->AccountName
.UserName
.Buffer
,
6883 Buffer
->AccountName
.UserName
.MaximumLength
);
6886 case UserFullNameInformation
:
6887 Status
= SampSetObjectAttribute(UserObject
,
6890 Buffer
->FullName
.FullName
.Buffer
,
6891 Buffer
->FullName
.FullName
.MaximumLength
);
6894 case UserPrimaryGroupInformation
:
6895 Status
= SampSetUserPrimaryGroup(UserObject
,
6899 case UserHomeInformation
:
6900 Status
= SampSetObjectAttribute(UserObject
,
6903 Buffer
->Home
.HomeDirectory
.Buffer
,
6904 Buffer
->Home
.HomeDirectory
.MaximumLength
);
6905 if (!NT_SUCCESS(Status
))
6908 Status
= SampSetObjectAttribute(UserObject
,
6909 L
"HomeDirectoryDrive",
6911 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
6912 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
6915 case UserScriptInformation
:
6916 Status
= SampSetObjectAttribute(UserObject
,
6919 Buffer
->Script
.ScriptPath
.Buffer
,
6920 Buffer
->Script
.ScriptPath
.MaximumLength
);
6923 case UserProfileInformation
:
6924 Status
= SampSetObjectAttribute(UserObject
,
6927 Buffer
->Profile
.ProfilePath
.Buffer
,
6928 Buffer
->Profile
.ProfilePath
.MaximumLength
);
6931 case UserAdminCommentInformation
:
6932 Status
= SampSetObjectAttribute(UserObject
,
6935 Buffer
->AdminComment
.AdminComment
.Buffer
,
6936 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
6939 case UserWorkStationsInformation
:
6940 Status
= SampSetObjectAttribute(UserObject
,
6943 Buffer
->WorkStations
.WorkStations
.Buffer
,
6944 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
6947 case UserSetPasswordInformation
:
6948 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
6949 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
6951 Status
= SampSetObjectAttribute(UserObject
,
6954 Buffer
->SetPassword
.Password
.Buffer
,
6955 Buffer
->SetPassword
.Password
.MaximumLength
);
6958 case UserControlInformation
:
6959 Status
= SampSetUserControl(UserObject
,
6963 case UserExpiresInformation
:
6964 Status
= SampSetUserExpires(UserObject
,
6968 case UserInternal1Information
:
6969 Status
= SampSetUserInternal1(UserObject
,
6973 case UserParametersInformation
:
6974 Status
= SampSetObjectAttribute(UserObject
,
6977 Buffer
->Parameters
.Parameters
.Buffer
,
6978 Buffer
->Parameters
.Parameters
.MaximumLength
);
6981 case UserAllInformation
:
6982 Status
= SampSetUserAll(UserObject
,
6986 // case UserInternal4Information:
6987 // case UserInternal5Information:
6988 // case UserInternal4InformationNew:
6989 // case UserInternal5InformationNew:
6992 Status
= STATUS_INVALID_INFO_CLASS
;
7002 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
7003 IN
unsigned char LmPresent
,
7004 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
7005 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
7006 IN
unsigned char NtPresent
,
7007 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
7008 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
7009 IN
unsigned char NtCrossEncryptionPresent
,
7010 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
7011 IN
unsigned char LmCrossEncryptionPresent
,
7012 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
7015 return STATUS_NOT_IMPLEMENTED
;
7022 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
7023 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
7025 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
7026 PSAM_DB_OBJECT UserObject
;
7030 TRACE("SamrGetGroupsForUser(%p %p)\n",
7031 UserHandle
, Groups
);
7033 /* Validate the user handle */
7034 Status
= SampValidateDbObject(UserHandle
,
7038 if (!NT_SUCCESS(Status
))
7040 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7044 /* Allocate the groups buffer */
7045 GroupsBuffer
= midl_user_allocate(sizeof(SAMPR_GET_GROUPS_BUFFER
));
7046 if (GroupsBuffer
== NULL
)
7047 return STATUS_INSUFFICIENT_RESOURCES
;
7050 * Get the size of the Groups attribute.
7051 * Do not check the status code because in case of an error
7052 * Length will be 0. And that is all we need.
7054 SampGetObjectAttribute(UserObject
,
7060 /* If there is no Groups attribute, return a groups buffer without an array */
7063 GroupsBuffer
->MembershipCount
= 0;
7064 GroupsBuffer
->Groups
= NULL
;
7066 *Groups
= GroupsBuffer
;
7068 return STATUS_SUCCESS
;
7071 /* Allocate a buffer for the Groups attribute */
7072 GroupsBuffer
->Groups
= midl_user_allocate(Length
);
7073 if (GroupsBuffer
->Groups
== NULL
)
7075 Status
= STATUS_INSUFFICIENT_RESOURCES
;
7079 /* Retrieve the Grous attribute */
7080 Status
= SampGetObjectAttribute(UserObject
,
7083 GroupsBuffer
->Groups
,
7085 if (!NT_SUCCESS(Status
))
7087 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
7091 /* Calculate the membership count */
7092 GroupsBuffer
->MembershipCount
= Length
/ sizeof(GROUP_MEMBERSHIP
);
7094 /* Return the groups buffer to the caller */
7095 *Groups
= GroupsBuffer
;
7098 if (!NT_SUCCESS(Status
))
7100 if (GroupsBuffer
!= NULL
)
7102 if (GroupsBuffer
->Groups
!= NULL
)
7103 midl_user_free(GroupsBuffer
->Groups
);
7105 midl_user_free(GroupsBuffer
);
7116 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
7117 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7118 IN
unsigned long Index
,
7119 IN
unsigned long EntryCount
,
7120 IN
unsigned long PreferredMaximumLength
,
7121 OUT
unsigned long *TotalAvailable
,
7122 OUT
unsigned long *TotalReturned
,
7123 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7126 return STATUS_NOT_IMPLEMENTED
;
7132 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
7133 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7134 IN PRPC_UNICODE_STRING Prefix
,
7135 OUT
unsigned long *Index
)
7138 return STATUS_NOT_IMPLEMENTED
;
7144 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
7147 return STATUS_NOT_IMPLEMENTED
;
7153 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
7156 return STATUS_NOT_IMPLEMENTED
;
7163 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
7164 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
7166 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
7167 SAM_USER_FIXED_DATA UserFixedData
;
7168 PSAM_DB_OBJECT DomainObject
;
7169 PSAM_DB_OBJECT UserObject
;
7174 UserHandle
, PasswordInformation
);
7176 /* Validate the user handle */
7177 Status
= SampValidateDbObject(UserHandle
,
7181 if (!NT_SUCCESS(Status
))
7183 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7187 /* Validate the domain object */
7188 Status
= SampValidateDbObject((SAMPR_HANDLE
)UserObject
->ParentObject
,
7190 DOMAIN_READ_PASSWORD_PARAMETERS
,
7192 if (!NT_SUCCESS(Status
))
7194 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7198 /* Get fixed user data */
7199 Length
= sizeof(SAM_USER_FIXED_DATA
);
7200 Status
= SampGetObjectAttribute(UserObject
,
7203 (PVOID
)&UserFixedData
,
7205 if (!NT_SUCCESS(Status
))
7207 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
7211 if ((UserObject
->RelativeId
== DOMAIN_USER_RID_KRBTGT
) ||
7212 (UserFixedData
.UserAccountControl
& (USER_INTERDOMAIN_TRUST_ACCOUNT
|
7213 USER_WORKSTATION_TRUST_ACCOUNT
|
7214 USER_SERVER_TRUST_ACCOUNT
)))
7216 PasswordInformation
->MinPasswordLength
= 0;
7217 PasswordInformation
->PasswordProperties
= 0;
7221 /* Get fixed domain data */
7222 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
7223 Status
= SampGetObjectAttribute(DomainObject
,
7226 (PVOID
)&DomainFixedData
,
7228 if (!NT_SUCCESS(Status
))
7230 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
7234 PasswordInformation
->MinPasswordLength
= DomainFixedData
.MinPasswordLength
;
7235 PasswordInformation
->PasswordProperties
= DomainFixedData
.PasswordProperties
;
7238 return STATUS_SUCCESS
;
7245 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
7246 IN PRPC_SID MemberSid
)
7249 return STATUS_NOT_IMPLEMENTED
;
7256 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
7257 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
7258 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
7260 TRACE("(%p %lu %p)\n", DomainHandle
, DomainInformationClass
, Buffer
);
7262 return SamrQueryInformationDomain(DomainHandle
,
7263 DomainInformationClass
,
7271 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
7272 IN USER_INFORMATION_CLASS UserInformationClass
,
7273 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
7275 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
7277 return SamrQueryInformationUser(UserHandle
,
7278 UserInformationClass
,
7286 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
7287 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7288 IN
unsigned long Index
,
7289 IN
unsigned long EntryCount
,
7290 IN
unsigned long PreferredMaximumLength
,
7291 OUT
unsigned long *TotalAvailable
,
7292 OUT
unsigned long *TotalReturned
,
7293 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7295 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
7296 DomainHandle
, DisplayInformationClass
, Index
,
7297 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
7298 TotalReturned
, Buffer
);
7300 return SamrQueryDisplayInformation(DomainHandle
,
7301 DisplayInformationClass
,
7304 PreferredMaximumLength
,
7314 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
7315 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7316 IN PRPC_UNICODE_STRING Prefix
,
7317 OUT
unsigned long *Index
)
7319 TRACE("(%p %lu %p %p)\n",
7320 DomainHandle
, DisplayInformationClass
, Prefix
, Index
);
7322 return SamrGetDisplayEnumerationIndex(DomainHandle
,
7323 DisplayInformationClass
,
7332 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
7333 IN PRPC_UNICODE_STRING Name
,
7334 IN
unsigned long AccountType
,
7335 IN ACCESS_MASK DesiredAccess
,
7336 OUT SAMPR_HANDLE
*UserHandle
,
7337 OUT
unsigned long *GrantedAccess
,
7338 OUT
unsigned long *RelativeId
)
7340 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
7341 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
7342 SAM_USER_FIXED_DATA FixedUserData
;
7343 PSAM_DB_OBJECT DomainObject
;
7344 PSAM_DB_OBJECT UserObject
;
7350 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
7351 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
7354 Name
->Length
== 0 ||
7355 Name
->Buffer
== NULL
||
7356 UserHandle
== NULL
||
7358 return STATUS_INVALID_PARAMETER
;
7360 /* Check for valid account type */
7361 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
7362 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
7363 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
7364 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
7365 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
7366 return STATUS_INVALID_PARAMETER
;
7368 /* Map generic access rights */
7369 RtlMapGenericMask(&DesiredAccess
,
7372 /* Validate the domain handle */
7373 Status
= SampValidateDbObject(DomainHandle
,
7377 if (!NT_SUCCESS(Status
))
7379 TRACE("failed with status 0x%08lx\n", Status
);
7383 /* Check if the user name already exists in the domain */
7384 Status
= SampCheckAccountNameInDomain(DomainObject
,
7386 if (!NT_SUCCESS(Status
))
7388 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
7389 Name
->Buffer
, Status
);
7393 /* Get the fixed domain attributes */
7394 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
7395 Status
= SampGetObjectAttribute(DomainObject
,
7398 (PVOID
)&FixedDomainData
,
7400 if (!NT_SUCCESS(Status
))
7402 TRACE("failed with status 0x%08lx\n", Status
);
7406 /* Increment the NextRid attribute */
7407 ulRid
= FixedDomainData
.NextRid
;
7408 FixedDomainData
.NextRid
++;
7410 /* Store the fixed domain attributes */
7411 Status
= SampSetObjectAttribute(DomainObject
,
7416 if (!NT_SUCCESS(Status
))
7418 TRACE("failed with status 0x%08lx\n", Status
);
7422 TRACE("RID: %lx\n", ulRid
);
7424 /* Convert the RID into a string (hex) */
7425 swprintf(szRid
, L
"%08lX", ulRid
);
7427 /* Create the user object */
7428 Status
= SampCreateDbObject(DomainObject
,
7435 if (!NT_SUCCESS(Status
))
7437 TRACE("failed with status 0x%08lx\n", Status
);
7441 /* Add the account name for the user object */
7442 Status
= SampSetAccountNameInDomain(DomainObject
,
7446 if (!NT_SUCCESS(Status
))
7448 TRACE("failed with status 0x%08lx\n", Status
);
7452 /* Initialize fixed user data */
7453 FixedUserData
.Version
= 1;
7454 FixedUserData
.Reserved
= 0;
7455 FixedUserData
.LastLogon
.QuadPart
= 0;
7456 FixedUserData
.LastLogoff
.QuadPart
= 0;
7457 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
7458 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
7459 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
7460 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
7461 FixedUserData
.UserId
= ulRid
;
7462 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
7463 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
7464 USER_PASSWORD_NOT_REQUIRED
|
7466 FixedUserData
.CountryCode
= 0;
7467 FixedUserData
.CodePage
= 0;
7468 FixedUserData
.BadPasswordCount
= 0;
7469 FixedUserData
.LogonCount
= 0;
7470 FixedUserData
.AdminCount
= 0;
7471 FixedUserData
.OperatorCount
= 0;
7473 /* Set fixed user data attribute */
7474 Status
= SampSetObjectAttribute(UserObject
,
7477 (LPVOID
)&FixedUserData
,
7478 sizeof(SAM_USER_FIXED_DATA
));
7479 if (!NT_SUCCESS(Status
))
7481 TRACE("failed with status 0x%08lx\n", Status
);
7485 /* Set the Name attribute */
7486 Status
= SampSetObjectAttribute(UserObject
,
7489 (LPVOID
)Name
->Buffer
,
7490 Name
->MaximumLength
);
7491 if (!NT_SUCCESS(Status
))
7493 TRACE("failed with status 0x%08lx\n", Status
);
7497 /* Set the FullName attribute */
7498 Status
= SampSetObjectAttribute(UserObject
,
7502 EmptyString
.MaximumLength
);
7503 if (!NT_SUCCESS(Status
))
7505 TRACE("failed with status 0x%08lx\n", Status
);
7509 /* Set the HomeDirectory attribute */
7510 Status
= SampSetObjectAttribute(UserObject
,
7514 EmptyString
.MaximumLength
);
7515 if (!NT_SUCCESS(Status
))
7517 TRACE("failed with status 0x%08lx\n", Status
);
7521 /* Set the HomeDirectoryDrive attribute */
7522 Status
= SampSetObjectAttribute(UserObject
,
7523 L
"HomeDirectoryDrive",
7526 EmptyString
.MaximumLength
);
7527 if (!NT_SUCCESS(Status
))
7529 TRACE("failed with status 0x%08lx\n", Status
);
7533 /* Set the ScriptPath attribute */
7534 Status
= SampSetObjectAttribute(UserObject
,
7538 EmptyString
.MaximumLength
);
7539 if (!NT_SUCCESS(Status
))
7541 TRACE("failed with status 0x%08lx\n", Status
);
7545 /* Set the ProfilePath attribute */
7546 Status
= SampSetObjectAttribute(UserObject
,
7550 EmptyString
.MaximumLength
);
7551 if (!NT_SUCCESS(Status
))
7553 TRACE("failed with status 0x%08lx\n", Status
);
7557 /* Set the AdminComment attribute */
7558 Status
= SampSetObjectAttribute(UserObject
,
7562 EmptyString
.MaximumLength
);
7563 if (!NT_SUCCESS(Status
))
7565 TRACE("failed with status 0x%08lx\n", Status
);
7569 /* Set the UserComment attribute */
7570 Status
= SampSetObjectAttribute(UserObject
,
7574 EmptyString
.MaximumLength
);
7575 if (!NT_SUCCESS(Status
))
7577 TRACE("failed with status 0x%08lx\n", Status
);
7581 /* Set the WorkStations attribute */
7582 Status
= SampSetObjectAttribute(UserObject
,
7586 EmptyString
.MaximumLength
);
7587 if (!NT_SUCCESS(Status
))
7589 TRACE("failed with status 0x%08lx\n", Status
);
7593 /* Set the Parameters attribute */
7594 Status
= SampSetObjectAttribute(UserObject
,
7598 EmptyString
.MaximumLength
);
7599 if (!NT_SUCCESS(Status
))
7601 TRACE("failed with status 0x%08lx\n", Status
);
7605 /* FIXME: Set LogonHours attribute*/
7606 /* FIXME: Set Groups attribute*/
7608 /* Set LMPwd attribute*/
7609 Status
= SampSetObjectAttribute(UserObject
,
7614 if (!NT_SUCCESS(Status
))
7616 TRACE("failed with status 0x%08lx\n", Status
);
7620 /* Set NTPwd attribute*/
7621 Status
= SampSetObjectAttribute(UserObject
,
7626 if (!NT_SUCCESS(Status
))
7628 TRACE("failed with status 0x%08lx\n", Status
);
7632 /* Set LMPwdHistory attribute*/
7633 Status
= SampSetObjectAttribute(UserObject
,
7638 if (!NT_SUCCESS(Status
))
7640 TRACE("failed with status 0x%08lx\n", Status
);
7644 /* Set NTPwdHistory attribute*/
7645 Status
= SampSetObjectAttribute(UserObject
,
7650 if (!NT_SUCCESS(Status
))
7652 TRACE("failed with status 0x%08lx\n", Status
);
7656 /* FIXME: Set SecDesc attribute*/
7658 if (NT_SUCCESS(Status
))
7660 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
7661 *RelativeId
= ulRid
;
7662 *GrantedAccess
= UserObject
->Access
;
7665 TRACE("returns with status 0x%08lx\n", Status
);
7674 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
7675 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7676 IN
unsigned long Index
,
7677 IN
unsigned long EntryCount
,
7678 IN
unsigned long PreferredMaximumLength
,
7679 OUT
unsigned long *TotalAvailable
,
7680 OUT
unsigned long *TotalReturned
,
7681 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7683 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
7684 DomainHandle
, DisplayInformationClass
, Index
,
7685 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
7686 TotalReturned
, Buffer
);
7688 return SamrQueryDisplayInformation(DomainHandle
,
7689 DisplayInformationClass
,
7692 PreferredMaximumLength
,
7702 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
7703 IN PSAMPR_PSID_ARRAY MembersBuffer
)
7706 NTSTATUS Status
= STATUS_SUCCESS
;
7708 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
7709 AliasHandle
, MembersBuffer
);
7711 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
7713 Status
= SamrAddMemberToAlias(AliasHandle
,
7714 ((PSID
*)MembersBuffer
->Sids
)[i
]);
7716 if (Status
== STATUS_MEMBER_IN_ALIAS
)
7717 Status
= STATUS_SUCCESS
;
7719 if (!NT_SUCCESS(Status
))
7730 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
7731 IN PSAMPR_PSID_ARRAY MembersBuffer
)
7734 NTSTATUS Status
= STATUS_SUCCESS
;
7736 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
7737 AliasHandle
, MembersBuffer
);
7739 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
7741 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
7742 ((PSID
*)MembersBuffer
->Sids
)[i
]);
7744 if (Status
== STATUS_MEMBER_IN_ALIAS
)
7745 Status
= STATUS_SUCCESS
;
7747 if (!NT_SUCCESS(Status
))
7758 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
7759 IN PRPC_STRING ServerName
,
7760 IN PRPC_STRING UserName
,
7761 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
7762 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
7765 return STATUS_NOT_IMPLEMENTED
;
7771 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
7772 IN PRPC_UNICODE_STRING ServerName
,
7773 IN PRPC_UNICODE_STRING UserName
,
7774 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
7775 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
7776 IN
unsigned char LmPresent
,
7777 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
7778 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
7781 return STATUS_NOT_IMPLEMENTED
;
7787 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
7788 IN PRPC_UNICODE_STRING Unused
,
7789 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
7792 return STATUS_NOT_IMPLEMENTED
;
7798 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
7799 OUT SAMPR_HANDLE
*ServerHandle
,
7800 IN ACCESS_MASK DesiredAccess
)
7803 return STATUS_NOT_IMPLEMENTED
;
7810 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
7811 IN USER_INFORMATION_CLASS UserInformationClass
,
7812 IN PSAMPR_USER_INFO_BUFFER Buffer
)
7814 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
7816 return SamrSetInformationUser(UserHandle
,
7817 UserInformationClass
,
7825 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7828 return STATUS_NOT_IMPLEMENTED
;
7834 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
7837 return STATUS_NOT_IMPLEMENTED
;
7843 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
7846 return STATUS_NOT_IMPLEMENTED
;
7852 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
7853 OUT SAMPR_HANDLE
*ServerHandle
,
7854 IN
unsigned long ClientRevision
,
7855 IN ACCESS_MASK DesiredAccess
)
7858 return STATUS_NOT_IMPLEMENTED
;
7864 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
7867 return STATUS_NOT_IMPLEMENTED
;
7873 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
7874 IN ACCESS_MASK DesiredAccess
,
7875 IN
unsigned long InVersion
,
7876 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
7877 OUT
unsigned long *OutVersion
,
7878 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
7879 OUT SAMPR_HANDLE
*ServerHandle
)
7882 return STATUS_NOT_IMPLEMENTED
;
7888 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
7889 IN
unsigned long Rid
,
7893 return STATUS_NOT_IMPLEMENTED
;
7899 SamrSetDSRMPassword(IN handle_t BindingHandle
,
7900 IN PRPC_UNICODE_STRING Unused
,
7901 IN
unsigned long UserId
,
7902 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
7905 return STATUS_NOT_IMPLEMENTED
;
7911 SamrValidatePassword(IN handle_t Handle
,
7912 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
7913 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
7914 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
7917 return STATUS_NOT_IMPLEMENTED
;