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 AliasObject
->Special
.Alias
.RelativeId
= AliasId
;
3832 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
3834 return STATUS_SUCCESS
;
3839 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
3840 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3842 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3843 HANDLE MembersKeyHandle
= NULL
;
3848 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3849 if (InfoBuffer
== NULL
)
3850 return STATUS_INSUFFICIENT_RESOURCES
;
3852 Status
= SampGetObjectAttributeString(AliasObject
,
3854 &InfoBuffer
->General
.Name
);
3855 if (!NT_SUCCESS(Status
))
3857 TRACE("Status 0x%08lx\n", Status
);
3861 Status
= SampGetObjectAttributeString(AliasObject
,
3863 &InfoBuffer
->General
.AdminComment
);
3864 if (!NT_SUCCESS(Status
))
3866 TRACE("Status 0x%08lx\n", Status
);
3870 /* Open the Members subkey */
3871 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
3875 if (NT_SUCCESS(Status
))
3877 /* Retrieve the number of members of the alias */
3878 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3880 &InfoBuffer
->General
.MemberCount
);
3881 if (!NT_SUCCESS(Status
))
3883 TRACE("Status 0x%08lx\n", Status
);
3887 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3889 InfoBuffer
->General
.MemberCount
= 0;
3890 Status
= STATUS_SUCCESS
;
3894 TRACE("Status 0x%08lx\n", Status
);
3898 *Buffer
= InfoBuffer
;
3901 if (MembersKeyHandle
!= NULL
)
3902 SampRegCloseKey(MembersKeyHandle
);
3904 if (!NT_SUCCESS(Status
))
3906 if (InfoBuffer
!= NULL
)
3908 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3909 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3911 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3912 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3914 midl_user_free(InfoBuffer
);
3923 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
3924 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3926 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3931 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3932 if (InfoBuffer
== NULL
)
3933 return STATUS_INSUFFICIENT_RESOURCES
;
3935 Status
= SampGetObjectAttributeString(AliasObject
,
3937 &InfoBuffer
->Name
.Name
);
3938 if (!NT_SUCCESS(Status
))
3940 TRACE("Status 0x%08lx\n", Status
);
3944 *Buffer
= InfoBuffer
;
3947 if (!NT_SUCCESS(Status
))
3949 if (InfoBuffer
!= NULL
)
3951 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3952 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3954 midl_user_free(InfoBuffer
);
3963 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
3964 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3966 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3971 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3972 if (InfoBuffer
== NULL
)
3973 return STATUS_INSUFFICIENT_RESOURCES
;
3975 Status
= SampGetObjectAttributeString(AliasObject
,
3977 &InfoBuffer
->AdminComment
.AdminComment
);
3978 if (!NT_SUCCESS(Status
))
3980 TRACE("Status 0x%08lx\n", Status
);
3984 *Buffer
= InfoBuffer
;
3987 if (!NT_SUCCESS(Status
))
3989 if (InfoBuffer
!= NULL
)
3991 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3992 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3994 midl_user_free(InfoBuffer
);
4005 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4006 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4007 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4009 PSAM_DB_OBJECT AliasObject
;
4012 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4013 AliasHandle
, AliasInformationClass
, Buffer
);
4015 /* Validate the alias handle */
4016 Status
= SampValidateDbObject(AliasHandle
,
4018 ALIAS_READ_INFORMATION
,
4020 if (!NT_SUCCESS(Status
))
4023 switch (AliasInformationClass
)
4025 case AliasGeneralInformation
:
4026 Status
= SampQueryAliasGeneral(AliasObject
,
4030 case AliasNameInformation
:
4031 Status
= SampQueryAliasName(AliasObject
,
4035 case AliasAdminCommentInformation
:
4036 Status
= SampQueryAliasAdminComment(AliasObject
,
4041 Status
= STATUS_INVALID_INFO_CLASS
;
4052 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4053 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4054 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4056 PSAM_DB_OBJECT AliasObject
;
4059 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4060 AliasHandle
, AliasInformationClass
, Buffer
);
4062 /* Validate the alias handle */
4063 Status
= SampValidateDbObject(AliasHandle
,
4065 ALIAS_WRITE_ACCOUNT
,
4067 if (!NT_SUCCESS(Status
))
4070 switch (AliasInformationClass
)
4072 case AliasNameInformation
:
4073 Status
= SampSetObjectAttribute(AliasObject
,
4076 Buffer
->Name
.Name
.Buffer
,
4077 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4080 case AliasAdminCommentInformation
:
4081 Status
= SampSetObjectAttribute(AliasObject
,
4084 Buffer
->AdminComment
.AdminComment
.Buffer
,
4085 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4089 Status
= STATUS_INVALID_INFO_CLASS
;
4100 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4103 return STATUS_NOT_IMPLEMENTED
;
4110 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4111 IN PRPC_SID MemberId
)
4113 PSAM_DB_OBJECT AliasObject
;
4114 LPWSTR MemberIdString
= NULL
;
4115 HANDLE MembersKeyHandle
= NULL
;
4116 HANDLE MemberKeyHandle
= NULL
;
4117 ULONG MemberIdLength
;
4120 TRACE("SamrAddMemberToAlias(%p %p)\n",
4121 AliasHandle
, MemberId
);
4123 /* Validate the alias handle */
4124 Status
= SampValidateDbObject(AliasHandle
,
4128 if (!NT_SUCCESS(Status
))
4130 TRACE("failed with status 0x%08lx\n", Status
);
4134 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4135 TRACE("Member SID: %S\n", MemberIdString
);
4137 MemberIdLength
= RtlLengthSid(MemberId
);
4139 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4143 if (!NT_SUCCESS(Status
))
4145 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4149 Status
= SampRegSetValue(MembersKeyHandle
,
4154 if (!NT_SUCCESS(Status
))
4156 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4160 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4164 if (!NT_SUCCESS(Status
))
4166 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4170 Status
= SampRegSetValue(MemberKeyHandle
,
4175 if (!NT_SUCCESS(Status
))
4177 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4182 if (MemberKeyHandle
!= NULL
)
4183 SampRegCloseKey(MemberKeyHandle
);
4185 if (MembersKeyHandle
!= NULL
)
4186 SampRegCloseKey(MembersKeyHandle
);
4188 if (MemberIdString
!= NULL
)
4189 LocalFree(MemberIdString
);
4198 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4199 IN PRPC_SID MemberId
)
4201 PSAM_DB_OBJECT AliasObject
;
4202 LPWSTR MemberIdString
= NULL
;
4203 HANDLE MembersKeyHandle
= NULL
;
4204 HANDLE MemberKeyHandle
= NULL
;
4208 TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
4209 AliasHandle
, MemberId
);
4211 /* Validate the alias handle */
4212 Status
= SampValidateDbObject(AliasHandle
,
4214 ALIAS_REMOVE_MEMBER
,
4216 if (!NT_SUCCESS(Status
))
4218 TRACE("failed with status 0x%08lx\n", Status
);
4222 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4223 TRACE("Member SID: %S\n", MemberIdString
);
4225 Status
= SampRegOpenKey(AliasObject
->MembersKeyHandle
,
4227 KEY_WRITE
| KEY_QUERY_VALUE
,
4229 if (!NT_SUCCESS(Status
))
4231 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4235 Status
= SampRegDeleteValue(MemberKeyHandle
,
4237 if (!NT_SUCCESS(Status
))
4239 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4243 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
4246 if (!NT_SUCCESS(Status
))
4248 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4252 if (ulValueCount
== 0)
4254 SampRegCloseKey(MemberKeyHandle
);
4255 MemberKeyHandle
= NULL
;
4257 Status
= SampRegDeleteKey(AliasObject
->MembersKeyHandle
,
4259 if (!NT_SUCCESS(Status
))
4261 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4266 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4268 KEY_WRITE
| KEY_QUERY_VALUE
,
4270 if (!NT_SUCCESS(Status
))
4272 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4276 Status
= SampRegDeleteValue(MembersKeyHandle
,
4278 if (!NT_SUCCESS(Status
))
4280 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4284 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4287 if (!NT_SUCCESS(Status
))
4289 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4293 if (ulValueCount
== 0)
4295 SampRegCloseKey(MembersKeyHandle
);
4296 MembersKeyHandle
= NULL
;
4298 Status
= SampRegDeleteKey(AliasObject
->KeyHandle
,
4300 if (!NT_SUCCESS(Status
))
4302 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4308 if (MemberKeyHandle
!= NULL
)
4309 SampRegCloseKey(MemberKeyHandle
);
4311 if (MembersKeyHandle
!= NULL
)
4312 SampRegCloseKey(MembersKeyHandle
);
4314 if (MemberIdString
!= NULL
)
4315 LocalFree(MemberIdString
);
4324 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4325 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4327 PSAM_DB_OBJECT AliasObject
;
4328 HANDLE MembersKeyHandle
= NULL
;
4329 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4330 ULONG ValueCount
= 0;
4335 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4336 AliasHandle
, Members
);
4338 /* Validate the alias handle */
4339 Status
= SampValidateDbObject(AliasHandle
,
4343 if (!NT_SUCCESS(Status
))
4345 ERR("failed with status 0x%08lx\n", Status
);
4349 /* Open the members key of the alias objct */
4350 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4354 if (!NT_SUCCESS(Status
))
4356 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4360 /* Get the number of members */
4361 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4364 if (!NT_SUCCESS(Status
))
4366 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4370 /* Allocate the member array */
4371 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4372 if (MemberArray
== NULL
)
4374 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4378 /* Enumerate the members */
4382 /* Get the size of the next SID */
4384 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4391 if (!NT_SUCCESS(Status
))
4393 if (Status
== STATUS_NO_MORE_ENTRIES
)
4394 Status
= STATUS_SUCCESS
;
4398 /* Allocate a buffer for the SID */
4399 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4400 if (MemberArray
[Index
].SidPointer
== NULL
)
4402 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4406 /* Read the SID into the buffer */
4407 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4412 (PVOID
)MemberArray
[Index
].SidPointer
,
4414 if (!NT_SUCCESS(Status
))
4422 /* Return the number of members and the member array */
4423 if (NT_SUCCESS(Status
))
4425 Members
->Count
= ValueCount
;
4426 Members
->Sids
= MemberArray
;
4430 /* Clean up the members array and the SID buffers if something failed */
4431 if (!NT_SUCCESS(Status
))
4433 if (MemberArray
!= NULL
)
4435 for (Index
= 0; Index
< ValueCount
; Index
++)
4437 if (MemberArray
[Index
].SidPointer
!= NULL
)
4438 midl_user_free(MemberArray
[Index
].SidPointer
);
4441 midl_user_free(MemberArray
);
4445 /* Close the members key */
4446 if (MembersKeyHandle
!= NULL
)
4447 SampRegCloseKey(MembersKeyHandle
);
4456 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
4457 IN ACCESS_MASK DesiredAccess
,
4458 IN
unsigned long UserId
,
4459 OUT SAMPR_HANDLE
*UserHandle
)
4461 PSAM_DB_OBJECT DomainObject
;
4462 PSAM_DB_OBJECT UserObject
;
4466 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
4467 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
4469 /* Validate the domain handle */
4470 Status
= SampValidateDbObject(DomainHandle
,
4474 if (!NT_SUCCESS(Status
))
4476 TRACE("failed with status 0x%08lx\n", Status
);
4480 /* Convert the RID into a string (hex) */
4481 swprintf(szRid
, L
"%08lX", UserId
);
4483 /* Create the user object */
4484 Status
= SampOpenDbObject(DomainObject
,
4490 if (!NT_SUCCESS(Status
))
4492 TRACE("failed with status 0x%08lx\n", Status
);
4496 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
4498 return STATUS_SUCCESS
;
4505 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
4508 return STATUS_NOT_IMPLEMENTED
;
4514 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
4515 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4517 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4518 SAM_USER_FIXED_DATA FixedData
;
4524 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4525 if (InfoBuffer
== NULL
)
4526 return STATUS_INSUFFICIENT_RESOURCES
;
4528 Length
= sizeof(SAM_USER_FIXED_DATA
);
4529 Status
= SampGetObjectAttribute(UserObject
,
4534 if (!NT_SUCCESS(Status
))
4537 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4539 /* Get the Name string */
4540 Status
= SampGetObjectAttributeString(UserObject
,
4542 &InfoBuffer
->General
.UserName
);
4543 if (!NT_SUCCESS(Status
))
4545 TRACE("Status 0x%08lx\n", Status
);
4549 /* Get the FullName string */
4550 Status
= SampGetObjectAttributeString(UserObject
,
4552 &InfoBuffer
->General
.FullName
);
4553 if (!NT_SUCCESS(Status
))
4555 TRACE("Status 0x%08lx\n", Status
);
4559 /* Get the AdminComment string */
4560 Status
= SampGetObjectAttributeString(UserObject
,
4562 &InfoBuffer
->General
.AdminComment
);
4563 if (!NT_SUCCESS(Status
))
4565 TRACE("Status 0x%08lx\n", Status
);
4569 /* Get the UserComment string */
4570 Status
= SampGetObjectAttributeString(UserObject
,
4572 &InfoBuffer
->General
.UserComment
);
4573 if (!NT_SUCCESS(Status
))
4575 TRACE("Status 0x%08lx\n", Status
);
4579 *Buffer
= InfoBuffer
;
4582 if (!NT_SUCCESS(Status
))
4584 if (InfoBuffer
!= NULL
)
4586 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
4587 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
4589 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
4590 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
4592 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4593 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4595 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
4596 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
4598 midl_user_free(InfoBuffer
);
4608 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
4609 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4611 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4612 SAM_USER_FIXED_DATA FixedData
;
4618 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4619 if (InfoBuffer
== NULL
)
4620 return STATUS_INSUFFICIENT_RESOURCES
;
4622 Length
= sizeof(SAM_USER_FIXED_DATA
);
4623 Status
= SampGetObjectAttribute(UserObject
,
4628 if (!NT_SUCCESS(Status
))
4631 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
4632 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
4634 /* Get the UserComment string */
4635 Status
= SampGetObjectAttributeString(UserObject
,
4637 &InfoBuffer
->Preferences
.UserComment
);
4638 if (!NT_SUCCESS(Status
))
4640 TRACE("Status 0x%08lx\n", Status
);
4644 *Buffer
= InfoBuffer
;
4647 if (!NT_SUCCESS(Status
))
4649 if (InfoBuffer
!= NULL
)
4651 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
4652 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
4654 midl_user_free(InfoBuffer
);
4664 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
4665 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4667 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4668 SAM_USER_FIXED_DATA FixedData
;
4674 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4675 if (InfoBuffer
== NULL
)
4676 return STATUS_INSUFFICIENT_RESOURCES
;
4678 Length
= sizeof(SAM_USER_FIXED_DATA
);
4679 Status
= SampGetObjectAttribute(UserObject
,
4684 if (!NT_SUCCESS(Status
))
4687 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
4688 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4689 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4690 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4691 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4692 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4693 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4694 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4695 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4696 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
4697 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
4699 // OLD_LARGE_INTEGER PasswordCanChange;
4700 // OLD_LARGE_INTEGER PasswordMustChange;
4702 /* Get the Name string */
4703 Status
= SampGetObjectAttributeString(UserObject
,
4705 &InfoBuffer
->Logon
.UserName
);
4706 if (!NT_SUCCESS(Status
))
4708 TRACE("Status 0x%08lx\n", Status
);
4712 /* Get the FullName string */
4713 Status
= SampGetObjectAttributeString(UserObject
,
4715 &InfoBuffer
->Logon
.FullName
);
4716 if (!NT_SUCCESS(Status
))
4718 TRACE("Status 0x%08lx\n", Status
);
4722 /* Get the HomeDirectory string */
4723 Status
= SampGetObjectAttributeString(UserObject
,
4725 &InfoBuffer
->Logon
.HomeDirectory
);
4726 if (!NT_SUCCESS(Status
))
4728 TRACE("Status 0x%08lx\n", Status
);
4732 /* Get the HomeDirectoryDrive string */
4733 Status
= SampGetObjectAttributeString(UserObject
,
4734 L
"HomeDirectoryDrive",
4735 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
4736 if (!NT_SUCCESS(Status
))
4738 TRACE("Status 0x%08lx\n", Status
);
4742 /* Get the ScriptPath string */
4743 Status
= SampGetObjectAttributeString(UserObject
,
4745 &InfoBuffer
->Logon
.ScriptPath
);
4746 if (!NT_SUCCESS(Status
))
4748 TRACE("Status 0x%08lx\n", Status
);
4752 /* Get the ProfilePath string */
4753 Status
= SampGetObjectAttributeString(UserObject
,
4755 &InfoBuffer
->Logon
.ProfilePath
);
4756 if (!NT_SUCCESS(Status
))
4758 TRACE("Status 0x%08lx\n", Status
);
4762 /* Get the WorkStations string */
4763 Status
= SampGetObjectAttributeString(UserObject
,
4765 &InfoBuffer
->Logon
.WorkStations
);
4766 if (!NT_SUCCESS(Status
))
4768 TRACE("Status 0x%08lx\n", Status
);
4772 /* FIXME: LogonHours */
4774 *Buffer
= InfoBuffer
;
4777 if (!NT_SUCCESS(Status
))
4779 if (InfoBuffer
!= NULL
)
4781 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
4782 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
4784 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
4785 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
4787 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
4788 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
4790 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
4791 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
4793 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
4794 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
4796 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
4797 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
4799 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
4800 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
4802 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
4803 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
4805 midl_user_free(InfoBuffer
);
4815 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
4816 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4818 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4819 SAM_USER_FIXED_DATA FixedData
;
4825 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4826 if (InfoBuffer
== NULL
)
4827 return STATUS_INSUFFICIENT_RESOURCES
;
4829 Length
= sizeof(SAM_USER_FIXED_DATA
);
4830 Status
= SampGetObjectAttribute(UserObject
,
4835 if (!NT_SUCCESS(Status
))
4838 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
4839 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4840 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4841 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4842 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4843 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4844 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4845 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4846 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
4847 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
4848 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4849 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
4850 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
4852 /* Get the Name string */
4853 Status
= SampGetObjectAttributeString(UserObject
,
4855 &InfoBuffer
->Account
.UserName
);
4856 if (!NT_SUCCESS(Status
))
4858 TRACE("Status 0x%08lx\n", Status
);
4862 /* Get the FullName string */
4863 Status
= SampGetObjectAttributeString(UserObject
,
4865 &InfoBuffer
->Account
.FullName
);
4866 if (!NT_SUCCESS(Status
))
4868 TRACE("Status 0x%08lx\n", Status
);
4872 /* Get the HomeDirectory string */
4873 Status
= SampGetObjectAttributeString(UserObject
,
4875 &InfoBuffer
->Account
.HomeDirectory
);
4876 if (!NT_SUCCESS(Status
))
4878 TRACE("Status 0x%08lx\n", Status
);
4882 /* Get the HomeDirectoryDrive string */
4883 Status
= SampGetObjectAttributeString(UserObject
,
4884 L
"HomeDirectoryDrive",
4885 &InfoBuffer
->Account
.HomeDirectoryDrive
);
4886 if (!NT_SUCCESS(Status
))
4888 TRACE("Status 0x%08lx\n", Status
);
4892 /* Get the ScriptPath string */
4893 Status
= SampGetObjectAttributeString(UserObject
,
4895 &InfoBuffer
->Account
.ScriptPath
);
4896 if (!NT_SUCCESS(Status
))
4898 TRACE("Status 0x%08lx\n", Status
);
4902 /* Get the ProfilePath string */
4903 Status
= SampGetObjectAttributeString(UserObject
,
4905 &InfoBuffer
->Account
.ProfilePath
);
4906 if (!NT_SUCCESS(Status
))
4908 TRACE("Status 0x%08lx\n", Status
);
4912 /* Get the AdminComment string */
4913 Status
= SampGetObjectAttributeString(UserObject
,
4915 &InfoBuffer
->Account
.AdminComment
);
4916 if (!NT_SUCCESS(Status
))
4918 TRACE("Status 0x%08lx\n", Status
);
4922 /* Get the WorkStations string */
4923 Status
= SampGetObjectAttributeString(UserObject
,
4925 &InfoBuffer
->Account
.WorkStations
);
4926 if (!NT_SUCCESS(Status
))
4928 TRACE("Status 0x%08lx\n", Status
);
4932 /* FIXME: LogonHours */
4934 *Buffer
= InfoBuffer
;
4937 if (!NT_SUCCESS(Status
))
4939 if (InfoBuffer
!= NULL
)
4941 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
4942 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
4944 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
4945 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
4947 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
4948 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
4950 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
4951 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
4953 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
4954 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
4956 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
4957 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
4959 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
4960 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
4962 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
4963 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
4965 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
4966 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
4968 midl_user_free(InfoBuffer
);
4975 /* FIXME: SampQueryUserLogonHours */
4979 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
4980 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4982 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4987 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4988 if (InfoBuffer
== NULL
)
4989 return STATUS_INSUFFICIENT_RESOURCES
;
4991 /* Get the Name string */
4992 Status
= SampGetObjectAttributeString(UserObject
,
4994 &InfoBuffer
->Name
.UserName
);
4995 if (!NT_SUCCESS(Status
))
4997 TRACE("Status 0x%08lx\n", Status
);
5001 /* Get the FullName string */
5002 Status
= SampGetObjectAttributeString(UserObject
,
5004 &InfoBuffer
->Name
.FullName
);
5005 if (!NT_SUCCESS(Status
))
5007 TRACE("Status 0x%08lx\n", Status
);
5011 *Buffer
= InfoBuffer
;
5014 if (!NT_SUCCESS(Status
))
5016 if (InfoBuffer
!= NULL
)
5018 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5019 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5021 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5022 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5024 midl_user_free(InfoBuffer
);
5033 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5034 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5036 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5041 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5042 if (InfoBuffer
== NULL
)
5043 return STATUS_INSUFFICIENT_RESOURCES
;
5045 /* Get the Name string */
5046 Status
= SampGetObjectAttributeString(UserObject
,
5048 &InfoBuffer
->AccountName
.UserName
);
5049 if (!NT_SUCCESS(Status
))
5051 TRACE("Status 0x%08lx\n", Status
);
5055 *Buffer
= InfoBuffer
;
5058 if (!NT_SUCCESS(Status
))
5060 if (InfoBuffer
!= NULL
)
5062 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5063 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5065 midl_user_free(InfoBuffer
);
5074 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5075 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5077 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5082 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5083 if (InfoBuffer
== NULL
)
5084 return STATUS_INSUFFICIENT_RESOURCES
;
5086 /* Get the FullName string */
5087 Status
= SampGetObjectAttributeString(UserObject
,
5089 &InfoBuffer
->FullName
.FullName
);
5090 if (!NT_SUCCESS(Status
))
5092 TRACE("Status 0x%08lx\n", Status
);
5096 *Buffer
= InfoBuffer
;
5099 if (!NT_SUCCESS(Status
))
5101 if (InfoBuffer
!= NULL
)
5103 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
5104 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5106 midl_user_free(InfoBuffer
);
5116 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5117 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5119 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5120 SAM_USER_FIXED_DATA FixedData
;
5126 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5127 if (InfoBuffer
== NULL
)
5128 return STATUS_INSUFFICIENT_RESOURCES
;
5130 Length
= sizeof(SAM_USER_FIXED_DATA
);
5131 Status
= SampGetObjectAttribute(UserObject
,
5136 if (!NT_SUCCESS(Status
))
5139 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5141 *Buffer
= InfoBuffer
;
5144 if (!NT_SUCCESS(Status
))
5146 if (InfoBuffer
!= NULL
)
5148 midl_user_free(InfoBuffer
);
5157 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5158 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5160 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5165 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5166 if (InfoBuffer
== NULL
)
5167 return STATUS_INSUFFICIENT_RESOURCES
;
5169 /* Get the HomeDirectory string */
5170 Status
= SampGetObjectAttributeString(UserObject
,
5172 &InfoBuffer
->Home
.HomeDirectory
);
5173 if (!NT_SUCCESS(Status
))
5175 TRACE("Status 0x%08lx\n", Status
);
5179 /* Get the HomeDirectoryDrive string */
5180 Status
= SampGetObjectAttributeString(UserObject
,
5181 L
"HomeDirectoryDrive",
5182 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5183 if (!NT_SUCCESS(Status
))
5185 TRACE("Status 0x%08lx\n", Status
);
5189 *Buffer
= InfoBuffer
;
5192 if (!NT_SUCCESS(Status
))
5194 if (InfoBuffer
!= NULL
)
5196 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5197 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5199 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5200 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5202 midl_user_free(InfoBuffer
);
5211 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5212 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5214 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5219 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5220 if (InfoBuffer
== NULL
)
5221 return STATUS_INSUFFICIENT_RESOURCES
;
5223 /* Get the ScriptPath string */
5224 Status
= SampGetObjectAttributeString(UserObject
,
5226 &InfoBuffer
->Script
.ScriptPath
);
5227 if (!NT_SUCCESS(Status
))
5229 TRACE("Status 0x%08lx\n", Status
);
5233 *Buffer
= InfoBuffer
;
5236 if (!NT_SUCCESS(Status
))
5238 if (InfoBuffer
!= NULL
)
5240 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5241 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5243 midl_user_free(InfoBuffer
);
5252 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5253 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5255 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5260 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5261 if (InfoBuffer
== NULL
)
5262 return STATUS_INSUFFICIENT_RESOURCES
;
5264 /* Get the ProfilePath string */
5265 Status
= SampGetObjectAttributeString(UserObject
,
5267 &InfoBuffer
->Profile
.ProfilePath
);
5268 if (!NT_SUCCESS(Status
))
5270 TRACE("Status 0x%08lx\n", Status
);
5274 *Buffer
= InfoBuffer
;
5277 if (!NT_SUCCESS(Status
))
5279 if (InfoBuffer
!= NULL
)
5281 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
5282 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5284 midl_user_free(InfoBuffer
);
5293 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5294 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5296 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5301 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5302 if (InfoBuffer
== NULL
)
5303 return STATUS_INSUFFICIENT_RESOURCES
;
5305 /* Get the AdminComment string */
5306 Status
= SampGetObjectAttributeString(UserObject
,
5308 &InfoBuffer
->AdminComment
.AdminComment
);
5309 if (!NT_SUCCESS(Status
))
5311 TRACE("Status 0x%08lx\n", Status
);
5315 *Buffer
= InfoBuffer
;
5318 if (!NT_SUCCESS(Status
))
5320 if (InfoBuffer
!= NULL
)
5322 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5323 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5325 midl_user_free(InfoBuffer
);
5334 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5335 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5337 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5342 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5343 if (InfoBuffer
== NULL
)
5344 return STATUS_INSUFFICIENT_RESOURCES
;
5346 /* Get the WorkStations string */
5347 Status
= SampGetObjectAttributeString(UserObject
,
5349 &InfoBuffer
->WorkStations
.WorkStations
);
5350 if (!NT_SUCCESS(Status
))
5352 TRACE("Status 0x%08lx\n", Status
);
5356 *Buffer
= InfoBuffer
;
5359 if (!NT_SUCCESS(Status
))
5361 if (InfoBuffer
!= NULL
)
5363 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
5364 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
5366 midl_user_free(InfoBuffer
);
5376 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
5377 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5379 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5380 SAM_USER_FIXED_DATA FixedData
;
5386 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5387 if (InfoBuffer
== NULL
)
5388 return STATUS_INSUFFICIENT_RESOURCES
;
5390 Length
= sizeof(SAM_USER_FIXED_DATA
);
5391 Status
= SampGetObjectAttribute(UserObject
,
5396 if (!NT_SUCCESS(Status
))
5399 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
5401 *Buffer
= InfoBuffer
;
5404 if (!NT_SUCCESS(Status
))
5406 if (InfoBuffer
!= NULL
)
5408 midl_user_free(InfoBuffer
);
5418 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
5419 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5421 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5422 SAM_USER_FIXED_DATA FixedData
;
5428 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5429 if (InfoBuffer
== NULL
)
5430 return STATUS_INSUFFICIENT_RESOURCES
;
5432 Length
= sizeof(SAM_USER_FIXED_DATA
);
5433 Status
= SampGetObjectAttribute(UserObject
,
5438 if (!NT_SUCCESS(Status
))
5441 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5442 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5444 *Buffer
= InfoBuffer
;
5447 if (!NT_SUCCESS(Status
))
5449 if (InfoBuffer
!= NULL
)
5451 midl_user_free(InfoBuffer
);
5462 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
5463 IN USER_INFORMATION_CLASS UserInformationClass
,
5464 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
5466 PSAM_DB_OBJECT UserObject
;
5467 ACCESS_MASK DesiredAccess
;
5470 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
5471 UserHandle
, UserInformationClass
, Buffer
);
5473 switch (UserInformationClass
)
5475 case UserGeneralInformation
:
5476 case UserNameInformation
:
5477 case UserAccountNameInformation
:
5478 case UserFullNameInformation
:
5479 case UserPrimaryGroupInformation
:
5480 case UserAdminCommentInformation
:
5481 DesiredAccess
= USER_READ_GENERAL
;
5484 case UserLogonHoursInformation
:
5485 case UserHomeInformation
:
5486 case UserScriptInformation
:
5487 case UserProfileInformation
:
5488 case UserWorkStationsInformation
:
5489 DesiredAccess
= USER_READ_LOGON
;
5492 case UserControlInformation
:
5493 case UserExpiresInformation
:
5494 DesiredAccess
= USER_READ_ACCOUNT
;
5497 case UserPreferencesInformation
:
5498 DesiredAccess
= USER_READ_GENERAL
|
5499 USER_READ_PREFERENCES
;
5502 case UserLogonInformation
:
5503 case UserAccountInformation
:
5504 DesiredAccess
= USER_READ_GENERAL
|
5505 USER_READ_PREFERENCES
|
5511 return STATUS_INVALID_INFO_CLASS
;
5514 /* Validate the domain handle */
5515 Status
= SampValidateDbObject(UserHandle
,
5519 if (!NT_SUCCESS(Status
))
5521 TRACE("failed with status 0x%08lx\n", Status
);
5525 switch (UserInformationClass
)
5527 case UserGeneralInformation
:
5528 Status
= SampQueryUserGeneral(UserObject
,
5532 case UserPreferencesInformation
:
5533 Status
= SampQueryUserPreferences(UserObject
,
5537 case UserLogonInformation
:
5538 Status
= SampQueryUserLogon(UserObject
,
5542 // case UserLogonHoursInformation:
5543 // Status = SampQueryUserLogonHours(UserObject,
5547 case UserAccountInformation
:
5548 Status
= SampQueryUserAccount(UserObject
,
5552 case UserNameInformation
:
5553 Status
= SampQueryUserName(UserObject
,
5557 case UserAccountNameInformation
:
5558 Status
= SampQueryUserAccountName(UserObject
,
5562 case UserFullNameInformation
:
5563 Status
= SampQueryUserFullName(UserObject
,
5567 case UserPrimaryGroupInformation
:
5568 Status
= SampQueryUserPrimaryGroup(UserObject
,
5572 case UserHomeInformation
:
5573 Status
= SampQueryUserHome(UserObject
,
5576 case UserScriptInformation
:
5577 Status
= SampQueryUserScript(UserObject
,
5581 case UserProfileInformation
:
5582 Status
= SampQueryUserProfile(UserObject
,
5586 case UserAdminCommentInformation
:
5587 Status
= SampQueryUserAdminComment(UserObject
,
5591 case UserWorkStationsInformation
:
5592 Status
= SampQueryUserWorkStations(UserObject
,
5596 case UserControlInformation
:
5597 Status
= SampQueryUserControl(UserObject
,
5601 case UserExpiresInformation
:
5602 Status
= SampQueryUserExpires(UserObject
,
5607 Status
= STATUS_INVALID_INFO_CLASS
;
5615 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
5616 PSAMPR_USER_INFO_BUFFER Buffer
)
5618 SAM_USER_FIXED_DATA FixedData
;
5622 Length
= sizeof(SAM_USER_FIXED_DATA
);
5623 Status
= SampGetObjectAttribute(UserObject
,
5628 if (!NT_SUCCESS(Status
))
5631 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
5633 Status
= SampSetObjectAttribute(UserObject
,
5638 if (!NT_SUCCESS(Status
))
5641 Status
= SampSetObjectAttribute(UserObject
,
5644 Buffer
->General
.UserName
.Buffer
,
5645 Buffer
->General
.UserName
.MaximumLength
);
5646 if (!NT_SUCCESS(Status
))
5649 Status
= SampSetObjectAttribute(UserObject
,
5652 Buffer
->General
.FullName
.Buffer
,
5653 Buffer
->General
.FullName
.MaximumLength
);
5654 if (!NT_SUCCESS(Status
))
5657 Status
= SampSetObjectAttribute(UserObject
,
5660 Buffer
->General
.AdminComment
.Buffer
,
5661 Buffer
->General
.AdminComment
.MaximumLength
);
5662 if (!NT_SUCCESS(Status
))
5665 Status
= SampSetObjectAttribute(UserObject
,
5668 Buffer
->General
.UserComment
.Buffer
,
5669 Buffer
->General
.UserComment
.MaximumLength
);
5677 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
5678 PSAMPR_USER_INFO_BUFFER Buffer
)
5680 SAM_USER_FIXED_DATA FixedData
;
5684 Length
= sizeof(SAM_USER_FIXED_DATA
);
5685 Status
= SampGetObjectAttribute(UserObject
,
5690 if (!NT_SUCCESS(Status
))
5693 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
5694 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
5696 Status
= SampSetObjectAttribute(UserObject
,
5701 if (!NT_SUCCESS(Status
))
5704 Status
= SampSetObjectAttribute(UserObject
,
5707 Buffer
->Preferences
.UserComment
.Buffer
,
5708 Buffer
->Preferences
.UserComment
.MaximumLength
);
5716 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5717 PSAMPR_USER_INFO_BUFFER Buffer
)
5719 SAM_USER_FIXED_DATA FixedData
;
5723 Length
= sizeof(SAM_USER_FIXED_DATA
);
5724 Status
= SampGetObjectAttribute(UserObject
,
5729 if (!NT_SUCCESS(Status
))
5732 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
5734 Status
= SampSetObjectAttribute(UserObject
,
5746 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
5747 PSAMPR_USER_INFO_BUFFER Buffer
)
5749 SAM_USER_FIXED_DATA FixedData
;
5753 Length
= sizeof(SAM_USER_FIXED_DATA
);
5754 Status
= SampGetObjectAttribute(UserObject
,
5759 if (!NT_SUCCESS(Status
))
5762 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
5764 Status
= SampSetObjectAttribute(UserObject
,
5776 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
5777 PSAMPR_USER_INFO_BUFFER Buffer
)
5779 SAM_USER_FIXED_DATA FixedData
;
5783 Length
= sizeof(SAM_USER_FIXED_DATA
);
5784 Status
= SampGetObjectAttribute(UserObject
,
5789 if (!NT_SUCCESS(Status
))
5792 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
5793 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
5795 Status
= SampSetObjectAttribute(UserObject
,
5809 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
5810 IN USER_INFORMATION_CLASS UserInformationClass
,
5811 IN PSAMPR_USER_INFO_BUFFER Buffer
)
5813 PSAM_DB_OBJECT UserObject
;
5814 ACCESS_MASK DesiredAccess
;
5817 TRACE("SamrSetInformationUser(%p %lu %p)\n",
5818 UserHandle
, UserInformationClass
, Buffer
);
5820 switch (UserInformationClass
)
5822 case UserLogonHoursInformation
:
5823 case UserNameInformation
:
5824 case UserAccountNameInformation
:
5825 case UserFullNameInformation
:
5826 case UserPrimaryGroupInformation
:
5827 case UserHomeInformation
:
5828 case UserScriptInformation
:
5829 case UserProfileInformation
:
5830 case UserAdminCommentInformation
:
5831 case UserWorkStationsInformation
:
5832 case UserControlInformation
:
5833 case UserExpiresInformation
:
5834 DesiredAccess
= USER_WRITE_ACCOUNT
;
5837 case UserGeneralInformation
:
5838 DesiredAccess
= USER_WRITE_ACCOUNT
|
5839 USER_WRITE_PREFERENCES
;
5842 case UserPreferencesInformation
:
5843 DesiredAccess
= USER_WRITE_PREFERENCES
;
5846 case UserSetPasswordInformation
:
5847 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
5851 return STATUS_INVALID_INFO_CLASS
;
5854 /* Validate the domain handle */
5855 Status
= SampValidateDbObject(UserHandle
,
5859 if (!NT_SUCCESS(Status
))
5861 TRACE("failed with status 0x%08lx\n", Status
);
5865 switch (UserInformationClass
)
5867 case UserGeneralInformation
:
5868 Status
= SampSetUserGeneral(UserObject
,
5872 case UserPreferencesInformation
:
5873 Status
= SampSetUserPreferences(UserObject
,
5877 case UserLogonHoursInformation:
5878 Status = SampSetUserLogonHours(UserObject,
5882 case UserNameInformation
:
5883 Status
= SampSetObjectAttribute(UserObject
,
5886 Buffer
->Name
.UserName
.Buffer
,
5887 Buffer
->Name
.UserName
.MaximumLength
);
5888 if (!NT_SUCCESS(Status
))
5891 Status
= SampSetObjectAttribute(UserObject
,
5894 Buffer
->Name
.FullName
.Buffer
,
5895 Buffer
->Name
.FullName
.MaximumLength
);
5898 case UserAccountNameInformation
:
5899 Status
= SampSetObjectAttribute(UserObject
,
5902 Buffer
->AccountName
.UserName
.Buffer
,
5903 Buffer
->AccountName
.UserName
.MaximumLength
);
5906 case UserFullNameInformation
:
5907 Status
= SampSetObjectAttribute(UserObject
,
5910 Buffer
->FullName
.FullName
.Buffer
,
5911 Buffer
->FullName
.FullName
.MaximumLength
);
5914 case UserPrimaryGroupInformation
:
5915 Status
= SampSetUserPrimaryGroup(UserObject
,
5919 case UserHomeInformation
:
5920 Status
= SampSetObjectAttribute(UserObject
,
5923 Buffer
->Home
.HomeDirectory
.Buffer
,
5924 Buffer
->Home
.HomeDirectory
.MaximumLength
);
5925 if (!NT_SUCCESS(Status
))
5928 Status
= SampSetObjectAttribute(UserObject
,
5929 L
"HomeDirectoryDrive",
5931 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
5932 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
5935 case UserScriptInformation
:
5936 Status
= SampSetObjectAttribute(UserObject
,
5939 Buffer
->Script
.ScriptPath
.Buffer
,
5940 Buffer
->Script
.ScriptPath
.MaximumLength
);
5943 case UserProfileInformation
:
5944 Status
= SampSetObjectAttribute(UserObject
,
5947 Buffer
->Profile
.ProfilePath
.Buffer
,
5948 Buffer
->Profile
.ProfilePath
.MaximumLength
);
5951 case UserAdminCommentInformation
:
5952 Status
= SampSetObjectAttribute(UserObject
,
5955 Buffer
->AdminComment
.AdminComment
.Buffer
,
5956 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
5959 case UserWorkStationsInformation
:
5960 Status
= SampSetObjectAttribute(UserObject
,
5963 Buffer
->WorkStations
.WorkStations
.Buffer
,
5964 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
5967 case UserSetPasswordInformation
:
5968 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
5969 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
5971 Status
= SampSetObjectAttribute(UserObject
,
5974 Buffer
->SetPassword
.Password
.Buffer
,
5975 Buffer
->SetPassword
.Password
.MaximumLength
);
5978 case UserControlInformation
:
5979 Status
= SampSetUserControl(UserObject
,
5983 case UserExpiresInformation
:
5984 Status
= SampSetUserExpires(UserObject
,
5988 // case UserInternal1Information:
5989 // case UserParametersInformation:
5990 // case UserAllInformation:
5991 // case UserInternal4Information:
5992 // case UserInternal5Information:
5993 // case UserInternal4InformationNew:
5994 // case UserInternal5InformationNew:
5997 Status
= STATUS_INVALID_INFO_CLASS
;
6006 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
6007 IN
unsigned char LmPresent
,
6008 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
6009 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
6010 IN
unsigned char NtPresent
,
6011 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
6012 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
6013 IN
unsigned char NtCrossEncryptionPresent
,
6014 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
6015 IN
unsigned char LmCrossEncryptionPresent
,
6016 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
6019 return STATUS_NOT_IMPLEMENTED
;
6025 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
6026 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
6029 return STATUS_NOT_IMPLEMENTED
;
6035 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
6036 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6037 IN
unsigned long Index
,
6038 IN
unsigned long EntryCount
,
6039 IN
unsigned long PreferredMaximumLength
,
6040 OUT
unsigned long *TotalAvailable
,
6041 OUT
unsigned long *TotalReturned
,
6042 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6045 return STATUS_NOT_IMPLEMENTED
;
6051 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
6052 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6053 IN PRPC_UNICODE_STRING Prefix
,
6054 OUT
unsigned long *Index
)
6057 return STATUS_NOT_IMPLEMENTED
;
6063 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
6066 return STATUS_NOT_IMPLEMENTED
;
6072 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
6075 return STATUS_NOT_IMPLEMENTED
;
6081 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
6082 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6085 return STATUS_NOT_IMPLEMENTED
;
6091 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
6092 IN PRPC_SID MemberSid
)
6095 return STATUS_NOT_IMPLEMENTED
;
6101 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
6102 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
6103 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
6106 return STATUS_NOT_IMPLEMENTED
;
6112 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
6113 IN USER_INFORMATION_CLASS UserInformationClass
,
6114 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6117 return STATUS_NOT_IMPLEMENTED
;
6123 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
6124 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6125 IN
unsigned long Index
,
6126 IN
unsigned long EntryCount
,
6127 IN
unsigned long PreferredMaximumLength
,
6128 OUT
unsigned long *TotalAvailable
,
6129 OUT
unsigned long *TotalReturned
,
6130 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6133 return STATUS_NOT_IMPLEMENTED
;
6139 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
6140 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6141 IN PRPC_UNICODE_STRING Prefix
,
6142 OUT
unsigned long *Index
)
6145 return STATUS_NOT_IMPLEMENTED
;
6152 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
6153 IN PRPC_UNICODE_STRING Name
,
6154 IN
unsigned long AccountType
,
6155 IN ACCESS_MASK DesiredAccess
,
6156 OUT SAMPR_HANDLE
*UserHandle
,
6157 OUT
unsigned long *GrantedAccess
,
6158 OUT
unsigned long *RelativeId
)
6160 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
6161 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
6162 SAM_USER_FIXED_DATA FixedUserData
;
6163 PSAM_DB_OBJECT DomainObject
;
6164 PSAM_DB_OBJECT UserObject
;
6170 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
6171 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
6174 Name
->Length
== 0 ||
6175 Name
->Buffer
== NULL
||
6176 UserHandle
== NULL
||
6178 return STATUS_INVALID_PARAMETER
;
6180 /* Check for valid account type */
6181 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
6182 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
6183 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
6184 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
6185 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
6186 return STATUS_INVALID_PARAMETER
;
6188 /* Validate the domain handle */
6189 Status
= SampValidateDbObject(DomainHandle
,
6193 if (!NT_SUCCESS(Status
))
6195 TRACE("failed with status 0x%08lx\n", Status
);
6199 /* Check if the user name already exists in the domain */
6200 Status
= SampCheckAccountNameInDomain(DomainObject
,
6202 if (!NT_SUCCESS(Status
))
6204 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
6205 Name
->Buffer
, Status
);
6209 /* Get the fixed domain attributes */
6210 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6211 Status
= SampGetObjectAttribute(DomainObject
,
6214 (PVOID
)&FixedDomainData
,
6216 if (!NT_SUCCESS(Status
))
6218 TRACE("failed with status 0x%08lx\n", Status
);
6222 /* Increment the NextRid attribute */
6223 ulRid
= FixedDomainData
.NextRid
;
6224 FixedDomainData
.NextRid
++;
6226 /* Store the fixed domain attributes */
6227 Status
= SampSetObjectAttribute(DomainObject
,
6232 if (!NT_SUCCESS(Status
))
6234 TRACE("failed with status 0x%08lx\n", Status
);
6238 TRACE("RID: %lx\n", ulRid
);
6240 /* Convert the RID into a string (hex) */
6241 swprintf(szRid
, L
"%08lX", ulRid
);
6243 /* Create the user object */
6244 Status
= SampCreateDbObject(DomainObject
,
6250 if (!NT_SUCCESS(Status
))
6252 TRACE("failed with status 0x%08lx\n", Status
);
6256 /* Add the account name for the user object */
6257 Status
= SampSetAccountNameInDomain(DomainObject
,
6261 if (!NT_SUCCESS(Status
))
6263 TRACE("failed with status 0x%08lx\n", Status
);
6267 /* Initialize fixed user data */
6268 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
6269 FixedUserData
.Version
= 1;
6270 FixedUserData
.LastLogon
.QuadPart
= 0;
6271 FixedUserData
.LastLogoff
.QuadPart
= 0;
6272 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
6273 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
6274 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
6275 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
6276 FixedUserData
.UserId
= ulRid
;
6277 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
6278 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
6279 USER_PASSWORD_NOT_REQUIRED
|
6282 /* Set fixed user data attribute */
6283 Status
= SampSetObjectAttribute(UserObject
,
6286 (LPVOID
)&FixedUserData
,
6287 sizeof(SAM_USER_FIXED_DATA
));
6288 if (!NT_SUCCESS(Status
))
6290 TRACE("failed with status 0x%08lx\n", Status
);
6294 /* Set the Name attribute */
6295 Status
= SampSetObjectAttribute(UserObject
,
6298 (LPVOID
)Name
->Buffer
,
6299 Name
->MaximumLength
);
6300 if (!NT_SUCCESS(Status
))
6302 TRACE("failed with status 0x%08lx\n", Status
);
6306 /* Set the FullName attribute */
6307 Status
= SampSetObjectAttribute(UserObject
,
6311 EmptyString
.MaximumLength
);
6312 if (!NT_SUCCESS(Status
))
6314 TRACE("failed with status 0x%08lx\n", Status
);
6318 /* Set the HomeDirectory attribute */
6319 Status
= SampSetObjectAttribute(UserObject
,
6323 EmptyString
.MaximumLength
);
6324 if (!NT_SUCCESS(Status
))
6326 TRACE("failed with status 0x%08lx\n", Status
);
6330 /* Set the HomeDirectoryDrive attribute */
6331 Status
= SampSetObjectAttribute(UserObject
,
6332 L
"HomeDirectoryDrive",
6335 EmptyString
.MaximumLength
);
6336 if (!NT_SUCCESS(Status
))
6338 TRACE("failed with status 0x%08lx\n", Status
);
6342 /* Set the ScriptPath attribute */
6343 Status
= SampSetObjectAttribute(UserObject
,
6347 EmptyString
.MaximumLength
);
6348 if (!NT_SUCCESS(Status
))
6350 TRACE("failed with status 0x%08lx\n", Status
);
6354 /* Set the ProfilePath attribute */
6355 Status
= SampSetObjectAttribute(UserObject
,
6359 EmptyString
.MaximumLength
);
6360 if (!NT_SUCCESS(Status
))
6362 TRACE("failed with status 0x%08lx\n", Status
);
6366 /* Set the AdminComment attribute */
6367 Status
= SampSetObjectAttribute(UserObject
,
6371 EmptyString
.MaximumLength
);
6372 if (!NT_SUCCESS(Status
))
6374 TRACE("failed with status 0x%08lx\n", Status
);
6378 /* Set the UserComment attribute */
6379 Status
= SampSetObjectAttribute(UserObject
,
6383 EmptyString
.MaximumLength
);
6384 if (!NT_SUCCESS(Status
))
6386 TRACE("failed with status 0x%08lx\n", Status
);
6390 /* Set the WorkStations attribute */
6391 Status
= SampSetObjectAttribute(UserObject
,
6395 EmptyString
.MaximumLength
);
6396 if (!NT_SUCCESS(Status
))
6398 TRACE("failed with status 0x%08lx\n", Status
);
6402 /* FIXME: Set default user attributes */
6404 if (NT_SUCCESS(Status
))
6406 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
6407 *RelativeId
= ulRid
;
6408 *GrantedAccess
= UserObject
->Access
;
6411 TRACE("returns with status 0x%08lx\n", Status
);
6420 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
6421 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6422 IN
unsigned long Index
,
6423 IN
unsigned long EntryCount
,
6424 IN
unsigned long PreferredMaximumLength
,
6425 OUT
unsigned long *TotalAvailable
,
6426 OUT
unsigned long *TotalReturned
,
6427 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6430 return STATUS_NOT_IMPLEMENTED
;
6437 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
6438 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6441 NTSTATUS Status
= STATUS_SUCCESS
;
6443 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
6444 AliasHandle
, MembersBuffer
);
6446 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6448 Status
= SamrAddMemberToAlias(AliasHandle
,
6449 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6451 if (Status
== STATUS_MEMBER_IN_ALIAS
)
6452 Status
= STATUS_SUCCESS
;
6454 if (!NT_SUCCESS(Status
))
6465 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
6466 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6469 NTSTATUS Status
= STATUS_SUCCESS
;
6471 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
6472 AliasHandle
, MembersBuffer
);
6474 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6476 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
6477 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6479 if (Status
== STATUS_MEMBER_IN_ALIAS
)
6480 Status
= STATUS_SUCCESS
;
6482 if (!NT_SUCCESS(Status
))
6493 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
6494 IN PRPC_STRING ServerName
,
6495 IN PRPC_STRING UserName
,
6496 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6497 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
6500 return STATUS_NOT_IMPLEMENTED
;
6506 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
6507 IN PRPC_UNICODE_STRING ServerName
,
6508 IN PRPC_UNICODE_STRING UserName
,
6509 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
6510 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
6511 IN
unsigned char LmPresent
,
6512 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6513 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
6516 return STATUS_NOT_IMPLEMENTED
;
6522 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
6523 IN PRPC_UNICODE_STRING Unused
,
6524 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6527 return STATUS_NOT_IMPLEMENTED
;
6533 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
6534 OUT SAMPR_HANDLE
*ServerHandle
,
6535 IN ACCESS_MASK DesiredAccess
)
6538 return STATUS_NOT_IMPLEMENTED
;
6544 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
6545 IN USER_INFORMATION_CLASS UserInformationClass
,
6546 IN PSAMPR_USER_INFO_BUFFER Buffer
)
6549 return STATUS_NOT_IMPLEMENTED
;
6555 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
6558 return STATUS_NOT_IMPLEMENTED
;
6564 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
6567 return STATUS_NOT_IMPLEMENTED
;
6573 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
6576 return STATUS_NOT_IMPLEMENTED
;
6582 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
6583 OUT SAMPR_HANDLE
*ServerHandle
,
6584 IN
unsigned long ClientRevision
,
6585 IN ACCESS_MASK DesiredAccess
)
6588 return STATUS_NOT_IMPLEMENTED
;
6594 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
6597 return STATUS_NOT_IMPLEMENTED
;
6603 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
6604 IN ACCESS_MASK DesiredAccess
,
6605 IN
unsigned long InVersion
,
6606 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
6607 OUT
unsigned long *OutVersion
,
6608 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
6609 OUT SAMPR_HANDLE
*ServerHandle
)
6612 return STATUS_NOT_IMPLEMENTED
;
6618 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
6619 IN
unsigned long Rid
,
6623 return STATUS_NOT_IMPLEMENTED
;
6629 SamrSetDSRMPassword(IN handle_t BindingHandle
,
6630 IN PRPC_UNICODE_STRING Unused
,
6631 IN
unsigned long UserId
,
6632 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
6635 return STATUS_NOT_IMPLEMENTED
;
6641 SamrValidatePassword(IN handle_t Handle
,
6642 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
6643 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
6644 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
6647 return STATUS_NOT_IMPLEMENTED
;