2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Security Account Manager (SAM) Server
4 * FILE: reactos/dll/win32/samsrv/samrpc.c
5 * PURPOSE: RPC interface functions
7 * PROGRAMMERS: Eric Kohl
10 /* INCLUDES ****************************************************************/
14 WINE_DEFAULT_DEBUG_CHANNEL(samsrv
);
16 /* GLOBALS ********************************************************************/
18 static SID_IDENTIFIER_AUTHORITY NtSidAuthority
= {SECURITY_NT_AUTHORITY
};
20 /* FUNCTIONS ***************************************************************/
23 SampStartRpcServer(VOID
)
27 TRACE("SampStartRpcServer() called\n");
29 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
33 if (Status
!= RPC_S_OK
)
35 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
39 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
42 if (Status
!= RPC_S_OK
)
44 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
48 Status
= RpcServerListen(1, 20, TRUE
);
49 if (Status
!= RPC_S_OK
)
51 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
55 TRACE("SampStartRpcServer() done\n");
59 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
61 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
65 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
67 HeapFree(GetProcessHeap(), 0, ptr
);
70 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
77 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
78 OUT SAMPR_HANDLE
*ServerHandle
,
79 IN ACCESS_MASK DesiredAccess
)
81 PSAM_DB_OBJECT ServerObject
;
84 TRACE("SamrConnect(%p %p %lx)\n",
85 ServerName
, ServerHandle
, DesiredAccess
);
87 Status
= SampOpenDbObject(NULL
,
93 if (NT_SUCCESS(Status
))
94 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
96 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
104 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
106 PSAM_DB_OBJECT DbObject
;
107 NTSTATUS Status
= STATUS_SUCCESS
;
109 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
111 Status
= SampValidateDbObject(*SamHandle
,
115 if (Status
== STATUS_SUCCESS
)
117 Status
= SampCloseDbObject(DbObject
);
121 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
129 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
130 IN SECURITY_INFORMATION SecurityInformation
,
131 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
134 return STATUS_NOT_IMPLEMENTED
;
140 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
141 IN SECURITY_INFORMATION SecurityInformation
,
142 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
* SecurityDescriptor
)
145 return STATUS_NOT_IMPLEMENTED
;
151 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
154 return STATUS_NOT_IMPLEMENTED
;
160 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
161 IN PRPC_UNICODE_STRING Name
,
162 OUT PRPC_SID
*DomainId
)
164 PSAM_DB_OBJECT ServerObject
;
165 HANDLE DomainsKeyHandle
= NULL
;
166 HANDLE DomainKeyHandle
= NULL
;
167 WCHAR DomainKeyName
[64];
169 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
170 UNICODE_STRING DomainName
;
175 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
176 ServerHandle
, Name
, DomainId
);
178 /* Validate the server handle */
179 Status
= SampValidateDbObject(ServerHandle
,
181 SAM_SERVER_LOOKUP_DOMAIN
,
183 if (!NT_SUCCESS(Status
))
188 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
192 if (!NT_SUCCESS(Status
))
196 while (Found
== FALSE
)
198 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
202 if (!NT_SUCCESS(Status
))
204 if (Status
== STATUS_NO_MORE_ENTRIES
)
205 Status
= STATUS_NO_SUCH_DOMAIN
;
209 TRACE("Domain key name: %S\n", DomainKeyName
);
211 Status
= SampRegOpenKey(DomainsKeyHandle
,
215 if (NT_SUCCESS(Status
))
217 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
218 Status
= SampRegQueryValue(DomainKeyHandle
,
221 (PVOID
)&DomainNameString
,
223 if (NT_SUCCESS(Status
))
225 TRACE("Domain name: %S\n", DomainNameString
);
227 RtlInitUnicodeString(&DomainName
,
229 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
231 TRACE("Found it!\n");
234 Status
= SampRegQueryValue(DomainKeyHandle
,
239 if (NT_SUCCESS(Status
))
241 *DomainId
= midl_user_allocate(Length
);
243 SampRegQueryValue(DomainKeyHandle
,
249 Status
= STATUS_SUCCESS
;
255 NtClose(DomainKeyHandle
);
261 NtClose(DomainsKeyHandle
);
269 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
270 IN OUT
unsigned long *EnumerationContext
,
271 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
272 IN ULONG PreferedMaximumLength
,
273 OUT PULONG CountReturned
)
275 PSAM_DB_OBJECT ServerObject
;
276 WCHAR DomainKeyName
[64];
277 HANDLE DomainsKeyHandle
;
278 HANDLE DomainKeyHandle
;
281 ULONG RequiredLength
;
284 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
287 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
288 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
291 /* Validate the server handle */
292 Status
= SampValidateDbObject(ServerHandle
,
294 SAM_SERVER_ENUMERATE_DOMAINS
,
296 if (!NT_SUCCESS(Status
))
299 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
303 if (!NT_SUCCESS(Status
))
306 EnumIndex
= *EnumerationContext
;
312 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
316 if (!NT_SUCCESS(Status
))
319 TRACE("EnumIndex: %lu\n", EnumIndex
);
320 TRACE("Domain key name: %S\n", DomainKeyName
);
322 Status
= SampRegOpenKey(DomainsKeyHandle
,
326 TRACE("SampRegOpenKey returned %08lX\n", Status
);
327 if (NT_SUCCESS(Status
))
330 Status
= SampRegQueryValue(DomainKeyHandle
,
335 TRACE("SampRegQueryValue returned %08lX\n", Status
);
336 if (NT_SUCCESS(Status
))
338 TRACE("Data length: %lu\n", DataLength
);
340 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
343 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
347 NtClose(DomainKeyHandle
);
353 TRACE("EnumCount: %lu\n", EnumCount
);
354 TRACE("RequiredLength: %lu\n", RequiredLength
);
356 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
357 if (EnumBuffer
== NULL
)
359 Status
= STATUS_INSUFFICIENT_RESOURCES
;
363 EnumBuffer
->EntriesRead
= EnumCount
;
364 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
365 if (EnumBuffer
->Buffer
== NULL
)
367 Status
= STATUS_INSUFFICIENT_RESOURCES
;
371 EnumIndex
= *EnumerationContext
;
372 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
374 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
378 if (!NT_SUCCESS(Status
))
381 TRACE("EnumIndex: %lu\n", EnumIndex
);
382 TRACE("Domain key name: %S\n", DomainKeyName
);
384 Status
= SampRegOpenKey(DomainsKeyHandle
,
388 TRACE("SampRegOpenKey returned %08lX\n", Status
);
389 if (NT_SUCCESS(Status
))
392 Status
= SampRegQueryValue(DomainKeyHandle
,
397 TRACE("SampRegQueryValue returned %08lX\n", Status
);
398 if (NT_SUCCESS(Status
))
400 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
401 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
402 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
403 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
404 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
406 NtClose(DomainKeyHandle
);
407 Status
= STATUS_INSUFFICIENT_RESOURCES
;
411 Status
= SampRegQueryValue(DomainKeyHandle
,
414 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
416 TRACE("SampRegQueryValue returned %08lX\n", Status
);
417 if (NT_SUCCESS(Status
))
419 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
423 NtClose(DomainKeyHandle
);
425 if (!NT_SUCCESS(Status
))
430 if (NT_SUCCESS(Status
))
432 *EnumerationContext
+= EnumCount
;
433 *Buffer
= EnumBuffer
;
434 *CountReturned
= EnumCount
;
438 if (!NT_SUCCESS(Status
))
440 *EnumerationContext
= 0;
444 if (EnumBuffer
!= NULL
)
446 if (EnumBuffer
->Buffer
!= NULL
)
448 if (EnumBuffer
->EntriesRead
!= 0)
450 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
452 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
453 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
457 midl_user_free(EnumBuffer
->Buffer
);
460 midl_user_free(EnumBuffer
);
464 NtClose(DomainsKeyHandle
);
472 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
473 IN ACCESS_MASK DesiredAccess
,
474 IN PRPC_SID DomainId
,
475 OUT SAMPR_HANDLE
*DomainHandle
)
477 PSAM_DB_OBJECT ServerObject
;
478 PSAM_DB_OBJECT DomainObject
;
481 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
482 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
484 /* Validate the server handle */
485 Status
= SampValidateDbObject(ServerHandle
,
487 SAM_SERVER_LOOKUP_DOMAIN
,
489 if (!NT_SUCCESS(Status
))
492 /* Validate the Domain SID */
493 if ((DomainId
->Revision
!= SID_REVISION
) ||
494 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
495 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
496 return STATUS_INVALID_PARAMETER
;
498 /* Open the domain object */
499 if ((DomainId
->SubAuthorityCount
== 1) &&
500 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
502 /* Builtin domain object */
503 TRACE("Opening the builtin domain object.\n");
505 Status
= SampOpenDbObject(ServerObject
,
512 else if ((DomainId
->SubAuthorityCount
== 4) &&
513 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
515 /* Account domain object */
516 TRACE("Opening the account domain object.\n");
518 /* FIXME: Check the account domain sub authorities!!! */
520 Status
= SampOpenDbObject(ServerObject
,
529 /* No vaild domain SID */
530 Status
= STATUS_INVALID_PARAMETER
;
533 if (NT_SUCCESS(Status
))
534 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
536 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
543 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
544 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
546 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
547 SAM_DOMAIN_FIXED_DATA FixedData
;
553 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
554 if (InfoBuffer
== NULL
)
555 return STATUS_INSUFFICIENT_RESOURCES
;
557 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
558 Status
= SampGetObjectAttribute(DomainObject
,
563 if (!NT_SUCCESS(Status
))
566 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
567 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
568 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
569 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
570 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
571 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
572 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
574 *Buffer
= InfoBuffer
;
577 if (!NT_SUCCESS(Status
))
579 if (InfoBuffer
!= NULL
)
581 midl_user_free(InfoBuffer
);
590 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
591 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
593 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
594 SAM_DOMAIN_FIXED_DATA FixedData
;
600 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
601 if (InfoBuffer
== NULL
)
602 return STATUS_INSUFFICIENT_RESOURCES
;
604 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
605 Status
= SampGetObjectAttribute(DomainObject
,
610 if (!NT_SUCCESS(Status
))
613 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
614 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
615 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
616 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
617 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
618 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
619 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
621 /* Get the OemInformation string */
622 Status
= SampGetObjectAttributeString(DomainObject
,
624 &InfoBuffer
->General
.OemInformation
);
625 if (!NT_SUCCESS(Status
))
627 TRACE("Status 0x%08lx\n", Status
);
631 /* Get the Name string */
632 Status
= SampGetObjectAttributeString(DomainObject
,
634 &InfoBuffer
->General
.DomainName
);
635 if (!NT_SUCCESS(Status
))
637 TRACE("Status 0x%08lx\n", Status
);
641 /* Get the ReplicaSourceNodeName string */
642 Status
= SampGetObjectAttributeString(DomainObject
,
643 L
"ReplicaSourceNodeName",
644 &InfoBuffer
->General
.ReplicaSourceNodeName
);
645 if (!NT_SUCCESS(Status
))
647 TRACE("Status 0x%08lx\n", Status
);
651 InfoBuffer
->General
.UserCount
= 0; /* FIXME */
652 InfoBuffer
->General
.GroupCount
= 0; /* FIXME */
653 InfoBuffer
->General
.AliasCount
= 0; /* FIXME */
655 *Buffer
= InfoBuffer
;
658 if (!NT_SUCCESS(Status
))
660 if (InfoBuffer
!= NULL
)
662 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
663 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
665 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
666 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
668 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
669 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
671 midl_user_free(InfoBuffer
);
680 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
681 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
683 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
684 SAM_DOMAIN_FIXED_DATA FixedData
;
690 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
691 if (InfoBuffer
== NULL
)
692 return STATUS_INSUFFICIENT_RESOURCES
;
694 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
695 Status
= SampGetObjectAttribute(DomainObject
,
700 if (!NT_SUCCESS(Status
))
703 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
704 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
706 *Buffer
= InfoBuffer
;
709 if (!NT_SUCCESS(Status
))
711 if (InfoBuffer
!= NULL
)
713 midl_user_free(InfoBuffer
);
722 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
723 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
725 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
730 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
731 if (InfoBuffer
== NULL
)
732 return STATUS_INSUFFICIENT_RESOURCES
;
734 /* Get the OemInformation string */
735 Status
= SampGetObjectAttributeString(DomainObject
,
737 &InfoBuffer
->Oem
.OemInformation
);
738 if (!NT_SUCCESS(Status
))
740 TRACE("Status 0x%08lx\n", Status
);
744 *Buffer
= InfoBuffer
;
747 if (!NT_SUCCESS(Status
))
749 if (InfoBuffer
!= NULL
)
751 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
752 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
754 midl_user_free(InfoBuffer
);
763 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
764 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
766 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
771 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
772 if (InfoBuffer
== NULL
)
773 return STATUS_INSUFFICIENT_RESOURCES
;
775 /* Get the Name string */
776 Status
= SampGetObjectAttributeString(DomainObject
,
778 &InfoBuffer
->Name
.DomainName
);
779 if (!NT_SUCCESS(Status
))
781 TRACE("Status 0x%08lx\n", Status
);
785 *Buffer
= InfoBuffer
;
788 if (!NT_SUCCESS(Status
))
790 if (InfoBuffer
!= NULL
)
792 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
793 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
795 midl_user_free(InfoBuffer
);
804 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
805 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
807 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
812 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
813 if (InfoBuffer
== NULL
)
814 return STATUS_INSUFFICIENT_RESOURCES
;
816 /* Get the ReplicaSourceNodeName string */
817 Status
= SampGetObjectAttributeString(DomainObject
,
818 L
"ReplicaSourceNodeName",
819 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
820 if (!NT_SUCCESS(Status
))
822 TRACE("Status 0x%08lx\n", Status
);
826 *Buffer
= InfoBuffer
;
829 if (!NT_SUCCESS(Status
))
831 if (InfoBuffer
!= NULL
)
833 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
834 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
836 midl_user_free(InfoBuffer
);
845 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
846 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
848 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
849 SAM_DOMAIN_FIXED_DATA FixedData
;
855 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
856 if (InfoBuffer
== NULL
)
857 return STATUS_INSUFFICIENT_RESOURCES
;
859 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
860 Status
= SampGetObjectAttribute(DomainObject
,
865 if (!NT_SUCCESS(Status
))
868 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
870 *Buffer
= InfoBuffer
;
873 if (!NT_SUCCESS(Status
))
875 if (InfoBuffer
!= NULL
)
877 midl_user_free(InfoBuffer
);
886 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
887 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
889 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
890 SAM_DOMAIN_FIXED_DATA FixedData
;
896 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
897 if (InfoBuffer
== NULL
)
898 return STATUS_INSUFFICIENT_RESOURCES
;
900 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
901 Status
= SampGetObjectAttribute(DomainObject
,
906 if (!NT_SUCCESS(Status
))
909 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
910 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
911 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
912 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
914 *Buffer
= InfoBuffer
;
917 if (!NT_SUCCESS(Status
))
919 if (InfoBuffer
!= NULL
)
921 midl_user_free(InfoBuffer
);
930 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
931 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
933 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
934 SAM_DOMAIN_FIXED_DATA FixedData
;
940 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
941 if (InfoBuffer
== NULL
)
942 return STATUS_INSUFFICIENT_RESOURCES
;
944 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
945 Status
= SampGetObjectAttribute(DomainObject
,
950 if (!NT_SUCCESS(Status
))
953 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
955 *Buffer
= InfoBuffer
;
958 if (!NT_SUCCESS(Status
))
960 if (InfoBuffer
!= NULL
)
962 midl_user_free(InfoBuffer
);
971 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
972 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
974 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
975 SAM_DOMAIN_FIXED_DATA FixedData
;
981 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
982 if (InfoBuffer
== NULL
)
983 return STATUS_INSUFFICIENT_RESOURCES
;
985 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
986 Status
= SampGetObjectAttribute(DomainObject
,
991 if (!NT_SUCCESS(Status
))
994 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
995 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
996 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
997 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
998 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
999 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1000 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1002 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1003 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1004 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1006 /* Get the OemInformation string */
1007 Status
= SampGetObjectAttributeString(DomainObject
,
1009 &InfoBuffer
->General2
.I1
.OemInformation
);
1010 if (!NT_SUCCESS(Status
))
1012 TRACE("Status 0x%08lx\n", Status
);
1016 /* Get the Name string */
1017 Status
= SampGetObjectAttributeString(DomainObject
,
1019 &InfoBuffer
->General2
.I1
.DomainName
);
1020 if (!NT_SUCCESS(Status
))
1022 TRACE("Status 0x%08lx\n", Status
);
1026 /* Get the ReplicaSourceNodeName string */
1027 Status
= SampGetObjectAttributeString(DomainObject
,
1028 L
"ReplicaSourceNodeName",
1029 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1030 if (!NT_SUCCESS(Status
))
1032 TRACE("Status 0x%08lx\n", Status
);
1036 InfoBuffer
->General2
.I1
.UserCount
= 0; /* FIXME */
1037 InfoBuffer
->General2
.I1
.GroupCount
= 0; /* FIXME */
1038 InfoBuffer
->General2
.I1
.AliasCount
= 0; /* FIXME */
1040 *Buffer
= InfoBuffer
;
1043 if (!NT_SUCCESS(Status
))
1045 if (InfoBuffer
!= NULL
)
1047 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1048 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1050 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1051 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1053 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1054 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1056 midl_user_free(InfoBuffer
);
1065 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1066 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1068 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1069 SAM_DOMAIN_FIXED_DATA FixedData
;
1075 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1076 if (InfoBuffer
== NULL
)
1077 return STATUS_INSUFFICIENT_RESOURCES
;
1079 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1080 Status
= SampGetObjectAttribute(DomainObject
,
1085 if (!NT_SUCCESS(Status
))
1088 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1089 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1090 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1092 *Buffer
= InfoBuffer
;
1095 if (!NT_SUCCESS(Status
))
1097 if (InfoBuffer
!= NULL
)
1099 midl_user_free(InfoBuffer
);
1108 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1109 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1111 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1112 SAM_DOMAIN_FIXED_DATA FixedData
;
1118 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1119 if (InfoBuffer
== NULL
)
1120 return STATUS_INSUFFICIENT_RESOURCES
;
1122 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1123 Status
= SampGetObjectAttribute(DomainObject
,
1128 if (!NT_SUCCESS(Status
))
1131 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1132 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1133 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1134 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1135 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1136 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1138 *Buffer
= InfoBuffer
;
1141 if (!NT_SUCCESS(Status
))
1143 if (InfoBuffer
!= NULL
)
1145 midl_user_free(InfoBuffer
);
1156 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1157 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1158 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1160 PSAM_DB_OBJECT DomainObject
;
1161 ACCESS_MASK DesiredAccess
;
1164 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1165 DomainHandle
, DomainInformationClass
, Buffer
);
1167 switch (DomainInformationClass
)
1169 case DomainPasswordInformation
:
1170 case DomainLockoutInformation
:
1171 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1174 case DomainGeneralInformation
:
1175 case DomainLogoffInformation
:
1176 case DomainOemInformation
:
1177 case DomainNameInformation
:
1178 case DomainReplicationInformation
:
1179 case DomainServerRoleInformation
:
1180 case DomainModifiedInformation
:
1181 case DomainStateInformation
:
1182 case DomainModifiedInformation2
:
1183 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1186 case DomainGeneralInformation2
:
1187 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1188 DOMAIN_READ_OTHER_PARAMETERS
;
1192 return STATUS_INVALID_INFO_CLASS
;
1195 /* Validate the server handle */
1196 Status
= SampValidateDbObject(DomainHandle
,
1200 if (!NT_SUCCESS(Status
))
1203 switch (DomainInformationClass
)
1205 case DomainPasswordInformation
:
1206 Status
= SampQueryDomainPassword(DomainObject
,
1210 case DomainGeneralInformation
:
1211 Status
= SampQueryDomainGeneral(DomainObject
,
1215 case DomainLogoffInformation
:
1216 Status
= SampQueryDomainLogoff(DomainObject
,
1220 case DomainOemInformation
:
1221 Status
= SampQueryDomainOem(DomainObject
,
1225 case DomainNameInformation
:
1226 Status
= SampQueryDomainName(DomainObject
,
1230 case DomainReplicationInformation
:
1231 Status
= SampQueryDomainReplication(DomainObject
,
1235 case DomainServerRoleInformation
:
1236 Status
= SampQueryDomainServerRole(DomainObject
,
1240 case DomainModifiedInformation
:
1241 Status
= SampQueryDomainModified(DomainObject
,
1245 case DomainStateInformation
:
1246 Status
= SampQueryDomainState(DomainObject
,
1250 case DomainGeneralInformation2
:
1251 Status
= SampQueryDomainGeneral2(DomainObject
,
1255 case DomainLockoutInformation
:
1256 Status
= SampQueryDomainLockout(DomainObject
,
1260 case DomainModifiedInformation2
:
1261 Status
= SampQueryDomainModified2(DomainObject
,
1266 Status
= STATUS_NOT_IMPLEMENTED
;
1274 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1275 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1277 SAM_DOMAIN_FIXED_DATA FixedData
;
1281 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1282 Status
= SampGetObjectAttribute(DomainObject
,
1287 if (!NT_SUCCESS(Status
))
1290 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1291 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1292 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1293 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1294 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1295 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1296 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1298 Status
= SampSetObjectAttribute(DomainObject
,
1310 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1311 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1313 SAM_DOMAIN_FIXED_DATA FixedData
;
1317 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1318 Status
= SampGetObjectAttribute(DomainObject
,
1323 if (!NT_SUCCESS(Status
))
1326 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1327 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1329 Status
= SampSetObjectAttribute(DomainObject
,
1341 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1342 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1344 SAM_DOMAIN_FIXED_DATA FixedData
;
1348 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1349 Status
= SampGetObjectAttribute(DomainObject
,
1354 if (!NT_SUCCESS(Status
))
1357 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1359 Status
= SampSetObjectAttribute(DomainObject
,
1371 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1372 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1374 SAM_DOMAIN_FIXED_DATA FixedData
;
1378 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1379 Status
= SampGetObjectAttribute(DomainObject
,
1384 if (!NT_SUCCESS(Status
))
1387 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1389 Status
= SampSetObjectAttribute(DomainObject
,
1401 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1402 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1404 SAM_DOMAIN_FIXED_DATA FixedData
;
1408 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1409 Status
= SampGetObjectAttribute(DomainObject
,
1414 if (!NT_SUCCESS(Status
))
1417 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1418 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1419 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1421 Status
= SampSetObjectAttribute(DomainObject
,
1435 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1436 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1437 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1439 PSAM_DB_OBJECT DomainObject
;
1440 ACCESS_MASK DesiredAccess
;
1443 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1444 DomainHandle
, DomainInformationClass
, DomainInformation
);
1446 switch (DomainInformationClass
)
1448 case DomainPasswordInformation
:
1449 case DomainLockoutInformation
:
1450 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1453 case DomainLogoffInformation
:
1454 case DomainOemInformation
:
1455 case DomainNameInformation
:
1456 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1459 case DomainReplicationInformation
:
1460 case DomainServerRoleInformation
:
1461 case DomainStateInformation
:
1462 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1466 return STATUS_INVALID_INFO_CLASS
;
1469 /* Validate the server handle */
1470 Status
= SampValidateDbObject(DomainHandle
,
1474 if (!NT_SUCCESS(Status
))
1477 switch (DomainInformationClass
)
1479 case DomainPasswordInformation
:
1480 Status
= SampSetDomainPassword(DomainObject
,
1484 case DomainLogoffInformation
:
1485 Status
= SampSetDomainLogoff(DomainObject
,
1489 case DomainOemInformation
:
1490 Status
= SampSetObjectAttribute(DomainObject
,
1493 DomainInformation
->Oem
.OemInformation
.Buffer
,
1494 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1497 case DomainNameInformation
:
1498 Status
= SampSetObjectAttribute(DomainObject
,
1501 DomainInformation
->Name
.DomainName
.Buffer
,
1502 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1505 case DomainReplicationInformation
:
1506 Status
= SampSetObjectAttribute(DomainObject
,
1507 L
"ReplicaSourceNodeName",
1509 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1510 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1513 case DomainServerRoleInformation
:
1514 Status
= SampSetDomainServerRole(DomainObject
,
1518 case DomainStateInformation
:
1519 Status
= SampSetDomainState(DomainObject
,
1523 case DomainLockoutInformation
:
1524 Status
= SampSetDomainLockout(DomainObject
,
1529 Status
= STATUS_NOT_IMPLEMENTED
;
1538 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1539 IN PRPC_UNICODE_STRING Name
,
1540 IN ACCESS_MASK DesiredAccess
,
1541 OUT SAMPR_HANDLE
*GroupHandle
,
1542 OUT
unsigned long *RelativeId
)
1544 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1545 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1546 SAM_GROUP_FIXED_DATA FixedGroupData
;
1547 PSAM_DB_OBJECT DomainObject
;
1548 PSAM_DB_OBJECT GroupObject
;
1554 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1555 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1557 /* Validate the domain handle */
1558 Status
= SampValidateDbObject(DomainHandle
,
1560 DOMAIN_CREATE_GROUP
,
1562 if (!NT_SUCCESS(Status
))
1564 TRACE("failed with status 0x%08lx\n", Status
);
1568 /* Get the fixed domain attributes */
1569 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1570 Status
= SampGetObjectAttribute(DomainObject
,
1573 (PVOID
)&FixedDomainData
,
1575 if (!NT_SUCCESS(Status
))
1577 TRACE("failed with status 0x%08lx\n", Status
);
1581 /* Increment the NextRid attribute */
1582 ulRid
= FixedDomainData
.NextRid
;
1583 FixedDomainData
.NextRid
++;
1585 /* Store the fixed domain attributes */
1586 Status
= SampSetObjectAttribute(DomainObject
,
1591 if (!NT_SUCCESS(Status
))
1593 TRACE("failed with status 0x%08lx\n", Status
);
1597 TRACE("RID: %lx\n", ulRid
);
1599 /* Convert the RID into a string (hex) */
1600 swprintf(szRid
, L
"%08lX", ulRid
);
1602 /* FIXME: Check whether the group name is already in use */
1604 /* Create the group object */
1605 Status
= SampCreateDbObject(DomainObject
,
1611 if (!NT_SUCCESS(Status
))
1613 TRACE("failed with status 0x%08lx\n", Status
);
1617 /* Add the name alias for the user object */
1618 Status
= SampSetDbObjectNameAlias(DomainObject
,
1622 if (!NT_SUCCESS(Status
))
1624 TRACE("failed with status 0x%08lx\n", Status
);
1628 /* Initialize fixed user data */
1629 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1630 FixedGroupData
.Version
= 1;
1632 FixedGroupData
.GroupId
= ulRid
;
1634 /* Set fixed user data attribute */
1635 Status
= SampSetObjectAttribute(GroupObject
,
1638 (LPVOID
)&FixedGroupData
,
1639 sizeof(SAM_GROUP_FIXED_DATA
));
1640 if (!NT_SUCCESS(Status
))
1642 TRACE("failed with status 0x%08lx\n", Status
);
1646 /* Set the Name attribute */
1647 Status
= SampSetObjectAttribute(GroupObject
,
1650 (LPVOID
)Name
->Buffer
,
1651 Name
->MaximumLength
);
1652 if (!NT_SUCCESS(Status
))
1654 TRACE("failed with status 0x%08lx\n", Status
);
1658 /* Set the AdminComment attribute */
1659 Status
= SampSetObjectAttribute(GroupObject
,
1663 EmptyString
.MaximumLength
);
1664 if (!NT_SUCCESS(Status
))
1666 TRACE("failed with status 0x%08lx\n", Status
);
1670 if (NT_SUCCESS(Status
))
1672 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1673 *RelativeId
= ulRid
;
1676 TRACE("returns with status 0x%08lx\n", Status
);
1685 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1686 IN OUT
unsigned long *EnumerationContext
,
1687 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1688 IN
unsigned long PreferedMaximumLength
,
1689 OUT
unsigned long *CountReturned
)
1692 return STATUS_NOT_IMPLEMENTED
;
1699 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
1700 IN PRPC_UNICODE_STRING Name
,
1701 IN ACCESS_MASK DesiredAccess
,
1702 OUT SAMPR_HANDLE
*UserHandle
,
1703 OUT
unsigned long *RelativeId
)
1705 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1706 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1707 SAM_USER_FIXED_DATA FixedUserData
;
1708 PSAM_DB_OBJECT DomainObject
;
1709 PSAM_DB_OBJECT UserObject
;
1713 BOOL bAliasExists
= FALSE
;
1716 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
1717 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
1719 /* Validate the domain handle */
1720 Status
= SampValidateDbObject(DomainHandle
,
1724 if (!NT_SUCCESS(Status
))
1726 TRACE("failed with status 0x%08lx\n", Status
);
1730 /* Get the fixed domain attributes */
1731 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1732 Status
= SampGetObjectAttribute(DomainObject
,
1735 (PVOID
)&FixedDomainData
,
1737 if (!NT_SUCCESS(Status
))
1739 TRACE("failed with status 0x%08lx\n", Status
);
1743 /* Increment the NextRid attribute */
1744 ulRid
= FixedDomainData
.NextRid
;
1745 FixedDomainData
.NextRid
++;
1747 /* Store the fixed domain attributes */
1748 Status
= SampSetObjectAttribute(DomainObject
,
1753 if (!NT_SUCCESS(Status
))
1755 TRACE("failed with status 0x%08lx\n", Status
);
1759 TRACE("RID: %lx\n", ulRid
);
1761 /* Convert the RID into a string (hex) */
1762 swprintf(szRid
, L
"%08lX", ulRid
);
1764 /* Check whether the user name is already in use */
1765 Status
= SampCheckDbObjectNameAlias(DomainObject
,
1769 if (!NT_SUCCESS(Status
))
1771 TRACE("failed with status 0x%08lx\n", Status
);
1777 TRACE("The user account %S already exists!\n", Name
->Buffer
);
1778 return STATUS_USER_EXISTS
;
1781 /* Create the user object */
1782 Status
= SampCreateDbObject(DomainObject
,
1788 if (!NT_SUCCESS(Status
))
1790 TRACE("failed with status 0x%08lx\n", Status
);
1794 /* Add the name alias for the user object */
1795 Status
= SampSetDbObjectNameAlias(DomainObject
,
1799 if (!NT_SUCCESS(Status
))
1801 TRACE("failed with status 0x%08lx\n", Status
);
1805 /* Initialize fixed user data */
1806 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
1807 FixedUserData
.Version
= 1;
1809 FixedUserData
.UserId
= ulRid
;
1811 /* Set fixed user data attribute */
1812 Status
= SampSetObjectAttribute(UserObject
,
1815 (LPVOID
)&FixedUserData
,
1816 sizeof(SAM_USER_FIXED_DATA
));
1817 if (!NT_SUCCESS(Status
))
1819 TRACE("failed with status 0x%08lx\n", Status
);
1823 /* Set the Name attribute */
1824 Status
= SampSetObjectAttribute(UserObject
,
1827 (LPVOID
)Name
->Buffer
,
1828 Name
->MaximumLength
);
1829 if (!NT_SUCCESS(Status
))
1831 TRACE("failed with status 0x%08lx\n", Status
);
1835 /* Set the FullName attribute */
1836 Status
= SampSetObjectAttribute(UserObject
,
1840 EmptyString
.MaximumLength
);
1841 if (!NT_SUCCESS(Status
))
1843 TRACE("failed with status 0x%08lx\n", Status
);
1847 /* Set the HomeDirectory attribute */
1848 Status
= SampSetObjectAttribute(UserObject
,
1852 EmptyString
.MaximumLength
);
1853 if (!NT_SUCCESS(Status
))
1855 TRACE("failed with status 0x%08lx\n", Status
);
1859 /* Set the HomeDirectoryDrive attribute */
1860 Status
= SampSetObjectAttribute(UserObject
,
1861 L
"HomeDirectoryDrive",
1864 EmptyString
.MaximumLength
);
1865 if (!NT_SUCCESS(Status
))
1867 TRACE("failed with status 0x%08lx\n", Status
);
1871 /* Set the ScriptPath attribute */
1872 Status
= SampSetObjectAttribute(UserObject
,
1876 EmptyString
.MaximumLength
);
1877 if (!NT_SUCCESS(Status
))
1879 TRACE("failed with status 0x%08lx\n", Status
);
1883 /* Set the ProfilePath attribute */
1884 Status
= SampSetObjectAttribute(UserObject
,
1888 EmptyString
.MaximumLength
);
1889 if (!NT_SUCCESS(Status
))
1891 TRACE("failed with status 0x%08lx\n", Status
);
1895 /* Set the AdminComment attribute */
1896 Status
= SampSetObjectAttribute(UserObject
,
1900 EmptyString
.MaximumLength
);
1901 if (!NT_SUCCESS(Status
))
1903 TRACE("failed with status 0x%08lx\n", Status
);
1907 /* Set the UserComment attribute */
1908 Status
= SampSetObjectAttribute(UserObject
,
1912 EmptyString
.MaximumLength
);
1913 if (!NT_SUCCESS(Status
))
1915 TRACE("failed with status 0x%08lx\n", Status
);
1919 /* Set the WorkStations attribute */
1920 Status
= SampSetObjectAttribute(UserObject
,
1924 EmptyString
.MaximumLength
);
1925 if (!NT_SUCCESS(Status
))
1927 TRACE("failed with status 0x%08lx\n", Status
);
1931 /* FIXME: Set default user attributes */
1933 if (NT_SUCCESS(Status
))
1935 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
1936 *RelativeId
= ulRid
;
1939 TRACE("returns with status 0x%08lx\n", Status
);
1948 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
1949 IN OUT
unsigned long *EnumerationContext
,
1950 IN
unsigned long UserAccountControl
,
1951 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1952 IN
unsigned long PreferedMaximumLength
,
1953 OUT
unsigned long *CountReturned
)
1956 return STATUS_NOT_IMPLEMENTED
;
1963 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
1964 IN PRPC_UNICODE_STRING AccountName
,
1965 IN ACCESS_MASK DesiredAccess
,
1966 OUT SAMPR_HANDLE
*AliasHandle
,
1967 OUT
unsigned long *RelativeId
)
1969 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1970 PSAM_DB_OBJECT DomainObject
;
1971 PSAM_DB_OBJECT AliasObject
;
1972 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1976 BOOL bAliasExists
= FALSE
;
1979 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
1980 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
1982 /* Validate the domain handle */
1983 Status
= SampValidateDbObject(DomainHandle
,
1985 DOMAIN_CREATE_ALIAS
,
1987 if (!NT_SUCCESS(Status
))
1989 TRACE("failed with status 0x%08lx\n", Status
);
1993 /* Get the fixed domain attributes */
1994 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1995 Status
= SampGetObjectAttribute(DomainObject
,
1998 (PVOID
)&FixedDomainData
,
2000 if (!NT_SUCCESS(Status
))
2002 TRACE("failed with status 0x%08lx\n", Status
);
2006 /* Increment the NextRid attribute */
2007 ulRid
= FixedDomainData
.NextRid
;
2008 FixedDomainData
.NextRid
++;
2010 /* Store the fixed domain attributes */
2011 Status
= SampSetObjectAttribute(DomainObject
,
2016 if (!NT_SUCCESS(Status
))
2018 TRACE("failed with status 0x%08lx\n", Status
);
2022 TRACE("RID: %lx\n", ulRid
);
2024 /* Convert the RID into a string (hex) */
2025 swprintf(szRid
, L
"%08lX", ulRid
);
2027 /* Check whether the user name is already in use */
2028 Status
= SampCheckDbObjectNameAlias(DomainObject
,
2030 AccountName
->Buffer
,
2032 if (!NT_SUCCESS(Status
))
2034 TRACE("failed with status 0x%08lx\n", Status
);
2040 TRACE("The alias account %S already exists!\n", AccountName
->Buffer
);
2041 return STATUS_ALIAS_EXISTS
;
2044 /* Create the alias object */
2045 Status
= SampCreateDbObject(DomainObject
,
2051 if (!NT_SUCCESS(Status
))
2053 TRACE("failed with status 0x%08lx\n", Status
);
2057 /* Add the name alias for the user object */
2058 Status
= SampSetDbObjectNameAlias(DomainObject
,
2060 AccountName
->Buffer
,
2062 if (!NT_SUCCESS(Status
))
2064 TRACE("failed with status 0x%08lx\n", Status
);
2068 /* Set the Name attribute */
2069 Status
= SampSetObjectAttribute(AliasObject
,
2072 (LPVOID
)AccountName
->Buffer
,
2073 AccountName
->MaximumLength
);
2074 if (!NT_SUCCESS(Status
))
2076 TRACE("failed with status 0x%08lx\n", Status
);
2080 /* Set the Description attribute */
2081 Status
= SampSetObjectAttribute(AliasObject
,
2085 EmptyString
.MaximumLength
);
2086 if (!NT_SUCCESS(Status
))
2088 TRACE("failed with status 0x%08lx\n", Status
);
2092 if (NT_SUCCESS(Status
))
2094 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2095 *RelativeId
= ulRid
;
2098 TRACE("returns with status 0x%08lx\n", Status
);
2106 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2107 IN OUT
unsigned long *EnumerationContext
,
2108 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2109 IN
unsigned long PreferedMaximumLength
,
2110 OUT
unsigned long *CountReturned
)
2112 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2113 PSAM_DB_OBJECT DomainObject
;
2114 HANDLE AliasesKeyHandle
;
2115 WCHAR AliasKeyName
[64];
2116 HANDLE AliasKeyHandle
;
2119 ULONG RequiredLength
;
2122 BOOLEAN MoreEntries
= FALSE
;
2125 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2126 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
2129 /* Validate the domain handle */
2130 Status
= SampValidateDbObject(DomainHandle
,
2132 DOMAIN_LIST_ACCOUNTS
,
2134 if (!NT_SUCCESS(Status
))
2137 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2141 if (!NT_SUCCESS(Status
))
2146 EnumIndex
= *EnumerationContext
;
2152 Status
= SampRegEnumerateSubKey(AliasesKeyHandle
,
2156 if (!NT_SUCCESS(Status
))
2158 if (Status
== STATUS_NO_MORE_ENTRIES
)
2159 Status
= STATUS_SUCCESS
;
2163 TRACE("EnumIndex: %lu\n", EnumIndex
);
2164 TRACE("Alias key name: %S\n", AliasKeyName
);
2166 Status
= SampRegOpenKey(AliasesKeyHandle
,
2170 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2171 if (NT_SUCCESS(Status
))
2174 Status
= SampRegQueryValue(AliasKeyHandle
,
2180 NtClose(AliasKeyHandle
);
2182 TRACE("SampRegQueryValue returned %08lX\n", Status
);
2184 if (NT_SUCCESS(Status
))
2186 TRACE("Data length: %lu\n", DataLength
);
2188 if ((RequiredLength
+ DataLength
+ sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2194 RequiredLength
+= (DataLength
+ sizeof(SAMPR_RID_ENUMERATION
));
2202 TRACE("EnumCount: %lu\n", EnumCount
);
2203 TRACE("RequiredLength: %lu\n", RequiredLength
);
2205 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2206 if (EnumBuffer
== NULL
)
2208 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2212 EnumBuffer
->EntriesRead
= EnumCount
;
2216 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2217 if (EnumBuffer
->Buffer
== NULL
)
2219 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2225 EnumIndex
= *EnumerationContext
;
2226 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2228 Status
= SampRegEnumerateSubKey(AliasesKeyHandle
,
2232 if (!NT_SUCCESS(Status
))
2234 if (Status
== STATUS_NO_MORE_ENTRIES
)
2235 Status
= STATUS_SUCCESS
;
2239 TRACE("EnumIndex: %lu\n", EnumIndex
);
2240 TRACE("Alias key name: %S\n", AliasKeyName
);
2242 Status
= SampRegOpenKey(AliasesKeyHandle
,
2246 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2247 if (NT_SUCCESS(Status
))
2250 Status
= SampRegQueryValue(AliasKeyHandle
,
2255 TRACE("SampRegQueryValue returned %08lX\n", Status
);
2256 if (NT_SUCCESS(Status
))
2258 EnumBuffer
->Buffer
[i
].RelativeId
= wcstoul(AliasKeyName
, NULL
, 16);
2260 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
2261 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
2262 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
2263 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2265 NtClose(AliasKeyHandle
);
2266 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2270 Status
= SampRegQueryValue(AliasKeyHandle
,
2273 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2275 TRACE("SampRegQueryValue returned %08lX\n", Status
);
2276 if (NT_SUCCESS(Status
))
2278 TRACE("Alias name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2282 NtClose(AliasKeyHandle
);
2284 if (!NT_SUCCESS(Status
))
2290 if (NT_SUCCESS(Status
))
2292 *EnumerationContext
+= EnumCount
;
2293 *Buffer
= EnumBuffer
;
2294 *CountReturned
= EnumCount
;
2297 if (!NT_SUCCESS(Status
))
2299 *EnumerationContext
= 0;
2303 if (EnumBuffer
!= NULL
)
2305 if (EnumBuffer
->Buffer
!= NULL
)
2307 if (EnumBuffer
->EntriesRead
!= 0)
2309 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2311 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2312 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2316 midl_user_free(EnumBuffer
->Buffer
);
2319 midl_user_free(EnumBuffer
);
2323 NtClose(AliasesKeyHandle
);
2325 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2326 Status
= STATUS_MORE_ENTRIES
;
2334 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2335 IN PSAMPR_PSID_ARRAY SidArray
,
2336 OUT PSAMPR_ULONG_ARRAY Membership
)
2338 PSAM_DB_OBJECT DomainObject
;
2339 HANDLE AliasesKeyHandle
= NULL
;
2340 HANDLE MembersKeyHandle
= NULL
;
2341 HANDLE MemberKeyHandle
= NULL
;
2342 LPWSTR MemberSidString
= NULL
;
2343 PULONG RidArray
= NULL
;
2344 ULONG MaxSidCount
= 0;
2350 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2351 DomainHandle
, SidArray
, Membership
);
2353 /* Validate the domain handle */
2354 Status
= SampValidateDbObject(DomainHandle
,
2358 if (!NT_SUCCESS(Status
))
2361 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2365 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2366 if (!NT_SUCCESS(Status
))
2369 Status
= SampRegOpenKey(AliasesKeyHandle
,
2373 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2374 if (!NT_SUCCESS(Status
))
2377 for (i
= 0; i
< SidArray
->Count
; i
++)
2379 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2380 TRACE("Open %S\n", MemberSidString
);
2382 Status
= SampRegOpenKey(MembersKeyHandle
,
2386 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2387 if (NT_SUCCESS(Status
))
2389 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2392 if (NT_SUCCESS(Status
))
2394 TRACE("Found %lu values\n", ValueCount
);
2395 MaxSidCount
+= ValueCount
;
2399 NtClose(MemberKeyHandle
);
2402 LocalFree(MemberSidString
);
2405 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
2406 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
2407 if (RidArray
== NULL
)
2409 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2413 for (i
= 0; i
< SidArray
->Count
; i
++)
2415 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2416 TRACE("Open %S\n", MemberSidString
);
2418 Status
= SampRegOpenKey(MembersKeyHandle
,
2422 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2423 if (NT_SUCCESS(Status
))
2425 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2428 if (NT_SUCCESS(Status
))
2430 TRACE("Found %lu values\n", ValueCount
);
2432 for (j
= 0; j
< ValueCount
; j
++)
2434 DataLength
= sizeof(ULONG
);
2435 Status
= SampRegEnumerateValue(MemberKeyHandle
,
2440 (PVOID
)&RidArray
[j
],
2445 NtClose(MemberKeyHandle
);
2448 LocalFree(MemberSidString
);
2453 if (NT_SUCCESS(Status
))
2455 Membership
->Count
= MaxSidCount
;
2456 Membership
->Element
= RidArray
;
2460 if (RidArray
!= NULL
)
2461 midl_user_free(RidArray
);
2464 if (MembersKeyHandle
!= NULL
)
2465 NtClose(MembersKeyHandle
);
2467 if (MembersKeyHandle
!= NULL
)
2468 NtClose(MembersKeyHandle
);
2470 if (AliasesKeyHandle
!= NULL
)
2471 NtClose(AliasesKeyHandle
);
2480 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
2481 IN
unsigned long Count
,
2482 IN RPC_UNICODE_STRING Names
[],
2483 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
2484 OUT PSAMPR_ULONG_ARRAY Use
)
2487 return STATUS_NOT_IMPLEMENTED
;
2493 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
2494 IN
unsigned long Count
,
2495 IN
unsigned long *RelativeIds
,
2496 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
2497 OUT PSAMPR_ULONG_ARRAY Use
)
2500 return STATUS_NOT_IMPLEMENTED
;
2507 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
2508 IN ACCESS_MASK DesiredAccess
,
2509 IN
unsigned long GroupId
,
2510 OUT SAMPR_HANDLE
*GroupHandle
)
2512 PSAM_DB_OBJECT DomainObject
;
2513 PSAM_DB_OBJECT GroupObject
;
2517 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
2518 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
2520 /* Validate the domain handle */
2521 Status
= SampValidateDbObject(DomainHandle
,
2525 if (!NT_SUCCESS(Status
))
2527 TRACE("failed with status 0x%08lx\n", Status
);
2531 /* Convert the RID into a string (hex) */
2532 swprintf(szRid
, L
"%08lX", GroupId
);
2534 /* Create the group object */
2535 Status
= SampOpenDbObject(DomainObject
,
2541 if (!NT_SUCCESS(Status
))
2543 TRACE("failed with status 0x%08lx\n", Status
);
2547 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
2549 return STATUS_SUCCESS
;
2556 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
2557 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
2558 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
2561 return STATUS_NOT_IMPLEMENTED
;
2567 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
2568 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
2569 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
2572 return STATUS_NOT_IMPLEMENTED
;
2578 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
2579 IN
unsigned long MemberId
,
2580 IN
unsigned long Attributes
)
2583 return STATUS_NOT_IMPLEMENTED
;
2589 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
2592 return STATUS_NOT_IMPLEMENTED
;
2598 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
2599 IN
unsigned long MemberId
)
2602 return STATUS_NOT_IMPLEMENTED
;
2608 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
2609 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
2612 return STATUS_NOT_IMPLEMENTED
;
2618 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
2619 IN
unsigned long MemberId
,
2620 IN
unsigned long Attributes
)
2623 return STATUS_NOT_IMPLEMENTED
;
2629 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
2630 IN ACCESS_MASK DesiredAccess
,
2632 OUT SAMPR_HANDLE
*AliasHandle
)
2634 PSAM_DB_OBJECT DomainObject
;
2635 PSAM_DB_OBJECT AliasObject
;
2639 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
2640 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
2642 /* Validate the domain handle */
2643 Status
= SampValidateDbObject(DomainHandle
,
2647 if (!NT_SUCCESS(Status
))
2649 TRACE("failed with status 0x%08lx\n", Status
);
2653 /* Convert the RID into a string (hex) */
2654 swprintf(szRid
, L
"%08lX", AliasId
);
2656 /* Create the alias object */
2657 Status
= SampOpenDbObject(DomainObject
,
2663 if (!NT_SUCCESS(Status
))
2665 TRACE("failed with status 0x%08lx\n", Status
);
2669 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2671 return STATUS_SUCCESS
;
2676 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
2677 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
2679 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
2680 HANDLE MembersKeyHandle
= NULL
;
2685 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
2686 if (InfoBuffer
== NULL
)
2687 return STATUS_INSUFFICIENT_RESOURCES
;
2689 Status
= SampGetObjectAttributeString(AliasObject
,
2691 &InfoBuffer
->General
.Name
);
2692 if (!NT_SUCCESS(Status
))
2694 TRACE("Status 0x%08lx\n", Status
);
2698 Status
= SampGetObjectAttributeString(AliasObject
,
2700 &InfoBuffer
->General
.AdminComment
);
2701 if (!NT_SUCCESS(Status
))
2703 TRACE("Status 0x%08lx\n", Status
);
2707 /* Open the Members subkey */
2708 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
2712 if (!NT_SUCCESS(Status
))
2714 TRACE("Status 0x%08lx\n", Status
);
2718 /* Retrieve the number of members of the alias */
2719 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
2721 &InfoBuffer
->General
.MemberCount
);
2722 if (!NT_SUCCESS(Status
))
2724 TRACE("Status 0x%08lx\n", Status
);
2728 *Buffer
= InfoBuffer
;
2731 if (MembersKeyHandle
!= NULL
)
2732 SampRegCloseKey(MembersKeyHandle
);
2734 if (!NT_SUCCESS(Status
))
2736 if (InfoBuffer
!= NULL
)
2738 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
2739 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
2741 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
2742 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
2744 midl_user_free(InfoBuffer
);
2753 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
2754 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
2756 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
2761 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
2762 if (InfoBuffer
== NULL
)
2763 return STATUS_INSUFFICIENT_RESOURCES
;
2765 Status
= SampGetObjectAttributeString(AliasObject
,
2767 &InfoBuffer
->Name
.Name
);
2768 if (!NT_SUCCESS(Status
))
2770 TRACE("Status 0x%08lx\n", Status
);
2774 *Buffer
= InfoBuffer
;
2777 if (!NT_SUCCESS(Status
))
2779 if (InfoBuffer
!= NULL
)
2781 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
2782 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
2784 midl_user_free(InfoBuffer
);
2793 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
2794 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
2796 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
2801 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
2802 if (InfoBuffer
== NULL
)
2803 return STATUS_INSUFFICIENT_RESOURCES
;
2805 Status
= SampGetObjectAttributeString(AliasObject
,
2807 &InfoBuffer
->AdminComment
.AdminComment
);
2808 if (!NT_SUCCESS(Status
))
2810 TRACE("Status 0x%08lx\n", Status
);
2814 *Buffer
= InfoBuffer
;
2817 if (!NT_SUCCESS(Status
))
2819 if (InfoBuffer
!= NULL
)
2821 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
2822 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
2824 midl_user_free(InfoBuffer
);
2835 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
2836 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
2837 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
2839 PSAM_DB_OBJECT AliasObject
;
2842 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
2843 AliasHandle
, AliasInformationClass
, Buffer
);
2845 /* Validate the alias handle */
2846 Status
= SampValidateDbObject(AliasHandle
,
2848 ALIAS_READ_INFORMATION
,
2850 if (!NT_SUCCESS(Status
))
2853 switch (AliasInformationClass
)
2855 case AliasGeneralInformation
:
2856 Status
= SampQueryAliasGeneral(AliasObject
,
2860 case AliasNameInformation
:
2861 Status
= SampQueryAliasName(AliasObject
,
2865 case AliasAdminCommentInformation
:
2866 Status
= SampQueryAliasAdminComment(AliasObject
,
2871 Status
= STATUS_INVALID_INFO_CLASS
;
2881 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
2882 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
2883 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
2885 PSAM_DB_OBJECT AliasObject
;
2888 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
2889 AliasHandle
, AliasInformationClass
, Buffer
);
2891 /* Validate the alias handle */
2892 Status
= SampValidateDbObject(AliasHandle
,
2894 ALIAS_WRITE_ACCOUNT
,
2896 if (!NT_SUCCESS(Status
))
2899 switch (AliasInformationClass
)
2901 case AliasNameInformation
:
2902 Status
= SampSetObjectAttribute(AliasObject
,
2905 Buffer
->Name
.Name
.Buffer
,
2906 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
2909 case AliasAdminCommentInformation
:
2910 Status
= SampSetObjectAttribute(AliasObject
,
2913 Buffer
->AdminComment
.AdminComment
.Buffer
,
2914 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
2918 Status
= STATUS_INVALID_INFO_CLASS
;
2928 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
2931 return STATUS_NOT_IMPLEMENTED
;
2937 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
2938 IN PRPC_SID MemberId
)
2940 PSAM_DB_OBJECT AliasObject
;
2941 LPWSTR MemberIdString
= NULL
;
2942 HANDLE MembersKeyHandle
= NULL
;
2943 HANDLE MemberKeyHandle
= NULL
;
2944 ULONG MemberIdLength
;
2947 TRACE("SamrAddMemberToAlias(%p %p)\n",
2948 AliasHandle
, MemberId
);
2950 /* Validate the alias handle */
2951 Status
= SampValidateDbObject(AliasHandle
,
2955 if (!NT_SUCCESS(Status
))
2957 TRACE("failed with status 0x%08lx\n", Status
);
2961 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
2962 TRACE("Member SID: %S\n", MemberIdString
);
2964 MemberIdLength
= RtlLengthSid(MemberId
);
2966 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
2970 if (!NT_SUCCESS(Status
))
2972 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
2976 Status
= SampRegSetValue(MembersKeyHandle
,
2981 if (!NT_SUCCESS(Status
))
2983 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
2987 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
2991 if (!NT_SUCCESS(Status
))
2993 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
2997 Status
= SampRegSetValue(MemberKeyHandle
,
3002 if (!NT_SUCCESS(Status
))
3004 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
3009 if (MemberKeyHandle
!= NULL
)
3010 SampRegCloseKey(MemberKeyHandle
);
3012 if (MembersKeyHandle
!= NULL
)
3013 SampRegCloseKey(MembersKeyHandle
);
3015 if (MemberIdString
!= NULL
)
3016 LocalFree(MemberIdString
);
3024 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
3025 IN PRPC_SID MemberId
)
3028 return STATUS_NOT_IMPLEMENTED
;
3034 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
3035 OUT PSAMPR_PSID_ARRAY_OUT Members
)
3037 PSAM_DB_OBJECT AliasObject
;
3038 HANDLE MembersKeyHandle
= NULL
;
3039 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
3040 ULONG ValueCount
= 0;
3045 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
3046 AliasHandle
, Members
);
3048 /* Validate the alias handle */
3049 Status
= SampValidateDbObject(AliasHandle
,
3053 if (!NT_SUCCESS(Status
))
3055 ERR("failed with status 0x%08lx\n", Status
);
3059 /* Open the members key of the alias objct */
3060 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
3064 if (!NT_SUCCESS(Status
))
3066 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
3070 /* Get the number of members */
3071 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3074 if (!NT_SUCCESS(Status
))
3076 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
3080 /* Allocate the member array */
3081 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
3082 if (MemberArray
== NULL
)
3084 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3088 /* Enumerate the members */
3092 /* Get the size of the next SID */
3094 Status
= SampRegEnumerateValue(MembersKeyHandle
,
3101 if (!NT_SUCCESS(Status
))
3103 if (Status
== STATUS_NO_MORE_ENTRIES
)
3104 Status
= STATUS_SUCCESS
;
3108 /* Allocate a buffer for the SID */
3109 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
3110 if (MemberArray
[Index
].SidPointer
== NULL
)
3112 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3116 /* Read the SID into the buffer */
3117 Status
= SampRegEnumerateValue(MembersKeyHandle
,
3122 (PVOID
)MemberArray
[Index
].SidPointer
,
3124 if (!NT_SUCCESS(Status
))
3132 /* Return the number of members and the member array */
3133 if (NT_SUCCESS(Status
))
3135 Members
->Count
= ValueCount
;
3136 Members
->Sids
= MemberArray
;
3140 /* Clean up the members array and the SID buffers if something failed */
3141 if (!NT_SUCCESS(Status
))
3143 if (MemberArray
!= NULL
)
3145 for (Index
= 0; Index
< ValueCount
; Index
++)
3147 if (MemberArray
[Index
].SidPointer
!= NULL
)
3148 midl_user_free(MemberArray
[Index
].SidPointer
);
3151 midl_user_free(MemberArray
);
3155 /* Close the members key */
3156 if (MembersKeyHandle
!= NULL
)
3157 SampRegCloseKey(MembersKeyHandle
);
3165 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
3166 IN ACCESS_MASK DesiredAccess
,
3167 IN
unsigned long UserId
,
3168 OUT SAMPR_HANDLE
*UserHandle
)
3170 PSAM_DB_OBJECT DomainObject
;
3171 PSAM_DB_OBJECT UserObject
;
3175 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
3176 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
3178 /* Validate the domain handle */
3179 Status
= SampValidateDbObject(DomainHandle
,
3183 if (!NT_SUCCESS(Status
))
3185 TRACE("failed with status 0x%08lx\n", Status
);
3189 /* Convert the RID into a string (hex) */
3190 swprintf(szRid
, L
"%08lX", UserId
);
3192 /* Create the user object */
3193 Status
= SampOpenDbObject(DomainObject
,
3199 if (!NT_SUCCESS(Status
))
3201 TRACE("failed with status 0x%08lx\n", Status
);
3205 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
3207 return STATUS_SUCCESS
;
3213 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
3216 return STATUS_NOT_IMPLEMENTED
;
3222 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
3223 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3225 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3226 SAM_USER_FIXED_DATA FixedData
;
3232 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3233 if (InfoBuffer
== NULL
)
3234 return STATUS_INSUFFICIENT_RESOURCES
;
3236 Length
= sizeof(SAM_USER_FIXED_DATA
);
3237 Status
= SampGetObjectAttribute(UserObject
,
3242 if (!NT_SUCCESS(Status
))
3245 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
3247 /* Get the Name string */
3248 Status
= SampGetObjectAttributeString(UserObject
,
3250 &InfoBuffer
->General
.UserName
);
3251 if (!NT_SUCCESS(Status
))
3253 TRACE("Status 0x%08lx\n", Status
);
3257 /* Get the FullName string */
3258 Status
= SampGetObjectAttributeString(UserObject
,
3260 &InfoBuffer
->General
.FullName
);
3261 if (!NT_SUCCESS(Status
))
3263 TRACE("Status 0x%08lx\n", Status
);
3267 /* Get the AdminComment string */
3268 Status
= SampGetObjectAttributeString(UserObject
,
3270 &InfoBuffer
->General
.AdminComment
);
3271 if (!NT_SUCCESS(Status
))
3273 TRACE("Status 0x%08lx\n", Status
);
3277 /* Get the UserComment string */
3278 Status
= SampGetObjectAttributeString(UserObject
,
3280 &InfoBuffer
->General
.UserComment
);
3281 if (!NT_SUCCESS(Status
))
3283 TRACE("Status 0x%08lx\n", Status
);
3287 *Buffer
= InfoBuffer
;
3290 if (!NT_SUCCESS(Status
))
3292 if (InfoBuffer
!= NULL
)
3294 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
3295 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
3297 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
3298 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
3300 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3301 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3303 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
3304 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
3306 midl_user_free(InfoBuffer
);
3316 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
3317 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3319 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3320 SAM_USER_FIXED_DATA FixedData
;
3326 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3327 if (InfoBuffer
== NULL
)
3328 return STATUS_INSUFFICIENT_RESOURCES
;
3330 Length
= sizeof(SAM_USER_FIXED_DATA
);
3331 Status
= SampGetObjectAttribute(UserObject
,
3336 if (!NT_SUCCESS(Status
))
3339 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
3340 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
3342 /* Get the UserComment string */
3343 Status
= SampGetObjectAttributeString(UserObject
,
3345 &InfoBuffer
->Preferences
.UserComment
);
3346 if (!NT_SUCCESS(Status
))
3348 TRACE("Status 0x%08lx\n", Status
);
3352 *Buffer
= InfoBuffer
;
3355 if (!NT_SUCCESS(Status
))
3357 if (InfoBuffer
!= NULL
)
3359 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
3360 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
3362 midl_user_free(InfoBuffer
);
3372 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
3373 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3375 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3376 SAM_USER_FIXED_DATA FixedData
;
3382 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3383 if (InfoBuffer
== NULL
)
3384 return STATUS_INSUFFICIENT_RESOURCES
;
3386 Length
= sizeof(SAM_USER_FIXED_DATA
);
3387 Status
= SampGetObjectAttribute(UserObject
,
3392 if (!NT_SUCCESS(Status
))
3395 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
3396 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
3397 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
3398 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
3399 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
3400 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
3401 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
3402 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
3403 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
3404 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
3405 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
3407 // OLD_LARGE_INTEGER PasswordCanChange;
3408 // OLD_LARGE_INTEGER PasswordMustChange;
3410 /* Get the Name string */
3411 Status
= SampGetObjectAttributeString(UserObject
,
3413 &InfoBuffer
->Logon
.UserName
);
3414 if (!NT_SUCCESS(Status
))
3416 TRACE("Status 0x%08lx\n", Status
);
3420 /* Get the FullName string */
3421 Status
= SampGetObjectAttributeString(UserObject
,
3423 &InfoBuffer
->Logon
.FullName
);
3424 if (!NT_SUCCESS(Status
))
3426 TRACE("Status 0x%08lx\n", Status
);
3430 /* Get the HomeDirectory string */
3431 Status
= SampGetObjectAttributeString(UserObject
,
3433 &InfoBuffer
->Logon
.HomeDirectory
);
3434 if (!NT_SUCCESS(Status
))
3436 TRACE("Status 0x%08lx\n", Status
);
3440 /* Get the HomeDirectoryDrive string */
3441 Status
= SampGetObjectAttributeString(UserObject
,
3442 L
"HomeDirectoryDrive",
3443 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
3444 if (!NT_SUCCESS(Status
))
3446 TRACE("Status 0x%08lx\n", Status
);
3450 /* Get the ScriptPath string */
3451 Status
= SampGetObjectAttributeString(UserObject
,
3453 &InfoBuffer
->Logon
.ScriptPath
);
3454 if (!NT_SUCCESS(Status
))
3456 TRACE("Status 0x%08lx\n", Status
);
3460 /* Get the ProfilePath string */
3461 Status
= SampGetObjectAttributeString(UserObject
,
3463 &InfoBuffer
->Logon
.ProfilePath
);
3464 if (!NT_SUCCESS(Status
))
3466 TRACE("Status 0x%08lx\n", Status
);
3470 /* Get the WorkStations string */
3471 Status
= SampGetObjectAttributeString(UserObject
,
3473 &InfoBuffer
->Logon
.WorkStations
);
3474 if (!NT_SUCCESS(Status
))
3476 TRACE("Status 0x%08lx\n", Status
);
3480 /* FIXME: LogonHours */
3482 *Buffer
= InfoBuffer
;
3485 if (!NT_SUCCESS(Status
))
3487 if (InfoBuffer
!= NULL
)
3489 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
3490 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
3492 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
3493 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
3495 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
3496 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
3498 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
3499 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
3501 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
3502 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
3504 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
3505 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
3507 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
3508 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
3510 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
3511 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
3513 midl_user_free(InfoBuffer
);
3525 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
3526 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3528 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3529 SAM_USER_FIXED_DATA FixedData
;
3535 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3536 if (InfoBuffer
== NULL
)
3537 return STATUS_INSUFFICIENT_RESOURCES
;
3539 Length
= sizeof(SAM_USER_FIXED_DATA
);
3540 Status
= SampGetObjectAttribute(UserObject
,
3545 if (!NT_SUCCESS(Status
))
3548 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
3549 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
3550 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
3551 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
3552 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
3553 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
3554 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
3555 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
3556 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
3557 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
3558 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
3559 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
3560 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
3562 /* Get the Name string */
3563 Status
= SampGetObjectAttributeString(UserObject
,
3565 &InfoBuffer
->Account
.UserName
);
3566 if (!NT_SUCCESS(Status
))
3568 TRACE("Status 0x%08lx\n", Status
);
3572 /* Get the FullName string */
3573 Status
= SampGetObjectAttributeString(UserObject
,
3575 &InfoBuffer
->Account
.FullName
);
3576 if (!NT_SUCCESS(Status
))
3578 TRACE("Status 0x%08lx\n", Status
);
3582 /* Get the HomeDirectory string */
3583 Status
= SampGetObjectAttributeString(UserObject
,
3585 &InfoBuffer
->Account
.HomeDirectory
);
3586 if (!NT_SUCCESS(Status
))
3588 TRACE("Status 0x%08lx\n", Status
);
3592 /* Get the HomeDirectoryDrive string */
3593 Status
= SampGetObjectAttributeString(UserObject
,
3594 L
"HomeDirectoryDrive",
3595 &InfoBuffer
->Account
.HomeDirectoryDrive
);
3596 if (!NT_SUCCESS(Status
))
3598 TRACE("Status 0x%08lx\n", Status
);
3602 /* Get the ScriptPath string */
3603 Status
= SampGetObjectAttributeString(UserObject
,
3605 &InfoBuffer
->Account
.ScriptPath
);
3606 if (!NT_SUCCESS(Status
))
3608 TRACE("Status 0x%08lx\n", Status
);
3612 /* Get the ProfilePath string */
3613 Status
= SampGetObjectAttributeString(UserObject
,
3615 &InfoBuffer
->Account
.ProfilePath
);
3616 if (!NT_SUCCESS(Status
))
3618 TRACE("Status 0x%08lx\n", Status
);
3622 /* Get the AdminComment string */
3623 Status
= SampGetObjectAttributeString(UserObject
,
3625 &InfoBuffer
->Account
.AdminComment
);
3626 if (!NT_SUCCESS(Status
))
3628 TRACE("Status 0x%08lx\n", Status
);
3632 /* Get the WorkStations string */
3633 Status
= SampGetObjectAttributeString(UserObject
,
3635 &InfoBuffer
->Account
.WorkStations
);
3636 if (!NT_SUCCESS(Status
))
3638 TRACE("Status 0x%08lx\n", Status
);
3642 /* FIXME: LogonHours */
3644 *Buffer
= InfoBuffer
;
3647 if (!NT_SUCCESS(Status
))
3649 if (InfoBuffer
!= NULL
)
3651 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
3652 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
3654 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
3655 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
3657 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
3658 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
3660 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
3661 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
3663 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
3664 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
3666 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
3667 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
3669 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
3670 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
3672 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
3673 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
3675 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
3676 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
3678 midl_user_free(InfoBuffer
);
3685 /* FIXME: SampQueryUserLogonHours */
3689 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
3690 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3692 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3697 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3698 if (InfoBuffer
== NULL
)
3699 return STATUS_INSUFFICIENT_RESOURCES
;
3701 /* Get the Name string */
3702 Status
= SampGetObjectAttributeString(UserObject
,
3704 &InfoBuffer
->Name
.UserName
);
3705 if (!NT_SUCCESS(Status
))
3707 TRACE("Status 0x%08lx\n", Status
);
3711 /* Get the FullName string */
3712 Status
= SampGetObjectAttributeString(UserObject
,
3714 &InfoBuffer
->Name
.FullName
);
3715 if (!NT_SUCCESS(Status
))
3717 TRACE("Status 0x%08lx\n", Status
);
3721 *Buffer
= InfoBuffer
;
3724 if (!NT_SUCCESS(Status
))
3726 if (InfoBuffer
!= NULL
)
3728 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
3729 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
3731 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
3732 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
3734 midl_user_free(InfoBuffer
);
3743 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
3744 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3746 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3751 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3752 if (InfoBuffer
== NULL
)
3753 return STATUS_INSUFFICIENT_RESOURCES
;
3755 /* Get the Name string */
3756 Status
= SampGetObjectAttributeString(UserObject
,
3758 &InfoBuffer
->AccountName
.UserName
);
3759 if (!NT_SUCCESS(Status
))
3761 TRACE("Status 0x%08lx\n", Status
);
3765 *Buffer
= InfoBuffer
;
3768 if (!NT_SUCCESS(Status
))
3770 if (InfoBuffer
!= NULL
)
3772 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
3773 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
3775 midl_user_free(InfoBuffer
);
3784 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
3785 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3787 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3792 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3793 if (InfoBuffer
== NULL
)
3794 return STATUS_INSUFFICIENT_RESOURCES
;
3796 /* Get the FullName string */
3797 Status
= SampGetObjectAttributeString(UserObject
,
3799 &InfoBuffer
->FullName
.FullName
);
3800 if (!NT_SUCCESS(Status
))
3802 TRACE("Status 0x%08lx\n", Status
);
3806 *Buffer
= InfoBuffer
;
3809 if (!NT_SUCCESS(Status
))
3811 if (InfoBuffer
!= NULL
)
3813 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
3814 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
3816 midl_user_free(InfoBuffer
);
3826 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
3827 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3829 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3830 SAM_USER_FIXED_DATA FixedData
;
3836 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3837 if (InfoBuffer
== NULL
)
3838 return STATUS_INSUFFICIENT_RESOURCES
;
3840 Length
= sizeof(SAM_USER_FIXED_DATA
);
3841 Status
= SampGetObjectAttribute(UserObject
,
3846 if (!NT_SUCCESS(Status
))
3849 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
3851 *Buffer
= InfoBuffer
;
3854 if (!NT_SUCCESS(Status
))
3856 if (InfoBuffer
!= NULL
)
3858 midl_user_free(InfoBuffer
);
3867 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
3868 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3870 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3875 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3876 if (InfoBuffer
== NULL
)
3877 return STATUS_INSUFFICIENT_RESOURCES
;
3879 /* Get the HomeDirectory string */
3880 Status
= SampGetObjectAttributeString(UserObject
,
3882 &InfoBuffer
->Home
.HomeDirectory
);
3883 if (!NT_SUCCESS(Status
))
3885 TRACE("Status 0x%08lx\n", Status
);
3889 /* Get the HomeDirectoryDrive string */
3890 Status
= SampGetObjectAttributeString(UserObject
,
3891 L
"HomeDirectoryDrive",
3892 &InfoBuffer
->Home
.HomeDirectoryDrive
);
3893 if (!NT_SUCCESS(Status
))
3895 TRACE("Status 0x%08lx\n", Status
);
3899 *Buffer
= InfoBuffer
;
3902 if (!NT_SUCCESS(Status
))
3904 if (InfoBuffer
!= NULL
)
3906 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
3907 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
3909 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
3910 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
3912 midl_user_free(InfoBuffer
);
3921 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
3922 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3924 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3929 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3930 if (InfoBuffer
== NULL
)
3931 return STATUS_INSUFFICIENT_RESOURCES
;
3933 /* Get the ScriptPath string */
3934 Status
= SampGetObjectAttributeString(UserObject
,
3936 &InfoBuffer
->Script
.ScriptPath
);
3937 if (!NT_SUCCESS(Status
))
3939 TRACE("Status 0x%08lx\n", Status
);
3943 *Buffer
= InfoBuffer
;
3946 if (!NT_SUCCESS(Status
))
3948 if (InfoBuffer
!= NULL
)
3950 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
3951 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
3953 midl_user_free(InfoBuffer
);
3962 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
3963 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3965 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3970 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3971 if (InfoBuffer
== NULL
)
3972 return STATUS_INSUFFICIENT_RESOURCES
;
3974 /* Get the ProfilePath string */
3975 Status
= SampGetObjectAttributeString(UserObject
,
3977 &InfoBuffer
->Profile
.ProfilePath
);
3978 if (!NT_SUCCESS(Status
))
3980 TRACE("Status 0x%08lx\n", Status
);
3984 *Buffer
= InfoBuffer
;
3987 if (!NT_SUCCESS(Status
))
3989 if (InfoBuffer
!= NULL
)
3991 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
3992 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
3994 midl_user_free(InfoBuffer
);
4003 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
4004 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4006 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4011 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4012 if (InfoBuffer
== NULL
)
4013 return STATUS_INSUFFICIENT_RESOURCES
;
4015 /* Get the AdminComment string */
4016 Status
= SampGetObjectAttributeString(UserObject
,
4018 &InfoBuffer
->AdminComment
.AdminComment
);
4019 if (!NT_SUCCESS(Status
))
4021 TRACE("Status 0x%08lx\n", Status
);
4025 *Buffer
= InfoBuffer
;
4028 if (!NT_SUCCESS(Status
))
4030 if (InfoBuffer
!= NULL
)
4032 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4033 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4035 midl_user_free(InfoBuffer
);
4044 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
4045 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4047 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4052 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4053 if (InfoBuffer
== NULL
)
4054 return STATUS_INSUFFICIENT_RESOURCES
;
4056 /* Get the WorkStations string */
4057 Status
= SampGetObjectAttributeString(UserObject
,
4059 &InfoBuffer
->WorkStations
.WorkStations
);
4060 if (!NT_SUCCESS(Status
))
4062 TRACE("Status 0x%08lx\n", Status
);
4066 *Buffer
= InfoBuffer
;
4069 if (!NT_SUCCESS(Status
))
4071 if (InfoBuffer
!= NULL
)
4073 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
4074 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
4076 midl_user_free(InfoBuffer
);
4086 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
4087 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4089 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4090 SAM_USER_FIXED_DATA FixedData
;
4096 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4097 if (InfoBuffer
== NULL
)
4098 return STATUS_INSUFFICIENT_RESOURCES
;
4100 Length
= sizeof(SAM_USER_FIXED_DATA
);
4101 Status
= SampGetObjectAttribute(UserObject
,
4106 if (!NT_SUCCESS(Status
))
4109 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
4111 *Buffer
= InfoBuffer
;
4114 if (!NT_SUCCESS(Status
))
4116 if (InfoBuffer
!= NULL
)
4118 midl_user_free(InfoBuffer
);
4128 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
4129 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4131 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4132 SAM_USER_FIXED_DATA FixedData
;
4138 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4139 if (InfoBuffer
== NULL
)
4140 return STATUS_INSUFFICIENT_RESOURCES
;
4142 Length
= sizeof(SAM_USER_FIXED_DATA
);
4143 Status
= SampGetObjectAttribute(UserObject
,
4148 if (!NT_SUCCESS(Status
))
4151 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
4152 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
4154 *Buffer
= InfoBuffer
;
4157 if (!NT_SUCCESS(Status
))
4159 if (InfoBuffer
!= NULL
)
4161 midl_user_free(InfoBuffer
);
4172 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
4173 IN USER_INFORMATION_CLASS UserInformationClass
,
4174 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
4176 PSAM_DB_OBJECT UserObject
;
4177 ACCESS_MASK DesiredAccess
;
4180 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
4181 UserHandle
, UserInformationClass
, Buffer
);
4183 switch (UserInformationClass
)
4185 case UserGeneralInformation
:
4186 case UserNameInformation
:
4187 case UserAccountNameInformation
:
4188 case UserFullNameInformation
:
4189 case UserPrimaryGroupInformation
:
4190 case UserAdminCommentInformation
:
4191 DesiredAccess
= USER_READ_GENERAL
;
4194 case UserLogonHoursInformation
:
4195 case UserHomeInformation
:
4196 case UserScriptInformation
:
4197 case UserProfileInformation
:
4198 case UserWorkStationsInformation
:
4199 DesiredAccess
= USER_READ_LOGON
;
4202 case UserControlInformation
:
4203 case UserExpiresInformation
:
4204 DesiredAccess
= USER_READ_ACCOUNT
;
4207 case UserPreferencesInformation
:
4208 DesiredAccess
= USER_READ_GENERAL
|
4209 USER_READ_PREFERENCES
;
4212 case UserLogonInformation
:
4213 case UserAccountInformation
:
4214 DesiredAccess
= USER_READ_GENERAL
|
4215 USER_READ_PREFERENCES
|
4221 return STATUS_INVALID_INFO_CLASS
;
4224 /* Validate the domain handle */
4225 Status
= SampValidateDbObject(UserHandle
,
4229 if (!NT_SUCCESS(Status
))
4231 TRACE("failed with status 0x%08lx\n", Status
);
4235 switch (UserInformationClass
)
4237 case UserGeneralInformation
:
4238 Status
= SampQueryUserGeneral(UserObject
,
4242 case UserPreferencesInformation
:
4243 Status
= SampQueryUserPreferences(UserObject
,
4247 case UserLogonInformation
:
4248 Status
= SampQueryUserLogon(UserObject
,
4252 // case UserLogonHoursInformation:
4253 // Status = SampQueryUserLogonHours(UserObject,
4257 case UserAccountInformation
:
4258 Status
= SampQueryUserAccount(UserObject
,
4262 case UserNameInformation
:
4263 Status
= SampQueryUserName(UserObject
,
4267 case UserAccountNameInformation
:
4268 Status
= SampQueryUserAccountName(UserObject
,
4272 case UserFullNameInformation
:
4273 Status
= SampQueryUserFullName(UserObject
,
4277 case UserPrimaryGroupInformation
:
4278 Status
= SampQueryUserPrimaryGroup(UserObject
,
4282 case UserHomeInformation
:
4283 Status
= SampQueryUserHome(UserObject
,
4286 case UserScriptInformation
:
4287 Status
= SampQueryUserScript(UserObject
,
4291 case UserProfileInformation
:
4292 Status
= SampQueryUserProfile(UserObject
,
4296 case UserAdminCommentInformation
:
4297 Status
= SampQueryUserAdminComment(UserObject
,
4301 case UserWorkStationsInformation
:
4302 Status
= SampQueryUserWorkStations(UserObject
,
4306 case UserControlInformation
:
4307 Status
= SampQueryUserControl(UserObject
,
4311 case UserExpiresInformation
:
4312 Status
= SampQueryUserExpires(UserObject
,
4317 Status
= STATUS_INVALID_INFO_CLASS
;
4325 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
4326 PSAMPR_USER_INFO_BUFFER Buffer
)
4328 SAM_USER_FIXED_DATA FixedData
;
4332 Length
= sizeof(SAM_USER_FIXED_DATA
);
4333 Status
= SampGetObjectAttribute(UserObject
,
4338 if (!NT_SUCCESS(Status
))
4341 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
4343 Status
= SampSetObjectAttribute(UserObject
,
4348 if (!NT_SUCCESS(Status
))
4351 Status
= SampSetObjectAttribute(UserObject
,
4354 Buffer
->General
.UserName
.Buffer
,
4355 Buffer
->General
.UserName
.MaximumLength
);
4356 if (!NT_SUCCESS(Status
))
4359 Status
= SampSetObjectAttribute(UserObject
,
4362 Buffer
->General
.FullName
.Buffer
,
4363 Buffer
->General
.FullName
.MaximumLength
);
4364 if (!NT_SUCCESS(Status
))
4367 Status
= SampSetObjectAttribute(UserObject
,
4370 Buffer
->General
.AdminComment
.Buffer
,
4371 Buffer
->General
.AdminComment
.MaximumLength
);
4372 if (!NT_SUCCESS(Status
))
4375 Status
= SampSetObjectAttribute(UserObject
,
4378 Buffer
->General
.UserComment
.Buffer
,
4379 Buffer
->General
.UserComment
.MaximumLength
);
4387 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
4388 PSAMPR_USER_INFO_BUFFER Buffer
)
4390 SAM_USER_FIXED_DATA FixedData
;
4394 Length
= sizeof(SAM_USER_FIXED_DATA
);
4395 Status
= SampGetObjectAttribute(UserObject
,
4400 if (!NT_SUCCESS(Status
))
4403 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
4404 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
4406 Status
= SampSetObjectAttribute(UserObject
,
4411 if (!NT_SUCCESS(Status
))
4414 Status
= SampSetObjectAttribute(UserObject
,
4417 Buffer
->Preferences
.UserComment
.Buffer
,
4418 Buffer
->Preferences
.UserComment
.MaximumLength
);
4426 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
4427 PSAMPR_USER_INFO_BUFFER Buffer
)
4429 SAM_USER_FIXED_DATA FixedData
;
4433 Length
= sizeof(SAM_USER_FIXED_DATA
);
4434 Status
= SampGetObjectAttribute(UserObject
,
4439 if (!NT_SUCCESS(Status
))
4442 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
4444 Status
= SampSetObjectAttribute(UserObject
,
4456 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
4457 PSAMPR_USER_INFO_BUFFER Buffer
)
4459 SAM_USER_FIXED_DATA FixedData
;
4463 Length
= sizeof(SAM_USER_FIXED_DATA
);
4464 Status
= SampGetObjectAttribute(UserObject
,
4469 if (!NT_SUCCESS(Status
))
4472 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
4474 Status
= SampSetObjectAttribute(UserObject
,
4486 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
4487 PSAMPR_USER_INFO_BUFFER Buffer
)
4489 SAM_USER_FIXED_DATA FixedData
;
4493 Length
= sizeof(SAM_USER_FIXED_DATA
);
4494 Status
= SampGetObjectAttribute(UserObject
,
4499 if (!NT_SUCCESS(Status
))
4502 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
4503 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
4505 Status
= SampSetObjectAttribute(UserObject
,
4519 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
4520 IN USER_INFORMATION_CLASS UserInformationClass
,
4521 IN PSAMPR_USER_INFO_BUFFER Buffer
)
4523 PSAM_DB_OBJECT UserObject
;
4524 ACCESS_MASK DesiredAccess
;
4527 TRACE("SamrSetInformationUser(%p %lu %p)\n",
4528 UserHandle
, UserInformationClass
, Buffer
);
4530 switch (UserInformationClass
)
4532 case UserLogonHoursInformation
:
4533 case UserNameInformation
:
4534 case UserAccountNameInformation
:
4535 case UserFullNameInformation
:
4536 case UserPrimaryGroupInformation
:
4537 case UserHomeInformation
:
4538 case UserScriptInformation
:
4539 case UserProfileInformation
:
4540 case UserAdminCommentInformation
:
4541 case UserWorkStationsInformation
:
4542 case UserControlInformation
:
4543 case UserExpiresInformation
:
4544 DesiredAccess
= USER_WRITE_ACCOUNT
;
4547 case UserGeneralInformation
:
4548 DesiredAccess
= USER_WRITE_ACCOUNT
|
4549 USER_WRITE_PREFERENCES
;
4552 case UserPreferencesInformation
:
4553 DesiredAccess
= USER_WRITE_PREFERENCES
;
4556 case UserSetPasswordInformation
:
4557 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
4561 return STATUS_INVALID_INFO_CLASS
;
4564 /* Validate the domain handle */
4565 Status
= SampValidateDbObject(UserHandle
,
4569 if (!NT_SUCCESS(Status
))
4571 TRACE("failed with status 0x%08lx\n", Status
);
4575 switch (UserInformationClass
)
4577 case UserGeneralInformation
:
4578 Status
= SampSetUserGeneral(UserObject
,
4582 case UserPreferencesInformation
:
4583 Status
= SampSetUserPreferences(UserObject
,
4587 case UserLogonHoursInformation:
4588 Status = SampSetUserLogonHours(UserObject,
4592 case UserNameInformation
:
4593 Status
= SampSetObjectAttribute(UserObject
,
4596 Buffer
->Name
.UserName
.Buffer
,
4597 Buffer
->Name
.UserName
.MaximumLength
);
4598 if (!NT_SUCCESS(Status
))
4601 Status
= SampSetObjectAttribute(UserObject
,
4604 Buffer
->Name
.FullName
.Buffer
,
4605 Buffer
->Name
.FullName
.MaximumLength
);
4608 case UserAccountNameInformation
:
4609 Status
= SampSetObjectAttribute(UserObject
,
4612 Buffer
->AccountName
.UserName
.Buffer
,
4613 Buffer
->AccountName
.UserName
.MaximumLength
);
4616 case UserFullNameInformation
:
4617 Status
= SampSetObjectAttribute(UserObject
,
4620 Buffer
->FullName
.FullName
.Buffer
,
4621 Buffer
->FullName
.FullName
.MaximumLength
);
4624 case UserPrimaryGroupInformation
:
4625 Status
= SampSetUserPrimaryGroup(UserObject
,
4629 case UserHomeInformation
:
4630 Status
= SampSetObjectAttribute(UserObject
,
4633 Buffer
->Home
.HomeDirectory
.Buffer
,
4634 Buffer
->Home
.HomeDirectory
.MaximumLength
);
4635 if (!NT_SUCCESS(Status
))
4638 Status
= SampSetObjectAttribute(UserObject
,
4639 L
"HomeDirectoryDrive",
4641 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
4642 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
4645 case UserScriptInformation
:
4646 Status
= SampSetObjectAttribute(UserObject
,
4649 Buffer
->Script
.ScriptPath
.Buffer
,
4650 Buffer
->Script
.ScriptPath
.MaximumLength
);
4653 case UserProfileInformation
:
4654 Status
= SampSetObjectAttribute(UserObject
,
4657 Buffer
->Profile
.ProfilePath
.Buffer
,
4658 Buffer
->Profile
.ProfilePath
.MaximumLength
);
4661 case UserAdminCommentInformation
:
4662 Status
= SampSetObjectAttribute(UserObject
,
4665 Buffer
->AdminComment
.AdminComment
.Buffer
,
4666 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
4669 case UserWorkStationsInformation
:
4670 Status
= SampSetObjectAttribute(UserObject
,
4673 Buffer
->WorkStations
.WorkStations
.Buffer
,
4674 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
4677 case UserSetPasswordInformation
:
4678 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
4679 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
4681 Status
= SampSetObjectAttribute(UserObject
,
4684 Buffer
->SetPassword
.Password
.Buffer
,
4685 Buffer
->SetPassword
.Password
.MaximumLength
);
4688 case UserControlInformation
:
4689 Status
= SampSetUserControl(UserObject
,
4693 case UserExpiresInformation
:
4694 Status
= SampSetUserExpires(UserObject
,
4698 // case UserInternal1Information:
4699 // case UserParametersInformation:
4700 // case UserAllInformation:
4701 // case UserInternal4Information:
4702 // case UserInternal5Information:
4703 // case UserInternal4InformationNew:
4704 // case UserInternal5InformationNew:
4707 Status
= STATUS_INVALID_INFO_CLASS
;
4716 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
4717 IN
unsigned char LmPresent
,
4718 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
4719 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
4720 IN
unsigned char NtPresent
,
4721 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
4722 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
4723 IN
unsigned char NtCrossEncryptionPresent
,
4724 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
4725 IN
unsigned char LmCrossEncryptionPresent
,
4726 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
4729 return STATUS_NOT_IMPLEMENTED
;
4735 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
4736 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
4739 return STATUS_NOT_IMPLEMENTED
;
4745 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
4746 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4747 IN
unsigned long Index
,
4748 IN
unsigned long EntryCount
,
4749 IN
unsigned long PreferredMaximumLength
,
4750 OUT
unsigned long *TotalAvailable
,
4751 OUT
unsigned long *TotalReturned
,
4752 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
4755 return STATUS_NOT_IMPLEMENTED
;
4761 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
4762 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4763 IN PRPC_UNICODE_STRING Prefix
,
4764 OUT
unsigned long *Index
)
4767 return STATUS_NOT_IMPLEMENTED
;
4773 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
4776 return STATUS_NOT_IMPLEMENTED
;
4782 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
4785 return STATUS_NOT_IMPLEMENTED
;
4791 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
4792 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
4795 return STATUS_NOT_IMPLEMENTED
;
4801 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
4802 IN PRPC_SID MemberSid
)
4805 return STATUS_NOT_IMPLEMENTED
;
4811 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
4812 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
4813 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
4816 return STATUS_NOT_IMPLEMENTED
;
4822 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
4823 IN USER_INFORMATION_CLASS UserInformationClass
,
4824 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
4827 return STATUS_NOT_IMPLEMENTED
;
4833 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
4834 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4835 IN
unsigned long Index
,
4836 IN
unsigned long EntryCount
,
4837 IN
unsigned long PreferredMaximumLength
,
4838 OUT
unsigned long *TotalAvailable
,
4839 OUT
unsigned long *TotalReturned
,
4840 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
4843 return STATUS_NOT_IMPLEMENTED
;
4849 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
4850 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4851 IN PRPC_UNICODE_STRING Prefix
,
4852 OUT
unsigned long *Index
)
4855 return STATUS_NOT_IMPLEMENTED
;
4861 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
4862 IN PRPC_UNICODE_STRING Name
,
4863 IN
unsigned long AccountType
,
4864 IN ACCESS_MASK DesiredAccess
,
4865 OUT SAMPR_HANDLE
*UserHandle
,
4866 OUT
unsigned long *GrantedAccess
,
4867 OUT
unsigned long *RelativeId
)
4870 return STATUS_NOT_IMPLEMENTED
;
4876 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
4877 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
4878 IN
unsigned long Index
,
4879 IN
unsigned long EntryCount
,
4880 IN
unsigned long PreferredMaximumLength
,
4881 OUT
unsigned long *TotalAvailable
,
4882 OUT
unsigned long *TotalReturned
,
4883 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
4886 return STATUS_NOT_IMPLEMENTED
;
4892 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
4893 IN PSAMPR_PSID_ARRAY MembersBuffer
)
4896 return STATUS_NOT_IMPLEMENTED
;
4902 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
4903 IN PSAMPR_PSID_ARRAY MembersBuffer
)
4906 return STATUS_NOT_IMPLEMENTED
;
4912 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
4913 IN PRPC_STRING ServerName
,
4914 IN PRPC_STRING UserName
,
4915 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
4916 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
4919 return STATUS_NOT_IMPLEMENTED
;
4925 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
4926 IN PRPC_UNICODE_STRING ServerName
,
4927 IN PRPC_UNICODE_STRING UserName
,
4928 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
4929 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
4930 IN
unsigned char LmPresent
,
4931 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
4932 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
4935 return STATUS_NOT_IMPLEMENTED
;
4941 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
4942 IN PRPC_UNICODE_STRING Unused
,
4943 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
4946 return STATUS_NOT_IMPLEMENTED
;
4952 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
4953 OUT SAMPR_HANDLE
*ServerHandle
,
4954 IN ACCESS_MASK DesiredAccess
)
4957 return STATUS_NOT_IMPLEMENTED
;
4963 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
4964 IN USER_INFORMATION_CLASS UserInformationClass
,
4965 IN PSAMPR_USER_INFO_BUFFER Buffer
)
4968 return STATUS_NOT_IMPLEMENTED
;
4974 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
4977 return STATUS_NOT_IMPLEMENTED
;
4983 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
4986 return STATUS_NOT_IMPLEMENTED
;
4992 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
4995 return STATUS_NOT_IMPLEMENTED
;
5001 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
5002 OUT SAMPR_HANDLE
*ServerHandle
,
5003 IN
unsigned long ClientRevision
,
5004 IN ACCESS_MASK DesiredAccess
)
5007 return STATUS_NOT_IMPLEMENTED
;
5013 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
5016 return STATUS_NOT_IMPLEMENTED
;
5022 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
5023 IN ACCESS_MASK DesiredAccess
,
5024 IN
unsigned long InVersion
,
5025 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
5026 OUT
unsigned long *OutVersion
,
5027 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
5028 OUT SAMPR_HANDLE
*ServerHandle
)
5031 return STATUS_NOT_IMPLEMENTED
;
5037 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
5038 IN
unsigned long Rid
,
5042 return STATUS_NOT_IMPLEMENTED
;
5048 SamrSetDSRMPassword(IN handle_t BindingHandle
,
5049 IN PRPC_UNICODE_STRING Unused
,
5050 IN
unsigned long UserId
,
5051 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
5054 return STATUS_NOT_IMPLEMENTED
;
5060 SamrValidatePassword(IN handle_t Handle
,
5061 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
5062 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
5063 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
5066 return STATUS_NOT_IMPLEMENTED
;