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
};
21 /* FUNCTIONS *****************************************************************/
24 SampStartRpcServer(VOID
)
28 TRACE("SampStartRpcServer() called\n");
30 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
34 if (Status
!= RPC_S_OK
)
36 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
40 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
43 if (Status
!= RPC_S_OK
)
45 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
49 Status
= RpcServerListen(1, 20, TRUE
);
50 if (Status
!= RPC_S_OK
)
52 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
56 TRACE("SampStartRpcServer() done\n");
60 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
62 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
66 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
68 HeapFree(GetProcessHeap(), 0, ptr
);
71 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
78 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
79 OUT SAMPR_HANDLE
*ServerHandle
,
80 IN ACCESS_MASK DesiredAccess
)
82 PSAM_DB_OBJECT ServerObject
;
85 TRACE("SamrConnect(%p %p %lx)\n",
86 ServerName
, ServerHandle
, DesiredAccess
);
88 Status
= SampOpenDbObject(NULL
,
95 if (NT_SUCCESS(Status
))
96 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
98 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
106 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
108 PSAM_DB_OBJECT DbObject
;
109 NTSTATUS Status
= STATUS_SUCCESS
;
111 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
113 Status
= SampValidateDbObject(*SamHandle
,
117 if (Status
== STATUS_SUCCESS
)
119 Status
= SampCloseDbObject(DbObject
);
123 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
131 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
132 IN SECURITY_INFORMATION SecurityInformation
,
133 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
136 return STATUS_NOT_IMPLEMENTED
;
142 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
143 IN SECURITY_INFORMATION SecurityInformation
,
144 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
* SecurityDescriptor
)
147 return STATUS_NOT_IMPLEMENTED
;
153 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
156 return STATUS_NOT_IMPLEMENTED
;
163 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
164 IN PRPC_UNICODE_STRING Name
,
165 OUT PRPC_SID
*DomainId
)
167 PSAM_DB_OBJECT ServerObject
;
168 HANDLE DomainsKeyHandle
= NULL
;
169 HANDLE DomainKeyHandle
= NULL
;
170 WCHAR DomainKeyName
[64];
172 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
173 UNICODE_STRING DomainName
;
178 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
179 ServerHandle
, Name
, DomainId
);
181 /* Validate the server handle */
182 Status
= SampValidateDbObject(ServerHandle
,
184 SAM_SERVER_LOOKUP_DOMAIN
,
186 if (!NT_SUCCESS(Status
))
191 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
195 if (!NT_SUCCESS(Status
))
199 while (Found
== FALSE
)
201 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
205 if (!NT_SUCCESS(Status
))
207 if (Status
== STATUS_NO_MORE_ENTRIES
)
208 Status
= STATUS_NO_SUCH_DOMAIN
;
212 TRACE("Domain key name: %S\n", DomainKeyName
);
214 Status
= SampRegOpenKey(DomainsKeyHandle
,
218 if (NT_SUCCESS(Status
))
220 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
221 Status
= SampRegQueryValue(DomainKeyHandle
,
224 (PVOID
)&DomainNameString
,
226 if (NT_SUCCESS(Status
))
228 TRACE("Domain name: %S\n", DomainNameString
);
230 RtlInitUnicodeString(&DomainName
,
232 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
234 TRACE("Found it!\n");
237 Status
= SampRegQueryValue(DomainKeyHandle
,
242 if (NT_SUCCESS(Status
))
244 *DomainId
= midl_user_allocate(Length
);
246 SampRegQueryValue(DomainKeyHandle
,
252 Status
= STATUS_SUCCESS
;
258 NtClose(DomainKeyHandle
);
264 NtClose(DomainsKeyHandle
);
273 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
274 IN OUT
unsigned long *EnumerationContext
,
275 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
276 IN ULONG PreferedMaximumLength
,
277 OUT PULONG CountReturned
)
279 PSAM_DB_OBJECT ServerObject
;
280 WCHAR DomainKeyName
[64];
281 HANDLE DomainsKeyHandle
;
282 HANDLE DomainKeyHandle
;
285 ULONG RequiredLength
;
288 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
291 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
292 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
295 /* Validate the server handle */
296 Status
= SampValidateDbObject(ServerHandle
,
298 SAM_SERVER_ENUMERATE_DOMAINS
,
300 if (!NT_SUCCESS(Status
))
303 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
307 if (!NT_SUCCESS(Status
))
310 EnumIndex
= *EnumerationContext
;
316 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
320 if (!NT_SUCCESS(Status
))
323 TRACE("EnumIndex: %lu\n", EnumIndex
);
324 TRACE("Domain key name: %S\n", DomainKeyName
);
326 Status
= SampRegOpenKey(DomainsKeyHandle
,
330 TRACE("SampRegOpenKey returned %08lX\n", Status
);
331 if (NT_SUCCESS(Status
))
334 Status
= SampRegQueryValue(DomainKeyHandle
,
339 TRACE("SampRegQueryValue returned %08lX\n", Status
);
340 if (NT_SUCCESS(Status
))
342 TRACE("Data length: %lu\n", DataLength
);
344 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
347 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
351 NtClose(DomainKeyHandle
);
357 TRACE("EnumCount: %lu\n", EnumCount
);
358 TRACE("RequiredLength: %lu\n", RequiredLength
);
360 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
361 if (EnumBuffer
== NULL
)
363 Status
= STATUS_INSUFFICIENT_RESOURCES
;
367 EnumBuffer
->EntriesRead
= EnumCount
;
368 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
369 if (EnumBuffer
->Buffer
== NULL
)
371 Status
= STATUS_INSUFFICIENT_RESOURCES
;
375 EnumIndex
= *EnumerationContext
;
376 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
378 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
382 if (!NT_SUCCESS(Status
))
385 TRACE("EnumIndex: %lu\n", EnumIndex
);
386 TRACE("Domain key name: %S\n", DomainKeyName
);
388 Status
= SampRegOpenKey(DomainsKeyHandle
,
392 TRACE("SampRegOpenKey returned %08lX\n", Status
);
393 if (NT_SUCCESS(Status
))
396 Status
= SampRegQueryValue(DomainKeyHandle
,
401 TRACE("SampRegQueryValue returned %08lX\n", Status
);
402 if (NT_SUCCESS(Status
))
404 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
405 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
406 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
407 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
408 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
410 NtClose(DomainKeyHandle
);
411 Status
= STATUS_INSUFFICIENT_RESOURCES
;
415 Status
= SampRegQueryValue(DomainKeyHandle
,
418 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
420 TRACE("SampRegQueryValue returned %08lX\n", Status
);
421 if (NT_SUCCESS(Status
))
423 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
427 NtClose(DomainKeyHandle
);
429 if (!NT_SUCCESS(Status
))
434 if (NT_SUCCESS(Status
))
436 *EnumerationContext
+= EnumCount
;
437 *Buffer
= EnumBuffer
;
438 *CountReturned
= EnumCount
;
442 if (!NT_SUCCESS(Status
))
444 *EnumerationContext
= 0;
448 if (EnumBuffer
!= NULL
)
450 if (EnumBuffer
->Buffer
!= NULL
)
452 if (EnumBuffer
->EntriesRead
!= 0)
454 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
456 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
457 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
461 midl_user_free(EnumBuffer
->Buffer
);
464 midl_user_free(EnumBuffer
);
468 NtClose(DomainsKeyHandle
);
477 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
478 IN ACCESS_MASK DesiredAccess
,
479 IN PRPC_SID DomainId
,
480 OUT SAMPR_HANDLE
*DomainHandle
)
482 PSAM_DB_OBJECT ServerObject
;
483 PSAM_DB_OBJECT DomainObject
;
486 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
487 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
489 /* Validate the server handle */
490 Status
= SampValidateDbObject(ServerHandle
,
492 SAM_SERVER_LOOKUP_DOMAIN
,
494 if (!NT_SUCCESS(Status
))
497 /* Validate the Domain SID */
498 if ((DomainId
->Revision
!= SID_REVISION
) ||
499 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
500 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
501 return STATUS_INVALID_PARAMETER
;
503 /* Open the domain object */
504 if ((DomainId
->SubAuthorityCount
== 1) &&
505 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
507 /* Builtin domain object */
508 TRACE("Opening the builtin domain object.\n");
510 Status
= SampOpenDbObject(ServerObject
,
518 else if ((DomainId
->SubAuthorityCount
== 4) &&
519 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
521 /* Account domain object */
522 TRACE("Opening the account domain object.\n");
524 /* FIXME: Check the account domain sub authorities!!! */
526 Status
= SampOpenDbObject(ServerObject
,
536 /* No vaild domain SID */
537 Status
= STATUS_INVALID_PARAMETER
;
540 if (NT_SUCCESS(Status
))
541 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
543 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
550 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
551 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
553 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
554 SAM_DOMAIN_FIXED_DATA FixedData
;
560 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
561 if (InfoBuffer
== NULL
)
562 return STATUS_INSUFFICIENT_RESOURCES
;
564 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
565 Status
= SampGetObjectAttribute(DomainObject
,
570 if (!NT_SUCCESS(Status
))
573 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
574 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
575 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
576 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
577 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
578 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
579 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
581 *Buffer
= InfoBuffer
;
584 if (!NT_SUCCESS(Status
))
586 if (InfoBuffer
!= NULL
)
588 midl_user_free(InfoBuffer
);
597 SampGetNumberOfAccounts(PSAM_DB_OBJECT DomainObject
,
601 HANDLE AccountKeyHandle
= NULL
;
602 HANDLE NamesKeyHandle
= NULL
;
607 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
611 if (!NT_SUCCESS(Status
))
614 Status
= SampRegOpenKey(AccountKeyHandle
,
618 if (!NT_SUCCESS(Status
))
621 Status
= SampRegQueryKeyInfo(NamesKeyHandle
,
625 if (NamesKeyHandle
!= NULL
)
626 SampRegCloseKey(NamesKeyHandle
);
628 if (AccountKeyHandle
!= NULL
)
629 SampRegCloseKey(AccountKeyHandle
);
636 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
637 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
639 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
640 SAM_DOMAIN_FIXED_DATA FixedData
;
646 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
647 if (InfoBuffer
== NULL
)
648 return STATUS_INSUFFICIENT_RESOURCES
;
650 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
651 Status
= SampGetObjectAttribute(DomainObject
,
656 if (!NT_SUCCESS(Status
))
659 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
660 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
661 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
662 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
663 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
664 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
665 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
667 /* Get the OemInformation string */
668 Status
= SampGetObjectAttributeString(DomainObject
,
670 &InfoBuffer
->General
.OemInformation
);
671 if (!NT_SUCCESS(Status
))
673 TRACE("Status 0x%08lx\n", Status
);
677 /* Get the Name string */
678 Status
= SampGetObjectAttributeString(DomainObject
,
680 &InfoBuffer
->General
.DomainName
);
681 if (!NT_SUCCESS(Status
))
683 TRACE("Status 0x%08lx\n", Status
);
687 /* Get the ReplicaSourceNodeName string */
688 Status
= SampGetObjectAttributeString(DomainObject
,
689 L
"ReplicaSourceNodeName",
690 &InfoBuffer
->General
.ReplicaSourceNodeName
);
691 if (!NT_SUCCESS(Status
))
693 TRACE("Status 0x%08lx\n", Status
);
697 /* Get the number of Users in the Domain */
698 Status
= SampGetNumberOfAccounts(DomainObject
,
700 &InfoBuffer
->General
.UserCount
);
701 if (!NT_SUCCESS(Status
))
703 TRACE("Status 0x%08lx\n", Status
);
707 /* Get the number of Groups in the Domain */
708 Status
= SampGetNumberOfAccounts(DomainObject
,
710 &InfoBuffer
->General
.GroupCount
);
711 if (!NT_SUCCESS(Status
))
713 TRACE("Status 0x%08lx\n", Status
);
717 /* Get the number of Aliases in the Domain */
718 Status
= SampGetNumberOfAccounts(DomainObject
,
720 &InfoBuffer
->General
.AliasCount
);
721 if (!NT_SUCCESS(Status
))
723 TRACE("Status 0x%08lx\n", Status
);
727 *Buffer
= InfoBuffer
;
730 if (!NT_SUCCESS(Status
))
732 if (InfoBuffer
!= NULL
)
734 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
735 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
737 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
738 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
740 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
741 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
743 midl_user_free(InfoBuffer
);
752 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
753 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
755 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
756 SAM_DOMAIN_FIXED_DATA FixedData
;
762 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
763 if (InfoBuffer
== NULL
)
764 return STATUS_INSUFFICIENT_RESOURCES
;
766 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
767 Status
= SampGetObjectAttribute(DomainObject
,
772 if (!NT_SUCCESS(Status
))
775 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
776 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
778 *Buffer
= InfoBuffer
;
781 if (!NT_SUCCESS(Status
))
783 if (InfoBuffer
!= NULL
)
785 midl_user_free(InfoBuffer
);
794 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
795 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
797 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
802 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
803 if (InfoBuffer
== NULL
)
804 return STATUS_INSUFFICIENT_RESOURCES
;
806 /* Get the OemInformation string */
807 Status
= SampGetObjectAttributeString(DomainObject
,
809 &InfoBuffer
->Oem
.OemInformation
);
810 if (!NT_SUCCESS(Status
))
812 TRACE("Status 0x%08lx\n", Status
);
816 *Buffer
= InfoBuffer
;
819 if (!NT_SUCCESS(Status
))
821 if (InfoBuffer
!= NULL
)
823 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
824 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
826 midl_user_free(InfoBuffer
);
835 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
836 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
838 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
843 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
844 if (InfoBuffer
== NULL
)
845 return STATUS_INSUFFICIENT_RESOURCES
;
847 /* Get the Name string */
848 Status
= SampGetObjectAttributeString(DomainObject
,
850 &InfoBuffer
->Name
.DomainName
);
851 if (!NT_SUCCESS(Status
))
853 TRACE("Status 0x%08lx\n", Status
);
857 *Buffer
= InfoBuffer
;
860 if (!NT_SUCCESS(Status
))
862 if (InfoBuffer
!= NULL
)
864 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
865 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
867 midl_user_free(InfoBuffer
);
876 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
877 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
879 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
884 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
885 if (InfoBuffer
== NULL
)
886 return STATUS_INSUFFICIENT_RESOURCES
;
888 /* Get the ReplicaSourceNodeName string */
889 Status
= SampGetObjectAttributeString(DomainObject
,
890 L
"ReplicaSourceNodeName",
891 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
892 if (!NT_SUCCESS(Status
))
894 TRACE("Status 0x%08lx\n", Status
);
898 *Buffer
= InfoBuffer
;
901 if (!NT_SUCCESS(Status
))
903 if (InfoBuffer
!= NULL
)
905 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
906 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
908 midl_user_free(InfoBuffer
);
917 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
918 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
920 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
921 SAM_DOMAIN_FIXED_DATA FixedData
;
927 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
928 if (InfoBuffer
== NULL
)
929 return STATUS_INSUFFICIENT_RESOURCES
;
931 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
932 Status
= SampGetObjectAttribute(DomainObject
,
937 if (!NT_SUCCESS(Status
))
940 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
942 *Buffer
= InfoBuffer
;
945 if (!NT_SUCCESS(Status
))
947 if (InfoBuffer
!= NULL
)
949 midl_user_free(InfoBuffer
);
958 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
959 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
961 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
962 SAM_DOMAIN_FIXED_DATA FixedData
;
968 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
969 if (InfoBuffer
== NULL
)
970 return STATUS_INSUFFICIENT_RESOURCES
;
972 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
973 Status
= SampGetObjectAttribute(DomainObject
,
978 if (!NT_SUCCESS(Status
))
981 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
982 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
983 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
984 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
986 *Buffer
= InfoBuffer
;
989 if (!NT_SUCCESS(Status
))
991 if (InfoBuffer
!= NULL
)
993 midl_user_free(InfoBuffer
);
1002 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1003 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1005 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1006 SAM_DOMAIN_FIXED_DATA FixedData
;
1012 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1013 if (InfoBuffer
== NULL
)
1014 return STATUS_INSUFFICIENT_RESOURCES
;
1016 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1017 Status
= SampGetObjectAttribute(DomainObject
,
1022 if (!NT_SUCCESS(Status
))
1025 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1027 *Buffer
= InfoBuffer
;
1030 if (!NT_SUCCESS(Status
))
1032 if (InfoBuffer
!= NULL
)
1034 midl_user_free(InfoBuffer
);
1043 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1044 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1046 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1047 SAM_DOMAIN_FIXED_DATA FixedData
;
1053 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1054 if (InfoBuffer
== NULL
)
1055 return STATUS_INSUFFICIENT_RESOURCES
;
1057 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1058 Status
= SampGetObjectAttribute(DomainObject
,
1063 if (!NT_SUCCESS(Status
))
1066 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1067 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1068 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1069 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1070 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1071 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1072 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1074 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1075 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1076 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1078 /* Get the OemInformation string */
1079 Status
= SampGetObjectAttributeString(DomainObject
,
1081 &InfoBuffer
->General2
.I1
.OemInformation
);
1082 if (!NT_SUCCESS(Status
))
1084 TRACE("Status 0x%08lx\n", Status
);
1088 /* Get the Name string */
1089 Status
= SampGetObjectAttributeString(DomainObject
,
1091 &InfoBuffer
->General2
.I1
.DomainName
);
1092 if (!NT_SUCCESS(Status
))
1094 TRACE("Status 0x%08lx\n", Status
);
1098 /* Get the ReplicaSourceNodeName string */
1099 Status
= SampGetObjectAttributeString(DomainObject
,
1100 L
"ReplicaSourceNodeName",
1101 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1102 if (!NT_SUCCESS(Status
))
1104 TRACE("Status 0x%08lx\n", Status
);
1108 /* Get the number of Users in the Domain */
1109 Status
= SampGetNumberOfAccounts(DomainObject
,
1111 &InfoBuffer
->General2
.I1
.UserCount
);
1112 if (!NT_SUCCESS(Status
))
1114 TRACE("Status 0x%08lx\n", Status
);
1118 /* Get the number of Groups in the Domain */
1119 Status
= SampGetNumberOfAccounts(DomainObject
,
1121 &InfoBuffer
->General2
.I1
.GroupCount
);
1122 if (!NT_SUCCESS(Status
))
1124 TRACE("Status 0x%08lx\n", Status
);
1128 /* Get the number of Aliases in the Domain */
1129 Status
= SampGetNumberOfAccounts(DomainObject
,
1131 &InfoBuffer
->General2
.I1
.AliasCount
);
1132 if (!NT_SUCCESS(Status
))
1134 TRACE("Status 0x%08lx\n", Status
);
1138 *Buffer
= InfoBuffer
;
1141 if (!NT_SUCCESS(Status
))
1143 if (InfoBuffer
!= NULL
)
1145 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1146 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1148 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1149 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1151 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1152 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1154 midl_user_free(InfoBuffer
);
1163 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1164 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1166 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1167 SAM_DOMAIN_FIXED_DATA FixedData
;
1173 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1174 if (InfoBuffer
== NULL
)
1175 return STATUS_INSUFFICIENT_RESOURCES
;
1177 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1178 Status
= SampGetObjectAttribute(DomainObject
,
1183 if (!NT_SUCCESS(Status
))
1186 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1187 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1188 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1190 *Buffer
= InfoBuffer
;
1193 if (!NT_SUCCESS(Status
))
1195 if (InfoBuffer
!= NULL
)
1197 midl_user_free(InfoBuffer
);
1206 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1207 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1209 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1210 SAM_DOMAIN_FIXED_DATA FixedData
;
1216 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1217 if (InfoBuffer
== NULL
)
1218 return STATUS_INSUFFICIENT_RESOURCES
;
1220 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1221 Status
= SampGetObjectAttribute(DomainObject
,
1226 if (!NT_SUCCESS(Status
))
1229 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1230 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1231 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1232 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1233 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1234 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1236 *Buffer
= InfoBuffer
;
1239 if (!NT_SUCCESS(Status
))
1241 if (InfoBuffer
!= NULL
)
1243 midl_user_free(InfoBuffer
);
1254 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1255 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1256 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1258 PSAM_DB_OBJECT DomainObject
;
1259 ACCESS_MASK DesiredAccess
;
1262 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1263 DomainHandle
, DomainInformationClass
, Buffer
);
1265 switch (DomainInformationClass
)
1267 case DomainPasswordInformation
:
1268 case DomainLockoutInformation
:
1269 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1272 case DomainGeneralInformation
:
1273 case DomainLogoffInformation
:
1274 case DomainOemInformation
:
1275 case DomainNameInformation
:
1276 case DomainReplicationInformation
:
1277 case DomainServerRoleInformation
:
1278 case DomainModifiedInformation
:
1279 case DomainStateInformation
:
1280 case DomainModifiedInformation2
:
1281 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1284 case DomainGeneralInformation2
:
1285 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1286 DOMAIN_READ_OTHER_PARAMETERS
;
1290 return STATUS_INVALID_INFO_CLASS
;
1293 /* Validate the server handle */
1294 Status
= SampValidateDbObject(DomainHandle
,
1298 if (!NT_SUCCESS(Status
))
1301 switch (DomainInformationClass
)
1303 case DomainPasswordInformation
:
1304 Status
= SampQueryDomainPassword(DomainObject
,
1308 case DomainGeneralInformation
:
1309 Status
= SampQueryDomainGeneral(DomainObject
,
1313 case DomainLogoffInformation
:
1314 Status
= SampQueryDomainLogoff(DomainObject
,
1318 case DomainOemInformation
:
1319 Status
= SampQueryDomainOem(DomainObject
,
1323 case DomainNameInformation
:
1324 Status
= SampQueryDomainName(DomainObject
,
1328 case DomainReplicationInformation
:
1329 Status
= SampQueryDomainReplication(DomainObject
,
1333 case DomainServerRoleInformation
:
1334 Status
= SampQueryDomainServerRole(DomainObject
,
1338 case DomainModifiedInformation
:
1339 Status
= SampQueryDomainModified(DomainObject
,
1343 case DomainStateInformation
:
1344 Status
= SampQueryDomainState(DomainObject
,
1348 case DomainGeneralInformation2
:
1349 Status
= SampQueryDomainGeneral2(DomainObject
,
1353 case DomainLockoutInformation
:
1354 Status
= SampQueryDomainLockout(DomainObject
,
1358 case DomainModifiedInformation2
:
1359 Status
= SampQueryDomainModified2(DomainObject
,
1364 Status
= STATUS_NOT_IMPLEMENTED
;
1372 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1373 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1375 SAM_DOMAIN_FIXED_DATA FixedData
;
1379 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1380 Status
= SampGetObjectAttribute(DomainObject
,
1385 if (!NT_SUCCESS(Status
))
1388 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1389 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1390 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1391 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1392 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1393 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1394 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1396 Status
= SampSetObjectAttribute(DomainObject
,
1408 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1409 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1411 SAM_DOMAIN_FIXED_DATA FixedData
;
1415 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1416 Status
= SampGetObjectAttribute(DomainObject
,
1421 if (!NT_SUCCESS(Status
))
1424 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1425 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1427 Status
= SampSetObjectAttribute(DomainObject
,
1439 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1440 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1442 SAM_DOMAIN_FIXED_DATA FixedData
;
1446 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1447 Status
= SampGetObjectAttribute(DomainObject
,
1452 if (!NT_SUCCESS(Status
))
1455 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1457 Status
= SampSetObjectAttribute(DomainObject
,
1469 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1470 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1472 SAM_DOMAIN_FIXED_DATA FixedData
;
1476 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1477 Status
= SampGetObjectAttribute(DomainObject
,
1482 if (!NT_SUCCESS(Status
))
1485 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1487 Status
= SampSetObjectAttribute(DomainObject
,
1499 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1500 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1502 SAM_DOMAIN_FIXED_DATA FixedData
;
1506 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1507 Status
= SampGetObjectAttribute(DomainObject
,
1512 if (!NT_SUCCESS(Status
))
1515 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1516 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1517 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1519 Status
= SampSetObjectAttribute(DomainObject
,
1533 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1534 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1535 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1537 PSAM_DB_OBJECT DomainObject
;
1538 ACCESS_MASK DesiredAccess
;
1541 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1542 DomainHandle
, DomainInformationClass
, DomainInformation
);
1544 switch (DomainInformationClass
)
1546 case DomainPasswordInformation
:
1547 case DomainLockoutInformation
:
1548 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1551 case DomainLogoffInformation
:
1552 case DomainOemInformation
:
1553 case DomainNameInformation
:
1554 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1557 case DomainReplicationInformation
:
1558 case DomainServerRoleInformation
:
1559 case DomainStateInformation
:
1560 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1564 return STATUS_INVALID_INFO_CLASS
;
1567 /* Validate the server handle */
1568 Status
= SampValidateDbObject(DomainHandle
,
1572 if (!NT_SUCCESS(Status
))
1575 switch (DomainInformationClass
)
1577 case DomainPasswordInformation
:
1578 Status
= SampSetDomainPassword(DomainObject
,
1582 case DomainLogoffInformation
:
1583 Status
= SampSetDomainLogoff(DomainObject
,
1587 case DomainOemInformation
:
1588 Status
= SampSetObjectAttribute(DomainObject
,
1591 DomainInformation
->Oem
.OemInformation
.Buffer
,
1592 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1595 case DomainNameInformation
:
1596 Status
= SampSetObjectAttribute(DomainObject
,
1599 DomainInformation
->Name
.DomainName
.Buffer
,
1600 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1603 case DomainReplicationInformation
:
1604 Status
= SampSetObjectAttribute(DomainObject
,
1605 L
"ReplicaSourceNodeName",
1607 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1608 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1611 case DomainServerRoleInformation
:
1612 Status
= SampSetDomainServerRole(DomainObject
,
1616 case DomainStateInformation
:
1617 Status
= SampSetDomainState(DomainObject
,
1621 case DomainLockoutInformation
:
1622 Status
= SampSetDomainLockout(DomainObject
,
1627 Status
= STATUS_NOT_IMPLEMENTED
;
1637 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1638 IN PRPC_UNICODE_STRING Name
,
1639 IN ACCESS_MASK DesiredAccess
,
1640 OUT SAMPR_HANDLE
*GroupHandle
,
1641 OUT
unsigned long *RelativeId
)
1643 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1644 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1645 SAM_GROUP_FIXED_DATA FixedGroupData
;
1646 PSAM_DB_OBJECT DomainObject
;
1647 PSAM_DB_OBJECT GroupObject
;
1653 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1654 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1656 /* Validate the domain handle */
1657 Status
= SampValidateDbObject(DomainHandle
,
1659 DOMAIN_CREATE_GROUP
,
1661 if (!NT_SUCCESS(Status
))
1663 TRACE("failed with status 0x%08lx\n", Status
);
1667 /* Check if the group name already exists in the domain */
1668 Status
= SampCheckAccountNameInDomain(DomainObject
,
1670 if (!NT_SUCCESS(Status
))
1672 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1673 Name
->Buffer
, Status
);
1677 /* Get the fixed domain attributes */
1678 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1679 Status
= SampGetObjectAttribute(DomainObject
,
1682 (PVOID
)&FixedDomainData
,
1684 if (!NT_SUCCESS(Status
))
1686 TRACE("failed with status 0x%08lx\n", Status
);
1690 /* Increment the NextRid attribute */
1691 ulRid
= FixedDomainData
.NextRid
;
1692 FixedDomainData
.NextRid
++;
1694 /* Store the fixed domain attributes */
1695 Status
= SampSetObjectAttribute(DomainObject
,
1700 if (!NT_SUCCESS(Status
))
1702 TRACE("failed with status 0x%08lx\n", Status
);
1706 TRACE("RID: %lx\n", ulRid
);
1708 /* Convert the RID into a string (hex) */
1709 swprintf(szRid
, L
"%08lX", ulRid
);
1711 /* Create the group object */
1712 Status
= SampCreateDbObject(DomainObject
,
1719 if (!NT_SUCCESS(Status
))
1721 TRACE("failed with status 0x%08lx\n", Status
);
1725 /* Add the account name of the user object */
1726 Status
= SampSetAccountNameInDomain(DomainObject
,
1730 if (!NT_SUCCESS(Status
))
1732 TRACE("failed with status 0x%08lx\n", Status
);
1736 /* Initialize fixed user data */
1737 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1738 FixedGroupData
.Version
= 1;
1740 FixedGroupData
.GroupId
= ulRid
;
1742 /* Set fixed user data attribute */
1743 Status
= SampSetObjectAttribute(GroupObject
,
1746 (LPVOID
)&FixedGroupData
,
1747 sizeof(SAM_GROUP_FIXED_DATA
));
1748 if (!NT_SUCCESS(Status
))
1750 TRACE("failed with status 0x%08lx\n", Status
);
1754 /* Set the Name attribute */
1755 Status
= SampSetObjectAttribute(GroupObject
,
1758 (LPVOID
)Name
->Buffer
,
1759 Name
->MaximumLength
);
1760 if (!NT_SUCCESS(Status
))
1762 TRACE("failed with status 0x%08lx\n", Status
);
1766 /* Set the AdminComment attribute */
1767 Status
= SampSetObjectAttribute(GroupObject
,
1771 EmptyString
.MaximumLength
);
1772 if (!NT_SUCCESS(Status
))
1774 TRACE("failed with status 0x%08lx\n", Status
);
1778 if (NT_SUCCESS(Status
))
1780 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1781 *RelativeId
= ulRid
;
1784 TRACE("returns with status 0x%08lx\n", Status
);
1793 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1794 IN OUT
unsigned long *EnumerationContext
,
1795 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1796 IN
unsigned long PreferedMaximumLength
,
1797 OUT
unsigned long *CountReturned
)
1799 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1800 PSAM_DB_OBJECT DomainObject
;
1801 HANDLE GroupsKeyHandle
= NULL
;
1802 HANDLE NamesKeyHandle
= NULL
;
1803 WCHAR GroupName
[64];
1805 ULONG EnumCount
= 0;
1806 ULONG RequiredLength
= 0;
1811 BOOLEAN MoreEntries
= FALSE
;
1814 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1815 DomainHandle
, EnumerationContext
, Buffer
,
1816 PreferedMaximumLength
, CountReturned
);
1818 /* Validate the domain handle */
1819 Status
= SampValidateDbObject(DomainHandle
,
1821 DOMAIN_LIST_ACCOUNTS
,
1823 if (!NT_SUCCESS(Status
))
1826 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1830 if (!NT_SUCCESS(Status
))
1833 Status
= SampRegOpenKey(GroupsKeyHandle
,
1837 if (!NT_SUCCESS(Status
))
1842 EnumIndex
= *EnumerationContext
;
1846 NameLength
= 64 * sizeof(WCHAR
);
1847 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1854 if (!NT_SUCCESS(Status
))
1856 if (Status
== STATUS_NO_MORE_ENTRIES
)
1857 Status
= STATUS_SUCCESS
;
1861 TRACE("EnumIndex: %lu\n", EnumIndex
);
1862 TRACE("Group name: %S\n", GroupName
);
1863 TRACE("Name length: %lu\n", NameLength
);
1865 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
1871 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
1877 TRACE("EnumCount: %lu\n", EnumCount
);
1878 TRACE("RequiredLength: %lu\n", RequiredLength
);
1880 if (!NT_SUCCESS(Status
))
1883 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
1884 if (EnumBuffer
== NULL
)
1886 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1890 EnumBuffer
->EntriesRead
= EnumCount
;
1894 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
1895 if (EnumBuffer
->Buffer
== NULL
)
1897 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1903 EnumIndex
= *EnumerationContext
;
1904 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
1906 NameLength
= 64 * sizeof(WCHAR
);
1907 DataLength
= sizeof(ULONG
);
1908 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1915 if (!NT_SUCCESS(Status
))
1917 if (Status
== STATUS_NO_MORE_ENTRIES
)
1918 Status
= STATUS_SUCCESS
;
1922 TRACE("EnumIndex: %lu\n", EnumIndex
);
1923 TRACE("Group name: %S\n", GroupName
);
1924 TRACE("Name length: %lu\n", NameLength
);
1925 TRACE("RID: %lu\n", Rid
);
1927 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
1929 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
1930 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
1932 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
1934 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
1935 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
1937 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1941 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
1943 EnumBuffer
->Buffer
[i
].Name
.Length
);
1948 if (NT_SUCCESS(Status
))
1950 *EnumerationContext
+= EnumCount
;
1951 *Buffer
= EnumBuffer
;
1952 *CountReturned
= EnumCount
;
1956 *EnumerationContext
= 0;
1960 if (EnumBuffer
!= NULL
)
1962 if (EnumBuffer
->Buffer
!= NULL
)
1964 if (EnumBuffer
->EntriesRead
!= 0)
1966 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
1968 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
1969 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
1973 midl_user_free(EnumBuffer
->Buffer
);
1976 midl_user_free(EnumBuffer
);
1980 if (NamesKeyHandle
!= NULL
)
1981 SampRegCloseKey(NamesKeyHandle
);
1983 if (GroupsKeyHandle
!= NULL
)
1984 SampRegCloseKey(GroupsKeyHandle
);
1986 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
1987 Status
= STATUS_MORE_ENTRIES
;
1996 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
1997 IN PRPC_UNICODE_STRING Name
,
1998 IN ACCESS_MASK DesiredAccess
,
1999 OUT SAMPR_HANDLE
*UserHandle
,
2000 OUT
unsigned long *RelativeId
)
2002 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2003 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2004 SAM_USER_FIXED_DATA FixedUserData
;
2005 PSAM_DB_OBJECT DomainObject
;
2006 PSAM_DB_OBJECT UserObject
;
2012 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2013 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2016 Name
->Length
== 0 ||
2017 Name
->Buffer
== NULL
||
2018 UserHandle
== NULL
||
2020 return STATUS_INVALID_PARAMETER
;
2022 /* Validate the domain handle */
2023 Status
= SampValidateDbObject(DomainHandle
,
2027 if (!NT_SUCCESS(Status
))
2029 TRACE("failed with status 0x%08lx\n", Status
);
2033 /* Check if the user name already exists in the domain */
2034 Status
= SampCheckAccountNameInDomain(DomainObject
,
2036 if (!NT_SUCCESS(Status
))
2038 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2039 Name
->Buffer
, Status
);
2043 /* Get the fixed domain attributes */
2044 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2045 Status
= SampGetObjectAttribute(DomainObject
,
2048 (PVOID
)&FixedDomainData
,
2050 if (!NT_SUCCESS(Status
))
2052 TRACE("failed with status 0x%08lx\n", Status
);
2056 /* Increment the NextRid attribute */
2057 ulRid
= FixedDomainData
.NextRid
;
2058 FixedDomainData
.NextRid
++;
2060 /* Store the fixed domain attributes */
2061 Status
= SampSetObjectAttribute(DomainObject
,
2066 if (!NT_SUCCESS(Status
))
2068 TRACE("failed with status 0x%08lx\n", Status
);
2072 TRACE("RID: %lx\n", ulRid
);
2074 /* Convert the RID into a string (hex) */
2075 swprintf(szRid
, L
"%08lX", ulRid
);
2077 /* Create the user object */
2078 Status
= SampCreateDbObject(DomainObject
,
2085 if (!NT_SUCCESS(Status
))
2087 TRACE("failed with status 0x%08lx\n", Status
);
2091 /* Add the account name for the user object */
2092 Status
= SampSetAccountNameInDomain(DomainObject
,
2096 if (!NT_SUCCESS(Status
))
2098 TRACE("failed with status 0x%08lx\n", Status
);
2102 /* Initialize fixed user data */
2103 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2104 FixedUserData
.Version
= 1;
2105 FixedUserData
.LastLogon
.QuadPart
= 0;
2106 FixedUserData
.LastLogoff
.QuadPart
= 0;
2107 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2108 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2109 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2110 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2111 FixedUserData
.UserId
= ulRid
;
2112 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2113 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2114 USER_PASSWORD_NOT_REQUIRED
|
2115 USER_NORMAL_ACCOUNT
;
2117 /* Set fixed user data attribute */
2118 Status
= SampSetObjectAttribute(UserObject
,
2121 (LPVOID
)&FixedUserData
,
2122 sizeof(SAM_USER_FIXED_DATA
));
2123 if (!NT_SUCCESS(Status
))
2125 TRACE("failed with status 0x%08lx\n", Status
);
2129 /* Set the Name attribute */
2130 Status
= SampSetObjectAttribute(UserObject
,
2133 (LPVOID
)Name
->Buffer
,
2134 Name
->MaximumLength
);
2135 if (!NT_SUCCESS(Status
))
2137 TRACE("failed with status 0x%08lx\n", Status
);
2141 /* Set the FullName attribute */
2142 Status
= SampSetObjectAttribute(UserObject
,
2146 EmptyString
.MaximumLength
);
2147 if (!NT_SUCCESS(Status
))
2149 TRACE("failed with status 0x%08lx\n", Status
);
2153 /* Set the HomeDirectory attribute */
2154 Status
= SampSetObjectAttribute(UserObject
,
2158 EmptyString
.MaximumLength
);
2159 if (!NT_SUCCESS(Status
))
2161 TRACE("failed with status 0x%08lx\n", Status
);
2165 /* Set the HomeDirectoryDrive attribute */
2166 Status
= SampSetObjectAttribute(UserObject
,
2167 L
"HomeDirectoryDrive",
2170 EmptyString
.MaximumLength
);
2171 if (!NT_SUCCESS(Status
))
2173 TRACE("failed with status 0x%08lx\n", Status
);
2177 /* Set the ScriptPath attribute */
2178 Status
= SampSetObjectAttribute(UserObject
,
2182 EmptyString
.MaximumLength
);
2183 if (!NT_SUCCESS(Status
))
2185 TRACE("failed with status 0x%08lx\n", Status
);
2189 /* Set the ProfilePath attribute */
2190 Status
= SampSetObjectAttribute(UserObject
,
2194 EmptyString
.MaximumLength
);
2195 if (!NT_SUCCESS(Status
))
2197 TRACE("failed with status 0x%08lx\n", Status
);
2201 /* Set the AdminComment attribute */
2202 Status
= SampSetObjectAttribute(UserObject
,
2206 EmptyString
.MaximumLength
);
2207 if (!NT_SUCCESS(Status
))
2209 TRACE("failed with status 0x%08lx\n", Status
);
2213 /* Set the UserComment attribute */
2214 Status
= SampSetObjectAttribute(UserObject
,
2218 EmptyString
.MaximumLength
);
2219 if (!NT_SUCCESS(Status
))
2221 TRACE("failed with status 0x%08lx\n", Status
);
2225 /* Set the WorkStations attribute */
2226 Status
= SampSetObjectAttribute(UserObject
,
2230 EmptyString
.MaximumLength
);
2231 if (!NT_SUCCESS(Status
))
2233 TRACE("failed with status 0x%08lx\n", Status
);
2237 /* FIXME: Set default user attributes */
2239 if (NT_SUCCESS(Status
))
2241 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2242 *RelativeId
= ulRid
;
2245 TRACE("returns with status 0x%08lx\n", Status
);
2254 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2255 IN OUT
unsigned long *EnumerationContext
,
2256 IN
unsigned long UserAccountControl
,
2257 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2258 IN
unsigned long PreferedMaximumLength
,
2259 OUT
unsigned long *CountReturned
)
2261 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2262 PSAM_DB_OBJECT DomainObject
;
2263 HANDLE UsersKeyHandle
= NULL
;
2264 HANDLE NamesKeyHandle
= NULL
;
2267 ULONG EnumCount
= 0;
2268 ULONG RequiredLength
= 0;
2273 BOOLEAN MoreEntries
= FALSE
;
2276 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2277 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2278 PreferedMaximumLength
, CountReturned
);
2280 /* Validate the domain handle */
2281 Status
= SampValidateDbObject(DomainHandle
,
2283 DOMAIN_LIST_ACCOUNTS
,
2285 if (!NT_SUCCESS(Status
))
2288 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2292 if (!NT_SUCCESS(Status
))
2295 Status
= SampRegOpenKey(UsersKeyHandle
,
2299 if (!NT_SUCCESS(Status
))
2304 EnumIndex
= *EnumerationContext
;
2308 NameLength
= 64 * sizeof(WCHAR
);
2309 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2316 if (!NT_SUCCESS(Status
))
2318 if (Status
== STATUS_NO_MORE_ENTRIES
)
2319 Status
= STATUS_SUCCESS
;
2323 TRACE("EnumIndex: %lu\n", EnumIndex
);
2324 TRACE("User name: %S\n", UserName
);
2325 TRACE("Name length: %lu\n", NameLength
);
2327 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2333 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2339 TRACE("EnumCount: %lu\n", EnumCount
);
2340 TRACE("RequiredLength: %lu\n", RequiredLength
);
2342 if (!NT_SUCCESS(Status
))
2345 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2346 if (EnumBuffer
== NULL
)
2348 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2352 EnumBuffer
->EntriesRead
= EnumCount
;
2356 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2357 if (EnumBuffer
->Buffer
== NULL
)
2359 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2365 EnumIndex
= *EnumerationContext
;
2366 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2368 NameLength
= 64 * sizeof(WCHAR
);
2369 DataLength
= sizeof(ULONG
);
2370 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2377 if (!NT_SUCCESS(Status
))
2379 if (Status
== STATUS_NO_MORE_ENTRIES
)
2380 Status
= STATUS_SUCCESS
;
2384 TRACE("EnumIndex: %lu\n", EnumIndex
);
2385 TRACE("User name: %S\n", UserName
);
2386 TRACE("Name length: %lu\n", NameLength
);
2387 TRACE("RID: %lu\n", Rid
);
2389 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2391 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2392 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2394 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2396 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2397 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2399 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2403 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2405 EnumBuffer
->Buffer
[i
].Name
.Length
);
2410 if (NT_SUCCESS(Status
))
2412 *EnumerationContext
+= EnumCount
;
2413 *Buffer
= EnumBuffer
;
2414 *CountReturned
= EnumCount
;
2418 *EnumerationContext
= 0;
2422 if (EnumBuffer
!= NULL
)
2424 if (EnumBuffer
->Buffer
!= NULL
)
2426 if (EnumBuffer
->EntriesRead
!= 0)
2428 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2430 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2431 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2435 midl_user_free(EnumBuffer
->Buffer
);
2438 midl_user_free(EnumBuffer
);
2442 if (NamesKeyHandle
!= NULL
)
2443 SampRegCloseKey(NamesKeyHandle
);
2445 if (UsersKeyHandle
!= NULL
)
2446 SampRegCloseKey(UsersKeyHandle
);
2448 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2449 Status
= STATUS_MORE_ENTRIES
;
2458 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2459 IN PRPC_UNICODE_STRING AccountName
,
2460 IN ACCESS_MASK DesiredAccess
,
2461 OUT SAMPR_HANDLE
*AliasHandle
,
2462 OUT
unsigned long *RelativeId
)
2464 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2465 PSAM_DB_OBJECT DomainObject
;
2466 PSAM_DB_OBJECT AliasObject
;
2467 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2473 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2474 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2476 /* Validate the domain handle */
2477 Status
= SampValidateDbObject(DomainHandle
,
2479 DOMAIN_CREATE_ALIAS
,
2481 if (!NT_SUCCESS(Status
))
2483 TRACE("failed with status 0x%08lx\n", Status
);
2487 /* Check if the alias name already exists in the domain */
2488 Status
= SampCheckAccountNameInDomain(DomainObject
,
2489 AccountName
->Buffer
);
2490 if (!NT_SUCCESS(Status
))
2492 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2493 AccountName
->Buffer
, Status
);
2497 /* Get the fixed domain attributes */
2498 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2499 Status
= SampGetObjectAttribute(DomainObject
,
2502 (PVOID
)&FixedDomainData
,
2504 if (!NT_SUCCESS(Status
))
2506 TRACE("failed with status 0x%08lx\n", Status
);
2510 /* Increment the NextRid attribute */
2511 ulRid
= FixedDomainData
.NextRid
;
2512 FixedDomainData
.NextRid
++;
2514 /* Store the fixed domain attributes */
2515 Status
= SampSetObjectAttribute(DomainObject
,
2520 if (!NT_SUCCESS(Status
))
2522 TRACE("failed with status 0x%08lx\n", Status
);
2526 TRACE("RID: %lx\n", ulRid
);
2528 /* Convert the RID into a string (hex) */
2529 swprintf(szRid
, L
"%08lX", ulRid
);
2531 /* Create the alias object */
2532 Status
= SampCreateDbObject(DomainObject
,
2539 if (!NT_SUCCESS(Status
))
2541 TRACE("failed with status 0x%08lx\n", Status
);
2545 /* Add the account name for the alias object */
2546 Status
= SampSetAccountNameInDomain(DomainObject
,
2548 AccountName
->Buffer
,
2550 if (!NT_SUCCESS(Status
))
2552 TRACE("failed with status 0x%08lx\n", Status
);
2556 /* Set the Name attribute */
2557 Status
= SampSetObjectAttribute(AliasObject
,
2560 (LPVOID
)AccountName
->Buffer
,
2561 AccountName
->MaximumLength
);
2562 if (!NT_SUCCESS(Status
))
2564 TRACE("failed with status 0x%08lx\n", Status
);
2568 /* Set the Description attribute */
2569 Status
= SampSetObjectAttribute(AliasObject
,
2573 EmptyString
.MaximumLength
);
2574 if (!NT_SUCCESS(Status
))
2576 TRACE("failed with status 0x%08lx\n", Status
);
2580 if (NT_SUCCESS(Status
))
2582 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2583 *RelativeId
= ulRid
;
2586 TRACE("returns with status 0x%08lx\n", Status
);
2595 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2596 IN OUT
unsigned long *EnumerationContext
,
2597 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2598 IN
unsigned long PreferedMaximumLength
,
2599 OUT
unsigned long *CountReturned
)
2601 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2602 PSAM_DB_OBJECT DomainObject
;
2603 HANDLE AliasesKeyHandle
= NULL
;
2604 HANDLE NamesKeyHandle
= NULL
;
2605 WCHAR AliasName
[64];
2607 ULONG EnumCount
= 0;
2608 ULONG RequiredLength
= 0;
2613 BOOLEAN MoreEntries
= FALSE
;
2616 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2617 DomainHandle
, EnumerationContext
, Buffer
,
2618 PreferedMaximumLength
, CountReturned
);
2620 /* Validate the domain handle */
2621 Status
= SampValidateDbObject(DomainHandle
,
2623 DOMAIN_LIST_ACCOUNTS
,
2625 if (!NT_SUCCESS(Status
))
2628 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2632 if (!NT_SUCCESS(Status
))
2635 Status
= SampRegOpenKey(AliasesKeyHandle
,
2639 if (!NT_SUCCESS(Status
))
2644 EnumIndex
= *EnumerationContext
;
2648 NameLength
= 64 * sizeof(WCHAR
);
2649 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2656 if (!NT_SUCCESS(Status
))
2658 if (Status
== STATUS_NO_MORE_ENTRIES
)
2659 Status
= STATUS_SUCCESS
;
2663 TRACE("EnumIndex: %lu\n", EnumIndex
);
2664 TRACE("Alias name: %S\n", AliasName
);
2665 TRACE("Name length: %lu\n", NameLength
);
2667 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2673 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2679 TRACE("EnumCount: %lu\n", EnumCount
);
2680 TRACE("RequiredLength: %lu\n", RequiredLength
);
2682 if (!NT_SUCCESS(Status
))
2685 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2686 if (EnumBuffer
== NULL
)
2688 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2692 EnumBuffer
->EntriesRead
= EnumCount
;
2696 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2697 if (EnumBuffer
->Buffer
== NULL
)
2699 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2705 EnumIndex
= *EnumerationContext
;
2706 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2708 NameLength
= 64 * sizeof(WCHAR
);
2709 DataLength
= sizeof(ULONG
);
2710 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2717 if (!NT_SUCCESS(Status
))
2719 if (Status
== STATUS_NO_MORE_ENTRIES
)
2720 Status
= STATUS_SUCCESS
;
2724 TRACE("EnumIndex: %lu\n", EnumIndex
);
2725 TRACE("Alias name: %S\n", AliasName
);
2726 TRACE("Name length: %lu\n", NameLength
);
2727 TRACE("RID: %lu\n", Rid
);
2729 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2731 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2732 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2734 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2736 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2737 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2739 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2743 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2745 EnumBuffer
->Buffer
[i
].Name
.Length
);
2750 if (NT_SUCCESS(Status
))
2752 *EnumerationContext
+= EnumCount
;
2753 *Buffer
= EnumBuffer
;
2754 *CountReturned
= EnumCount
;
2758 *EnumerationContext
= 0;
2762 if (EnumBuffer
!= NULL
)
2764 if (EnumBuffer
->Buffer
!= NULL
)
2766 if (EnumBuffer
->EntriesRead
!= 0)
2768 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2770 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2771 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2775 midl_user_free(EnumBuffer
->Buffer
);
2778 midl_user_free(EnumBuffer
);
2782 if (NamesKeyHandle
!= NULL
)
2783 SampRegCloseKey(NamesKeyHandle
);
2785 if (AliasesKeyHandle
!= NULL
)
2786 SampRegCloseKey(AliasesKeyHandle
);
2788 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2789 Status
= STATUS_MORE_ENTRIES
;
2798 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2799 IN PSAMPR_PSID_ARRAY SidArray
,
2800 OUT PSAMPR_ULONG_ARRAY Membership
)
2802 PSAM_DB_OBJECT DomainObject
;
2803 HANDLE AliasesKeyHandle
= NULL
;
2804 HANDLE MembersKeyHandle
= NULL
;
2805 HANDLE MemberKeyHandle
= NULL
;
2806 LPWSTR MemberSidString
= NULL
;
2807 PULONG RidArray
= NULL
;
2808 ULONG MaxSidCount
= 0;
2814 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2815 DomainHandle
, SidArray
, Membership
);
2817 /* Validate the domain handle */
2818 Status
= SampValidateDbObject(DomainHandle
,
2822 if (!NT_SUCCESS(Status
))
2825 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2829 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2830 if (!NT_SUCCESS(Status
))
2833 Status
= SampRegOpenKey(AliasesKeyHandle
,
2837 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2838 if (!NT_SUCCESS(Status
))
2841 for (i
= 0; i
< SidArray
->Count
; i
++)
2843 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2844 TRACE("Open %S\n", MemberSidString
);
2846 Status
= SampRegOpenKey(MembersKeyHandle
,
2850 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2851 if (NT_SUCCESS(Status
))
2853 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2856 if (NT_SUCCESS(Status
))
2858 TRACE("Found %lu values\n", ValueCount
);
2859 MaxSidCount
+= ValueCount
;
2863 NtClose(MemberKeyHandle
);
2866 LocalFree(MemberSidString
);
2869 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
2870 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
2871 if (RidArray
== NULL
)
2873 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2877 for (i
= 0; i
< SidArray
->Count
; i
++)
2879 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2880 TRACE("Open %S\n", MemberSidString
);
2882 Status
= SampRegOpenKey(MembersKeyHandle
,
2886 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2887 if (NT_SUCCESS(Status
))
2889 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2892 if (NT_SUCCESS(Status
))
2894 TRACE("Found %lu values\n", ValueCount
);
2896 for (j
= 0; j
< ValueCount
; j
++)
2898 DataLength
= sizeof(ULONG
);
2899 Status
= SampRegEnumerateValue(MemberKeyHandle
,
2904 (PVOID
)&RidArray
[j
],
2909 NtClose(MemberKeyHandle
);
2912 LocalFree(MemberSidString
);
2917 if (NT_SUCCESS(Status
))
2919 Membership
->Count
= MaxSidCount
;
2920 Membership
->Element
= RidArray
;
2924 if (RidArray
!= NULL
)
2925 midl_user_free(RidArray
);
2928 if (MembersKeyHandle
!= NULL
)
2929 NtClose(MembersKeyHandle
);
2931 if (MembersKeyHandle
!= NULL
)
2932 NtClose(MembersKeyHandle
);
2934 if (AliasesKeyHandle
!= NULL
)
2935 NtClose(AliasesKeyHandle
);
2944 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
2946 IN RPC_UNICODE_STRING Names
[],
2947 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
2948 OUT PSAMPR_ULONG_ARRAY Use
)
2950 PSAM_DB_OBJECT DomainObject
;
2951 HANDLE AccountsKeyHandle
;
2952 HANDLE NamesKeyHandle
;
2953 ULONG MappedCount
= 0;
2959 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
2960 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
2962 /* Validate the domain handle */
2963 Status
= SampValidateDbObject(DomainHandle
,
2967 if (!NT_SUCCESS(Status
))
2969 TRACE("failed with status 0x%08lx\n", Status
);
2973 RelativeIds
->Count
= 0;
2977 return STATUS_SUCCESS
;
2979 /* Allocate the relative IDs array */
2980 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
2981 if (RelativeIds
->Element
== NULL
)
2983 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2987 /* Allocate the use array */
2988 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
2989 if (Use
->Element
== NULL
)
2991 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2995 RelativeIds
->Count
= Count
;
2998 for (i
= 0; i
< Count
; i
++)
3000 TRACE("Name: %S\n", Names
[i
].Buffer
);
3004 /* Lookup aliases */
3005 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3008 &AccountsKeyHandle
);
3009 if (NT_SUCCESS(Status
))
3011 Status
= SampRegOpenKey(AccountsKeyHandle
,
3015 if (NT_SUCCESS(Status
))
3017 DataLength
= sizeof(ULONG
);
3018 Status
= SampRegQueryValue(NamesKeyHandle
,
3024 SampRegCloseKey(NamesKeyHandle
);
3027 SampRegCloseKey(AccountsKeyHandle
);
3030 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3033 /* Return alias account */
3034 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3036 TRACE("Rid: %lu\n", RelativeId
);
3037 RelativeIds
->Element
[i
] = RelativeId
;
3038 Use
->Element
[i
] = SidTypeAlias
;
3044 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3047 &AccountsKeyHandle
);
3048 if (NT_SUCCESS(Status
))
3050 Status
= SampRegOpenKey(AccountsKeyHandle
,
3054 if (NT_SUCCESS(Status
))
3056 DataLength
= sizeof(ULONG
);
3057 Status
= SampRegQueryValue(NamesKeyHandle
,
3063 SampRegCloseKey(NamesKeyHandle
);
3066 SampRegCloseKey(AccountsKeyHandle
);
3069 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3072 /* Return group account */
3073 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3075 TRACE("Rid: %lu\n", RelativeId
);
3076 RelativeIds
->Element
[i
] = RelativeId
;
3077 Use
->Element
[i
] = SidTypeGroup
;
3083 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3086 &AccountsKeyHandle
);
3087 if (NT_SUCCESS(Status
))
3089 Status
= SampRegOpenKey(AccountsKeyHandle
,
3093 if (NT_SUCCESS(Status
))
3095 DataLength
= sizeof(ULONG
);
3096 Status
= SampRegQueryValue(NamesKeyHandle
,
3102 SampRegCloseKey(NamesKeyHandle
);
3105 SampRegCloseKey(AccountsKeyHandle
);
3108 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3111 /* Return user account */
3112 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3114 TRACE("Rid: %lu\n", RelativeId
);
3115 RelativeIds
->Element
[i
] = RelativeId
;
3116 Use
->Element
[i
] = SidTypeUser
;
3121 /* Return unknown account */
3122 RelativeIds
->Element
[i
] = 0;
3123 Use
->Element
[i
] = SidTypeUnknown
;
3127 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3128 Status
= STATUS_SUCCESS
;
3130 if (NT_SUCCESS(Status
))
3132 if (MappedCount
== 0)
3133 Status
= STATUS_NONE_MAPPED
;
3134 else if (MappedCount
< Count
)
3135 Status
= STATUS_SOME_NOT_MAPPED
;
3139 if (RelativeIds
->Element
!= NULL
)
3141 midl_user_free(RelativeIds
->Element
);
3142 RelativeIds
->Element
= NULL
;
3145 RelativeIds
->Count
= 0;
3147 if (Use
->Element
!= NULL
)
3149 midl_user_free(Use
->Element
);
3150 Use
->Element
= NULL
;
3156 TRACE("Returned Status %lx\n", Status
);
3165 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3167 IN ULONG
*RelativeIds
,
3168 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3169 OUT PSAMPR_ULONG_ARRAY Use
)
3171 PSAM_DB_OBJECT DomainObject
;
3173 HANDLE AccountsKeyHandle
;
3174 HANDLE AccountKeyHandle
;
3175 ULONG MappedCount
= 0;
3180 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3181 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3183 /* Validate the domain handle */
3184 Status
= SampValidateDbObject(DomainHandle
,
3188 if (!NT_SUCCESS(Status
))
3190 TRACE("failed with status 0x%08lx\n", Status
);
3198 return STATUS_SUCCESS
;
3200 /* Allocate the names array */
3201 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3202 if (Names
->Element
== NULL
)
3204 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3208 /* Allocate the use array */
3209 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3210 if (Use
->Element
== NULL
)
3212 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3216 Names
->Count
= Count
;
3219 for (i
= 0; i
< Count
; i
++)
3221 TRACE("RID: %lu\n", RelativeIds
[i
]);
3223 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3225 /* Lookup aliases */
3226 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3229 &AccountsKeyHandle
);
3230 if (NT_SUCCESS(Status
))
3232 Status
= SampRegOpenKey(AccountsKeyHandle
,
3236 if (NT_SUCCESS(Status
))
3239 Status
= SampRegQueryValue(AccountKeyHandle
,
3244 if (NT_SUCCESS(Status
))
3246 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3247 if (Names
->Element
[i
].Buffer
== NULL
)
3248 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3250 if (NT_SUCCESS(Status
))
3252 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3253 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3255 Status
= SampRegQueryValue(AccountKeyHandle
,
3258 Names
->Element
[i
].Buffer
,
3263 SampRegCloseKey(AccountKeyHandle
);
3266 SampRegCloseKey(AccountsKeyHandle
);
3269 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3272 /* Return alias account */
3273 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3275 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3276 Use
->Element
[i
] = SidTypeAlias
;
3282 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3285 &AccountsKeyHandle
);
3286 if (NT_SUCCESS(Status
))
3288 Status
= SampRegOpenKey(AccountsKeyHandle
,
3292 if (NT_SUCCESS(Status
))
3295 Status
= SampRegQueryValue(AccountKeyHandle
,
3300 if (NT_SUCCESS(Status
))
3302 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3303 if (Names
->Element
[i
].Buffer
== NULL
)
3304 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3306 if (NT_SUCCESS(Status
))
3308 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3309 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3311 Status
= SampRegQueryValue(AccountKeyHandle
,
3314 Names
->Element
[i
].Buffer
,
3319 SampRegCloseKey(AccountKeyHandle
);
3322 SampRegCloseKey(AccountsKeyHandle
);
3325 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3328 /* Return group account */
3329 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3331 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3332 Use
->Element
[i
] = SidTypeGroup
;
3338 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3341 &AccountsKeyHandle
);
3342 if (NT_SUCCESS(Status
))
3344 Status
= SampRegOpenKey(AccountsKeyHandle
,
3348 if (NT_SUCCESS(Status
))
3351 Status
= SampRegQueryValue(AccountKeyHandle
,
3356 if (NT_SUCCESS(Status
))
3358 TRACE("DataLength: %lu\n", DataLength
);
3360 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3361 if (Names
->Element
[i
].Buffer
== NULL
)
3362 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3364 if (NT_SUCCESS(Status
))
3366 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3367 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3369 Status
= SampRegQueryValue(AccountKeyHandle
,
3372 Names
->Element
[i
].Buffer
,
3377 SampRegCloseKey(AccountKeyHandle
);
3380 SampRegCloseKey(AccountsKeyHandle
);
3383 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3386 /* Return user account */
3387 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3389 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3390 Use
->Element
[i
] = SidTypeUser
;
3395 /* Return unknown account */
3396 Use
->Element
[i
] = SidTypeUnknown
;
3400 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3401 Status
= STATUS_SUCCESS
;
3403 if (NT_SUCCESS(Status
))
3405 if (MappedCount
== 0)
3406 Status
= STATUS_NONE_MAPPED
;
3407 else if (MappedCount
< Count
)
3408 Status
= STATUS_SOME_NOT_MAPPED
;
3412 if (Names
->Element
!= NULL
)
3414 for (i
= 0; i
< Count
; i
++)
3416 if (Names
->Element
[i
].Buffer
!= NULL
)
3417 midl_user_free(Names
->Element
[i
].Buffer
);
3420 midl_user_free(Names
->Element
);
3421 Names
->Element
= NULL
;
3426 if (Use
->Element
!= NULL
)
3428 midl_user_free(Use
->Element
);
3429 Use
->Element
= NULL
;
3442 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3443 IN ACCESS_MASK DesiredAccess
,
3444 IN
unsigned long GroupId
,
3445 OUT SAMPR_HANDLE
*GroupHandle
)
3447 PSAM_DB_OBJECT DomainObject
;
3448 PSAM_DB_OBJECT GroupObject
;
3452 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3453 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3455 /* Validate the domain handle */
3456 Status
= SampValidateDbObject(DomainHandle
,
3460 if (!NT_SUCCESS(Status
))
3462 TRACE("failed with status 0x%08lx\n", Status
);
3466 /* Convert the RID into a string (hex) */
3467 swprintf(szRid
, L
"%08lX", GroupId
);
3469 /* Create the group object */
3470 Status
= SampOpenDbObject(DomainObject
,
3477 if (!NT_SUCCESS(Status
))
3479 TRACE("failed with status 0x%08lx\n", Status
);
3483 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3485 return STATUS_SUCCESS
;
3490 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3491 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3493 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3494 HANDLE MembersKeyHandle
= NULL
;
3495 SAM_GROUP_FIXED_DATA FixedData
;
3501 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3502 if (InfoBuffer
== NULL
)
3503 return STATUS_INSUFFICIENT_RESOURCES
;
3505 Status
= SampGetObjectAttributeString(GroupObject
,
3507 &InfoBuffer
->General
.Name
);
3508 if (!NT_SUCCESS(Status
))
3510 TRACE("Status 0x%08lx\n", Status
);
3514 Status
= SampGetObjectAttributeString(GroupObject
,
3516 &InfoBuffer
->General
.AdminComment
);
3517 if (!NT_SUCCESS(Status
))
3519 TRACE("Status 0x%08lx\n", Status
);
3523 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3524 Status
= SampGetObjectAttribute(GroupObject
,
3529 if (!NT_SUCCESS(Status
))
3532 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3534 /* Open the Members subkey */
3535 Status
= SampRegOpenKey(GroupObject
->KeyHandle
,
3539 if (!NT_SUCCESS(Status
))
3541 TRACE("Status 0x%08lx\n", Status
);
3545 /* Retrieve the number of members of the alias */
3546 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3548 &InfoBuffer
->General
.MemberCount
);
3549 if (!NT_SUCCESS(Status
))
3551 TRACE("Status 0x%08lx\n", Status
);
3555 *Buffer
= InfoBuffer
;
3558 if (MembersKeyHandle
!= NULL
)
3559 SampRegCloseKey(MembersKeyHandle
);
3561 if (!NT_SUCCESS(Status
))
3563 if (InfoBuffer
!= NULL
)
3565 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3566 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3568 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3569 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3571 midl_user_free(InfoBuffer
);
3580 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3581 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3583 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3588 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3589 if (InfoBuffer
== NULL
)
3590 return STATUS_INSUFFICIENT_RESOURCES
;
3592 Status
= SampGetObjectAttributeString(GroupObject
,
3594 &InfoBuffer
->Name
.Name
);
3595 if (!NT_SUCCESS(Status
))
3597 TRACE("Status 0x%08lx\n", Status
);
3601 *Buffer
= InfoBuffer
;
3604 if (!NT_SUCCESS(Status
))
3606 if (InfoBuffer
!= NULL
)
3608 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3609 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3611 midl_user_free(InfoBuffer
);
3620 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3621 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3623 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3624 SAM_GROUP_FIXED_DATA FixedData
;
3630 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3631 if (InfoBuffer
== NULL
)
3632 return STATUS_INSUFFICIENT_RESOURCES
;
3634 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3635 Status
= SampGetObjectAttribute(GroupObject
,
3640 if (!NT_SUCCESS(Status
))
3643 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3645 *Buffer
= InfoBuffer
;
3648 if (!NT_SUCCESS(Status
))
3650 if (InfoBuffer
!= NULL
)
3652 midl_user_free(InfoBuffer
);
3661 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3662 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3664 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3669 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3670 if (InfoBuffer
== NULL
)
3671 return STATUS_INSUFFICIENT_RESOURCES
;
3673 Status
= SampGetObjectAttributeString(GroupObject
,
3675 &InfoBuffer
->AdminComment
.AdminComment
);
3676 if (!NT_SUCCESS(Status
))
3678 TRACE("Status 0x%08lx\n", Status
);
3682 *Buffer
= InfoBuffer
;
3685 if (!NT_SUCCESS(Status
))
3687 if (InfoBuffer
!= NULL
)
3689 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3690 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3692 midl_user_free(InfoBuffer
);
3703 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3704 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3705 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3707 PSAM_DB_OBJECT GroupObject
;
3710 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
3711 GroupHandle
, GroupInformationClass
, Buffer
);
3713 /* Validate the group handle */
3714 Status
= SampValidateDbObject(GroupHandle
,
3716 GROUP_READ_INFORMATION
,
3718 if (!NT_SUCCESS(Status
))
3721 switch (GroupInformationClass
)
3723 case GroupGeneralInformation
:
3724 Status
= SampQueryGroupGeneral(GroupObject
,
3728 case GroupNameInformation
:
3729 Status
= SampQueryGroupName(GroupObject
,
3733 case GroupAttributeInformation
:
3734 Status
= SampQueryGroupAttribute(GroupObject
,
3738 case GroupAdminCommentInformation
:
3739 Status
= SampQueryGroupAdminComment(GroupObject
,
3744 Status
= STATUS_INVALID_INFO_CLASS
;
3753 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3754 PSAMPR_GROUP_INFO_BUFFER Buffer
)
3756 SAM_GROUP_FIXED_DATA FixedData
;
3760 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3761 Status
= SampGetObjectAttribute(GroupObject
,
3766 if (!NT_SUCCESS(Status
))
3769 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
3771 Status
= SampSetObjectAttribute(GroupObject
,
3785 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3786 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3787 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
3789 PSAM_DB_OBJECT GroupObject
;
3792 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
3793 GroupHandle
, GroupInformationClass
, Buffer
);
3795 /* Validate the group handle */
3796 Status
= SampValidateDbObject(GroupHandle
,
3798 GROUP_WRITE_ACCOUNT
,
3800 if (!NT_SUCCESS(Status
))
3803 switch (GroupInformationClass
)
3805 case GroupNameInformation
:
3806 Status
= SampSetObjectAttribute(GroupObject
,
3809 Buffer
->Name
.Name
.Buffer
,
3810 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3813 case GroupAttributeInformation
:
3814 Status
= SampSetGroupAttribute(GroupObject
,
3818 case GroupAdminCommentInformation
:
3819 Status
= SampSetObjectAttribute(GroupObject
,
3822 Buffer
->AdminComment
.AdminComment
.Buffer
,
3823 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
3827 Status
= STATUS_INVALID_INFO_CLASS
;
3838 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
3839 IN
unsigned long MemberId
,
3840 IN
unsigned long Attributes
)
3843 return STATUS_NOT_IMPLEMENTED
;
3849 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
3852 return STATUS_NOT_IMPLEMENTED
;
3858 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
3859 IN
unsigned long MemberId
)
3862 return STATUS_NOT_IMPLEMENTED
;
3868 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
3869 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
3872 return STATUS_NOT_IMPLEMENTED
;
3878 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
3879 IN
unsigned long MemberId
,
3880 IN
unsigned long Attributes
)
3883 return STATUS_NOT_IMPLEMENTED
;
3890 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
3891 IN ACCESS_MASK DesiredAccess
,
3893 OUT SAMPR_HANDLE
*AliasHandle
)
3895 PSAM_DB_OBJECT DomainObject
;
3896 PSAM_DB_OBJECT AliasObject
;
3900 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
3901 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
3903 /* Validate the domain handle */
3904 Status
= SampValidateDbObject(DomainHandle
,
3908 if (!NT_SUCCESS(Status
))
3910 TRACE("failed with status 0x%08lx\n", Status
);
3914 /* Convert the RID into a string (hex) */
3915 swprintf(szRid
, L
"%08lX", AliasId
);
3917 /* Create the alias object */
3918 Status
= SampOpenDbObject(DomainObject
,
3925 if (!NT_SUCCESS(Status
))
3927 TRACE("failed with status 0x%08lx\n", Status
);
3931 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
3933 return STATUS_SUCCESS
;
3938 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
3939 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3941 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3942 HANDLE MembersKeyHandle
= NULL
;
3947 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3948 if (InfoBuffer
== NULL
)
3949 return STATUS_INSUFFICIENT_RESOURCES
;
3951 Status
= SampGetObjectAttributeString(AliasObject
,
3953 &InfoBuffer
->General
.Name
);
3954 if (!NT_SUCCESS(Status
))
3956 TRACE("Status 0x%08lx\n", Status
);
3960 Status
= SampGetObjectAttributeString(AliasObject
,
3962 &InfoBuffer
->General
.AdminComment
);
3963 if (!NT_SUCCESS(Status
))
3965 TRACE("Status 0x%08lx\n", Status
);
3969 /* Open the Members subkey */
3970 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
3974 if (NT_SUCCESS(Status
))
3976 /* Retrieve the number of members of the alias */
3977 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3979 &InfoBuffer
->General
.MemberCount
);
3980 if (!NT_SUCCESS(Status
))
3982 TRACE("Status 0x%08lx\n", Status
);
3986 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3988 InfoBuffer
->General
.MemberCount
= 0;
3989 Status
= STATUS_SUCCESS
;
3993 TRACE("Status 0x%08lx\n", Status
);
3997 *Buffer
= InfoBuffer
;
4000 if (MembersKeyHandle
!= NULL
)
4001 SampRegCloseKey(MembersKeyHandle
);
4003 if (!NT_SUCCESS(Status
))
4005 if (InfoBuffer
!= NULL
)
4007 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4008 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4010 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4011 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4013 midl_user_free(InfoBuffer
);
4022 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4023 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4025 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4030 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4031 if (InfoBuffer
== NULL
)
4032 return STATUS_INSUFFICIENT_RESOURCES
;
4034 Status
= SampGetObjectAttributeString(AliasObject
,
4036 &InfoBuffer
->Name
.Name
);
4037 if (!NT_SUCCESS(Status
))
4039 TRACE("Status 0x%08lx\n", Status
);
4043 *Buffer
= InfoBuffer
;
4046 if (!NT_SUCCESS(Status
))
4048 if (InfoBuffer
!= NULL
)
4050 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4051 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4053 midl_user_free(InfoBuffer
);
4062 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4063 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4065 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4070 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4071 if (InfoBuffer
== NULL
)
4072 return STATUS_INSUFFICIENT_RESOURCES
;
4074 Status
= SampGetObjectAttributeString(AliasObject
,
4076 &InfoBuffer
->AdminComment
.AdminComment
);
4077 if (!NT_SUCCESS(Status
))
4079 TRACE("Status 0x%08lx\n", Status
);
4083 *Buffer
= InfoBuffer
;
4086 if (!NT_SUCCESS(Status
))
4088 if (InfoBuffer
!= NULL
)
4090 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4091 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4093 midl_user_free(InfoBuffer
);
4104 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4105 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4106 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4108 PSAM_DB_OBJECT AliasObject
;
4111 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4112 AliasHandle
, AliasInformationClass
, Buffer
);
4114 /* Validate the alias handle */
4115 Status
= SampValidateDbObject(AliasHandle
,
4117 ALIAS_READ_INFORMATION
,
4119 if (!NT_SUCCESS(Status
))
4122 switch (AliasInformationClass
)
4124 case AliasGeneralInformation
:
4125 Status
= SampQueryAliasGeneral(AliasObject
,
4129 case AliasNameInformation
:
4130 Status
= SampQueryAliasName(AliasObject
,
4134 case AliasAdminCommentInformation
:
4135 Status
= SampQueryAliasAdminComment(AliasObject
,
4140 Status
= STATUS_INVALID_INFO_CLASS
;
4151 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4152 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4153 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4155 PSAM_DB_OBJECT AliasObject
;
4158 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4159 AliasHandle
, AliasInformationClass
, Buffer
);
4161 /* Validate the alias handle */
4162 Status
= SampValidateDbObject(AliasHandle
,
4164 ALIAS_WRITE_ACCOUNT
,
4166 if (!NT_SUCCESS(Status
))
4169 switch (AliasInformationClass
)
4171 case AliasNameInformation
:
4172 Status
= SampSetObjectAttribute(AliasObject
,
4175 Buffer
->Name
.Name
.Buffer
,
4176 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4179 case AliasAdminCommentInformation
:
4180 Status
= SampSetObjectAttribute(AliasObject
,
4183 Buffer
->AdminComment
.AdminComment
.Buffer
,
4184 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4188 Status
= STATUS_INVALID_INFO_CLASS
;
4199 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4202 return STATUS_NOT_IMPLEMENTED
;
4209 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4210 IN PRPC_SID MemberId
)
4212 PSAM_DB_OBJECT AliasObject
;
4213 LPWSTR MemberIdString
= NULL
;
4214 HANDLE MembersKeyHandle
= NULL
;
4215 HANDLE MemberKeyHandle
= NULL
;
4216 ULONG MemberIdLength
;
4219 TRACE("SamrAddMemberToAlias(%p %p)\n",
4220 AliasHandle
, MemberId
);
4222 /* Validate the alias handle */
4223 Status
= SampValidateDbObject(AliasHandle
,
4227 if (!NT_SUCCESS(Status
))
4229 TRACE("failed with status 0x%08lx\n", Status
);
4233 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4234 TRACE("Member SID: %S\n", MemberIdString
);
4236 MemberIdLength
= RtlLengthSid(MemberId
);
4238 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4242 if (!NT_SUCCESS(Status
))
4244 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4248 Status
= SampRegSetValue(MembersKeyHandle
,
4253 if (!NT_SUCCESS(Status
))
4255 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4259 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4263 if (!NT_SUCCESS(Status
))
4265 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4269 Status
= SampRegSetValue(MemberKeyHandle
,
4274 if (!NT_SUCCESS(Status
))
4276 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4281 if (MemberKeyHandle
!= NULL
)
4282 SampRegCloseKey(MemberKeyHandle
);
4284 if (MembersKeyHandle
!= NULL
)
4285 SampRegCloseKey(MembersKeyHandle
);
4287 if (MemberIdString
!= NULL
)
4288 LocalFree(MemberIdString
);
4297 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4298 IN PRPC_SID MemberId
)
4300 PSAM_DB_OBJECT AliasObject
;
4301 LPWSTR MemberIdString
= NULL
;
4302 HANDLE MembersKeyHandle
= NULL
;
4303 HANDLE MemberKeyHandle
= NULL
;
4307 TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
4308 AliasHandle
, MemberId
);
4310 /* Validate the alias handle */
4311 Status
= SampValidateDbObject(AliasHandle
,
4313 ALIAS_REMOVE_MEMBER
,
4315 if (!NT_SUCCESS(Status
))
4317 TRACE("failed with status 0x%08lx\n", Status
);
4321 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4322 TRACE("Member SID: %S\n", MemberIdString
);
4324 Status
= SampRegOpenKey(AliasObject
->MembersKeyHandle
,
4326 KEY_WRITE
| KEY_QUERY_VALUE
,
4328 if (!NT_SUCCESS(Status
))
4330 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4334 Status
= SampRegDeleteValue(MemberKeyHandle
,
4336 if (!NT_SUCCESS(Status
))
4338 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4342 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
4345 if (!NT_SUCCESS(Status
))
4347 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4351 if (ulValueCount
== 0)
4353 SampRegCloseKey(MemberKeyHandle
);
4354 MemberKeyHandle
= NULL
;
4356 Status
= SampRegDeleteKey(AliasObject
->MembersKeyHandle
,
4358 if (!NT_SUCCESS(Status
))
4360 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4365 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4367 KEY_WRITE
| KEY_QUERY_VALUE
,
4369 if (!NT_SUCCESS(Status
))
4371 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4375 Status
= SampRegDeleteValue(MembersKeyHandle
,
4377 if (!NT_SUCCESS(Status
))
4379 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4383 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4386 if (!NT_SUCCESS(Status
))
4388 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4392 if (ulValueCount
== 0)
4394 SampRegCloseKey(MembersKeyHandle
);
4395 MembersKeyHandle
= NULL
;
4397 Status
= SampRegDeleteKey(AliasObject
->KeyHandle
,
4399 if (!NT_SUCCESS(Status
))
4401 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4407 if (MemberKeyHandle
!= NULL
)
4408 SampRegCloseKey(MemberKeyHandle
);
4410 if (MembersKeyHandle
!= NULL
)
4411 SampRegCloseKey(MembersKeyHandle
);
4413 if (MemberIdString
!= NULL
)
4414 LocalFree(MemberIdString
);
4423 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4424 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4426 PSAM_DB_OBJECT AliasObject
;
4427 HANDLE MembersKeyHandle
= NULL
;
4428 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4429 ULONG ValueCount
= 0;
4434 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4435 AliasHandle
, Members
);
4437 /* Validate the alias handle */
4438 Status
= SampValidateDbObject(AliasHandle
,
4442 if (!NT_SUCCESS(Status
))
4444 ERR("failed with status 0x%08lx\n", Status
);
4448 /* Open the members key of the alias objct */
4449 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4453 if (!NT_SUCCESS(Status
))
4455 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4459 /* Get the number of members */
4460 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4463 if (!NT_SUCCESS(Status
))
4465 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4469 /* Allocate the member array */
4470 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4471 if (MemberArray
== NULL
)
4473 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4477 /* Enumerate the members */
4481 /* Get the size of the next SID */
4483 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4490 if (!NT_SUCCESS(Status
))
4492 if (Status
== STATUS_NO_MORE_ENTRIES
)
4493 Status
= STATUS_SUCCESS
;
4497 /* Allocate a buffer for the SID */
4498 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4499 if (MemberArray
[Index
].SidPointer
== NULL
)
4501 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4505 /* Read the SID into the buffer */
4506 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4511 (PVOID
)MemberArray
[Index
].SidPointer
,
4513 if (!NT_SUCCESS(Status
))
4521 /* Return the number of members and the member array */
4522 if (NT_SUCCESS(Status
))
4524 Members
->Count
= ValueCount
;
4525 Members
->Sids
= MemberArray
;
4529 /* Clean up the members array and the SID buffers if something failed */
4530 if (!NT_SUCCESS(Status
))
4532 if (MemberArray
!= NULL
)
4534 for (Index
= 0; Index
< ValueCount
; Index
++)
4536 if (MemberArray
[Index
].SidPointer
!= NULL
)
4537 midl_user_free(MemberArray
[Index
].SidPointer
);
4540 midl_user_free(MemberArray
);
4544 /* Close the members key */
4545 if (MembersKeyHandle
!= NULL
)
4546 SampRegCloseKey(MembersKeyHandle
);
4555 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
4556 IN ACCESS_MASK DesiredAccess
,
4557 IN
unsigned long UserId
,
4558 OUT SAMPR_HANDLE
*UserHandle
)
4560 PSAM_DB_OBJECT DomainObject
;
4561 PSAM_DB_OBJECT UserObject
;
4565 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
4566 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
4568 /* Validate the domain handle */
4569 Status
= SampValidateDbObject(DomainHandle
,
4573 if (!NT_SUCCESS(Status
))
4575 TRACE("failed with status 0x%08lx\n", Status
);
4579 /* Convert the RID into a string (hex) */
4580 swprintf(szRid
, L
"%08lX", UserId
);
4582 /* Create the user object */
4583 Status
= SampOpenDbObject(DomainObject
,
4590 if (!NT_SUCCESS(Status
))
4592 TRACE("failed with status 0x%08lx\n", Status
);
4596 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
4598 return STATUS_SUCCESS
;
4605 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
4608 return STATUS_NOT_IMPLEMENTED
;
4614 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
4615 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4617 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4618 SAM_USER_FIXED_DATA FixedData
;
4624 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4625 if (InfoBuffer
== NULL
)
4626 return STATUS_INSUFFICIENT_RESOURCES
;
4628 Length
= sizeof(SAM_USER_FIXED_DATA
);
4629 Status
= SampGetObjectAttribute(UserObject
,
4634 if (!NT_SUCCESS(Status
))
4637 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4639 /* Get the Name string */
4640 Status
= SampGetObjectAttributeString(UserObject
,
4642 &InfoBuffer
->General
.UserName
);
4643 if (!NT_SUCCESS(Status
))
4645 TRACE("Status 0x%08lx\n", Status
);
4649 /* Get the FullName string */
4650 Status
= SampGetObjectAttributeString(UserObject
,
4652 &InfoBuffer
->General
.FullName
);
4653 if (!NT_SUCCESS(Status
))
4655 TRACE("Status 0x%08lx\n", Status
);
4659 /* Get the AdminComment string */
4660 Status
= SampGetObjectAttributeString(UserObject
,
4662 &InfoBuffer
->General
.AdminComment
);
4663 if (!NT_SUCCESS(Status
))
4665 TRACE("Status 0x%08lx\n", Status
);
4669 /* Get the UserComment string */
4670 Status
= SampGetObjectAttributeString(UserObject
,
4672 &InfoBuffer
->General
.UserComment
);
4673 if (!NT_SUCCESS(Status
))
4675 TRACE("Status 0x%08lx\n", Status
);
4679 *Buffer
= InfoBuffer
;
4682 if (!NT_SUCCESS(Status
))
4684 if (InfoBuffer
!= NULL
)
4686 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
4687 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
4689 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
4690 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
4692 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4693 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4695 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
4696 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
4698 midl_user_free(InfoBuffer
);
4708 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
4709 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4711 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4712 SAM_USER_FIXED_DATA FixedData
;
4718 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4719 if (InfoBuffer
== NULL
)
4720 return STATUS_INSUFFICIENT_RESOURCES
;
4722 Length
= sizeof(SAM_USER_FIXED_DATA
);
4723 Status
= SampGetObjectAttribute(UserObject
,
4728 if (!NT_SUCCESS(Status
))
4731 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
4732 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
4734 /* Get the UserComment string */
4735 Status
= SampGetObjectAttributeString(UserObject
,
4737 &InfoBuffer
->Preferences
.UserComment
);
4738 if (!NT_SUCCESS(Status
))
4740 TRACE("Status 0x%08lx\n", Status
);
4744 *Buffer
= InfoBuffer
;
4747 if (!NT_SUCCESS(Status
))
4749 if (InfoBuffer
!= NULL
)
4751 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
4752 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
4754 midl_user_free(InfoBuffer
);
4764 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
4765 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4767 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4768 SAM_USER_FIXED_DATA FixedData
;
4774 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4775 if (InfoBuffer
== NULL
)
4776 return STATUS_INSUFFICIENT_RESOURCES
;
4778 Length
= sizeof(SAM_USER_FIXED_DATA
);
4779 Status
= SampGetObjectAttribute(UserObject
,
4784 if (!NT_SUCCESS(Status
))
4787 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
4788 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4789 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4790 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4791 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4792 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4793 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4794 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4795 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4796 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
4797 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
4799 // OLD_LARGE_INTEGER PasswordCanChange;
4800 // OLD_LARGE_INTEGER PasswordMustChange;
4802 /* Get the Name string */
4803 Status
= SampGetObjectAttributeString(UserObject
,
4805 &InfoBuffer
->Logon
.UserName
);
4806 if (!NT_SUCCESS(Status
))
4808 TRACE("Status 0x%08lx\n", Status
);
4812 /* Get the FullName string */
4813 Status
= SampGetObjectAttributeString(UserObject
,
4815 &InfoBuffer
->Logon
.FullName
);
4816 if (!NT_SUCCESS(Status
))
4818 TRACE("Status 0x%08lx\n", Status
);
4822 /* Get the HomeDirectory string */
4823 Status
= SampGetObjectAttributeString(UserObject
,
4825 &InfoBuffer
->Logon
.HomeDirectory
);
4826 if (!NT_SUCCESS(Status
))
4828 TRACE("Status 0x%08lx\n", Status
);
4832 /* Get the HomeDirectoryDrive string */
4833 Status
= SampGetObjectAttributeString(UserObject
,
4834 L
"HomeDirectoryDrive",
4835 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
4836 if (!NT_SUCCESS(Status
))
4838 TRACE("Status 0x%08lx\n", Status
);
4842 /* Get the ScriptPath string */
4843 Status
= SampGetObjectAttributeString(UserObject
,
4845 &InfoBuffer
->Logon
.ScriptPath
);
4846 if (!NT_SUCCESS(Status
))
4848 TRACE("Status 0x%08lx\n", Status
);
4852 /* Get the ProfilePath string */
4853 Status
= SampGetObjectAttributeString(UserObject
,
4855 &InfoBuffer
->Logon
.ProfilePath
);
4856 if (!NT_SUCCESS(Status
))
4858 TRACE("Status 0x%08lx\n", Status
);
4862 /* Get the WorkStations string */
4863 Status
= SampGetObjectAttributeString(UserObject
,
4865 &InfoBuffer
->Logon
.WorkStations
);
4866 if (!NT_SUCCESS(Status
))
4868 TRACE("Status 0x%08lx\n", Status
);
4872 /* FIXME: LogonHours */
4874 *Buffer
= InfoBuffer
;
4877 if (!NT_SUCCESS(Status
))
4879 if (InfoBuffer
!= NULL
)
4881 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
4882 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
4884 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
4885 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
4887 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
4888 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
4890 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
4891 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
4893 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
4894 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
4896 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
4897 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
4899 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
4900 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
4902 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
4903 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
4905 midl_user_free(InfoBuffer
);
4915 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
4916 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4918 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4919 SAM_USER_FIXED_DATA FixedData
;
4925 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4926 if (InfoBuffer
== NULL
)
4927 return STATUS_INSUFFICIENT_RESOURCES
;
4929 Length
= sizeof(SAM_USER_FIXED_DATA
);
4930 Status
= SampGetObjectAttribute(UserObject
,
4935 if (!NT_SUCCESS(Status
))
4938 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
4939 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4940 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4941 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4942 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4943 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4944 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4945 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4946 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
4947 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
4948 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4949 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
4950 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
4952 /* Get the Name string */
4953 Status
= SampGetObjectAttributeString(UserObject
,
4955 &InfoBuffer
->Account
.UserName
);
4956 if (!NT_SUCCESS(Status
))
4958 TRACE("Status 0x%08lx\n", Status
);
4962 /* Get the FullName string */
4963 Status
= SampGetObjectAttributeString(UserObject
,
4965 &InfoBuffer
->Account
.FullName
);
4966 if (!NT_SUCCESS(Status
))
4968 TRACE("Status 0x%08lx\n", Status
);
4972 /* Get the HomeDirectory string */
4973 Status
= SampGetObjectAttributeString(UserObject
,
4975 &InfoBuffer
->Account
.HomeDirectory
);
4976 if (!NT_SUCCESS(Status
))
4978 TRACE("Status 0x%08lx\n", Status
);
4982 /* Get the HomeDirectoryDrive string */
4983 Status
= SampGetObjectAttributeString(UserObject
,
4984 L
"HomeDirectoryDrive",
4985 &InfoBuffer
->Account
.HomeDirectoryDrive
);
4986 if (!NT_SUCCESS(Status
))
4988 TRACE("Status 0x%08lx\n", Status
);
4992 /* Get the ScriptPath string */
4993 Status
= SampGetObjectAttributeString(UserObject
,
4995 &InfoBuffer
->Account
.ScriptPath
);
4996 if (!NT_SUCCESS(Status
))
4998 TRACE("Status 0x%08lx\n", Status
);
5002 /* Get the ProfilePath string */
5003 Status
= SampGetObjectAttributeString(UserObject
,
5005 &InfoBuffer
->Account
.ProfilePath
);
5006 if (!NT_SUCCESS(Status
))
5008 TRACE("Status 0x%08lx\n", Status
);
5012 /* Get the AdminComment string */
5013 Status
= SampGetObjectAttributeString(UserObject
,
5015 &InfoBuffer
->Account
.AdminComment
);
5016 if (!NT_SUCCESS(Status
))
5018 TRACE("Status 0x%08lx\n", Status
);
5022 /* Get the WorkStations string */
5023 Status
= SampGetObjectAttributeString(UserObject
,
5025 &InfoBuffer
->Account
.WorkStations
);
5026 if (!NT_SUCCESS(Status
))
5028 TRACE("Status 0x%08lx\n", Status
);
5032 /* FIXME: LogonHours */
5034 *Buffer
= InfoBuffer
;
5037 if (!NT_SUCCESS(Status
))
5039 if (InfoBuffer
!= NULL
)
5041 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5042 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5044 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5045 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5047 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5048 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5050 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5051 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5053 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5054 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5056 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5057 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5059 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5060 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5062 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5063 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5065 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5066 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5068 midl_user_free(InfoBuffer
);
5075 /* FIXME: SampQueryUserLogonHours */
5079 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
5080 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5082 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5087 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5088 if (InfoBuffer
== NULL
)
5089 return STATUS_INSUFFICIENT_RESOURCES
;
5091 /* Get the Name string */
5092 Status
= SampGetObjectAttributeString(UserObject
,
5094 &InfoBuffer
->Name
.UserName
);
5095 if (!NT_SUCCESS(Status
))
5097 TRACE("Status 0x%08lx\n", Status
);
5101 /* Get the FullName string */
5102 Status
= SampGetObjectAttributeString(UserObject
,
5104 &InfoBuffer
->Name
.FullName
);
5105 if (!NT_SUCCESS(Status
))
5107 TRACE("Status 0x%08lx\n", Status
);
5111 *Buffer
= InfoBuffer
;
5114 if (!NT_SUCCESS(Status
))
5116 if (InfoBuffer
!= NULL
)
5118 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5119 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5121 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5122 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5124 midl_user_free(InfoBuffer
);
5133 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5134 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5136 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5141 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5142 if (InfoBuffer
== NULL
)
5143 return STATUS_INSUFFICIENT_RESOURCES
;
5145 /* Get the Name string */
5146 Status
= SampGetObjectAttributeString(UserObject
,
5148 &InfoBuffer
->AccountName
.UserName
);
5149 if (!NT_SUCCESS(Status
))
5151 TRACE("Status 0x%08lx\n", Status
);
5155 *Buffer
= InfoBuffer
;
5158 if (!NT_SUCCESS(Status
))
5160 if (InfoBuffer
!= NULL
)
5162 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5163 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5165 midl_user_free(InfoBuffer
);
5174 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5175 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5177 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5182 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5183 if (InfoBuffer
== NULL
)
5184 return STATUS_INSUFFICIENT_RESOURCES
;
5186 /* Get the FullName string */
5187 Status
= SampGetObjectAttributeString(UserObject
,
5189 &InfoBuffer
->FullName
.FullName
);
5190 if (!NT_SUCCESS(Status
))
5192 TRACE("Status 0x%08lx\n", Status
);
5196 *Buffer
= InfoBuffer
;
5199 if (!NT_SUCCESS(Status
))
5201 if (InfoBuffer
!= NULL
)
5203 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
5204 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5206 midl_user_free(InfoBuffer
);
5216 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5217 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5219 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5220 SAM_USER_FIXED_DATA FixedData
;
5226 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5227 if (InfoBuffer
== NULL
)
5228 return STATUS_INSUFFICIENT_RESOURCES
;
5230 Length
= sizeof(SAM_USER_FIXED_DATA
);
5231 Status
= SampGetObjectAttribute(UserObject
,
5236 if (!NT_SUCCESS(Status
))
5239 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5241 *Buffer
= InfoBuffer
;
5244 if (!NT_SUCCESS(Status
))
5246 if (InfoBuffer
!= NULL
)
5248 midl_user_free(InfoBuffer
);
5257 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5258 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5260 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5265 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5266 if (InfoBuffer
== NULL
)
5267 return STATUS_INSUFFICIENT_RESOURCES
;
5269 /* Get the HomeDirectory string */
5270 Status
= SampGetObjectAttributeString(UserObject
,
5272 &InfoBuffer
->Home
.HomeDirectory
);
5273 if (!NT_SUCCESS(Status
))
5275 TRACE("Status 0x%08lx\n", Status
);
5279 /* Get the HomeDirectoryDrive string */
5280 Status
= SampGetObjectAttributeString(UserObject
,
5281 L
"HomeDirectoryDrive",
5282 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5283 if (!NT_SUCCESS(Status
))
5285 TRACE("Status 0x%08lx\n", Status
);
5289 *Buffer
= InfoBuffer
;
5292 if (!NT_SUCCESS(Status
))
5294 if (InfoBuffer
!= NULL
)
5296 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5297 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5299 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5300 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5302 midl_user_free(InfoBuffer
);
5311 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5312 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5314 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5319 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5320 if (InfoBuffer
== NULL
)
5321 return STATUS_INSUFFICIENT_RESOURCES
;
5323 /* Get the ScriptPath string */
5324 Status
= SampGetObjectAttributeString(UserObject
,
5326 &InfoBuffer
->Script
.ScriptPath
);
5327 if (!NT_SUCCESS(Status
))
5329 TRACE("Status 0x%08lx\n", Status
);
5333 *Buffer
= InfoBuffer
;
5336 if (!NT_SUCCESS(Status
))
5338 if (InfoBuffer
!= NULL
)
5340 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5341 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5343 midl_user_free(InfoBuffer
);
5352 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5353 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5355 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5360 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5361 if (InfoBuffer
== NULL
)
5362 return STATUS_INSUFFICIENT_RESOURCES
;
5364 /* Get the ProfilePath string */
5365 Status
= SampGetObjectAttributeString(UserObject
,
5367 &InfoBuffer
->Profile
.ProfilePath
);
5368 if (!NT_SUCCESS(Status
))
5370 TRACE("Status 0x%08lx\n", Status
);
5374 *Buffer
= InfoBuffer
;
5377 if (!NT_SUCCESS(Status
))
5379 if (InfoBuffer
!= NULL
)
5381 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
5382 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5384 midl_user_free(InfoBuffer
);
5393 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5394 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5396 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5401 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5402 if (InfoBuffer
== NULL
)
5403 return STATUS_INSUFFICIENT_RESOURCES
;
5405 /* Get the AdminComment string */
5406 Status
= SampGetObjectAttributeString(UserObject
,
5408 &InfoBuffer
->AdminComment
.AdminComment
);
5409 if (!NT_SUCCESS(Status
))
5411 TRACE("Status 0x%08lx\n", Status
);
5415 *Buffer
= InfoBuffer
;
5418 if (!NT_SUCCESS(Status
))
5420 if (InfoBuffer
!= NULL
)
5422 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5423 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5425 midl_user_free(InfoBuffer
);
5434 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5435 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5437 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5442 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5443 if (InfoBuffer
== NULL
)
5444 return STATUS_INSUFFICIENT_RESOURCES
;
5446 /* Get the WorkStations string */
5447 Status
= SampGetObjectAttributeString(UserObject
,
5449 &InfoBuffer
->WorkStations
.WorkStations
);
5450 if (!NT_SUCCESS(Status
))
5452 TRACE("Status 0x%08lx\n", Status
);
5456 *Buffer
= InfoBuffer
;
5459 if (!NT_SUCCESS(Status
))
5461 if (InfoBuffer
!= NULL
)
5463 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
5464 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
5466 midl_user_free(InfoBuffer
);
5476 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
5477 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5479 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5480 SAM_USER_FIXED_DATA FixedData
;
5486 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5487 if (InfoBuffer
== NULL
)
5488 return STATUS_INSUFFICIENT_RESOURCES
;
5490 Length
= sizeof(SAM_USER_FIXED_DATA
);
5491 Status
= SampGetObjectAttribute(UserObject
,
5496 if (!NT_SUCCESS(Status
))
5499 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
5501 *Buffer
= InfoBuffer
;
5504 if (!NT_SUCCESS(Status
))
5506 if (InfoBuffer
!= NULL
)
5508 midl_user_free(InfoBuffer
);
5518 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
5519 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5521 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5522 SAM_USER_FIXED_DATA FixedData
;
5528 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5529 if (InfoBuffer
== NULL
)
5530 return STATUS_INSUFFICIENT_RESOURCES
;
5532 Length
= sizeof(SAM_USER_FIXED_DATA
);
5533 Status
= SampGetObjectAttribute(UserObject
,
5538 if (!NT_SUCCESS(Status
))
5541 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5542 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5544 *Buffer
= InfoBuffer
;
5547 if (!NT_SUCCESS(Status
))
5549 if (InfoBuffer
!= NULL
)
5551 midl_user_free(InfoBuffer
);
5562 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
5563 IN USER_INFORMATION_CLASS UserInformationClass
,
5564 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
5566 PSAM_DB_OBJECT UserObject
;
5567 ACCESS_MASK DesiredAccess
;
5570 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
5571 UserHandle
, UserInformationClass
, Buffer
);
5573 switch (UserInformationClass
)
5575 case UserGeneralInformation
:
5576 case UserNameInformation
:
5577 case UserAccountNameInformation
:
5578 case UserFullNameInformation
:
5579 case UserPrimaryGroupInformation
:
5580 case UserAdminCommentInformation
:
5581 DesiredAccess
= USER_READ_GENERAL
;
5584 case UserLogonHoursInformation
:
5585 case UserHomeInformation
:
5586 case UserScriptInformation
:
5587 case UserProfileInformation
:
5588 case UserWorkStationsInformation
:
5589 DesiredAccess
= USER_READ_LOGON
;
5592 case UserControlInformation
:
5593 case UserExpiresInformation
:
5594 DesiredAccess
= USER_READ_ACCOUNT
;
5597 case UserPreferencesInformation
:
5598 DesiredAccess
= USER_READ_GENERAL
|
5599 USER_READ_PREFERENCES
;
5602 case UserLogonInformation
:
5603 case UserAccountInformation
:
5604 DesiredAccess
= USER_READ_GENERAL
|
5605 USER_READ_PREFERENCES
|
5611 return STATUS_INVALID_INFO_CLASS
;
5614 /* Validate the domain handle */
5615 Status
= SampValidateDbObject(UserHandle
,
5619 if (!NT_SUCCESS(Status
))
5621 TRACE("failed with status 0x%08lx\n", Status
);
5625 switch (UserInformationClass
)
5627 case UserGeneralInformation
:
5628 Status
= SampQueryUserGeneral(UserObject
,
5632 case UserPreferencesInformation
:
5633 Status
= SampQueryUserPreferences(UserObject
,
5637 case UserLogonInformation
:
5638 Status
= SampQueryUserLogon(UserObject
,
5642 // case UserLogonHoursInformation:
5643 // Status = SampQueryUserLogonHours(UserObject,
5647 case UserAccountInformation
:
5648 Status
= SampQueryUserAccount(UserObject
,
5652 case UserNameInformation
:
5653 Status
= SampQueryUserName(UserObject
,
5657 case UserAccountNameInformation
:
5658 Status
= SampQueryUserAccountName(UserObject
,
5662 case UserFullNameInformation
:
5663 Status
= SampQueryUserFullName(UserObject
,
5667 case UserPrimaryGroupInformation
:
5668 Status
= SampQueryUserPrimaryGroup(UserObject
,
5672 case UserHomeInformation
:
5673 Status
= SampQueryUserHome(UserObject
,
5676 case UserScriptInformation
:
5677 Status
= SampQueryUserScript(UserObject
,
5681 case UserProfileInformation
:
5682 Status
= SampQueryUserProfile(UserObject
,
5686 case UserAdminCommentInformation
:
5687 Status
= SampQueryUserAdminComment(UserObject
,
5691 case UserWorkStationsInformation
:
5692 Status
= SampQueryUserWorkStations(UserObject
,
5696 case UserControlInformation
:
5697 Status
= SampQueryUserControl(UserObject
,
5701 case UserExpiresInformation
:
5702 Status
= SampQueryUserExpires(UserObject
,
5707 Status
= STATUS_INVALID_INFO_CLASS
;
5715 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
5716 PSAMPR_USER_INFO_BUFFER Buffer
)
5718 SAM_USER_FIXED_DATA FixedData
;
5722 Length
= sizeof(SAM_USER_FIXED_DATA
);
5723 Status
= SampGetObjectAttribute(UserObject
,
5728 if (!NT_SUCCESS(Status
))
5731 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
5733 Status
= SampSetObjectAttribute(UserObject
,
5738 if (!NT_SUCCESS(Status
))
5741 Status
= SampSetObjectAttribute(UserObject
,
5744 Buffer
->General
.UserName
.Buffer
,
5745 Buffer
->General
.UserName
.MaximumLength
);
5746 if (!NT_SUCCESS(Status
))
5749 Status
= SampSetObjectAttribute(UserObject
,
5752 Buffer
->General
.FullName
.Buffer
,
5753 Buffer
->General
.FullName
.MaximumLength
);
5754 if (!NT_SUCCESS(Status
))
5757 Status
= SampSetObjectAttribute(UserObject
,
5760 Buffer
->General
.AdminComment
.Buffer
,
5761 Buffer
->General
.AdminComment
.MaximumLength
);
5762 if (!NT_SUCCESS(Status
))
5765 Status
= SampSetObjectAttribute(UserObject
,
5768 Buffer
->General
.UserComment
.Buffer
,
5769 Buffer
->General
.UserComment
.MaximumLength
);
5777 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
5778 PSAMPR_USER_INFO_BUFFER Buffer
)
5780 SAM_USER_FIXED_DATA FixedData
;
5784 Length
= sizeof(SAM_USER_FIXED_DATA
);
5785 Status
= SampGetObjectAttribute(UserObject
,
5790 if (!NT_SUCCESS(Status
))
5793 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
5794 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
5796 Status
= SampSetObjectAttribute(UserObject
,
5801 if (!NT_SUCCESS(Status
))
5804 Status
= SampSetObjectAttribute(UserObject
,
5807 Buffer
->Preferences
.UserComment
.Buffer
,
5808 Buffer
->Preferences
.UserComment
.MaximumLength
);
5816 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5817 PSAMPR_USER_INFO_BUFFER Buffer
)
5819 SAM_USER_FIXED_DATA FixedData
;
5823 Length
= sizeof(SAM_USER_FIXED_DATA
);
5824 Status
= SampGetObjectAttribute(UserObject
,
5829 if (!NT_SUCCESS(Status
))
5832 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
5834 Status
= SampSetObjectAttribute(UserObject
,
5846 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
5847 PSAMPR_USER_INFO_BUFFER Buffer
)
5849 SAM_USER_FIXED_DATA FixedData
;
5853 Length
= sizeof(SAM_USER_FIXED_DATA
);
5854 Status
= SampGetObjectAttribute(UserObject
,
5859 if (!NT_SUCCESS(Status
))
5862 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
5864 Status
= SampSetObjectAttribute(UserObject
,
5876 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
5877 PSAMPR_USER_INFO_BUFFER Buffer
)
5879 SAM_USER_FIXED_DATA FixedData
;
5883 Length
= sizeof(SAM_USER_FIXED_DATA
);
5884 Status
= SampGetObjectAttribute(UserObject
,
5889 if (!NT_SUCCESS(Status
))
5892 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
5893 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
5895 Status
= SampSetObjectAttribute(UserObject
,
5909 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
5910 IN USER_INFORMATION_CLASS UserInformationClass
,
5911 IN PSAMPR_USER_INFO_BUFFER Buffer
)
5913 PSAM_DB_OBJECT UserObject
;
5914 ACCESS_MASK DesiredAccess
;
5917 TRACE("SamrSetInformationUser(%p %lu %p)\n",
5918 UserHandle
, UserInformationClass
, Buffer
);
5920 switch (UserInformationClass
)
5922 case UserLogonHoursInformation
:
5923 case UserNameInformation
:
5924 case UserAccountNameInformation
:
5925 case UserFullNameInformation
:
5926 case UserPrimaryGroupInformation
:
5927 case UserHomeInformation
:
5928 case UserScriptInformation
:
5929 case UserProfileInformation
:
5930 case UserAdminCommentInformation
:
5931 case UserWorkStationsInformation
:
5932 case UserControlInformation
:
5933 case UserExpiresInformation
:
5934 DesiredAccess
= USER_WRITE_ACCOUNT
;
5937 case UserGeneralInformation
:
5938 DesiredAccess
= USER_WRITE_ACCOUNT
|
5939 USER_WRITE_PREFERENCES
;
5942 case UserPreferencesInformation
:
5943 DesiredAccess
= USER_WRITE_PREFERENCES
;
5946 case UserSetPasswordInformation
:
5947 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
5951 return STATUS_INVALID_INFO_CLASS
;
5954 /* Validate the domain handle */
5955 Status
= SampValidateDbObject(UserHandle
,
5959 if (!NT_SUCCESS(Status
))
5961 TRACE("failed with status 0x%08lx\n", Status
);
5965 switch (UserInformationClass
)
5967 case UserGeneralInformation
:
5968 Status
= SampSetUserGeneral(UserObject
,
5972 case UserPreferencesInformation
:
5973 Status
= SampSetUserPreferences(UserObject
,
5977 case UserLogonHoursInformation:
5978 Status = SampSetUserLogonHours(UserObject,
5982 case UserNameInformation
:
5983 Status
= SampSetObjectAttribute(UserObject
,
5986 Buffer
->Name
.UserName
.Buffer
,
5987 Buffer
->Name
.UserName
.MaximumLength
);
5988 if (!NT_SUCCESS(Status
))
5991 Status
= SampSetObjectAttribute(UserObject
,
5994 Buffer
->Name
.FullName
.Buffer
,
5995 Buffer
->Name
.FullName
.MaximumLength
);
5998 case UserAccountNameInformation
:
5999 Status
= SampSetObjectAttribute(UserObject
,
6002 Buffer
->AccountName
.UserName
.Buffer
,
6003 Buffer
->AccountName
.UserName
.MaximumLength
);
6006 case UserFullNameInformation
:
6007 Status
= SampSetObjectAttribute(UserObject
,
6010 Buffer
->FullName
.FullName
.Buffer
,
6011 Buffer
->FullName
.FullName
.MaximumLength
);
6014 case UserPrimaryGroupInformation
:
6015 Status
= SampSetUserPrimaryGroup(UserObject
,
6019 case UserHomeInformation
:
6020 Status
= SampSetObjectAttribute(UserObject
,
6023 Buffer
->Home
.HomeDirectory
.Buffer
,
6024 Buffer
->Home
.HomeDirectory
.MaximumLength
);
6025 if (!NT_SUCCESS(Status
))
6028 Status
= SampSetObjectAttribute(UserObject
,
6029 L
"HomeDirectoryDrive",
6031 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
6032 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
6035 case UserScriptInformation
:
6036 Status
= SampSetObjectAttribute(UserObject
,
6039 Buffer
->Script
.ScriptPath
.Buffer
,
6040 Buffer
->Script
.ScriptPath
.MaximumLength
);
6043 case UserProfileInformation
:
6044 Status
= SampSetObjectAttribute(UserObject
,
6047 Buffer
->Profile
.ProfilePath
.Buffer
,
6048 Buffer
->Profile
.ProfilePath
.MaximumLength
);
6051 case UserAdminCommentInformation
:
6052 Status
= SampSetObjectAttribute(UserObject
,
6055 Buffer
->AdminComment
.AdminComment
.Buffer
,
6056 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
6059 case UserWorkStationsInformation
:
6060 Status
= SampSetObjectAttribute(UserObject
,
6063 Buffer
->WorkStations
.WorkStations
.Buffer
,
6064 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
6067 case UserSetPasswordInformation
:
6068 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
6069 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
6071 Status
= SampSetObjectAttribute(UserObject
,
6074 Buffer
->SetPassword
.Password
.Buffer
,
6075 Buffer
->SetPassword
.Password
.MaximumLength
);
6078 case UserControlInformation
:
6079 Status
= SampSetUserControl(UserObject
,
6083 case UserExpiresInformation
:
6084 Status
= SampSetUserExpires(UserObject
,
6088 // case UserInternal1Information:
6089 // case UserParametersInformation:
6090 // case UserAllInformation:
6091 // case UserInternal4Information:
6092 // case UserInternal5Information:
6093 // case UserInternal4InformationNew:
6094 // case UserInternal5InformationNew:
6097 Status
= STATUS_INVALID_INFO_CLASS
;
6106 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
6107 IN
unsigned char LmPresent
,
6108 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
6109 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
6110 IN
unsigned char NtPresent
,
6111 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
6112 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
6113 IN
unsigned char NtCrossEncryptionPresent
,
6114 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
6115 IN
unsigned char LmCrossEncryptionPresent
,
6116 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
6119 return STATUS_NOT_IMPLEMENTED
;
6125 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
6126 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
6129 return STATUS_NOT_IMPLEMENTED
;
6135 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
6136 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6137 IN
unsigned long Index
,
6138 IN
unsigned long EntryCount
,
6139 IN
unsigned long PreferredMaximumLength
,
6140 OUT
unsigned long *TotalAvailable
,
6141 OUT
unsigned long *TotalReturned
,
6142 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6145 return STATUS_NOT_IMPLEMENTED
;
6151 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
6152 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6153 IN PRPC_UNICODE_STRING Prefix
,
6154 OUT
unsigned long *Index
)
6157 return STATUS_NOT_IMPLEMENTED
;
6163 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
6166 return STATUS_NOT_IMPLEMENTED
;
6172 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
6175 return STATUS_NOT_IMPLEMENTED
;
6181 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
6182 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6185 return STATUS_NOT_IMPLEMENTED
;
6191 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
6192 IN PRPC_SID MemberSid
)
6195 return STATUS_NOT_IMPLEMENTED
;
6201 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
6202 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
6203 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
6206 return STATUS_NOT_IMPLEMENTED
;
6212 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
6213 IN USER_INFORMATION_CLASS UserInformationClass
,
6214 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6217 return STATUS_NOT_IMPLEMENTED
;
6223 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
6224 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6225 IN
unsigned long Index
,
6226 IN
unsigned long EntryCount
,
6227 IN
unsigned long PreferredMaximumLength
,
6228 OUT
unsigned long *TotalAvailable
,
6229 OUT
unsigned long *TotalReturned
,
6230 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6233 return STATUS_NOT_IMPLEMENTED
;
6239 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
6240 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6241 IN PRPC_UNICODE_STRING Prefix
,
6242 OUT
unsigned long *Index
)
6245 return STATUS_NOT_IMPLEMENTED
;
6252 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
6253 IN PRPC_UNICODE_STRING Name
,
6254 IN
unsigned long AccountType
,
6255 IN ACCESS_MASK DesiredAccess
,
6256 OUT SAMPR_HANDLE
*UserHandle
,
6257 OUT
unsigned long *GrantedAccess
,
6258 OUT
unsigned long *RelativeId
)
6260 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
6261 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
6262 SAM_USER_FIXED_DATA FixedUserData
;
6263 PSAM_DB_OBJECT DomainObject
;
6264 PSAM_DB_OBJECT UserObject
;
6270 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
6271 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
6274 Name
->Length
== 0 ||
6275 Name
->Buffer
== NULL
||
6276 UserHandle
== NULL
||
6278 return STATUS_INVALID_PARAMETER
;
6280 /* Check for valid account type */
6281 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
6282 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
6283 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
6284 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
6285 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
6286 return STATUS_INVALID_PARAMETER
;
6288 /* Validate the domain handle */
6289 Status
= SampValidateDbObject(DomainHandle
,
6293 if (!NT_SUCCESS(Status
))
6295 TRACE("failed with status 0x%08lx\n", Status
);
6299 /* Check if the user name already exists in the domain */
6300 Status
= SampCheckAccountNameInDomain(DomainObject
,
6302 if (!NT_SUCCESS(Status
))
6304 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
6305 Name
->Buffer
, Status
);
6309 /* Get the fixed domain attributes */
6310 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6311 Status
= SampGetObjectAttribute(DomainObject
,
6314 (PVOID
)&FixedDomainData
,
6316 if (!NT_SUCCESS(Status
))
6318 TRACE("failed with status 0x%08lx\n", Status
);
6322 /* Increment the NextRid attribute */
6323 ulRid
= FixedDomainData
.NextRid
;
6324 FixedDomainData
.NextRid
++;
6326 /* Store the fixed domain attributes */
6327 Status
= SampSetObjectAttribute(DomainObject
,
6332 if (!NT_SUCCESS(Status
))
6334 TRACE("failed with status 0x%08lx\n", Status
);
6338 TRACE("RID: %lx\n", ulRid
);
6340 /* Convert the RID into a string (hex) */
6341 swprintf(szRid
, L
"%08lX", ulRid
);
6343 /* Create the user object */
6344 Status
= SampCreateDbObject(DomainObject
,
6351 if (!NT_SUCCESS(Status
))
6353 TRACE("failed with status 0x%08lx\n", Status
);
6357 /* Add the account name for the user object */
6358 Status
= SampSetAccountNameInDomain(DomainObject
,
6362 if (!NT_SUCCESS(Status
))
6364 TRACE("failed with status 0x%08lx\n", Status
);
6368 /* Initialize fixed user data */
6369 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
6370 FixedUserData
.Version
= 1;
6371 FixedUserData
.LastLogon
.QuadPart
= 0;
6372 FixedUserData
.LastLogoff
.QuadPart
= 0;
6373 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
6374 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
6375 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
6376 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
6377 FixedUserData
.UserId
= ulRid
;
6378 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
6379 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
6380 USER_PASSWORD_NOT_REQUIRED
|
6383 /* Set fixed user data attribute */
6384 Status
= SampSetObjectAttribute(UserObject
,
6387 (LPVOID
)&FixedUserData
,
6388 sizeof(SAM_USER_FIXED_DATA
));
6389 if (!NT_SUCCESS(Status
))
6391 TRACE("failed with status 0x%08lx\n", Status
);
6395 /* Set the Name attribute */
6396 Status
= SampSetObjectAttribute(UserObject
,
6399 (LPVOID
)Name
->Buffer
,
6400 Name
->MaximumLength
);
6401 if (!NT_SUCCESS(Status
))
6403 TRACE("failed with status 0x%08lx\n", Status
);
6407 /* Set the FullName attribute */
6408 Status
= SampSetObjectAttribute(UserObject
,
6412 EmptyString
.MaximumLength
);
6413 if (!NT_SUCCESS(Status
))
6415 TRACE("failed with status 0x%08lx\n", Status
);
6419 /* Set the HomeDirectory attribute */
6420 Status
= SampSetObjectAttribute(UserObject
,
6424 EmptyString
.MaximumLength
);
6425 if (!NT_SUCCESS(Status
))
6427 TRACE("failed with status 0x%08lx\n", Status
);
6431 /* Set the HomeDirectoryDrive attribute */
6432 Status
= SampSetObjectAttribute(UserObject
,
6433 L
"HomeDirectoryDrive",
6436 EmptyString
.MaximumLength
);
6437 if (!NT_SUCCESS(Status
))
6439 TRACE("failed with status 0x%08lx\n", Status
);
6443 /* Set the ScriptPath attribute */
6444 Status
= SampSetObjectAttribute(UserObject
,
6448 EmptyString
.MaximumLength
);
6449 if (!NT_SUCCESS(Status
))
6451 TRACE("failed with status 0x%08lx\n", Status
);
6455 /* Set the ProfilePath attribute */
6456 Status
= SampSetObjectAttribute(UserObject
,
6460 EmptyString
.MaximumLength
);
6461 if (!NT_SUCCESS(Status
))
6463 TRACE("failed with status 0x%08lx\n", Status
);
6467 /* Set the AdminComment attribute */
6468 Status
= SampSetObjectAttribute(UserObject
,
6472 EmptyString
.MaximumLength
);
6473 if (!NT_SUCCESS(Status
))
6475 TRACE("failed with status 0x%08lx\n", Status
);
6479 /* Set the UserComment attribute */
6480 Status
= SampSetObjectAttribute(UserObject
,
6484 EmptyString
.MaximumLength
);
6485 if (!NT_SUCCESS(Status
))
6487 TRACE("failed with status 0x%08lx\n", Status
);
6491 /* Set the WorkStations attribute */
6492 Status
= SampSetObjectAttribute(UserObject
,
6496 EmptyString
.MaximumLength
);
6497 if (!NT_SUCCESS(Status
))
6499 TRACE("failed with status 0x%08lx\n", Status
);
6503 /* FIXME: Set default user attributes */
6505 if (NT_SUCCESS(Status
))
6507 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
6508 *RelativeId
= ulRid
;
6509 *GrantedAccess
= UserObject
->Access
;
6512 TRACE("returns with status 0x%08lx\n", Status
);
6521 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
6522 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6523 IN
unsigned long Index
,
6524 IN
unsigned long EntryCount
,
6525 IN
unsigned long PreferredMaximumLength
,
6526 OUT
unsigned long *TotalAvailable
,
6527 OUT
unsigned long *TotalReturned
,
6528 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6531 return STATUS_NOT_IMPLEMENTED
;
6538 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
6539 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6542 NTSTATUS Status
= STATUS_SUCCESS
;
6544 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
6545 AliasHandle
, MembersBuffer
);
6547 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6549 Status
= SamrAddMemberToAlias(AliasHandle
,
6550 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6552 if (Status
== STATUS_MEMBER_IN_ALIAS
)
6553 Status
= STATUS_SUCCESS
;
6555 if (!NT_SUCCESS(Status
))
6566 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
6567 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6570 NTSTATUS Status
= STATUS_SUCCESS
;
6572 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
6573 AliasHandle
, MembersBuffer
);
6575 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6577 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
6578 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6580 if (Status
== STATUS_MEMBER_IN_ALIAS
)
6581 Status
= STATUS_SUCCESS
;
6583 if (!NT_SUCCESS(Status
))
6594 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
6595 IN PRPC_STRING ServerName
,
6596 IN PRPC_STRING UserName
,
6597 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6598 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
6601 return STATUS_NOT_IMPLEMENTED
;
6607 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
6608 IN PRPC_UNICODE_STRING ServerName
,
6609 IN PRPC_UNICODE_STRING UserName
,
6610 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
6611 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
6612 IN
unsigned char LmPresent
,
6613 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6614 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
6617 return STATUS_NOT_IMPLEMENTED
;
6623 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
6624 IN PRPC_UNICODE_STRING Unused
,
6625 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6628 return STATUS_NOT_IMPLEMENTED
;
6634 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
6635 OUT SAMPR_HANDLE
*ServerHandle
,
6636 IN ACCESS_MASK DesiredAccess
)
6639 return STATUS_NOT_IMPLEMENTED
;
6645 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
6646 IN USER_INFORMATION_CLASS UserInformationClass
,
6647 IN PSAMPR_USER_INFO_BUFFER Buffer
)
6650 return STATUS_NOT_IMPLEMENTED
;
6656 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
6659 return STATUS_NOT_IMPLEMENTED
;
6665 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
6668 return STATUS_NOT_IMPLEMENTED
;
6674 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
6677 return STATUS_NOT_IMPLEMENTED
;
6683 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
6684 OUT SAMPR_HANDLE
*ServerHandle
,
6685 IN
unsigned long ClientRevision
,
6686 IN ACCESS_MASK DesiredAccess
)
6689 return STATUS_NOT_IMPLEMENTED
;
6695 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
6698 return STATUS_NOT_IMPLEMENTED
;
6704 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
6705 IN ACCESS_MASK DesiredAccess
,
6706 IN
unsigned long InVersion
,
6707 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
6708 OUT
unsigned long *OutVersion
,
6709 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
6710 OUT SAMPR_HANDLE
*ServerHandle
)
6713 return STATUS_NOT_IMPLEMENTED
;
6719 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
6720 IN
unsigned long Rid
,
6724 return STATUS_NOT_IMPLEMENTED
;
6730 SamrSetDSRMPassword(IN handle_t BindingHandle
,
6731 IN PRPC_UNICODE_STRING Unused
,
6732 IN
unsigned long UserId
,
6733 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
6736 return STATUS_NOT_IMPLEMENTED
;
6742 SamrValidatePassword(IN handle_t Handle
,
6743 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
6744 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
6745 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
6748 return STATUS_NOT_IMPLEMENTED
;