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 /* Check if the group name already exists in the domain */
1569 Status
= SampCheckAccountNameInDomain(DomainObject
,
1571 if (!NT_SUCCESS(Status
))
1573 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1574 Name
->Buffer
, Status
);
1578 /* Get the fixed domain attributes */
1579 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1580 Status
= SampGetObjectAttribute(DomainObject
,
1583 (PVOID
)&FixedDomainData
,
1585 if (!NT_SUCCESS(Status
))
1587 TRACE("failed with status 0x%08lx\n", Status
);
1591 /* Increment the NextRid attribute */
1592 ulRid
= FixedDomainData
.NextRid
;
1593 FixedDomainData
.NextRid
++;
1595 /* Store the fixed domain attributes */
1596 Status
= SampSetObjectAttribute(DomainObject
,
1601 if (!NT_SUCCESS(Status
))
1603 TRACE("failed with status 0x%08lx\n", Status
);
1607 TRACE("RID: %lx\n", ulRid
);
1609 /* Convert the RID into a string (hex) */
1610 swprintf(szRid
, L
"%08lX", ulRid
);
1612 /* Create the group object */
1613 Status
= SampCreateDbObject(DomainObject
,
1619 if (!NT_SUCCESS(Status
))
1621 TRACE("failed with status 0x%08lx\n", Status
);
1625 /* Add the account name of the user object */
1626 Status
= SampSetAccountNameInDomain(DomainObject
,
1630 if (!NT_SUCCESS(Status
))
1632 TRACE("failed with status 0x%08lx\n", Status
);
1636 /* Initialize fixed user data */
1637 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1638 FixedGroupData
.Version
= 1;
1640 FixedGroupData
.GroupId
= ulRid
;
1642 /* Set fixed user data attribute */
1643 Status
= SampSetObjectAttribute(GroupObject
,
1646 (LPVOID
)&FixedGroupData
,
1647 sizeof(SAM_GROUP_FIXED_DATA
));
1648 if (!NT_SUCCESS(Status
))
1650 TRACE("failed with status 0x%08lx\n", Status
);
1654 /* Set the Name attribute */
1655 Status
= SampSetObjectAttribute(GroupObject
,
1658 (LPVOID
)Name
->Buffer
,
1659 Name
->MaximumLength
);
1660 if (!NT_SUCCESS(Status
))
1662 TRACE("failed with status 0x%08lx\n", Status
);
1666 /* Set the AdminComment attribute */
1667 Status
= SampSetObjectAttribute(GroupObject
,
1671 EmptyString
.MaximumLength
);
1672 if (!NT_SUCCESS(Status
))
1674 TRACE("failed with status 0x%08lx\n", Status
);
1678 if (NT_SUCCESS(Status
))
1680 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1681 *RelativeId
= ulRid
;
1684 TRACE("returns with status 0x%08lx\n", Status
);
1693 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1694 IN OUT
unsigned long *EnumerationContext
,
1695 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1696 IN
unsigned long PreferedMaximumLength
,
1697 OUT
unsigned long *CountReturned
)
1700 return STATUS_NOT_IMPLEMENTED
;
1707 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
1708 IN PRPC_UNICODE_STRING Name
,
1709 IN ACCESS_MASK DesiredAccess
,
1710 OUT SAMPR_HANDLE
*UserHandle
,
1711 OUT
unsigned long *RelativeId
)
1713 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1714 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1715 SAM_USER_FIXED_DATA FixedUserData
;
1716 PSAM_DB_OBJECT DomainObject
;
1717 PSAM_DB_OBJECT UserObject
;
1723 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
1724 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
1727 Name
->Length
== 0 ||
1728 Name
->Buffer
== NULL
||
1729 UserHandle
== NULL
||
1731 return STATUS_INVALID_PARAMETER
;
1733 /* Validate the domain handle */
1734 Status
= SampValidateDbObject(DomainHandle
,
1738 if (!NT_SUCCESS(Status
))
1740 TRACE("failed with status 0x%08lx\n", Status
);
1744 /* Check if the user name already exists in the domain */
1745 Status
= SampCheckAccountNameInDomain(DomainObject
,
1747 if (!NT_SUCCESS(Status
))
1749 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
1750 Name
->Buffer
, Status
);
1754 /* Get the fixed domain attributes */
1755 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1756 Status
= SampGetObjectAttribute(DomainObject
,
1759 (PVOID
)&FixedDomainData
,
1761 if (!NT_SUCCESS(Status
))
1763 TRACE("failed with status 0x%08lx\n", Status
);
1767 /* Increment the NextRid attribute */
1768 ulRid
= FixedDomainData
.NextRid
;
1769 FixedDomainData
.NextRid
++;
1771 /* Store the fixed domain attributes */
1772 Status
= SampSetObjectAttribute(DomainObject
,
1777 if (!NT_SUCCESS(Status
))
1779 TRACE("failed with status 0x%08lx\n", Status
);
1783 TRACE("RID: %lx\n", ulRid
);
1785 /* Convert the RID into a string (hex) */
1786 swprintf(szRid
, L
"%08lX", ulRid
);
1788 /* Create the user object */
1789 Status
= SampCreateDbObject(DomainObject
,
1795 if (!NT_SUCCESS(Status
))
1797 TRACE("failed with status 0x%08lx\n", Status
);
1801 /* Add the account name for the user object */
1802 Status
= SampSetAccountNameInDomain(DomainObject
,
1806 if (!NT_SUCCESS(Status
))
1808 TRACE("failed with status 0x%08lx\n", Status
);
1812 /* Initialize fixed user data */
1813 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
1814 FixedUserData
.Version
= 1;
1815 FixedUserData
.LastLogon
.QuadPart
= 0;
1816 FixedUserData
.LastLogoff
.QuadPart
= 0;
1817 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
1818 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
1819 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
1820 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
1821 FixedUserData
.UserId
= ulRid
;
1822 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
1823 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
1824 USER_PASSWORD_NOT_REQUIRED
|
1825 USER_NORMAL_ACCOUNT
;
1827 /* Set fixed user data attribute */
1828 Status
= SampSetObjectAttribute(UserObject
,
1831 (LPVOID
)&FixedUserData
,
1832 sizeof(SAM_USER_FIXED_DATA
));
1833 if (!NT_SUCCESS(Status
))
1835 TRACE("failed with status 0x%08lx\n", Status
);
1839 /* Set the Name attribute */
1840 Status
= SampSetObjectAttribute(UserObject
,
1843 (LPVOID
)Name
->Buffer
,
1844 Name
->MaximumLength
);
1845 if (!NT_SUCCESS(Status
))
1847 TRACE("failed with status 0x%08lx\n", Status
);
1851 /* Set the FullName attribute */
1852 Status
= SampSetObjectAttribute(UserObject
,
1856 EmptyString
.MaximumLength
);
1857 if (!NT_SUCCESS(Status
))
1859 TRACE("failed with status 0x%08lx\n", Status
);
1863 /* Set the HomeDirectory attribute */
1864 Status
= SampSetObjectAttribute(UserObject
,
1868 EmptyString
.MaximumLength
);
1869 if (!NT_SUCCESS(Status
))
1871 TRACE("failed with status 0x%08lx\n", Status
);
1875 /* Set the HomeDirectoryDrive attribute */
1876 Status
= SampSetObjectAttribute(UserObject
,
1877 L
"HomeDirectoryDrive",
1880 EmptyString
.MaximumLength
);
1881 if (!NT_SUCCESS(Status
))
1883 TRACE("failed with status 0x%08lx\n", Status
);
1887 /* Set the ScriptPath attribute */
1888 Status
= SampSetObjectAttribute(UserObject
,
1892 EmptyString
.MaximumLength
);
1893 if (!NT_SUCCESS(Status
))
1895 TRACE("failed with status 0x%08lx\n", Status
);
1899 /* Set the ProfilePath attribute */
1900 Status
= SampSetObjectAttribute(UserObject
,
1904 EmptyString
.MaximumLength
);
1905 if (!NT_SUCCESS(Status
))
1907 TRACE("failed with status 0x%08lx\n", Status
);
1911 /* Set the AdminComment attribute */
1912 Status
= SampSetObjectAttribute(UserObject
,
1916 EmptyString
.MaximumLength
);
1917 if (!NT_SUCCESS(Status
))
1919 TRACE("failed with status 0x%08lx\n", Status
);
1923 /* Set the UserComment attribute */
1924 Status
= SampSetObjectAttribute(UserObject
,
1928 EmptyString
.MaximumLength
);
1929 if (!NT_SUCCESS(Status
))
1931 TRACE("failed with status 0x%08lx\n", Status
);
1935 /* Set the WorkStations attribute */
1936 Status
= SampSetObjectAttribute(UserObject
,
1940 EmptyString
.MaximumLength
);
1941 if (!NT_SUCCESS(Status
))
1943 TRACE("failed with status 0x%08lx\n", Status
);
1947 /* FIXME: Set default user attributes */
1949 if (NT_SUCCESS(Status
))
1951 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
1952 *RelativeId
= ulRid
;
1955 TRACE("returns with status 0x%08lx\n", Status
);
1964 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
1965 IN OUT
unsigned long *EnumerationContext
,
1966 IN
unsigned long UserAccountControl
,
1967 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1968 IN
unsigned long PreferedMaximumLength
,
1969 OUT
unsigned long *CountReturned
)
1972 return STATUS_NOT_IMPLEMENTED
;
1979 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
1980 IN PRPC_UNICODE_STRING AccountName
,
1981 IN ACCESS_MASK DesiredAccess
,
1982 OUT SAMPR_HANDLE
*AliasHandle
,
1983 OUT
unsigned long *RelativeId
)
1985 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1986 PSAM_DB_OBJECT DomainObject
;
1987 PSAM_DB_OBJECT AliasObject
;
1988 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1994 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
1995 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
1997 /* Validate the domain handle */
1998 Status
= SampValidateDbObject(DomainHandle
,
2000 DOMAIN_CREATE_ALIAS
,
2002 if (!NT_SUCCESS(Status
))
2004 TRACE("failed with status 0x%08lx\n", Status
);
2008 /* Check if the alias name already exists in the domain */
2009 Status
= SampCheckAccountNameInDomain(DomainObject
,
2010 AccountName
->Buffer
);
2011 if (!NT_SUCCESS(Status
))
2013 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2014 AccountName
->Buffer
, Status
);
2018 /* Get the fixed domain attributes */
2019 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2020 Status
= SampGetObjectAttribute(DomainObject
,
2023 (PVOID
)&FixedDomainData
,
2025 if (!NT_SUCCESS(Status
))
2027 TRACE("failed with status 0x%08lx\n", Status
);
2031 /* Increment the NextRid attribute */
2032 ulRid
= FixedDomainData
.NextRid
;
2033 FixedDomainData
.NextRid
++;
2035 /* Store the fixed domain attributes */
2036 Status
= SampSetObjectAttribute(DomainObject
,
2041 if (!NT_SUCCESS(Status
))
2043 TRACE("failed with status 0x%08lx\n", Status
);
2047 TRACE("RID: %lx\n", ulRid
);
2049 /* Convert the RID into a string (hex) */
2050 swprintf(szRid
, L
"%08lX", ulRid
);
2052 /* Create the alias object */
2053 Status
= SampCreateDbObject(DomainObject
,
2059 if (!NT_SUCCESS(Status
))
2061 TRACE("failed with status 0x%08lx\n", Status
);
2065 /* Add the account name for the alias object */
2066 Status
= SampSetAccountNameInDomain(DomainObject
,
2068 AccountName
->Buffer
,
2070 if (!NT_SUCCESS(Status
))
2072 TRACE("failed with status 0x%08lx\n", Status
);
2076 /* Set the Name attribute */
2077 Status
= SampSetObjectAttribute(AliasObject
,
2080 (LPVOID
)AccountName
->Buffer
,
2081 AccountName
->MaximumLength
);
2082 if (!NT_SUCCESS(Status
))
2084 TRACE("failed with status 0x%08lx\n", Status
);
2088 /* Set the Description attribute */
2089 Status
= SampSetObjectAttribute(AliasObject
,
2093 EmptyString
.MaximumLength
);
2094 if (!NT_SUCCESS(Status
))
2096 TRACE("failed with status 0x%08lx\n", Status
);
2100 if (NT_SUCCESS(Status
))
2102 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2103 *RelativeId
= ulRid
;
2106 TRACE("returns with status 0x%08lx\n", Status
);
2114 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2115 IN OUT
unsigned long *EnumerationContext
,
2116 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2117 IN
unsigned long PreferedMaximumLength
,
2118 OUT
unsigned long *CountReturned
)
2120 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2121 PSAM_DB_OBJECT DomainObject
;
2122 HANDLE AliasesKeyHandle
;
2123 WCHAR AliasKeyName
[64];
2124 HANDLE AliasKeyHandle
;
2127 ULONG RequiredLength
;
2130 BOOLEAN MoreEntries
= FALSE
;
2133 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2134 DomainHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
2137 /* Validate the domain handle */
2138 Status
= SampValidateDbObject(DomainHandle
,
2140 DOMAIN_LIST_ACCOUNTS
,
2142 if (!NT_SUCCESS(Status
))
2145 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2149 if (!NT_SUCCESS(Status
))
2154 EnumIndex
= *EnumerationContext
;
2160 Status
= SampRegEnumerateSubKey(AliasesKeyHandle
,
2164 if (!NT_SUCCESS(Status
))
2166 if (Status
== STATUS_NO_MORE_ENTRIES
)
2167 Status
= STATUS_SUCCESS
;
2171 TRACE("EnumIndex: %lu\n", EnumIndex
);
2172 TRACE("Alias key name: %S\n", AliasKeyName
);
2174 Status
= SampRegOpenKey(AliasesKeyHandle
,
2178 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2179 if (NT_SUCCESS(Status
))
2182 Status
= SampRegQueryValue(AliasKeyHandle
,
2188 NtClose(AliasKeyHandle
);
2190 TRACE("SampRegQueryValue returned %08lX\n", Status
);
2192 if (NT_SUCCESS(Status
))
2194 TRACE("Data length: %lu\n", DataLength
);
2196 if ((RequiredLength
+ DataLength
+ sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2202 RequiredLength
+= (DataLength
+ sizeof(SAMPR_RID_ENUMERATION
));
2210 TRACE("EnumCount: %lu\n", EnumCount
);
2211 TRACE("RequiredLength: %lu\n", RequiredLength
);
2213 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2214 if (EnumBuffer
== NULL
)
2216 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2220 EnumBuffer
->EntriesRead
= EnumCount
;
2224 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2225 if (EnumBuffer
->Buffer
== NULL
)
2227 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2233 EnumIndex
= *EnumerationContext
;
2234 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2236 Status
= SampRegEnumerateSubKey(AliasesKeyHandle
,
2240 if (!NT_SUCCESS(Status
))
2242 if (Status
== STATUS_NO_MORE_ENTRIES
)
2243 Status
= STATUS_SUCCESS
;
2247 TRACE("EnumIndex: %lu\n", EnumIndex
);
2248 TRACE("Alias key name: %S\n", AliasKeyName
);
2250 Status
= SampRegOpenKey(AliasesKeyHandle
,
2254 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2255 if (NT_SUCCESS(Status
))
2258 Status
= SampRegQueryValue(AliasKeyHandle
,
2263 TRACE("SampRegQueryValue returned %08lX\n", Status
);
2264 if (NT_SUCCESS(Status
))
2266 EnumBuffer
->Buffer
[i
].RelativeId
= wcstoul(AliasKeyName
, NULL
, 16);
2268 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
2269 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
2270 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
2271 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2273 NtClose(AliasKeyHandle
);
2274 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2278 Status
= SampRegQueryValue(AliasKeyHandle
,
2281 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2283 TRACE("SampRegQueryValue returned %08lX\n", Status
);
2284 if (NT_SUCCESS(Status
))
2286 TRACE("Alias name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2290 NtClose(AliasKeyHandle
);
2292 if (!NT_SUCCESS(Status
))
2298 if (NT_SUCCESS(Status
))
2300 *EnumerationContext
+= EnumCount
;
2301 *Buffer
= EnumBuffer
;
2302 *CountReturned
= EnumCount
;
2305 if (!NT_SUCCESS(Status
))
2307 *EnumerationContext
= 0;
2311 if (EnumBuffer
!= NULL
)
2313 if (EnumBuffer
->Buffer
!= NULL
)
2315 if (EnumBuffer
->EntriesRead
!= 0)
2317 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2319 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2320 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2324 midl_user_free(EnumBuffer
->Buffer
);
2327 midl_user_free(EnumBuffer
);
2331 NtClose(AliasesKeyHandle
);
2333 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2334 Status
= STATUS_MORE_ENTRIES
;
2342 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2343 IN PSAMPR_PSID_ARRAY SidArray
,
2344 OUT PSAMPR_ULONG_ARRAY Membership
)
2346 PSAM_DB_OBJECT DomainObject
;
2347 HANDLE AliasesKeyHandle
= NULL
;
2348 HANDLE MembersKeyHandle
= NULL
;
2349 HANDLE MemberKeyHandle
= NULL
;
2350 LPWSTR MemberSidString
= NULL
;
2351 PULONG RidArray
= NULL
;
2352 ULONG MaxSidCount
= 0;
2358 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2359 DomainHandle
, SidArray
, Membership
);
2361 /* Validate the domain handle */
2362 Status
= SampValidateDbObject(DomainHandle
,
2366 if (!NT_SUCCESS(Status
))
2369 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2373 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2374 if (!NT_SUCCESS(Status
))
2377 Status
= SampRegOpenKey(AliasesKeyHandle
,
2381 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2382 if (!NT_SUCCESS(Status
))
2385 for (i
= 0; i
< SidArray
->Count
; i
++)
2387 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2388 TRACE("Open %S\n", MemberSidString
);
2390 Status
= SampRegOpenKey(MembersKeyHandle
,
2394 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2395 if (NT_SUCCESS(Status
))
2397 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2400 if (NT_SUCCESS(Status
))
2402 TRACE("Found %lu values\n", ValueCount
);
2403 MaxSidCount
+= ValueCount
;
2407 NtClose(MemberKeyHandle
);
2410 LocalFree(MemberSidString
);
2413 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
2414 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
2415 if (RidArray
== NULL
)
2417 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2421 for (i
= 0; i
< SidArray
->Count
; i
++)
2423 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
2424 TRACE("Open %S\n", MemberSidString
);
2426 Status
= SampRegOpenKey(MembersKeyHandle
,
2430 TRACE("SampRegOpenKey returned %08lX\n", Status
);
2431 if (NT_SUCCESS(Status
))
2433 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
2436 if (NT_SUCCESS(Status
))
2438 TRACE("Found %lu values\n", ValueCount
);
2440 for (j
= 0; j
< ValueCount
; j
++)
2442 DataLength
= sizeof(ULONG
);
2443 Status
= SampRegEnumerateValue(MemberKeyHandle
,
2448 (PVOID
)&RidArray
[j
],
2453 NtClose(MemberKeyHandle
);
2456 LocalFree(MemberSidString
);
2461 if (NT_SUCCESS(Status
))
2463 Membership
->Count
= MaxSidCount
;
2464 Membership
->Element
= RidArray
;
2468 if (RidArray
!= NULL
)
2469 midl_user_free(RidArray
);
2472 if (MembersKeyHandle
!= NULL
)
2473 NtClose(MembersKeyHandle
);
2475 if (MembersKeyHandle
!= NULL
)
2476 NtClose(MembersKeyHandle
);
2478 if (AliasesKeyHandle
!= NULL
)
2479 NtClose(AliasesKeyHandle
);
2488 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
2489 IN
unsigned long Count
,
2490 IN RPC_UNICODE_STRING Names
[],
2491 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
2492 OUT PSAMPR_ULONG_ARRAY Use
)
2495 return STATUS_NOT_IMPLEMENTED
;
2501 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
2502 IN
unsigned long Count
,
2503 IN
unsigned long *RelativeIds
,
2504 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
2505 OUT PSAMPR_ULONG_ARRAY Use
)
2508 return STATUS_NOT_IMPLEMENTED
;
2515 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
2516 IN ACCESS_MASK DesiredAccess
,
2517 IN
unsigned long GroupId
,
2518 OUT SAMPR_HANDLE
*GroupHandle
)
2520 PSAM_DB_OBJECT DomainObject
;
2521 PSAM_DB_OBJECT GroupObject
;
2525 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
2526 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
2528 /* Validate the domain handle */
2529 Status
= SampValidateDbObject(DomainHandle
,
2533 if (!NT_SUCCESS(Status
))
2535 TRACE("failed with status 0x%08lx\n", Status
);
2539 /* Convert the RID into a string (hex) */
2540 swprintf(szRid
, L
"%08lX", GroupId
);
2542 /* Create the group object */
2543 Status
= SampOpenDbObject(DomainObject
,
2549 if (!NT_SUCCESS(Status
))
2551 TRACE("failed with status 0x%08lx\n", Status
);
2555 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
2557 return STATUS_SUCCESS
;
2562 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
2563 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
2565 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
2566 HANDLE MembersKeyHandle
= NULL
;
2567 SAM_GROUP_FIXED_DATA FixedData
;
2573 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
2574 if (InfoBuffer
== NULL
)
2575 return STATUS_INSUFFICIENT_RESOURCES
;
2577 Status
= SampGetObjectAttributeString(GroupObject
,
2579 &InfoBuffer
->General
.Name
);
2580 if (!NT_SUCCESS(Status
))
2582 TRACE("Status 0x%08lx\n", Status
);
2586 Status
= SampGetObjectAttributeString(GroupObject
,
2588 &InfoBuffer
->General
.AdminComment
);
2589 if (!NT_SUCCESS(Status
))
2591 TRACE("Status 0x%08lx\n", Status
);
2595 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
2596 Status
= SampGetObjectAttribute(GroupObject
,
2601 if (!NT_SUCCESS(Status
))
2604 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
2606 /* Open the Members subkey */
2607 Status
= SampRegOpenKey(GroupObject
->KeyHandle
,
2611 if (!NT_SUCCESS(Status
))
2613 TRACE("Status 0x%08lx\n", Status
);
2617 /* Retrieve the number of members of the alias */
2618 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
2620 &InfoBuffer
->General
.MemberCount
);
2621 if (!NT_SUCCESS(Status
))
2623 TRACE("Status 0x%08lx\n", Status
);
2627 *Buffer
= InfoBuffer
;
2630 if (MembersKeyHandle
!= NULL
)
2631 SampRegCloseKey(MembersKeyHandle
);
2633 if (!NT_SUCCESS(Status
))
2635 if (InfoBuffer
!= NULL
)
2637 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
2638 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
2640 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
2641 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
2643 midl_user_free(InfoBuffer
);
2652 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
2653 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
2655 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
2660 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
2661 if (InfoBuffer
== NULL
)
2662 return STATUS_INSUFFICIENT_RESOURCES
;
2664 Status
= SampGetObjectAttributeString(GroupObject
,
2666 &InfoBuffer
->Name
.Name
);
2667 if (!NT_SUCCESS(Status
))
2669 TRACE("Status 0x%08lx\n", Status
);
2673 *Buffer
= InfoBuffer
;
2676 if (!NT_SUCCESS(Status
))
2678 if (InfoBuffer
!= NULL
)
2680 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
2681 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
2683 midl_user_free(InfoBuffer
);
2692 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
2693 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
2695 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
2696 SAM_GROUP_FIXED_DATA FixedData
;
2702 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
2703 if (InfoBuffer
== NULL
)
2704 return STATUS_INSUFFICIENT_RESOURCES
;
2706 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
2707 Status
= SampGetObjectAttribute(GroupObject
,
2712 if (!NT_SUCCESS(Status
))
2715 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
2717 *Buffer
= InfoBuffer
;
2720 if (!NT_SUCCESS(Status
))
2722 if (InfoBuffer
!= NULL
)
2724 midl_user_free(InfoBuffer
);
2733 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
2734 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
2736 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
2741 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
2742 if (InfoBuffer
== NULL
)
2743 return STATUS_INSUFFICIENT_RESOURCES
;
2745 Status
= SampGetObjectAttributeString(GroupObject
,
2747 &InfoBuffer
->AdminComment
.AdminComment
);
2748 if (!NT_SUCCESS(Status
))
2750 TRACE("Status 0x%08lx\n", Status
);
2754 *Buffer
= InfoBuffer
;
2757 if (!NT_SUCCESS(Status
))
2759 if (InfoBuffer
!= NULL
)
2761 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
2762 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
2764 midl_user_free(InfoBuffer
);
2775 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
2776 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
2777 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
2779 PSAM_DB_OBJECT GroupObject
;
2782 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
2783 GroupHandle
, GroupInformationClass
, Buffer
);
2785 /* Validate the group handle */
2786 Status
= SampValidateDbObject(GroupHandle
,
2788 GROUP_READ_INFORMATION
,
2790 if (!NT_SUCCESS(Status
))
2793 switch (GroupInformationClass
)
2795 case GroupGeneralInformation
:
2796 Status
= SampQueryGroupGeneral(GroupObject
,
2800 case GroupNameInformation
:
2801 Status
= SampQueryGroupName(GroupObject
,
2805 case GroupAttributeInformation
:
2806 Status
= SampQueryGroupAttribute(GroupObject
,
2810 case GroupAdminCommentInformation
:
2811 Status
= SampQueryGroupAdminComment(GroupObject
,
2816 Status
= STATUS_INVALID_INFO_CLASS
;
2825 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
2826 PSAMPR_GROUP_INFO_BUFFER Buffer
)
2828 SAM_GROUP_FIXED_DATA FixedData
;
2832 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
2833 Status
= SampGetObjectAttribute(GroupObject
,
2838 if (!NT_SUCCESS(Status
))
2841 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
2843 Status
= SampSetObjectAttribute(GroupObject
,
2857 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
2858 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
2859 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
2861 PSAM_DB_OBJECT GroupObject
;
2864 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
2865 GroupHandle
, GroupInformationClass
, Buffer
);
2867 /* Validate the group handle */
2868 Status
= SampValidateDbObject(GroupHandle
,
2870 GROUP_WRITE_ACCOUNT
,
2872 if (!NT_SUCCESS(Status
))
2875 switch (GroupInformationClass
)
2877 case GroupNameInformation
:
2878 Status
= SampSetObjectAttribute(GroupObject
,
2881 Buffer
->Name
.Name
.Buffer
,
2882 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
2885 case GroupAttributeInformation
:
2886 Status
= SampSetGroupAttribute(GroupObject
,
2890 case GroupAdminCommentInformation
:
2891 Status
= SampSetObjectAttribute(GroupObject
,
2894 Buffer
->AdminComment
.AdminComment
.Buffer
,
2895 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
2899 Status
= STATUS_INVALID_INFO_CLASS
;
2910 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
2911 IN
unsigned long MemberId
,
2912 IN
unsigned long Attributes
)
2915 return STATUS_NOT_IMPLEMENTED
;
2921 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
2924 return STATUS_NOT_IMPLEMENTED
;
2930 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
2931 IN
unsigned long MemberId
)
2934 return STATUS_NOT_IMPLEMENTED
;
2940 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
2941 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
2944 return STATUS_NOT_IMPLEMENTED
;
2950 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
2951 IN
unsigned long MemberId
,
2952 IN
unsigned long Attributes
)
2955 return STATUS_NOT_IMPLEMENTED
;
2962 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
2963 IN ACCESS_MASK DesiredAccess
,
2965 OUT SAMPR_HANDLE
*AliasHandle
)
2967 PSAM_DB_OBJECT DomainObject
;
2968 PSAM_DB_OBJECT AliasObject
;
2972 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
2973 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
2975 /* Validate the domain handle */
2976 Status
= SampValidateDbObject(DomainHandle
,
2980 if (!NT_SUCCESS(Status
))
2982 TRACE("failed with status 0x%08lx\n", Status
);
2986 /* Convert the RID into a string (hex) */
2987 swprintf(szRid
, L
"%08lX", AliasId
);
2989 /* Create the alias object */
2990 Status
= SampOpenDbObject(DomainObject
,
2996 if (!NT_SUCCESS(Status
))
2998 TRACE("failed with status 0x%08lx\n", Status
);
3002 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
3004 return STATUS_SUCCESS
;
3009 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
3010 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3012 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3013 HANDLE MembersKeyHandle
= NULL
;
3018 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3019 if (InfoBuffer
== NULL
)
3020 return STATUS_INSUFFICIENT_RESOURCES
;
3022 Status
= SampGetObjectAttributeString(AliasObject
,
3024 &InfoBuffer
->General
.Name
);
3025 if (!NT_SUCCESS(Status
))
3027 TRACE("Status 0x%08lx\n", Status
);
3031 Status
= SampGetObjectAttributeString(AliasObject
,
3033 &InfoBuffer
->General
.AdminComment
);
3034 if (!NT_SUCCESS(Status
))
3036 TRACE("Status 0x%08lx\n", Status
);
3040 /* Open the Members subkey */
3041 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
3045 if (!NT_SUCCESS(Status
))
3047 TRACE("Status 0x%08lx\n", Status
);
3051 /* Retrieve the number of members of the alias */
3052 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3054 &InfoBuffer
->General
.MemberCount
);
3055 if (!NT_SUCCESS(Status
))
3057 TRACE("Status 0x%08lx\n", Status
);
3061 *Buffer
= InfoBuffer
;
3064 if (MembersKeyHandle
!= NULL
)
3065 SampRegCloseKey(MembersKeyHandle
);
3067 if (!NT_SUCCESS(Status
))
3069 if (InfoBuffer
!= NULL
)
3071 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3072 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3074 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3075 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3077 midl_user_free(InfoBuffer
);
3086 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
3087 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3089 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3094 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3095 if (InfoBuffer
== NULL
)
3096 return STATUS_INSUFFICIENT_RESOURCES
;
3098 Status
= SampGetObjectAttributeString(AliasObject
,
3100 &InfoBuffer
->Name
.Name
);
3101 if (!NT_SUCCESS(Status
))
3103 TRACE("Status 0x%08lx\n", Status
);
3107 *Buffer
= InfoBuffer
;
3110 if (!NT_SUCCESS(Status
))
3112 if (InfoBuffer
!= NULL
)
3114 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3115 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3117 midl_user_free(InfoBuffer
);
3126 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
3127 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3129 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
3134 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
3135 if (InfoBuffer
== NULL
)
3136 return STATUS_INSUFFICIENT_RESOURCES
;
3138 Status
= SampGetObjectAttributeString(AliasObject
,
3140 &InfoBuffer
->AdminComment
.AdminComment
);
3141 if (!NT_SUCCESS(Status
))
3143 TRACE("Status 0x%08lx\n", Status
);
3147 *Buffer
= InfoBuffer
;
3150 if (!NT_SUCCESS(Status
))
3152 if (InfoBuffer
!= NULL
)
3154 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3155 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3157 midl_user_free(InfoBuffer
);
3168 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
3169 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
3170 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
3172 PSAM_DB_OBJECT AliasObject
;
3175 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
3176 AliasHandle
, AliasInformationClass
, Buffer
);
3178 /* Validate the alias handle */
3179 Status
= SampValidateDbObject(AliasHandle
,
3181 ALIAS_READ_INFORMATION
,
3183 if (!NT_SUCCESS(Status
))
3186 switch (AliasInformationClass
)
3188 case AliasGeneralInformation
:
3189 Status
= SampQueryAliasGeneral(AliasObject
,
3193 case AliasNameInformation
:
3194 Status
= SampQueryAliasName(AliasObject
,
3198 case AliasAdminCommentInformation
:
3199 Status
= SampQueryAliasAdminComment(AliasObject
,
3204 Status
= STATUS_INVALID_INFO_CLASS
;
3215 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
3216 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
3217 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
3219 PSAM_DB_OBJECT AliasObject
;
3222 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
3223 AliasHandle
, AliasInformationClass
, Buffer
);
3225 /* Validate the alias handle */
3226 Status
= SampValidateDbObject(AliasHandle
,
3228 ALIAS_WRITE_ACCOUNT
,
3230 if (!NT_SUCCESS(Status
))
3233 switch (AliasInformationClass
)
3235 case AliasNameInformation
:
3236 Status
= SampSetObjectAttribute(AliasObject
,
3239 Buffer
->Name
.Name
.Buffer
,
3240 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3243 case AliasAdminCommentInformation
:
3244 Status
= SampSetObjectAttribute(AliasObject
,
3247 Buffer
->AdminComment
.AdminComment
.Buffer
,
3248 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
3252 Status
= STATUS_INVALID_INFO_CLASS
;
3263 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
3266 return STATUS_NOT_IMPLEMENTED
;
3273 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
3274 IN PRPC_SID MemberId
)
3276 PSAM_DB_OBJECT AliasObject
;
3277 LPWSTR MemberIdString
= NULL
;
3278 HANDLE MembersKeyHandle
= NULL
;
3279 HANDLE MemberKeyHandle
= NULL
;
3280 ULONG MemberIdLength
;
3283 TRACE("SamrAddMemberToAlias(%p %p)\n",
3284 AliasHandle
, MemberId
);
3286 /* Validate the alias handle */
3287 Status
= SampValidateDbObject(AliasHandle
,
3291 if (!NT_SUCCESS(Status
))
3293 TRACE("failed with status 0x%08lx\n", Status
);
3297 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
3298 TRACE("Member SID: %S\n", MemberIdString
);
3300 MemberIdLength
= RtlLengthSid(MemberId
);
3302 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
3306 if (!NT_SUCCESS(Status
))
3308 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
3312 Status
= SampRegSetValue(MembersKeyHandle
,
3317 if (!NT_SUCCESS(Status
))
3319 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
3323 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
3327 if (!NT_SUCCESS(Status
))
3329 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
3333 Status
= SampRegSetValue(MemberKeyHandle
,
3338 if (!NT_SUCCESS(Status
))
3340 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
3345 if (MemberKeyHandle
!= NULL
)
3346 SampRegCloseKey(MemberKeyHandle
);
3348 if (MembersKeyHandle
!= NULL
)
3349 SampRegCloseKey(MembersKeyHandle
);
3351 if (MemberIdString
!= NULL
)
3352 LocalFree(MemberIdString
);
3361 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
3362 IN PRPC_SID MemberId
)
3365 return STATUS_NOT_IMPLEMENTED
;
3371 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
3372 OUT PSAMPR_PSID_ARRAY_OUT Members
)
3374 PSAM_DB_OBJECT AliasObject
;
3375 HANDLE MembersKeyHandle
= NULL
;
3376 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
3377 ULONG ValueCount
= 0;
3382 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
3383 AliasHandle
, Members
);
3385 /* Validate the alias handle */
3386 Status
= SampValidateDbObject(AliasHandle
,
3390 if (!NT_SUCCESS(Status
))
3392 ERR("failed with status 0x%08lx\n", Status
);
3396 /* Open the members key of the alias objct */
3397 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
3401 if (!NT_SUCCESS(Status
))
3403 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
3407 /* Get the number of members */
3408 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
3411 if (!NT_SUCCESS(Status
))
3413 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
3417 /* Allocate the member array */
3418 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
3419 if (MemberArray
== NULL
)
3421 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3425 /* Enumerate the members */
3429 /* Get the size of the next SID */
3431 Status
= SampRegEnumerateValue(MembersKeyHandle
,
3438 if (!NT_SUCCESS(Status
))
3440 if (Status
== STATUS_NO_MORE_ENTRIES
)
3441 Status
= STATUS_SUCCESS
;
3445 /* Allocate a buffer for the SID */
3446 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
3447 if (MemberArray
[Index
].SidPointer
== NULL
)
3449 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3453 /* Read the SID into the buffer */
3454 Status
= SampRegEnumerateValue(MembersKeyHandle
,
3459 (PVOID
)MemberArray
[Index
].SidPointer
,
3461 if (!NT_SUCCESS(Status
))
3469 /* Return the number of members and the member array */
3470 if (NT_SUCCESS(Status
))
3472 Members
->Count
= ValueCount
;
3473 Members
->Sids
= MemberArray
;
3477 /* Clean up the members array and the SID buffers if something failed */
3478 if (!NT_SUCCESS(Status
))
3480 if (MemberArray
!= NULL
)
3482 for (Index
= 0; Index
< ValueCount
; Index
++)
3484 if (MemberArray
[Index
].SidPointer
!= NULL
)
3485 midl_user_free(MemberArray
[Index
].SidPointer
);
3488 midl_user_free(MemberArray
);
3492 /* Close the members key */
3493 if (MembersKeyHandle
!= NULL
)
3494 SampRegCloseKey(MembersKeyHandle
);
3502 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
3503 IN ACCESS_MASK DesiredAccess
,
3504 IN
unsigned long UserId
,
3505 OUT SAMPR_HANDLE
*UserHandle
)
3507 PSAM_DB_OBJECT DomainObject
;
3508 PSAM_DB_OBJECT UserObject
;
3512 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
3513 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
3515 /* Validate the domain handle */
3516 Status
= SampValidateDbObject(DomainHandle
,
3520 if (!NT_SUCCESS(Status
))
3522 TRACE("failed with status 0x%08lx\n", Status
);
3526 /* Convert the RID into a string (hex) */
3527 swprintf(szRid
, L
"%08lX", UserId
);
3529 /* Create the user object */
3530 Status
= SampOpenDbObject(DomainObject
,
3536 if (!NT_SUCCESS(Status
))
3538 TRACE("failed with status 0x%08lx\n", Status
);
3542 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
3544 return STATUS_SUCCESS
;
3550 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
3553 return STATUS_NOT_IMPLEMENTED
;
3559 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
3560 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3562 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3563 SAM_USER_FIXED_DATA FixedData
;
3569 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3570 if (InfoBuffer
== NULL
)
3571 return STATUS_INSUFFICIENT_RESOURCES
;
3573 Length
= sizeof(SAM_USER_FIXED_DATA
);
3574 Status
= SampGetObjectAttribute(UserObject
,
3579 if (!NT_SUCCESS(Status
))
3582 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
3584 /* Get the Name string */
3585 Status
= SampGetObjectAttributeString(UserObject
,
3587 &InfoBuffer
->General
.UserName
);
3588 if (!NT_SUCCESS(Status
))
3590 TRACE("Status 0x%08lx\n", Status
);
3594 /* Get the FullName string */
3595 Status
= SampGetObjectAttributeString(UserObject
,
3597 &InfoBuffer
->General
.FullName
);
3598 if (!NT_SUCCESS(Status
))
3600 TRACE("Status 0x%08lx\n", Status
);
3604 /* Get the AdminComment string */
3605 Status
= SampGetObjectAttributeString(UserObject
,
3607 &InfoBuffer
->General
.AdminComment
);
3608 if (!NT_SUCCESS(Status
))
3610 TRACE("Status 0x%08lx\n", Status
);
3614 /* Get the UserComment string */
3615 Status
= SampGetObjectAttributeString(UserObject
,
3617 &InfoBuffer
->General
.UserComment
);
3618 if (!NT_SUCCESS(Status
))
3620 TRACE("Status 0x%08lx\n", Status
);
3624 *Buffer
= InfoBuffer
;
3627 if (!NT_SUCCESS(Status
))
3629 if (InfoBuffer
!= NULL
)
3631 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
3632 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
3634 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
3635 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
3637 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3638 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3640 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
3641 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
3643 midl_user_free(InfoBuffer
);
3653 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
3654 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3656 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3657 SAM_USER_FIXED_DATA FixedData
;
3663 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3664 if (InfoBuffer
== NULL
)
3665 return STATUS_INSUFFICIENT_RESOURCES
;
3667 Length
= sizeof(SAM_USER_FIXED_DATA
);
3668 Status
= SampGetObjectAttribute(UserObject
,
3673 if (!NT_SUCCESS(Status
))
3676 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
3677 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
3679 /* Get the UserComment string */
3680 Status
= SampGetObjectAttributeString(UserObject
,
3682 &InfoBuffer
->Preferences
.UserComment
);
3683 if (!NT_SUCCESS(Status
))
3685 TRACE("Status 0x%08lx\n", Status
);
3689 *Buffer
= InfoBuffer
;
3692 if (!NT_SUCCESS(Status
))
3694 if (InfoBuffer
!= NULL
)
3696 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
3697 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
3699 midl_user_free(InfoBuffer
);
3709 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
3710 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3712 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3713 SAM_USER_FIXED_DATA FixedData
;
3719 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3720 if (InfoBuffer
== NULL
)
3721 return STATUS_INSUFFICIENT_RESOURCES
;
3723 Length
= sizeof(SAM_USER_FIXED_DATA
);
3724 Status
= SampGetObjectAttribute(UserObject
,
3729 if (!NT_SUCCESS(Status
))
3732 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
3733 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
3734 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
3735 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
3736 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
3737 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
3738 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
3739 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
3740 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
3741 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
3742 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
3744 // OLD_LARGE_INTEGER PasswordCanChange;
3745 // OLD_LARGE_INTEGER PasswordMustChange;
3747 /* Get the Name string */
3748 Status
= SampGetObjectAttributeString(UserObject
,
3750 &InfoBuffer
->Logon
.UserName
);
3751 if (!NT_SUCCESS(Status
))
3753 TRACE("Status 0x%08lx\n", Status
);
3757 /* Get the FullName string */
3758 Status
= SampGetObjectAttributeString(UserObject
,
3760 &InfoBuffer
->Logon
.FullName
);
3761 if (!NT_SUCCESS(Status
))
3763 TRACE("Status 0x%08lx\n", Status
);
3767 /* Get the HomeDirectory string */
3768 Status
= SampGetObjectAttributeString(UserObject
,
3770 &InfoBuffer
->Logon
.HomeDirectory
);
3771 if (!NT_SUCCESS(Status
))
3773 TRACE("Status 0x%08lx\n", Status
);
3777 /* Get the HomeDirectoryDrive string */
3778 Status
= SampGetObjectAttributeString(UserObject
,
3779 L
"HomeDirectoryDrive",
3780 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
3781 if (!NT_SUCCESS(Status
))
3783 TRACE("Status 0x%08lx\n", Status
);
3787 /* Get the ScriptPath string */
3788 Status
= SampGetObjectAttributeString(UserObject
,
3790 &InfoBuffer
->Logon
.ScriptPath
);
3791 if (!NT_SUCCESS(Status
))
3793 TRACE("Status 0x%08lx\n", Status
);
3797 /* Get the ProfilePath string */
3798 Status
= SampGetObjectAttributeString(UserObject
,
3800 &InfoBuffer
->Logon
.ProfilePath
);
3801 if (!NT_SUCCESS(Status
))
3803 TRACE("Status 0x%08lx\n", Status
);
3807 /* Get the WorkStations string */
3808 Status
= SampGetObjectAttributeString(UserObject
,
3810 &InfoBuffer
->Logon
.WorkStations
);
3811 if (!NT_SUCCESS(Status
))
3813 TRACE("Status 0x%08lx\n", Status
);
3817 /* FIXME: LogonHours */
3819 *Buffer
= InfoBuffer
;
3822 if (!NT_SUCCESS(Status
))
3824 if (InfoBuffer
!= NULL
)
3826 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
3827 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
3829 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
3830 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
3832 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
3833 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
3835 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
3836 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
3838 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
3839 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
3841 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
3842 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
3844 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
3845 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
3847 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
3848 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
3850 midl_user_free(InfoBuffer
);
3862 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
3863 PSAMPR_USER_INFO_BUFFER
*Buffer
)
3865 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
3866 SAM_USER_FIXED_DATA FixedData
;
3872 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
3873 if (InfoBuffer
== NULL
)
3874 return STATUS_INSUFFICIENT_RESOURCES
;
3876 Length
= sizeof(SAM_USER_FIXED_DATA
);
3877 Status
= SampGetObjectAttribute(UserObject
,
3882 if (!NT_SUCCESS(Status
))
3885 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
3886 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
3887 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
3888 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
3889 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
3890 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
3891 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
3892 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
3893 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
3894 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
3895 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
3896 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
3897 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
3899 /* Get the Name string */
3900 Status
= SampGetObjectAttributeString(UserObject
,
3902 &InfoBuffer
->Account
.UserName
);
3903 if (!NT_SUCCESS(Status
))
3905 TRACE("Status 0x%08lx\n", Status
);
3909 /* Get the FullName string */
3910 Status
= SampGetObjectAttributeString(UserObject
,
3912 &InfoBuffer
->Account
.FullName
);
3913 if (!NT_SUCCESS(Status
))
3915 TRACE("Status 0x%08lx\n", Status
);
3919 /* Get the HomeDirectory string */
3920 Status
= SampGetObjectAttributeString(UserObject
,
3922 &InfoBuffer
->Account
.HomeDirectory
);
3923 if (!NT_SUCCESS(Status
))
3925 TRACE("Status 0x%08lx\n", Status
);
3929 /* Get the HomeDirectoryDrive string */
3930 Status
= SampGetObjectAttributeString(UserObject
,
3931 L
"HomeDirectoryDrive",
3932 &InfoBuffer
->Account
.HomeDirectoryDrive
);
3933 if (!NT_SUCCESS(Status
))
3935 TRACE("Status 0x%08lx\n", Status
);
3939 /* Get the ScriptPath string */
3940 Status
= SampGetObjectAttributeString(UserObject
,
3942 &InfoBuffer
->Account
.ScriptPath
);
3943 if (!NT_SUCCESS(Status
))
3945 TRACE("Status 0x%08lx\n", Status
);
3949 /* Get the ProfilePath string */
3950 Status
= SampGetObjectAttributeString(UserObject
,
3952 &InfoBuffer
->Account
.ProfilePath
);
3953 if (!NT_SUCCESS(Status
))
3955 TRACE("Status 0x%08lx\n", Status
);
3959 /* Get the AdminComment string */
3960 Status
= SampGetObjectAttributeString(UserObject
,
3962 &InfoBuffer
->Account
.AdminComment
);
3963 if (!NT_SUCCESS(Status
))
3965 TRACE("Status 0x%08lx\n", Status
);
3969 /* Get the WorkStations string */
3970 Status
= SampGetObjectAttributeString(UserObject
,
3972 &InfoBuffer
->Account
.WorkStations
);
3973 if (!NT_SUCCESS(Status
))
3975 TRACE("Status 0x%08lx\n", Status
);
3979 /* FIXME: LogonHours */
3981 *Buffer
= InfoBuffer
;
3984 if (!NT_SUCCESS(Status
))
3986 if (InfoBuffer
!= NULL
)
3988 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
3989 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
3991 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
3992 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
3994 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
3995 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
3997 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
3998 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
4000 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
4001 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
4003 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
4004 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
4006 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
4007 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
4009 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
4010 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
4012 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
4013 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
4015 midl_user_free(InfoBuffer
);
4022 /* FIXME: SampQueryUserLogonHours */
4026 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
4027 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4029 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4034 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4035 if (InfoBuffer
== NULL
)
4036 return STATUS_INSUFFICIENT_RESOURCES
;
4038 /* Get the Name string */
4039 Status
= SampGetObjectAttributeString(UserObject
,
4041 &InfoBuffer
->Name
.UserName
);
4042 if (!NT_SUCCESS(Status
))
4044 TRACE("Status 0x%08lx\n", Status
);
4048 /* Get the FullName string */
4049 Status
= SampGetObjectAttributeString(UserObject
,
4051 &InfoBuffer
->Name
.FullName
);
4052 if (!NT_SUCCESS(Status
))
4054 TRACE("Status 0x%08lx\n", Status
);
4058 *Buffer
= InfoBuffer
;
4061 if (!NT_SUCCESS(Status
))
4063 if (InfoBuffer
!= NULL
)
4065 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
4066 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
4068 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
4069 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
4071 midl_user_free(InfoBuffer
);
4080 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
4081 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4083 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4088 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4089 if (InfoBuffer
== NULL
)
4090 return STATUS_INSUFFICIENT_RESOURCES
;
4092 /* Get the Name string */
4093 Status
= SampGetObjectAttributeString(UserObject
,
4095 &InfoBuffer
->AccountName
.UserName
);
4096 if (!NT_SUCCESS(Status
))
4098 TRACE("Status 0x%08lx\n", Status
);
4102 *Buffer
= InfoBuffer
;
4105 if (!NT_SUCCESS(Status
))
4107 if (InfoBuffer
!= NULL
)
4109 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
4110 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
4112 midl_user_free(InfoBuffer
);
4121 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
4122 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4124 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4129 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4130 if (InfoBuffer
== NULL
)
4131 return STATUS_INSUFFICIENT_RESOURCES
;
4133 /* Get the FullName string */
4134 Status
= SampGetObjectAttributeString(UserObject
,
4136 &InfoBuffer
->FullName
.FullName
);
4137 if (!NT_SUCCESS(Status
))
4139 TRACE("Status 0x%08lx\n", Status
);
4143 *Buffer
= InfoBuffer
;
4146 if (!NT_SUCCESS(Status
))
4148 if (InfoBuffer
!= NULL
)
4150 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
4151 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
4153 midl_user_free(InfoBuffer
);
4163 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
4164 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4166 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4167 SAM_USER_FIXED_DATA FixedData
;
4173 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4174 if (InfoBuffer
== NULL
)
4175 return STATUS_INSUFFICIENT_RESOURCES
;
4177 Length
= sizeof(SAM_USER_FIXED_DATA
);
4178 Status
= SampGetObjectAttribute(UserObject
,
4183 if (!NT_SUCCESS(Status
))
4186 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
4188 *Buffer
= InfoBuffer
;
4191 if (!NT_SUCCESS(Status
))
4193 if (InfoBuffer
!= NULL
)
4195 midl_user_free(InfoBuffer
);
4204 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
4205 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4207 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4212 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4213 if (InfoBuffer
== NULL
)
4214 return STATUS_INSUFFICIENT_RESOURCES
;
4216 /* Get the HomeDirectory string */
4217 Status
= SampGetObjectAttributeString(UserObject
,
4219 &InfoBuffer
->Home
.HomeDirectory
);
4220 if (!NT_SUCCESS(Status
))
4222 TRACE("Status 0x%08lx\n", Status
);
4226 /* Get the HomeDirectoryDrive string */
4227 Status
= SampGetObjectAttributeString(UserObject
,
4228 L
"HomeDirectoryDrive",
4229 &InfoBuffer
->Home
.HomeDirectoryDrive
);
4230 if (!NT_SUCCESS(Status
))
4232 TRACE("Status 0x%08lx\n", Status
);
4236 *Buffer
= InfoBuffer
;
4239 if (!NT_SUCCESS(Status
))
4241 if (InfoBuffer
!= NULL
)
4243 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
4244 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
4246 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
4247 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
4249 midl_user_free(InfoBuffer
);
4258 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
4259 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4261 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4266 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4267 if (InfoBuffer
== NULL
)
4268 return STATUS_INSUFFICIENT_RESOURCES
;
4270 /* Get the ScriptPath string */
4271 Status
= SampGetObjectAttributeString(UserObject
,
4273 &InfoBuffer
->Script
.ScriptPath
);
4274 if (!NT_SUCCESS(Status
))
4276 TRACE("Status 0x%08lx\n", Status
);
4280 *Buffer
= InfoBuffer
;
4283 if (!NT_SUCCESS(Status
))
4285 if (InfoBuffer
!= NULL
)
4287 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
4288 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
4290 midl_user_free(InfoBuffer
);
4299 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
4300 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4302 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4307 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4308 if (InfoBuffer
== NULL
)
4309 return STATUS_INSUFFICIENT_RESOURCES
;
4311 /* Get the ProfilePath string */
4312 Status
= SampGetObjectAttributeString(UserObject
,
4314 &InfoBuffer
->Profile
.ProfilePath
);
4315 if (!NT_SUCCESS(Status
))
4317 TRACE("Status 0x%08lx\n", Status
);
4321 *Buffer
= InfoBuffer
;
4324 if (!NT_SUCCESS(Status
))
4326 if (InfoBuffer
!= NULL
)
4328 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
4329 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
4331 midl_user_free(InfoBuffer
);
4340 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
4341 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4343 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4348 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4349 if (InfoBuffer
== NULL
)
4350 return STATUS_INSUFFICIENT_RESOURCES
;
4352 /* Get the AdminComment string */
4353 Status
= SampGetObjectAttributeString(UserObject
,
4355 &InfoBuffer
->AdminComment
.AdminComment
);
4356 if (!NT_SUCCESS(Status
))
4358 TRACE("Status 0x%08lx\n", Status
);
4362 *Buffer
= InfoBuffer
;
4365 if (!NT_SUCCESS(Status
))
4367 if (InfoBuffer
!= NULL
)
4369 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4370 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4372 midl_user_free(InfoBuffer
);
4381 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
4382 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4384 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4389 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4390 if (InfoBuffer
== NULL
)
4391 return STATUS_INSUFFICIENT_RESOURCES
;
4393 /* Get the WorkStations string */
4394 Status
= SampGetObjectAttributeString(UserObject
,
4396 &InfoBuffer
->WorkStations
.WorkStations
);
4397 if (!NT_SUCCESS(Status
))
4399 TRACE("Status 0x%08lx\n", Status
);
4403 *Buffer
= InfoBuffer
;
4406 if (!NT_SUCCESS(Status
))
4408 if (InfoBuffer
!= NULL
)
4410 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
4411 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
4413 midl_user_free(InfoBuffer
);
4423 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
4424 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4426 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4427 SAM_USER_FIXED_DATA FixedData
;
4433 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4434 if (InfoBuffer
== NULL
)
4435 return STATUS_INSUFFICIENT_RESOURCES
;
4437 Length
= sizeof(SAM_USER_FIXED_DATA
);
4438 Status
= SampGetObjectAttribute(UserObject
,
4443 if (!NT_SUCCESS(Status
))
4446 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
4448 *Buffer
= InfoBuffer
;
4451 if (!NT_SUCCESS(Status
))
4453 if (InfoBuffer
!= NULL
)
4455 midl_user_free(InfoBuffer
);
4465 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
4466 PSAMPR_USER_INFO_BUFFER
*Buffer
)
4468 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
4469 SAM_USER_FIXED_DATA FixedData
;
4475 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
4476 if (InfoBuffer
== NULL
)
4477 return STATUS_INSUFFICIENT_RESOURCES
;
4479 Length
= sizeof(SAM_USER_FIXED_DATA
);
4480 Status
= SampGetObjectAttribute(UserObject
,
4485 if (!NT_SUCCESS(Status
))
4488 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
4489 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
4491 *Buffer
= InfoBuffer
;
4494 if (!NT_SUCCESS(Status
))
4496 if (InfoBuffer
!= NULL
)
4498 midl_user_free(InfoBuffer
);
4509 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
4510 IN USER_INFORMATION_CLASS UserInformationClass
,
4511 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
4513 PSAM_DB_OBJECT UserObject
;
4514 ACCESS_MASK DesiredAccess
;
4517 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
4518 UserHandle
, UserInformationClass
, Buffer
);
4520 switch (UserInformationClass
)
4522 case UserGeneralInformation
:
4523 case UserNameInformation
:
4524 case UserAccountNameInformation
:
4525 case UserFullNameInformation
:
4526 case UserPrimaryGroupInformation
:
4527 case UserAdminCommentInformation
:
4528 DesiredAccess
= USER_READ_GENERAL
;
4531 case UserLogonHoursInformation
:
4532 case UserHomeInformation
:
4533 case UserScriptInformation
:
4534 case UserProfileInformation
:
4535 case UserWorkStationsInformation
:
4536 DesiredAccess
= USER_READ_LOGON
;
4539 case UserControlInformation
:
4540 case UserExpiresInformation
:
4541 DesiredAccess
= USER_READ_ACCOUNT
;
4544 case UserPreferencesInformation
:
4545 DesiredAccess
= USER_READ_GENERAL
|
4546 USER_READ_PREFERENCES
;
4549 case UserLogonInformation
:
4550 case UserAccountInformation
:
4551 DesiredAccess
= USER_READ_GENERAL
|
4552 USER_READ_PREFERENCES
|
4558 return STATUS_INVALID_INFO_CLASS
;
4561 /* Validate the domain handle */
4562 Status
= SampValidateDbObject(UserHandle
,
4566 if (!NT_SUCCESS(Status
))
4568 TRACE("failed with status 0x%08lx\n", Status
);
4572 switch (UserInformationClass
)
4574 case UserGeneralInformation
:
4575 Status
= SampQueryUserGeneral(UserObject
,
4579 case UserPreferencesInformation
:
4580 Status
= SampQueryUserPreferences(UserObject
,
4584 case UserLogonInformation
:
4585 Status
= SampQueryUserLogon(UserObject
,
4589 // case UserLogonHoursInformation:
4590 // Status = SampQueryUserLogonHours(UserObject,
4594 case UserAccountInformation
:
4595 Status
= SampQueryUserAccount(UserObject
,
4599 case UserNameInformation
:
4600 Status
= SampQueryUserName(UserObject
,
4604 case UserAccountNameInformation
:
4605 Status
= SampQueryUserAccountName(UserObject
,
4609 case UserFullNameInformation
:
4610 Status
= SampQueryUserFullName(UserObject
,
4614 case UserPrimaryGroupInformation
:
4615 Status
= SampQueryUserPrimaryGroup(UserObject
,
4619 case UserHomeInformation
:
4620 Status
= SampQueryUserHome(UserObject
,
4623 case UserScriptInformation
:
4624 Status
= SampQueryUserScript(UserObject
,
4628 case UserProfileInformation
:
4629 Status
= SampQueryUserProfile(UserObject
,
4633 case UserAdminCommentInformation
:
4634 Status
= SampQueryUserAdminComment(UserObject
,
4638 case UserWorkStationsInformation
:
4639 Status
= SampQueryUserWorkStations(UserObject
,
4643 case UserControlInformation
:
4644 Status
= SampQueryUserControl(UserObject
,
4648 case UserExpiresInformation
:
4649 Status
= SampQueryUserExpires(UserObject
,
4654 Status
= STATUS_INVALID_INFO_CLASS
;
4662 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
4663 PSAMPR_USER_INFO_BUFFER Buffer
)
4665 SAM_USER_FIXED_DATA FixedData
;
4669 Length
= sizeof(SAM_USER_FIXED_DATA
);
4670 Status
= SampGetObjectAttribute(UserObject
,
4675 if (!NT_SUCCESS(Status
))
4678 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
4680 Status
= SampSetObjectAttribute(UserObject
,
4685 if (!NT_SUCCESS(Status
))
4688 Status
= SampSetObjectAttribute(UserObject
,
4691 Buffer
->General
.UserName
.Buffer
,
4692 Buffer
->General
.UserName
.MaximumLength
);
4693 if (!NT_SUCCESS(Status
))
4696 Status
= SampSetObjectAttribute(UserObject
,
4699 Buffer
->General
.FullName
.Buffer
,
4700 Buffer
->General
.FullName
.MaximumLength
);
4701 if (!NT_SUCCESS(Status
))
4704 Status
= SampSetObjectAttribute(UserObject
,
4707 Buffer
->General
.AdminComment
.Buffer
,
4708 Buffer
->General
.AdminComment
.MaximumLength
);
4709 if (!NT_SUCCESS(Status
))
4712 Status
= SampSetObjectAttribute(UserObject
,
4715 Buffer
->General
.UserComment
.Buffer
,
4716 Buffer
->General
.UserComment
.MaximumLength
);
4724 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
4725 PSAMPR_USER_INFO_BUFFER Buffer
)
4727 SAM_USER_FIXED_DATA FixedData
;
4731 Length
= sizeof(SAM_USER_FIXED_DATA
);
4732 Status
= SampGetObjectAttribute(UserObject
,
4737 if (!NT_SUCCESS(Status
))
4740 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
4741 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
4743 Status
= SampSetObjectAttribute(UserObject
,
4748 if (!NT_SUCCESS(Status
))
4751 Status
= SampSetObjectAttribute(UserObject
,
4754 Buffer
->Preferences
.UserComment
.Buffer
,
4755 Buffer
->Preferences
.UserComment
.MaximumLength
);
4763 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
4764 PSAMPR_USER_INFO_BUFFER Buffer
)
4766 SAM_USER_FIXED_DATA FixedData
;
4770 Length
= sizeof(SAM_USER_FIXED_DATA
);
4771 Status
= SampGetObjectAttribute(UserObject
,
4776 if (!NT_SUCCESS(Status
))
4779 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
4781 Status
= SampSetObjectAttribute(UserObject
,
4793 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
4794 PSAMPR_USER_INFO_BUFFER Buffer
)
4796 SAM_USER_FIXED_DATA FixedData
;
4800 Length
= sizeof(SAM_USER_FIXED_DATA
);
4801 Status
= SampGetObjectAttribute(UserObject
,
4806 if (!NT_SUCCESS(Status
))
4809 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
4811 Status
= SampSetObjectAttribute(UserObject
,
4823 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
4824 PSAMPR_USER_INFO_BUFFER Buffer
)
4826 SAM_USER_FIXED_DATA FixedData
;
4830 Length
= sizeof(SAM_USER_FIXED_DATA
);
4831 Status
= SampGetObjectAttribute(UserObject
,
4836 if (!NT_SUCCESS(Status
))
4839 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
4840 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
4842 Status
= SampSetObjectAttribute(UserObject
,
4856 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
4857 IN USER_INFORMATION_CLASS UserInformationClass
,
4858 IN PSAMPR_USER_INFO_BUFFER Buffer
)
4860 PSAM_DB_OBJECT UserObject
;
4861 ACCESS_MASK DesiredAccess
;
4864 TRACE("SamrSetInformationUser(%p %lu %p)\n",
4865 UserHandle
, UserInformationClass
, Buffer
);
4867 switch (UserInformationClass
)
4869 case UserLogonHoursInformation
:
4870 case UserNameInformation
:
4871 case UserAccountNameInformation
:
4872 case UserFullNameInformation
:
4873 case UserPrimaryGroupInformation
:
4874 case UserHomeInformation
:
4875 case UserScriptInformation
:
4876 case UserProfileInformation
:
4877 case UserAdminCommentInformation
:
4878 case UserWorkStationsInformation
:
4879 case UserControlInformation
:
4880 case UserExpiresInformation
:
4881 DesiredAccess
= USER_WRITE_ACCOUNT
;
4884 case UserGeneralInformation
:
4885 DesiredAccess
= USER_WRITE_ACCOUNT
|
4886 USER_WRITE_PREFERENCES
;
4889 case UserPreferencesInformation
:
4890 DesiredAccess
= USER_WRITE_PREFERENCES
;
4893 case UserSetPasswordInformation
:
4894 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
4898 return STATUS_INVALID_INFO_CLASS
;
4901 /* Validate the domain handle */
4902 Status
= SampValidateDbObject(UserHandle
,
4906 if (!NT_SUCCESS(Status
))
4908 TRACE("failed with status 0x%08lx\n", Status
);
4912 switch (UserInformationClass
)
4914 case UserGeneralInformation
:
4915 Status
= SampSetUserGeneral(UserObject
,
4919 case UserPreferencesInformation
:
4920 Status
= SampSetUserPreferences(UserObject
,
4924 case UserLogonHoursInformation:
4925 Status = SampSetUserLogonHours(UserObject,
4929 case UserNameInformation
:
4930 Status
= SampSetObjectAttribute(UserObject
,
4933 Buffer
->Name
.UserName
.Buffer
,
4934 Buffer
->Name
.UserName
.MaximumLength
);
4935 if (!NT_SUCCESS(Status
))
4938 Status
= SampSetObjectAttribute(UserObject
,
4941 Buffer
->Name
.FullName
.Buffer
,
4942 Buffer
->Name
.FullName
.MaximumLength
);
4945 case UserAccountNameInformation
:
4946 Status
= SampSetObjectAttribute(UserObject
,
4949 Buffer
->AccountName
.UserName
.Buffer
,
4950 Buffer
->AccountName
.UserName
.MaximumLength
);
4953 case UserFullNameInformation
:
4954 Status
= SampSetObjectAttribute(UserObject
,
4957 Buffer
->FullName
.FullName
.Buffer
,
4958 Buffer
->FullName
.FullName
.MaximumLength
);
4961 case UserPrimaryGroupInformation
:
4962 Status
= SampSetUserPrimaryGroup(UserObject
,
4966 case UserHomeInformation
:
4967 Status
= SampSetObjectAttribute(UserObject
,
4970 Buffer
->Home
.HomeDirectory
.Buffer
,
4971 Buffer
->Home
.HomeDirectory
.MaximumLength
);
4972 if (!NT_SUCCESS(Status
))
4975 Status
= SampSetObjectAttribute(UserObject
,
4976 L
"HomeDirectoryDrive",
4978 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
4979 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
4982 case UserScriptInformation
:
4983 Status
= SampSetObjectAttribute(UserObject
,
4986 Buffer
->Script
.ScriptPath
.Buffer
,
4987 Buffer
->Script
.ScriptPath
.MaximumLength
);
4990 case UserProfileInformation
:
4991 Status
= SampSetObjectAttribute(UserObject
,
4994 Buffer
->Profile
.ProfilePath
.Buffer
,
4995 Buffer
->Profile
.ProfilePath
.MaximumLength
);
4998 case UserAdminCommentInformation
:
4999 Status
= SampSetObjectAttribute(UserObject
,
5002 Buffer
->AdminComment
.AdminComment
.Buffer
,
5003 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
5006 case UserWorkStationsInformation
:
5007 Status
= SampSetObjectAttribute(UserObject
,
5010 Buffer
->WorkStations
.WorkStations
.Buffer
,
5011 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
5014 case UserSetPasswordInformation
:
5015 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
5016 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
5018 Status
= SampSetObjectAttribute(UserObject
,
5021 Buffer
->SetPassword
.Password
.Buffer
,
5022 Buffer
->SetPassword
.Password
.MaximumLength
);
5025 case UserControlInformation
:
5026 Status
= SampSetUserControl(UserObject
,
5030 case UserExpiresInformation
:
5031 Status
= SampSetUserExpires(UserObject
,
5035 // case UserInternal1Information:
5036 // case UserParametersInformation:
5037 // case UserAllInformation:
5038 // case UserInternal4Information:
5039 // case UserInternal5Information:
5040 // case UserInternal4InformationNew:
5041 // case UserInternal5InformationNew:
5044 Status
= STATUS_INVALID_INFO_CLASS
;
5053 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
5054 IN
unsigned char LmPresent
,
5055 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
5056 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
5057 IN
unsigned char NtPresent
,
5058 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
5059 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
5060 IN
unsigned char NtCrossEncryptionPresent
,
5061 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
5062 IN
unsigned char LmCrossEncryptionPresent
,
5063 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
5066 return STATUS_NOT_IMPLEMENTED
;
5072 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
5073 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
5076 return STATUS_NOT_IMPLEMENTED
;
5082 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
5083 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
5084 IN
unsigned long Index
,
5085 IN
unsigned long EntryCount
,
5086 IN
unsigned long PreferredMaximumLength
,
5087 OUT
unsigned long *TotalAvailable
,
5088 OUT
unsigned long *TotalReturned
,
5089 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
5092 return STATUS_NOT_IMPLEMENTED
;
5098 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
5099 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
5100 IN PRPC_UNICODE_STRING Prefix
,
5101 OUT
unsigned long *Index
)
5104 return STATUS_NOT_IMPLEMENTED
;
5110 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
5113 return STATUS_NOT_IMPLEMENTED
;
5119 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
5122 return STATUS_NOT_IMPLEMENTED
;
5128 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
5129 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
5132 return STATUS_NOT_IMPLEMENTED
;
5138 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
5139 IN PRPC_SID MemberSid
)
5142 return STATUS_NOT_IMPLEMENTED
;
5148 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
5149 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
5150 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
5153 return STATUS_NOT_IMPLEMENTED
;
5159 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
5160 IN USER_INFORMATION_CLASS UserInformationClass
,
5161 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
5164 return STATUS_NOT_IMPLEMENTED
;
5170 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
5171 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
5172 IN
unsigned long Index
,
5173 IN
unsigned long EntryCount
,
5174 IN
unsigned long PreferredMaximumLength
,
5175 OUT
unsigned long *TotalAvailable
,
5176 OUT
unsigned long *TotalReturned
,
5177 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
5180 return STATUS_NOT_IMPLEMENTED
;
5186 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
5187 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
5188 IN PRPC_UNICODE_STRING Prefix
,
5189 OUT
unsigned long *Index
)
5192 return STATUS_NOT_IMPLEMENTED
;
5198 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
5199 IN PRPC_UNICODE_STRING Name
,
5200 IN
unsigned long AccountType
,
5201 IN ACCESS_MASK DesiredAccess
,
5202 OUT SAMPR_HANDLE
*UserHandle
,
5203 OUT
unsigned long *GrantedAccess
,
5204 OUT
unsigned long *RelativeId
)
5207 return STATUS_NOT_IMPLEMENTED
;
5213 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
5214 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
5215 IN
unsigned long Index
,
5216 IN
unsigned long EntryCount
,
5217 IN
unsigned long PreferredMaximumLength
,
5218 OUT
unsigned long *TotalAvailable
,
5219 OUT
unsigned long *TotalReturned
,
5220 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
5223 return STATUS_NOT_IMPLEMENTED
;
5229 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
5230 IN PSAMPR_PSID_ARRAY MembersBuffer
)
5233 return STATUS_NOT_IMPLEMENTED
;
5239 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
5240 IN PSAMPR_PSID_ARRAY MembersBuffer
)
5243 return STATUS_NOT_IMPLEMENTED
;
5249 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
5250 IN PRPC_STRING ServerName
,
5251 IN PRPC_STRING UserName
,
5252 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
5253 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
5256 return STATUS_NOT_IMPLEMENTED
;
5262 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
5263 IN PRPC_UNICODE_STRING ServerName
,
5264 IN PRPC_UNICODE_STRING UserName
,
5265 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
5266 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
5267 IN
unsigned char LmPresent
,
5268 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
5269 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
5272 return STATUS_NOT_IMPLEMENTED
;
5278 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
5279 IN PRPC_UNICODE_STRING Unused
,
5280 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
5283 return STATUS_NOT_IMPLEMENTED
;
5289 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
5290 OUT SAMPR_HANDLE
*ServerHandle
,
5291 IN ACCESS_MASK DesiredAccess
)
5294 return STATUS_NOT_IMPLEMENTED
;
5300 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
5301 IN USER_INFORMATION_CLASS UserInformationClass
,
5302 IN PSAMPR_USER_INFO_BUFFER Buffer
)
5305 return STATUS_NOT_IMPLEMENTED
;
5311 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
5314 return STATUS_NOT_IMPLEMENTED
;
5320 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
5323 return STATUS_NOT_IMPLEMENTED
;
5329 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
5332 return STATUS_NOT_IMPLEMENTED
;
5338 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
5339 OUT SAMPR_HANDLE
*ServerHandle
,
5340 IN
unsigned long ClientRevision
,
5341 IN ACCESS_MASK DesiredAccess
)
5344 return STATUS_NOT_IMPLEMENTED
;
5350 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
5353 return STATUS_NOT_IMPLEMENTED
;
5359 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
5360 IN ACCESS_MASK DesiredAccess
,
5361 IN
unsigned long InVersion
,
5362 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
5363 OUT
unsigned long *OutVersion
,
5364 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
5365 OUT SAMPR_HANDLE
*ServerHandle
)
5368 return STATUS_NOT_IMPLEMENTED
;
5374 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
5375 IN
unsigned long Rid
,
5379 return STATUS_NOT_IMPLEMENTED
;
5385 SamrSetDSRMPassword(IN handle_t BindingHandle
,
5386 IN PRPC_UNICODE_STRING Unused
,
5387 IN
unsigned long UserId
,
5388 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
5391 return STATUS_NOT_IMPLEMENTED
;
5397 SamrValidatePassword(IN handle_t Handle
,
5398 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
5399 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
5400 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
5403 return STATUS_NOT_IMPLEMENTED
;