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
;
161 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
162 IN PRPC_UNICODE_STRING Name
,
163 OUT PRPC_SID
*DomainId
)
165 PSAM_DB_OBJECT ServerObject
;
166 HANDLE DomainsKeyHandle
= NULL
;
167 HANDLE DomainKeyHandle
= NULL
;
168 WCHAR DomainKeyName
[64];
170 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
171 UNICODE_STRING DomainName
;
176 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
177 ServerHandle
, Name
, DomainId
);
179 /* Validate the server handle */
180 Status
= SampValidateDbObject(ServerHandle
,
182 SAM_SERVER_LOOKUP_DOMAIN
,
184 if (!NT_SUCCESS(Status
))
189 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
193 if (!NT_SUCCESS(Status
))
197 while (Found
== FALSE
)
199 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
203 if (!NT_SUCCESS(Status
))
205 if (Status
== STATUS_NO_MORE_ENTRIES
)
206 Status
= STATUS_NO_SUCH_DOMAIN
;
210 TRACE("Domain key name: %S\n", DomainKeyName
);
212 Status
= SampRegOpenKey(DomainsKeyHandle
,
216 if (NT_SUCCESS(Status
))
218 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
219 Status
= SampRegQueryValue(DomainKeyHandle
,
222 (PVOID
)&DomainNameString
,
224 if (NT_SUCCESS(Status
))
226 TRACE("Domain name: %S\n", DomainNameString
);
228 RtlInitUnicodeString(&DomainName
,
230 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
232 TRACE("Found it!\n");
235 Status
= SampRegQueryValue(DomainKeyHandle
,
240 if (NT_SUCCESS(Status
))
242 *DomainId
= midl_user_allocate(Length
);
244 SampRegQueryValue(DomainKeyHandle
,
250 Status
= STATUS_SUCCESS
;
256 NtClose(DomainKeyHandle
);
262 NtClose(DomainsKeyHandle
);
270 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
271 IN OUT
unsigned long *EnumerationContext
,
272 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
273 IN ULONG PreferedMaximumLength
,
274 OUT PULONG CountReturned
)
276 PSAM_DB_OBJECT ServerObject
;
277 WCHAR DomainKeyName
[64];
278 HANDLE DomainsKeyHandle
;
279 HANDLE DomainKeyHandle
;
282 ULONG RequiredLength
;
285 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
288 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
289 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
292 /* Validate the server handle */
293 Status
= SampValidateDbObject(ServerHandle
,
295 SAM_SERVER_ENUMERATE_DOMAINS
,
297 if (!NT_SUCCESS(Status
))
300 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
304 if (!NT_SUCCESS(Status
))
307 EnumIndex
= *EnumerationContext
;
313 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
317 if (!NT_SUCCESS(Status
))
320 TRACE("EnumIndex: %lu\n", EnumIndex
);
321 TRACE("Domain key name: %S\n", DomainKeyName
);
323 Status
= SampRegOpenKey(DomainsKeyHandle
,
327 TRACE("SampRegOpenKey returned %08lX\n", Status
);
328 if (NT_SUCCESS(Status
))
331 Status
= SampRegQueryValue(DomainKeyHandle
,
336 TRACE("SampRegQueryValue returned %08lX\n", Status
);
337 if (NT_SUCCESS(Status
))
339 TRACE("Data length: %lu\n", DataLength
);
341 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
344 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
348 NtClose(DomainKeyHandle
);
354 TRACE("EnumCount: %lu\n", EnumCount
);
355 TRACE("RequiredLength: %lu\n", RequiredLength
);
357 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
358 if (EnumBuffer
== NULL
)
360 Status
= STATUS_INSUFFICIENT_RESOURCES
;
364 EnumBuffer
->EntriesRead
= EnumCount
;
365 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
366 if (EnumBuffer
->Buffer
== NULL
)
368 Status
= STATUS_INSUFFICIENT_RESOURCES
;
372 EnumIndex
= *EnumerationContext
;
373 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
375 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
379 if (!NT_SUCCESS(Status
))
382 TRACE("EnumIndex: %lu\n", EnumIndex
);
383 TRACE("Domain key name: %S\n", DomainKeyName
);
385 Status
= SampRegOpenKey(DomainsKeyHandle
,
389 TRACE("SampRegOpenKey returned %08lX\n", Status
);
390 if (NT_SUCCESS(Status
))
393 Status
= SampRegQueryValue(DomainKeyHandle
,
398 TRACE("SampRegQueryValue returned %08lX\n", Status
);
399 if (NT_SUCCESS(Status
))
401 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
402 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
403 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
404 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
405 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
407 NtClose(DomainKeyHandle
);
408 Status
= STATUS_INSUFFICIENT_RESOURCES
;
412 Status
= SampRegQueryValue(DomainKeyHandle
,
415 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
417 TRACE("SampRegQueryValue returned %08lX\n", Status
);
418 if (NT_SUCCESS(Status
))
420 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
424 NtClose(DomainKeyHandle
);
426 if (!NT_SUCCESS(Status
))
431 if (NT_SUCCESS(Status
))
433 *EnumerationContext
+= EnumCount
;
434 *Buffer
= EnumBuffer
;
435 *CountReturned
= EnumCount
;
439 if (!NT_SUCCESS(Status
))
441 *EnumerationContext
= 0;
445 if (EnumBuffer
!= NULL
)
447 if (EnumBuffer
->Buffer
!= NULL
)
449 if (EnumBuffer
->EntriesRead
!= 0)
451 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
453 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
454 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
458 midl_user_free(EnumBuffer
->Buffer
);
461 midl_user_free(EnumBuffer
);
465 NtClose(DomainsKeyHandle
);
473 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
474 IN ACCESS_MASK DesiredAccess
,
475 IN PRPC_SID DomainId
,
476 OUT SAMPR_HANDLE
*DomainHandle
)
478 PSAM_DB_OBJECT ServerObject
;
479 PSAM_DB_OBJECT DomainObject
;
482 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
483 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
485 /* Validate the server handle */
486 Status
= SampValidateDbObject(ServerHandle
,
488 SAM_SERVER_LOOKUP_DOMAIN
,
490 if (!NT_SUCCESS(Status
))
493 /* Validate the Domain SID */
494 if ((DomainId
->Revision
!= SID_REVISION
) ||
495 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
496 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
497 return STATUS_INVALID_PARAMETER
;
499 /* Open the domain object */
500 if ((DomainId
->SubAuthorityCount
== 1) &&
501 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
503 /* Builtin domain object */
504 TRACE("Opening the builtin domain object.\n");
506 Status
= SampOpenDbObject(ServerObject
,
513 else if ((DomainId
->SubAuthorityCount
== 4) &&
514 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
516 /* Account domain object */
517 TRACE("Opening the account domain object.\n");
519 /* FIXME: Check the account domain sub authorities!!! */
521 Status
= SampOpenDbObject(ServerObject
,
530 /* No vaild domain SID */
531 Status
= STATUS_INVALID_PARAMETER
;
534 if (NT_SUCCESS(Status
))
535 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
537 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
544 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
545 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
547 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
548 SAM_DOMAIN_FIXED_DATA FixedData
;
554 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
555 if (InfoBuffer
== NULL
)
556 return STATUS_INSUFFICIENT_RESOURCES
;
558 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
559 Status
= SampGetObjectAttribute(DomainObject
,
564 if (!NT_SUCCESS(Status
))
567 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
568 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
569 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
570 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
571 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
572 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
573 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
575 *Buffer
= InfoBuffer
;
578 if (!NT_SUCCESS(Status
))
580 if (InfoBuffer
!= NULL
)
582 midl_user_free(InfoBuffer
);
591 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
592 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
594 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
595 SAM_DOMAIN_FIXED_DATA FixedData
;
601 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
602 if (InfoBuffer
== NULL
)
603 return STATUS_INSUFFICIENT_RESOURCES
;
605 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
606 Status
= SampGetObjectAttribute(DomainObject
,
611 if (!NT_SUCCESS(Status
))
614 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
615 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
616 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
617 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
618 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
619 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
620 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
622 /* Get the OemInformation string */
623 Status
= SampGetObjectAttributeString(DomainObject
,
625 &InfoBuffer
->General
.OemInformation
);
626 if (!NT_SUCCESS(Status
))
628 TRACE("Status 0x%08lx\n", Status
);
632 /* Get the Name string */
633 Status
= SampGetObjectAttributeString(DomainObject
,
635 &InfoBuffer
->General
.DomainName
);
636 if (!NT_SUCCESS(Status
))
638 TRACE("Status 0x%08lx\n", Status
);
642 /* Get the ReplicaSourceNodeName string */
643 Status
= SampGetObjectAttributeString(DomainObject
,
644 L
"ReplicaSourceNodeName",
645 &InfoBuffer
->General
.ReplicaSourceNodeName
);
646 if (!NT_SUCCESS(Status
))
648 TRACE("Status 0x%08lx\n", Status
);
652 InfoBuffer
->General
.UserCount
= 0; /* FIXME */
653 InfoBuffer
->General
.GroupCount
= 0; /* FIXME */
654 InfoBuffer
->General
.AliasCount
= 0; /* FIXME */
656 *Buffer
= InfoBuffer
;
659 if (!NT_SUCCESS(Status
))
661 if (InfoBuffer
!= NULL
)
663 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
664 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
666 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
667 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
669 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
670 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
672 midl_user_free(InfoBuffer
);
681 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
682 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
684 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
685 SAM_DOMAIN_FIXED_DATA FixedData
;
691 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
692 if (InfoBuffer
== NULL
)
693 return STATUS_INSUFFICIENT_RESOURCES
;
695 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
696 Status
= SampGetObjectAttribute(DomainObject
,
701 if (!NT_SUCCESS(Status
))
704 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
705 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
707 *Buffer
= InfoBuffer
;
710 if (!NT_SUCCESS(Status
))
712 if (InfoBuffer
!= NULL
)
714 midl_user_free(InfoBuffer
);
723 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
724 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
726 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
731 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
732 if (InfoBuffer
== NULL
)
733 return STATUS_INSUFFICIENT_RESOURCES
;
735 /* Get the OemInformation string */
736 Status
= SampGetObjectAttributeString(DomainObject
,
738 &InfoBuffer
->Oem
.OemInformation
);
739 if (!NT_SUCCESS(Status
))
741 TRACE("Status 0x%08lx\n", Status
);
745 *Buffer
= InfoBuffer
;
748 if (!NT_SUCCESS(Status
))
750 if (InfoBuffer
!= NULL
)
752 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
753 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
755 midl_user_free(InfoBuffer
);
764 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
765 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
767 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
772 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
773 if (InfoBuffer
== NULL
)
774 return STATUS_INSUFFICIENT_RESOURCES
;
776 /* Get the Name string */
777 Status
= SampGetObjectAttributeString(DomainObject
,
779 &InfoBuffer
->Name
.DomainName
);
780 if (!NT_SUCCESS(Status
))
782 TRACE("Status 0x%08lx\n", Status
);
786 *Buffer
= InfoBuffer
;
789 if (!NT_SUCCESS(Status
))
791 if (InfoBuffer
!= NULL
)
793 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
794 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
796 midl_user_free(InfoBuffer
);
805 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
806 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
808 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
813 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
814 if (InfoBuffer
== NULL
)
815 return STATUS_INSUFFICIENT_RESOURCES
;
817 /* Get the ReplicaSourceNodeName string */
818 Status
= SampGetObjectAttributeString(DomainObject
,
819 L
"ReplicaSourceNodeName",
820 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
821 if (!NT_SUCCESS(Status
))
823 TRACE("Status 0x%08lx\n", Status
);
827 *Buffer
= InfoBuffer
;
830 if (!NT_SUCCESS(Status
))
832 if (InfoBuffer
!= NULL
)
834 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
835 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
837 midl_user_free(InfoBuffer
);
846 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
847 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
849 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
850 SAM_DOMAIN_FIXED_DATA FixedData
;
856 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
857 if (InfoBuffer
== NULL
)
858 return STATUS_INSUFFICIENT_RESOURCES
;
860 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
861 Status
= SampGetObjectAttribute(DomainObject
,
866 if (!NT_SUCCESS(Status
))
869 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
871 *Buffer
= InfoBuffer
;
874 if (!NT_SUCCESS(Status
))
876 if (InfoBuffer
!= NULL
)
878 midl_user_free(InfoBuffer
);
887 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
888 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
890 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
891 SAM_DOMAIN_FIXED_DATA FixedData
;
897 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
898 if (InfoBuffer
== NULL
)
899 return STATUS_INSUFFICIENT_RESOURCES
;
901 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
902 Status
= SampGetObjectAttribute(DomainObject
,
907 if (!NT_SUCCESS(Status
))
910 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
911 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
912 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
913 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
915 *Buffer
= InfoBuffer
;
918 if (!NT_SUCCESS(Status
))
920 if (InfoBuffer
!= NULL
)
922 midl_user_free(InfoBuffer
);
931 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
932 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
934 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
935 SAM_DOMAIN_FIXED_DATA FixedData
;
941 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
942 if (InfoBuffer
== NULL
)
943 return STATUS_INSUFFICIENT_RESOURCES
;
945 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
946 Status
= SampGetObjectAttribute(DomainObject
,
951 if (!NT_SUCCESS(Status
))
954 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
956 *Buffer
= InfoBuffer
;
959 if (!NT_SUCCESS(Status
))
961 if (InfoBuffer
!= NULL
)
963 midl_user_free(InfoBuffer
);
972 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
973 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
975 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
976 SAM_DOMAIN_FIXED_DATA FixedData
;
982 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
983 if (InfoBuffer
== NULL
)
984 return STATUS_INSUFFICIENT_RESOURCES
;
986 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
987 Status
= SampGetObjectAttribute(DomainObject
,
992 if (!NT_SUCCESS(Status
))
995 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
996 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
997 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
998 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
999 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1000 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1001 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1003 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1004 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1005 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1007 /* Get the OemInformation string */
1008 Status
= SampGetObjectAttributeString(DomainObject
,
1010 &InfoBuffer
->General2
.I1
.OemInformation
);
1011 if (!NT_SUCCESS(Status
))
1013 TRACE("Status 0x%08lx\n", Status
);
1017 /* Get the Name string */
1018 Status
= SampGetObjectAttributeString(DomainObject
,
1020 &InfoBuffer
->General2
.I1
.DomainName
);
1021 if (!NT_SUCCESS(Status
))
1023 TRACE("Status 0x%08lx\n", Status
);
1027 /* Get the ReplicaSourceNodeName string */
1028 Status
= SampGetObjectAttributeString(DomainObject
,
1029 L
"ReplicaSourceNodeName",
1030 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1031 if (!NT_SUCCESS(Status
))
1033 TRACE("Status 0x%08lx\n", Status
);
1037 InfoBuffer
->General2
.I1
.UserCount
= 0; /* FIXME */
1038 InfoBuffer
->General2
.I1
.GroupCount
= 0; /* FIXME */
1039 InfoBuffer
->General2
.I1
.AliasCount
= 0; /* FIXME */
1041 *Buffer
= InfoBuffer
;
1044 if (!NT_SUCCESS(Status
))
1046 if (InfoBuffer
!= NULL
)
1048 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1049 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1051 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1052 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1054 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1055 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1057 midl_user_free(InfoBuffer
);
1066 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1067 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1069 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1070 SAM_DOMAIN_FIXED_DATA FixedData
;
1076 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1077 if (InfoBuffer
== NULL
)
1078 return STATUS_INSUFFICIENT_RESOURCES
;
1080 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1081 Status
= SampGetObjectAttribute(DomainObject
,
1086 if (!NT_SUCCESS(Status
))
1089 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1090 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1091 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1093 *Buffer
= InfoBuffer
;
1096 if (!NT_SUCCESS(Status
))
1098 if (InfoBuffer
!= NULL
)
1100 midl_user_free(InfoBuffer
);
1109 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1110 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1112 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1113 SAM_DOMAIN_FIXED_DATA FixedData
;
1119 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1120 if (InfoBuffer
== NULL
)
1121 return STATUS_INSUFFICIENT_RESOURCES
;
1123 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1124 Status
= SampGetObjectAttribute(DomainObject
,
1129 if (!NT_SUCCESS(Status
))
1132 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1133 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1134 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1135 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1136 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1137 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1139 *Buffer
= InfoBuffer
;
1142 if (!NT_SUCCESS(Status
))
1144 if (InfoBuffer
!= NULL
)
1146 midl_user_free(InfoBuffer
);
1157 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1158 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1159 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1161 PSAM_DB_OBJECT DomainObject
;
1162 ACCESS_MASK DesiredAccess
;
1165 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1166 DomainHandle
, DomainInformationClass
, Buffer
);
1168 switch (DomainInformationClass
)
1170 case DomainPasswordInformation
:
1171 case DomainLockoutInformation
:
1172 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1175 case DomainGeneralInformation
:
1176 case DomainLogoffInformation
:
1177 case DomainOemInformation
:
1178 case DomainNameInformation
:
1179 case DomainReplicationInformation
:
1180 case DomainServerRoleInformation
:
1181 case DomainModifiedInformation
:
1182 case DomainStateInformation
:
1183 case DomainModifiedInformation2
:
1184 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1187 case DomainGeneralInformation2
:
1188 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1189 DOMAIN_READ_OTHER_PARAMETERS
;
1193 return STATUS_INVALID_INFO_CLASS
;
1196 /* Validate the server handle */
1197 Status
= SampValidateDbObject(DomainHandle
,
1201 if (!NT_SUCCESS(Status
))
1204 switch (DomainInformationClass
)
1206 case DomainPasswordInformation
:
1207 Status
= SampQueryDomainPassword(DomainObject
,
1211 case DomainGeneralInformation
:
1212 Status
= SampQueryDomainGeneral(DomainObject
,
1216 case DomainLogoffInformation
:
1217 Status
= SampQueryDomainLogoff(DomainObject
,
1221 case DomainOemInformation
:
1222 Status
= SampQueryDomainOem(DomainObject
,
1226 case DomainNameInformation
:
1227 Status
= SampQueryDomainName(DomainObject
,
1231 case DomainReplicationInformation
:
1232 Status
= SampQueryDomainReplication(DomainObject
,
1236 case DomainServerRoleInformation
:
1237 Status
= SampQueryDomainServerRole(DomainObject
,
1241 case DomainModifiedInformation
:
1242 Status
= SampQueryDomainModified(DomainObject
,
1246 case DomainStateInformation
:
1247 Status
= SampQueryDomainState(DomainObject
,
1251 case DomainGeneralInformation2
:
1252 Status
= SampQueryDomainGeneral2(DomainObject
,
1256 case DomainLockoutInformation
:
1257 Status
= SampQueryDomainLockout(DomainObject
,
1261 case DomainModifiedInformation2
:
1262 Status
= SampQueryDomainModified2(DomainObject
,
1267 Status
= STATUS_NOT_IMPLEMENTED
;
1275 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1276 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1278 SAM_DOMAIN_FIXED_DATA FixedData
;
1282 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1283 Status
= SampGetObjectAttribute(DomainObject
,
1288 if (!NT_SUCCESS(Status
))
1291 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1292 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1293 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1294 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1295 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1296 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1297 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1299 Status
= SampSetObjectAttribute(DomainObject
,
1311 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1312 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1314 SAM_DOMAIN_FIXED_DATA FixedData
;
1318 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1319 Status
= SampGetObjectAttribute(DomainObject
,
1324 if (!NT_SUCCESS(Status
))
1327 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1328 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1330 Status
= SampSetObjectAttribute(DomainObject
,
1342 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1343 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1345 SAM_DOMAIN_FIXED_DATA FixedData
;
1349 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1350 Status
= SampGetObjectAttribute(DomainObject
,
1355 if (!NT_SUCCESS(Status
))
1358 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1360 Status
= SampSetObjectAttribute(DomainObject
,
1372 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1373 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1375 SAM_DOMAIN_FIXED_DATA FixedData
;
1379 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1380 Status
= SampGetObjectAttribute(DomainObject
,
1385 if (!NT_SUCCESS(Status
))
1388 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1390 Status
= SampSetObjectAttribute(DomainObject
,
1402 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1403 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1405 SAM_DOMAIN_FIXED_DATA FixedData
;
1409 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1410 Status
= SampGetObjectAttribute(DomainObject
,
1415 if (!NT_SUCCESS(Status
))
1418 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1419 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1420 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1422 Status
= SampSetObjectAttribute(DomainObject
,
1436 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1437 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1438 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1440 PSAM_DB_OBJECT DomainObject
;
1441 ACCESS_MASK DesiredAccess
;
1444 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1445 DomainHandle
, DomainInformationClass
, DomainInformation
);
1447 switch (DomainInformationClass
)
1449 case DomainPasswordInformation
:
1450 case DomainLockoutInformation
:
1451 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1454 case DomainLogoffInformation
:
1455 case DomainOemInformation
:
1456 case DomainNameInformation
:
1457 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1460 case DomainReplicationInformation
:
1461 case DomainServerRoleInformation
:
1462 case DomainStateInformation
:
1463 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1467 return STATUS_INVALID_INFO_CLASS
;
1470 /* Validate the server handle */
1471 Status
= SampValidateDbObject(DomainHandle
,
1475 if (!NT_SUCCESS(Status
))
1478 switch (DomainInformationClass
)
1480 case DomainPasswordInformation
:
1481 Status
= SampSetDomainPassword(DomainObject
,
1485 case DomainLogoffInformation
:
1486 Status
= SampSetDomainLogoff(DomainObject
,
1490 case DomainOemInformation
:
1491 Status
= SampSetObjectAttribute(DomainObject
,
1494 DomainInformation
->Oem
.OemInformation
.Buffer
,
1495 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1498 case DomainNameInformation
:
1499 Status
= SampSetObjectAttribute(DomainObject
,
1502 DomainInformation
->Name
.DomainName
.Buffer
,
1503 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1506 case DomainReplicationInformation
:
1507 Status
= SampSetObjectAttribute(DomainObject
,
1508 L
"ReplicaSourceNodeName",
1510 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1511 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1514 case DomainServerRoleInformation
:
1515 Status
= SampSetDomainServerRole(DomainObject
,
1519 case DomainStateInformation
:
1520 Status
= SampSetDomainState(DomainObject
,
1524 case DomainLockoutInformation
:
1525 Status
= SampSetDomainLockout(DomainObject
,
1530 Status
= STATUS_NOT_IMPLEMENTED
;
1539 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1540 IN PRPC_UNICODE_STRING Name
,
1541 IN ACCESS_MASK DesiredAccess
,
1542 OUT SAMPR_HANDLE
*GroupHandle
,
1543 OUT
unsigned long *RelativeId
)
1545 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1546 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1547 SAM_GROUP_FIXED_DATA FixedGroupData
;
1548 PSAM_DB_OBJECT DomainObject
;
1549 PSAM_DB_OBJECT GroupObject
;
1555 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1556 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1558 /* Validate the domain handle */
1559 Status
= SampValidateDbObject(DomainHandle
,
1561 DOMAIN_CREATE_GROUP
,
1563 if (!NT_SUCCESS(Status
))
1565 TRACE("failed with status 0x%08lx\n", Status
);
1569 /* Check if the group name already exists in the domain */
1570 Status
= SampCheckAccountNameInDomain(DomainObject
,
1572 if (!NT_SUCCESS(Status
))
1574 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1575 Name
->Buffer
, Status
);
1579 /* Get the fixed domain attributes */
1580 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1581 Status
= SampGetObjectAttribute(DomainObject
,
1584 (PVOID
)&FixedDomainData
,
1586 if (!NT_SUCCESS(Status
))
1588 TRACE("failed with status 0x%08lx\n", Status
);
1592 /* Increment the NextRid attribute */
1593 ulRid
= FixedDomainData
.NextRid
;
1594 FixedDomainData
.NextRid
++;
1596 /* Store the fixed domain attributes */
1597 Status
= SampSetObjectAttribute(DomainObject
,
1602 if (!NT_SUCCESS(Status
))
1604 TRACE("failed with status 0x%08lx\n", Status
);
1608 TRACE("RID: %lx\n", ulRid
);
1610 /* Convert the RID into a string (hex) */
1611 swprintf(szRid
, L
"%08lX", ulRid
);
1613 /* Create the group object */
1614 Status
= SampCreateDbObject(DomainObject
,
1620 if (!NT_SUCCESS(Status
))
1622 TRACE("failed with status 0x%08lx\n", Status
);
1626 /* Add the account name of the user object */
1627 Status
= SampSetAccountNameInDomain(DomainObject
,
1631 if (!NT_SUCCESS(Status
))
1633 TRACE("failed with status 0x%08lx\n", Status
);
1637 /* Initialize fixed user data */
1638 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1639 FixedGroupData
.Version
= 1;
1641 FixedGroupData
.GroupId
= ulRid
;
1643 /* Set fixed user data attribute */
1644 Status
= SampSetObjectAttribute(GroupObject
,
1647 (LPVOID
)&FixedGroupData
,
1648 sizeof(SAM_GROUP_FIXED_DATA
));
1649 if (!NT_SUCCESS(Status
))
1651 TRACE("failed with status 0x%08lx\n", Status
);
1655 /* Set the Name attribute */
1656 Status
= SampSetObjectAttribute(GroupObject
,
1659 (LPVOID
)Name
->Buffer
,
1660 Name
->MaximumLength
);
1661 if (!NT_SUCCESS(Status
))
1663 TRACE("failed with status 0x%08lx\n", Status
);
1667 /* Set the AdminComment attribute */
1668 Status
= SampSetObjectAttribute(GroupObject
,
1672 EmptyString
.MaximumLength
);
1673 if (!NT_SUCCESS(Status
))
1675 TRACE("failed with status 0x%08lx\n", Status
);
1679 if (NT_SUCCESS(Status
))
1681 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1682 *RelativeId
= ulRid
;
1685 TRACE("returns with status 0x%08lx\n", Status
);
1694 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1695 IN OUT
unsigned long *EnumerationContext
,
1696 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1697 IN
unsigned long PreferedMaximumLength
,
1698 OUT
unsigned long *CountReturned
)
1700 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1701 PSAM_DB_OBJECT DomainObject
;
1702 HANDLE GroupsKeyHandle
= NULL
;
1703 HANDLE NamesKeyHandle
= NULL
;
1704 WCHAR GroupName
[64];
1706 ULONG EnumCount
= 0;
1707 ULONG RequiredLength
= 0;
1712 BOOLEAN MoreEntries
= FALSE
;
1715 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1716 DomainHandle
, EnumerationContext
, Buffer
,
1717 PreferedMaximumLength
, CountReturned
);
1719 /* Validate the domain handle */
1720 Status
= SampValidateDbObject(DomainHandle
,
1722 DOMAIN_LIST_ACCOUNTS
,
1724 if (!NT_SUCCESS(Status
))
1727 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1731 if (!NT_SUCCESS(Status
))
1734 Status
= SampRegOpenKey(GroupsKeyHandle
,
1738 if (!NT_SUCCESS(Status
))
1743 EnumIndex
= *EnumerationContext
;
1747 NameLength
= 64 * sizeof(WCHAR
);
1748 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1755 if (!NT_SUCCESS(Status
))
1757 if (Status
== STATUS_NO_MORE_ENTRIES
)
1758 Status
= STATUS_SUCCESS
;
1762 TRACE("EnumIndex: %lu\n", EnumIndex
);
1763 TRACE("Group name: %S\n", GroupName
);
1764 TRACE("Name length: %lu\n", NameLength
);
1766 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
1772 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
1778 TRACE("EnumCount: %lu\n", EnumCount
);
1779 TRACE("RequiredLength: %lu\n", RequiredLength
);
1781 if (!NT_SUCCESS(Status
))
1784 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
1785 if (EnumBuffer
== NULL
)
1787 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1791 EnumBuffer
->EntriesRead
= EnumCount
;
1795 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
1796 if (EnumBuffer
->Buffer
== NULL
)
1798 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1804 EnumIndex
= *EnumerationContext
;
1805 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
1807 NameLength
= 64 * sizeof(WCHAR
);
1808 DataLength
= sizeof(ULONG
);
1809 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1816 if (!NT_SUCCESS(Status
))
1818 if (Status
== STATUS_NO_MORE_ENTRIES
)
1819 Status
= STATUS_SUCCESS
;
1823 TRACE("EnumIndex: %lu\n", EnumIndex
);
1824 TRACE("Group name: %S\n", GroupName
);
1825 TRACE("Name length: %lu\n", NameLength
);
1826 TRACE("RID: %lu\n", Rid
);
1828 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
1830 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
1831 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
1833 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
1835 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
1836 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
1838 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1842 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
1844 EnumBuffer
->Buffer
[i
].Name
.Length
);
1849 if (NT_SUCCESS(Status
))
1851 *EnumerationContext
+= EnumCount
;
1852 *Buffer
= EnumBuffer
;
1853 *CountReturned
= EnumCount
;
1857 *EnumerationContext
= 0;
1861 if (EnumBuffer
!= NULL
)
1863 if (EnumBuffer
->Buffer
!= NULL
)
1865 if (EnumBuffer
->EntriesRead
!= 0)
1867 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
1869 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
1870 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
1874 midl_user_free(EnumBuffer
->Buffer
);
1877 midl_user_free(EnumBuffer
);
1881 if (NamesKeyHandle
!= NULL
)
1882 SampRegCloseKey(NamesKeyHandle
);
1884 if (GroupsKeyHandle
!= NULL
)
1885 SampRegCloseKey(GroupsKeyHandle
);
1887 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
1888 Status
= STATUS_MORE_ENTRIES
;
1897 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
1898 IN PRPC_UNICODE_STRING Name
,
1899 IN ACCESS_MASK DesiredAccess
,
1900 OUT SAMPR_HANDLE
*UserHandle
,
1901 OUT
unsigned long *RelativeId
)
1903 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1904 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1905 SAM_USER_FIXED_DATA FixedUserData
;
1906 PSAM_DB_OBJECT DomainObject
;
1907 PSAM_DB_OBJECT UserObject
;
1913 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
1914 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
1917 Name
->Length
== 0 ||
1918 Name
->Buffer
== NULL
||
1919 UserHandle
== NULL
||
1921 return STATUS_INVALID_PARAMETER
;
1923 /* Validate the domain handle */
1924 Status
= SampValidateDbObject(DomainHandle
,
1928 if (!NT_SUCCESS(Status
))
1930 TRACE("failed with status 0x%08lx\n", Status
);
1934 /* Check if the user name already exists in the domain */
1935 Status
= SampCheckAccountNameInDomain(DomainObject
,
1937 if (!NT_SUCCESS(Status
))
1939 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
1940 Name
->Buffer
, Status
);
1944 /* Get the fixed domain attributes */
1945 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1946 Status
= SampGetObjectAttribute(DomainObject
,
1949 (PVOID
)&FixedDomainData
,
1951 if (!NT_SUCCESS(Status
))
1953 TRACE("failed with status 0x%08lx\n", Status
);
1957 /* Increment the NextRid attribute */
1958 ulRid
= FixedDomainData
.NextRid
;
1959 FixedDomainData
.NextRid
++;
1961 /* Store the fixed domain attributes */
1962 Status
= SampSetObjectAttribute(DomainObject
,
1967 if (!NT_SUCCESS(Status
))
1969 TRACE("failed with status 0x%08lx\n", Status
);
1973 TRACE("RID: %lx\n", ulRid
);
1975 /* Convert the RID into a string (hex) */
1976 swprintf(szRid
, L
"%08lX", ulRid
);
1978 /* Create the user object */
1979 Status
= SampCreateDbObject(DomainObject
,
1985 if (!NT_SUCCESS(Status
))
1987 TRACE("failed with status 0x%08lx\n", Status
);
1991 /* Add the account name for the user object */
1992 Status
= SampSetAccountNameInDomain(DomainObject
,
1996 if (!NT_SUCCESS(Status
))
1998 TRACE("failed with status 0x%08lx\n", Status
);
2002 /* Initialize fixed user data */
2003 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2004 FixedUserData
.Version
= 1;
2005 FixedUserData
.LastLogon
.QuadPart
= 0;
2006 FixedUserData
.LastLogoff
.QuadPart
= 0;
2007 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2008 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2009 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2010 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2011 FixedUserData
.UserId
= ulRid
;
2012 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2013 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2014 USER_PASSWORD_NOT_REQUIRED
|
2015 USER_NORMAL_ACCOUNT
;
2017 /* Set fixed user data attribute */
2018 Status
= SampSetObjectAttribute(UserObject
,
2021 (LPVOID
)&FixedUserData
,
2022 sizeof(SAM_USER_FIXED_DATA
));
2023 if (!NT_SUCCESS(Status
))
2025 TRACE("failed with status 0x%08lx\n", Status
);
2029 /* Set the Name attribute */
2030 Status
= SampSetObjectAttribute(UserObject
,
2033 (LPVOID
)Name
->Buffer
,
2034 Name
->MaximumLength
);
2035 if (!NT_SUCCESS(Status
))
2037 TRACE("failed with status 0x%08lx\n", Status
);
2041 /* Set the FullName attribute */
2042 Status
= SampSetObjectAttribute(UserObject
,
2046 EmptyString
.MaximumLength
);
2047 if (!NT_SUCCESS(Status
))
2049 TRACE("failed with status 0x%08lx\n", Status
);
2053 /* Set the HomeDirectory attribute */
2054 Status
= SampSetObjectAttribute(UserObject
,
2058 EmptyString
.MaximumLength
);
2059 if (!NT_SUCCESS(Status
))
2061 TRACE("failed with status 0x%08lx\n", Status
);
2065 /* Set the HomeDirectoryDrive attribute */
2066 Status
= SampSetObjectAttribute(UserObject
,
2067 L
"HomeDirectoryDrive",
2070 EmptyString
.MaximumLength
);
2071 if (!NT_SUCCESS(Status
))
2073 TRACE("failed with status 0x%08lx\n", Status
);
2077 /* Set the ScriptPath attribute */
2078 Status
= SampSetObjectAttribute(UserObject
,
2082 EmptyString
.MaximumLength
);
2083 if (!NT_SUCCESS(Status
))
2085 TRACE("failed with status 0x%08lx\n", Status
);
2089 /* Set the ProfilePath attribute */
2090 Status
= SampSetObjectAttribute(UserObject
,
2094 EmptyString
.MaximumLength
);
2095 if (!NT_SUCCESS(Status
))
2097 TRACE("failed with status 0x%08lx\n", Status
);
2101 /* Set the AdminComment attribute */
2102 Status
= SampSetObjectAttribute(UserObject
,
2106 EmptyString
.MaximumLength
);
2107 if (!NT_SUCCESS(Status
))
2109 TRACE("failed with status 0x%08lx\n", Status
);
2113 /* Set the UserComment attribute */
2114 Status
= SampSetObjectAttribute(UserObject
,
2118 EmptyString
.MaximumLength
);
2119 if (!NT_SUCCESS(Status
))
2121 TRACE("failed with status 0x%08lx\n", Status
);
2125 /* Set the WorkStations attribute */
2126 Status
= SampSetObjectAttribute(UserObject
,
2130 EmptyString
.MaximumLength
);
2131 if (!NT_SUCCESS(Status
))
2133 TRACE("failed with status 0x%08lx\n", Status
);
2137 /* FIXME: Set default user attributes */
2139 if (NT_SUCCESS(Status
))
2141 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2142 *RelativeId
= ulRid
;
2145 TRACE("returns with status 0x%08lx\n", Status
);
2154 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2155 IN OUT
unsigned long *EnumerationContext
,
2156 IN
unsigned long UserAccountControl
,
2157 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2158 IN
unsigned long PreferedMaximumLength
,
2159 OUT
unsigned long *CountReturned
)
2161 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2162 PSAM_DB_OBJECT DomainObject
;
2163 HANDLE UsersKeyHandle
= NULL
;
2164 HANDLE NamesKeyHandle
= NULL
;
2167 ULONG EnumCount
= 0;
2168 ULONG RequiredLength
= 0;
2173 BOOLEAN MoreEntries
= FALSE
;
2176 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2177 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2178 PreferedMaximumLength
, CountReturned
);
2180 /* Validate the domain handle */
2181 Status
= SampValidateDbObject(DomainHandle
,
2183 DOMAIN_LIST_ACCOUNTS
,
2185 if (!NT_SUCCESS(Status
))
2188 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2192 if (!NT_SUCCESS(Status
))
2195 Status
= SampRegOpenKey(UsersKeyHandle
,
2199 if (!NT_SUCCESS(Status
))
2204 EnumIndex
= *EnumerationContext
;
2208 NameLength
= 64 * sizeof(WCHAR
);
2209 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2216 if (!NT_SUCCESS(Status
))
2218 if (Status
== STATUS_NO_MORE_ENTRIES
)
2219 Status
= STATUS_SUCCESS
;
2223 TRACE("EnumIndex: %lu\n", EnumIndex
);
2224 TRACE("User name: %S\n", UserName
);
2225 TRACE("Name length: %lu\n", NameLength
);
2227 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2233 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2239 TRACE("EnumCount: %lu\n", EnumCount
);
2240 TRACE("RequiredLength: %lu\n", RequiredLength
);
2242 if (!NT_SUCCESS(Status
))
2245 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2246 if (EnumBuffer
== NULL
)
2248 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2252 EnumBuffer
->EntriesRead
= EnumCount
;
2256 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2257 if (EnumBuffer
->Buffer
== NULL
)
2259 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2265 EnumIndex
= *EnumerationContext
;
2266 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2268 NameLength
= 64 * sizeof(WCHAR
);
2269 DataLength
= sizeof(ULONG
);
2270 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2277 if (!NT_SUCCESS(Status
))
2279 if (Status
== STATUS_NO_MORE_ENTRIES
)
2280 Status
= STATUS_SUCCESS
;
2284 TRACE("EnumIndex: %lu\n", EnumIndex
);
2285 TRACE("User name: %S\n", UserName
);
2286 TRACE("Name length: %lu\n", NameLength
);
2287 TRACE("RID: %lu\n", Rid
);
2289 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2291 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2292 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2294 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2296 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2297 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2299 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2303 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2305 EnumBuffer
->Buffer
[i
].Name
.Length
);
2310 if (NT_SUCCESS(Status
))
2312 *EnumerationContext
+= EnumCount
;
2313 *Buffer
= EnumBuffer
;
2314 *CountReturned
= EnumCount
;
2318 *EnumerationContext
= 0;
2322 if (EnumBuffer
!= NULL
)
2324 if (EnumBuffer
->Buffer
!= NULL
)
2326 if (EnumBuffer
->EntriesRead
!= 0)
2328 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2330 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2331 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2335 midl_user_free(EnumBuffer
->Buffer
);
2338 midl_user_free(EnumBuffer
);
2342 if (NamesKeyHandle
!= NULL
)
2343 SampRegCloseKey(NamesKeyHandle
);
2345 if (UsersKeyHandle
!= NULL
)
2346 SampRegCloseKey(UsersKeyHandle
);
2348 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2349 Status
= STATUS_MORE_ENTRIES
;
2358 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2359 IN PRPC_UNICODE_STRING AccountName
,
2360 IN ACCESS_MASK DesiredAccess
,
2361 OUT SAMPR_HANDLE
*AliasHandle
,
2362 OUT
unsigned long *RelativeId
)
2364 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2365 PSAM_DB_OBJECT DomainObject
;
2366 PSAM_DB_OBJECT AliasObject
;
2367 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2373 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2374 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2376 /* Validate the domain handle */
2377 Status
= SampValidateDbObject(DomainHandle
,
2379 DOMAIN_CREATE_ALIAS
,
2381 if (!NT_SUCCESS(Status
))
2383 TRACE("failed with status 0x%08lx\n", Status
);
2387 /* Check if the alias name already exists in the domain */
2388 Status
= SampCheckAccountNameInDomain(DomainObject
,
2389 AccountName
->Buffer
);
2390 if (!NT_SUCCESS(Status
))
2392 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2393 AccountName
->Buffer
, Status
);
2397 /* Get the fixed domain attributes */
2398 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2399 Status
= SampGetObjectAttribute(DomainObject
,
2402 (PVOID
)&FixedDomainData
,
2404 if (!NT_SUCCESS(Status
))
2406 TRACE("failed with status 0x%08lx\n", Status
);
2410 /* Increment the NextRid attribute */
2411 ulRid
= FixedDomainData
.NextRid
;
2412 FixedDomainData
.NextRid
++;
2414 /* Store the fixed domain attributes */
2415 Status
= SampSetObjectAttribute(DomainObject
,
2420 if (!NT_SUCCESS(Status
))
2422 TRACE("failed with status 0x%08lx\n", Status
);
2426 TRACE("RID: %lx\n", ulRid
);
2428 /* Convert the RID into a string (hex) */
2429 swprintf(szRid
, L
"%08lX", ulRid
);
2431 /* Create the alias object */
2432 Status
= SampCreateDbObject(DomainObject
,
2438 if (!NT_SUCCESS(Status
))
2440 TRACE("failed with status 0x%08lx\n", Status
);
2444 /* Add the account name for the alias object */
2445 Status
= SampSetAccountNameInDomain(DomainObject
,
2447 AccountName
->Buffer
,
2449 if (!NT_SUCCESS(Status
))
2451 TRACE("failed with status 0x%08lx\n", Status
);
2455 /* Set the Name attribute */
2456 Status
= SampSetObjectAttribute(AliasObject
,
2459 (LPVOID
)AccountName
->Buffer
,
2460 AccountName
->MaximumLength
);
2461 if (!NT_SUCCESS(Status
))
2463 TRACE("failed with status 0x%08lx\n", Status
);
2467 /* Set the Description attribute */
2468 Status
= SampSetObjectAttribute(AliasObject
,
2472 EmptyString
.MaximumLength
);
2473 if (!NT_SUCCESS(Status
))
2475 TRACE("failed with status 0x%08lx\n", Status
);
2479 if (NT_SUCCESS(Status
))
2481 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2482 *RelativeId
= ulRid
;
2485 TRACE("returns with status 0x%08lx\n", Status
);
2494 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2495 IN OUT
unsigned long *EnumerationContext
,
2496 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2497 IN
unsigned long PreferedMaximumLength
,
2498 OUT
unsigned long *CountReturned
)
2500 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2501 PSAM_DB_OBJECT DomainObject
;
2502 HANDLE AliasesKeyHandle
= NULL
;
2503 HANDLE NamesKeyHandle
= NULL
;
2504 WCHAR AliasName
[64];
2506 ULONG EnumCount
= 0;
2507 ULONG RequiredLength
= 0;
2512 BOOLEAN MoreEntries
= FALSE
;
2515 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2516 DomainHandle
, EnumerationContext
, Buffer
,
2517 PreferedMaximumLength
, CountReturned
);
2519 /* Validate the domain handle */
2520 Status
= SampValidateDbObject(DomainHandle
,
2522 DOMAIN_LIST_ACCOUNTS
,
2524 if (!NT_SUCCESS(Status
))
2527 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2531 if (!NT_SUCCESS(Status
))
2534 Status
= SampRegOpenKey(AliasesKeyHandle
,
2538 if (!NT_SUCCESS(Status
))
2543 EnumIndex
= *EnumerationContext
;
2547 NameLength
= 64 * sizeof(WCHAR
);
2548 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2555 if (!NT_SUCCESS(Status
))
2557 if (Status
== STATUS_NO_MORE_ENTRIES
)
2558 Status
= STATUS_SUCCESS
;
2562 TRACE("EnumIndex: %lu\n", EnumIndex
);
2563 TRACE("Alias name: %S\n", AliasName
);
2564 TRACE("Name length: %lu\n", NameLength
);
2566 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2572 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2578 TRACE("EnumCount: %lu\n", EnumCount
);
2579 TRACE("RequiredLength: %lu\n", RequiredLength
);
2581 if (!NT_SUCCESS(Status
))
2584 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2585 if (EnumBuffer
== NULL
)
2587 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2591 EnumBuffer
->EntriesRead
= EnumCount
;
2595 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2596 if (EnumBuffer
->Buffer
== NULL
)
2598 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2604 EnumIndex
= *EnumerationContext
;
2605 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2607 NameLength
= 64 * sizeof(WCHAR
);
2608 DataLength
= sizeof(ULONG
);
2609 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2616 if (!NT_SUCCESS(Status
))
2618 if (Status
== STATUS_NO_MORE_ENTRIES
)
2619 Status
= STATUS_SUCCESS
;
2623 TRACE("EnumIndex: %lu\n", EnumIndex
);
2624 TRACE("Alias name: %S\n", AliasName
);
2625 TRACE("Name length: %lu\n", NameLength
);
2626 TRACE("RID: %lu\n", Rid
);
2628 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2630 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2631 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2633 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2635 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2636 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2638 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2642 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2644 EnumBuffer
->Buffer
[i
].Name
.Length
);
2649 if (NT_SUCCESS(Status
))
2651 *EnumerationContext
+= EnumCount
;
2652 *Buffer
= EnumBuffer
;
2653 *CountReturned
= EnumCount
;
2657 *EnumerationContext
= 0;
2661 if (EnumBuffer
!= NULL
)
2663 if (EnumBuffer
->Buffer
!= NULL
)
2665 if (EnumBuffer
->EntriesRead
!= 0)
2667 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2669 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2670 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2674 midl_user_free(EnumBuffer
->Buffer
);
2677 midl_user_free(EnumBuffer
);
2681 if (NamesKeyHandle
!= NULL
)
2682 SampRegCloseKey(NamesKeyHandle
);
2684 if (AliasesKeyHandle
!= NULL
)
2685 SampRegCloseKey(AliasesKeyHandle
);
2687 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2688 Status
= STATUS_MORE_ENTRIES
;
2697 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2698 IN PSAMPR_PSID_ARRAY SidArray
,
2699 OUT PSAMPR_ULONG_ARRAY Membership
)
2701 PSAM_DB_OBJECT DomainObject
;
2702 HANDLE AliasesKeyHandle
= NULL
;
2703 HANDLE MembersKeyHandle
= NULL
;
2704 HANDLE MemberKeyHandle
= NULL
;
2705 LPWSTR MemberSidString
= NULL
;
2706 PULONG RidArray
= NULL
;
2707 ULONG MaxSidCount
= 0;
2713 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2714 DomainHandle
, SidArray
, Membership
);
2716 /* Validate the domain handle */
2717 Status
= SampValidateDbObject(DomainHandle
,
2721 if (!NT_SUCCESS(Status
))
2724 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2728 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2729 if (!NT_SUCCESS(Status
))
2732 Status
= SampRegOpenKey(AliasesKeyHandle
,
2736 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2737 if (!NT_SUCCESS(Status
))
2740 for (i
= 0; i
< SidArray
->Count
; i
++)
2742 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2743 TRACE("Open %S\n", MemberSidString
);
2745 Status
= SampRegOpenKey(MembersKeyHandle
,
2749 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2750 if (NT_SUCCESS(Status
))
2752 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2755 if (NT_SUCCESS(Status
))
2757 TRACE("Found %lu values\n", ValueCount
);
2758 MaxSidCount
+= ValueCount
;
2762 NtClose(MemberKeyHandle
);
2765 LocalFree(MemberSidString
);
2768 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
2769 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
2770 if (RidArray
== NULL
)
2772 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2776 for (i
= 0; i
< SidArray
->Count
; i
++)
2778 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2779 TRACE("Open %S\n", MemberSidString
);
2781 Status
= SampRegOpenKey(MembersKeyHandle
,
2785 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2786 if (NT_SUCCESS(Status
))
2788 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2791 if (NT_SUCCESS(Status
))
2793 TRACE("Found %lu values\n", ValueCount
);
2795 for (j
= 0; j
< ValueCount
; j
++)
2797 DataLength
= sizeof(ULONG
);
2798 Status
= SampRegEnumerateValue(MemberKeyHandle
,
2803 (PVOID
)&RidArray
[j
],
2808 NtClose(MemberKeyHandle
);
2811 LocalFree(MemberSidString
);
2816 if (NT_SUCCESS(Status
))
2818 Membership
->Count
= MaxSidCount
;
2819 Membership
->Element
= RidArray
;
2823 if (RidArray
!= NULL
)
2824 midl_user_free(RidArray
);
2827 if (MembersKeyHandle
!= NULL
)
2828 NtClose(MembersKeyHandle
);
2830 if (MembersKeyHandle
!= NULL
)
2831 NtClose(MembersKeyHandle
);
2833 if (AliasesKeyHandle
!= NULL
)
2834 NtClose(AliasesKeyHandle
);
2843 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
2845 IN RPC_UNICODE_STRING Names
[],
2846 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
2847 OUT PSAMPR_ULONG_ARRAY Use
)
2849 PSAM_DB_OBJECT DomainObject
;
2850 HANDLE AccountsKeyHandle
;
2851 HANDLE NamesKeyHandle
;
2852 ULONG MappedCount
= 0;
2858 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
2859 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
2861 /* Validate the domain handle */
2862 Status
= SampValidateDbObject(DomainHandle
,
2866 if (!NT_SUCCESS(Status
))
2868 TRACE("failed with status 0x%08lx\n", Status
);
2872 RelativeIds
->Count
= 0;
2876 return STATUS_SUCCESS
;
2878 /* Allocate the relative IDs array */
2879 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
2880 if (RelativeIds
->Element
== NULL
)
2882 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2886 /* Allocate the use array */
2887 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
2888 if (Use
->Element
== NULL
)
2890 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2894 RelativeIds
->Count
= Count
;
2897 for (i
= 0; i
< Count
; i
++)
2899 TRACE("Name: %S\n", Names
[i
].Buffer
);
2903 /* Lookup aliases */
2904 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2907 &AccountsKeyHandle
);
2908 if (NT_SUCCESS(Status
))
2910 Status
= SampRegOpenKey(AccountsKeyHandle
,
2914 if (NT_SUCCESS(Status
))
2916 DataLength
= sizeof(ULONG
);
2917 Status
= SampRegQueryValue(NamesKeyHandle
,
2923 SampRegCloseKey(NamesKeyHandle
);
2926 SampRegCloseKey(AccountsKeyHandle
);
2929 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
2932 /* Return alias account */
2933 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
2935 TRACE("Rid: %lu\n", RelativeId
);
2936 RelativeIds
->Element
[i
] = RelativeId
;
2937 Use
->Element
[i
] = SidTypeAlias
;
2943 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2946 &AccountsKeyHandle
);
2947 if (NT_SUCCESS(Status
))
2949 Status
= SampRegOpenKey(AccountsKeyHandle
,
2953 if (NT_SUCCESS(Status
))
2955 DataLength
= sizeof(ULONG
);
2956 Status
= SampRegQueryValue(NamesKeyHandle
,
2962 SampRegCloseKey(NamesKeyHandle
);
2965 SampRegCloseKey(AccountsKeyHandle
);
2968 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
2971 /* Return group account */
2972 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
2974 TRACE("Rid: %lu\n", RelativeId
);
2975 RelativeIds
->Element
[i
] = RelativeId
;
2976 Use
->Element
[i
] = SidTypeGroup
;
2982 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2985 &AccountsKeyHandle
);
2986 if (NT_SUCCESS(Status
))
2988 Status
= SampRegOpenKey(AccountsKeyHandle
,
2992 if (NT_SUCCESS(Status
))
2994 DataLength
= sizeof(ULONG
);
2995 Status
= SampRegQueryValue(NamesKeyHandle
,
3001 SampRegCloseKey(NamesKeyHandle
);
3004 SampRegCloseKey(AccountsKeyHandle
);
3007 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3010 /* Return user account */
3011 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3013 TRACE("Rid: %lu\n", RelativeId
);
3014 RelativeIds
->Element
[i
] = RelativeId
;
3015 Use
->Element
[i
] = SidTypeUser
;
3020 /* Return unknown account */
3021 RelativeIds
->Element
[i
] = 0;
3022 Use
->Element
[i
] = SidTypeUnknown
;
3026 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3027 Status
= STATUS_SUCCESS
;
3029 if (NT_SUCCESS(Status
))
3031 if (MappedCount
== 0)
3032 Status
= STATUS_NONE_MAPPED
;
3033 else if (MappedCount
< Count
)
3034 Status
= STATUS_SOME_NOT_MAPPED
;
3038 if (RelativeIds
->Element
!= NULL
)
3040 midl_user_free(RelativeIds
->Element
);
3041 RelativeIds
->Element
= NULL
;
3044 RelativeIds
->Count
= 0;
3046 if (Use
->Element
!= NULL
)
3048 midl_user_free(Use
->Element
);
3049 Use
->Element
= NULL
;
3055 TRACE("Returned Status %lx\n", Status
);
3064 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3066 IN ULONG
*RelativeIds
,
3067 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3068 OUT PSAMPR_ULONG_ARRAY Use
)
3070 PSAM_DB_OBJECT DomainObject
;
3072 HANDLE AccountsKeyHandle
;
3073 HANDLE AccountKeyHandle
;
3074 ULONG MappedCount
= 0;
3079 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3080 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3082 /* Validate the domain handle */
3083 Status
= SampValidateDbObject(DomainHandle
,
3087 if (!NT_SUCCESS(Status
))
3089 TRACE("failed with status 0x%08lx\n", Status
);
3097 return STATUS_SUCCESS
;
3099 /* Allocate the names array */
3100 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3101 if (Names
->Element
== NULL
)
3103 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3107 /* Allocate the use array */
3108 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3109 if (Use
->Element
== NULL
)
3111 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3115 Names
->Count
= Count
;
3118 for (i
= 0; i
< Count
; i
++)
3120 TRACE("RID: %lu\n", RelativeIds
[i
]);
3122 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3124 /* Lookup aliases */
3125 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3128 &AccountsKeyHandle
);
3129 if (NT_SUCCESS(Status
))
3131 Status
= SampRegOpenKey(AccountsKeyHandle
,
3135 if (NT_SUCCESS(Status
))
3138 Status
= SampRegQueryValue(AccountKeyHandle
,
3143 if (NT_SUCCESS(Status
))
3145 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3146 if (Names
->Element
[i
].Buffer
== NULL
)
3147 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3149 if (NT_SUCCESS(Status
))
3151 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3152 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3154 Status
= SampRegQueryValue(AccountKeyHandle
,
3157 Names
->Element
[i
].Buffer
,
3162 SampRegCloseKey(AccountKeyHandle
);
3165 SampRegCloseKey(AccountsKeyHandle
);
3168 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3171 /* Return alias account */
3172 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3174 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3175 Use
->Element
[i
] = SidTypeAlias
;
3181 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3184 &AccountsKeyHandle
);
3185 if (NT_SUCCESS(Status
))
3187 Status
= SampRegOpenKey(AccountsKeyHandle
,
3191 if (NT_SUCCESS(Status
))
3194 Status
= SampRegQueryValue(AccountKeyHandle
,
3199 if (NT_SUCCESS(Status
))
3201 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3202 if (Names
->Element
[i
].Buffer
== NULL
)
3203 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3205 if (NT_SUCCESS(Status
))
3207 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3208 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3210 Status
= SampRegQueryValue(AccountKeyHandle
,
3213 Names
->Element
[i
].Buffer
,
3218 SampRegCloseKey(AccountKeyHandle
);
3221 SampRegCloseKey(AccountsKeyHandle
);
3224 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3227 /* Return group account */
3228 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3230 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3231 Use
->Element
[i
] = SidTypeGroup
;
3237 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3240 &AccountsKeyHandle
);
3241 if (NT_SUCCESS(Status
))
3243 Status
= SampRegOpenKey(AccountsKeyHandle
,
3247 if (NT_SUCCESS(Status
))
3250 Status
= SampRegQueryValue(AccountKeyHandle
,
3255 if (NT_SUCCESS(Status
))
3257 TRACE("DataLength: %lu\n", DataLength
);
3259 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3260 if (Names
->Element
[i
].Buffer
== NULL
)
3261 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3263 if (NT_SUCCESS(Status
))
3265 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3266 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3268 Status
= SampRegQueryValue(AccountKeyHandle
,
3271 Names
->Element
[i
].Buffer
,
3276 SampRegCloseKey(AccountKeyHandle
);
3279 SampRegCloseKey(AccountsKeyHandle
);
3282 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3285 /* Return user account */
3286 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3288 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3289 Use
->Element
[i
] = SidTypeUser
;
3294 /* Return unknown account */
3295 Use
->Element
[i
] = SidTypeUnknown
;
3299 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3300 Status
= STATUS_SUCCESS
;
3302 if (NT_SUCCESS(Status
))
3304 if (MappedCount
== 0)
3305 Status
= STATUS_NONE_MAPPED
;
3306 else if (MappedCount
< Count
)
3307 Status
= STATUS_SOME_NOT_MAPPED
;
3311 if (Names
->Element
!= NULL
)
3313 for (i
= 0; i
< Count
; i
++)
3315 if (Names
->Element
[i
].Buffer
!= NULL
)
3316 midl_user_free(Names
->Element
[i
].Buffer
);
3319 midl_user_free(Names
->Element
);
3320 Names
->Element
= NULL
;
3325 if (Use
->Element
!= NULL
)
3327 midl_user_free(Use
->Element
);
3328 Use
->Element
= NULL
;
3341 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3342 IN ACCESS_MASK DesiredAccess
,
3343 IN
unsigned long GroupId
,
3344 OUT SAMPR_HANDLE
*GroupHandle
)
3346 PSAM_DB_OBJECT DomainObject
;
3347 PSAM_DB_OBJECT GroupObject
;
3351 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3352 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3354 /* Validate the domain handle */
3355 Status
= SampValidateDbObject(DomainHandle
,
3359 if (!NT_SUCCESS(Status
))
3361 TRACE("failed with status 0x%08lx\n", Status
);
3365 /* Convert the RID into a string (hex) */
3366 swprintf(szRid
, L
"%08lX", GroupId
);
3368 /* Create the group object */
3369 Status
= SampOpenDbObject(DomainObject
,
3375 if (!NT_SUCCESS(Status
))
3377 TRACE("failed with status 0x%08lx\n", Status
);
3381 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3383 return STATUS_SUCCESS
;
3388 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3389 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3391 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3392 HANDLE MembersKeyHandle
= NULL
;
3393 SAM_GROUP_FIXED_DATA FixedData
;
3399 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3400 if (InfoBuffer
== NULL
)
3401 return STATUS_INSUFFICIENT_RESOURCES
;
3403 Status
= SampGetObjectAttributeString(GroupObject
,
3405 &InfoBuffer
->General
.Name
);
3406 if (!NT_SUCCESS(Status
))
3408 TRACE("Status 0x%08lx\n", Status
);
3412 Status
= SampGetObjectAttributeString(GroupObject
,
3414 &InfoBuffer
->General
.AdminComment
);
3415 if (!NT_SUCCESS(Status
))
3417 TRACE("Status 0x%08lx\n", Status
);
3421 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3422 Status
= SampGetObjectAttribute(GroupObject
,
3427 if (!NT_SUCCESS(Status
))
3430 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3432 /* Open the Members subkey */
3433 Status
= SampRegOpenKey(GroupObject
->KeyHandle
,
3437 if (!NT_SUCCESS(Status
))
3439 TRACE("Status 0x%08lx\n", Status
);
3443 /* Retrieve the number of members of the alias */
3444 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3446 &InfoBuffer
->General
.MemberCount
);
3447 if (!NT_SUCCESS(Status
))
3449 TRACE("Status 0x%08lx\n", Status
);
3453 *Buffer
= InfoBuffer
;
3456 if (MembersKeyHandle
!= NULL
)
3457 SampRegCloseKey(MembersKeyHandle
);
3459 if (!NT_SUCCESS(Status
))
3461 if (InfoBuffer
!= NULL
)
3463 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3464 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3466 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3467 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3469 midl_user_free(InfoBuffer
);
3478 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3479 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3481 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3486 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3487 if (InfoBuffer
== NULL
)
3488 return STATUS_INSUFFICIENT_RESOURCES
;
3490 Status
= SampGetObjectAttributeString(GroupObject
,
3492 &InfoBuffer
->Name
.Name
);
3493 if (!NT_SUCCESS(Status
))
3495 TRACE("Status 0x%08lx\n", Status
);
3499 *Buffer
= InfoBuffer
;
3502 if (!NT_SUCCESS(Status
))
3504 if (InfoBuffer
!= NULL
)
3506 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3507 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3509 midl_user_free(InfoBuffer
);
3518 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3519 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3521 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3522 SAM_GROUP_FIXED_DATA FixedData
;
3528 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3529 if (InfoBuffer
== NULL
)
3530 return STATUS_INSUFFICIENT_RESOURCES
;
3532 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3533 Status
= SampGetObjectAttribute(GroupObject
,
3538 if (!NT_SUCCESS(Status
))
3541 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3543 *Buffer
= InfoBuffer
;
3546 if (!NT_SUCCESS(Status
))
3548 if (InfoBuffer
!= NULL
)
3550 midl_user_free(InfoBuffer
);
3559 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3560 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3562 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3567 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3568 if (InfoBuffer
== NULL
)
3569 return STATUS_INSUFFICIENT_RESOURCES
;
3571 Status
= SampGetObjectAttributeString(GroupObject
,
3573 &InfoBuffer
->AdminComment
.AdminComment
);
3574 if (!NT_SUCCESS(Status
))
3576 TRACE("Status 0x%08lx\n", Status
);
3580 *Buffer
= InfoBuffer
;
3583 if (!NT_SUCCESS(Status
))
3585 if (InfoBuffer
!= NULL
)
3587 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3588 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3590 midl_user_free(InfoBuffer
);
3601 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3602 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3603 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3605 PSAM_DB_OBJECT GroupObject
;
3608 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
3609 GroupHandle
, GroupInformationClass
, Buffer
);
3611 /* Validate the group handle */
3612 Status
= SampValidateDbObject(GroupHandle
,
3614 GROUP_READ_INFORMATION
,
3616 if (!NT_SUCCESS(Status
))
3619 switch (GroupInformationClass
)
3621 case GroupGeneralInformation
:
3622 Status
= SampQueryGroupGeneral(GroupObject
,
3626 case GroupNameInformation
:
3627 Status
= SampQueryGroupName(GroupObject
,
3631 case GroupAttributeInformation
:
3632 Status
= SampQueryGroupAttribute(GroupObject
,
3636 case GroupAdminCommentInformation
:
3637 Status
= SampQueryGroupAdminComment(GroupObject
,
3642 Status
= STATUS_INVALID_INFO_CLASS
;
3651 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3652 PSAMPR_GROUP_INFO_BUFFER Buffer
)
3654 SAM_GROUP_FIXED_DATA FixedData
;
3658 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3659 Status
= SampGetObjectAttribute(GroupObject
,
3664 if (!NT_SUCCESS(Status
))
3667 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
3669 Status
= SampSetObjectAttribute(GroupObject
,
3683 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3684 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3685 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
3687 PSAM_DB_OBJECT GroupObject
;
3690 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
3691 GroupHandle
, GroupInformationClass
, Buffer
);
3693 /* Validate the group handle */
3694 Status
= SampValidateDbObject(GroupHandle
,
3696 GROUP_WRITE_ACCOUNT
,
3698 if (!NT_SUCCESS(Status
))
3701 switch (GroupInformationClass
)
3703 case GroupNameInformation
:
3704 Status
= SampSetObjectAttribute(GroupObject
,
3707 Buffer
->Name
.Name
.Buffer
,
3708 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3711 case GroupAttributeInformation
:
3712 Status
= SampSetGroupAttribute(GroupObject
,
3716 case GroupAdminCommentInformation
:
3717 Status
= SampSetObjectAttribute(GroupObject
,
3720 Buffer
->AdminComment
.AdminComment
.Buffer
,
3721 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
3725 Status
= STATUS_INVALID_INFO_CLASS
;
3736 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
3737 IN
unsigned long MemberId
,
3738 IN
unsigned long Attributes
)
3741 return STATUS_NOT_IMPLEMENTED
;
3747 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
3750 return STATUS_NOT_IMPLEMENTED
;
3756 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
3757 IN
unsigned long MemberId
)
3760 return STATUS_NOT_IMPLEMENTED
;
3766 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
3767 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
3770 return STATUS_NOT_IMPLEMENTED
;
3776 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
3777 IN
unsigned long MemberId
,
3778 IN
unsigned long Attributes
)
3781 return STATUS_NOT_IMPLEMENTED
;
3788 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
3789 IN ACCESS_MASK DesiredAccess
,
3791 OUT SAMPR_HANDLE
*AliasHandle
)
3793 PSAM_DB_OBJECT DomainObject
;
3794 PSAM_DB_OBJECT AliasObject
;
3798 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
3799 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
3801 /* Validate the domain handle */
3802 Status
= SampValidateDbObject(DomainHandle
,
3806 if (!NT_SUCCESS(Status
))
3808 TRACE("failed with status 0x%08lx\n", Status
);
3812 /* Convert the RID into a string (hex) */
3813 swprintf(szRid
, L
"%08lX", AliasId
);
3815 /* Create the alias object */
3816 Status
= SampOpenDbObject(DomainObject
,
3822 if (!NT_SUCCESS(Status
))
3824 TRACE("failed with status 0x%08lx\n", Status
);
3828 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
3830 return STATUS_SUCCESS
;
3835 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
3836 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3838 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3839 HANDLE MembersKeyHandle
= NULL
;
3844 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3845 if (InfoBuffer
== NULL
)
3846 return STATUS_INSUFFICIENT_RESOURCES
;
3848 Status
= SampGetObjectAttributeString(AliasObject
,
3850 &InfoBuffer
->General
.Name
);
3851 if (!NT_SUCCESS(Status
))
3853 TRACE("Status 0x%08lx\n", Status
);
3857 Status
= SampGetObjectAttributeString(AliasObject
,
3859 &InfoBuffer
->General
.AdminComment
);
3860 if (!NT_SUCCESS(Status
))
3862 TRACE("Status 0x%08lx\n", Status
);
3866 /* Open the Members subkey */
3867 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
3871 if (!NT_SUCCESS(Status
))
3873 TRACE("Status 0x%08lx\n", 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 *Buffer
= InfoBuffer
;
3890 if (MembersKeyHandle
!= NULL
)
3891 SampRegCloseKey(MembersKeyHandle
);
3893 if (!NT_SUCCESS(Status
))
3895 if (InfoBuffer
!= NULL
)
3897 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3898 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3900 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3901 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3903 midl_user_free(InfoBuffer
);
3912 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
3913 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3915 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3920 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3921 if (InfoBuffer
== NULL
)
3922 return STATUS_INSUFFICIENT_RESOURCES
;
3924 Status
= SampGetObjectAttributeString(AliasObject
,
3926 &InfoBuffer
->Name
.Name
);
3927 if (!NT_SUCCESS(Status
))
3929 TRACE("Status 0x%08lx\n", Status
);
3933 *Buffer
= InfoBuffer
;
3936 if (!NT_SUCCESS(Status
))
3938 if (InfoBuffer
!= NULL
)
3940 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3941 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3943 midl_user_free(InfoBuffer
);
3952 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
3953 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3955 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3960 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3961 if (InfoBuffer
== NULL
)
3962 return STATUS_INSUFFICIENT_RESOURCES
;
3964 Status
= SampGetObjectAttributeString(AliasObject
,
3966 &InfoBuffer
->AdminComment
.AdminComment
);
3967 if (!NT_SUCCESS(Status
))
3969 TRACE("Status 0x%08lx\n", Status
);
3973 *Buffer
= InfoBuffer
;
3976 if (!NT_SUCCESS(Status
))
3978 if (InfoBuffer
!= NULL
)
3980 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3981 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3983 midl_user_free(InfoBuffer
);
3994 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
3995 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
3996 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3998 PSAM_DB_OBJECT AliasObject
;
4001 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4002 AliasHandle
, AliasInformationClass
, Buffer
);
4004 /* Validate the alias handle */
4005 Status
= SampValidateDbObject(AliasHandle
,
4007 ALIAS_READ_INFORMATION
,
4009 if (!NT_SUCCESS(Status
))
4012 switch (AliasInformationClass
)
4014 case AliasGeneralInformation
:
4015 Status
= SampQueryAliasGeneral(AliasObject
,
4019 case AliasNameInformation
:
4020 Status
= SampQueryAliasName(AliasObject
,
4024 case AliasAdminCommentInformation
:
4025 Status
= SampQueryAliasAdminComment(AliasObject
,
4030 Status
= STATUS_INVALID_INFO_CLASS
;
4041 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4042 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4043 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4045 PSAM_DB_OBJECT AliasObject
;
4048 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4049 AliasHandle
, AliasInformationClass
, Buffer
);
4051 /* Validate the alias handle */
4052 Status
= SampValidateDbObject(AliasHandle
,
4054 ALIAS_WRITE_ACCOUNT
,
4056 if (!NT_SUCCESS(Status
))
4059 switch (AliasInformationClass
)
4061 case AliasNameInformation
:
4062 Status
= SampSetObjectAttribute(AliasObject
,
4065 Buffer
->Name
.Name
.Buffer
,
4066 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4069 case AliasAdminCommentInformation
:
4070 Status
= SampSetObjectAttribute(AliasObject
,
4073 Buffer
->AdminComment
.AdminComment
.Buffer
,
4074 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4078 Status
= STATUS_INVALID_INFO_CLASS
;
4089 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4092 return STATUS_NOT_IMPLEMENTED
;
4099 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4100 IN PRPC_SID MemberId
)
4102 PSAM_DB_OBJECT AliasObject
;
4103 LPWSTR MemberIdString
= NULL
;
4104 HANDLE MembersKeyHandle
= NULL
;
4105 HANDLE MemberKeyHandle
= NULL
;
4106 ULONG MemberIdLength
;
4109 TRACE("SamrAddMemberToAlias(%p %p)\n",
4110 AliasHandle
, MemberId
);
4112 /* Validate the alias handle */
4113 Status
= SampValidateDbObject(AliasHandle
,
4117 if (!NT_SUCCESS(Status
))
4119 TRACE("failed with status 0x%08lx\n", Status
);
4123 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4124 TRACE("Member SID: %S\n", MemberIdString
);
4126 MemberIdLength
= RtlLengthSid(MemberId
);
4128 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4132 if (!NT_SUCCESS(Status
))
4134 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4138 Status
= SampRegSetValue(MembersKeyHandle
,
4143 if (!NT_SUCCESS(Status
))
4145 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4149 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4153 if (!NT_SUCCESS(Status
))
4155 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4159 Status
= SampRegSetValue(MemberKeyHandle
,
4164 if (!NT_SUCCESS(Status
))
4166 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4171 if (MemberKeyHandle
!= NULL
)
4172 SampRegCloseKey(MemberKeyHandle
);
4174 if (MembersKeyHandle
!= NULL
)
4175 SampRegCloseKey(MembersKeyHandle
);
4177 if (MemberIdString
!= NULL
)
4178 LocalFree(MemberIdString
);
4187 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4188 IN PRPC_SID MemberId
)
4191 return STATUS_NOT_IMPLEMENTED
;
4197 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4198 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4200 PSAM_DB_OBJECT AliasObject
;
4201 HANDLE MembersKeyHandle
= NULL
;
4202 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4203 ULONG ValueCount
= 0;
4208 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4209 AliasHandle
, Members
);
4211 /* Validate the alias handle */
4212 Status
= SampValidateDbObject(AliasHandle
,
4216 if (!NT_SUCCESS(Status
))
4218 ERR("failed with status 0x%08lx\n", Status
);
4222 /* Open the members key of the alias objct */
4223 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4227 if (!NT_SUCCESS(Status
))
4229 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4233 /* Get the number of members */
4234 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4237 if (!NT_SUCCESS(Status
))
4239 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4243 /* Allocate the member array */
4244 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4245 if (MemberArray
== NULL
)
4247 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4251 /* Enumerate the members */
4255 /* Get the size of the next SID */
4257 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4264 if (!NT_SUCCESS(Status
))
4266 if (Status
== STATUS_NO_MORE_ENTRIES
)
4267 Status
= STATUS_SUCCESS
;
4271 /* Allocate a buffer for the SID */
4272 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4273 if (MemberArray
[Index
].SidPointer
== NULL
)
4275 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4279 /* Read the SID into the buffer */
4280 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4285 (PVOID
)MemberArray
[Index
].SidPointer
,
4287 if (!NT_SUCCESS(Status
))
4295 /* Return the number of members and the member array */
4296 if (NT_SUCCESS(Status
))
4298 Members
->Count
= ValueCount
;
4299 Members
->Sids
= MemberArray
;
4303 /* Clean up the members array and the SID buffers if something failed */
4304 if (!NT_SUCCESS(Status
))
4306 if (MemberArray
!= NULL
)
4308 for (Index
= 0; Index
< ValueCount
; Index
++)
4310 if (MemberArray
[Index
].SidPointer
!= NULL
)
4311 midl_user_free(MemberArray
[Index
].SidPointer
);
4314 midl_user_free(MemberArray
);
4318 /* Close the members key */
4319 if (MembersKeyHandle
!= NULL
)
4320 SampRegCloseKey(MembersKeyHandle
);
4329 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
4330 IN ACCESS_MASK DesiredAccess
,
4331 IN
unsigned long UserId
,
4332 OUT SAMPR_HANDLE
*UserHandle
)
4334 PSAM_DB_OBJECT DomainObject
;
4335 PSAM_DB_OBJECT UserObject
;
4339 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
4340 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
4342 /* Validate the domain handle */
4343 Status
= SampValidateDbObject(DomainHandle
,
4347 if (!NT_SUCCESS(Status
))
4349 TRACE("failed with status 0x%08lx\n", Status
);
4353 /* Convert the RID into a string (hex) */
4354 swprintf(szRid
, L
"%08lX", UserId
);
4356 /* Create the user object */
4357 Status
= SampOpenDbObject(DomainObject
,
4363 if (!NT_SUCCESS(Status
))
4365 TRACE("failed with status 0x%08lx\n", Status
);
4369 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
4371 return STATUS_SUCCESS
;
4378 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
4381 return STATUS_NOT_IMPLEMENTED
;
4387 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
4388 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4390 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4391 SAM_USER_FIXED_DATA FixedData
;
4397 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4398 if (InfoBuffer
== NULL
)
4399 return STATUS_INSUFFICIENT_RESOURCES
;
4401 Length
= sizeof(SAM_USER_FIXED_DATA
);
4402 Status
= SampGetObjectAttribute(UserObject
,
4407 if (!NT_SUCCESS(Status
))
4410 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4412 /* Get the Name string */
4413 Status
= SampGetObjectAttributeString(UserObject
,
4415 &InfoBuffer
->General
.UserName
);
4416 if (!NT_SUCCESS(Status
))
4418 TRACE("Status 0x%08lx\n", Status
);
4422 /* Get the FullName string */
4423 Status
= SampGetObjectAttributeString(UserObject
,
4425 &InfoBuffer
->General
.FullName
);
4426 if (!NT_SUCCESS(Status
))
4428 TRACE("Status 0x%08lx\n", Status
);
4432 /* Get the AdminComment string */
4433 Status
= SampGetObjectAttributeString(UserObject
,
4435 &InfoBuffer
->General
.AdminComment
);
4436 if (!NT_SUCCESS(Status
))
4438 TRACE("Status 0x%08lx\n", Status
);
4442 /* Get the UserComment string */
4443 Status
= SampGetObjectAttributeString(UserObject
,
4445 &InfoBuffer
->General
.UserComment
);
4446 if (!NT_SUCCESS(Status
))
4448 TRACE("Status 0x%08lx\n", Status
);
4452 *Buffer
= InfoBuffer
;
4455 if (!NT_SUCCESS(Status
))
4457 if (InfoBuffer
!= NULL
)
4459 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
4460 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
4462 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
4463 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
4465 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4466 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4468 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
4469 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
4471 midl_user_free(InfoBuffer
);
4481 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
4482 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4484 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4485 SAM_USER_FIXED_DATA FixedData
;
4491 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4492 if (InfoBuffer
== NULL
)
4493 return STATUS_INSUFFICIENT_RESOURCES
;
4495 Length
= sizeof(SAM_USER_FIXED_DATA
);
4496 Status
= SampGetObjectAttribute(UserObject
,
4501 if (!NT_SUCCESS(Status
))
4504 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
4505 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
4507 /* Get the UserComment string */
4508 Status
= SampGetObjectAttributeString(UserObject
,
4510 &InfoBuffer
->Preferences
.UserComment
);
4511 if (!NT_SUCCESS(Status
))
4513 TRACE("Status 0x%08lx\n", Status
);
4517 *Buffer
= InfoBuffer
;
4520 if (!NT_SUCCESS(Status
))
4522 if (InfoBuffer
!= NULL
)
4524 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
4525 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
4527 midl_user_free(InfoBuffer
);
4537 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
4538 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4540 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4541 SAM_USER_FIXED_DATA FixedData
;
4547 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4548 if (InfoBuffer
== NULL
)
4549 return STATUS_INSUFFICIENT_RESOURCES
;
4551 Length
= sizeof(SAM_USER_FIXED_DATA
);
4552 Status
= SampGetObjectAttribute(UserObject
,
4557 if (!NT_SUCCESS(Status
))
4560 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
4561 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4562 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4563 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4564 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4565 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4566 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4567 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4568 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4569 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
4570 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
4572 // OLD_LARGE_INTEGER PasswordCanChange;
4573 // OLD_LARGE_INTEGER PasswordMustChange;
4575 /* Get the Name string */
4576 Status
= SampGetObjectAttributeString(UserObject
,
4578 &InfoBuffer
->Logon
.UserName
);
4579 if (!NT_SUCCESS(Status
))
4581 TRACE("Status 0x%08lx\n", Status
);
4585 /* Get the FullName string */
4586 Status
= SampGetObjectAttributeString(UserObject
,
4588 &InfoBuffer
->Logon
.FullName
);
4589 if (!NT_SUCCESS(Status
))
4591 TRACE("Status 0x%08lx\n", Status
);
4595 /* Get the HomeDirectory string */
4596 Status
= SampGetObjectAttributeString(UserObject
,
4598 &InfoBuffer
->Logon
.HomeDirectory
);
4599 if (!NT_SUCCESS(Status
))
4601 TRACE("Status 0x%08lx\n", Status
);
4605 /* Get the HomeDirectoryDrive string */
4606 Status
= SampGetObjectAttributeString(UserObject
,
4607 L
"HomeDirectoryDrive",
4608 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
4609 if (!NT_SUCCESS(Status
))
4611 TRACE("Status 0x%08lx\n", Status
);
4615 /* Get the ScriptPath string */
4616 Status
= SampGetObjectAttributeString(UserObject
,
4618 &InfoBuffer
->Logon
.ScriptPath
);
4619 if (!NT_SUCCESS(Status
))
4621 TRACE("Status 0x%08lx\n", Status
);
4625 /* Get the ProfilePath string */
4626 Status
= SampGetObjectAttributeString(UserObject
,
4628 &InfoBuffer
->Logon
.ProfilePath
);
4629 if (!NT_SUCCESS(Status
))
4631 TRACE("Status 0x%08lx\n", Status
);
4635 /* Get the WorkStations string */
4636 Status
= SampGetObjectAttributeString(UserObject
,
4638 &InfoBuffer
->Logon
.WorkStations
);
4639 if (!NT_SUCCESS(Status
))
4641 TRACE("Status 0x%08lx\n", Status
);
4645 /* FIXME: LogonHours */
4647 *Buffer
= InfoBuffer
;
4650 if (!NT_SUCCESS(Status
))
4652 if (InfoBuffer
!= NULL
)
4654 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
4655 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
4657 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
4658 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
4660 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
4661 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
4663 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
4664 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
4666 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
4667 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
4669 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
4670 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
4672 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
4673 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
4675 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
4676 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
4678 midl_user_free(InfoBuffer
);
4688 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
4689 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4691 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4692 SAM_USER_FIXED_DATA FixedData
;
4698 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4699 if (InfoBuffer
== NULL
)
4700 return STATUS_INSUFFICIENT_RESOURCES
;
4702 Length
= sizeof(SAM_USER_FIXED_DATA
);
4703 Status
= SampGetObjectAttribute(UserObject
,
4708 if (!NT_SUCCESS(Status
))
4711 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
4712 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4713 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
4714 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
4715 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
4716 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
4717 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
4718 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
4719 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
4720 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
4721 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
4722 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
4723 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
4725 /* Get the Name string */
4726 Status
= SampGetObjectAttributeString(UserObject
,
4728 &InfoBuffer
->Account
.UserName
);
4729 if (!NT_SUCCESS(Status
))
4731 TRACE("Status 0x%08lx\n", Status
);
4735 /* Get the FullName string */
4736 Status
= SampGetObjectAttributeString(UserObject
,
4738 &InfoBuffer
->Account
.FullName
);
4739 if (!NT_SUCCESS(Status
))
4741 TRACE("Status 0x%08lx\n", Status
);
4745 /* Get the HomeDirectory string */
4746 Status
= SampGetObjectAttributeString(UserObject
,
4748 &InfoBuffer
->Account
.HomeDirectory
);
4749 if (!NT_SUCCESS(Status
))
4751 TRACE("Status 0x%08lx\n", Status
);
4755 /* Get the HomeDirectoryDrive string */
4756 Status
= SampGetObjectAttributeString(UserObject
,
4757 L
"HomeDirectoryDrive",
4758 &InfoBuffer
->Account
.HomeDirectoryDrive
);
4759 if (!NT_SUCCESS(Status
))
4761 TRACE("Status 0x%08lx\n", Status
);
4765 /* Get the ScriptPath string */
4766 Status
= SampGetObjectAttributeString(UserObject
,
4768 &InfoBuffer
->Account
.ScriptPath
);
4769 if (!NT_SUCCESS(Status
))
4771 TRACE("Status 0x%08lx\n", Status
);
4775 /* Get the ProfilePath string */
4776 Status
= SampGetObjectAttributeString(UserObject
,
4778 &InfoBuffer
->Account
.ProfilePath
);
4779 if (!NT_SUCCESS(Status
))
4781 TRACE("Status 0x%08lx\n", Status
);
4785 /* Get the AdminComment string */
4786 Status
= SampGetObjectAttributeString(UserObject
,
4788 &InfoBuffer
->Account
.AdminComment
);
4789 if (!NT_SUCCESS(Status
))
4791 TRACE("Status 0x%08lx\n", Status
);
4795 /* Get the WorkStations string */
4796 Status
= SampGetObjectAttributeString(UserObject
,
4798 &InfoBuffer
->Account
.WorkStations
);
4799 if (!NT_SUCCESS(Status
))
4801 TRACE("Status 0x%08lx\n", Status
);
4805 /* FIXME: LogonHours */
4807 *Buffer
= InfoBuffer
;
4810 if (!NT_SUCCESS(Status
))
4812 if (InfoBuffer
!= NULL
)
4814 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
4815 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
4817 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
4818 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
4820 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
4821 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
4823 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
4824 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
4826 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
4827 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
4829 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
4830 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
4832 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
4833 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
4835 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
4836 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
4838 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
4839 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
4841 midl_user_free(InfoBuffer
);
4848 /* FIXME: SampQueryUserLogonHours */
4852 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
4853 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4855 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4860 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4861 if (InfoBuffer
== NULL
)
4862 return STATUS_INSUFFICIENT_RESOURCES
;
4864 /* Get the Name string */
4865 Status
= SampGetObjectAttributeString(UserObject
,
4867 &InfoBuffer
->Name
.UserName
);
4868 if (!NT_SUCCESS(Status
))
4870 TRACE("Status 0x%08lx\n", Status
);
4874 /* Get the FullName string */
4875 Status
= SampGetObjectAttributeString(UserObject
,
4877 &InfoBuffer
->Name
.FullName
);
4878 if (!NT_SUCCESS(Status
))
4880 TRACE("Status 0x%08lx\n", Status
);
4884 *Buffer
= InfoBuffer
;
4887 if (!NT_SUCCESS(Status
))
4889 if (InfoBuffer
!= NULL
)
4891 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
4892 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
4894 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
4895 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
4897 midl_user_free(InfoBuffer
);
4906 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
4907 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4909 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4914 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4915 if (InfoBuffer
== NULL
)
4916 return STATUS_INSUFFICIENT_RESOURCES
;
4918 /* Get the Name string */
4919 Status
= SampGetObjectAttributeString(UserObject
,
4921 &InfoBuffer
->AccountName
.UserName
);
4922 if (!NT_SUCCESS(Status
))
4924 TRACE("Status 0x%08lx\n", Status
);
4928 *Buffer
= InfoBuffer
;
4931 if (!NT_SUCCESS(Status
))
4933 if (InfoBuffer
!= NULL
)
4935 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
4936 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
4938 midl_user_free(InfoBuffer
);
4947 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
4948 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4950 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4955 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4956 if (InfoBuffer
== NULL
)
4957 return STATUS_INSUFFICIENT_RESOURCES
;
4959 /* Get the FullName string */
4960 Status
= SampGetObjectAttributeString(UserObject
,
4962 &InfoBuffer
->FullName
.FullName
);
4963 if (!NT_SUCCESS(Status
))
4965 TRACE("Status 0x%08lx\n", Status
);
4969 *Buffer
= InfoBuffer
;
4972 if (!NT_SUCCESS(Status
))
4974 if (InfoBuffer
!= NULL
)
4976 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
4977 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
4979 midl_user_free(InfoBuffer
);
4989 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
4990 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4992 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4993 SAM_USER_FIXED_DATA FixedData
;
4999 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5000 if (InfoBuffer
== NULL
)
5001 return STATUS_INSUFFICIENT_RESOURCES
;
5003 Length
= sizeof(SAM_USER_FIXED_DATA
);
5004 Status
= SampGetObjectAttribute(UserObject
,
5009 if (!NT_SUCCESS(Status
))
5012 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5014 *Buffer
= InfoBuffer
;
5017 if (!NT_SUCCESS(Status
))
5019 if (InfoBuffer
!= NULL
)
5021 midl_user_free(InfoBuffer
);
5030 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5031 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5033 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5038 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5039 if (InfoBuffer
== NULL
)
5040 return STATUS_INSUFFICIENT_RESOURCES
;
5042 /* Get the HomeDirectory string */
5043 Status
= SampGetObjectAttributeString(UserObject
,
5045 &InfoBuffer
->Home
.HomeDirectory
);
5046 if (!NT_SUCCESS(Status
))
5048 TRACE("Status 0x%08lx\n", Status
);
5052 /* Get the HomeDirectoryDrive string */
5053 Status
= SampGetObjectAttributeString(UserObject
,
5054 L
"HomeDirectoryDrive",
5055 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5056 if (!NT_SUCCESS(Status
))
5058 TRACE("Status 0x%08lx\n", Status
);
5062 *Buffer
= InfoBuffer
;
5065 if (!NT_SUCCESS(Status
))
5067 if (InfoBuffer
!= NULL
)
5069 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5070 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5072 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5073 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5075 midl_user_free(InfoBuffer
);
5084 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5085 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5087 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5092 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5093 if (InfoBuffer
== NULL
)
5094 return STATUS_INSUFFICIENT_RESOURCES
;
5096 /* Get the ScriptPath string */
5097 Status
= SampGetObjectAttributeString(UserObject
,
5099 &InfoBuffer
->Script
.ScriptPath
);
5100 if (!NT_SUCCESS(Status
))
5102 TRACE("Status 0x%08lx\n", Status
);
5106 *Buffer
= InfoBuffer
;
5109 if (!NT_SUCCESS(Status
))
5111 if (InfoBuffer
!= NULL
)
5113 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5114 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5116 midl_user_free(InfoBuffer
);
5125 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5126 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5128 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5133 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5134 if (InfoBuffer
== NULL
)
5135 return STATUS_INSUFFICIENT_RESOURCES
;
5137 /* Get the ProfilePath string */
5138 Status
= SampGetObjectAttributeString(UserObject
,
5140 &InfoBuffer
->Profile
.ProfilePath
);
5141 if (!NT_SUCCESS(Status
))
5143 TRACE("Status 0x%08lx\n", Status
);
5147 *Buffer
= InfoBuffer
;
5150 if (!NT_SUCCESS(Status
))
5152 if (InfoBuffer
!= NULL
)
5154 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
5155 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5157 midl_user_free(InfoBuffer
);
5166 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5167 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5169 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5174 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5175 if (InfoBuffer
== NULL
)
5176 return STATUS_INSUFFICIENT_RESOURCES
;
5178 /* Get the AdminComment string */
5179 Status
= SampGetObjectAttributeString(UserObject
,
5181 &InfoBuffer
->AdminComment
.AdminComment
);
5182 if (!NT_SUCCESS(Status
))
5184 TRACE("Status 0x%08lx\n", Status
);
5188 *Buffer
= InfoBuffer
;
5191 if (!NT_SUCCESS(Status
))
5193 if (InfoBuffer
!= NULL
)
5195 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5196 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5198 midl_user_free(InfoBuffer
);
5207 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5208 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5210 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5215 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5216 if (InfoBuffer
== NULL
)
5217 return STATUS_INSUFFICIENT_RESOURCES
;
5219 /* Get the WorkStations string */
5220 Status
= SampGetObjectAttributeString(UserObject
,
5222 &InfoBuffer
->WorkStations
.WorkStations
);
5223 if (!NT_SUCCESS(Status
))
5225 TRACE("Status 0x%08lx\n", Status
);
5229 *Buffer
= InfoBuffer
;
5232 if (!NT_SUCCESS(Status
))
5234 if (InfoBuffer
!= NULL
)
5236 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
5237 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
5239 midl_user_free(InfoBuffer
);
5249 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
5250 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5252 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5253 SAM_USER_FIXED_DATA FixedData
;
5259 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5260 if (InfoBuffer
== NULL
)
5261 return STATUS_INSUFFICIENT_RESOURCES
;
5263 Length
= sizeof(SAM_USER_FIXED_DATA
);
5264 Status
= SampGetObjectAttribute(UserObject
,
5269 if (!NT_SUCCESS(Status
))
5272 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
5274 *Buffer
= InfoBuffer
;
5277 if (!NT_SUCCESS(Status
))
5279 if (InfoBuffer
!= NULL
)
5281 midl_user_free(InfoBuffer
);
5291 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
5292 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5294 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5295 SAM_USER_FIXED_DATA FixedData
;
5301 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5302 if (InfoBuffer
== NULL
)
5303 return STATUS_INSUFFICIENT_RESOURCES
;
5305 Length
= sizeof(SAM_USER_FIXED_DATA
);
5306 Status
= SampGetObjectAttribute(UserObject
,
5311 if (!NT_SUCCESS(Status
))
5314 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5315 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5317 *Buffer
= InfoBuffer
;
5320 if (!NT_SUCCESS(Status
))
5322 if (InfoBuffer
!= NULL
)
5324 midl_user_free(InfoBuffer
);
5335 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
5336 IN USER_INFORMATION_CLASS UserInformationClass
,
5337 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
5339 PSAM_DB_OBJECT UserObject
;
5340 ACCESS_MASK DesiredAccess
;
5343 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
5344 UserHandle
, UserInformationClass
, Buffer
);
5346 switch (UserInformationClass
)
5348 case UserGeneralInformation
:
5349 case UserNameInformation
:
5350 case UserAccountNameInformation
:
5351 case UserFullNameInformation
:
5352 case UserPrimaryGroupInformation
:
5353 case UserAdminCommentInformation
:
5354 DesiredAccess
= USER_READ_GENERAL
;
5357 case UserLogonHoursInformation
:
5358 case UserHomeInformation
:
5359 case UserScriptInformation
:
5360 case UserProfileInformation
:
5361 case UserWorkStationsInformation
:
5362 DesiredAccess
= USER_READ_LOGON
;
5365 case UserControlInformation
:
5366 case UserExpiresInformation
:
5367 DesiredAccess
= USER_READ_ACCOUNT
;
5370 case UserPreferencesInformation
:
5371 DesiredAccess
= USER_READ_GENERAL
|
5372 USER_READ_PREFERENCES
;
5375 case UserLogonInformation
:
5376 case UserAccountInformation
:
5377 DesiredAccess
= USER_READ_GENERAL
|
5378 USER_READ_PREFERENCES
|
5384 return STATUS_INVALID_INFO_CLASS
;
5387 /* Validate the domain handle */
5388 Status
= SampValidateDbObject(UserHandle
,
5392 if (!NT_SUCCESS(Status
))
5394 TRACE("failed with status 0x%08lx\n", Status
);
5398 switch (UserInformationClass
)
5400 case UserGeneralInformation
:
5401 Status
= SampQueryUserGeneral(UserObject
,
5405 case UserPreferencesInformation
:
5406 Status
= SampQueryUserPreferences(UserObject
,
5410 case UserLogonInformation
:
5411 Status
= SampQueryUserLogon(UserObject
,
5415 // case UserLogonHoursInformation:
5416 // Status = SampQueryUserLogonHours(UserObject,
5420 case UserAccountInformation
:
5421 Status
= SampQueryUserAccount(UserObject
,
5425 case UserNameInformation
:
5426 Status
= SampQueryUserName(UserObject
,
5430 case UserAccountNameInformation
:
5431 Status
= SampQueryUserAccountName(UserObject
,
5435 case UserFullNameInformation
:
5436 Status
= SampQueryUserFullName(UserObject
,
5440 case UserPrimaryGroupInformation
:
5441 Status
= SampQueryUserPrimaryGroup(UserObject
,
5445 case UserHomeInformation
:
5446 Status
= SampQueryUserHome(UserObject
,
5449 case UserScriptInformation
:
5450 Status
= SampQueryUserScript(UserObject
,
5454 case UserProfileInformation
:
5455 Status
= SampQueryUserProfile(UserObject
,
5459 case UserAdminCommentInformation
:
5460 Status
= SampQueryUserAdminComment(UserObject
,
5464 case UserWorkStationsInformation
:
5465 Status
= SampQueryUserWorkStations(UserObject
,
5469 case UserControlInformation
:
5470 Status
= SampQueryUserControl(UserObject
,
5474 case UserExpiresInformation
:
5475 Status
= SampQueryUserExpires(UserObject
,
5480 Status
= STATUS_INVALID_INFO_CLASS
;
5488 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
5489 PSAMPR_USER_INFO_BUFFER Buffer
)
5491 SAM_USER_FIXED_DATA FixedData
;
5495 Length
= sizeof(SAM_USER_FIXED_DATA
);
5496 Status
= SampGetObjectAttribute(UserObject
,
5501 if (!NT_SUCCESS(Status
))
5504 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
5506 Status
= SampSetObjectAttribute(UserObject
,
5511 if (!NT_SUCCESS(Status
))
5514 Status
= SampSetObjectAttribute(UserObject
,
5517 Buffer
->General
.UserName
.Buffer
,
5518 Buffer
->General
.UserName
.MaximumLength
);
5519 if (!NT_SUCCESS(Status
))
5522 Status
= SampSetObjectAttribute(UserObject
,
5525 Buffer
->General
.FullName
.Buffer
,
5526 Buffer
->General
.FullName
.MaximumLength
);
5527 if (!NT_SUCCESS(Status
))
5530 Status
= SampSetObjectAttribute(UserObject
,
5533 Buffer
->General
.AdminComment
.Buffer
,
5534 Buffer
->General
.AdminComment
.MaximumLength
);
5535 if (!NT_SUCCESS(Status
))
5538 Status
= SampSetObjectAttribute(UserObject
,
5541 Buffer
->General
.UserComment
.Buffer
,
5542 Buffer
->General
.UserComment
.MaximumLength
);
5550 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
5551 PSAMPR_USER_INFO_BUFFER Buffer
)
5553 SAM_USER_FIXED_DATA FixedData
;
5557 Length
= sizeof(SAM_USER_FIXED_DATA
);
5558 Status
= SampGetObjectAttribute(UserObject
,
5563 if (!NT_SUCCESS(Status
))
5566 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
5567 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
5569 Status
= SampSetObjectAttribute(UserObject
,
5574 if (!NT_SUCCESS(Status
))
5577 Status
= SampSetObjectAttribute(UserObject
,
5580 Buffer
->Preferences
.UserComment
.Buffer
,
5581 Buffer
->Preferences
.UserComment
.MaximumLength
);
5589 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5590 PSAMPR_USER_INFO_BUFFER Buffer
)
5592 SAM_USER_FIXED_DATA FixedData
;
5596 Length
= sizeof(SAM_USER_FIXED_DATA
);
5597 Status
= SampGetObjectAttribute(UserObject
,
5602 if (!NT_SUCCESS(Status
))
5605 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
5607 Status
= SampSetObjectAttribute(UserObject
,
5619 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
5620 PSAMPR_USER_INFO_BUFFER Buffer
)
5622 SAM_USER_FIXED_DATA FixedData
;
5626 Length
= sizeof(SAM_USER_FIXED_DATA
);
5627 Status
= SampGetObjectAttribute(UserObject
,
5632 if (!NT_SUCCESS(Status
))
5635 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
5637 Status
= SampSetObjectAttribute(UserObject
,
5649 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
5650 PSAMPR_USER_INFO_BUFFER Buffer
)
5652 SAM_USER_FIXED_DATA FixedData
;
5656 Length
= sizeof(SAM_USER_FIXED_DATA
);
5657 Status
= SampGetObjectAttribute(UserObject
,
5662 if (!NT_SUCCESS(Status
))
5665 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
5666 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
5668 Status
= SampSetObjectAttribute(UserObject
,
5682 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
5683 IN USER_INFORMATION_CLASS UserInformationClass
,
5684 IN PSAMPR_USER_INFO_BUFFER Buffer
)
5686 PSAM_DB_OBJECT UserObject
;
5687 ACCESS_MASK DesiredAccess
;
5690 TRACE("SamrSetInformationUser(%p %lu %p)\n",
5691 UserHandle
, UserInformationClass
, Buffer
);
5693 switch (UserInformationClass
)
5695 case UserLogonHoursInformation
:
5696 case UserNameInformation
:
5697 case UserAccountNameInformation
:
5698 case UserFullNameInformation
:
5699 case UserPrimaryGroupInformation
:
5700 case UserHomeInformation
:
5701 case UserScriptInformation
:
5702 case UserProfileInformation
:
5703 case UserAdminCommentInformation
:
5704 case UserWorkStationsInformation
:
5705 case UserControlInformation
:
5706 case UserExpiresInformation
:
5707 DesiredAccess
= USER_WRITE_ACCOUNT
;
5710 case UserGeneralInformation
:
5711 DesiredAccess
= USER_WRITE_ACCOUNT
|
5712 USER_WRITE_PREFERENCES
;
5715 case UserPreferencesInformation
:
5716 DesiredAccess
= USER_WRITE_PREFERENCES
;
5719 case UserSetPasswordInformation
:
5720 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
5724 return STATUS_INVALID_INFO_CLASS
;
5727 /* Validate the domain handle */
5728 Status
= SampValidateDbObject(UserHandle
,
5732 if (!NT_SUCCESS(Status
))
5734 TRACE("failed with status 0x%08lx\n", Status
);
5738 switch (UserInformationClass
)
5740 case UserGeneralInformation
:
5741 Status
= SampSetUserGeneral(UserObject
,
5745 case UserPreferencesInformation
:
5746 Status
= SampSetUserPreferences(UserObject
,
5750 case UserLogonHoursInformation:
5751 Status = SampSetUserLogonHours(UserObject,
5755 case UserNameInformation
:
5756 Status
= SampSetObjectAttribute(UserObject
,
5759 Buffer
->Name
.UserName
.Buffer
,
5760 Buffer
->Name
.UserName
.MaximumLength
);
5761 if (!NT_SUCCESS(Status
))
5764 Status
= SampSetObjectAttribute(UserObject
,
5767 Buffer
->Name
.FullName
.Buffer
,
5768 Buffer
->Name
.FullName
.MaximumLength
);
5771 case UserAccountNameInformation
:
5772 Status
= SampSetObjectAttribute(UserObject
,
5775 Buffer
->AccountName
.UserName
.Buffer
,
5776 Buffer
->AccountName
.UserName
.MaximumLength
);
5779 case UserFullNameInformation
:
5780 Status
= SampSetObjectAttribute(UserObject
,
5783 Buffer
->FullName
.FullName
.Buffer
,
5784 Buffer
->FullName
.FullName
.MaximumLength
);
5787 case UserPrimaryGroupInformation
:
5788 Status
= SampSetUserPrimaryGroup(UserObject
,
5792 case UserHomeInformation
:
5793 Status
= SampSetObjectAttribute(UserObject
,
5796 Buffer
->Home
.HomeDirectory
.Buffer
,
5797 Buffer
->Home
.HomeDirectory
.MaximumLength
);
5798 if (!NT_SUCCESS(Status
))
5801 Status
= SampSetObjectAttribute(UserObject
,
5802 L
"HomeDirectoryDrive",
5804 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
5805 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
5808 case UserScriptInformation
:
5809 Status
= SampSetObjectAttribute(UserObject
,
5812 Buffer
->Script
.ScriptPath
.Buffer
,
5813 Buffer
->Script
.ScriptPath
.MaximumLength
);
5816 case UserProfileInformation
:
5817 Status
= SampSetObjectAttribute(UserObject
,
5820 Buffer
->Profile
.ProfilePath
.Buffer
,
5821 Buffer
->Profile
.ProfilePath
.MaximumLength
);
5824 case UserAdminCommentInformation
:
5825 Status
= SampSetObjectAttribute(UserObject
,
5828 Buffer
->AdminComment
.AdminComment
.Buffer
,
5829 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
5832 case UserWorkStationsInformation
:
5833 Status
= SampSetObjectAttribute(UserObject
,
5836 Buffer
->WorkStations
.WorkStations
.Buffer
,
5837 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
5840 case UserSetPasswordInformation
:
5841 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
5842 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
5844 Status
= SampSetObjectAttribute(UserObject
,
5847 Buffer
->SetPassword
.Password
.Buffer
,
5848 Buffer
->SetPassword
.Password
.MaximumLength
);
5851 case UserControlInformation
:
5852 Status
= SampSetUserControl(UserObject
,
5856 case UserExpiresInformation
:
5857 Status
= SampSetUserExpires(UserObject
,
5861 // case UserInternal1Information:
5862 // case UserParametersInformation:
5863 // case UserAllInformation:
5864 // case UserInternal4Information:
5865 // case UserInternal5Information:
5866 // case UserInternal4InformationNew:
5867 // case UserInternal5InformationNew:
5870 Status
= STATUS_INVALID_INFO_CLASS
;
5879 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
5880 IN
unsigned char LmPresent
,
5881 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
5882 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
5883 IN
unsigned char NtPresent
,
5884 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
5885 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
5886 IN
unsigned char NtCrossEncryptionPresent
,
5887 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
5888 IN
unsigned char LmCrossEncryptionPresent
,
5889 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
5892 return STATUS_NOT_IMPLEMENTED
;
5898 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
5899 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
5902 return STATUS_NOT_IMPLEMENTED
;
5908 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
5909 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
5910 IN
unsigned long Index
,
5911 IN
unsigned long EntryCount
,
5912 IN
unsigned long PreferredMaximumLength
,
5913 OUT
unsigned long *TotalAvailable
,
5914 OUT
unsigned long *TotalReturned
,
5915 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
5918 return STATUS_NOT_IMPLEMENTED
;
5924 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
5925 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
5926 IN PRPC_UNICODE_STRING Prefix
,
5927 OUT
unsigned long *Index
)
5930 return STATUS_NOT_IMPLEMENTED
;
5936 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
5939 return STATUS_NOT_IMPLEMENTED
;
5945 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
5948 return STATUS_NOT_IMPLEMENTED
;
5954 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
5955 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
5958 return STATUS_NOT_IMPLEMENTED
;
5964 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
5965 IN PRPC_SID MemberSid
)
5968 return STATUS_NOT_IMPLEMENTED
;
5974 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
5975 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
5976 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
5979 return STATUS_NOT_IMPLEMENTED
;
5985 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
5986 IN USER_INFORMATION_CLASS UserInformationClass
,
5987 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
5990 return STATUS_NOT_IMPLEMENTED
;
5996 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
5997 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
5998 IN
unsigned long Index
,
5999 IN
unsigned long EntryCount
,
6000 IN
unsigned long PreferredMaximumLength
,
6001 OUT
unsigned long *TotalAvailable
,
6002 OUT
unsigned long *TotalReturned
,
6003 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6006 return STATUS_NOT_IMPLEMENTED
;
6012 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
6013 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6014 IN PRPC_UNICODE_STRING Prefix
,
6015 OUT
unsigned long *Index
)
6018 return STATUS_NOT_IMPLEMENTED
;
6025 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
6026 IN PRPC_UNICODE_STRING Name
,
6027 IN
unsigned long AccountType
,
6028 IN ACCESS_MASK DesiredAccess
,
6029 OUT SAMPR_HANDLE
*UserHandle
,
6030 OUT
unsigned long *GrantedAccess
,
6031 OUT
unsigned long *RelativeId
)
6033 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
6034 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
6035 SAM_USER_FIXED_DATA FixedUserData
;
6036 PSAM_DB_OBJECT DomainObject
;
6037 PSAM_DB_OBJECT UserObject
;
6043 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
6044 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
6047 Name
->Length
== 0 ||
6048 Name
->Buffer
== NULL
||
6049 UserHandle
== NULL
||
6051 return STATUS_INVALID_PARAMETER
;
6053 /* Check for valid account type */
6054 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
6055 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
6056 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
6057 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
6058 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
6059 return STATUS_INVALID_PARAMETER
;
6061 /* Validate the domain handle */
6062 Status
= SampValidateDbObject(DomainHandle
,
6066 if (!NT_SUCCESS(Status
))
6068 TRACE("failed with status 0x%08lx\n", Status
);
6072 /* Check if the user name already exists in the domain */
6073 Status
= SampCheckAccountNameInDomain(DomainObject
,
6075 if (!NT_SUCCESS(Status
))
6077 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
6078 Name
->Buffer
, Status
);
6082 /* Get the fixed domain attributes */
6083 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6084 Status
= SampGetObjectAttribute(DomainObject
,
6087 (PVOID
)&FixedDomainData
,
6089 if (!NT_SUCCESS(Status
))
6091 TRACE("failed with status 0x%08lx\n", Status
);
6095 /* Increment the NextRid attribute */
6096 ulRid
= FixedDomainData
.NextRid
;
6097 FixedDomainData
.NextRid
++;
6099 /* Store the fixed domain attributes */
6100 Status
= SampSetObjectAttribute(DomainObject
,
6105 if (!NT_SUCCESS(Status
))
6107 TRACE("failed with status 0x%08lx\n", Status
);
6111 TRACE("RID: %lx\n", ulRid
);
6113 /* Convert the RID into a string (hex) */
6114 swprintf(szRid
, L
"%08lX", ulRid
);
6116 /* Create the user object */
6117 Status
= SampCreateDbObject(DomainObject
,
6123 if (!NT_SUCCESS(Status
))
6125 TRACE("failed with status 0x%08lx\n", Status
);
6129 /* Add the account name for the user object */
6130 Status
= SampSetAccountNameInDomain(DomainObject
,
6134 if (!NT_SUCCESS(Status
))
6136 TRACE("failed with status 0x%08lx\n", Status
);
6140 /* Initialize fixed user data */
6141 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
6142 FixedUserData
.Version
= 1;
6143 FixedUserData
.LastLogon
.QuadPart
= 0;
6144 FixedUserData
.LastLogoff
.QuadPart
= 0;
6145 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
6146 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
6147 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
6148 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
6149 FixedUserData
.UserId
= ulRid
;
6150 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
6151 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
6152 USER_PASSWORD_NOT_REQUIRED
|
6155 /* Set fixed user data attribute */
6156 Status
= SampSetObjectAttribute(UserObject
,
6159 (LPVOID
)&FixedUserData
,
6160 sizeof(SAM_USER_FIXED_DATA
));
6161 if (!NT_SUCCESS(Status
))
6163 TRACE("failed with status 0x%08lx\n", Status
);
6167 /* Set the Name attribute */
6168 Status
= SampSetObjectAttribute(UserObject
,
6171 (LPVOID
)Name
->Buffer
,
6172 Name
->MaximumLength
);
6173 if (!NT_SUCCESS(Status
))
6175 TRACE("failed with status 0x%08lx\n", Status
);
6179 /* Set the FullName attribute */
6180 Status
= SampSetObjectAttribute(UserObject
,
6184 EmptyString
.MaximumLength
);
6185 if (!NT_SUCCESS(Status
))
6187 TRACE("failed with status 0x%08lx\n", Status
);
6191 /* Set the HomeDirectory attribute */
6192 Status
= SampSetObjectAttribute(UserObject
,
6196 EmptyString
.MaximumLength
);
6197 if (!NT_SUCCESS(Status
))
6199 TRACE("failed with status 0x%08lx\n", Status
);
6203 /* Set the HomeDirectoryDrive attribute */
6204 Status
= SampSetObjectAttribute(UserObject
,
6205 L
"HomeDirectoryDrive",
6208 EmptyString
.MaximumLength
);
6209 if (!NT_SUCCESS(Status
))
6211 TRACE("failed with status 0x%08lx\n", Status
);
6215 /* Set the ScriptPath attribute */
6216 Status
= SampSetObjectAttribute(UserObject
,
6220 EmptyString
.MaximumLength
);
6221 if (!NT_SUCCESS(Status
))
6223 TRACE("failed with status 0x%08lx\n", Status
);
6227 /* Set the ProfilePath attribute */
6228 Status
= SampSetObjectAttribute(UserObject
,
6232 EmptyString
.MaximumLength
);
6233 if (!NT_SUCCESS(Status
))
6235 TRACE("failed with status 0x%08lx\n", Status
);
6239 /* Set the AdminComment attribute */
6240 Status
= SampSetObjectAttribute(UserObject
,
6244 EmptyString
.MaximumLength
);
6245 if (!NT_SUCCESS(Status
))
6247 TRACE("failed with status 0x%08lx\n", Status
);
6251 /* Set the UserComment attribute */
6252 Status
= SampSetObjectAttribute(UserObject
,
6256 EmptyString
.MaximumLength
);
6257 if (!NT_SUCCESS(Status
))
6259 TRACE("failed with status 0x%08lx\n", Status
);
6263 /* Set the WorkStations attribute */
6264 Status
= SampSetObjectAttribute(UserObject
,
6268 EmptyString
.MaximumLength
);
6269 if (!NT_SUCCESS(Status
))
6271 TRACE("failed with status 0x%08lx\n", Status
);
6275 /* FIXME: Set default user attributes */
6277 if (NT_SUCCESS(Status
))
6279 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
6280 *RelativeId
= ulRid
;
6281 *GrantedAccess
= UserObject
->Access
;
6284 TRACE("returns with status 0x%08lx\n", Status
);
6293 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
6294 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
6295 IN
unsigned long Index
,
6296 IN
unsigned long EntryCount
,
6297 IN
unsigned long PreferredMaximumLength
,
6298 OUT
unsigned long *TotalAvailable
,
6299 OUT
unsigned long *TotalReturned
,
6300 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
6303 return STATUS_NOT_IMPLEMENTED
;
6310 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
6311 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6314 NTSTATUS Status
= STATUS_SUCCESS
;
6316 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
6317 AliasHandle
, MembersBuffer
);
6319 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
6321 Status
= SamrAddMemberToAlias(AliasHandle
,
6322 ((PSID
*)MembersBuffer
->Sids
)[i
]);
6324 if (Status
== STATUS_MEMBER_IN_ALIAS
)
6325 Status
= STATUS_SUCCESS
;
6327 if (!NT_SUCCESS(Status
))
6338 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
6339 IN PSAMPR_PSID_ARRAY MembersBuffer
)
6342 return STATUS_NOT_IMPLEMENTED
;
6348 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
6349 IN PRPC_STRING ServerName
,
6350 IN PRPC_STRING UserName
,
6351 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6352 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
6355 return STATUS_NOT_IMPLEMENTED
;
6361 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
6362 IN PRPC_UNICODE_STRING ServerName
,
6363 IN PRPC_UNICODE_STRING UserName
,
6364 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
6365 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
6366 IN
unsigned char LmPresent
,
6367 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
6368 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
6371 return STATUS_NOT_IMPLEMENTED
;
6377 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
6378 IN PRPC_UNICODE_STRING Unused
,
6379 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
6382 return STATUS_NOT_IMPLEMENTED
;
6388 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
6389 OUT SAMPR_HANDLE
*ServerHandle
,
6390 IN ACCESS_MASK DesiredAccess
)
6393 return STATUS_NOT_IMPLEMENTED
;
6399 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
6400 IN USER_INFORMATION_CLASS UserInformationClass
,
6401 IN PSAMPR_USER_INFO_BUFFER Buffer
)
6404 return STATUS_NOT_IMPLEMENTED
;
6410 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
6413 return STATUS_NOT_IMPLEMENTED
;
6419 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
6422 return STATUS_NOT_IMPLEMENTED
;
6428 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
6431 return STATUS_NOT_IMPLEMENTED
;
6437 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
6438 OUT SAMPR_HANDLE
*ServerHandle
,
6439 IN
unsigned long ClientRevision
,
6440 IN ACCESS_MASK DesiredAccess
)
6443 return STATUS_NOT_IMPLEMENTED
;
6449 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
6452 return STATUS_NOT_IMPLEMENTED
;
6458 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
6459 IN ACCESS_MASK DesiredAccess
,
6460 IN
unsigned long InVersion
,
6461 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
6462 OUT
unsigned long *OutVersion
,
6463 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
6464 OUT SAMPR_HANDLE
*ServerHandle
)
6467 return STATUS_NOT_IMPLEMENTED
;
6473 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
6474 IN
unsigned long Rid
,
6478 return STATUS_NOT_IMPLEMENTED
;
6484 SamrSetDSRMPassword(IN handle_t BindingHandle
,
6485 IN PRPC_UNICODE_STRING Unused
,
6486 IN
unsigned long UserId
,
6487 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
6490 return STATUS_NOT_IMPLEMENTED
;
6496 SamrValidatePassword(IN handle_t Handle
,
6497 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
6498 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
6499 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
6502 return STATUS_NOT_IMPLEMENTED
;