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
,
94 if (NT_SUCCESS(Status
))
95 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
97 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
105 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
107 PSAM_DB_OBJECT DbObject
;
108 NTSTATUS Status
= STATUS_SUCCESS
;
110 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
112 Status
= SampValidateDbObject(*SamHandle
,
116 if (Status
== STATUS_SUCCESS
)
118 Status
= SampCloseDbObject(DbObject
);
122 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
130 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
131 IN SECURITY_INFORMATION SecurityInformation
,
132 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
135 return STATUS_NOT_IMPLEMENTED
;
141 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
142 IN SECURITY_INFORMATION SecurityInformation
,
143 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
* SecurityDescriptor
)
146 return STATUS_NOT_IMPLEMENTED
;
152 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
155 return STATUS_NOT_IMPLEMENTED
;
162 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
163 IN PRPC_UNICODE_STRING Name
,
164 OUT PRPC_SID
*DomainId
)
166 PSAM_DB_OBJECT ServerObject
;
167 HANDLE DomainsKeyHandle
= NULL
;
168 HANDLE DomainKeyHandle
= NULL
;
169 WCHAR DomainKeyName
[64];
171 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
172 UNICODE_STRING DomainName
;
177 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
178 ServerHandle
, Name
, DomainId
);
180 /* Validate the server handle */
181 Status
= SampValidateDbObject(ServerHandle
,
183 SAM_SERVER_LOOKUP_DOMAIN
,
185 if (!NT_SUCCESS(Status
))
190 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
194 if (!NT_SUCCESS(Status
))
198 while (Found
== FALSE
)
200 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
204 if (!NT_SUCCESS(Status
))
206 if (Status
== STATUS_NO_MORE_ENTRIES
)
207 Status
= STATUS_NO_SUCH_DOMAIN
;
211 TRACE("Domain key name: %S\n", DomainKeyName
);
213 Status
= SampRegOpenKey(DomainsKeyHandle
,
217 if (NT_SUCCESS(Status
))
219 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
220 Status
= SampRegQueryValue(DomainKeyHandle
,
223 (PVOID
)&DomainNameString
,
225 if (NT_SUCCESS(Status
))
227 TRACE("Domain name: %S\n", DomainNameString
);
229 RtlInitUnicodeString(&DomainName
,
231 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
233 TRACE("Found it!\n");
236 Status
= SampRegQueryValue(DomainKeyHandle
,
241 if (NT_SUCCESS(Status
))
243 *DomainId
= midl_user_allocate(Length
);
245 SampRegQueryValue(DomainKeyHandle
,
251 Status
= STATUS_SUCCESS
;
257 NtClose(DomainKeyHandle
);
263 NtClose(DomainsKeyHandle
);
272 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
273 IN OUT
unsigned long *EnumerationContext
,
274 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
275 IN ULONG PreferedMaximumLength
,
276 OUT PULONG CountReturned
)
278 PSAM_DB_OBJECT ServerObject
;
279 WCHAR DomainKeyName
[64];
280 HANDLE DomainsKeyHandle
;
281 HANDLE DomainKeyHandle
;
284 ULONG RequiredLength
;
287 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
290 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
291 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
294 /* Validate the server handle */
295 Status
= SampValidateDbObject(ServerHandle
,
297 SAM_SERVER_ENUMERATE_DOMAINS
,
299 if (!NT_SUCCESS(Status
))
302 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
306 if (!NT_SUCCESS(Status
))
309 EnumIndex
= *EnumerationContext
;
315 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
319 if (!NT_SUCCESS(Status
))
322 TRACE("EnumIndex: %lu\n", EnumIndex
);
323 TRACE("Domain key name: %S\n", DomainKeyName
);
325 Status
= SampRegOpenKey(DomainsKeyHandle
,
329 TRACE("SampRegOpenKey returned %08lX\n", Status
);
330 if (NT_SUCCESS(Status
))
333 Status
= SampRegQueryValue(DomainKeyHandle
,
338 TRACE("SampRegQueryValue returned %08lX\n", Status
);
339 if (NT_SUCCESS(Status
))
341 TRACE("Data length: %lu\n", DataLength
);
343 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
346 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
350 NtClose(DomainKeyHandle
);
356 TRACE("EnumCount: %lu\n", EnumCount
);
357 TRACE("RequiredLength: %lu\n", RequiredLength
);
359 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
360 if (EnumBuffer
== NULL
)
362 Status
= STATUS_INSUFFICIENT_RESOURCES
;
366 EnumBuffer
->EntriesRead
= EnumCount
;
367 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
368 if (EnumBuffer
->Buffer
== NULL
)
370 Status
= STATUS_INSUFFICIENT_RESOURCES
;
374 EnumIndex
= *EnumerationContext
;
375 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
377 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
381 if (!NT_SUCCESS(Status
))
384 TRACE("EnumIndex: %lu\n", EnumIndex
);
385 TRACE("Domain key name: %S\n", DomainKeyName
);
387 Status
= SampRegOpenKey(DomainsKeyHandle
,
391 TRACE("SampRegOpenKey returned %08lX\n", Status
);
392 if (NT_SUCCESS(Status
))
395 Status
= SampRegQueryValue(DomainKeyHandle
,
400 TRACE("SampRegQueryValue returned %08lX\n", Status
);
401 if (NT_SUCCESS(Status
))
403 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
404 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
405 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
406 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
407 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
409 NtClose(DomainKeyHandle
);
410 Status
= STATUS_INSUFFICIENT_RESOURCES
;
414 Status
= SampRegQueryValue(DomainKeyHandle
,
417 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
419 TRACE("SampRegQueryValue returned %08lX\n", Status
);
420 if (NT_SUCCESS(Status
))
422 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
426 NtClose(DomainKeyHandle
);
428 if (!NT_SUCCESS(Status
))
433 if (NT_SUCCESS(Status
))
435 *EnumerationContext
+= EnumCount
;
436 *Buffer
= EnumBuffer
;
437 *CountReturned
= EnumCount
;
441 if (!NT_SUCCESS(Status
))
443 *EnumerationContext
= 0;
447 if (EnumBuffer
!= NULL
)
449 if (EnumBuffer
->Buffer
!= NULL
)
451 if (EnumBuffer
->EntriesRead
!= 0)
453 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
455 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
456 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
460 midl_user_free(EnumBuffer
->Buffer
);
463 midl_user_free(EnumBuffer
);
467 NtClose(DomainsKeyHandle
);
475 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
476 IN ACCESS_MASK DesiredAccess
,
477 IN PRPC_SID DomainId
,
478 OUT SAMPR_HANDLE
*DomainHandle
)
480 PSAM_DB_OBJECT ServerObject
;
481 PSAM_DB_OBJECT DomainObject
;
484 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
485 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
487 /* Validate the server handle */
488 Status
= SampValidateDbObject(ServerHandle
,
490 SAM_SERVER_LOOKUP_DOMAIN
,
492 if (!NT_SUCCESS(Status
))
495 /* Validate the Domain SID */
496 if ((DomainId
->Revision
!= SID_REVISION
) ||
497 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
498 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
499 return STATUS_INVALID_PARAMETER
;
501 /* Open the domain object */
502 if ((DomainId
->SubAuthorityCount
== 1) &&
503 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
505 /* Builtin domain object */
506 TRACE("Opening the builtin domain object.\n");
508 Status
= SampOpenDbObject(ServerObject
,
515 else if ((DomainId
->SubAuthorityCount
== 4) &&
516 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
518 /* Account domain object */
519 TRACE("Opening the account domain object.\n");
521 /* FIXME: Check the account domain sub authorities!!! */
523 Status
= SampOpenDbObject(ServerObject
,
532 /* No vaild domain SID */
533 Status
= STATUS_INVALID_PARAMETER
;
536 if (NT_SUCCESS(Status
))
537 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
539 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
546 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
547 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
549 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
550 SAM_DOMAIN_FIXED_DATA FixedData
;
556 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
557 if (InfoBuffer
== NULL
)
558 return STATUS_INSUFFICIENT_RESOURCES
;
560 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
561 Status
= SampGetObjectAttribute(DomainObject
,
566 if (!NT_SUCCESS(Status
))
569 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
570 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
571 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
572 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
573 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
574 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
575 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
577 *Buffer
= InfoBuffer
;
580 if (!NT_SUCCESS(Status
))
582 if (InfoBuffer
!= NULL
)
584 midl_user_free(InfoBuffer
);
593 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
594 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
596 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
597 SAM_DOMAIN_FIXED_DATA FixedData
;
603 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
604 if (InfoBuffer
== NULL
)
605 return STATUS_INSUFFICIENT_RESOURCES
;
607 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
608 Status
= SampGetObjectAttribute(DomainObject
,
613 if (!NT_SUCCESS(Status
))
616 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
617 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
618 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
619 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
620 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
621 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
622 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
624 /* Get the OemInformation string */
625 Status
= SampGetObjectAttributeString(DomainObject
,
627 &InfoBuffer
->General
.OemInformation
);
628 if (!NT_SUCCESS(Status
))
630 TRACE("Status 0x%08lx\n", Status
);
634 /* Get the Name string */
635 Status
= SampGetObjectAttributeString(DomainObject
,
637 &InfoBuffer
->General
.DomainName
);
638 if (!NT_SUCCESS(Status
))
640 TRACE("Status 0x%08lx\n", Status
);
644 /* Get the ReplicaSourceNodeName string */
645 Status
= SampGetObjectAttributeString(DomainObject
,
646 L
"ReplicaSourceNodeName",
647 &InfoBuffer
->General
.ReplicaSourceNodeName
);
648 if (!NT_SUCCESS(Status
))
650 TRACE("Status 0x%08lx\n", Status
);
654 InfoBuffer
->General
.UserCount
= 0; /* FIXME */
655 InfoBuffer
->General
.GroupCount
= 0; /* FIXME */
656 InfoBuffer
->General
.AliasCount
= 0; /* FIXME */
658 *Buffer
= InfoBuffer
;
661 if (!NT_SUCCESS(Status
))
663 if (InfoBuffer
!= NULL
)
665 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
666 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
668 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
669 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
671 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
672 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
674 midl_user_free(InfoBuffer
);
683 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
684 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
686 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
687 SAM_DOMAIN_FIXED_DATA FixedData
;
693 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
694 if (InfoBuffer
== NULL
)
695 return STATUS_INSUFFICIENT_RESOURCES
;
697 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
698 Status
= SampGetObjectAttribute(DomainObject
,
703 if (!NT_SUCCESS(Status
))
706 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
707 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
709 *Buffer
= InfoBuffer
;
712 if (!NT_SUCCESS(Status
))
714 if (InfoBuffer
!= NULL
)
716 midl_user_free(InfoBuffer
);
725 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
726 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
728 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
733 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
734 if (InfoBuffer
== NULL
)
735 return STATUS_INSUFFICIENT_RESOURCES
;
737 /* Get the OemInformation string */
738 Status
= SampGetObjectAttributeString(DomainObject
,
740 &InfoBuffer
->Oem
.OemInformation
);
741 if (!NT_SUCCESS(Status
))
743 TRACE("Status 0x%08lx\n", Status
);
747 *Buffer
= InfoBuffer
;
750 if (!NT_SUCCESS(Status
))
752 if (InfoBuffer
!= NULL
)
754 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
755 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
757 midl_user_free(InfoBuffer
);
766 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
767 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
769 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
774 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
775 if (InfoBuffer
== NULL
)
776 return STATUS_INSUFFICIENT_RESOURCES
;
778 /* Get the Name string */
779 Status
= SampGetObjectAttributeString(DomainObject
,
781 &InfoBuffer
->Name
.DomainName
);
782 if (!NT_SUCCESS(Status
))
784 TRACE("Status 0x%08lx\n", Status
);
788 *Buffer
= InfoBuffer
;
791 if (!NT_SUCCESS(Status
))
793 if (InfoBuffer
!= NULL
)
795 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
796 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
798 midl_user_free(InfoBuffer
);
807 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
808 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
810 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
815 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
816 if (InfoBuffer
== NULL
)
817 return STATUS_INSUFFICIENT_RESOURCES
;
819 /* Get the ReplicaSourceNodeName string */
820 Status
= SampGetObjectAttributeString(DomainObject
,
821 L
"ReplicaSourceNodeName",
822 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
823 if (!NT_SUCCESS(Status
))
825 TRACE("Status 0x%08lx\n", Status
);
829 *Buffer
= InfoBuffer
;
832 if (!NT_SUCCESS(Status
))
834 if (InfoBuffer
!= NULL
)
836 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
837 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
839 midl_user_free(InfoBuffer
);
848 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
849 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
851 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
852 SAM_DOMAIN_FIXED_DATA FixedData
;
858 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
859 if (InfoBuffer
== NULL
)
860 return STATUS_INSUFFICIENT_RESOURCES
;
862 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
863 Status
= SampGetObjectAttribute(DomainObject
,
868 if (!NT_SUCCESS(Status
))
871 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
873 *Buffer
= InfoBuffer
;
876 if (!NT_SUCCESS(Status
))
878 if (InfoBuffer
!= NULL
)
880 midl_user_free(InfoBuffer
);
889 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
890 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
892 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
893 SAM_DOMAIN_FIXED_DATA FixedData
;
899 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
900 if (InfoBuffer
== NULL
)
901 return STATUS_INSUFFICIENT_RESOURCES
;
903 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
904 Status
= SampGetObjectAttribute(DomainObject
,
909 if (!NT_SUCCESS(Status
))
912 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
913 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
914 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
915 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
917 *Buffer
= InfoBuffer
;
920 if (!NT_SUCCESS(Status
))
922 if (InfoBuffer
!= NULL
)
924 midl_user_free(InfoBuffer
);
933 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
934 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
936 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
937 SAM_DOMAIN_FIXED_DATA FixedData
;
943 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
944 if (InfoBuffer
== NULL
)
945 return STATUS_INSUFFICIENT_RESOURCES
;
947 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
948 Status
= SampGetObjectAttribute(DomainObject
,
953 if (!NT_SUCCESS(Status
))
956 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
958 *Buffer
= InfoBuffer
;
961 if (!NT_SUCCESS(Status
))
963 if (InfoBuffer
!= NULL
)
965 midl_user_free(InfoBuffer
);
974 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
975 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
977 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
978 SAM_DOMAIN_FIXED_DATA FixedData
;
984 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
985 if (InfoBuffer
== NULL
)
986 return STATUS_INSUFFICIENT_RESOURCES
;
988 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
989 Status
= SampGetObjectAttribute(DomainObject
,
994 if (!NT_SUCCESS(Status
))
997 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
998 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
999 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1000 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1001 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1002 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1003 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1005 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1006 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1007 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1009 /* Get the OemInformation string */
1010 Status
= SampGetObjectAttributeString(DomainObject
,
1012 &InfoBuffer
->General2
.I1
.OemInformation
);
1013 if (!NT_SUCCESS(Status
))
1015 TRACE("Status 0x%08lx\n", Status
);
1019 /* Get the Name string */
1020 Status
= SampGetObjectAttributeString(DomainObject
,
1022 &InfoBuffer
->General2
.I1
.DomainName
);
1023 if (!NT_SUCCESS(Status
))
1025 TRACE("Status 0x%08lx\n", Status
);
1029 /* Get the ReplicaSourceNodeName string */
1030 Status
= SampGetObjectAttributeString(DomainObject
,
1031 L
"ReplicaSourceNodeName",
1032 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1033 if (!NT_SUCCESS(Status
))
1035 TRACE("Status 0x%08lx\n", Status
);
1039 InfoBuffer
->General2
.I1
.UserCount
= 0; /* FIXME */
1040 InfoBuffer
->General2
.I1
.GroupCount
= 0; /* FIXME */
1041 InfoBuffer
->General2
.I1
.AliasCount
= 0; /* FIXME */
1043 *Buffer
= InfoBuffer
;
1046 if (!NT_SUCCESS(Status
))
1048 if (InfoBuffer
!= NULL
)
1050 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1051 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1053 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1054 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1056 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1057 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1059 midl_user_free(InfoBuffer
);
1068 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1069 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1071 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1072 SAM_DOMAIN_FIXED_DATA FixedData
;
1078 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1079 if (InfoBuffer
== NULL
)
1080 return STATUS_INSUFFICIENT_RESOURCES
;
1082 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1083 Status
= SampGetObjectAttribute(DomainObject
,
1088 if (!NT_SUCCESS(Status
))
1091 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1092 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1093 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1095 *Buffer
= InfoBuffer
;
1098 if (!NT_SUCCESS(Status
))
1100 if (InfoBuffer
!= NULL
)
1102 midl_user_free(InfoBuffer
);
1111 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1112 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1114 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1115 SAM_DOMAIN_FIXED_DATA FixedData
;
1121 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1122 if (InfoBuffer
== NULL
)
1123 return STATUS_INSUFFICIENT_RESOURCES
;
1125 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1126 Status
= SampGetObjectAttribute(DomainObject
,
1131 if (!NT_SUCCESS(Status
))
1134 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1135 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1136 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1137 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1138 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1139 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1141 *Buffer
= InfoBuffer
;
1144 if (!NT_SUCCESS(Status
))
1146 if (InfoBuffer
!= NULL
)
1148 midl_user_free(InfoBuffer
);
1159 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1160 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1161 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1163 PSAM_DB_OBJECT DomainObject
;
1164 ACCESS_MASK DesiredAccess
;
1167 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1168 DomainHandle
, DomainInformationClass
, Buffer
);
1170 switch (DomainInformationClass
)
1172 case DomainPasswordInformation
:
1173 case DomainLockoutInformation
:
1174 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1177 case DomainGeneralInformation
:
1178 case DomainLogoffInformation
:
1179 case DomainOemInformation
:
1180 case DomainNameInformation
:
1181 case DomainReplicationInformation
:
1182 case DomainServerRoleInformation
:
1183 case DomainModifiedInformation
:
1184 case DomainStateInformation
:
1185 case DomainModifiedInformation2
:
1186 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1189 case DomainGeneralInformation2
:
1190 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1191 DOMAIN_READ_OTHER_PARAMETERS
;
1195 return STATUS_INVALID_INFO_CLASS
;
1198 /* Validate the server handle */
1199 Status
= SampValidateDbObject(DomainHandle
,
1203 if (!NT_SUCCESS(Status
))
1206 switch (DomainInformationClass
)
1208 case DomainPasswordInformation
:
1209 Status
= SampQueryDomainPassword(DomainObject
,
1213 case DomainGeneralInformation
:
1214 Status
= SampQueryDomainGeneral(DomainObject
,
1218 case DomainLogoffInformation
:
1219 Status
= SampQueryDomainLogoff(DomainObject
,
1223 case DomainOemInformation
:
1224 Status
= SampQueryDomainOem(DomainObject
,
1228 case DomainNameInformation
:
1229 Status
= SampQueryDomainName(DomainObject
,
1233 case DomainReplicationInformation
:
1234 Status
= SampQueryDomainReplication(DomainObject
,
1238 case DomainServerRoleInformation
:
1239 Status
= SampQueryDomainServerRole(DomainObject
,
1243 case DomainModifiedInformation
:
1244 Status
= SampQueryDomainModified(DomainObject
,
1248 case DomainStateInformation
:
1249 Status
= SampQueryDomainState(DomainObject
,
1253 case DomainGeneralInformation2
:
1254 Status
= SampQueryDomainGeneral2(DomainObject
,
1258 case DomainLockoutInformation
:
1259 Status
= SampQueryDomainLockout(DomainObject
,
1263 case DomainModifiedInformation2
:
1264 Status
= SampQueryDomainModified2(DomainObject
,
1269 Status
= STATUS_NOT_IMPLEMENTED
;
1277 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1278 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1280 SAM_DOMAIN_FIXED_DATA FixedData
;
1284 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1285 Status
= SampGetObjectAttribute(DomainObject
,
1290 if (!NT_SUCCESS(Status
))
1293 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1294 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1295 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1296 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1297 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1298 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1299 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1301 Status
= SampSetObjectAttribute(DomainObject
,
1313 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1314 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1316 SAM_DOMAIN_FIXED_DATA FixedData
;
1320 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1321 Status
= SampGetObjectAttribute(DomainObject
,
1326 if (!NT_SUCCESS(Status
))
1329 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1330 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1332 Status
= SampSetObjectAttribute(DomainObject
,
1344 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1345 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1347 SAM_DOMAIN_FIXED_DATA FixedData
;
1351 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1352 Status
= SampGetObjectAttribute(DomainObject
,
1357 if (!NT_SUCCESS(Status
))
1360 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1362 Status
= SampSetObjectAttribute(DomainObject
,
1374 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1375 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1377 SAM_DOMAIN_FIXED_DATA FixedData
;
1381 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1382 Status
= SampGetObjectAttribute(DomainObject
,
1387 if (!NT_SUCCESS(Status
))
1390 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1392 Status
= SampSetObjectAttribute(DomainObject
,
1404 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1405 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1407 SAM_DOMAIN_FIXED_DATA FixedData
;
1411 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1412 Status
= SampGetObjectAttribute(DomainObject
,
1417 if (!NT_SUCCESS(Status
))
1420 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1421 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1422 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1424 Status
= SampSetObjectAttribute(DomainObject
,
1438 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1439 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1440 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1442 PSAM_DB_OBJECT DomainObject
;
1443 ACCESS_MASK DesiredAccess
;
1446 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1447 DomainHandle
, DomainInformationClass
, DomainInformation
);
1449 switch (DomainInformationClass
)
1451 case DomainPasswordInformation
:
1452 case DomainLockoutInformation
:
1453 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1456 case DomainLogoffInformation
:
1457 case DomainOemInformation
:
1458 case DomainNameInformation
:
1459 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1462 case DomainReplicationInformation
:
1463 case DomainServerRoleInformation
:
1464 case DomainStateInformation
:
1465 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1469 return STATUS_INVALID_INFO_CLASS
;
1472 /* Validate the server handle */
1473 Status
= SampValidateDbObject(DomainHandle
,
1477 if (!NT_SUCCESS(Status
))
1480 switch (DomainInformationClass
)
1482 case DomainPasswordInformation
:
1483 Status
= SampSetDomainPassword(DomainObject
,
1487 case DomainLogoffInformation
:
1488 Status
= SampSetDomainLogoff(DomainObject
,
1492 case DomainOemInformation
:
1493 Status
= SampSetObjectAttribute(DomainObject
,
1496 DomainInformation
->Oem
.OemInformation
.Buffer
,
1497 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1500 case DomainNameInformation
:
1501 Status
= SampSetObjectAttribute(DomainObject
,
1504 DomainInformation
->Name
.DomainName
.Buffer
,
1505 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1508 case DomainReplicationInformation
:
1509 Status
= SampSetObjectAttribute(DomainObject
,
1510 L
"ReplicaSourceNodeName",
1512 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1513 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1516 case DomainServerRoleInformation
:
1517 Status
= SampSetDomainServerRole(DomainObject
,
1521 case DomainStateInformation
:
1522 Status
= SampSetDomainState(DomainObject
,
1526 case DomainLockoutInformation
:
1527 Status
= SampSetDomainLockout(DomainObject
,
1532 Status
= STATUS_NOT_IMPLEMENTED
;
1541 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1542 IN PRPC_UNICODE_STRING Name
,
1543 IN ACCESS_MASK DesiredAccess
,
1544 OUT SAMPR_HANDLE
*GroupHandle
,
1545 OUT
unsigned long *RelativeId
)
1547 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1548 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1549 SAM_GROUP_FIXED_DATA FixedGroupData
;
1550 PSAM_DB_OBJECT DomainObject
;
1551 PSAM_DB_OBJECT GroupObject
;
1557 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1558 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1560 /* Validate the domain handle */
1561 Status
= SampValidateDbObject(DomainHandle
,
1563 DOMAIN_CREATE_GROUP
,
1565 if (!NT_SUCCESS(Status
))
1567 TRACE("failed with status 0x%08lx\n", Status
);
1571 /* Check if the group name already exists in the domain */
1572 Status
= SampCheckAccountNameInDomain(DomainObject
,
1574 if (!NT_SUCCESS(Status
))
1576 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1577 Name
->Buffer
, Status
);
1581 /* Get the fixed domain attributes */
1582 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1583 Status
= SampGetObjectAttribute(DomainObject
,
1586 (PVOID
)&FixedDomainData
,
1588 if (!NT_SUCCESS(Status
))
1590 TRACE("failed with status 0x%08lx\n", Status
);
1594 /* Increment the NextRid attribute */
1595 ulRid
= FixedDomainData
.NextRid
;
1596 FixedDomainData
.NextRid
++;
1598 /* Store the fixed domain attributes */
1599 Status
= SampSetObjectAttribute(DomainObject
,
1604 if (!NT_SUCCESS(Status
))
1606 TRACE("failed with status 0x%08lx\n", Status
);
1610 TRACE("RID: %lx\n", ulRid
);
1612 /* Convert the RID into a string (hex) */
1613 swprintf(szRid
, L
"%08lX", ulRid
);
1615 /* Create the group object */
1616 Status
= SampCreateDbObject(DomainObject
,
1622 if (!NT_SUCCESS(Status
))
1624 TRACE("failed with status 0x%08lx\n", Status
);
1628 /* Add the account name of the user object */
1629 Status
= SampSetAccountNameInDomain(DomainObject
,
1633 if (!NT_SUCCESS(Status
))
1635 TRACE("failed with status 0x%08lx\n", Status
);
1639 /* Initialize fixed user data */
1640 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1641 FixedGroupData
.Version
= 1;
1643 FixedGroupData
.GroupId
= ulRid
;
1645 /* Set fixed user data attribute */
1646 Status
= SampSetObjectAttribute(GroupObject
,
1649 (LPVOID
)&FixedGroupData
,
1650 sizeof(SAM_GROUP_FIXED_DATA
));
1651 if (!NT_SUCCESS(Status
))
1653 TRACE("failed with status 0x%08lx\n", Status
);
1657 /* Set the Name attribute */
1658 Status
= SampSetObjectAttribute(GroupObject
,
1661 (LPVOID
)Name
->Buffer
,
1662 Name
->MaximumLength
);
1663 if (!NT_SUCCESS(Status
))
1665 TRACE("failed with status 0x%08lx\n", Status
);
1669 /* Set the AdminComment attribute */
1670 Status
= SampSetObjectAttribute(GroupObject
,
1674 EmptyString
.MaximumLength
);
1675 if (!NT_SUCCESS(Status
))
1677 TRACE("failed with status 0x%08lx\n", Status
);
1681 if (NT_SUCCESS(Status
))
1683 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1684 *RelativeId
= ulRid
;
1687 TRACE("returns with status 0x%08lx\n", Status
);
1696 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1697 IN OUT
unsigned long *EnumerationContext
,
1698 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1699 IN
unsigned long PreferedMaximumLength
,
1700 OUT
unsigned long *CountReturned
)
1702 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1703 PSAM_DB_OBJECT DomainObject
;
1704 HANDLE GroupsKeyHandle
= NULL
;
1705 HANDLE NamesKeyHandle
= NULL
;
1706 WCHAR GroupName
[64];
1708 ULONG EnumCount
= 0;
1709 ULONG RequiredLength
= 0;
1714 BOOLEAN MoreEntries
= FALSE
;
1717 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1718 DomainHandle
, EnumerationContext
, Buffer
,
1719 PreferedMaximumLength
, CountReturned
);
1721 /* Validate the domain handle */
1722 Status
= SampValidateDbObject(DomainHandle
,
1724 DOMAIN_LIST_ACCOUNTS
,
1726 if (!NT_SUCCESS(Status
))
1729 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1733 if (!NT_SUCCESS(Status
))
1736 Status
= SampRegOpenKey(GroupsKeyHandle
,
1740 if (!NT_SUCCESS(Status
))
1745 EnumIndex
= *EnumerationContext
;
1749 NameLength
= 64 * sizeof(WCHAR
);
1750 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1757 if (!NT_SUCCESS(Status
))
1759 if (Status
== STATUS_NO_MORE_ENTRIES
)
1760 Status
= STATUS_SUCCESS
;
1764 TRACE("EnumIndex: %lu\n", EnumIndex
);
1765 TRACE("Group name: %S\n", GroupName
);
1766 TRACE("Name length: %lu\n", NameLength
);
1768 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
1774 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
1780 TRACE("EnumCount: %lu\n", EnumCount
);
1781 TRACE("RequiredLength: %lu\n", RequiredLength
);
1783 if (!NT_SUCCESS(Status
))
1786 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
1787 if (EnumBuffer
== NULL
)
1789 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1793 EnumBuffer
->EntriesRead
= EnumCount
;
1797 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
1798 if (EnumBuffer
->Buffer
== NULL
)
1800 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1806 EnumIndex
= *EnumerationContext
;
1807 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
1809 NameLength
= 64 * sizeof(WCHAR
);
1810 DataLength
= sizeof(ULONG
);
1811 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1818 if (!NT_SUCCESS(Status
))
1820 if (Status
== STATUS_NO_MORE_ENTRIES
)
1821 Status
= STATUS_SUCCESS
;
1825 TRACE("EnumIndex: %lu\n", EnumIndex
);
1826 TRACE("Group name: %S\n", GroupName
);
1827 TRACE("Name length: %lu\n", NameLength
);
1828 TRACE("RID: %lu\n", Rid
);
1830 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
1832 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
1833 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
1835 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
1837 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
1838 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
1840 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1844 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
1846 EnumBuffer
->Buffer
[i
].Name
.Length
);
1851 if (NT_SUCCESS(Status
))
1853 *EnumerationContext
+= EnumCount
;
1854 *Buffer
= EnumBuffer
;
1855 *CountReturned
= EnumCount
;
1859 *EnumerationContext
= 0;
1863 if (EnumBuffer
!= NULL
)
1865 if (EnumBuffer
->Buffer
!= NULL
)
1867 if (EnumBuffer
->EntriesRead
!= 0)
1869 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
1871 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
1872 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
1876 midl_user_free(EnumBuffer
->Buffer
);
1879 midl_user_free(EnumBuffer
);
1883 if (NamesKeyHandle
!= NULL
)
1884 SampRegCloseKey(NamesKeyHandle
);
1886 if (GroupsKeyHandle
!= NULL
)
1887 SampRegCloseKey(GroupsKeyHandle
);
1889 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
1890 Status
= STATUS_MORE_ENTRIES
;
1899 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
1900 IN PRPC_UNICODE_STRING Name
,
1901 IN ACCESS_MASK DesiredAccess
,
1902 OUT SAMPR_HANDLE
*UserHandle
,
1903 OUT
unsigned long *RelativeId
)
1905 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1906 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1907 SAM_USER_FIXED_DATA FixedUserData
;
1908 PSAM_DB_OBJECT DomainObject
;
1909 PSAM_DB_OBJECT UserObject
;
1915 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
1916 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
1919 Name
->Length
== 0 ||
1920 Name
->Buffer
== NULL
||
1921 UserHandle
== NULL
||
1923 return STATUS_INVALID_PARAMETER
;
1925 /* Validate the domain handle */
1926 Status
= SampValidateDbObject(DomainHandle
,
1930 if (!NT_SUCCESS(Status
))
1932 TRACE("failed with status 0x%08lx\n", Status
);
1936 /* Check if the user name already exists in the domain */
1937 Status
= SampCheckAccountNameInDomain(DomainObject
,
1939 if (!NT_SUCCESS(Status
))
1941 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
1942 Name
->Buffer
, Status
);
1946 /* Get the fixed domain attributes */
1947 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1948 Status
= SampGetObjectAttribute(DomainObject
,
1951 (PVOID
)&FixedDomainData
,
1953 if (!NT_SUCCESS(Status
))
1955 TRACE("failed with status 0x%08lx\n", Status
);
1959 /* Increment the NextRid attribute */
1960 ulRid
= FixedDomainData
.NextRid
;
1961 FixedDomainData
.NextRid
++;
1963 /* Store the fixed domain attributes */
1964 Status
= SampSetObjectAttribute(DomainObject
,
1969 if (!NT_SUCCESS(Status
))
1971 TRACE("failed with status 0x%08lx\n", Status
);
1975 TRACE("RID: %lx\n", ulRid
);
1977 /* Convert the RID into a string (hex) */
1978 swprintf(szRid
, L
"%08lX", ulRid
);
1980 /* Create the user object */
1981 Status
= SampCreateDbObject(DomainObject
,
1987 if (!NT_SUCCESS(Status
))
1989 TRACE("failed with status 0x%08lx\n", Status
);
1993 /* Add the account name for the user object */
1994 Status
= SampSetAccountNameInDomain(DomainObject
,
1998 if (!NT_SUCCESS(Status
))
2000 TRACE("failed with status 0x%08lx\n", Status
);
2004 /* Initialize fixed user data */
2005 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2006 FixedUserData
.Version
= 1;
2007 FixedUserData
.LastLogon
.QuadPart
= 0;
2008 FixedUserData
.LastLogoff
.QuadPart
= 0;
2009 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2010 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2011 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2012 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2013 FixedUserData
.UserId
= ulRid
;
2014 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2015 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2016 USER_PASSWORD_NOT_REQUIRED
|
2017 USER_NORMAL_ACCOUNT
;
2019 /* Set fixed user data attribute */
2020 Status
= SampSetObjectAttribute(UserObject
,
2023 (LPVOID
)&FixedUserData
,
2024 sizeof(SAM_USER_FIXED_DATA
));
2025 if (!NT_SUCCESS(Status
))
2027 TRACE("failed with status 0x%08lx\n", Status
);
2031 /* Set the Name attribute */
2032 Status
= SampSetObjectAttribute(UserObject
,
2035 (LPVOID
)Name
->Buffer
,
2036 Name
->MaximumLength
);
2037 if (!NT_SUCCESS(Status
))
2039 TRACE("failed with status 0x%08lx\n", Status
);
2043 /* Set the FullName attribute */
2044 Status
= SampSetObjectAttribute(UserObject
,
2048 EmptyString
.MaximumLength
);
2049 if (!NT_SUCCESS(Status
))
2051 TRACE("failed with status 0x%08lx\n", Status
);
2055 /* Set the HomeDirectory attribute */
2056 Status
= SampSetObjectAttribute(UserObject
,
2060 EmptyString
.MaximumLength
);
2061 if (!NT_SUCCESS(Status
))
2063 TRACE("failed with status 0x%08lx\n", Status
);
2067 /* Set the HomeDirectoryDrive attribute */
2068 Status
= SampSetObjectAttribute(UserObject
,
2069 L
"HomeDirectoryDrive",
2072 EmptyString
.MaximumLength
);
2073 if (!NT_SUCCESS(Status
))
2075 TRACE("failed with status 0x%08lx\n", Status
);
2079 /* Set the ScriptPath attribute */
2080 Status
= SampSetObjectAttribute(UserObject
,
2084 EmptyString
.MaximumLength
);
2085 if (!NT_SUCCESS(Status
))
2087 TRACE("failed with status 0x%08lx\n", Status
);
2091 /* Set the ProfilePath attribute */
2092 Status
= SampSetObjectAttribute(UserObject
,
2096 EmptyString
.MaximumLength
);
2097 if (!NT_SUCCESS(Status
))
2099 TRACE("failed with status 0x%08lx\n", Status
);
2103 /* Set the AdminComment attribute */
2104 Status
= SampSetObjectAttribute(UserObject
,
2108 EmptyString
.MaximumLength
);
2109 if (!NT_SUCCESS(Status
))
2111 TRACE("failed with status 0x%08lx\n", Status
);
2115 /* Set the UserComment attribute */
2116 Status
= SampSetObjectAttribute(UserObject
,
2120 EmptyString
.MaximumLength
);
2121 if (!NT_SUCCESS(Status
))
2123 TRACE("failed with status 0x%08lx\n", Status
);
2127 /* Set the WorkStations attribute */
2128 Status
= SampSetObjectAttribute(UserObject
,
2132 EmptyString
.MaximumLength
);
2133 if (!NT_SUCCESS(Status
))
2135 TRACE("failed with status 0x%08lx\n", Status
);
2139 /* FIXME: Set default user attributes */
2141 if (NT_SUCCESS(Status
))
2143 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2144 *RelativeId
= ulRid
;
2147 TRACE("returns with status 0x%08lx\n", Status
);
2156 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2157 IN OUT
unsigned long *EnumerationContext
,
2158 IN
unsigned long UserAccountControl
,
2159 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2160 IN
unsigned long PreferedMaximumLength
,
2161 OUT
unsigned long *CountReturned
)
2163 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2164 PSAM_DB_OBJECT DomainObject
;
2165 HANDLE UsersKeyHandle
= NULL
;
2166 HANDLE NamesKeyHandle
= NULL
;
2169 ULONG EnumCount
= 0;
2170 ULONG RequiredLength
= 0;
2175 BOOLEAN MoreEntries
= FALSE
;
2178 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2179 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2180 PreferedMaximumLength
, CountReturned
);
2182 /* Validate the domain handle */
2183 Status
= SampValidateDbObject(DomainHandle
,
2185 DOMAIN_LIST_ACCOUNTS
,
2187 if (!NT_SUCCESS(Status
))
2190 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2194 if (!NT_SUCCESS(Status
))
2197 Status
= SampRegOpenKey(UsersKeyHandle
,
2201 if (!NT_SUCCESS(Status
))
2206 EnumIndex
= *EnumerationContext
;
2210 NameLength
= 64 * sizeof(WCHAR
);
2211 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2218 if (!NT_SUCCESS(Status
))
2220 if (Status
== STATUS_NO_MORE_ENTRIES
)
2221 Status
= STATUS_SUCCESS
;
2225 TRACE("EnumIndex: %lu\n", EnumIndex
);
2226 TRACE("User name: %S\n", UserName
);
2227 TRACE("Name length: %lu\n", NameLength
);
2229 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2235 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2241 TRACE("EnumCount: %lu\n", EnumCount
);
2242 TRACE("RequiredLength: %lu\n", RequiredLength
);
2244 if (!NT_SUCCESS(Status
))
2247 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2248 if (EnumBuffer
== NULL
)
2250 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2254 EnumBuffer
->EntriesRead
= EnumCount
;
2258 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2259 if (EnumBuffer
->Buffer
== NULL
)
2261 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2267 EnumIndex
= *EnumerationContext
;
2268 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2270 NameLength
= 64 * sizeof(WCHAR
);
2271 DataLength
= sizeof(ULONG
);
2272 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2279 if (!NT_SUCCESS(Status
))
2281 if (Status
== STATUS_NO_MORE_ENTRIES
)
2282 Status
= STATUS_SUCCESS
;
2286 TRACE("EnumIndex: %lu\n", EnumIndex
);
2287 TRACE("User name: %S\n", UserName
);
2288 TRACE("Name length: %lu\n", NameLength
);
2289 TRACE("RID: %lu\n", Rid
);
2291 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2293 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2294 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2296 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2298 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2299 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2301 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2305 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2307 EnumBuffer
->Buffer
[i
].Name
.Length
);
2312 if (NT_SUCCESS(Status
))
2314 *EnumerationContext
+= EnumCount
;
2315 *Buffer
= EnumBuffer
;
2316 *CountReturned
= EnumCount
;
2320 *EnumerationContext
= 0;
2324 if (EnumBuffer
!= NULL
)
2326 if (EnumBuffer
->Buffer
!= NULL
)
2328 if (EnumBuffer
->EntriesRead
!= 0)
2330 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2332 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2333 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2337 midl_user_free(EnumBuffer
->Buffer
);
2340 midl_user_free(EnumBuffer
);
2344 if (NamesKeyHandle
!= NULL
)
2345 SampRegCloseKey(NamesKeyHandle
);
2347 if (UsersKeyHandle
!= NULL
)
2348 SampRegCloseKey(UsersKeyHandle
);
2350 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2351 Status
= STATUS_MORE_ENTRIES
;
2360 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2361 IN PRPC_UNICODE_STRING AccountName
,
2362 IN ACCESS_MASK DesiredAccess
,
2363 OUT SAMPR_HANDLE
*AliasHandle
,
2364 OUT
unsigned long *RelativeId
)
2366 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2367 PSAM_DB_OBJECT DomainObject
;
2368 PSAM_DB_OBJECT AliasObject
;
2369 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2375 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2376 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2378 /* Validate the domain handle */
2379 Status
= SampValidateDbObject(DomainHandle
,
2381 DOMAIN_CREATE_ALIAS
,
2383 if (!NT_SUCCESS(Status
))
2385 TRACE("failed with status 0x%08lx\n", Status
);
2389 /* Check if the alias name already exists in the domain */
2390 Status
= SampCheckAccountNameInDomain(DomainObject
,
2391 AccountName
->Buffer
);
2392 if (!NT_SUCCESS(Status
))
2394 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2395 AccountName
->Buffer
, Status
);
2399 /* Get the fixed domain attributes */
2400 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2401 Status
= SampGetObjectAttribute(DomainObject
,
2404 (PVOID
)&FixedDomainData
,
2406 if (!NT_SUCCESS(Status
))
2408 TRACE("failed with status 0x%08lx\n", Status
);
2412 /* Increment the NextRid attribute */
2413 ulRid
= FixedDomainData
.NextRid
;
2414 FixedDomainData
.NextRid
++;
2416 /* Store the fixed domain attributes */
2417 Status
= SampSetObjectAttribute(DomainObject
,
2422 if (!NT_SUCCESS(Status
))
2424 TRACE("failed with status 0x%08lx\n", Status
);
2428 TRACE("RID: %lx\n", ulRid
);
2430 /* Convert the RID into a string (hex) */
2431 swprintf(szRid
, L
"%08lX", ulRid
);
2433 /* Create the alias object */
2434 Status
= SampCreateDbObject(DomainObject
,
2440 if (!NT_SUCCESS(Status
))
2442 TRACE("failed with status 0x%08lx\n", Status
);
2446 /* Add the account name for the alias object */
2447 Status
= SampSetAccountNameInDomain(DomainObject
,
2449 AccountName
->Buffer
,
2451 if (!NT_SUCCESS(Status
))
2453 TRACE("failed with status 0x%08lx\n", Status
);
2457 /* Set the Name attribute */
2458 Status
= SampSetObjectAttribute(AliasObject
,
2461 (LPVOID
)AccountName
->Buffer
,
2462 AccountName
->MaximumLength
);
2463 if (!NT_SUCCESS(Status
))
2465 TRACE("failed with status 0x%08lx\n", Status
);
2469 /* Set the Description attribute */
2470 Status
= SampSetObjectAttribute(AliasObject
,
2474 EmptyString
.MaximumLength
);
2475 if (!NT_SUCCESS(Status
))
2477 TRACE("failed with status 0x%08lx\n", Status
);
2481 if (NT_SUCCESS(Status
))
2483 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2484 *RelativeId
= ulRid
;
2487 TRACE("returns with status 0x%08lx\n", Status
);
2496 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2497 IN OUT
unsigned long *EnumerationContext
,
2498 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2499 IN
unsigned long PreferedMaximumLength
,
2500 OUT
unsigned long *CountReturned
)
2502 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2503 PSAM_DB_OBJECT DomainObject
;
2504 HANDLE AliasesKeyHandle
= NULL
;
2505 HANDLE NamesKeyHandle
= NULL
;
2506 WCHAR AliasName
[64];
2508 ULONG EnumCount
= 0;
2509 ULONG RequiredLength
= 0;
2514 BOOLEAN MoreEntries
= FALSE
;
2517 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2518 DomainHandle
, EnumerationContext
, Buffer
,
2519 PreferedMaximumLength
, CountReturned
);
2521 /* Validate the domain handle */
2522 Status
= SampValidateDbObject(DomainHandle
,
2524 DOMAIN_LIST_ACCOUNTS
,
2526 if (!NT_SUCCESS(Status
))
2529 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2533 if (!NT_SUCCESS(Status
))
2536 Status
= SampRegOpenKey(AliasesKeyHandle
,
2540 if (!NT_SUCCESS(Status
))
2545 EnumIndex
= *EnumerationContext
;
2549 NameLength
= 64 * sizeof(WCHAR
);
2550 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2557 if (!NT_SUCCESS(Status
))
2559 if (Status
== STATUS_NO_MORE_ENTRIES
)
2560 Status
= STATUS_SUCCESS
;
2564 TRACE("EnumIndex: %lu\n", EnumIndex
);
2565 TRACE("Alias name: %S\n", AliasName
);
2566 TRACE("Name length: %lu\n", NameLength
);
2568 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2574 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2580 TRACE("EnumCount: %lu\n", EnumCount
);
2581 TRACE("RequiredLength: %lu\n", RequiredLength
);
2583 if (!NT_SUCCESS(Status
))
2586 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2587 if (EnumBuffer
== NULL
)
2589 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2593 EnumBuffer
->EntriesRead
= EnumCount
;
2597 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2598 if (EnumBuffer
->Buffer
== NULL
)
2600 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2606 EnumIndex
= *EnumerationContext
;
2607 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2609 NameLength
= 64 * sizeof(WCHAR
);
2610 DataLength
= sizeof(ULONG
);
2611 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2618 if (!NT_SUCCESS(Status
))
2620 if (Status
== STATUS_NO_MORE_ENTRIES
)
2621 Status
= STATUS_SUCCESS
;
2625 TRACE("EnumIndex: %lu\n", EnumIndex
);
2626 TRACE("Alias name: %S\n", AliasName
);
2627 TRACE("Name length: %lu\n", NameLength
);
2628 TRACE("RID: %lu\n", Rid
);
2630 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2632 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2633 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2635 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2637 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2638 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2640 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2644 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2646 EnumBuffer
->Buffer
[i
].Name
.Length
);
2651 if (NT_SUCCESS(Status
))
2653 *EnumerationContext
+= EnumCount
;
2654 *Buffer
= EnumBuffer
;
2655 *CountReturned
= EnumCount
;
2659 *EnumerationContext
= 0;
2663 if (EnumBuffer
!= NULL
)
2665 if (EnumBuffer
->Buffer
!= NULL
)
2667 if (EnumBuffer
->EntriesRead
!= 0)
2669 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2671 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2672 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2676 midl_user_free(EnumBuffer
->Buffer
);
2679 midl_user_free(EnumBuffer
);
2683 if (NamesKeyHandle
!= NULL
)
2684 SampRegCloseKey(NamesKeyHandle
);
2686 if (AliasesKeyHandle
!= NULL
)
2687 SampRegCloseKey(AliasesKeyHandle
);
2689 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2690 Status
= STATUS_MORE_ENTRIES
;
2699 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2700 IN PSAMPR_PSID_ARRAY SidArray
,
2701 OUT PSAMPR_ULONG_ARRAY Membership
)
2703 PSAM_DB_OBJECT DomainObject
;
2704 HANDLE AliasesKeyHandle
= NULL
;
2705 HANDLE MembersKeyHandle
= NULL
;
2706 HANDLE MemberKeyHandle
= NULL
;
2707 LPWSTR MemberSidString
= NULL
;
2708 PULONG RidArray
= NULL
;
2709 ULONG MaxSidCount
= 0;
2715 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2716 DomainHandle
, SidArray
, Membership
);
2718 /* Validate the domain handle */
2719 Status
= SampValidateDbObject(DomainHandle
,
2723 if (!NT_SUCCESS(Status
))
2726 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2730 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2731 if (!NT_SUCCESS(Status
))
2734 Status
= SampRegOpenKey(AliasesKeyHandle
,
2738 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2739 if (!NT_SUCCESS(Status
))
2742 for (i
= 0; i
< SidArray
->Count
; i
++)
2744 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2745 TRACE("Open %S\n", MemberSidString
);
2747 Status
= SampRegOpenKey(MembersKeyHandle
,
2751 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2752 if (NT_SUCCESS(Status
))
2754 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2757 if (NT_SUCCESS(Status
))
2759 TRACE("Found %lu values\n", ValueCount
);
2760 MaxSidCount
+= ValueCount
;
2764 NtClose(MemberKeyHandle
);
2767 LocalFree(MemberSidString
);
2770 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
2771 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
2772 if (RidArray
== NULL
)
2774 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2778 for (i
= 0; i
< SidArray
->Count
; i
++)
2780 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2781 TRACE("Open %S\n", MemberSidString
);
2783 Status
= SampRegOpenKey(MembersKeyHandle
,
2787 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2788 if (NT_SUCCESS(Status
))
2790 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2793 if (NT_SUCCESS(Status
))
2795 TRACE("Found %lu values\n", ValueCount
);
2797 for (j
= 0; j
< ValueCount
; j
++)
2799 DataLength
= sizeof(ULONG
);
2800 Status
= SampRegEnumerateValue(MemberKeyHandle
,
2805 (PVOID
)&RidArray
[j
],
2810 NtClose(MemberKeyHandle
);
2813 LocalFree(MemberSidString
);
2818 if (NT_SUCCESS(Status
))
2820 Membership
->Count
= MaxSidCount
;
2821 Membership
->Element
= RidArray
;
2825 if (RidArray
!= NULL
)
2826 midl_user_free(RidArray
);
2829 if (MembersKeyHandle
!= NULL
)
2830 NtClose(MembersKeyHandle
);
2832 if (MembersKeyHandle
!= NULL
)
2833 NtClose(MembersKeyHandle
);
2835 if (AliasesKeyHandle
!= NULL
)
2836 NtClose(AliasesKeyHandle
);
2845 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
2847 IN RPC_UNICODE_STRING Names
[],
2848 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
2849 OUT PSAMPR_ULONG_ARRAY Use
)
2851 PSAM_DB_OBJECT DomainObject
;
2852 HANDLE AccountsKeyHandle
;
2853 HANDLE NamesKeyHandle
;
2854 ULONG MappedCount
= 0;
2860 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
2861 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
2863 /* Validate the domain handle */
2864 Status
= SampValidateDbObject(DomainHandle
,
2868 if (!NT_SUCCESS(Status
))
2870 TRACE("failed with status 0x%08lx\n", Status
);
2874 RelativeIds
->Count
= 0;
2878 return STATUS_SUCCESS
;
2880 /* Allocate the relative IDs array */
2881 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
2882 if (RelativeIds
->Element
== NULL
)
2884 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2888 /* Allocate the use array */
2889 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
2890 if (Use
->Element
== NULL
)
2892 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2896 RelativeIds
->Count
= Count
;
2899 for (i
= 0; i
< Count
; i
++)
2901 TRACE("Name: %S\n", Names
[i
].Buffer
);
2905 /* Lookup aliases */
2906 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2909 &AccountsKeyHandle
);
2910 if (NT_SUCCESS(Status
))
2912 Status
= SampRegOpenKey(AccountsKeyHandle
,
2916 if (NT_SUCCESS(Status
))
2918 DataLength
= sizeof(ULONG
);
2919 Status
= SampRegQueryValue(NamesKeyHandle
,
2925 SampRegCloseKey(NamesKeyHandle
);
2928 SampRegCloseKey(AccountsKeyHandle
);
2931 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
2934 /* Return alias account */
2935 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
2937 TRACE("Rid: %lu\n", RelativeId
);
2938 RelativeIds
->Element
[i
] = RelativeId
;
2939 Use
->Element
[i
] = SidTypeAlias
;
2945 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2948 &AccountsKeyHandle
);
2949 if (NT_SUCCESS(Status
))
2951 Status
= SampRegOpenKey(AccountsKeyHandle
,
2955 if (NT_SUCCESS(Status
))
2957 DataLength
= sizeof(ULONG
);
2958 Status
= SampRegQueryValue(NamesKeyHandle
,
2964 SampRegCloseKey(NamesKeyHandle
);
2967 SampRegCloseKey(AccountsKeyHandle
);
2970 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
2973 /* Return group account */
2974 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
2976 TRACE("Rid: %lu\n", RelativeId
);
2977 RelativeIds
->Element
[i
] = RelativeId
;
2978 Use
->Element
[i
] = SidTypeGroup
;
2984 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2987 &AccountsKeyHandle
);
2988 if (NT_SUCCESS(Status
))
2990 Status
= SampRegOpenKey(AccountsKeyHandle
,
2994 if (NT_SUCCESS(Status
))
2996 DataLength
= sizeof(ULONG
);
2997 Status
= SampRegQueryValue(NamesKeyHandle
,
3003 SampRegCloseKey(NamesKeyHandle
);
3006 SampRegCloseKey(AccountsKeyHandle
);
3009 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3012 /* Return user account */
3013 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3015 TRACE("Rid: %lu\n", RelativeId
);
3016 RelativeIds
->Element
[i
] = RelativeId
;
3017 Use
->Element
[i
] = SidTypeUser
;
3022 /* Return unknown account */
3023 RelativeIds
->Element
[i
] = 0;
3024 Use
->Element
[i
] = SidTypeUnknown
;
3028 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3029 Status
= STATUS_SUCCESS
;
3031 if (NT_SUCCESS(Status
))
3033 if (MappedCount
== 0)
3034 Status
= STATUS_NONE_MAPPED
;
3035 else if (MappedCount
< Count
)
3036 Status
= STATUS_SOME_NOT_MAPPED
;
3040 if (RelativeIds
->Element
!= NULL
)
3042 midl_user_free(RelativeIds
->Element
);
3043 RelativeIds
->Element
= NULL
;
3046 RelativeIds
->Count
= 0;
3048 if (Use
->Element
!= NULL
)
3050 midl_user_free(Use
->Element
);
3051 Use
->Element
= NULL
;
3057 TRACE("Returned Status %lx\n", Status
);
3066 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3068 IN ULONG
*RelativeIds
,
3069 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3070 OUT PSAMPR_ULONG_ARRAY Use
)
3072 PSAM_DB_OBJECT DomainObject
;
3074 HANDLE AccountsKeyHandle
;
3075 HANDLE AccountKeyHandle
;
3076 ULONG MappedCount
= 0;
3081 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3082 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3084 /* Validate the domain handle */
3085 Status
= SampValidateDbObject(DomainHandle
,
3089 if (!NT_SUCCESS(Status
))
3091 TRACE("failed with status 0x%08lx\n", Status
);
3099 return STATUS_SUCCESS
;
3101 /* Allocate the names array */
3102 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3103 if (Names
->Element
== NULL
)
3105 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3109 /* Allocate the use array */
3110 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3111 if (Use
->Element
== NULL
)
3113 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3117 Names
->Count
= Count
;
3120 for (i
= 0; i
< Count
; i
++)
3122 TRACE("RID: %lu\n", RelativeIds
[i
]);
3124 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3126 /* Lookup aliases */
3127 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3130 &AccountsKeyHandle
);
3131 if (NT_SUCCESS(Status
))
3133 Status
= SampRegOpenKey(AccountsKeyHandle
,
3137 if (NT_SUCCESS(Status
))
3140 Status
= SampRegQueryValue(AccountKeyHandle
,
3145 if (NT_SUCCESS(Status
))
3147 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3148 if (Names
->Element
[i
].Buffer
== NULL
)
3149 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3151 if (NT_SUCCESS(Status
))
3153 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3154 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3156 Status
= SampRegQueryValue(AccountKeyHandle
,
3159 Names
->Element
[i
].Buffer
,
3164 SampRegCloseKey(AccountKeyHandle
);
3167 SampRegCloseKey(AccountsKeyHandle
);
3170 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3173 /* Return alias account */
3174 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3176 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3177 Use
->Element
[i
] = SidTypeAlias
;
3183 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3186 &AccountsKeyHandle
);
3187 if (NT_SUCCESS(Status
))
3189 Status
= SampRegOpenKey(AccountsKeyHandle
,
3193 if (NT_SUCCESS(Status
))
3196 Status
= SampRegQueryValue(AccountKeyHandle
,
3201 if (NT_SUCCESS(Status
))
3203 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3204 if (Names
->Element
[i
].Buffer
== NULL
)
3205 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3207 if (NT_SUCCESS(Status
))
3209 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3210 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3212 Status
= SampRegQueryValue(AccountKeyHandle
,
3215 Names
->Element
[i
].Buffer
,
3220 SampRegCloseKey(AccountKeyHandle
);
3223 SampRegCloseKey(AccountsKeyHandle
);
3226 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3229 /* Return group account */
3230 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3232 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3233 Use
->Element
[i
] = SidTypeGroup
;
3239 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3242 &AccountsKeyHandle
);
3243 if (NT_SUCCESS(Status
))
3245 Status
= SampRegOpenKey(AccountsKeyHandle
,
3249 if (NT_SUCCESS(Status
))
3252 Status
= SampRegQueryValue(AccountKeyHandle
,
3257 if (NT_SUCCESS(Status
))
3259 TRACE("DataLength: %lu\n", DataLength
);
3261 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3262 if (Names
->Element
[i
].Buffer
== NULL
)
3263 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3265 if (NT_SUCCESS(Status
))
3267 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3268 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3270 Status
= SampRegQueryValue(AccountKeyHandle
,
3273 Names
->Element
[i
].Buffer
,
3278 SampRegCloseKey(AccountKeyHandle
);
3281 SampRegCloseKey(AccountsKeyHandle
);
3284 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3287 /* Return user account */
3288 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3290 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3291 Use
->Element
[i
] = SidTypeUser
;
3296 /* Return unknown account */
3297 Use
->Element
[i
] = SidTypeUnknown
;
3301 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3302 Status
= STATUS_SUCCESS
;
3304 if (NT_SUCCESS(Status
))
3306 if (MappedCount
== 0)
3307 Status
= STATUS_NONE_MAPPED
;
3308 else if (MappedCount
< Count
)
3309 Status
= STATUS_SOME_NOT_MAPPED
;
3313 if (Names
->Element
!= NULL
)
3315 for (i
= 0; i
< Count
; i
++)
3317 if (Names
->Element
[i
].Buffer
!= NULL
)
3318 midl_user_free(Names
->Element
[i
].Buffer
);
3321 midl_user_free(Names
->Element
);
3322 Names
->Element
= NULL
;
3327 if (Use
->Element
!= NULL
)
3329 midl_user_free(Use
->Element
);
3330 Use
->Element
= NULL
;
3343 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3344 IN ACCESS_MASK DesiredAccess
,
3345 IN
unsigned long GroupId
,
3346 OUT SAMPR_HANDLE
*GroupHandle
)
3348 PSAM_DB_OBJECT DomainObject
;
3349 PSAM_DB_OBJECT GroupObject
;
3353 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3354 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3356 /* Validate the domain handle */
3357 Status
= SampValidateDbObject(DomainHandle
,
3361 if (!NT_SUCCESS(Status
))
3363 TRACE("failed with status 0x%08lx\n", Status
);
3367 /* Convert the RID into a string (hex) */
3368 swprintf(szRid
, L
"%08lX", GroupId
);
3370 /* Create the group object */
3371 Status
= SampOpenDbObject(DomainObject
,
3377 if (!NT_SUCCESS(Status
))
3379 TRACE("failed with status 0x%08lx\n", Status
);
3383 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3385 return STATUS_SUCCESS
;
3390 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3391 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3393 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3394 HANDLE MembersKeyHandle
= NULL
;
3395 SAM_GROUP_FIXED_DATA FixedData
;
3401 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3402 if (InfoBuffer
== NULL
)
3403 return STATUS_INSUFFICIENT_RESOURCES
;
3405 Status
= SampGetObjectAttributeString(GroupObject
,
3407 &InfoBuffer
->General
.Name
);
3408 if (!NT_SUCCESS(Status
))
3410 TRACE("Status 0x%08lx\n", Status
);
3414 Status
= SampGetObjectAttributeString(GroupObject
,
3416 &InfoBuffer
->General
.AdminComment
);
3417 if (!NT_SUCCESS(Status
))
3419 TRACE("Status 0x%08lx\n", Status
);
3423 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3424 Status
= SampGetObjectAttribute(GroupObject
,
3429 if (!NT_SUCCESS(Status
))
3432 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3434 /* Open the Members subkey */
3435 Status
= SampRegOpenKey(GroupObject
->KeyHandle
,
3439 if (!NT_SUCCESS(Status
))
3441 TRACE("Status 0x%08lx\n", Status
);
3445 /* Retrieve the number of members of the alias */
3446 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3448 &InfoBuffer
->General
.MemberCount
);
3449 if (!NT_SUCCESS(Status
))
3451 TRACE("Status 0x%08lx\n", Status
);
3455 *Buffer
= InfoBuffer
;
3458 if (MembersKeyHandle
!= NULL
)
3459 SampRegCloseKey(MembersKeyHandle
);
3461 if (!NT_SUCCESS(Status
))
3463 if (InfoBuffer
!= NULL
)
3465 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3466 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3468 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3469 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3471 midl_user_free(InfoBuffer
);
3480 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3481 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3483 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3488 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3489 if (InfoBuffer
== NULL
)
3490 return STATUS_INSUFFICIENT_RESOURCES
;
3492 Status
= SampGetObjectAttributeString(GroupObject
,
3494 &InfoBuffer
->Name
.Name
);
3495 if (!NT_SUCCESS(Status
))
3497 TRACE("Status 0x%08lx\n", Status
);
3501 *Buffer
= InfoBuffer
;
3504 if (!NT_SUCCESS(Status
))
3506 if (InfoBuffer
!= NULL
)
3508 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3509 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3511 midl_user_free(InfoBuffer
);
3520 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3521 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3523 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3524 SAM_GROUP_FIXED_DATA FixedData
;
3530 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3531 if (InfoBuffer
== NULL
)
3532 return STATUS_INSUFFICIENT_RESOURCES
;
3534 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3535 Status
= SampGetObjectAttribute(GroupObject
,
3540 if (!NT_SUCCESS(Status
))
3543 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3545 *Buffer
= InfoBuffer
;
3548 if (!NT_SUCCESS(Status
))
3550 if (InfoBuffer
!= NULL
)
3552 midl_user_free(InfoBuffer
);
3561 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3562 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3564 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3569 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3570 if (InfoBuffer
== NULL
)
3571 return STATUS_INSUFFICIENT_RESOURCES
;
3573 Status
= SampGetObjectAttributeString(GroupObject
,
3575 &InfoBuffer
->AdminComment
.AdminComment
);
3576 if (!NT_SUCCESS(Status
))
3578 TRACE("Status 0x%08lx\n", Status
);
3582 *Buffer
= InfoBuffer
;
3585 if (!NT_SUCCESS(Status
))
3587 if (InfoBuffer
!= NULL
)
3589 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3590 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3592 midl_user_free(InfoBuffer
);
3603 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3604 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3605 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3607 PSAM_DB_OBJECT GroupObject
;
3610 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
3611 GroupHandle
, GroupInformationClass
, Buffer
);
3613 /* Validate the group handle */
3614 Status
= SampValidateDbObject(GroupHandle
,
3616 GROUP_READ_INFORMATION
,
3618 if (!NT_SUCCESS(Status
))
3621 switch (GroupInformationClass
)
3623 case GroupGeneralInformation
:
3624 Status
= SampQueryGroupGeneral(GroupObject
,
3628 case GroupNameInformation
:
3629 Status
= SampQueryGroupName(GroupObject
,
3633 case GroupAttributeInformation
:
3634 Status
= SampQueryGroupAttribute(GroupObject
,
3638 case GroupAdminCommentInformation
:
3639 Status
= SampQueryGroupAdminComment(GroupObject
,
3644 Status
= STATUS_INVALID_INFO_CLASS
;
3653 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3654 PSAMPR_GROUP_INFO_BUFFER Buffer
)
3656 SAM_GROUP_FIXED_DATA FixedData
;
3660 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3661 Status
= SampGetObjectAttribute(GroupObject
,
3666 if (!NT_SUCCESS(Status
))
3669 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
3671 Status
= SampSetObjectAttribute(GroupObject
,
3685 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3686 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3687 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
3689 PSAM_DB_OBJECT GroupObject
;
3692 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
3693 GroupHandle
, GroupInformationClass
, Buffer
);
3695 /* Validate the group handle */
3696 Status
= SampValidateDbObject(GroupHandle
,
3698 GROUP_WRITE_ACCOUNT
,
3700 if (!NT_SUCCESS(Status
))
3703 switch (GroupInformationClass
)
3705 case GroupNameInformation
:
3706 Status
= SampSetObjectAttribute(GroupObject
,
3709 Buffer
->Name
.Name
.Buffer
,
3710 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3713 case GroupAttributeInformation
:
3714 Status
= SampSetGroupAttribute(GroupObject
,
3718 case GroupAdminCommentInformation
:
3719 Status
= SampSetObjectAttribute(GroupObject
,
3722 Buffer
->AdminComment
.AdminComment
.Buffer
,
3723 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
3727 Status
= STATUS_INVALID_INFO_CLASS
;
3738 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
3739 IN
unsigned long MemberId
,
3740 IN
unsigned long Attributes
)
3743 return STATUS_NOT_IMPLEMENTED
;
3749 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
3752 return STATUS_NOT_IMPLEMENTED
;
3758 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
3759 IN
unsigned long MemberId
)
3762 return STATUS_NOT_IMPLEMENTED
;
3768 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
3769 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
3772 return STATUS_NOT_IMPLEMENTED
;
3778 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
3779 IN
unsigned long MemberId
,
3780 IN
unsigned long Attributes
)
3783 return STATUS_NOT_IMPLEMENTED
;
3790 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
3791 IN ACCESS_MASK DesiredAccess
,
3793 OUT SAMPR_HANDLE
*AliasHandle
)
3795 PSAM_DB_OBJECT DomainObject
;
3796 PSAM_DB_OBJECT AliasObject
;
3800 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
3801 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
3803 /* Validate the domain handle */
3804 Status
= SampValidateDbObject(DomainHandle
,
3808 if (!NT_SUCCESS(Status
))
3810 TRACE("failed with status 0x%08lx\n", Status
);
3814 /* Convert the RID into a string (hex) */
3815 swprintf(szRid
, L
"%08lX", AliasId
);
3817 /* Create the alias object */
3818 Status
= SampOpenDbObject(DomainObject
,
3824 if (!NT_SUCCESS(Status
))
3826 TRACE("failed with status 0x%08lx\n", Status
);
3830 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
3832 return STATUS_SUCCESS
;
3837 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
3838 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3840 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3841 HANDLE MembersKeyHandle
= NULL
;
3846 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3847 if (InfoBuffer
== NULL
)
3848 return STATUS_INSUFFICIENT_RESOURCES
;
3850 Status
= SampGetObjectAttributeString(AliasObject
,
3852 &InfoBuffer
->General
.Name
);
3853 if (!NT_SUCCESS(Status
))
3855 TRACE("Status 0x%08lx\n", Status
);
3859 Status
= SampGetObjectAttributeString(AliasObject
,
3861 &InfoBuffer
->General
.AdminComment
);
3862 if (!NT_SUCCESS(Status
))
3864 TRACE("Status 0x%08lx\n", Status
);
3868 /* Open the Members subkey */
3869 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
3873 if (NT_SUCCESS(Status
))
3875 /* Retrieve the number of members of the alias */
3876 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3878 &InfoBuffer
->General
.MemberCount
);
3879 if (!NT_SUCCESS(Status
))
3881 TRACE("Status 0x%08lx\n", Status
);
3885 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3887 InfoBuffer
->General
.MemberCount
= 0;
3888 Status
= STATUS_SUCCESS
;
3892 TRACE("Status 0x%08lx\n", Status
);
3896 *Buffer
= InfoBuffer
;
3899 if (MembersKeyHandle
!= NULL
)
3900 SampRegCloseKey(MembersKeyHandle
);
3902 if (!NT_SUCCESS(Status
))
3904 if (InfoBuffer
!= NULL
)
3906 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3907 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3909 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3910 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3912 midl_user_free(InfoBuffer
);
3921 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
3922 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3924 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3929 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3930 if (InfoBuffer
== NULL
)
3931 return STATUS_INSUFFICIENT_RESOURCES
;
3933 Status
= SampGetObjectAttributeString(AliasObject
,
3935 &InfoBuffer
->Name
.Name
);
3936 if (!NT_SUCCESS(Status
))
3938 TRACE("Status 0x%08lx\n", Status
);
3942 *Buffer
= InfoBuffer
;
3945 if (!NT_SUCCESS(Status
))
3947 if (InfoBuffer
!= NULL
)
3949 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3950 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3952 midl_user_free(InfoBuffer
);
3961 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
3962 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3964 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3969 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3970 if (InfoBuffer
== NULL
)
3971 return STATUS_INSUFFICIENT_RESOURCES
;
3973 Status
= SampGetObjectAttributeString(AliasObject
,
3975 &InfoBuffer
->AdminComment
.AdminComment
);
3976 if (!NT_SUCCESS(Status
))
3978 TRACE("Status 0x%08lx\n", Status
);
3982 *Buffer
= InfoBuffer
;
3985 if (!NT_SUCCESS(Status
))
3987 if (InfoBuffer
!= NULL
)
3989 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3990 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3992 midl_user_free(InfoBuffer
);
4003 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4004 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4005 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4007 PSAM_DB_OBJECT AliasObject
;
4010 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4011 AliasHandle
, AliasInformationClass
, Buffer
);
4013 /* Validate the alias handle */
4014 Status
= SampValidateDbObject(AliasHandle
,
4016 ALIAS_READ_INFORMATION
,
4018 if (!NT_SUCCESS(Status
))
4021 switch (AliasInformationClass
)
4023 case AliasGeneralInformation
:
4024 Status
= SampQueryAliasGeneral(AliasObject
,
4028 case AliasNameInformation
:
4029 Status
= SampQueryAliasName(AliasObject
,
4033 case AliasAdminCommentInformation
:
4034 Status
= SampQueryAliasAdminComment(AliasObject
,
4039 Status
= STATUS_INVALID_INFO_CLASS
;
4050 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4051 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4052 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4054 PSAM_DB_OBJECT AliasObject
;
4057 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4058 AliasHandle
, AliasInformationClass
, Buffer
);
4060 /* Validate the alias handle */
4061 Status
= SampValidateDbObject(AliasHandle
,
4063 ALIAS_WRITE_ACCOUNT
,
4065 if (!NT_SUCCESS(Status
))
4068 switch (AliasInformationClass
)
4070 case AliasNameInformation
:
4071 Status
= SampSetObjectAttribute(AliasObject
,
4074 Buffer
->Name
.Name
.Buffer
,
4075 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4078 case AliasAdminCommentInformation
:
4079 Status
= SampSetObjectAttribute(AliasObject
,
4082 Buffer
->AdminComment
.AdminComment
.Buffer
,
4083 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4087 Status
= STATUS_INVALID_INFO_CLASS
;
4098 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4101 return STATUS_NOT_IMPLEMENTED
;
4108 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4109 IN PRPC_SID MemberId
)
4111 PSAM_DB_OBJECT AliasObject
;
4112 LPWSTR MemberIdString
= NULL
;
4113 HANDLE MembersKeyHandle
= NULL
;
4114 HANDLE MemberKeyHandle
= NULL
;
4115 ULONG MemberIdLength
;
4118 TRACE("SamrAddMemberToAlias(%p %p)\n",
4119 AliasHandle
, MemberId
);
4121 /* Validate the alias handle */
4122 Status
= SampValidateDbObject(AliasHandle
,
4126 if (!NT_SUCCESS(Status
))
4128 TRACE("failed with status 0x%08lx\n", Status
);
4132 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4133 TRACE("Member SID: %S\n", MemberIdString
);
4135 MemberIdLength
= RtlLengthSid(MemberId
);
4137 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4141 if (!NT_SUCCESS(Status
))
4143 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4147 Status
= SampRegSetValue(MembersKeyHandle
,
4152 if (!NT_SUCCESS(Status
))
4154 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4158 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4162 if (!NT_SUCCESS(Status
))
4164 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4168 Status
= SampRegSetValue(MemberKeyHandle
,
4173 if (!NT_SUCCESS(Status
))
4175 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4180 if (MemberKeyHandle
!= NULL
)
4181 SampRegCloseKey(MemberKeyHandle
);
4183 if (MembersKeyHandle
!= NULL
)
4184 SampRegCloseKey(MembersKeyHandle
);
4186 if (MemberIdString
!= NULL
)
4187 LocalFree(MemberIdString
);
4196 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4197 IN PRPC_SID MemberId
)
4199 PSAM_DB_OBJECT AliasObject
;
4200 LPWSTR MemberIdString
= NULL
;
4201 HANDLE MembersKeyHandle
= NULL
;
4202 HANDLE MemberKeyHandle
= NULL
;
4206 TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
4207 AliasHandle
, MemberId
);
4209 /* Validate the alias handle */
4210 Status
= SampValidateDbObject(AliasHandle
,
4212 ALIAS_REMOVE_MEMBER
,
4214 if (!NT_SUCCESS(Status
))
4216 TRACE("failed with status 0x%08lx\n", Status
);
4220 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4221 TRACE("Member SID: %S\n", MemberIdString
);
4223 Status
= SampRegOpenKey(AliasObject
->MembersKeyHandle
,
4225 KEY_WRITE
| KEY_QUERY_VALUE
,
4227 if (!NT_SUCCESS(Status
))
4229 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4233 Status
= SampRegDeleteValue(MemberKeyHandle
,
4235 if (!NT_SUCCESS(Status
))
4237 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4241 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
4244 if (!NT_SUCCESS(Status
))
4246 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4250 if (ulValueCount
== 0)
4252 SampRegCloseKey(MemberKeyHandle
);
4253 MemberKeyHandle
= NULL
;
4255 Status
= SampRegDeleteKey(AliasObject
->MembersKeyHandle
,
4257 if (!NT_SUCCESS(Status
))
4259 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4264 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4266 KEY_WRITE
| KEY_QUERY_VALUE
,
4268 if (!NT_SUCCESS(Status
))
4270 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4274 Status
= SampRegDeleteValue(MembersKeyHandle
,
4276 if (!NT_SUCCESS(Status
))
4278 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4282 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4285 if (!NT_SUCCESS(Status
))
4287 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4291 if (ulValueCount
== 0)
4293 SampRegCloseKey(MembersKeyHandle
);
4294 MembersKeyHandle
= NULL
;
4296 Status
= SampRegDeleteKey(AliasObject
->KeyHandle
,
4298 if (!NT_SUCCESS(Status
))
4300 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4306 if (MemberKeyHandle
!= NULL
)
4307 SampRegCloseKey(MemberKeyHandle
);
4309 if (MembersKeyHandle
!= NULL
)
4310 SampRegCloseKey(MembersKeyHandle
);
4312 if (MemberIdString
!= NULL
)
4313 LocalFree(MemberIdString
);
4322 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4323 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4325 PSAM_DB_OBJECT AliasObject
;
4326 HANDLE MembersKeyHandle
= NULL
;
4327 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4328 ULONG ValueCount
= 0;
4333 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4334 AliasHandle
, Members
);
4336 /* Validate the alias handle */
4337 Status
= SampValidateDbObject(AliasHandle
,
4341 if (!NT_SUCCESS(Status
))
4343 ERR("failed with status 0x%08lx\n", Status
);
4347 /* Open the members key of the alias objct */
4348 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4352 if (!NT_SUCCESS(Status
))
4354 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4358 /* Get the number of members */
4359 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4362 if (!NT_SUCCESS(Status
))
4364 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4368 /* Allocate the member array */
4369 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4370 if (MemberArray
== NULL
)
4372 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4376 /* Enumerate the members */
4380 /* Get the size of the next SID */
4382 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4389 if (!NT_SUCCESS(Status
))
4391 if (Status
== STATUS_NO_MORE_ENTRIES
)
4392 Status
= STATUS_SUCCESS
;
4396 /* Allocate a buffer for the SID */
4397 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4398 if (MemberArray
[Index
].SidPointer
== NULL
)
4400 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4404 /* Read the SID into the buffer */
4405 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4410 (PVOID
)MemberArray
[Index
].SidPointer
,
4412 if (!NT_SUCCESS(Status
))
4420 /* Return the number of members and the member array */
4421 if (NT_SUCCESS(Status
))
4423 Members
->Count
= ValueCount
;
4424 Members
->Sids
= MemberArray
;
4428 /* Clean up the members array and the SID buffers if something failed */
4429 if (!NT_SUCCESS(Status
))
4431 if (MemberArray
!= NULL
)
4433 for (Index
= 0; Index
< ValueCount
; Index
++)
4435 if (MemberArray
[Index
].SidPointer
!= NULL
)
4436 midl_user_free(MemberArray
[Index
].SidPointer
);
4439 midl_user_free(MemberArray
);
4443 /* Close the members key */
4444 if (MembersKeyHandle
!= NULL
)
4445 SampRegCloseKey(MembersKeyHandle
);
4454 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
4455 IN ACCESS_MASK DesiredAccess
,
4456 IN
unsigned long UserId
,
4457 OUT SAMPR_HANDLE
*UserHandle
)
4459 PSAM_DB_OBJECT DomainObject
;
4460 PSAM_DB_OBJECT UserObject
;
4464 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
4465 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
4467 /* Validate the domain handle */
4468 Status
= SampValidateDbObject(DomainHandle
,
4472 if (!NT_SUCCESS(Status
))
4474 TRACE("failed with status 0x%08lx\n", Status
);
4478 /* Convert the RID into a string (hex) */
4479 swprintf(szRid
, L
"%08lX", UserId
);
4481 /* Create the user object */
4482 Status
= SampOpenDbObject(DomainObject
,
4488 if (!NT_SUCCESS(Status
))
4490 TRACE("failed with status 0x%08lx\n", Status
);
4494 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
4496 return STATUS_SUCCESS
;
4503 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
4506 return STATUS_NOT_IMPLEMENTED
;
4512 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
4513 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4515 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4516 SAM_USER_FIXED_DATA FixedData
;
4522 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4523 if (InfoBuffer
== NULL
)
4524 return STATUS_INSUFFICIENT_RESOURCES
;
4526 Length
= sizeof(SAM_USER_FIXED_DATA
);
4527 Status
= SampGetObjectAttribute(UserObject
,
4532 if (!NT_SUCCESS(Status
))
4535 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4537 /* Get the Name string */
4538 Status
= SampGetObjectAttributeString(UserObject
,
4540 &InfoBuffer
->General
.UserName
);
4541 if (!NT_SUCCESS(Status
))
4543 TRACE("Status 0x%08lx\n", Status
);
4547 /* Get the FullName string */
4548 Status
= SampGetObjectAttributeString(UserObject
,
4550 &InfoBuffer
->General
.FullName
);
4551 if (!NT_SUCCESS(Status
))
4553 TRACE("Status 0x%08lx\n", Status
);
4557 /* Get the AdminComment string */
4558 Status
= SampGetObjectAttributeString(UserObject
,
4560 &InfoBuffer
->General
.AdminComment
);
4561 if (!NT_SUCCESS(Status
))
4563 TRACE("Status 0x%08lx\n", Status
);
4567 /* Get the UserComment string */
4568 Status
= SampGetObjectAttributeString(UserObject
,
4570 &InfoBuffer
->General
.UserComment
);
4571 if (!NT_SUCCESS(Status
))
4573 TRACE("Status 0x%08lx\n", Status
);
4577 *Buffer
= InfoBuffer
;
4580 if (!NT_SUCCESS(Status
))
4582 if (InfoBuffer
!= NULL
)
4584 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
4585 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
4587 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
4588 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
4590 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4591 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4593 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
4594 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
4596 midl_user_free(InfoBuffer
);
4606 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
4607 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4609 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4610 SAM_USER_FIXED_DATA FixedData
;
4616 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4617 if (InfoBuffer
== NULL
)
4618 return STATUS_INSUFFICIENT_RESOURCES
;
4620 Length
= sizeof(SAM_USER_FIXED_DATA
);
4621 Status
= SampGetObjectAttribute(UserObject
,
4626 if (!NT_SUCCESS(Status
))
4629 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
4630 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
4632 /* Get the UserComment string */
4633 Status
= SampGetObjectAttributeString(UserObject
,
4635 &InfoBuffer
->Preferences
.UserComment
);
4636 if (!NT_SUCCESS(Status
))
4638 TRACE("Status 0x%08lx\n", Status
);
4642 *Buffer
= InfoBuffer
;
4645 if (!NT_SUCCESS(Status
))
4647 if (InfoBuffer
!= NULL
)
4649 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
4650 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
4652 midl_user_free(InfoBuffer
);
4662 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
4663 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4665 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4666 SAM_USER_FIXED_DATA FixedData
;
4672 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4673 if (InfoBuffer
== NULL
)
4674 return STATUS_INSUFFICIENT_RESOURCES
;
4676 Length
= sizeof(SAM_USER_FIXED_DATA
);
4677 Status
= SampGetObjectAttribute(UserObject
,
4682 if (!NT_SUCCESS(Status
))
4685 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
4686 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4687 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4688 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4689 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4690 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4691 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4692 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4693 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4694 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
4695 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
4697 // OLD_LARGE_INTEGER PasswordCanChange;
4698 // OLD_LARGE_INTEGER PasswordMustChange;
4700 /* Get the Name string */
4701 Status
= SampGetObjectAttributeString(UserObject
,
4703 &InfoBuffer
->Logon
.UserName
);
4704 if (!NT_SUCCESS(Status
))
4706 TRACE("Status 0x%08lx\n", Status
);
4710 /* Get the FullName string */
4711 Status
= SampGetObjectAttributeString(UserObject
,
4713 &InfoBuffer
->Logon
.FullName
);
4714 if (!NT_SUCCESS(Status
))
4716 TRACE("Status 0x%08lx\n", Status
);
4720 /* Get the HomeDirectory string */
4721 Status
= SampGetObjectAttributeString(UserObject
,
4723 &InfoBuffer
->Logon
.HomeDirectory
);
4724 if (!NT_SUCCESS(Status
))
4726 TRACE("Status 0x%08lx\n", Status
);
4730 /* Get the HomeDirectoryDrive string */
4731 Status
= SampGetObjectAttributeString(UserObject
,
4732 L
"HomeDirectoryDrive",
4733 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
4734 if (!NT_SUCCESS(Status
))
4736 TRACE("Status 0x%08lx\n", Status
);
4740 /* Get the ScriptPath string */
4741 Status
= SampGetObjectAttributeString(UserObject
,
4743 &InfoBuffer
->Logon
.ScriptPath
);
4744 if (!NT_SUCCESS(Status
))
4746 TRACE("Status 0x%08lx\n", Status
);
4750 /* Get the ProfilePath string */
4751 Status
= SampGetObjectAttributeString(UserObject
,
4753 &InfoBuffer
->Logon
.ProfilePath
);
4754 if (!NT_SUCCESS(Status
))
4756 TRACE("Status 0x%08lx\n", Status
);
4760 /* Get the WorkStations string */
4761 Status
= SampGetObjectAttributeString(UserObject
,
4763 &InfoBuffer
->Logon
.WorkStations
);
4764 if (!NT_SUCCESS(Status
))
4766 TRACE("Status 0x%08lx\n", Status
);
4770 /* FIXME: LogonHours */
4772 *Buffer
= InfoBuffer
;
4775 if (!NT_SUCCESS(Status
))
4777 if (InfoBuffer
!= NULL
)
4779 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
4780 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
4782 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
4783 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
4785 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
4786 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
4788 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
4789 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
4791 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
4792 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
4794 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
4795 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
4797 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
4798 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
4800 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
4801 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
4803 midl_user_free(InfoBuffer
);
4813 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
4814 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4816 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4817 SAM_USER_FIXED_DATA FixedData
;
4823 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4824 if (InfoBuffer
== NULL
)
4825 return STATUS_INSUFFICIENT_RESOURCES
;
4827 Length
= sizeof(SAM_USER_FIXED_DATA
);
4828 Status
= SampGetObjectAttribute(UserObject
,
4833 if (!NT_SUCCESS(Status
))
4836 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
4837 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4838 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4839 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4840 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4841 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4842 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4843 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4844 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
4845 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
4846 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4847 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
4848 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
4850 /* Get the Name string */
4851 Status
= SampGetObjectAttributeString(UserObject
,
4853 &InfoBuffer
->Account
.UserName
);
4854 if (!NT_SUCCESS(Status
))
4856 TRACE("Status 0x%08lx\n", Status
);
4860 /* Get the FullName string */
4861 Status
= SampGetObjectAttributeString(UserObject
,
4863 &InfoBuffer
->Account
.FullName
);
4864 if (!NT_SUCCESS(Status
))
4866 TRACE("Status 0x%08lx\n", Status
);
4870 /* Get the HomeDirectory string */
4871 Status
= SampGetObjectAttributeString(UserObject
,
4873 &InfoBuffer
->Account
.HomeDirectory
);
4874 if (!NT_SUCCESS(Status
))
4876 TRACE("Status 0x%08lx\n", Status
);
4880 /* Get the HomeDirectoryDrive string */
4881 Status
= SampGetObjectAttributeString(UserObject
,
4882 L
"HomeDirectoryDrive",
4883 &InfoBuffer
->Account
.HomeDirectoryDrive
);
4884 if (!NT_SUCCESS(Status
))
4886 TRACE("Status 0x%08lx\n", Status
);
4890 /* Get the ScriptPath string */
4891 Status
= SampGetObjectAttributeString(UserObject
,
4893 &InfoBuffer
->Account
.ScriptPath
);
4894 if (!NT_SUCCESS(Status
))
4896 TRACE("Status 0x%08lx\n", Status
);
4900 /* Get the ProfilePath string */
4901 Status
= SampGetObjectAttributeString(UserObject
,
4903 &InfoBuffer
->Account
.ProfilePath
);
4904 if (!NT_SUCCESS(Status
))
4906 TRACE("Status 0x%08lx\n", Status
);
4910 /* Get the AdminComment string */
4911 Status
= SampGetObjectAttributeString(UserObject
,
4913 &InfoBuffer
->Account
.AdminComment
);
4914 if (!NT_SUCCESS(Status
))
4916 TRACE("Status 0x%08lx\n", Status
);
4920 /* Get the WorkStations string */
4921 Status
= SampGetObjectAttributeString(UserObject
,
4923 &InfoBuffer
->Account
.WorkStations
);
4924 if (!NT_SUCCESS(Status
))
4926 TRACE("Status 0x%08lx\n", Status
);
4930 /* FIXME: LogonHours */
4932 *Buffer
= InfoBuffer
;
4935 if (!NT_SUCCESS(Status
))
4937 if (InfoBuffer
!= NULL
)
4939 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
4940 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
4942 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
4943 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
4945 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
4946 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
4948 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
4949 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
4951 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
4952 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
4954 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
4955 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
4957 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
4958 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
4960 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
4961 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
4963 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
4964 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
4966 midl_user_free(InfoBuffer
);
4973 /* FIXME: SampQueryUserLogonHours */
4977 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
4978 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4980 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4985 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4986 if (InfoBuffer
== NULL
)
4987 return STATUS_INSUFFICIENT_RESOURCES
;
4989 /* Get the Name string */
4990 Status
= SampGetObjectAttributeString(UserObject
,
4992 &InfoBuffer
->Name
.UserName
);
4993 if (!NT_SUCCESS(Status
))
4995 TRACE("Status 0x%08lx\n", Status
);
4999 /* Get the FullName string */
5000 Status
= SampGetObjectAttributeString(UserObject
,
5002 &InfoBuffer
->Name
.FullName
);
5003 if (!NT_SUCCESS(Status
))
5005 TRACE("Status 0x%08lx\n", Status
);
5009 *Buffer
= InfoBuffer
;
5012 if (!NT_SUCCESS(Status
))
5014 if (InfoBuffer
!= NULL
)
5016 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5017 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5019 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5020 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5022 midl_user_free(InfoBuffer
);
5031 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5032 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5034 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5039 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5040 if (InfoBuffer
== NULL
)
5041 return STATUS_INSUFFICIENT_RESOURCES
;
5043 /* Get the Name string */
5044 Status
= SampGetObjectAttributeString(UserObject
,
5046 &InfoBuffer
->AccountName
.UserName
);
5047 if (!NT_SUCCESS(Status
))
5049 TRACE("Status 0x%08lx\n", Status
);
5053 *Buffer
= InfoBuffer
;
5056 if (!NT_SUCCESS(Status
))
5058 if (InfoBuffer
!= NULL
)
5060 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5061 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5063 midl_user_free(InfoBuffer
);
5072 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5073 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5075 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5080 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5081 if (InfoBuffer
== NULL
)
5082 return STATUS_INSUFFICIENT_RESOURCES
;
5084 /* Get the FullName string */
5085 Status
= SampGetObjectAttributeString(UserObject
,
5087 &InfoBuffer
->FullName
.FullName
);
5088 if (!NT_SUCCESS(Status
))
5090 TRACE("Status 0x%08lx\n", Status
);
5094 *Buffer
= InfoBuffer
;
5097 if (!NT_SUCCESS(Status
))
5099 if (InfoBuffer
!= NULL
)
5101 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
5102 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5104 midl_user_free(InfoBuffer
);
5114 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5115 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5117 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5118 SAM_USER_FIXED_DATA FixedData
;
5124 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5125 if (InfoBuffer
== NULL
)
5126 return STATUS_INSUFFICIENT_RESOURCES
;
5128 Length
= sizeof(SAM_USER_FIXED_DATA
);
5129 Status
= SampGetObjectAttribute(UserObject
,
5134 if (!NT_SUCCESS(Status
))
5137 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5139 *Buffer
= InfoBuffer
;
5142 if (!NT_SUCCESS(Status
))
5144 if (InfoBuffer
!= NULL
)
5146 midl_user_free(InfoBuffer
);
5155 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5156 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5158 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5163 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5164 if (InfoBuffer
== NULL
)
5165 return STATUS_INSUFFICIENT_RESOURCES
;
5167 /* Get the HomeDirectory string */
5168 Status
= SampGetObjectAttributeString(UserObject
,
5170 &InfoBuffer
->Home
.HomeDirectory
);
5171 if (!NT_SUCCESS(Status
))
5173 TRACE("Status 0x%08lx\n", Status
);
5177 /* Get the HomeDirectoryDrive string */
5178 Status
= SampGetObjectAttributeString(UserObject
,
5179 L
"HomeDirectoryDrive",
5180 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5181 if (!NT_SUCCESS(Status
))
5183 TRACE("Status 0x%08lx\n", Status
);
5187 *Buffer
= InfoBuffer
;
5190 if (!NT_SUCCESS(Status
))
5192 if (InfoBuffer
!= NULL
)
5194 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5195 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5197 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5198 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5200 midl_user_free(InfoBuffer
);
5209 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5210 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5212 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5217 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5218 if (InfoBuffer
== NULL
)
5219 return STATUS_INSUFFICIENT_RESOURCES
;
5221 /* Get the ScriptPath string */
5222 Status
= SampGetObjectAttributeString(UserObject
,
5224 &InfoBuffer
->Script
.ScriptPath
);
5225 if (!NT_SUCCESS(Status
))
5227 TRACE("Status 0x%08lx\n", Status
);
5231 *Buffer
= InfoBuffer
;
5234 if (!NT_SUCCESS(Status
))
5236 if (InfoBuffer
!= NULL
)
5238 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5239 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5241 midl_user_free(InfoBuffer
);
5250 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5251 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5253 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5258 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5259 if (InfoBuffer
== NULL
)
5260 return STATUS_INSUFFICIENT_RESOURCES
;
5262 /* Get the ProfilePath string */
5263 Status
= SampGetObjectAttributeString(UserObject
,
5265 &InfoBuffer
->Profile
.ProfilePath
);
5266 if (!NT_SUCCESS(Status
))
5268 TRACE("Status 0x%08lx\n", Status
);
5272 *Buffer
= InfoBuffer
;
5275 if (!NT_SUCCESS(Status
))
5277 if (InfoBuffer
!= NULL
)
5279 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
5280 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5282 midl_user_free(InfoBuffer
);
5291 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5292 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5294 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5299 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5300 if (InfoBuffer
== NULL
)
5301 return STATUS_INSUFFICIENT_RESOURCES
;
5303 /* Get the AdminComment string */
5304 Status
= SampGetObjectAttributeString(UserObject
,
5306 &InfoBuffer
->AdminComment
.AdminComment
);
5307 if (!NT_SUCCESS(Status
))
5309 TRACE("Status 0x%08lx\n", Status
);
5313 *Buffer
= InfoBuffer
;
5316 if (!NT_SUCCESS(Status
))
5318 if (InfoBuffer
!= NULL
)
5320 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5321 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5323 midl_user_free(InfoBuffer
);
5332 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5333 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5335 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5340 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5341 if (InfoBuffer
== NULL
)
5342 return STATUS_INSUFFICIENT_RESOURCES
;
5344 /* Get the WorkStations string */
5345 Status
= SampGetObjectAttributeString(UserObject
,
5347 &InfoBuffer
->WorkStations
.WorkStations
);
5348 if (!NT_SUCCESS(Status
))
5350 TRACE("Status 0x%08lx\n", Status
);
5354 *Buffer
= InfoBuffer
;
5357 if (!NT_SUCCESS(Status
))
5359 if (InfoBuffer
!= NULL
)
5361 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
5362 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
5364 midl_user_free(InfoBuffer
);
5374 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
5375 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5377 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5378 SAM_USER_FIXED_DATA FixedData
;
5384 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5385 if (InfoBuffer
== NULL
)
5386 return STATUS_INSUFFICIENT_RESOURCES
;
5388 Length
= sizeof(SAM_USER_FIXED_DATA
);
5389 Status
= SampGetObjectAttribute(UserObject
,
5394 if (!NT_SUCCESS(Status
))
5397 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
5399 *Buffer
= InfoBuffer
;
5402 if (!NT_SUCCESS(Status
))
5404 if (InfoBuffer
!= NULL
)
5406 midl_user_free(InfoBuffer
);
5416 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
5417 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5419 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5420 SAM_USER_FIXED_DATA FixedData
;
5426 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5427 if (InfoBuffer
== NULL
)
5428 return STATUS_INSUFFICIENT_RESOURCES
;
5430 Length
= sizeof(SAM_USER_FIXED_DATA
);
5431 Status
= SampGetObjectAttribute(UserObject
,
5436 if (!NT_SUCCESS(Status
))
5439 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5440 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5442 *Buffer
= InfoBuffer
;
5445 if (!NT_SUCCESS(Status
))
5447 if (InfoBuffer
!= NULL
)
5449 midl_user_free(InfoBuffer
);
5460 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
5461 IN USER_INFORMATION_CLASS UserInformationClass
,
5462 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
5464 PSAM_DB_OBJECT UserObject
;
5465 ACCESS_MASK DesiredAccess
;
5468 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
5469 UserHandle
, UserInformationClass
, Buffer
);
5471 switch (UserInformationClass
)
5473 case UserGeneralInformation
:
5474 case UserNameInformation
:
5475 case UserAccountNameInformation
:
5476 case UserFullNameInformation
:
5477 case UserPrimaryGroupInformation
:
5478 case UserAdminCommentInformation
:
5479 DesiredAccess
= USER_READ_GENERAL
;
5482 case UserLogonHoursInformation
:
5483 case UserHomeInformation
:
5484 case UserScriptInformation
:
5485 case UserProfileInformation
:
5486 case UserWorkStationsInformation
:
5487 DesiredAccess
= USER_READ_LOGON
;
5490 case UserControlInformation
:
5491 case UserExpiresInformation
:
5492 DesiredAccess
= USER_READ_ACCOUNT
;
5495 case UserPreferencesInformation
:
5496 DesiredAccess
= USER_READ_GENERAL
|
5497 USER_READ_PREFERENCES
;
5500 case UserLogonInformation
:
5501 case UserAccountInformation
:
5502 DesiredAccess
= USER_READ_GENERAL
|
5503 USER_READ_PREFERENCES
|
5509 return STATUS_INVALID_INFO_CLASS
;
5512 /* Validate the domain handle */
5513 Status
= SampValidateDbObject(UserHandle
,
5517 if (!NT_SUCCESS(Status
))
5519 TRACE("failed with status 0x%08lx\n", Status
);
5523 switch (UserInformationClass
)
5525 case UserGeneralInformation
:
5526 Status
= SampQueryUserGeneral(UserObject
,
5530 case UserPreferencesInformation
:
5531 Status
= SampQueryUserPreferences(UserObject
,
5535 case UserLogonInformation
:
5536 Status
= SampQueryUserLogon(UserObject
,
5540 // case UserLogonHoursInformation:
5541 // Status = SampQueryUserLogonHours(UserObject,
5545 case UserAccountInformation
:
5546 Status
= SampQueryUserAccount(UserObject
,
5550 case UserNameInformation
:
5551 Status
= SampQueryUserName(UserObject
,
5555 case UserAccountNameInformation
:
5556 Status
= SampQueryUserAccountName(UserObject
,
5560 case UserFullNameInformation
:
5561 Status
= SampQueryUserFullName(UserObject
,
5565 case UserPrimaryGroupInformation
:
5566 Status
= SampQueryUserPrimaryGroup(UserObject
,
5570 case UserHomeInformation
:
5571 Status
= SampQueryUserHome(UserObject
,
5574 case UserScriptInformation
:
5575 Status
= SampQueryUserScript(UserObject
,
5579 case UserProfileInformation
:
5580 Status
= SampQueryUserProfile(UserObject
,
5584 case UserAdminCommentInformation
:
5585 Status
= SampQueryUserAdminComment(UserObject
,
5589 case UserWorkStationsInformation
:
5590 Status
= SampQueryUserWorkStations(UserObject
,
5594 case UserControlInformation
:
5595 Status
= SampQueryUserControl(UserObject
,
5599 case UserExpiresInformation
:
5600 Status
= SampQueryUserExpires(UserObject
,
5605 Status
= STATUS_INVALID_INFO_CLASS
;
5613 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
5614 PSAMPR_USER_INFO_BUFFER Buffer
)
5616 SAM_USER_FIXED_DATA FixedData
;
5620 Length
= sizeof(SAM_USER_FIXED_DATA
);
5621 Status
= SampGetObjectAttribute(UserObject
,
5626 if (!NT_SUCCESS(Status
))
5629 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
5631 Status
= SampSetObjectAttribute(UserObject
,
5636 if (!NT_SUCCESS(Status
))
5639 Status
= SampSetObjectAttribute(UserObject
,
5642 Buffer
->General
.UserName
.Buffer
,
5643 Buffer
->General
.UserName
.MaximumLength
);
5644 if (!NT_SUCCESS(Status
))
5647 Status
= SampSetObjectAttribute(UserObject
,
5650 Buffer
->General
.FullName
.Buffer
,
5651 Buffer
->General
.FullName
.MaximumLength
);
5652 if (!NT_SUCCESS(Status
))
5655 Status
= SampSetObjectAttribute(UserObject
,
5658 Buffer
->General
.AdminComment
.Buffer
,
5659 Buffer
->General
.AdminComment
.MaximumLength
);
5660 if (!NT_SUCCESS(Status
))
5663 Status
= SampSetObjectAttribute(UserObject
,
5666 Buffer
->General
.UserComment
.Buffer
,
5667 Buffer
->General
.UserComment
.MaximumLength
);
5675 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
5676 PSAMPR_USER_INFO_BUFFER Buffer
)
5678 SAM_USER_FIXED_DATA FixedData
;
5682 Length
= sizeof(SAM_USER_FIXED_DATA
);
5683 Status
= SampGetObjectAttribute(UserObject
,
5688 if (!NT_SUCCESS(Status
))
5691 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
5692 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
5694 Status
= SampSetObjectAttribute(UserObject
,
5699 if (!NT_SUCCESS(Status
))
5702 Status
= SampSetObjectAttribute(UserObject
,
5705 Buffer
->Preferences
.UserComment
.Buffer
,
5706 Buffer
->Preferences
.UserComment
.MaximumLength
);
5714 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5715 PSAMPR_USER_INFO_BUFFER Buffer
)
5717 SAM_USER_FIXED_DATA FixedData
;
5721 Length
= sizeof(SAM_USER_FIXED_DATA
);
5722 Status
= SampGetObjectAttribute(UserObject
,
5727 if (!NT_SUCCESS(Status
))
5730 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
5732 Status
= SampSetObjectAttribute(UserObject
,
5744 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
5745 PSAMPR_USER_INFO_BUFFER Buffer
)
5747 SAM_USER_FIXED_DATA FixedData
;
5751 Length
= sizeof(SAM_USER_FIXED_DATA
);
5752 Status
= SampGetObjectAttribute(UserObject
,
5757 if (!NT_SUCCESS(Status
))
5760 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
5762 Status
= SampSetObjectAttribute(UserObject
,
5774 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
5775 PSAMPR_USER_INFO_BUFFER Buffer
)
5777 SAM_USER_FIXED_DATA FixedData
;
5781 Length
= sizeof(SAM_USER_FIXED_DATA
);
5782 Status
= SampGetObjectAttribute(UserObject
,
5787 if (!NT_SUCCESS(Status
))
5790 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
5791 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
5793 Status
= SampSetObjectAttribute(UserObject
,
5807 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
5808 IN USER_INFORMATION_CLASS UserInformationClass
,
5809 IN PSAMPR_USER_INFO_BUFFER Buffer
)
5811 PSAM_DB_OBJECT UserObject
;
5812 ACCESS_MASK DesiredAccess
;
5815 TRACE("SamrSetInformationUser(%p %lu %p)\n",
5816 UserHandle
, UserInformationClass
, Buffer
);
5818 switch (UserInformationClass
)
5820 case UserLogonHoursInformation
:
5821 case UserNameInformation
:
5822 case UserAccountNameInformation
:
5823 case UserFullNameInformation
:
5824 case UserPrimaryGroupInformation
:
5825 case UserHomeInformation
:
5826 case UserScriptInformation
:
5827 case UserProfileInformation
:
5828 case UserAdminCommentInformation
:
5829 case UserWorkStationsInformation
:
5830 case UserControlInformation
:
5831 case UserExpiresInformation
:
5832 DesiredAccess
= USER_WRITE_ACCOUNT
;
5835 case UserGeneralInformation
:
5836 DesiredAccess
= USER_WRITE_ACCOUNT
|
5837 USER_WRITE_PREFERENCES
;
5840 case UserPreferencesInformation
:
5841 DesiredAccess
= USER_WRITE_PREFERENCES
;
5844 case UserSetPasswordInformation
:
5845 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
5849 return STATUS_INVALID_INFO_CLASS
;
5852 /* Validate the domain handle */
5853 Status
= SampValidateDbObject(UserHandle
,
5857 if (!NT_SUCCESS(Status
))
5859 TRACE("failed with status 0x%08lx\n", Status
);
5863 switch (UserInformationClass
)
5865 case UserGeneralInformation
:
5866 Status
= SampSetUserGeneral(UserObject
,
5870 case UserPreferencesInformation
:
5871 Status
= SampSetUserPreferences(UserObject
,
5875 case UserLogonHoursInformation:
5876 Status = SampSetUserLogonHours(UserObject,
5880 case UserNameInformation
:
5881 Status
= SampSetObjectAttribute(UserObject
,
5884 Buffer
->Name
.UserName
.Buffer
,
5885 Buffer
->Name
.UserName
.MaximumLength
);
5886 if (!NT_SUCCESS(Status
))
5889 Status
= SampSetObjectAttribute(UserObject
,
5892 Buffer
->Name
.FullName
.Buffer
,
5893 Buffer
->Name
.FullName
.MaximumLength
);
5896 case UserAccountNameInformation
:
5897 Status
= SampSetObjectAttribute(UserObject
,
5900 Buffer
->AccountName
.UserName
.Buffer
,
5901 Buffer
->AccountName
.UserName
.MaximumLength
);
5904 case UserFullNameInformation
:
5905 Status
= SampSetObjectAttribute(UserObject
,
5908 Buffer
->FullName
.FullName
.Buffer
,
5909 Buffer
->FullName
.FullName
.MaximumLength
);
5912 case UserPrimaryGroupInformation
:
5913 Status
= SampSetUserPrimaryGroup(UserObject
,
5917 case UserHomeInformation
:
5918 Status
= SampSetObjectAttribute(UserObject
,
5921 Buffer
->Home
.HomeDirectory
.Buffer
,
5922 Buffer
->Home
.HomeDirectory
.MaximumLength
);
5923 if (!NT_SUCCESS(Status
))
5926 Status
= SampSetObjectAttribute(UserObject
,
5927 L
"HomeDirectoryDrive",
5929 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
5930 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
5933 case UserScriptInformation
:
5934 Status
= SampSetObjectAttribute(UserObject
,
5937 Buffer
->Script
.ScriptPath
.Buffer
,
5938 Buffer
->Script
.ScriptPath
.MaximumLength
);
5941 case UserProfileInformation
:
5942 Status
= SampSetObjectAttribute(UserObject
,
5945 Buffer
->Profile
.ProfilePath
.Buffer
,
5946 Buffer
->Profile
.ProfilePath
.MaximumLength
);
5949 case UserAdminCommentInformation
:
5950 Status
= SampSetObjectAttribute(UserObject
,
5953 Buffer
->AdminComment
.AdminComment
.Buffer
,
5954 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
5957 case UserWorkStationsInformation
:
5958 Status
= SampSetObjectAttribute(UserObject
,
5961 Buffer
->WorkStations
.WorkStations
.Buffer
,
5962 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
5965 case UserSetPasswordInformation
:
5966 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
5967 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
5969 Status
= SampSetObjectAttribute(UserObject
,
5972 Buffer
->SetPassword
.Password
.Buffer
,
5973 Buffer
->SetPassword
.Password
.MaximumLength
);
5976 case UserControlInformation
:
5977 Status
= SampSetUserControl(UserObject
,
5981 case UserExpiresInformation
:
5982 Status
= SampSetUserExpires(UserObject
,
5986 // case UserInternal1Information:
5987 // case UserParametersInformation:
5988 // case UserAllInformation:
5989 // case UserInternal4Information:
5990 // case UserInternal5Information:
5991 // case UserInternal4InformationNew:
5992 // case UserInternal5InformationNew:
5995 Status
= STATUS_INVALID_INFO_CLASS
;
6004 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
6005 IN
unsigned char LmPresent
,
6006 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
6007 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
6008 IN
unsigned char NtPresent
,
6009 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
6010 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
6011 IN
unsigned char NtCrossEncryptionPresent
,
6012 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
6013 IN
unsigned char LmCrossEncryptionPresent
,
6014 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
6017 return STATUS_NOT_IMPLEMENTED
;
6023 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
6024 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
6027 return STATUS_NOT_IMPLEMENTED
;
6033 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
6034 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6035 IN
unsigned long Index
,
6036 IN
unsigned long EntryCount
,
6037 IN
unsigned long PreferredMaximumLength
,
6038 OUT
unsigned long *TotalAvailable
,
6039 OUT
unsigned long *TotalReturned
,
6040 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6043 return STATUS_NOT_IMPLEMENTED
;
6049 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
6050 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6051 IN PRPC_UNICODE_STRING Prefix
,
6052 OUT
unsigned long *Index
)
6055 return STATUS_NOT_IMPLEMENTED
;
6061 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
6064 return STATUS_NOT_IMPLEMENTED
;
6070 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
6073 return STATUS_NOT_IMPLEMENTED
;
6079 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
6080 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6083 return STATUS_NOT_IMPLEMENTED
;
6089 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
6090 IN PRPC_SID MemberSid
)
6093 return STATUS_NOT_IMPLEMENTED
;
6099 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
6100 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
6101 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
6104 return STATUS_NOT_IMPLEMENTED
;
6110 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
6111 IN USER_INFORMATION_CLASS UserInformationClass
,
6112 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6115 return STATUS_NOT_IMPLEMENTED
;
6121 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
6122 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6123 IN
unsigned long Index
,
6124 IN
unsigned long EntryCount
,
6125 IN
unsigned long PreferredMaximumLength
,
6126 OUT
unsigned long *TotalAvailable
,
6127 OUT
unsigned long *TotalReturned
,
6128 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6131 return STATUS_NOT_IMPLEMENTED
;
6137 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
6138 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6139 IN PRPC_UNICODE_STRING Prefix
,
6140 OUT
unsigned long *Index
)
6143 return STATUS_NOT_IMPLEMENTED
;
6150 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
6151 IN PRPC_UNICODE_STRING Name
,
6152 IN
unsigned long AccountType
,
6153 IN ACCESS_MASK DesiredAccess
,
6154 OUT SAMPR_HANDLE
*UserHandle
,
6155 OUT
unsigned long *GrantedAccess
,
6156 OUT
unsigned long *RelativeId
)
6158 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
6159 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
6160 SAM_USER_FIXED_DATA FixedUserData
;
6161 PSAM_DB_OBJECT DomainObject
;
6162 PSAM_DB_OBJECT UserObject
;
6168 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
6169 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
6172 Name
->Length
== 0 ||
6173 Name
->Buffer
== NULL
||
6174 UserHandle
== NULL
||
6176 return STATUS_INVALID_PARAMETER
;
6178 /* Check for valid account type */
6179 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
6180 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
6181 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
6182 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
6183 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
6184 return STATUS_INVALID_PARAMETER
;
6186 /* Validate the domain handle */
6187 Status
= SampValidateDbObject(DomainHandle
,
6191 if (!NT_SUCCESS(Status
))
6193 TRACE("failed with status 0x%08lx\n", Status
);
6197 /* Check if the user name already exists in the domain */
6198 Status
= SampCheckAccountNameInDomain(DomainObject
,
6200 if (!NT_SUCCESS(Status
))
6202 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
6203 Name
->Buffer
, Status
);
6207 /* Get the fixed domain attributes */
6208 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6209 Status
= SampGetObjectAttribute(DomainObject
,
6212 (PVOID
)&FixedDomainData
,
6214 if (!NT_SUCCESS(Status
))
6216 TRACE("failed with status 0x%08lx\n", Status
);
6220 /* Increment the NextRid attribute */
6221 ulRid
= FixedDomainData
.NextRid
;
6222 FixedDomainData
.NextRid
++;
6224 /* Store the fixed domain attributes */
6225 Status
= SampSetObjectAttribute(DomainObject
,
6230 if (!NT_SUCCESS(Status
))
6232 TRACE("failed with status 0x%08lx\n", Status
);
6236 TRACE("RID: %lx\n", ulRid
);
6238 /* Convert the RID into a string (hex) */
6239 swprintf(szRid
, L
"%08lX", ulRid
);
6241 /* Create the user object */
6242 Status
= SampCreateDbObject(DomainObject
,
6248 if (!NT_SUCCESS(Status
))
6250 TRACE("failed with status 0x%08lx\n", Status
);
6254 /* Add the account name for the user object */
6255 Status
= SampSetAccountNameInDomain(DomainObject
,
6259 if (!NT_SUCCESS(Status
))
6261 TRACE("failed with status 0x%08lx\n", Status
);
6265 /* Initialize fixed user data */
6266 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
6267 FixedUserData
.Version
= 1;
6268 FixedUserData
.LastLogon
.QuadPart
= 0;
6269 FixedUserData
.LastLogoff
.QuadPart
= 0;
6270 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
6271 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
6272 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
6273 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
6274 FixedUserData
.UserId
= ulRid
;
6275 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
6276 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
6277 USER_PASSWORD_NOT_REQUIRED
|
6280 /* Set fixed user data attribute */
6281 Status
= SampSetObjectAttribute(UserObject
,
6284 (LPVOID
)&FixedUserData
,
6285 sizeof(SAM_USER_FIXED_DATA
));
6286 if (!NT_SUCCESS(Status
))
6288 TRACE("failed with status 0x%08lx\n", Status
);
6292 /* Set the Name attribute */
6293 Status
= SampSetObjectAttribute(UserObject
,
6296 (LPVOID
)Name
->Buffer
,
6297 Name
->MaximumLength
);
6298 if (!NT_SUCCESS(Status
))
6300 TRACE("failed with status 0x%08lx\n", Status
);
6304 /* Set the FullName attribute */
6305 Status
= SampSetObjectAttribute(UserObject
,
6309 EmptyString
.MaximumLength
);
6310 if (!NT_SUCCESS(Status
))
6312 TRACE("failed with status 0x%08lx\n", Status
);
6316 /* Set the HomeDirectory attribute */
6317 Status
= SampSetObjectAttribute(UserObject
,
6321 EmptyString
.MaximumLength
);
6322 if (!NT_SUCCESS(Status
))
6324 TRACE("failed with status 0x%08lx\n", Status
);
6328 /* Set the HomeDirectoryDrive attribute */
6329 Status
= SampSetObjectAttribute(UserObject
,
6330 L
"HomeDirectoryDrive",
6333 EmptyString
.MaximumLength
);
6334 if (!NT_SUCCESS(Status
))
6336 TRACE("failed with status 0x%08lx\n", Status
);
6340 /* Set the ScriptPath attribute */
6341 Status
= SampSetObjectAttribute(UserObject
,
6345 EmptyString
.MaximumLength
);
6346 if (!NT_SUCCESS(Status
))
6348 TRACE("failed with status 0x%08lx\n", Status
);
6352 /* Set the ProfilePath attribute */
6353 Status
= SampSetObjectAttribute(UserObject
,
6357 EmptyString
.MaximumLength
);
6358 if (!NT_SUCCESS(Status
))
6360 TRACE("failed with status 0x%08lx\n", Status
);
6364 /* Set the AdminComment attribute */
6365 Status
= SampSetObjectAttribute(UserObject
,
6369 EmptyString
.MaximumLength
);
6370 if (!NT_SUCCESS(Status
))
6372 TRACE("failed with status 0x%08lx\n", Status
);
6376 /* Set the UserComment attribute */
6377 Status
= SampSetObjectAttribute(UserObject
,
6381 EmptyString
.MaximumLength
);
6382 if (!NT_SUCCESS(Status
))
6384 TRACE("failed with status 0x%08lx\n", Status
);
6388 /* Set the WorkStations attribute */
6389 Status
= SampSetObjectAttribute(UserObject
,
6393 EmptyString
.MaximumLength
);
6394 if (!NT_SUCCESS(Status
))
6396 TRACE("failed with status 0x%08lx\n", Status
);
6400 /* FIXME: Set default user attributes */
6402 if (NT_SUCCESS(Status
))
6404 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
6405 *RelativeId
= ulRid
;
6406 *GrantedAccess
= UserObject
->Access
;
6409 TRACE("returns with status 0x%08lx\n", Status
);
6418 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
6419 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6420 IN
unsigned long Index
,
6421 IN
unsigned long EntryCount
,
6422 IN
unsigned long PreferredMaximumLength
,
6423 OUT
unsigned long *TotalAvailable
,
6424 OUT
unsigned long *TotalReturned
,
6425 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6428 return STATUS_NOT_IMPLEMENTED
;
6435 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
6436 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6439 NTSTATUS Status
= STATUS_SUCCESS
;
6441 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
6442 AliasHandle
, MembersBuffer
);
6444 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6446 Status
= SamrAddMemberToAlias(AliasHandle
,
6447 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6449 if (Status
== STATUS_MEMBER_IN_ALIAS
)
6450 Status
= STATUS_SUCCESS
;
6452 if (!NT_SUCCESS(Status
))
6463 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
6464 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6467 NTSTATUS Status
= STATUS_SUCCESS
;
6469 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
6470 AliasHandle
, MembersBuffer
);
6472 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6474 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
6475 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6477 if (Status
== STATUS_MEMBER_IN_ALIAS
)
6478 Status
= STATUS_SUCCESS
;
6480 if (!NT_SUCCESS(Status
))
6491 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
6492 IN PRPC_STRING ServerName
,
6493 IN PRPC_STRING UserName
,
6494 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6495 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
6498 return STATUS_NOT_IMPLEMENTED
;
6504 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
6505 IN PRPC_UNICODE_STRING ServerName
,
6506 IN PRPC_UNICODE_STRING UserName
,
6507 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
6508 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
6509 IN
unsigned char LmPresent
,
6510 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6511 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
6514 return STATUS_NOT_IMPLEMENTED
;
6520 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
6521 IN PRPC_UNICODE_STRING Unused
,
6522 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6525 return STATUS_NOT_IMPLEMENTED
;
6531 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
6532 OUT SAMPR_HANDLE
*ServerHandle
,
6533 IN ACCESS_MASK DesiredAccess
)
6536 return STATUS_NOT_IMPLEMENTED
;
6542 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
6543 IN USER_INFORMATION_CLASS UserInformationClass
,
6544 IN PSAMPR_USER_INFO_BUFFER Buffer
)
6547 return STATUS_NOT_IMPLEMENTED
;
6553 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
6556 return STATUS_NOT_IMPLEMENTED
;
6562 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
6565 return STATUS_NOT_IMPLEMENTED
;
6571 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
6574 return STATUS_NOT_IMPLEMENTED
;
6580 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
6581 OUT SAMPR_HANDLE
*ServerHandle
,
6582 IN
unsigned long ClientRevision
,
6583 IN ACCESS_MASK DesiredAccess
)
6586 return STATUS_NOT_IMPLEMENTED
;
6592 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
6595 return STATUS_NOT_IMPLEMENTED
;
6601 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
6602 IN ACCESS_MASK DesiredAccess
,
6603 IN
unsigned long InVersion
,
6604 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
6605 OUT
unsigned long *OutVersion
,
6606 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
6607 OUT SAMPR_HANDLE
*ServerHandle
)
6610 return STATUS_NOT_IMPLEMENTED
;
6616 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
6617 IN
unsigned long Rid
,
6621 return STATUS_NOT_IMPLEMENTED
;
6627 SamrSetDSRMPassword(IN handle_t BindingHandle
,
6628 IN PRPC_UNICODE_STRING Unused
,
6629 IN
unsigned long UserId
,
6630 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
6633 return STATUS_NOT_IMPLEMENTED
;
6639 SamrValidatePassword(IN handle_t Handle
,
6640 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
6641 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
6642 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
6645 return STATUS_NOT_IMPLEMENTED
;