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 static GENERIC_MAPPING ServerMapping
=
28 static GENERIC_MAPPING DomainMapping
=
36 static GENERIC_MAPPING AliasMapping
=
44 static GENERIC_MAPPING GroupMapping
=
52 static GENERIC_MAPPING UserMapping
=
60 PGENERIC_MAPPING pServerMapping
= &ServerMapping
;
63 /* FUNCTIONS *****************************************************************/
67 SampAddRelativeTimeToTime(IN LARGE_INTEGER AbsoluteTime
,
68 IN LARGE_INTEGER RelativeTime
)
70 LARGE_INTEGER NewTime
;
72 NewTime
.QuadPart
= AbsoluteTime
.QuadPart
- RelativeTime
.QuadPart
;
74 if (NewTime
.QuadPart
< 0)
82 SampStartRpcServer(VOID
)
86 TRACE("SampStartRpcServer() called\n");
88 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
92 if (Status
!= RPC_S_OK
)
94 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
98 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
101 if (Status
!= RPC_S_OK
)
103 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
107 Status
= RpcServerListen(1, 20, TRUE
);
108 if (Status
!= RPC_S_OK
)
110 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
114 TRACE("SampStartRpcServer() done\n");
118 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
120 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
124 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
126 HeapFree(GetProcessHeap(), 0, ptr
);
130 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
138 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
139 OUT SAMPR_HANDLE
*ServerHandle
,
140 IN ACCESS_MASK DesiredAccess
)
142 PSAM_DB_OBJECT ServerObject
;
145 TRACE("SamrConnect(%p %p %lx)\n",
146 ServerName
, ServerHandle
, DesiredAccess
);
148 /* Map generic access rights */
149 RtlMapGenericMask(&DesiredAccess
,
152 /* Open the Server Object */
153 Status
= SampOpenDbObject(NULL
,
160 if (NT_SUCCESS(Status
))
161 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
163 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
172 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
174 PSAM_DB_OBJECT DbObject
;
175 NTSTATUS Status
= STATUS_SUCCESS
;
177 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
179 Status
= SampValidateDbObject(*SamHandle
,
183 if (Status
== STATUS_SUCCESS
)
185 Status
= SampCloseDbObject(DbObject
);
189 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
198 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
199 IN SECURITY_INFORMATION SecurityInformation
,
200 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
203 return STATUS_NOT_IMPLEMENTED
;
210 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
211 IN SECURITY_INFORMATION SecurityInformation
,
212 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
*SecurityDescriptor
)
215 return STATUS_NOT_IMPLEMENTED
;
222 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
224 PSAM_DB_OBJECT ServerObject
;
227 TRACE("(%p)\n", ServerHandle
);
229 /* Validate the server handle */
230 Status
= SampValidateDbObject(ServerHandle
,
234 if (!NT_SUCCESS(Status
))
237 /* Shut the server down */
238 RpcMgmtStopServerListening(0);
240 return STATUS_SUCCESS
;
247 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
248 IN PRPC_UNICODE_STRING Name
,
249 OUT PRPC_SID
*DomainId
)
251 PSAM_DB_OBJECT ServerObject
;
252 HANDLE DomainsKeyHandle
= NULL
;
253 HANDLE DomainKeyHandle
= NULL
;
254 WCHAR DomainKeyName
[64];
256 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
257 UNICODE_STRING DomainName
;
262 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
263 ServerHandle
, Name
, DomainId
);
265 /* Validate the server handle */
266 Status
= SampValidateDbObject(ServerHandle
,
268 SAM_SERVER_LOOKUP_DOMAIN
,
270 if (!NT_SUCCESS(Status
))
275 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
279 if (!NT_SUCCESS(Status
))
283 while (Found
== FALSE
)
285 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
289 if (!NT_SUCCESS(Status
))
291 if (Status
== STATUS_NO_MORE_ENTRIES
)
292 Status
= STATUS_NO_SUCH_DOMAIN
;
296 TRACE("Domain key name: %S\n", DomainKeyName
);
298 Status
= SampRegOpenKey(DomainsKeyHandle
,
302 if (NT_SUCCESS(Status
))
304 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
305 Status
= SampRegQueryValue(DomainKeyHandle
,
308 (PVOID
)&DomainNameString
,
310 if (NT_SUCCESS(Status
))
312 TRACE("Domain name: %S\n", DomainNameString
);
314 RtlInitUnicodeString(&DomainName
,
316 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
318 TRACE("Found it!\n");
321 Status
= SampRegQueryValue(DomainKeyHandle
,
326 if (NT_SUCCESS(Status
))
328 *DomainId
= midl_user_allocate(Length
);
330 SampRegQueryValue(DomainKeyHandle
,
336 Status
= STATUS_SUCCESS
;
342 NtClose(DomainKeyHandle
);
348 NtClose(DomainsKeyHandle
);
357 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
358 IN OUT
unsigned long *EnumerationContext
,
359 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
360 IN ULONG PreferedMaximumLength
,
361 OUT PULONG CountReturned
)
363 PSAM_DB_OBJECT ServerObject
;
364 WCHAR DomainKeyName
[64];
365 HANDLE DomainsKeyHandle
;
366 HANDLE DomainKeyHandle
;
369 ULONG RequiredLength
;
372 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
375 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
376 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
379 /* Validate the server handle */
380 Status
= SampValidateDbObject(ServerHandle
,
382 SAM_SERVER_ENUMERATE_DOMAINS
,
384 if (!NT_SUCCESS(Status
))
387 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
391 if (!NT_SUCCESS(Status
))
394 EnumIndex
= *EnumerationContext
;
400 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
404 if (!NT_SUCCESS(Status
))
407 TRACE("EnumIndex: %lu\n", EnumIndex
);
408 TRACE("Domain key name: %S\n", DomainKeyName
);
410 Status
= SampRegOpenKey(DomainsKeyHandle
,
414 TRACE("SampRegOpenKey returned %08lX\n", Status
);
415 if (NT_SUCCESS(Status
))
418 Status
= SampRegQueryValue(DomainKeyHandle
,
423 TRACE("SampRegQueryValue returned %08lX\n", Status
);
424 if (NT_SUCCESS(Status
))
426 TRACE("Data length: %lu\n", DataLength
);
428 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
431 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
435 NtClose(DomainKeyHandle
);
441 TRACE("EnumCount: %lu\n", EnumCount
);
442 TRACE("RequiredLength: %lu\n", RequiredLength
);
444 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
445 if (EnumBuffer
== NULL
)
447 Status
= STATUS_INSUFFICIENT_RESOURCES
;
451 EnumBuffer
->EntriesRead
= EnumCount
;
452 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
453 if (EnumBuffer
->Buffer
== NULL
)
455 Status
= STATUS_INSUFFICIENT_RESOURCES
;
459 EnumIndex
= *EnumerationContext
;
460 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
462 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
466 if (!NT_SUCCESS(Status
))
469 TRACE("EnumIndex: %lu\n", EnumIndex
);
470 TRACE("Domain key name: %S\n", DomainKeyName
);
472 Status
= SampRegOpenKey(DomainsKeyHandle
,
476 TRACE("SampRegOpenKey returned %08lX\n", Status
);
477 if (NT_SUCCESS(Status
))
480 Status
= SampRegQueryValue(DomainKeyHandle
,
485 TRACE("SampRegQueryValue returned %08lX\n", Status
);
486 if (NT_SUCCESS(Status
))
488 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
489 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
490 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
491 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
492 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
494 NtClose(DomainKeyHandle
);
495 Status
= STATUS_INSUFFICIENT_RESOURCES
;
499 Status
= SampRegQueryValue(DomainKeyHandle
,
502 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
504 TRACE("SampRegQueryValue returned %08lX\n", Status
);
505 if (NT_SUCCESS(Status
))
507 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
511 NtClose(DomainKeyHandle
);
513 if (!NT_SUCCESS(Status
))
518 if (NT_SUCCESS(Status
))
520 *EnumerationContext
+= EnumCount
;
521 *Buffer
= EnumBuffer
;
522 *CountReturned
= EnumCount
;
526 if (!NT_SUCCESS(Status
))
528 *EnumerationContext
= 0;
532 if (EnumBuffer
!= NULL
)
534 if (EnumBuffer
->Buffer
!= NULL
)
536 if (EnumBuffer
->EntriesRead
!= 0)
538 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
540 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
541 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
545 midl_user_free(EnumBuffer
->Buffer
);
548 midl_user_free(EnumBuffer
);
552 NtClose(DomainsKeyHandle
);
561 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
562 IN ACCESS_MASK DesiredAccess
,
563 IN PRPC_SID DomainId
,
564 OUT SAMPR_HANDLE
*DomainHandle
)
566 PSAM_DB_OBJECT ServerObject
;
567 PSAM_DB_OBJECT DomainObject
;
570 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
571 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
573 /* Map generic access rights */
574 RtlMapGenericMask(&DesiredAccess
,
577 /* Validate the server handle */
578 Status
= SampValidateDbObject(ServerHandle
,
580 SAM_SERVER_LOOKUP_DOMAIN
,
582 if (!NT_SUCCESS(Status
))
585 /* Validate the Domain SID */
586 if ((DomainId
->Revision
!= SID_REVISION
) ||
587 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
588 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
589 return STATUS_INVALID_PARAMETER
;
591 /* Open the domain object */
592 if ((DomainId
->SubAuthorityCount
== 1) &&
593 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
595 /* Builtin domain object */
596 TRACE("Opening the builtin domain object.\n");
598 Status
= SampOpenDbObject(ServerObject
,
606 else if ((DomainId
->SubAuthorityCount
== 4) &&
607 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
609 /* Account domain object */
610 TRACE("Opening the account domain object.\n");
612 /* FIXME: Check the account domain sub authorities!!! */
614 Status
= SampOpenDbObject(ServerObject
,
624 /* No vaild domain SID */
625 Status
= STATUS_INVALID_PARAMETER
;
628 if (NT_SUCCESS(Status
))
629 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
631 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
638 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
639 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
641 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
642 SAM_DOMAIN_FIXED_DATA FixedData
;
648 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
649 if (InfoBuffer
== NULL
)
650 return STATUS_INSUFFICIENT_RESOURCES
;
652 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
653 Status
= SampGetObjectAttribute(DomainObject
,
658 if (!NT_SUCCESS(Status
))
661 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
662 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
663 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
664 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
665 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
666 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
667 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
669 *Buffer
= InfoBuffer
;
672 if (!NT_SUCCESS(Status
))
674 if (InfoBuffer
!= NULL
)
676 midl_user_free(InfoBuffer
);
685 SampGetNumberOfAccounts(PSAM_DB_OBJECT DomainObject
,
689 HANDLE AccountKeyHandle
= NULL
;
690 HANDLE NamesKeyHandle
= NULL
;
695 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
699 if (!NT_SUCCESS(Status
))
702 Status
= SampRegOpenKey(AccountKeyHandle
,
706 if (!NT_SUCCESS(Status
))
709 Status
= SampRegQueryKeyInfo(NamesKeyHandle
,
713 if (NamesKeyHandle
!= NULL
)
714 SampRegCloseKey(NamesKeyHandle
);
716 if (AccountKeyHandle
!= NULL
)
717 SampRegCloseKey(AccountKeyHandle
);
724 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
725 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
727 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
728 SAM_DOMAIN_FIXED_DATA FixedData
;
734 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
735 if (InfoBuffer
== NULL
)
736 return STATUS_INSUFFICIENT_RESOURCES
;
738 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
739 Status
= SampGetObjectAttribute(DomainObject
,
744 if (!NT_SUCCESS(Status
))
747 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
748 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
749 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
750 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
751 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
752 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
753 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
755 /* Get the OemInformation string */
756 Status
= SampGetObjectAttributeString(DomainObject
,
758 &InfoBuffer
->General
.OemInformation
);
759 if (!NT_SUCCESS(Status
))
761 TRACE("Status 0x%08lx\n", Status
);
765 /* Get the Name string */
766 Status
= SampGetObjectAttributeString(DomainObject
,
768 &InfoBuffer
->General
.DomainName
);
769 if (!NT_SUCCESS(Status
))
771 TRACE("Status 0x%08lx\n", Status
);
775 /* Get the ReplicaSourceNodeName string */
776 Status
= SampGetObjectAttributeString(DomainObject
,
777 L
"ReplicaSourceNodeName",
778 &InfoBuffer
->General
.ReplicaSourceNodeName
);
779 if (!NT_SUCCESS(Status
))
781 TRACE("Status 0x%08lx\n", Status
);
785 /* Get the number of Users in the Domain */
786 Status
= SampGetNumberOfAccounts(DomainObject
,
788 &InfoBuffer
->General
.UserCount
);
789 if (!NT_SUCCESS(Status
))
791 TRACE("Status 0x%08lx\n", Status
);
795 /* Get the number of Groups in the Domain */
796 Status
= SampGetNumberOfAccounts(DomainObject
,
798 &InfoBuffer
->General
.GroupCount
);
799 if (!NT_SUCCESS(Status
))
801 TRACE("Status 0x%08lx\n", Status
);
805 /* Get the number of Aliases in the Domain */
806 Status
= SampGetNumberOfAccounts(DomainObject
,
808 &InfoBuffer
->General
.AliasCount
);
809 if (!NT_SUCCESS(Status
))
811 TRACE("Status 0x%08lx\n", Status
);
815 *Buffer
= InfoBuffer
;
818 if (!NT_SUCCESS(Status
))
820 if (InfoBuffer
!= NULL
)
822 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
823 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
825 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
826 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
828 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
829 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
831 midl_user_free(InfoBuffer
);
840 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
841 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
843 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
844 SAM_DOMAIN_FIXED_DATA FixedData
;
850 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
851 if (InfoBuffer
== NULL
)
852 return STATUS_INSUFFICIENT_RESOURCES
;
854 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
855 Status
= SampGetObjectAttribute(DomainObject
,
860 if (!NT_SUCCESS(Status
))
863 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
864 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
866 *Buffer
= InfoBuffer
;
869 if (!NT_SUCCESS(Status
))
871 if (InfoBuffer
!= NULL
)
873 midl_user_free(InfoBuffer
);
882 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
883 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
885 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
890 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
891 if (InfoBuffer
== NULL
)
892 return STATUS_INSUFFICIENT_RESOURCES
;
894 /* Get the OemInformation string */
895 Status
= SampGetObjectAttributeString(DomainObject
,
897 &InfoBuffer
->Oem
.OemInformation
);
898 if (!NT_SUCCESS(Status
))
900 TRACE("Status 0x%08lx\n", Status
);
904 *Buffer
= InfoBuffer
;
907 if (!NT_SUCCESS(Status
))
909 if (InfoBuffer
!= NULL
)
911 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
912 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
914 midl_user_free(InfoBuffer
);
923 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
924 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
926 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
931 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
932 if (InfoBuffer
== NULL
)
933 return STATUS_INSUFFICIENT_RESOURCES
;
935 /* Get the Name string */
936 Status
= SampGetObjectAttributeString(DomainObject
,
938 &InfoBuffer
->Name
.DomainName
);
939 if (!NT_SUCCESS(Status
))
941 TRACE("Status 0x%08lx\n", Status
);
945 *Buffer
= InfoBuffer
;
948 if (!NT_SUCCESS(Status
))
950 if (InfoBuffer
!= NULL
)
952 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
953 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
955 midl_user_free(InfoBuffer
);
964 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
965 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
967 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
972 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
973 if (InfoBuffer
== NULL
)
974 return STATUS_INSUFFICIENT_RESOURCES
;
976 /* Get the ReplicaSourceNodeName string */
977 Status
= SampGetObjectAttributeString(DomainObject
,
978 L
"ReplicaSourceNodeName",
979 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
980 if (!NT_SUCCESS(Status
))
982 TRACE("Status 0x%08lx\n", Status
);
986 *Buffer
= InfoBuffer
;
989 if (!NT_SUCCESS(Status
))
991 if (InfoBuffer
!= NULL
)
993 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
994 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
996 midl_user_free(InfoBuffer
);
1005 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1006 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1008 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1009 SAM_DOMAIN_FIXED_DATA FixedData
;
1015 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1016 if (InfoBuffer
== NULL
)
1017 return STATUS_INSUFFICIENT_RESOURCES
;
1019 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1020 Status
= SampGetObjectAttribute(DomainObject
,
1025 if (!NT_SUCCESS(Status
))
1028 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
1030 *Buffer
= InfoBuffer
;
1033 if (!NT_SUCCESS(Status
))
1035 if (InfoBuffer
!= NULL
)
1037 midl_user_free(InfoBuffer
);
1046 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
1047 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1049 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1050 SAM_DOMAIN_FIXED_DATA FixedData
;
1056 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1057 if (InfoBuffer
== NULL
)
1058 return STATUS_INSUFFICIENT_RESOURCES
;
1060 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1061 Status
= SampGetObjectAttribute(DomainObject
,
1066 if (!NT_SUCCESS(Status
))
1069 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1070 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1071 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1072 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1074 *Buffer
= InfoBuffer
;
1077 if (!NT_SUCCESS(Status
))
1079 if (InfoBuffer
!= NULL
)
1081 midl_user_free(InfoBuffer
);
1090 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1091 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1093 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1094 SAM_DOMAIN_FIXED_DATA FixedData
;
1100 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1101 if (InfoBuffer
== NULL
)
1102 return STATUS_INSUFFICIENT_RESOURCES
;
1104 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1105 Status
= SampGetObjectAttribute(DomainObject
,
1110 if (!NT_SUCCESS(Status
))
1113 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1115 *Buffer
= InfoBuffer
;
1118 if (!NT_SUCCESS(Status
))
1120 if (InfoBuffer
!= NULL
)
1122 midl_user_free(InfoBuffer
);
1131 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1132 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1134 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1135 SAM_DOMAIN_FIXED_DATA FixedData
;
1141 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1142 if (InfoBuffer
== NULL
)
1143 return STATUS_INSUFFICIENT_RESOURCES
;
1145 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1146 Status
= SampGetObjectAttribute(DomainObject
,
1151 if (!NT_SUCCESS(Status
))
1154 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1155 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1156 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1157 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1158 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1159 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1160 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1162 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1163 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1164 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1166 /* Get the OemInformation string */
1167 Status
= SampGetObjectAttributeString(DomainObject
,
1169 &InfoBuffer
->General2
.I1
.OemInformation
);
1170 if (!NT_SUCCESS(Status
))
1172 TRACE("Status 0x%08lx\n", Status
);
1176 /* Get the Name string */
1177 Status
= SampGetObjectAttributeString(DomainObject
,
1179 &InfoBuffer
->General2
.I1
.DomainName
);
1180 if (!NT_SUCCESS(Status
))
1182 TRACE("Status 0x%08lx\n", Status
);
1186 /* Get the ReplicaSourceNodeName string */
1187 Status
= SampGetObjectAttributeString(DomainObject
,
1188 L
"ReplicaSourceNodeName",
1189 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1190 if (!NT_SUCCESS(Status
))
1192 TRACE("Status 0x%08lx\n", Status
);
1196 /* Get the number of Users in the Domain */
1197 Status
= SampGetNumberOfAccounts(DomainObject
,
1199 &InfoBuffer
->General2
.I1
.UserCount
);
1200 if (!NT_SUCCESS(Status
))
1202 TRACE("Status 0x%08lx\n", Status
);
1206 /* Get the number of Groups in the Domain */
1207 Status
= SampGetNumberOfAccounts(DomainObject
,
1209 &InfoBuffer
->General2
.I1
.GroupCount
);
1210 if (!NT_SUCCESS(Status
))
1212 TRACE("Status 0x%08lx\n", Status
);
1216 /* Get the number of Aliases in the Domain */
1217 Status
= SampGetNumberOfAccounts(DomainObject
,
1219 &InfoBuffer
->General2
.I1
.AliasCount
);
1220 if (!NT_SUCCESS(Status
))
1222 TRACE("Status 0x%08lx\n", Status
);
1226 *Buffer
= InfoBuffer
;
1229 if (!NT_SUCCESS(Status
))
1231 if (InfoBuffer
!= NULL
)
1233 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1234 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1236 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1237 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1239 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1240 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1242 midl_user_free(InfoBuffer
);
1251 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1252 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1254 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1255 SAM_DOMAIN_FIXED_DATA FixedData
;
1261 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1262 if (InfoBuffer
== NULL
)
1263 return STATUS_INSUFFICIENT_RESOURCES
;
1265 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1266 Status
= SampGetObjectAttribute(DomainObject
,
1271 if (!NT_SUCCESS(Status
))
1274 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1275 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1276 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1278 *Buffer
= InfoBuffer
;
1281 if (!NT_SUCCESS(Status
))
1283 if (InfoBuffer
!= NULL
)
1285 midl_user_free(InfoBuffer
);
1294 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1295 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1297 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1298 SAM_DOMAIN_FIXED_DATA FixedData
;
1304 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1305 if (InfoBuffer
== NULL
)
1306 return STATUS_INSUFFICIENT_RESOURCES
;
1308 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1309 Status
= SampGetObjectAttribute(DomainObject
,
1314 if (!NT_SUCCESS(Status
))
1317 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1318 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1319 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1320 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1321 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1322 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1324 *Buffer
= InfoBuffer
;
1327 if (!NT_SUCCESS(Status
))
1329 if (InfoBuffer
!= NULL
)
1331 midl_user_free(InfoBuffer
);
1342 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1343 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1344 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1346 PSAM_DB_OBJECT DomainObject
;
1347 ACCESS_MASK DesiredAccess
;
1350 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1351 DomainHandle
, DomainInformationClass
, Buffer
);
1353 switch (DomainInformationClass
)
1355 case DomainPasswordInformation
:
1356 case DomainLockoutInformation
:
1357 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1360 case DomainGeneralInformation
:
1361 case DomainLogoffInformation
:
1362 case DomainOemInformation
:
1363 case DomainNameInformation
:
1364 case DomainReplicationInformation
:
1365 case DomainServerRoleInformation
:
1366 case DomainModifiedInformation
:
1367 case DomainStateInformation
:
1368 case DomainModifiedInformation2
:
1369 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1372 case DomainGeneralInformation2
:
1373 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1374 DOMAIN_READ_OTHER_PARAMETERS
;
1378 return STATUS_INVALID_INFO_CLASS
;
1381 /* Validate the server handle */
1382 Status
= SampValidateDbObject(DomainHandle
,
1386 if (!NT_SUCCESS(Status
))
1389 switch (DomainInformationClass
)
1391 case DomainPasswordInformation
:
1392 Status
= SampQueryDomainPassword(DomainObject
,
1396 case DomainGeneralInformation
:
1397 Status
= SampQueryDomainGeneral(DomainObject
,
1401 case DomainLogoffInformation
:
1402 Status
= SampQueryDomainLogoff(DomainObject
,
1406 case DomainOemInformation
:
1407 Status
= SampQueryDomainOem(DomainObject
,
1411 case DomainNameInformation
:
1412 Status
= SampQueryDomainName(DomainObject
,
1416 case DomainReplicationInformation
:
1417 Status
= SampQueryDomainReplication(DomainObject
,
1421 case DomainServerRoleInformation
:
1422 Status
= SampQueryDomainServerRole(DomainObject
,
1426 case DomainModifiedInformation
:
1427 Status
= SampQueryDomainModified(DomainObject
,
1431 case DomainStateInformation
:
1432 Status
= SampQueryDomainState(DomainObject
,
1436 case DomainGeneralInformation2
:
1437 Status
= SampQueryDomainGeneral2(DomainObject
,
1441 case DomainLockoutInformation
:
1442 Status
= SampQueryDomainLockout(DomainObject
,
1446 case DomainModifiedInformation2
:
1447 Status
= SampQueryDomainModified2(DomainObject
,
1452 Status
= STATUS_NOT_IMPLEMENTED
;
1460 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1461 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1463 SAM_DOMAIN_FIXED_DATA FixedData
;
1467 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1468 Status
= SampGetObjectAttribute(DomainObject
,
1473 if (!NT_SUCCESS(Status
))
1476 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1477 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1478 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1479 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1480 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1481 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1482 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1484 Status
= SampSetObjectAttribute(DomainObject
,
1496 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1497 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1499 SAM_DOMAIN_FIXED_DATA FixedData
;
1503 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1504 Status
= SampGetObjectAttribute(DomainObject
,
1509 if (!NT_SUCCESS(Status
))
1512 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1513 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1515 Status
= SampSetObjectAttribute(DomainObject
,
1527 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1528 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1530 SAM_DOMAIN_FIXED_DATA FixedData
;
1534 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1535 Status
= SampGetObjectAttribute(DomainObject
,
1540 if (!NT_SUCCESS(Status
))
1543 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1545 Status
= SampSetObjectAttribute(DomainObject
,
1557 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1558 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1560 SAM_DOMAIN_FIXED_DATA FixedData
;
1564 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1565 Status
= SampGetObjectAttribute(DomainObject
,
1570 if (!NT_SUCCESS(Status
))
1573 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1575 Status
= SampSetObjectAttribute(DomainObject
,
1587 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1588 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1590 SAM_DOMAIN_FIXED_DATA FixedData
;
1594 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1595 Status
= SampGetObjectAttribute(DomainObject
,
1600 if (!NT_SUCCESS(Status
))
1603 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1604 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1605 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1607 Status
= SampSetObjectAttribute(DomainObject
,
1621 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1622 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1623 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1625 PSAM_DB_OBJECT DomainObject
;
1626 ACCESS_MASK DesiredAccess
;
1629 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1630 DomainHandle
, DomainInformationClass
, DomainInformation
);
1632 switch (DomainInformationClass
)
1634 case DomainPasswordInformation
:
1635 case DomainLockoutInformation
:
1636 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1639 case DomainLogoffInformation
:
1640 case DomainOemInformation
:
1641 case DomainNameInformation
:
1642 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1645 case DomainReplicationInformation
:
1646 case DomainServerRoleInformation
:
1647 case DomainStateInformation
:
1648 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1652 return STATUS_INVALID_INFO_CLASS
;
1655 /* Validate the server handle */
1656 Status
= SampValidateDbObject(DomainHandle
,
1660 if (!NT_SUCCESS(Status
))
1663 switch (DomainInformationClass
)
1665 case DomainPasswordInformation
:
1666 Status
= SampSetDomainPassword(DomainObject
,
1670 case DomainLogoffInformation
:
1671 Status
= SampSetDomainLogoff(DomainObject
,
1675 case DomainOemInformation
:
1676 Status
= SampSetObjectAttribute(DomainObject
,
1679 DomainInformation
->Oem
.OemInformation
.Buffer
,
1680 DomainInformation
->Oem
.OemInformation
.Length
+ sizeof(WCHAR
));
1683 case DomainNameInformation
:
1684 Status
= SampSetObjectAttribute(DomainObject
,
1687 DomainInformation
->Name
.DomainName
.Buffer
,
1688 DomainInformation
->Name
.DomainName
.Length
+ sizeof(WCHAR
));
1691 case DomainReplicationInformation
:
1692 Status
= SampSetObjectAttribute(DomainObject
,
1693 L
"ReplicaSourceNodeName",
1695 DomainInformation
->Replication
.ReplicaSourceNodeName
.Buffer
,
1696 DomainInformation
->Replication
.ReplicaSourceNodeName
.Length
+ sizeof(WCHAR
));
1699 case DomainServerRoleInformation
:
1700 Status
= SampSetDomainServerRole(DomainObject
,
1704 case DomainStateInformation
:
1705 Status
= SampSetDomainState(DomainObject
,
1709 case DomainLockoutInformation
:
1710 Status
= SampSetDomainLockout(DomainObject
,
1715 Status
= STATUS_NOT_IMPLEMENTED
;
1725 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
1726 IN PRPC_UNICODE_STRING Name
,
1727 IN ACCESS_MASK DesiredAccess
,
1728 OUT SAMPR_HANDLE
*GroupHandle
,
1729 OUT
unsigned long *RelativeId
)
1731 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
1732 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
1733 SAM_GROUP_FIXED_DATA FixedGroupData
;
1734 PSAM_DB_OBJECT DomainObject
;
1735 PSAM_DB_OBJECT GroupObject
;
1741 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
1742 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
1744 /* Map generic access rights */
1745 RtlMapGenericMask(&DesiredAccess
,
1748 /* Validate the domain handle */
1749 Status
= SampValidateDbObject(DomainHandle
,
1751 DOMAIN_CREATE_GROUP
,
1753 if (!NT_SUCCESS(Status
))
1755 TRACE("failed with status 0x%08lx\n", Status
);
1759 /* Check if the group name already exists in the domain */
1760 Status
= SampCheckAccountNameInDomain(DomainObject
,
1762 if (!NT_SUCCESS(Status
))
1764 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
1765 Name
->Buffer
, Status
);
1769 /* Get the fixed domain attributes */
1770 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1771 Status
= SampGetObjectAttribute(DomainObject
,
1774 (PVOID
)&FixedDomainData
,
1776 if (!NT_SUCCESS(Status
))
1778 TRACE("failed with status 0x%08lx\n", Status
);
1782 /* Increment the NextRid attribute */
1783 ulRid
= FixedDomainData
.NextRid
;
1784 FixedDomainData
.NextRid
++;
1786 /* Store the fixed domain attributes */
1787 Status
= SampSetObjectAttribute(DomainObject
,
1792 if (!NT_SUCCESS(Status
))
1794 TRACE("failed with status 0x%08lx\n", Status
);
1798 TRACE("RID: %lx\n", ulRid
);
1800 /* Convert the RID into a string (hex) */
1801 swprintf(szRid
, L
"%08lX", ulRid
);
1803 /* Create the group object */
1804 Status
= SampCreateDbObject(DomainObject
,
1811 if (!NT_SUCCESS(Status
))
1813 TRACE("failed with status 0x%08lx\n", Status
);
1817 /* Add the account name of the user object */
1818 Status
= SampSetAccountNameInDomain(DomainObject
,
1822 if (!NT_SUCCESS(Status
))
1824 TRACE("failed with status 0x%08lx\n", Status
);
1828 /* Initialize fixed user data */
1829 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
1830 FixedGroupData
.Version
= 1;
1832 FixedGroupData
.GroupId
= ulRid
;
1834 /* Set fixed user data attribute */
1835 Status
= SampSetObjectAttribute(GroupObject
,
1838 (LPVOID
)&FixedGroupData
,
1839 sizeof(SAM_GROUP_FIXED_DATA
));
1840 if (!NT_SUCCESS(Status
))
1842 TRACE("failed with status 0x%08lx\n", Status
);
1846 /* Set the Name attribute */
1847 Status
= SampSetObjectAttribute(GroupObject
,
1850 (LPVOID
)Name
->Buffer
,
1851 Name
->MaximumLength
);
1852 if (!NT_SUCCESS(Status
))
1854 TRACE("failed with status 0x%08lx\n", Status
);
1858 /* Set the AdminComment attribute */
1859 Status
= SampSetObjectAttribute(GroupObject
,
1863 EmptyString
.MaximumLength
);
1864 if (!NT_SUCCESS(Status
))
1866 TRACE("failed with status 0x%08lx\n", Status
);
1870 if (NT_SUCCESS(Status
))
1872 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
1873 *RelativeId
= ulRid
;
1876 TRACE("returns with status 0x%08lx\n", Status
);
1885 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
1886 IN OUT
unsigned long *EnumerationContext
,
1887 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
1888 IN
unsigned long PreferedMaximumLength
,
1889 OUT
unsigned long *CountReturned
)
1891 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
1892 PSAM_DB_OBJECT DomainObject
;
1893 HANDLE GroupsKeyHandle
= NULL
;
1894 HANDLE NamesKeyHandle
= NULL
;
1895 WCHAR GroupName
[64];
1897 ULONG EnumCount
= 0;
1898 ULONG RequiredLength
= 0;
1903 BOOLEAN MoreEntries
= FALSE
;
1906 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
1907 DomainHandle
, EnumerationContext
, Buffer
,
1908 PreferedMaximumLength
, CountReturned
);
1910 /* Validate the domain handle */
1911 Status
= SampValidateDbObject(DomainHandle
,
1913 DOMAIN_LIST_ACCOUNTS
,
1915 if (!NT_SUCCESS(Status
))
1918 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
1922 if (!NT_SUCCESS(Status
))
1925 Status
= SampRegOpenKey(GroupsKeyHandle
,
1929 if (!NT_SUCCESS(Status
))
1934 EnumIndex
= *EnumerationContext
;
1938 NameLength
= 64 * sizeof(WCHAR
);
1939 Status
= SampRegEnumerateValue(NamesKeyHandle
,
1946 if (!NT_SUCCESS(Status
))
1948 if (Status
== STATUS_NO_MORE_ENTRIES
)
1949 Status
= STATUS_SUCCESS
;
1953 TRACE("EnumIndex: %lu\n", EnumIndex
);
1954 TRACE("Group name: %S\n", GroupName
);
1955 TRACE("Name length: %lu\n", NameLength
);
1957 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
1963 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
1969 TRACE("EnumCount: %lu\n", EnumCount
);
1970 TRACE("RequiredLength: %lu\n", RequiredLength
);
1972 if (!NT_SUCCESS(Status
))
1975 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
1976 if (EnumBuffer
== NULL
)
1978 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1982 EnumBuffer
->EntriesRead
= EnumCount
;
1986 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
1987 if (EnumBuffer
->Buffer
== NULL
)
1989 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1995 EnumIndex
= *EnumerationContext
;
1996 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
1998 NameLength
= 64 * sizeof(WCHAR
);
1999 DataLength
= sizeof(ULONG
);
2000 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2007 if (!NT_SUCCESS(Status
))
2009 if (Status
== STATUS_NO_MORE_ENTRIES
)
2010 Status
= STATUS_SUCCESS
;
2014 TRACE("EnumIndex: %lu\n", EnumIndex
);
2015 TRACE("Group name: %S\n", GroupName
);
2016 TRACE("Name length: %lu\n", NameLength
);
2017 TRACE("RID: %lu\n", Rid
);
2019 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2021 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2022 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2024 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2026 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2027 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2029 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2033 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2035 EnumBuffer
->Buffer
[i
].Name
.Length
);
2040 if (NT_SUCCESS(Status
))
2042 *EnumerationContext
+= EnumCount
;
2043 *Buffer
= EnumBuffer
;
2044 *CountReturned
= EnumCount
;
2048 *EnumerationContext
= 0;
2052 if (EnumBuffer
!= NULL
)
2054 if (EnumBuffer
->Buffer
!= NULL
)
2056 if (EnumBuffer
->EntriesRead
!= 0)
2058 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2060 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2061 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2065 midl_user_free(EnumBuffer
->Buffer
);
2068 midl_user_free(EnumBuffer
);
2072 if (NamesKeyHandle
!= NULL
)
2073 SampRegCloseKey(NamesKeyHandle
);
2075 if (GroupsKeyHandle
!= NULL
)
2076 SampRegCloseKey(GroupsKeyHandle
);
2078 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2079 Status
= STATUS_MORE_ENTRIES
;
2088 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
2089 IN PRPC_UNICODE_STRING Name
,
2090 IN ACCESS_MASK DesiredAccess
,
2091 OUT SAMPR_HANDLE
*UserHandle
,
2092 OUT
unsigned long *RelativeId
)
2094 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2095 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2096 SAM_USER_FIXED_DATA FixedUserData
;
2097 PSAM_DB_OBJECT DomainObject
;
2098 PSAM_DB_OBJECT UserObject
;
2104 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2105 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2108 Name
->Length
== 0 ||
2109 Name
->Buffer
== NULL
||
2110 UserHandle
== NULL
||
2112 return STATUS_INVALID_PARAMETER
;
2114 /* Map generic access rights */
2115 RtlMapGenericMask(&DesiredAccess
,
2118 /* Validate the domain handle */
2119 Status
= SampValidateDbObject(DomainHandle
,
2123 if (!NT_SUCCESS(Status
))
2125 TRACE("failed with status 0x%08lx\n", Status
);
2129 /* Check if the user name already exists in the domain */
2130 Status
= SampCheckAccountNameInDomain(DomainObject
,
2132 if (!NT_SUCCESS(Status
))
2134 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2135 Name
->Buffer
, Status
);
2139 /* Get the fixed domain attributes */
2140 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2141 Status
= SampGetObjectAttribute(DomainObject
,
2144 (PVOID
)&FixedDomainData
,
2146 if (!NT_SUCCESS(Status
))
2148 TRACE("failed with status 0x%08lx\n", Status
);
2152 /* Increment the NextRid attribute */
2153 ulRid
= FixedDomainData
.NextRid
;
2154 FixedDomainData
.NextRid
++;
2156 /* Store the fixed domain attributes */
2157 Status
= SampSetObjectAttribute(DomainObject
,
2162 if (!NT_SUCCESS(Status
))
2164 TRACE("failed with status 0x%08lx\n", Status
);
2168 TRACE("RID: %lx\n", ulRid
);
2170 /* Convert the RID into a string (hex) */
2171 swprintf(szRid
, L
"%08lX", ulRid
);
2173 /* Create the user object */
2174 Status
= SampCreateDbObject(DomainObject
,
2181 if (!NT_SUCCESS(Status
))
2183 TRACE("failed with status 0x%08lx\n", Status
);
2187 /* Add the account name for the user object */
2188 Status
= SampSetAccountNameInDomain(DomainObject
,
2192 if (!NT_SUCCESS(Status
))
2194 TRACE("failed with status 0x%08lx\n", Status
);
2198 /* Initialize fixed user data */
2199 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2200 FixedUserData
.Version
= 1;
2201 FixedUserData
.Reserved
= 0;
2202 FixedUserData
.LastLogon
.QuadPart
= 0;
2203 FixedUserData
.LastLogoff
.QuadPart
= 0;
2204 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2205 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
2206 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
2207 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2208 FixedUserData
.UserId
= ulRid
;
2209 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2210 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2211 USER_PASSWORD_NOT_REQUIRED
|
2212 USER_NORMAL_ACCOUNT
;
2213 FixedUserData
.CountryCode
= 0;
2214 FixedUserData
.CodePage
= 0;
2215 FixedUserData
.BadPasswordCount
= 0;
2216 FixedUserData
.LogonCount
= 0;
2217 FixedUserData
.AdminCount
= 0;
2218 FixedUserData
.OperatorCount
= 0;
2220 /* Set fixed user data attribute */
2221 Status
= SampSetObjectAttribute(UserObject
,
2224 (LPVOID
)&FixedUserData
,
2225 sizeof(SAM_USER_FIXED_DATA
));
2226 if (!NT_SUCCESS(Status
))
2228 TRACE("failed with status 0x%08lx\n", Status
);
2232 /* Set the Name attribute */
2233 Status
= SampSetObjectAttribute(UserObject
,
2236 (LPVOID
)Name
->Buffer
,
2237 Name
->MaximumLength
);
2238 if (!NT_SUCCESS(Status
))
2240 TRACE("failed with status 0x%08lx\n", Status
);
2244 /* Set the FullName attribute */
2245 Status
= SampSetObjectAttribute(UserObject
,
2249 EmptyString
.MaximumLength
);
2250 if (!NT_SUCCESS(Status
))
2252 TRACE("failed with status 0x%08lx\n", Status
);
2256 /* Set the HomeDirectory attribute */
2257 Status
= SampSetObjectAttribute(UserObject
,
2261 EmptyString
.MaximumLength
);
2262 if (!NT_SUCCESS(Status
))
2264 TRACE("failed with status 0x%08lx\n", Status
);
2268 /* Set the HomeDirectoryDrive attribute */
2269 Status
= SampSetObjectAttribute(UserObject
,
2270 L
"HomeDirectoryDrive",
2273 EmptyString
.MaximumLength
);
2274 if (!NT_SUCCESS(Status
))
2276 TRACE("failed with status 0x%08lx\n", Status
);
2280 /* Set the ScriptPath attribute */
2281 Status
= SampSetObjectAttribute(UserObject
,
2285 EmptyString
.MaximumLength
);
2286 if (!NT_SUCCESS(Status
))
2288 TRACE("failed with status 0x%08lx\n", Status
);
2292 /* Set the ProfilePath attribute */
2293 Status
= SampSetObjectAttribute(UserObject
,
2297 EmptyString
.MaximumLength
);
2298 if (!NT_SUCCESS(Status
))
2300 TRACE("failed with status 0x%08lx\n", Status
);
2304 /* Set the AdminComment attribute */
2305 Status
= SampSetObjectAttribute(UserObject
,
2309 EmptyString
.MaximumLength
);
2310 if (!NT_SUCCESS(Status
))
2312 TRACE("failed with status 0x%08lx\n", Status
);
2316 /* Set the UserComment attribute */
2317 Status
= SampSetObjectAttribute(UserObject
,
2321 EmptyString
.MaximumLength
);
2322 if (!NT_SUCCESS(Status
))
2324 TRACE("failed with status 0x%08lx\n", Status
);
2328 /* Set the WorkStations attribute */
2329 Status
= SampSetObjectAttribute(UserObject
,
2333 EmptyString
.MaximumLength
);
2334 if (!NT_SUCCESS(Status
))
2336 TRACE("failed with status 0x%08lx\n", Status
);
2340 /* Set the Parameters attribute */
2341 Status
= SampSetObjectAttribute(UserObject
,
2345 EmptyString
.MaximumLength
);
2346 if (!NT_SUCCESS(Status
))
2348 TRACE("failed with status 0x%08lx\n", Status
);
2352 /* FIXME: Set LogonHours attribute*/
2353 /* FIXME: Set Groups attribute*/
2355 /* Set LMPwd attribute*/
2356 Status
= SampSetObjectAttribute(UserObject
,
2361 if (!NT_SUCCESS(Status
))
2363 TRACE("failed with status 0x%08lx\n", Status
);
2367 /* Set NTPwd attribute*/
2368 Status
= SampSetObjectAttribute(UserObject
,
2373 if (!NT_SUCCESS(Status
))
2375 TRACE("failed with status 0x%08lx\n", Status
);
2379 /* Set LMPwdHistory attribute*/
2380 Status
= SampSetObjectAttribute(UserObject
,
2385 if (!NT_SUCCESS(Status
))
2387 TRACE("failed with status 0x%08lx\n", Status
);
2391 /* Set NTPwdHistory attribute*/
2392 Status
= SampSetObjectAttribute(UserObject
,
2397 if (!NT_SUCCESS(Status
))
2399 TRACE("failed with status 0x%08lx\n", Status
);
2403 /* FIXME: Set SecDesc attribute*/
2405 if (NT_SUCCESS(Status
))
2407 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2408 *RelativeId
= ulRid
;
2411 TRACE("returns with status 0x%08lx\n", Status
);
2420 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2421 IN OUT
unsigned long *EnumerationContext
,
2422 IN
unsigned long UserAccountControl
,
2423 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2424 IN
unsigned long PreferedMaximumLength
,
2425 OUT
unsigned long *CountReturned
)
2427 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2428 PSAM_DB_OBJECT DomainObject
;
2429 HANDLE UsersKeyHandle
= NULL
;
2430 HANDLE NamesKeyHandle
= NULL
;
2433 ULONG EnumCount
= 0;
2434 ULONG RequiredLength
= 0;
2439 BOOLEAN MoreEntries
= FALSE
;
2442 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2443 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2444 PreferedMaximumLength
, CountReturned
);
2446 /* Validate the domain handle */
2447 Status
= SampValidateDbObject(DomainHandle
,
2449 DOMAIN_LIST_ACCOUNTS
,
2451 if (!NT_SUCCESS(Status
))
2454 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2458 if (!NT_SUCCESS(Status
))
2461 Status
= SampRegOpenKey(UsersKeyHandle
,
2465 if (!NT_SUCCESS(Status
))
2470 EnumIndex
= *EnumerationContext
;
2474 NameLength
= 64 * sizeof(WCHAR
);
2475 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2482 if (!NT_SUCCESS(Status
))
2484 if (Status
== STATUS_NO_MORE_ENTRIES
)
2485 Status
= STATUS_SUCCESS
;
2489 TRACE("EnumIndex: %lu\n", EnumIndex
);
2490 TRACE("User name: %S\n", UserName
);
2491 TRACE("Name length: %lu\n", NameLength
);
2493 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2499 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2505 TRACE("EnumCount: %lu\n", EnumCount
);
2506 TRACE("RequiredLength: %lu\n", RequiredLength
);
2508 if (!NT_SUCCESS(Status
))
2511 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2512 if (EnumBuffer
== NULL
)
2514 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2518 EnumBuffer
->EntriesRead
= EnumCount
;
2522 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2523 if (EnumBuffer
->Buffer
== NULL
)
2525 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2531 EnumIndex
= *EnumerationContext
;
2532 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2534 NameLength
= 64 * sizeof(WCHAR
);
2535 DataLength
= sizeof(ULONG
);
2536 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2543 if (!NT_SUCCESS(Status
))
2545 if (Status
== STATUS_NO_MORE_ENTRIES
)
2546 Status
= STATUS_SUCCESS
;
2550 TRACE("EnumIndex: %lu\n", EnumIndex
);
2551 TRACE("User name: %S\n", UserName
);
2552 TRACE("Name length: %lu\n", NameLength
);
2553 TRACE("RID: %lu\n", Rid
);
2555 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2557 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2558 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2560 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2562 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2563 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2565 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2569 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2571 EnumBuffer
->Buffer
[i
].Name
.Length
);
2576 if (NT_SUCCESS(Status
))
2578 *EnumerationContext
+= EnumCount
;
2579 *Buffer
= EnumBuffer
;
2580 *CountReturned
= EnumCount
;
2584 *EnumerationContext
= 0;
2588 if (EnumBuffer
!= NULL
)
2590 if (EnumBuffer
->Buffer
!= NULL
)
2592 if (EnumBuffer
->EntriesRead
!= 0)
2594 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2596 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2597 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2601 midl_user_free(EnumBuffer
->Buffer
);
2604 midl_user_free(EnumBuffer
);
2608 if (NamesKeyHandle
!= NULL
)
2609 SampRegCloseKey(NamesKeyHandle
);
2611 if (UsersKeyHandle
!= NULL
)
2612 SampRegCloseKey(UsersKeyHandle
);
2614 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2615 Status
= STATUS_MORE_ENTRIES
;
2624 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
2625 IN PRPC_UNICODE_STRING AccountName
,
2626 IN ACCESS_MASK DesiredAccess
,
2627 OUT SAMPR_HANDLE
*AliasHandle
,
2628 OUT
unsigned long *RelativeId
)
2630 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2631 PSAM_DB_OBJECT DomainObject
;
2632 PSAM_DB_OBJECT AliasObject
;
2633 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
2639 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
2640 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
2642 /* Map generic access rights */
2643 RtlMapGenericMask(&DesiredAccess
,
2646 /* Validate the domain handle */
2647 Status
= SampValidateDbObject(DomainHandle
,
2649 DOMAIN_CREATE_ALIAS
,
2651 if (!NT_SUCCESS(Status
))
2653 TRACE("failed with status 0x%08lx\n", Status
);
2657 /* Check if the alias name already exists in the domain */
2658 Status
= SampCheckAccountNameInDomain(DomainObject
,
2659 AccountName
->Buffer
);
2660 if (!NT_SUCCESS(Status
))
2662 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
2663 AccountName
->Buffer
, Status
);
2667 /* Get the fixed domain attributes */
2668 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2669 Status
= SampGetObjectAttribute(DomainObject
,
2672 (PVOID
)&FixedDomainData
,
2674 if (!NT_SUCCESS(Status
))
2676 TRACE("failed with status 0x%08lx\n", Status
);
2680 /* Increment the NextRid attribute */
2681 ulRid
= FixedDomainData
.NextRid
;
2682 FixedDomainData
.NextRid
++;
2684 /* Store the fixed domain attributes */
2685 Status
= SampSetObjectAttribute(DomainObject
,
2690 if (!NT_SUCCESS(Status
))
2692 TRACE("failed with status 0x%08lx\n", Status
);
2696 TRACE("RID: %lx\n", ulRid
);
2698 /* Convert the RID into a string (hex) */
2699 swprintf(szRid
, L
"%08lX", ulRid
);
2701 /* Create the alias object */
2702 Status
= SampCreateDbObject(DomainObject
,
2709 if (!NT_SUCCESS(Status
))
2711 TRACE("failed with status 0x%08lx\n", Status
);
2715 /* Add the account name for the alias object */
2716 Status
= SampSetAccountNameInDomain(DomainObject
,
2718 AccountName
->Buffer
,
2720 if (!NT_SUCCESS(Status
))
2722 TRACE("failed with status 0x%08lx\n", Status
);
2726 /* Set the Name attribute */
2727 Status
= SampSetObjectAttribute(AliasObject
,
2730 (LPVOID
)AccountName
->Buffer
,
2731 AccountName
->MaximumLength
);
2732 if (!NT_SUCCESS(Status
))
2734 TRACE("failed with status 0x%08lx\n", Status
);
2738 /* Set the Description attribute */
2739 Status
= SampSetObjectAttribute(AliasObject
,
2743 EmptyString
.MaximumLength
);
2744 if (!NT_SUCCESS(Status
))
2746 TRACE("failed with status 0x%08lx\n", Status
);
2750 if (NT_SUCCESS(Status
))
2752 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
2753 *RelativeId
= ulRid
;
2756 TRACE("returns with status 0x%08lx\n", Status
);
2765 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
2766 IN OUT
unsigned long *EnumerationContext
,
2767 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2768 IN
unsigned long PreferedMaximumLength
,
2769 OUT
unsigned long *CountReturned
)
2771 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2772 PSAM_DB_OBJECT DomainObject
;
2773 HANDLE AliasesKeyHandle
= NULL
;
2774 HANDLE NamesKeyHandle
= NULL
;
2775 WCHAR AliasName
[64];
2777 ULONG EnumCount
= 0;
2778 ULONG RequiredLength
= 0;
2783 BOOLEAN MoreEntries
= FALSE
;
2786 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
2787 DomainHandle
, EnumerationContext
, Buffer
,
2788 PreferedMaximumLength
, CountReturned
);
2790 /* Validate the domain handle */
2791 Status
= SampValidateDbObject(DomainHandle
,
2793 DOMAIN_LIST_ACCOUNTS
,
2795 if (!NT_SUCCESS(Status
))
2798 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2802 if (!NT_SUCCESS(Status
))
2805 Status
= SampRegOpenKey(AliasesKeyHandle
,
2809 if (!NT_SUCCESS(Status
))
2814 EnumIndex
= *EnumerationContext
;
2818 NameLength
= 64 * sizeof(WCHAR
);
2819 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2826 if (!NT_SUCCESS(Status
))
2828 if (Status
== STATUS_NO_MORE_ENTRIES
)
2829 Status
= STATUS_SUCCESS
;
2833 TRACE("EnumIndex: %lu\n", EnumIndex
);
2834 TRACE("Alias name: %S\n", AliasName
);
2835 TRACE("Name length: %lu\n", NameLength
);
2837 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2843 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2849 TRACE("EnumCount: %lu\n", EnumCount
);
2850 TRACE("RequiredLength: %lu\n", RequiredLength
);
2852 if (!NT_SUCCESS(Status
))
2855 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2856 if (EnumBuffer
== NULL
)
2858 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2862 EnumBuffer
->EntriesRead
= EnumCount
;
2866 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2867 if (EnumBuffer
->Buffer
== NULL
)
2869 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2875 EnumIndex
= *EnumerationContext
;
2876 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2878 NameLength
= 64 * sizeof(WCHAR
);
2879 DataLength
= sizeof(ULONG
);
2880 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2887 if (!NT_SUCCESS(Status
))
2889 if (Status
== STATUS_NO_MORE_ENTRIES
)
2890 Status
= STATUS_SUCCESS
;
2894 TRACE("EnumIndex: %lu\n", EnumIndex
);
2895 TRACE("Alias name: %S\n", AliasName
);
2896 TRACE("Name length: %lu\n", NameLength
);
2897 TRACE("RID: %lu\n", Rid
);
2899 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2901 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2902 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(DataLength
+ sizeof(UNICODE_NULL
));
2904 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2906 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2907 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2909 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2913 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2915 EnumBuffer
->Buffer
[i
].Name
.Length
);
2920 if (NT_SUCCESS(Status
))
2922 *EnumerationContext
+= EnumCount
;
2923 *Buffer
= EnumBuffer
;
2924 *CountReturned
= EnumCount
;
2928 *EnumerationContext
= 0;
2932 if (EnumBuffer
!= NULL
)
2934 if (EnumBuffer
->Buffer
!= NULL
)
2936 if (EnumBuffer
->EntriesRead
!= 0)
2938 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2940 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2941 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2945 midl_user_free(EnumBuffer
->Buffer
);
2948 midl_user_free(EnumBuffer
);
2952 if (NamesKeyHandle
!= NULL
)
2953 SampRegCloseKey(NamesKeyHandle
);
2955 if (AliasesKeyHandle
!= NULL
)
2956 SampRegCloseKey(AliasesKeyHandle
);
2958 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
== TRUE
))
2959 Status
= STATUS_MORE_ENTRIES
;
2968 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
2969 IN PSAMPR_PSID_ARRAY SidArray
,
2970 OUT PSAMPR_ULONG_ARRAY Membership
)
2972 PSAM_DB_OBJECT DomainObject
;
2973 HANDLE AliasesKeyHandle
= NULL
;
2974 HANDLE MembersKeyHandle
= NULL
;
2975 HANDLE MemberKeyHandle
= NULL
;
2976 LPWSTR MemberSidString
= NULL
;
2977 PULONG RidArray
= NULL
;
2978 ULONG MaxSidCount
= 0;
2983 WCHAR NameBuffer
[9];
2985 TRACE("SamrGetAliasMembership(%p %p %p)\n",
2986 DomainHandle
, SidArray
, Membership
);
2988 /* Validate the domain handle */
2989 Status
= SampValidateDbObject(DomainHandle
,
2991 DOMAIN_GET_ALIAS_MEMBERSHIP
,
2993 if (!NT_SUCCESS(Status
))
2996 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3000 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3001 if (!NT_SUCCESS(Status
))
3004 Status
= SampRegOpenKey(AliasesKeyHandle
,
3008 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3010 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3012 Status
= STATUS_SUCCESS
;
3016 if (!NT_SUCCESS(Status
))
3019 for (i
= 0; i
< SidArray
->Count
; i
++)
3021 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3022 TRACE("Open %S\n", MemberSidString
);
3024 Status
= SampRegOpenKey(MembersKeyHandle
,
3028 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3029 if (NT_SUCCESS(Status
))
3031 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3034 if (NT_SUCCESS(Status
))
3036 TRACE("Found %lu values\n", ValueCount
);
3037 MaxSidCount
+= ValueCount
;
3040 NtClose(MemberKeyHandle
);
3043 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3044 Status
= STATUS_SUCCESS
;
3046 LocalFree(MemberSidString
);
3049 if (MaxSidCount
== 0)
3051 Status
= STATUS_SUCCESS
;
3055 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
3056 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
3057 if (RidArray
== NULL
)
3059 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3063 for (i
= 0; i
< SidArray
->Count
; i
++)
3065 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3066 TRACE("Open %S\n", MemberSidString
);
3068 Status
= SampRegOpenKey(MembersKeyHandle
,
3072 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3073 if (NT_SUCCESS(Status
))
3075 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3078 if (NT_SUCCESS(Status
))
3080 TRACE("Found %lu values\n", ValueCount
);
3082 for (j
= 0; j
< ValueCount
; j
++)
3084 DataLength
= 9 * sizeof(WCHAR
);
3085 Status
= SampRegEnumerateValue(MemberKeyHandle
,
3092 if (NT_SUCCESS(Status
))
3094 RidArray
[j
] = wcstoul(NameBuffer
, NULL
, 16);
3099 NtClose(MemberKeyHandle
);
3102 LocalFree(MemberSidString
);
3106 if (NT_SUCCESS(Status
))
3108 Membership
->Count
= MaxSidCount
;
3109 Membership
->Element
= RidArray
;
3113 if (RidArray
!= NULL
)
3114 midl_user_free(RidArray
);
3117 if (MembersKeyHandle
!= NULL
)
3118 NtClose(MembersKeyHandle
);
3120 if (MembersKeyHandle
!= NULL
)
3121 NtClose(MembersKeyHandle
);
3123 if (AliasesKeyHandle
!= NULL
)
3124 NtClose(AliasesKeyHandle
);
3133 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
3135 IN RPC_UNICODE_STRING Names
[],
3136 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
3137 OUT PSAMPR_ULONG_ARRAY Use
)
3139 PSAM_DB_OBJECT DomainObject
;
3140 HANDLE AccountsKeyHandle
;
3141 HANDLE NamesKeyHandle
;
3142 ULONG MappedCount
= 0;
3148 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
3149 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
3151 /* Validate the domain handle */
3152 Status
= SampValidateDbObject(DomainHandle
,
3156 if (!NT_SUCCESS(Status
))
3158 TRACE("failed with status 0x%08lx\n", Status
);
3162 RelativeIds
->Count
= 0;
3166 return STATUS_SUCCESS
;
3168 /* Allocate the relative IDs array */
3169 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3170 if (RelativeIds
->Element
== NULL
)
3172 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3176 /* Allocate the use array */
3177 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3178 if (Use
->Element
== NULL
)
3180 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3184 RelativeIds
->Count
= Count
;
3187 for (i
= 0; i
< Count
; i
++)
3189 TRACE("Name: %S\n", Names
[i
].Buffer
);
3193 /* Lookup aliases */
3194 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3197 &AccountsKeyHandle
);
3198 if (NT_SUCCESS(Status
))
3200 Status
= SampRegOpenKey(AccountsKeyHandle
,
3204 if (NT_SUCCESS(Status
))
3206 DataLength
= sizeof(ULONG
);
3207 Status
= SampRegQueryValue(NamesKeyHandle
,
3213 SampRegCloseKey(NamesKeyHandle
);
3216 SampRegCloseKey(AccountsKeyHandle
);
3219 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3222 /* Return alias account */
3223 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3225 TRACE("Rid: %lu\n", RelativeId
);
3226 RelativeIds
->Element
[i
] = RelativeId
;
3227 Use
->Element
[i
] = SidTypeAlias
;
3233 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3236 &AccountsKeyHandle
);
3237 if (NT_SUCCESS(Status
))
3239 Status
= SampRegOpenKey(AccountsKeyHandle
,
3243 if (NT_SUCCESS(Status
))
3245 DataLength
= sizeof(ULONG
);
3246 Status
= SampRegQueryValue(NamesKeyHandle
,
3252 SampRegCloseKey(NamesKeyHandle
);
3255 SampRegCloseKey(AccountsKeyHandle
);
3258 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3261 /* Return group account */
3262 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3264 TRACE("Rid: %lu\n", RelativeId
);
3265 RelativeIds
->Element
[i
] = RelativeId
;
3266 Use
->Element
[i
] = SidTypeGroup
;
3272 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3275 &AccountsKeyHandle
);
3276 if (NT_SUCCESS(Status
))
3278 Status
= SampRegOpenKey(AccountsKeyHandle
,
3282 if (NT_SUCCESS(Status
))
3284 DataLength
= sizeof(ULONG
);
3285 Status
= SampRegQueryValue(NamesKeyHandle
,
3291 SampRegCloseKey(NamesKeyHandle
);
3294 SampRegCloseKey(AccountsKeyHandle
);
3297 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3300 /* Return user account */
3301 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3303 TRACE("Rid: %lu\n", RelativeId
);
3304 RelativeIds
->Element
[i
] = RelativeId
;
3305 Use
->Element
[i
] = SidTypeUser
;
3310 /* Return unknown account */
3311 RelativeIds
->Element
[i
] = 0;
3312 Use
->Element
[i
] = SidTypeUnknown
;
3316 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3317 Status
= STATUS_SUCCESS
;
3319 if (NT_SUCCESS(Status
))
3321 if (MappedCount
== 0)
3322 Status
= STATUS_NONE_MAPPED
;
3323 else if (MappedCount
< Count
)
3324 Status
= STATUS_SOME_NOT_MAPPED
;
3328 if (RelativeIds
->Element
!= NULL
)
3330 midl_user_free(RelativeIds
->Element
);
3331 RelativeIds
->Element
= NULL
;
3334 RelativeIds
->Count
= 0;
3336 if (Use
->Element
!= NULL
)
3338 midl_user_free(Use
->Element
);
3339 Use
->Element
= NULL
;
3345 TRACE("Returned Status %lx\n", Status
);
3354 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3356 IN ULONG
*RelativeIds
,
3357 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3358 OUT PSAMPR_ULONG_ARRAY Use
)
3360 PSAM_DB_OBJECT DomainObject
;
3362 HANDLE AccountsKeyHandle
;
3363 HANDLE AccountKeyHandle
;
3364 ULONG MappedCount
= 0;
3369 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3370 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3372 /* Validate the domain handle */
3373 Status
= SampValidateDbObject(DomainHandle
,
3377 if (!NT_SUCCESS(Status
))
3379 TRACE("failed with status 0x%08lx\n", Status
);
3387 return STATUS_SUCCESS
;
3389 /* Allocate the names array */
3390 Names
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3391 if (Names
->Element
== NULL
)
3393 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3397 /* Allocate the use array */
3398 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3399 if (Use
->Element
== NULL
)
3401 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3405 Names
->Count
= Count
;
3408 for (i
= 0; i
< Count
; i
++)
3410 TRACE("RID: %lu\n", RelativeIds
[i
]);
3412 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3414 /* Lookup aliases */
3415 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3418 &AccountsKeyHandle
);
3419 if (NT_SUCCESS(Status
))
3421 Status
= SampRegOpenKey(AccountsKeyHandle
,
3425 if (NT_SUCCESS(Status
))
3428 Status
= SampRegQueryValue(AccountKeyHandle
,
3433 if (NT_SUCCESS(Status
))
3435 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3436 if (Names
->Element
[i
].Buffer
== NULL
)
3437 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3439 if (NT_SUCCESS(Status
))
3441 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3442 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3444 Status
= SampRegQueryValue(AccountKeyHandle
,
3447 Names
->Element
[i
].Buffer
,
3452 SampRegCloseKey(AccountKeyHandle
);
3455 SampRegCloseKey(AccountsKeyHandle
);
3458 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3461 /* Return alias account */
3462 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3464 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3465 Use
->Element
[i
] = SidTypeAlias
;
3471 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3474 &AccountsKeyHandle
);
3475 if (NT_SUCCESS(Status
))
3477 Status
= SampRegOpenKey(AccountsKeyHandle
,
3481 if (NT_SUCCESS(Status
))
3484 Status
= SampRegQueryValue(AccountKeyHandle
,
3489 if (NT_SUCCESS(Status
))
3491 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3492 if (Names
->Element
[i
].Buffer
== NULL
)
3493 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3495 if (NT_SUCCESS(Status
))
3497 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3498 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3500 Status
= SampRegQueryValue(AccountKeyHandle
,
3503 Names
->Element
[i
].Buffer
,
3508 SampRegCloseKey(AccountKeyHandle
);
3511 SampRegCloseKey(AccountsKeyHandle
);
3514 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3517 /* Return group account */
3518 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3520 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3521 Use
->Element
[i
] = SidTypeGroup
;
3527 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3530 &AccountsKeyHandle
);
3531 if (NT_SUCCESS(Status
))
3533 Status
= SampRegOpenKey(AccountsKeyHandle
,
3537 if (NT_SUCCESS(Status
))
3540 Status
= SampRegQueryValue(AccountKeyHandle
,
3545 if (NT_SUCCESS(Status
))
3547 TRACE("DataLength: %lu\n", DataLength
);
3549 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3550 if (Names
->Element
[i
].Buffer
== NULL
)
3551 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3553 if (NT_SUCCESS(Status
))
3555 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3556 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3558 Status
= SampRegQueryValue(AccountKeyHandle
,
3561 Names
->Element
[i
].Buffer
,
3566 SampRegCloseKey(AccountKeyHandle
);
3569 SampRegCloseKey(AccountsKeyHandle
);
3572 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3575 /* Return user account */
3576 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3578 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3579 Use
->Element
[i
] = SidTypeUser
;
3584 /* Return unknown account */
3585 Use
->Element
[i
] = SidTypeUnknown
;
3589 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3590 Status
= STATUS_SUCCESS
;
3592 if (NT_SUCCESS(Status
))
3594 if (MappedCount
== 0)
3595 Status
= STATUS_NONE_MAPPED
;
3596 else if (MappedCount
< Count
)
3597 Status
= STATUS_SOME_NOT_MAPPED
;
3601 if (Names
->Element
!= NULL
)
3603 for (i
= 0; i
< Count
; i
++)
3605 if (Names
->Element
[i
].Buffer
!= NULL
)
3606 midl_user_free(Names
->Element
[i
].Buffer
);
3609 midl_user_free(Names
->Element
);
3610 Names
->Element
= NULL
;
3615 if (Use
->Element
!= NULL
)
3617 midl_user_free(Use
->Element
);
3618 Use
->Element
= NULL
;
3631 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
3632 IN ACCESS_MASK DesiredAccess
,
3633 IN
unsigned long GroupId
,
3634 OUT SAMPR_HANDLE
*GroupHandle
)
3636 PSAM_DB_OBJECT DomainObject
;
3637 PSAM_DB_OBJECT GroupObject
;
3641 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
3642 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
3644 /* Map generic access rights */
3645 RtlMapGenericMask(&DesiredAccess
,
3648 /* Validate the domain handle */
3649 Status
= SampValidateDbObject(DomainHandle
,
3653 if (!NT_SUCCESS(Status
))
3655 TRACE("failed with status 0x%08lx\n", Status
);
3659 /* Convert the RID into a string (hex) */
3660 swprintf(szRid
, L
"%08lX", GroupId
);
3662 /* Create the group object */
3663 Status
= SampOpenDbObject(DomainObject
,
3670 if (!NT_SUCCESS(Status
))
3672 TRACE("failed with status 0x%08lx\n", Status
);
3676 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
3678 return STATUS_SUCCESS
;
3683 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
3684 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3686 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3687 SAM_GROUP_FIXED_DATA FixedData
;
3688 ULONG MembersLength
= 0;
3694 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3695 if (InfoBuffer
== NULL
)
3696 return STATUS_INSUFFICIENT_RESOURCES
;
3698 Status
= SampGetObjectAttributeString(GroupObject
,
3700 &InfoBuffer
->General
.Name
);
3701 if (!NT_SUCCESS(Status
))
3703 TRACE("Status 0x%08lx\n", Status
);
3707 Status
= SampGetObjectAttributeString(GroupObject
,
3709 &InfoBuffer
->General
.AdminComment
);
3710 if (!NT_SUCCESS(Status
))
3712 TRACE("Status 0x%08lx\n", Status
);
3716 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3717 Status
= SampGetObjectAttribute(GroupObject
,
3722 if (!NT_SUCCESS(Status
))
3725 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
3727 Status
= SampGetObjectAttribute(GroupObject
,
3732 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3735 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3736 InfoBuffer
->General
.MemberCount
= 0;
3738 InfoBuffer
->General
.MemberCount
= MembersLength
/ sizeof(ULONG
);
3740 *Buffer
= InfoBuffer
;
3743 if (!NT_SUCCESS(Status
))
3745 if (InfoBuffer
!= NULL
)
3747 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
3748 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
3750 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
3751 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
3753 midl_user_free(InfoBuffer
);
3762 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
3763 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3765 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3770 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3771 if (InfoBuffer
== NULL
)
3772 return STATUS_INSUFFICIENT_RESOURCES
;
3774 Status
= SampGetObjectAttributeString(GroupObject
,
3776 &InfoBuffer
->Name
.Name
);
3777 if (!NT_SUCCESS(Status
))
3779 TRACE("Status 0x%08lx\n", Status
);
3783 *Buffer
= InfoBuffer
;
3786 if (!NT_SUCCESS(Status
))
3788 if (InfoBuffer
!= NULL
)
3790 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
3791 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
3793 midl_user_free(InfoBuffer
);
3802 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3803 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3805 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3806 SAM_GROUP_FIXED_DATA FixedData
;
3812 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3813 if (InfoBuffer
== NULL
)
3814 return STATUS_INSUFFICIENT_RESOURCES
;
3816 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3817 Status
= SampGetObjectAttribute(GroupObject
,
3822 if (!NT_SUCCESS(Status
))
3825 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
3827 *Buffer
= InfoBuffer
;
3830 if (!NT_SUCCESS(Status
))
3832 if (InfoBuffer
!= NULL
)
3834 midl_user_free(InfoBuffer
);
3843 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
3844 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3846 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
3851 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
3852 if (InfoBuffer
== NULL
)
3853 return STATUS_INSUFFICIENT_RESOURCES
;
3855 Status
= SampGetObjectAttributeString(GroupObject
,
3857 &InfoBuffer
->AdminComment
.AdminComment
);
3858 if (!NT_SUCCESS(Status
))
3860 TRACE("Status 0x%08lx\n", Status
);
3864 *Buffer
= InfoBuffer
;
3867 if (!NT_SUCCESS(Status
))
3869 if (InfoBuffer
!= NULL
)
3871 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
3872 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
3874 midl_user_free(InfoBuffer
);
3885 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3886 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3887 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
3889 PSAM_DB_OBJECT GroupObject
;
3892 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
3893 GroupHandle
, GroupInformationClass
, Buffer
);
3895 /* Validate the group handle */
3896 Status
= SampValidateDbObject(GroupHandle
,
3898 GROUP_READ_INFORMATION
,
3900 if (!NT_SUCCESS(Status
))
3903 switch (GroupInformationClass
)
3905 case GroupGeneralInformation
:
3906 Status
= SampQueryGroupGeneral(GroupObject
,
3910 case GroupNameInformation
:
3911 Status
= SampQueryGroupName(GroupObject
,
3915 case GroupAttributeInformation
:
3916 Status
= SampQueryGroupAttribute(GroupObject
,
3920 case GroupAdminCommentInformation
:
3921 Status
= SampQueryGroupAdminComment(GroupObject
,
3926 Status
= STATUS_INVALID_INFO_CLASS
;
3935 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
3936 PSAMPR_GROUP_INFO_BUFFER Buffer
)
3938 SAM_GROUP_FIXED_DATA FixedData
;
3942 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
3943 Status
= SampGetObjectAttribute(GroupObject
,
3948 if (!NT_SUCCESS(Status
))
3951 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
3953 Status
= SampSetObjectAttribute(GroupObject
,
3967 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
3968 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
3969 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
3971 PSAM_DB_OBJECT GroupObject
;
3974 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
3975 GroupHandle
, GroupInformationClass
, Buffer
);
3977 /* Validate the group handle */
3978 Status
= SampValidateDbObject(GroupHandle
,
3980 GROUP_WRITE_ACCOUNT
,
3982 if (!NT_SUCCESS(Status
))
3985 switch (GroupInformationClass
)
3987 case GroupNameInformation
:
3988 Status
= SampSetObjectAttribute(GroupObject
,
3991 Buffer
->Name
.Name
.Buffer
,
3992 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
3995 case GroupAttributeInformation
:
3996 Status
= SampSetGroupAttribute(GroupObject
,
4000 case GroupAdminCommentInformation
:
4001 Status
= SampSetObjectAttribute(GroupObject
,
4004 Buffer
->AdminComment
.AdminComment
.Buffer
,
4005 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4009 Status
= STATUS_INVALID_INFO_CLASS
;
4020 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
4021 IN
unsigned long MemberId
,
4022 IN
unsigned long Attributes
)
4024 PSAM_DB_OBJECT GroupObject
;
4025 PSAM_DB_OBJECT UserObject
= NULL
;
4028 TRACE("(%p %lu %lx)\n",
4029 GroupHandle
, MemberId
, Attributes
);
4031 /* Validate the group handle */
4032 Status
= SampValidateDbObject(GroupHandle
,
4036 if (!NT_SUCCESS(Status
))
4039 /* Open the user object in the same domain */
4040 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4044 if (!NT_SUCCESS(Status
))
4046 TRACE("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4050 /* Add group membership to the user object */
4051 Status
= SampAddGroupMembershipToUser(UserObject
,
4052 GroupObject
->RelativeId
,
4054 if (!NT_SUCCESS(Status
))
4056 TRACE("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4060 /* Add the member to the group object */
4061 Status
= SampAddMemberToGroup(GroupObject
,
4063 if (!NT_SUCCESS(Status
))
4065 TRACE("SampAddMemberToGroup() failed (Status 0x%08lx)\n", Status
);
4070 SampCloseDbObject(UserObject
);
4079 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
4081 PSAM_DB_OBJECT GroupObject
;
4085 TRACE("(%p)\n", GroupHandle
);
4087 /* Validate the group handle */
4088 Status
= SampValidateDbObject(*GroupHandle
,
4092 if (!NT_SUCCESS(Status
))
4094 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
4098 /* Fail, if the group is built-in */
4099 if (GroupObject
->RelativeId
< 1000)
4101 TRACE("You can not delete a special account!\n");
4102 return STATUS_SPECIAL_ACCOUNT
;
4105 /* Get the length of the Members attribute */
4106 SampGetObjectAttribute(GroupObject
,
4112 /* Fail, if the group has members */
4115 TRACE("There are still members in the group!\n");
4116 return STATUS_MEMBER_IN_GROUP
;
4119 /* FIXME: Remove the group from all aliases */
4121 /* Delete the group from the database */
4122 Status
= SampDeleteAccountDbObject(GroupObject
);
4123 if (!NT_SUCCESS(Status
))
4125 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4129 /* Invalidate the handle */
4130 *GroupHandle
= NULL
;
4132 return STATUS_SUCCESS
;
4139 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
4140 IN
unsigned long MemberId
)
4142 PSAM_DB_OBJECT GroupObject
;
4143 PSAM_DB_OBJECT UserObject
= NULL
;
4147 GroupHandle
, MemberId
);
4149 /* Validate the group handle */
4150 Status
= SampValidateDbObject(GroupHandle
,
4152 GROUP_REMOVE_MEMBER
,
4154 if (!NT_SUCCESS(Status
))
4157 /* Open the user object in the same domain */
4158 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4162 if (!NT_SUCCESS(Status
))
4164 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4168 /* Remove group membership from the user object */
4169 Status
= SampRemoveGroupMembershipFromUser(UserObject
,
4170 GroupObject
->RelativeId
);
4171 if (!NT_SUCCESS(Status
))
4173 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4177 /* Remove the member from the group object */
4178 Status
= SampRemoveMemberFromGroup(GroupObject
,
4180 if (!NT_SUCCESS(Status
))
4182 ERR("SampRemoveMemberFromGroup() failed (Status 0x%08lx)\n", Status
);
4187 SampCloseDbObject(UserObject
);
4196 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
4197 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
4199 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
4200 PSAM_DB_OBJECT GroupObject
;
4205 /* Validate the group handle */
4206 Status
= SampValidateDbObject(GroupHandle
,
4210 if (!NT_SUCCESS(Status
))
4213 MembersBuffer
= midl_user_allocate(sizeof(SAMPR_GET_MEMBERS_BUFFER
));
4214 if (MembersBuffer
== NULL
)
4215 return STATUS_INSUFFICIENT_RESOURCES
;
4217 SampGetObjectAttribute(GroupObject
,
4225 MembersBuffer
->MemberCount
= 0;
4226 MembersBuffer
->Members
= NULL
;
4227 MembersBuffer
->Attributes
= NULL
;
4229 *Members
= MembersBuffer
;
4231 return STATUS_SUCCESS
;
4234 MembersBuffer
->Members
= midl_user_allocate(Length
);
4235 if (MembersBuffer
->Members
== NULL
)
4237 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4241 MembersBuffer
->Attributes
= midl_user_allocate(Length
);
4242 if (MembersBuffer
->Attributes
== NULL
)
4244 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4248 Status
= SampGetObjectAttribute(GroupObject
,
4251 MembersBuffer
->Members
,
4253 if (!NT_SUCCESS(Status
))
4255 TRACE("SampGetObjectAttributes() failed (Status 0x%08lx)\n", Status
);
4259 MembersBuffer
->MemberCount
= Length
/ sizeof(ULONG
);
4261 for (i
= 0; i
< MembersBuffer
->MemberCount
; i
++)
4263 Status
= SampGetUserGroupAttributes(GroupObject
->ParentObject
,
4264 MembersBuffer
->Members
[i
],
4265 GroupObject
->RelativeId
,
4266 &(MembersBuffer
->Attributes
[i
]));
4267 if (!NT_SUCCESS(Status
))
4269 TRACE("SampGetUserGroupAttributes() failed (Status 0x%08lx)\n", Status
);
4274 *Members
= MembersBuffer
;
4277 if (!NT_SUCCESS(Status
))
4279 if (MembersBuffer
!= NULL
)
4281 if (MembersBuffer
->Members
!= NULL
)
4282 midl_user_free(MembersBuffer
->Members
);
4284 if (MembersBuffer
->Attributes
!= NULL
)
4285 midl_user_free(MembersBuffer
->Attributes
);
4287 midl_user_free(MembersBuffer
);
4298 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
4299 IN
unsigned long MemberId
,
4300 IN
unsigned long Attributes
)
4302 PSAM_DB_OBJECT GroupObject
;
4305 /* Validate the group handle */
4306 Status
= SampValidateDbObject(GroupHandle
,
4310 if (!NT_SUCCESS(Status
))
4312 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
4316 Status
= SampSetUserGroupAttributes(GroupObject
->ParentObject
,
4318 GroupObject
->RelativeId
,
4320 if (!NT_SUCCESS(Status
))
4322 TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status
);
4332 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
4333 IN ACCESS_MASK DesiredAccess
,
4335 OUT SAMPR_HANDLE
*AliasHandle
)
4337 PSAM_DB_OBJECT DomainObject
;
4338 PSAM_DB_OBJECT AliasObject
;
4342 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4343 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4345 /* Map generic access rights */
4346 RtlMapGenericMask(&DesiredAccess
,
4349 /* Validate the domain handle */
4350 Status
= SampValidateDbObject(DomainHandle
,
4354 if (!NT_SUCCESS(Status
))
4356 TRACE("failed with status 0x%08lx\n", Status
);
4360 /* Convert the RID into a string (hex) */
4361 swprintf(szRid
, L
"%08lX", AliasId
);
4363 /* Create the alias object */
4364 Status
= SampOpenDbObject(DomainObject
,
4371 if (!NT_SUCCESS(Status
))
4373 TRACE("failed with status 0x%08lx\n", Status
);
4377 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4379 return STATUS_SUCCESS
;
4384 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4385 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4387 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4388 HANDLE MembersKeyHandle
= NULL
;
4393 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4394 if (InfoBuffer
== NULL
)
4395 return STATUS_INSUFFICIENT_RESOURCES
;
4397 Status
= SampGetObjectAttributeString(AliasObject
,
4399 &InfoBuffer
->General
.Name
);
4400 if (!NT_SUCCESS(Status
))
4402 TRACE("Status 0x%08lx\n", Status
);
4406 Status
= SampGetObjectAttributeString(AliasObject
,
4408 &InfoBuffer
->General
.AdminComment
);
4409 if (!NT_SUCCESS(Status
))
4411 TRACE("Status 0x%08lx\n", Status
);
4415 /* Open the Members subkey */
4416 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4420 if (NT_SUCCESS(Status
))
4422 /* Retrieve the number of members of the alias */
4423 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4425 &InfoBuffer
->General
.MemberCount
);
4426 if (!NT_SUCCESS(Status
))
4428 TRACE("Status 0x%08lx\n", Status
);
4432 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4434 InfoBuffer
->General
.MemberCount
= 0;
4435 Status
= STATUS_SUCCESS
;
4439 TRACE("Status 0x%08lx\n", Status
);
4443 *Buffer
= InfoBuffer
;
4446 if (MembersKeyHandle
!= NULL
)
4447 SampRegCloseKey(MembersKeyHandle
);
4449 if (!NT_SUCCESS(Status
))
4451 if (InfoBuffer
!= NULL
)
4453 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4454 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4456 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4457 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4459 midl_user_free(InfoBuffer
);
4468 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
4469 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4471 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4476 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4477 if (InfoBuffer
== NULL
)
4478 return STATUS_INSUFFICIENT_RESOURCES
;
4480 Status
= SampGetObjectAttributeString(AliasObject
,
4482 &InfoBuffer
->Name
.Name
);
4483 if (!NT_SUCCESS(Status
))
4485 TRACE("Status 0x%08lx\n", Status
);
4489 *Buffer
= InfoBuffer
;
4492 if (!NT_SUCCESS(Status
))
4494 if (InfoBuffer
!= NULL
)
4496 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4497 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4499 midl_user_free(InfoBuffer
);
4508 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
4509 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4511 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4516 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4517 if (InfoBuffer
== NULL
)
4518 return STATUS_INSUFFICIENT_RESOURCES
;
4520 Status
= SampGetObjectAttributeString(AliasObject
,
4522 &InfoBuffer
->AdminComment
.AdminComment
);
4523 if (!NT_SUCCESS(Status
))
4525 TRACE("Status 0x%08lx\n", Status
);
4529 *Buffer
= InfoBuffer
;
4532 if (!NT_SUCCESS(Status
))
4534 if (InfoBuffer
!= NULL
)
4536 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4537 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4539 midl_user_free(InfoBuffer
);
4550 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4551 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4552 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4554 PSAM_DB_OBJECT AliasObject
;
4557 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
4558 AliasHandle
, AliasInformationClass
, Buffer
);
4560 /* Validate the alias handle */
4561 Status
= SampValidateDbObject(AliasHandle
,
4563 ALIAS_READ_INFORMATION
,
4565 if (!NT_SUCCESS(Status
))
4568 switch (AliasInformationClass
)
4570 case AliasGeneralInformation
:
4571 Status
= SampQueryAliasGeneral(AliasObject
,
4575 case AliasNameInformation
:
4576 Status
= SampQueryAliasName(AliasObject
,
4580 case AliasAdminCommentInformation
:
4581 Status
= SampQueryAliasAdminComment(AliasObject
,
4586 Status
= STATUS_INVALID_INFO_CLASS
;
4597 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
4598 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
4599 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
4601 PSAM_DB_OBJECT AliasObject
;
4604 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
4605 AliasHandle
, AliasInformationClass
, Buffer
);
4607 /* Validate the alias handle */
4608 Status
= SampValidateDbObject(AliasHandle
,
4610 ALIAS_WRITE_ACCOUNT
,
4612 if (!NT_SUCCESS(Status
))
4615 switch (AliasInformationClass
)
4617 case AliasNameInformation
:
4618 Status
= SampSetObjectAttribute(AliasObject
,
4621 Buffer
->Name
.Name
.Buffer
,
4622 Buffer
->Name
.Name
.Length
+ sizeof(WCHAR
));
4625 case AliasAdminCommentInformation
:
4626 Status
= SampSetObjectAttribute(AliasObject
,
4629 Buffer
->AdminComment
.AdminComment
.Buffer
,
4630 Buffer
->AdminComment
.AdminComment
.Length
+ sizeof(WCHAR
));
4634 Status
= STATUS_INVALID_INFO_CLASS
;
4645 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
4647 PSAM_DB_OBJECT AliasObject
;
4650 /* Validate the alias handle */
4651 Status
= SampValidateDbObject(AliasHandle
,
4655 if (!NT_SUCCESS(Status
))
4657 TRACE("failed with status 0x%08lx\n", Status
);
4661 /* Fail, if the alias is built-in */
4662 if (AliasObject
->RelativeId
< 1000)
4664 TRACE("You can not delete a special account!\n");
4665 return STATUS_SPECIAL_ACCOUNT
;
4668 /* FIXME: Remove all members from the alias */
4670 /* Delete the alias from the database */
4671 Status
= SampDeleteAccountDbObject(AliasObject
);
4672 if (!NT_SUCCESS(Status
))
4674 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4678 /* Invalidate the handle */
4679 *AliasHandle
= NULL
;
4688 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
4689 IN PRPC_SID MemberId
)
4691 PSAM_DB_OBJECT AliasObject
;
4692 LPWSTR MemberIdString
= NULL
;
4693 HANDLE MembersKeyHandle
= NULL
;
4694 HANDLE MemberKeyHandle
= NULL
;
4695 ULONG MemberIdLength
;
4698 TRACE("SamrAddMemberToAlias(%p %p)\n",
4699 AliasHandle
, MemberId
);
4701 /* Validate the alias handle */
4702 Status
= SampValidateDbObject(AliasHandle
,
4706 if (!NT_SUCCESS(Status
))
4708 TRACE("failed with status 0x%08lx\n", Status
);
4712 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4713 TRACE("Member SID: %S\n", MemberIdString
);
4715 MemberIdLength
= RtlLengthSid(MemberId
);
4717 Status
= SampRegCreateKey(AliasObject
->KeyHandle
,
4721 if (!NT_SUCCESS(Status
))
4723 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4727 Status
= SampRegSetValue(MembersKeyHandle
,
4732 if (!NT_SUCCESS(Status
))
4734 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4738 Status
= SampRegCreateKey(AliasObject
->MembersKeyHandle
,
4742 if (!NT_SUCCESS(Status
))
4744 TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status
);
4748 Status
= SampRegSetValue(MemberKeyHandle
,
4753 if (!NT_SUCCESS(Status
))
4755 TRACE("SampRegSetValue failed with status 0x%08lx\n", Status
);
4760 if (MemberKeyHandle
!= NULL
)
4761 SampRegCloseKey(MemberKeyHandle
);
4763 if (MembersKeyHandle
!= NULL
)
4764 SampRegCloseKey(MembersKeyHandle
);
4766 if (MemberIdString
!= NULL
)
4767 LocalFree(MemberIdString
);
4776 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
4777 IN PRPC_SID MemberId
)
4779 PSAM_DB_OBJECT AliasObject
;
4780 LPWSTR MemberIdString
= NULL
;
4781 HANDLE MembersKeyHandle
= NULL
;
4782 HANDLE MemberKeyHandle
= NULL
;
4786 TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
4787 AliasHandle
, MemberId
);
4789 /* Validate the alias handle */
4790 Status
= SampValidateDbObject(AliasHandle
,
4792 ALIAS_REMOVE_MEMBER
,
4794 if (!NT_SUCCESS(Status
))
4796 TRACE("failed with status 0x%08lx\n", Status
);
4800 ConvertSidToStringSidW(MemberId
, &MemberIdString
);
4801 TRACE("Member SID: %S\n", MemberIdString
);
4803 Status
= SampRegOpenKey(AliasObject
->MembersKeyHandle
,
4805 KEY_WRITE
| KEY_QUERY_VALUE
,
4807 if (!NT_SUCCESS(Status
))
4809 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4813 Status
= SampRegDeleteValue(MemberKeyHandle
,
4815 if (!NT_SUCCESS(Status
))
4817 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4821 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
4824 if (!NT_SUCCESS(Status
))
4826 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4830 if (ulValueCount
== 0)
4832 SampRegCloseKey(MemberKeyHandle
);
4833 MemberKeyHandle
= NULL
;
4835 Status
= SampRegDeleteKey(AliasObject
->MembersKeyHandle
,
4837 if (!NT_SUCCESS(Status
))
4839 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4844 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4846 KEY_WRITE
| KEY_QUERY_VALUE
,
4848 if (!NT_SUCCESS(Status
))
4850 TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4854 Status
= SampRegDeleteValue(MembersKeyHandle
,
4856 if (!NT_SUCCESS(Status
))
4858 TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status
);
4862 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4865 if (!NT_SUCCESS(Status
))
4867 TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4871 if (ulValueCount
== 0)
4873 SampRegCloseKey(MembersKeyHandle
);
4874 MembersKeyHandle
= NULL
;
4876 Status
= SampRegDeleteKey(AliasObject
->KeyHandle
,
4878 if (!NT_SUCCESS(Status
))
4880 TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status
);
4886 if (MemberKeyHandle
!= NULL
)
4887 SampRegCloseKey(MemberKeyHandle
);
4889 if (MembersKeyHandle
!= NULL
)
4890 SampRegCloseKey(MembersKeyHandle
);
4892 if (MemberIdString
!= NULL
)
4893 LocalFree(MemberIdString
);
4902 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
4903 OUT PSAMPR_PSID_ARRAY_OUT Members
)
4905 PSAM_DB_OBJECT AliasObject
;
4906 HANDLE MembersKeyHandle
= NULL
;
4907 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
4908 ULONG ValueCount
= 0;
4913 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
4914 AliasHandle
, Members
);
4916 /* Validate the alias handle */
4917 Status
= SampValidateDbObject(AliasHandle
,
4921 if (!NT_SUCCESS(Status
))
4923 ERR("failed with status 0x%08lx\n", Status
);
4927 /* Open the members key of the alias objct */
4928 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
4932 if (!NT_SUCCESS(Status
))
4934 ERR("SampRegOpenKey failed with status 0x%08lx\n", Status
);
4938 /* Get the number of members */
4939 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
4942 if (!NT_SUCCESS(Status
))
4944 ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status
);
4948 /* Allocate the member array */
4949 MemberArray
= midl_user_allocate(ValueCount
* sizeof(SAMPR_SID_INFORMATION
));
4950 if (MemberArray
== NULL
)
4952 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4956 /* Enumerate the members */
4960 /* Get the size of the next SID */
4962 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4969 if (!NT_SUCCESS(Status
))
4971 if (Status
== STATUS_NO_MORE_ENTRIES
)
4972 Status
= STATUS_SUCCESS
;
4976 /* Allocate a buffer for the SID */
4977 MemberArray
[Index
].SidPointer
= midl_user_allocate(DataLength
);
4978 if (MemberArray
[Index
].SidPointer
== NULL
)
4980 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4984 /* Read the SID into the buffer */
4985 Status
= SampRegEnumerateValue(MembersKeyHandle
,
4990 (PVOID
)MemberArray
[Index
].SidPointer
,
4992 if (!NT_SUCCESS(Status
))
5000 /* Return the number of members and the member array */
5001 if (NT_SUCCESS(Status
))
5003 Members
->Count
= ValueCount
;
5004 Members
->Sids
= MemberArray
;
5008 /* Clean up the members array and the SID buffers if something failed */
5009 if (!NT_SUCCESS(Status
))
5011 if (MemberArray
!= NULL
)
5013 for (Index
= 0; Index
< ValueCount
; Index
++)
5015 if (MemberArray
[Index
].SidPointer
!= NULL
)
5016 midl_user_free(MemberArray
[Index
].SidPointer
);
5019 midl_user_free(MemberArray
);
5023 /* Close the members key */
5024 if (MembersKeyHandle
!= NULL
)
5025 SampRegCloseKey(MembersKeyHandle
);
5034 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
5035 IN ACCESS_MASK DesiredAccess
,
5036 IN
unsigned long UserId
,
5037 OUT SAMPR_HANDLE
*UserHandle
)
5039 PSAM_DB_OBJECT DomainObject
;
5040 PSAM_DB_OBJECT UserObject
;
5044 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
5045 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
5047 /* Map generic access rights */
5048 RtlMapGenericMask(&DesiredAccess
,
5051 /* Validate the domain handle */
5052 Status
= SampValidateDbObject(DomainHandle
,
5056 if (!NT_SUCCESS(Status
))
5058 TRACE("failed with status 0x%08lx\n", Status
);
5062 /* Convert the RID into a string (hex) */
5063 swprintf(szRid
, L
"%08lX", UserId
);
5065 /* Create the user object */
5066 Status
= SampOpenDbObject(DomainObject
,
5073 if (!NT_SUCCESS(Status
))
5075 TRACE("failed with status 0x%08lx\n", Status
);
5079 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
5081 return STATUS_SUCCESS
;
5088 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
5090 PSAM_DB_OBJECT UserObject
;
5093 TRACE("(%p)\n", UserHandle
);
5095 /* Validate the user handle */
5096 Status
= SampValidateDbObject(*UserHandle
,
5100 if (!NT_SUCCESS(Status
))
5102 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
5106 /* Fail, if the user is built-in */
5107 if (UserObject
->RelativeId
< 1000)
5109 TRACE("You can not delete a special account!\n");
5110 return STATUS_SPECIAL_ACCOUNT
;
5113 /* FIXME: Remove the user from all groups */
5115 /* FIXME: Remove the user from all aliases */
5117 /* Delete the user from the database */
5118 Status
= SampDeleteAccountDbObject(UserObject
);
5119 if (!NT_SUCCESS(Status
))
5121 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5125 /* Invalidate the handle */
5128 return STATUS_SUCCESS
;
5134 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
5135 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5137 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5138 SAM_USER_FIXED_DATA FixedData
;
5144 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5145 if (InfoBuffer
== NULL
)
5146 return STATUS_INSUFFICIENT_RESOURCES
;
5148 Length
= sizeof(SAM_USER_FIXED_DATA
);
5149 Status
= SampGetObjectAttribute(UserObject
,
5154 if (!NT_SUCCESS(Status
))
5157 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5159 /* Get the Name string */
5160 Status
= SampGetObjectAttributeString(UserObject
,
5162 &InfoBuffer
->General
.UserName
);
5163 if (!NT_SUCCESS(Status
))
5165 TRACE("Status 0x%08lx\n", Status
);
5169 /* Get the FullName string */
5170 Status
= SampGetObjectAttributeString(UserObject
,
5172 &InfoBuffer
->General
.FullName
);
5173 if (!NT_SUCCESS(Status
))
5175 TRACE("Status 0x%08lx\n", Status
);
5179 /* Get the AdminComment string */
5180 Status
= SampGetObjectAttributeString(UserObject
,
5182 &InfoBuffer
->General
.AdminComment
);
5183 if (!NT_SUCCESS(Status
))
5185 TRACE("Status 0x%08lx\n", Status
);
5189 /* Get the UserComment string */
5190 Status
= SampGetObjectAttributeString(UserObject
,
5192 &InfoBuffer
->General
.UserComment
);
5193 if (!NT_SUCCESS(Status
))
5195 TRACE("Status 0x%08lx\n", Status
);
5199 *Buffer
= InfoBuffer
;
5202 if (!NT_SUCCESS(Status
))
5204 if (InfoBuffer
!= NULL
)
5206 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
5207 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
5209 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
5210 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
5212 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
5213 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
5215 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
5216 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
5218 midl_user_free(InfoBuffer
);
5228 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
5229 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5231 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5232 SAM_USER_FIXED_DATA FixedData
;
5238 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5239 if (InfoBuffer
== NULL
)
5240 return STATUS_INSUFFICIENT_RESOURCES
;
5242 Length
= sizeof(SAM_USER_FIXED_DATA
);
5243 Status
= SampGetObjectAttribute(UserObject
,
5248 if (!NT_SUCCESS(Status
))
5251 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
5252 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
5254 /* Get the UserComment string */
5255 Status
= SampGetObjectAttributeString(UserObject
,
5257 &InfoBuffer
->Preferences
.UserComment
);
5258 if (!NT_SUCCESS(Status
))
5260 TRACE("Status 0x%08lx\n", Status
);
5264 *Buffer
= InfoBuffer
;
5267 if (!NT_SUCCESS(Status
))
5269 if (InfoBuffer
!= NULL
)
5271 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
5272 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
5274 midl_user_free(InfoBuffer
);
5284 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
5285 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5287 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5288 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
5289 SAM_USER_FIXED_DATA FixedData
;
5290 LARGE_INTEGER PasswordCanChange
;
5291 LARGE_INTEGER PasswordMustChange
;
5297 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5298 if (InfoBuffer
== NULL
)
5299 return STATUS_INSUFFICIENT_RESOURCES
;
5301 /* Get the fixed size domain data */
5302 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
5303 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
5306 (PVOID
)&DomainFixedData
,
5308 if (!NT_SUCCESS(Status
))
5311 /* Get the fixed size user data */
5312 Length
= sizeof(SAM_USER_FIXED_DATA
);
5313 Status
= SampGetObjectAttribute(UserObject
,
5318 if (!NT_SUCCESS(Status
))
5321 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
5322 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5323 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5324 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5325 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5326 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5327 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5328 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5329 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5330 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
5331 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
5333 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5334 DomainFixedData
.MinPasswordAge
);
5335 InfoBuffer
->Logon
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
5336 InfoBuffer
->Logon
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
5338 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5339 DomainFixedData
.MaxPasswordAge
);
5340 InfoBuffer
->Logon
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
5341 InfoBuffer
->Logon
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
5343 /* Get the Name string */
5344 Status
= SampGetObjectAttributeString(UserObject
,
5346 &InfoBuffer
->Logon
.UserName
);
5347 if (!NT_SUCCESS(Status
))
5349 TRACE("Status 0x%08lx\n", Status
);
5353 /* Get the FullName string */
5354 Status
= SampGetObjectAttributeString(UserObject
,
5356 &InfoBuffer
->Logon
.FullName
);
5357 if (!NT_SUCCESS(Status
))
5359 TRACE("Status 0x%08lx\n", Status
);
5363 /* Get the HomeDirectory string */
5364 Status
= SampGetObjectAttributeString(UserObject
,
5366 &InfoBuffer
->Logon
.HomeDirectory
);
5367 if (!NT_SUCCESS(Status
))
5369 TRACE("Status 0x%08lx\n", Status
);
5373 /* Get the HomeDirectoryDrive string */
5374 Status
= SampGetObjectAttributeString(UserObject
,
5375 L
"HomeDirectoryDrive",
5376 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
5377 if (!NT_SUCCESS(Status
))
5379 TRACE("Status 0x%08lx\n", Status
);
5383 /* Get the ScriptPath string */
5384 Status
= SampGetObjectAttributeString(UserObject
,
5386 &InfoBuffer
->Logon
.ScriptPath
);
5387 if (!NT_SUCCESS(Status
))
5389 TRACE("Status 0x%08lx\n", Status
);
5393 /* Get the ProfilePath string */
5394 Status
= SampGetObjectAttributeString(UserObject
,
5396 &InfoBuffer
->Logon
.ProfilePath
);
5397 if (!NT_SUCCESS(Status
))
5399 TRACE("Status 0x%08lx\n", Status
);
5403 /* Get the WorkStations string */
5404 Status
= SampGetObjectAttributeString(UserObject
,
5406 &InfoBuffer
->Logon
.WorkStations
);
5407 if (!NT_SUCCESS(Status
))
5409 TRACE("Status 0x%08lx\n", Status
);
5413 /* FIXME: LogonHours */
5415 *Buffer
= InfoBuffer
;
5418 if (!NT_SUCCESS(Status
))
5420 if (InfoBuffer
!= NULL
)
5422 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
5423 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
5425 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
5426 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
5428 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
5429 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5431 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5432 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5434 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5435 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5437 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5438 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5440 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5441 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5443 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5444 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5446 midl_user_free(InfoBuffer
);
5456 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5457 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5459 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5460 SAM_USER_FIXED_DATA FixedData
;
5466 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5467 if (InfoBuffer
== NULL
)
5468 return STATUS_INSUFFICIENT_RESOURCES
;
5470 Length
= sizeof(SAM_USER_FIXED_DATA
);
5471 Status
= SampGetObjectAttribute(UserObject
,
5476 if (!NT_SUCCESS(Status
))
5479 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5480 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5481 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5482 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5483 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5484 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5485 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5486 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5487 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
5488 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
5489 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5490 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
5491 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
5493 /* Get the Name string */
5494 Status
= SampGetObjectAttributeString(UserObject
,
5496 &InfoBuffer
->Account
.UserName
);
5497 if (!NT_SUCCESS(Status
))
5499 TRACE("Status 0x%08lx\n", Status
);
5503 /* Get the FullName string */
5504 Status
= SampGetObjectAttributeString(UserObject
,
5506 &InfoBuffer
->Account
.FullName
);
5507 if (!NT_SUCCESS(Status
))
5509 TRACE("Status 0x%08lx\n", Status
);
5513 /* Get the HomeDirectory string */
5514 Status
= SampGetObjectAttributeString(UserObject
,
5516 &InfoBuffer
->Account
.HomeDirectory
);
5517 if (!NT_SUCCESS(Status
))
5519 TRACE("Status 0x%08lx\n", Status
);
5523 /* Get the HomeDirectoryDrive string */
5524 Status
= SampGetObjectAttributeString(UserObject
,
5525 L
"HomeDirectoryDrive",
5526 &InfoBuffer
->Account
.HomeDirectoryDrive
);
5527 if (!NT_SUCCESS(Status
))
5529 TRACE("Status 0x%08lx\n", Status
);
5533 /* Get the ScriptPath string */
5534 Status
= SampGetObjectAttributeString(UserObject
,
5536 &InfoBuffer
->Account
.ScriptPath
);
5537 if (!NT_SUCCESS(Status
))
5539 TRACE("Status 0x%08lx\n", Status
);
5543 /* Get the ProfilePath string */
5544 Status
= SampGetObjectAttributeString(UserObject
,
5546 &InfoBuffer
->Account
.ProfilePath
);
5547 if (!NT_SUCCESS(Status
))
5549 TRACE("Status 0x%08lx\n", Status
);
5553 /* Get the AdminComment string */
5554 Status
= SampGetObjectAttributeString(UserObject
,
5556 &InfoBuffer
->Account
.AdminComment
);
5557 if (!NT_SUCCESS(Status
))
5559 TRACE("Status 0x%08lx\n", Status
);
5563 /* Get the WorkStations string */
5564 Status
= SampGetObjectAttributeString(UserObject
,
5566 &InfoBuffer
->Account
.WorkStations
);
5567 if (!NT_SUCCESS(Status
))
5569 TRACE("Status 0x%08lx\n", Status
);
5573 /* FIXME: LogonHours */
5575 *Buffer
= InfoBuffer
;
5578 if (!NT_SUCCESS(Status
))
5580 if (InfoBuffer
!= NULL
)
5582 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
5583 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
5585 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
5586 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
5588 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
5589 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
5591 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
5592 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
5594 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
5595 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
5597 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
5598 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
5600 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
5601 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
5603 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
5604 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
5606 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
5607 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
5609 midl_user_free(InfoBuffer
);
5616 /* FIXME: SampQueryUserLogonHours */
5620 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
5621 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5623 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5628 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5629 if (InfoBuffer
== NULL
)
5630 return STATUS_INSUFFICIENT_RESOURCES
;
5632 /* Get the Name string */
5633 Status
= SampGetObjectAttributeString(UserObject
,
5635 &InfoBuffer
->Name
.UserName
);
5636 if (!NT_SUCCESS(Status
))
5638 TRACE("Status 0x%08lx\n", Status
);
5642 /* Get the FullName string */
5643 Status
= SampGetObjectAttributeString(UserObject
,
5645 &InfoBuffer
->Name
.FullName
);
5646 if (!NT_SUCCESS(Status
))
5648 TRACE("Status 0x%08lx\n", Status
);
5652 *Buffer
= InfoBuffer
;
5655 if (!NT_SUCCESS(Status
))
5657 if (InfoBuffer
!= NULL
)
5659 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
5660 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
5662 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
5663 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
5665 midl_user_free(InfoBuffer
);
5674 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
5675 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5677 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5682 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5683 if (InfoBuffer
== NULL
)
5684 return STATUS_INSUFFICIENT_RESOURCES
;
5686 /* Get the Name string */
5687 Status
= SampGetObjectAttributeString(UserObject
,
5689 &InfoBuffer
->AccountName
.UserName
);
5690 if (!NT_SUCCESS(Status
))
5692 TRACE("Status 0x%08lx\n", Status
);
5696 *Buffer
= InfoBuffer
;
5699 if (!NT_SUCCESS(Status
))
5701 if (InfoBuffer
!= NULL
)
5703 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
5704 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
5706 midl_user_free(InfoBuffer
);
5715 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
5716 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5718 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5723 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5724 if (InfoBuffer
== NULL
)
5725 return STATUS_INSUFFICIENT_RESOURCES
;
5727 /* Get the FullName string */
5728 Status
= SampGetObjectAttributeString(UserObject
,
5730 &InfoBuffer
->FullName
.FullName
);
5731 if (!NT_SUCCESS(Status
))
5733 TRACE("Status 0x%08lx\n", Status
);
5737 *Buffer
= InfoBuffer
;
5740 if (!NT_SUCCESS(Status
))
5742 if (InfoBuffer
!= NULL
)
5744 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
5745 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
5747 midl_user_free(InfoBuffer
);
5757 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
5758 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5760 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5761 SAM_USER_FIXED_DATA FixedData
;
5767 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5768 if (InfoBuffer
== NULL
)
5769 return STATUS_INSUFFICIENT_RESOURCES
;
5771 Length
= sizeof(SAM_USER_FIXED_DATA
);
5772 Status
= SampGetObjectAttribute(UserObject
,
5777 if (!NT_SUCCESS(Status
))
5780 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5782 *Buffer
= InfoBuffer
;
5785 if (!NT_SUCCESS(Status
))
5787 if (InfoBuffer
!= NULL
)
5789 midl_user_free(InfoBuffer
);
5798 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
5799 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5801 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5806 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5807 if (InfoBuffer
== NULL
)
5808 return STATUS_INSUFFICIENT_RESOURCES
;
5810 /* Get the HomeDirectory string */
5811 Status
= SampGetObjectAttributeString(UserObject
,
5813 &InfoBuffer
->Home
.HomeDirectory
);
5814 if (!NT_SUCCESS(Status
))
5816 TRACE("Status 0x%08lx\n", Status
);
5820 /* Get the HomeDirectoryDrive string */
5821 Status
= SampGetObjectAttributeString(UserObject
,
5822 L
"HomeDirectoryDrive",
5823 &InfoBuffer
->Home
.HomeDirectoryDrive
);
5824 if (!NT_SUCCESS(Status
))
5826 TRACE("Status 0x%08lx\n", Status
);
5830 *Buffer
= InfoBuffer
;
5833 if (!NT_SUCCESS(Status
))
5835 if (InfoBuffer
!= NULL
)
5837 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
5838 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
5840 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
5841 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
5843 midl_user_free(InfoBuffer
);
5852 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
5853 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5855 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5860 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5861 if (InfoBuffer
== NULL
)
5862 return STATUS_INSUFFICIENT_RESOURCES
;
5864 /* Get the ScriptPath string */
5865 Status
= SampGetObjectAttributeString(UserObject
,
5867 &InfoBuffer
->Script
.ScriptPath
);
5868 if (!NT_SUCCESS(Status
))
5870 TRACE("Status 0x%08lx\n", Status
);
5874 *Buffer
= InfoBuffer
;
5877 if (!NT_SUCCESS(Status
))
5879 if (InfoBuffer
!= NULL
)
5881 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
5882 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
5884 midl_user_free(InfoBuffer
);
5893 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
5894 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5896 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5901 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5902 if (InfoBuffer
== NULL
)
5903 return STATUS_INSUFFICIENT_RESOURCES
;
5905 /* Get the ProfilePath string */
5906 Status
= SampGetObjectAttributeString(UserObject
,
5908 &InfoBuffer
->Profile
.ProfilePath
);
5909 if (!NT_SUCCESS(Status
))
5911 TRACE("Status 0x%08lx\n", Status
);
5915 *Buffer
= InfoBuffer
;
5918 if (!NT_SUCCESS(Status
))
5920 if (InfoBuffer
!= NULL
)
5922 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
5923 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
5925 midl_user_free(InfoBuffer
);
5934 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
5935 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5937 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5942 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5943 if (InfoBuffer
== NULL
)
5944 return STATUS_INSUFFICIENT_RESOURCES
;
5946 /* Get the AdminComment string */
5947 Status
= SampGetObjectAttributeString(UserObject
,
5949 &InfoBuffer
->AdminComment
.AdminComment
);
5950 if (!NT_SUCCESS(Status
))
5952 TRACE("Status 0x%08lx\n", Status
);
5956 *Buffer
= InfoBuffer
;
5959 if (!NT_SUCCESS(Status
))
5961 if (InfoBuffer
!= NULL
)
5963 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5964 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5966 midl_user_free(InfoBuffer
);
5975 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
5976 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5978 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5983 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5984 if (InfoBuffer
== NULL
)
5985 return STATUS_INSUFFICIENT_RESOURCES
;
5987 /* Get the WorkStations string */
5988 Status
= SampGetObjectAttributeString(UserObject
,
5990 &InfoBuffer
->WorkStations
.WorkStations
);
5991 if (!NT_SUCCESS(Status
))
5993 TRACE("Status 0x%08lx\n", Status
);
5997 *Buffer
= InfoBuffer
;
6000 if (!NT_SUCCESS(Status
))
6002 if (InfoBuffer
!= NULL
)
6004 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
6005 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
6007 midl_user_free(InfoBuffer
);
6017 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
6018 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6020 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6021 SAM_USER_FIXED_DATA FixedData
;
6027 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6028 if (InfoBuffer
== NULL
)
6029 return STATUS_INSUFFICIENT_RESOURCES
;
6031 Length
= sizeof(SAM_USER_FIXED_DATA
);
6032 Status
= SampGetObjectAttribute(UserObject
,
6037 if (!NT_SUCCESS(Status
))
6040 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
6042 *Buffer
= InfoBuffer
;
6045 if (!NT_SUCCESS(Status
))
6047 if (InfoBuffer
!= NULL
)
6049 midl_user_free(InfoBuffer
);
6059 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
6060 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6062 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6063 SAM_USER_FIXED_DATA FixedData
;
6069 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6070 if (InfoBuffer
== NULL
)
6071 return STATUS_INSUFFICIENT_RESOURCES
;
6073 Length
= sizeof(SAM_USER_FIXED_DATA
);
6074 Status
= SampGetObjectAttribute(UserObject
,
6079 if (!NT_SUCCESS(Status
))
6082 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6083 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6085 *Buffer
= InfoBuffer
;
6088 if (!NT_SUCCESS(Status
))
6090 if (InfoBuffer
!= NULL
)
6092 midl_user_free(InfoBuffer
);
6102 SampQueryUserInternal1(PSAM_DB_OBJECT UserObject
,
6103 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6105 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6107 NTSTATUS Status
= STATUS_SUCCESS
;
6109 /* Fail, if the caller is not a trusted caller */
6110 if (UserObject
->Trusted
== FALSE
)
6111 return STATUS_INVALID_INFO_CLASS
;
6115 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6116 if (InfoBuffer
== NULL
)
6117 return STATUS_INSUFFICIENT_RESOURCES
;
6119 /* Get the NT password */
6121 SampGetObjectAttribute(UserObject
,
6127 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6129 Status
= SampGetObjectAttribute(UserObject
,
6132 (PVOID
)&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6134 if (!NT_SUCCESS(Status
))
6138 InfoBuffer
->Internal1
.NtPasswordPresent
= (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
6140 /* Get the LM password */
6142 SampGetObjectAttribute(UserObject
,
6148 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6150 Status
= SampGetObjectAttribute(UserObject
,
6153 (PVOID
)&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6155 if (!NT_SUCCESS(Status
))
6159 InfoBuffer
->Internal1
.LmPasswordPresent
= (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
6161 InfoBuffer
->Internal1
.PasswordExpired
= FALSE
;
6163 *Buffer
= InfoBuffer
;
6166 if (!NT_SUCCESS(Status
))
6168 if (InfoBuffer
!= NULL
)
6170 midl_user_free(InfoBuffer
);
6179 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
6180 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6182 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6187 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6188 if (InfoBuffer
== NULL
)
6189 return STATUS_INSUFFICIENT_RESOURCES
;
6191 /* Get the Parameters string */
6192 Status
= SampGetObjectAttributeString(UserObject
,
6194 &InfoBuffer
->Parameters
.Parameters
);
6195 if (!NT_SUCCESS(Status
))
6197 TRACE("Status 0x%08lx\n", Status
);
6201 *Buffer
= InfoBuffer
;
6204 if (!NT_SUCCESS(Status
))
6206 if (InfoBuffer
!= NULL
)
6208 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
6209 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
6211 midl_user_free(InfoBuffer
);
6220 SampQueryUserAll(PSAM_DB_OBJECT UserObject
,
6221 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6223 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6224 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
6225 SAM_USER_FIXED_DATA FixedData
;
6226 LARGE_INTEGER PasswordCanChange
;
6227 LARGE_INTEGER PasswordMustChange
;
6233 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6234 if (InfoBuffer
== NULL
)
6235 return STATUS_INSUFFICIENT_RESOURCES
;
6237 /* Get the fixed size domain data */
6238 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6239 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
6242 (PVOID
)&DomainFixedData
,
6244 if (!NT_SUCCESS(Status
))
6247 /* Get the fixed size user data */
6248 Length
= sizeof(SAM_USER_FIXED_DATA
);
6249 Status
= SampGetObjectAttribute(UserObject
,
6254 if (!NT_SUCCESS(Status
))
6257 if (UserObject
->Access
& USER_READ_GENERAL
)
6259 /* Get the Name string */
6260 Status
= SampGetObjectAttributeString(UserObject
,
6262 &InfoBuffer
->All
.UserName
);
6263 if (!NT_SUCCESS(Status
))
6265 TRACE("Status 0x%08lx\n", Status
);
6269 /* Get the FullName string */
6270 Status
= SampGetObjectAttributeString(UserObject
,
6272 &InfoBuffer
->All
.FullName
);
6273 if (!NT_SUCCESS(Status
))
6275 TRACE("Status 0x%08lx\n", Status
);
6279 /* Get the user ID*/
6280 InfoBuffer
->All
.UserId
= FixedData
.UserId
;
6282 /* Get the primary group ID */
6283 InfoBuffer
->All
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
6285 /* Get the AdminComment string */
6286 Status
= SampGetObjectAttributeString(UserObject
,
6288 &InfoBuffer
->All
.AdminComment
);
6289 if (!NT_SUCCESS(Status
))
6291 TRACE("Status 0x%08lx\n", Status
);
6295 /* Get the UserComment string */
6296 Status
= SampGetObjectAttributeString(UserObject
,
6298 &InfoBuffer
->All
.UserComment
);
6299 if (!NT_SUCCESS(Status
))
6301 TRACE("Status 0x%08lx\n", Status
);
6305 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_GENERAL_MASK
;
6306 // USER_ALL_USERNAME |
6307 // USER_ALL_FULLNAME |
6308 // USER_ALL_USERID |
6309 // USER_ALL_PRIMARYGROUPID |
6310 // USER_ALL_ADMINCOMMENT |
6311 // USER_ALL_USERCOMMENT;
6314 if (UserObject
->Access
& USER_READ_LOGON
)
6316 /* Get the HomeDirectory string */
6317 Status
= SampGetObjectAttributeString(UserObject
,
6319 &InfoBuffer
->All
.HomeDirectory
);
6320 if (!NT_SUCCESS(Status
))
6322 TRACE("Status 0x%08lx\n", Status
);
6326 /* Get the HomeDirectoryDrive string */
6327 Status
= SampGetObjectAttributeString(UserObject
,
6328 L
"HomeDirectoryDrive",
6329 &InfoBuffer
->Home
.HomeDirectoryDrive
);
6330 if (!NT_SUCCESS(Status
))
6332 TRACE("Status 0x%08lx\n", Status
);
6336 /* Get the ScriptPath string */
6337 Status
= SampGetObjectAttributeString(UserObject
,
6339 &InfoBuffer
->All
.ScriptPath
);
6340 if (!NT_SUCCESS(Status
))
6342 TRACE("Status 0x%08lx\n", Status
);
6346 /* Get the ProfilePath string */
6347 Status
= SampGetObjectAttributeString(UserObject
,
6349 &InfoBuffer
->All
.ProfilePath
);
6350 if (!NT_SUCCESS(Status
))
6352 TRACE("Status 0x%08lx\n", Status
);
6356 /* Get the WorkStations string */
6357 Status
= SampGetObjectAttributeString(UserObject
,
6359 &InfoBuffer
->All
.WorkStations
);
6360 if (!NT_SUCCESS(Status
))
6362 TRACE("Status 0x%08lx\n", Status
);
6366 InfoBuffer
->All
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
6367 InfoBuffer
->All
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
6369 InfoBuffer
->All
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
6370 InfoBuffer
->All
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
6372 // USER_ALL_LOGONHOURS
6374 InfoBuffer
->All
.BadPasswordCount
= FixedData
.BadPasswordCount
;
6376 InfoBuffer
->All
.LogonCount
= FixedData
.LogonCount
;
6378 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
6379 DomainFixedData
.MinPasswordAge
);
6380 InfoBuffer
->All
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
6381 InfoBuffer
->All
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
6383 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
6384 DomainFixedData
.MaxPasswordAge
);
6385 InfoBuffer
->All
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
6386 InfoBuffer
->All
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
6388 InfoBuffer
->All
. WhichFields
|= /* USER_ALL_READ_LOGON_MASK; */
6389 USER_ALL_HOMEDIRECTORY
|
6390 USER_ALL_HOMEDIRECTORYDRIVE
|
6391 USER_ALL_SCRIPTPATH
|
6392 USER_ALL_PROFILEPATH
|
6393 USER_ALL_WORKSTATIONS
|
6394 USER_ALL_LASTLOGON
|
6395 USER_ALL_LASTLOGOFF
|
6396 // USER_ALL_LOGONHOURS |
6397 USER_ALL_BADPASSWORDCOUNT
|
6398 USER_ALL_LOGONCOUNT
;
6399 USER_ALL_PASSWORDCANCHANGE
|
6400 USER_ALL_PASSWORDMUSTCHANGE
;
6403 if (UserObject
->Access
& USER_READ_ACCOUNT
)
6405 InfoBuffer
->All
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
6406 InfoBuffer
->All
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
6408 InfoBuffer
->All
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6409 InfoBuffer
->All
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6411 InfoBuffer
->All
.UserAccountControl
= FixedData
.UserAccountControl
;
6413 /* Get the Parameters string */
6414 Status
= SampGetObjectAttributeString(UserObject
,
6416 &InfoBuffer
->All
.Parameters
);
6417 if (!NT_SUCCESS(Status
))
6419 TRACE("Status 0x%08lx\n", Status
);
6423 InfoBuffer
->All
. WhichFields
|= USER_ALL_READ_ACCOUNT_MASK
;
6424 // USER_ALL_PASSWORDLASTSET |
6425 // USER_ALL_ACCOUNTEXPIRES |
6426 // USER_ALL_USERACCOUNTCONTROL |
6427 // USER_ALL_PARAMETERS;
6430 if (UserObject
->Access
& USER_READ_PREFERENCES
)
6432 InfoBuffer
->All
.CountryCode
= FixedData
.CountryCode
;
6434 InfoBuffer
->All
.CodePage
= FixedData
.CodePage
;
6436 InfoBuffer
->All
. WhichFields
|= USER_ALL_READ_PREFERENCES_MASK
;
6437 // USER_ALL_COUNTRYCODE |
6438 // USER_ALL_CODEPAGE;
6441 *Buffer
= InfoBuffer
;
6444 if (!NT_SUCCESS(Status
))
6446 if (InfoBuffer
!= NULL
)
6448 if (InfoBuffer
->All
.UserName
.Buffer
!= NULL
)
6449 midl_user_free(InfoBuffer
->All
.UserName
.Buffer
);
6451 if (InfoBuffer
->All
.FullName
.Buffer
!= NULL
)
6452 midl_user_free(InfoBuffer
->All
.FullName
.Buffer
);
6454 if (InfoBuffer
->All
.AdminComment
.Buffer
!= NULL
)
6455 midl_user_free(InfoBuffer
->All
.AdminComment
.Buffer
);
6457 if (InfoBuffer
->All
.UserComment
.Buffer
!= NULL
)
6458 midl_user_free(InfoBuffer
->All
.UserComment
.Buffer
);
6460 if (InfoBuffer
->All
.HomeDirectory
.Buffer
!= NULL
)
6461 midl_user_free(InfoBuffer
->All
.HomeDirectory
.Buffer
);
6463 if (InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
!= NULL
)
6464 midl_user_free(InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
);
6466 if (InfoBuffer
->All
.ScriptPath
.Buffer
!= NULL
)
6467 midl_user_free(InfoBuffer
->All
.ScriptPath
.Buffer
);
6469 if (InfoBuffer
->All
.ProfilePath
.Buffer
!= NULL
)
6470 midl_user_free(InfoBuffer
->All
.ProfilePath
.Buffer
);
6472 if (InfoBuffer
->All
.WorkStations
.Buffer
!= NULL
)
6473 midl_user_free(InfoBuffer
->All
.WorkStations
.Buffer
);
6475 if (InfoBuffer
->All
.LogonHours
.LogonHours
!= NULL
)
6476 midl_user_free(InfoBuffer
->All
.LogonHours
.LogonHours
);
6478 if (InfoBuffer
->All
.Parameters
.Buffer
!= NULL
)
6479 midl_user_free(InfoBuffer
->All
.Parameters
.Buffer
);
6481 midl_user_free(InfoBuffer
);
6492 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
6493 IN USER_INFORMATION_CLASS UserInformationClass
,
6494 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
6496 PSAM_DB_OBJECT UserObject
;
6497 ACCESS_MASK DesiredAccess
;
6500 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
6501 UserHandle
, UserInformationClass
, Buffer
);
6503 switch (UserInformationClass
)
6505 case UserGeneralInformation
:
6506 case UserNameInformation
:
6507 case UserAccountNameInformation
:
6508 case UserFullNameInformation
:
6509 case UserPrimaryGroupInformation
:
6510 case UserAdminCommentInformation
:
6511 DesiredAccess
= USER_READ_GENERAL
;
6514 case UserLogonHoursInformation
:
6515 case UserHomeInformation
:
6516 case UserScriptInformation
:
6517 case UserProfileInformation
:
6518 case UserWorkStationsInformation
:
6519 DesiredAccess
= USER_READ_LOGON
;
6522 case UserControlInformation
:
6523 case UserExpiresInformation
:
6524 case UserParametersInformation
:
6525 DesiredAccess
= USER_READ_ACCOUNT
;
6528 case UserPreferencesInformation
:
6529 DesiredAccess
= USER_READ_GENERAL
|
6530 USER_READ_PREFERENCES
;
6533 case UserLogonInformation
:
6534 case UserAccountInformation
:
6535 DesiredAccess
= USER_READ_GENERAL
|
6536 USER_READ_PREFERENCES
|
6541 case UserInternal1Information
:
6542 case UserAllInformation
:
6547 return STATUS_INVALID_INFO_CLASS
;
6550 /* Validate the domain handle */
6551 Status
= SampValidateDbObject(UserHandle
,
6555 if (!NT_SUCCESS(Status
))
6557 TRACE("failed with status 0x%08lx\n", Status
);
6561 switch (UserInformationClass
)
6563 case UserGeneralInformation
:
6564 Status
= SampQueryUserGeneral(UserObject
,
6568 case UserPreferencesInformation
:
6569 Status
= SampQueryUserPreferences(UserObject
,
6573 case UserLogonInformation
:
6574 Status
= SampQueryUserLogon(UserObject
,
6578 // case UserLogonHoursInformation:
6579 // Status = SampQueryUserLogonHours(UserObject,
6583 case UserAccountInformation
:
6584 Status
= SampQueryUserAccount(UserObject
,
6588 case UserNameInformation
:
6589 Status
= SampQueryUserName(UserObject
,
6593 case UserAccountNameInformation
:
6594 Status
= SampQueryUserAccountName(UserObject
,
6598 case UserFullNameInformation
:
6599 Status
= SampQueryUserFullName(UserObject
,
6603 case UserPrimaryGroupInformation
:
6604 Status
= SampQueryUserPrimaryGroup(UserObject
,
6608 case UserHomeInformation
:
6609 Status
= SampQueryUserHome(UserObject
,
6612 case UserScriptInformation
:
6613 Status
= SampQueryUserScript(UserObject
,
6617 case UserProfileInformation
:
6618 Status
= SampQueryUserProfile(UserObject
,
6622 case UserAdminCommentInformation
:
6623 Status
= SampQueryUserAdminComment(UserObject
,
6627 case UserWorkStationsInformation
:
6628 Status
= SampQueryUserWorkStations(UserObject
,
6632 case UserControlInformation
:
6633 Status
= SampQueryUserControl(UserObject
,
6637 case UserExpiresInformation
:
6638 Status
= SampQueryUserExpires(UserObject
,
6642 case UserInternal1Information
:
6643 Status
= SampQueryUserInternal1(UserObject
,
6647 case UserParametersInformation
:
6648 Status
= SampQueryUserParameters(UserObject
,
6652 case UserAllInformation
:
6653 Status
= SampQueryUserAll(UserObject
,
6657 // case UserInternal4Information:
6658 // case UserInternal5Information:
6659 // case UserInternal4InformationNew:
6660 // case UserInternal5InformationNew:
6663 Status
= STATUS_INVALID_INFO_CLASS
;
6671 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
6672 PSAMPR_USER_INFO_BUFFER Buffer
)
6674 SAM_USER_FIXED_DATA FixedData
;
6678 Length
= sizeof(SAM_USER_FIXED_DATA
);
6679 Status
= SampGetObjectAttribute(UserObject
,
6684 if (!NT_SUCCESS(Status
))
6687 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
6689 Status
= SampSetObjectAttribute(UserObject
,
6694 if (!NT_SUCCESS(Status
))
6697 Status
= SampSetObjectAttribute(UserObject
,
6700 Buffer
->General
.UserName
.Buffer
,
6701 Buffer
->General
.UserName
.MaximumLength
);
6702 if (!NT_SUCCESS(Status
))
6705 Status
= SampSetObjectAttribute(UserObject
,
6708 Buffer
->General
.FullName
.Buffer
,
6709 Buffer
->General
.FullName
.MaximumLength
);
6710 if (!NT_SUCCESS(Status
))
6713 Status
= SampSetObjectAttribute(UserObject
,
6716 Buffer
->General
.AdminComment
.Buffer
,
6717 Buffer
->General
.AdminComment
.MaximumLength
);
6718 if (!NT_SUCCESS(Status
))
6721 Status
= SampSetObjectAttribute(UserObject
,
6724 Buffer
->General
.UserComment
.Buffer
,
6725 Buffer
->General
.UserComment
.MaximumLength
);
6733 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
6734 PSAMPR_USER_INFO_BUFFER Buffer
)
6736 SAM_USER_FIXED_DATA FixedData
;
6740 Length
= sizeof(SAM_USER_FIXED_DATA
);
6741 Status
= SampGetObjectAttribute(UserObject
,
6746 if (!NT_SUCCESS(Status
))
6749 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
6750 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
6752 Status
= SampSetObjectAttribute(UserObject
,
6757 if (!NT_SUCCESS(Status
))
6760 Status
= SampSetObjectAttribute(UserObject
,
6763 Buffer
->Preferences
.UserComment
.Buffer
,
6764 Buffer
->Preferences
.UserComment
.MaximumLength
);
6772 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
6773 PSAMPR_USER_INFO_BUFFER Buffer
)
6775 SAM_USER_FIXED_DATA FixedData
;
6779 Length
= sizeof(SAM_USER_FIXED_DATA
);
6780 Status
= SampGetObjectAttribute(UserObject
,
6785 if (!NT_SUCCESS(Status
))
6788 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
6790 Status
= SampSetObjectAttribute(UserObject
,
6802 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
6803 PSAMPR_USER_INFO_BUFFER Buffer
)
6805 SAM_USER_FIXED_DATA FixedData
;
6809 Length
= sizeof(SAM_USER_FIXED_DATA
);
6810 Status
= SampGetObjectAttribute(UserObject
,
6815 if (!NT_SUCCESS(Status
))
6818 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
6820 Status
= SampSetObjectAttribute(UserObject
,
6832 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
6833 PSAMPR_USER_INFO_BUFFER Buffer
)
6835 SAM_USER_FIXED_DATA FixedData
;
6839 Length
= sizeof(SAM_USER_FIXED_DATA
);
6840 Status
= SampGetObjectAttribute(UserObject
,
6845 if (!NT_SUCCESS(Status
))
6848 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
6849 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
6851 Status
= SampSetObjectAttribute(UserObject
,
6863 SampSetUserInternal1(PSAM_DB_OBJECT UserObject
,
6864 PSAMPR_USER_INFO_BUFFER Buffer
)
6866 SAM_USER_FIXED_DATA FixedData
;
6868 NTSTATUS Status
= STATUS_SUCCESS
;
6870 /* FIXME: Decrypt NT password */
6871 /* FIXME: Decrypt LM password */
6873 Status
= SampSetUserPassword(UserObject
,
6874 &Buffer
->Internal1
.EncryptedNtOwfPassword
,
6875 Buffer
->Internal1
.NtPasswordPresent
,
6876 &Buffer
->Internal1
.EncryptedLmOwfPassword
,
6877 Buffer
->Internal1
.LmPasswordPresent
);
6878 if (!NT_SUCCESS(Status
))
6881 /* Get the fixed user attributes */
6882 Length
= sizeof(SAM_USER_FIXED_DATA
);
6883 Status
= SampGetObjectAttribute(UserObject
,
6888 if (!NT_SUCCESS(Status
))
6891 if (Buffer
->Internal1
.PasswordExpired
)
6893 /* The pasword was last set ages ago */
6894 FixedData
.PasswordLastSet
.LowPart
= 0;
6895 FixedData
.PasswordLastSet
.HighPart
= 0;
6899 /* The pasword was last set right now */
6900 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
6901 if (!NT_SUCCESS(Status
))
6905 /* Set the fixed user attributes */
6906 Status
= SampSetObjectAttribute(UserObject
,
6918 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
6919 PSAMPR_USER_INFO_BUFFER Buffer
)
6921 SAM_USER_FIXED_DATA FixedData
;
6924 NTSTATUS Status
= STATUS_SUCCESS
;
6926 WhichFields
= Buffer
->All
.WhichFields
;
6928 if (WhichFields
& USER_ALL_USERNAME
)
6930 Status
= SampSetObjectAttribute(UserObject
,
6933 Buffer
->All
.UserName
.Buffer
,
6934 Buffer
->All
.UserName
.MaximumLength
);
6935 if (!NT_SUCCESS(Status
))
6939 if (WhichFields
& USER_ALL_FULLNAME
)
6941 Status
= SampSetObjectAttribute(UserObject
,
6944 Buffer
->All
.FullName
.Buffer
,
6945 Buffer
->All
.FullName
.MaximumLength
);
6946 if (!NT_SUCCESS(Status
))
6950 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
6952 Status
= SampSetObjectAttribute(UserObject
,
6955 Buffer
->All
.AdminComment
.Buffer
,
6956 Buffer
->All
.AdminComment
.MaximumLength
);
6957 if (!NT_SUCCESS(Status
))
6961 if (WhichFields
& USER_ALL_USERCOMMENT
)
6963 Status
= SampSetObjectAttribute(UserObject
,
6966 Buffer
->All
.UserComment
.Buffer
,
6967 Buffer
->All
.UserComment
.MaximumLength
);
6968 if (!NT_SUCCESS(Status
))
6972 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
6974 Status
= SampSetObjectAttribute(UserObject
,
6977 Buffer
->All
.HomeDirectory
.Buffer
,
6978 Buffer
->All
.HomeDirectory
.MaximumLength
);
6979 if (!NT_SUCCESS(Status
))
6983 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6985 Status
= SampSetObjectAttribute(UserObject
,
6986 L
"HomeDirectoryDrive",
6988 Buffer
->All
.HomeDirectoryDrive
.Buffer
,
6989 Buffer
->All
.HomeDirectoryDrive
.MaximumLength
);
6990 if (!NT_SUCCESS(Status
))
6994 if (WhichFields
& USER_ALL_SCRIPTPATH
)
6996 Status
= SampSetObjectAttribute(UserObject
,
6999 Buffer
->All
.ScriptPath
.Buffer
,
7000 Buffer
->All
.ScriptPath
.MaximumLength
);
7001 if (!NT_SUCCESS(Status
))
7005 if (WhichFields
& USER_ALL_PROFILEPATH
)
7007 Status
= SampSetObjectAttribute(UserObject
,
7010 Buffer
->All
.ProfilePath
.Buffer
,
7011 Buffer
->All
.ProfilePath
.MaximumLength
);
7012 if (!NT_SUCCESS(Status
))
7016 if (WhichFields
& USER_ALL_WORKSTATIONS
)
7018 Status
= SampSetObjectAttribute(UserObject
,
7021 Buffer
->All
.WorkStations
.Buffer
,
7022 Buffer
->All
.WorkStations
.MaximumLength
);
7023 if (!NT_SUCCESS(Status
))
7027 if (WhichFields
& USER_ALL_PARAMETERS
)
7029 Status
= SampSetObjectAttribute(UserObject
,
7032 Buffer
->All
.Parameters
.Buffer
,
7033 Buffer
->All
.Parameters
.MaximumLength
);
7036 if (WhichFields
& (USER_ALL_PRIMARYGROUPID
|
7037 USER_ALL_ACCOUNTEXPIRES
|
7038 USER_ALL_USERACCOUNTCONTROL
|
7039 USER_ALL_COUNTRYCODE
|
7042 Length
= sizeof(SAM_USER_FIXED_DATA
);
7043 Status
= SampGetObjectAttribute(UserObject
,
7048 if (!NT_SUCCESS(Status
))
7051 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
7052 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
7054 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
7056 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
7057 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
7060 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
7061 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
7063 if (WhichFields
& USER_ALL_COUNTRYCODE
)
7064 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
7066 if (WhichFields
& USER_ALL_CODEPAGE
)
7067 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
7069 Status
= SampSetObjectAttribute(UserObject
,
7074 if (!NT_SUCCESS(Status
))
7081 USER_ALL_NTPASSWORDPRESENT
7082 USER_ALL_LMPASSWORDPRESENT
7083 USER_ALL_PASSWORDEXPIRED
7095 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
7096 IN USER_INFORMATION_CLASS UserInformationClass
,
7097 IN PSAMPR_USER_INFO_BUFFER Buffer
)
7099 PSAM_DB_OBJECT UserObject
;
7100 ACCESS_MASK DesiredAccess
;
7103 TRACE("SamrSetInformationUser(%p %lu %p)\n",
7104 UserHandle
, UserInformationClass
, Buffer
);
7106 switch (UserInformationClass
)
7108 case UserLogonHoursInformation
:
7109 case UserNameInformation
:
7110 case UserAccountNameInformation
:
7111 case UserFullNameInformation
:
7112 case UserPrimaryGroupInformation
:
7113 case UserHomeInformation
:
7114 case UserScriptInformation
:
7115 case UserProfileInformation
:
7116 case UserAdminCommentInformation
:
7117 case UserWorkStationsInformation
:
7118 case UserControlInformation
:
7119 case UserExpiresInformation
:
7120 case UserParametersInformation
:
7121 DesiredAccess
= USER_WRITE_ACCOUNT
;
7124 case UserGeneralInformation
:
7125 DesiredAccess
= USER_WRITE_ACCOUNT
|
7126 USER_WRITE_PREFERENCES
;
7129 case UserPreferencesInformation
:
7130 DesiredAccess
= USER_WRITE_PREFERENCES
;
7133 case UserSetPasswordInformation
:
7134 case UserInternal1Information
:
7135 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
7138 case UserAllInformation
:
7139 DesiredAccess
= 0; /* FIXME */
7143 return STATUS_INVALID_INFO_CLASS
;
7146 /* Validate the domain handle */
7147 Status
= SampValidateDbObject(UserHandle
,
7151 if (!NT_SUCCESS(Status
))
7153 TRACE("failed with status 0x%08lx\n", Status
);
7157 switch (UserInformationClass
)
7159 case UserGeneralInformation
:
7160 Status
= SampSetUserGeneral(UserObject
,
7164 case UserPreferencesInformation
:
7165 Status
= SampSetUserPreferences(UserObject
,
7169 case UserLogonHoursInformation:
7170 Status = SampSetUserLogonHours(UserObject,
7174 case UserNameInformation
:
7175 Status
= SampSetObjectAttribute(UserObject
,
7178 Buffer
->Name
.UserName
.Buffer
,
7179 Buffer
->Name
.UserName
.MaximumLength
);
7180 if (!NT_SUCCESS(Status
))
7183 Status
= SampSetObjectAttribute(UserObject
,
7186 Buffer
->Name
.FullName
.Buffer
,
7187 Buffer
->Name
.FullName
.MaximumLength
);
7190 case UserAccountNameInformation
:
7191 Status
= SampSetObjectAttribute(UserObject
,
7194 Buffer
->AccountName
.UserName
.Buffer
,
7195 Buffer
->AccountName
.UserName
.MaximumLength
);
7198 case UserFullNameInformation
:
7199 Status
= SampSetObjectAttribute(UserObject
,
7202 Buffer
->FullName
.FullName
.Buffer
,
7203 Buffer
->FullName
.FullName
.MaximumLength
);
7206 case UserPrimaryGroupInformation
:
7207 Status
= SampSetUserPrimaryGroup(UserObject
,
7211 case UserHomeInformation
:
7212 Status
= SampSetObjectAttribute(UserObject
,
7215 Buffer
->Home
.HomeDirectory
.Buffer
,
7216 Buffer
->Home
.HomeDirectory
.MaximumLength
);
7217 if (!NT_SUCCESS(Status
))
7220 Status
= SampSetObjectAttribute(UserObject
,
7221 L
"HomeDirectoryDrive",
7223 Buffer
->Home
.HomeDirectoryDrive
.Buffer
,
7224 Buffer
->Home
.HomeDirectoryDrive
.MaximumLength
);
7227 case UserScriptInformation
:
7228 Status
= SampSetObjectAttribute(UserObject
,
7231 Buffer
->Script
.ScriptPath
.Buffer
,
7232 Buffer
->Script
.ScriptPath
.MaximumLength
);
7235 case UserProfileInformation
:
7236 Status
= SampSetObjectAttribute(UserObject
,
7239 Buffer
->Profile
.ProfilePath
.Buffer
,
7240 Buffer
->Profile
.ProfilePath
.MaximumLength
);
7243 case UserAdminCommentInformation
:
7244 Status
= SampSetObjectAttribute(UserObject
,
7247 Buffer
->AdminComment
.AdminComment
.Buffer
,
7248 Buffer
->AdminComment
.AdminComment
.MaximumLength
);
7251 case UserWorkStationsInformation
:
7252 Status
= SampSetObjectAttribute(UserObject
,
7255 Buffer
->WorkStations
.WorkStations
.Buffer
,
7256 Buffer
->WorkStations
.WorkStations
.MaximumLength
);
7259 case UserSetPasswordInformation
:
7260 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
7261 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
7263 Status
= SampSetObjectAttribute(UserObject
,
7266 Buffer
->SetPassword
.Password
.Buffer
,
7267 Buffer
->SetPassword
.Password
.MaximumLength
);
7270 case UserControlInformation
:
7271 Status
= SampSetUserControl(UserObject
,
7275 case UserExpiresInformation
:
7276 Status
= SampSetUserExpires(UserObject
,
7280 case UserInternal1Information
:
7281 Status
= SampSetUserInternal1(UserObject
,
7285 case UserParametersInformation
:
7286 Status
= SampSetObjectAttribute(UserObject
,
7289 Buffer
->Parameters
.Parameters
.Buffer
,
7290 Buffer
->Parameters
.Parameters
.MaximumLength
);
7293 case UserAllInformation
:
7294 Status
= SampSetUserAll(UserObject
,
7298 // case UserInternal4Information:
7299 // case UserInternal5Information:
7300 // case UserInternal4InformationNew:
7301 // case UserInternal5InformationNew:
7304 Status
= STATUS_INVALID_INFO_CLASS
;
7314 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
7315 IN
unsigned char LmPresent
,
7316 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
7317 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
7318 IN
unsigned char NtPresent
,
7319 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
7320 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
7321 IN
unsigned char NtCrossEncryptionPresent
,
7322 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
7323 IN
unsigned char LmCrossEncryptionPresent
,
7324 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
7327 return STATUS_NOT_IMPLEMENTED
;
7334 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
7335 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
7337 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
7338 PSAM_DB_OBJECT UserObject
;
7342 TRACE("SamrGetGroupsForUser(%p %p)\n",
7343 UserHandle
, Groups
);
7345 /* Validate the user handle */
7346 Status
= SampValidateDbObject(UserHandle
,
7350 if (!NT_SUCCESS(Status
))
7352 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7356 /* Allocate the groups buffer */
7357 GroupsBuffer
= midl_user_allocate(sizeof(SAMPR_GET_GROUPS_BUFFER
));
7358 if (GroupsBuffer
== NULL
)
7359 return STATUS_INSUFFICIENT_RESOURCES
;
7362 * Get the size of the Groups attribute.
7363 * Do not check the status code because in case of an error
7364 * Length will be 0. And that is all we need.
7366 SampGetObjectAttribute(UserObject
,
7372 /* If there is no Groups attribute, return a groups buffer without an array */
7375 GroupsBuffer
->MembershipCount
= 0;
7376 GroupsBuffer
->Groups
= NULL
;
7378 *Groups
= GroupsBuffer
;
7380 return STATUS_SUCCESS
;
7383 /* Allocate a buffer for the Groups attribute */
7384 GroupsBuffer
->Groups
= midl_user_allocate(Length
);
7385 if (GroupsBuffer
->Groups
== NULL
)
7387 Status
= STATUS_INSUFFICIENT_RESOURCES
;
7391 /* Retrieve the Grous attribute */
7392 Status
= SampGetObjectAttribute(UserObject
,
7395 GroupsBuffer
->Groups
,
7397 if (!NT_SUCCESS(Status
))
7399 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
7403 /* Calculate the membership count */
7404 GroupsBuffer
->MembershipCount
= Length
/ sizeof(GROUP_MEMBERSHIP
);
7406 /* Return the groups buffer to the caller */
7407 *Groups
= GroupsBuffer
;
7410 if (!NT_SUCCESS(Status
))
7412 if (GroupsBuffer
!= NULL
)
7414 if (GroupsBuffer
->Groups
!= NULL
)
7415 midl_user_free(GroupsBuffer
->Groups
);
7417 midl_user_free(GroupsBuffer
);
7428 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
7429 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7430 IN
unsigned long Index
,
7431 IN
unsigned long EntryCount
,
7432 IN
unsigned long PreferredMaximumLength
,
7433 OUT
unsigned long *TotalAvailable
,
7434 OUT
unsigned long *TotalReturned
,
7435 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7438 return STATUS_NOT_IMPLEMENTED
;
7444 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
7445 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7446 IN PRPC_UNICODE_STRING Prefix
,
7447 OUT
unsigned long *Index
)
7450 return STATUS_NOT_IMPLEMENTED
;
7456 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
7459 return STATUS_NOT_IMPLEMENTED
;
7465 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
7468 return STATUS_NOT_IMPLEMENTED
;
7475 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
7476 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
7478 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
7479 SAM_USER_FIXED_DATA UserFixedData
;
7480 PSAM_DB_OBJECT DomainObject
;
7481 PSAM_DB_OBJECT UserObject
;
7486 UserHandle
, PasswordInformation
);
7488 /* Validate the user handle */
7489 Status
= SampValidateDbObject(UserHandle
,
7493 if (!NT_SUCCESS(Status
))
7495 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7499 /* Validate the domain object */
7500 Status
= SampValidateDbObject((SAMPR_HANDLE
)UserObject
->ParentObject
,
7502 DOMAIN_READ_PASSWORD_PARAMETERS
,
7504 if (!NT_SUCCESS(Status
))
7506 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
7510 /* Get fixed user data */
7511 Length
= sizeof(SAM_USER_FIXED_DATA
);
7512 Status
= SampGetObjectAttribute(UserObject
,
7515 (PVOID
)&UserFixedData
,
7517 if (!NT_SUCCESS(Status
))
7519 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
7523 if ((UserObject
->RelativeId
== DOMAIN_USER_RID_KRBTGT
) ||
7524 (UserFixedData
.UserAccountControl
& (USER_INTERDOMAIN_TRUST_ACCOUNT
|
7525 USER_WORKSTATION_TRUST_ACCOUNT
|
7526 USER_SERVER_TRUST_ACCOUNT
)))
7528 PasswordInformation
->MinPasswordLength
= 0;
7529 PasswordInformation
->PasswordProperties
= 0;
7533 /* Get fixed domain data */
7534 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
7535 Status
= SampGetObjectAttribute(DomainObject
,
7538 (PVOID
)&DomainFixedData
,
7540 if (!NT_SUCCESS(Status
))
7542 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
7546 PasswordInformation
->MinPasswordLength
= DomainFixedData
.MinPasswordLength
;
7547 PasswordInformation
->PasswordProperties
= DomainFixedData
.PasswordProperties
;
7550 return STATUS_SUCCESS
;
7557 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
7558 IN PRPC_SID MemberSid
)
7561 return STATUS_NOT_IMPLEMENTED
;
7568 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
7569 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
7570 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
7572 TRACE("(%p %lu %p)\n", DomainHandle
, DomainInformationClass
, Buffer
);
7574 return SamrQueryInformationDomain(DomainHandle
,
7575 DomainInformationClass
,
7583 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
7584 IN USER_INFORMATION_CLASS UserInformationClass
,
7585 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
7587 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
7589 return SamrQueryInformationUser(UserHandle
,
7590 UserInformationClass
,
7598 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
7599 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7600 IN
unsigned long Index
,
7601 IN
unsigned long EntryCount
,
7602 IN
unsigned long PreferredMaximumLength
,
7603 OUT
unsigned long *TotalAvailable
,
7604 OUT
unsigned long *TotalReturned
,
7605 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7607 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
7608 DomainHandle
, DisplayInformationClass
, Index
,
7609 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
7610 TotalReturned
, Buffer
);
7612 return SamrQueryDisplayInformation(DomainHandle
,
7613 DisplayInformationClass
,
7616 PreferredMaximumLength
,
7626 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
7627 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7628 IN PRPC_UNICODE_STRING Prefix
,
7629 OUT
unsigned long *Index
)
7631 TRACE("(%p %lu %p %p)\n",
7632 DomainHandle
, DisplayInformationClass
, Prefix
, Index
);
7634 return SamrGetDisplayEnumerationIndex(DomainHandle
,
7635 DisplayInformationClass
,
7644 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
7645 IN PRPC_UNICODE_STRING Name
,
7646 IN
unsigned long AccountType
,
7647 IN ACCESS_MASK DesiredAccess
,
7648 OUT SAMPR_HANDLE
*UserHandle
,
7649 OUT
unsigned long *GrantedAccess
,
7650 OUT
unsigned long *RelativeId
)
7652 UNICODE_STRING EmptyString
= RTL_CONSTANT_STRING(L
"");
7653 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
7654 SAM_USER_FIXED_DATA FixedUserData
;
7655 PSAM_DB_OBJECT DomainObject
;
7656 PSAM_DB_OBJECT UserObject
;
7662 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
7663 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
7666 Name
->Length
== 0 ||
7667 Name
->Buffer
== NULL
||
7668 UserHandle
== NULL
||
7670 return STATUS_INVALID_PARAMETER
;
7672 /* Check for valid account type */
7673 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
7674 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
7675 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
7676 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
7677 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
7678 return STATUS_INVALID_PARAMETER
;
7680 /* Map generic access rights */
7681 RtlMapGenericMask(&DesiredAccess
,
7684 /* Validate the domain handle */
7685 Status
= SampValidateDbObject(DomainHandle
,
7689 if (!NT_SUCCESS(Status
))
7691 TRACE("failed with status 0x%08lx\n", Status
);
7695 /* Check if the user name already exists in the domain */
7696 Status
= SampCheckAccountNameInDomain(DomainObject
,
7698 if (!NT_SUCCESS(Status
))
7700 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
7701 Name
->Buffer
, Status
);
7705 /* Get the fixed domain attributes */
7706 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
7707 Status
= SampGetObjectAttribute(DomainObject
,
7710 (PVOID
)&FixedDomainData
,
7712 if (!NT_SUCCESS(Status
))
7714 TRACE("failed with status 0x%08lx\n", Status
);
7718 /* Increment the NextRid attribute */
7719 ulRid
= FixedDomainData
.NextRid
;
7720 FixedDomainData
.NextRid
++;
7722 /* Store the fixed domain attributes */
7723 Status
= SampSetObjectAttribute(DomainObject
,
7728 if (!NT_SUCCESS(Status
))
7730 TRACE("failed with status 0x%08lx\n", Status
);
7734 TRACE("RID: %lx\n", ulRid
);
7736 /* Convert the RID into a string (hex) */
7737 swprintf(szRid
, L
"%08lX", ulRid
);
7739 /* Create the user object */
7740 Status
= SampCreateDbObject(DomainObject
,
7747 if (!NT_SUCCESS(Status
))
7749 TRACE("failed with status 0x%08lx\n", Status
);
7753 /* Add the account name for the user object */
7754 Status
= SampSetAccountNameInDomain(DomainObject
,
7758 if (!NT_SUCCESS(Status
))
7760 TRACE("failed with status 0x%08lx\n", Status
);
7764 /* Initialize fixed user data */
7765 FixedUserData
.Version
= 1;
7766 FixedUserData
.Reserved
= 0;
7767 FixedUserData
.LastLogon
.QuadPart
= 0;
7768 FixedUserData
.LastLogoff
.QuadPart
= 0;
7769 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
7770 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
7771 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
7772 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
7773 FixedUserData
.UserId
= ulRid
;
7774 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
7775 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
7776 USER_PASSWORD_NOT_REQUIRED
|
7778 FixedUserData
.CountryCode
= 0;
7779 FixedUserData
.CodePage
= 0;
7780 FixedUserData
.BadPasswordCount
= 0;
7781 FixedUserData
.LogonCount
= 0;
7782 FixedUserData
.AdminCount
= 0;
7783 FixedUserData
.OperatorCount
= 0;
7785 /* Set fixed user data attribute */
7786 Status
= SampSetObjectAttribute(UserObject
,
7789 (LPVOID
)&FixedUserData
,
7790 sizeof(SAM_USER_FIXED_DATA
));
7791 if (!NT_SUCCESS(Status
))
7793 TRACE("failed with status 0x%08lx\n", Status
);
7797 /* Set the Name attribute */
7798 Status
= SampSetObjectAttribute(UserObject
,
7801 (LPVOID
)Name
->Buffer
,
7802 Name
->MaximumLength
);
7803 if (!NT_SUCCESS(Status
))
7805 TRACE("failed with status 0x%08lx\n", Status
);
7809 /* Set the FullName attribute */
7810 Status
= SampSetObjectAttribute(UserObject
,
7814 EmptyString
.MaximumLength
);
7815 if (!NT_SUCCESS(Status
))
7817 TRACE("failed with status 0x%08lx\n", Status
);
7821 /* Set the HomeDirectory attribute */
7822 Status
= SampSetObjectAttribute(UserObject
,
7826 EmptyString
.MaximumLength
);
7827 if (!NT_SUCCESS(Status
))
7829 TRACE("failed with status 0x%08lx\n", Status
);
7833 /* Set the HomeDirectoryDrive attribute */
7834 Status
= SampSetObjectAttribute(UserObject
,
7835 L
"HomeDirectoryDrive",
7838 EmptyString
.MaximumLength
);
7839 if (!NT_SUCCESS(Status
))
7841 TRACE("failed with status 0x%08lx\n", Status
);
7845 /* Set the ScriptPath attribute */
7846 Status
= SampSetObjectAttribute(UserObject
,
7850 EmptyString
.MaximumLength
);
7851 if (!NT_SUCCESS(Status
))
7853 TRACE("failed with status 0x%08lx\n", Status
);
7857 /* Set the ProfilePath attribute */
7858 Status
= SampSetObjectAttribute(UserObject
,
7862 EmptyString
.MaximumLength
);
7863 if (!NT_SUCCESS(Status
))
7865 TRACE("failed with status 0x%08lx\n", Status
);
7869 /* Set the AdminComment attribute */
7870 Status
= SampSetObjectAttribute(UserObject
,
7874 EmptyString
.MaximumLength
);
7875 if (!NT_SUCCESS(Status
))
7877 TRACE("failed with status 0x%08lx\n", Status
);
7881 /* Set the UserComment attribute */
7882 Status
= SampSetObjectAttribute(UserObject
,
7886 EmptyString
.MaximumLength
);
7887 if (!NT_SUCCESS(Status
))
7889 TRACE("failed with status 0x%08lx\n", Status
);
7893 /* Set the WorkStations attribute */
7894 Status
= SampSetObjectAttribute(UserObject
,
7898 EmptyString
.MaximumLength
);
7899 if (!NT_SUCCESS(Status
))
7901 TRACE("failed with status 0x%08lx\n", Status
);
7905 /* Set the Parameters attribute */
7906 Status
= SampSetObjectAttribute(UserObject
,
7910 EmptyString
.MaximumLength
);
7911 if (!NT_SUCCESS(Status
))
7913 TRACE("failed with status 0x%08lx\n", Status
);
7917 /* FIXME: Set LogonHours attribute*/
7918 /* FIXME: Set Groups attribute*/
7920 /* Set LMPwd attribute*/
7921 Status
= SampSetObjectAttribute(UserObject
,
7926 if (!NT_SUCCESS(Status
))
7928 TRACE("failed with status 0x%08lx\n", Status
);
7932 /* Set NTPwd attribute*/
7933 Status
= SampSetObjectAttribute(UserObject
,
7938 if (!NT_SUCCESS(Status
))
7940 TRACE("failed with status 0x%08lx\n", Status
);
7944 /* Set LMPwdHistory attribute*/
7945 Status
= SampSetObjectAttribute(UserObject
,
7950 if (!NT_SUCCESS(Status
))
7952 TRACE("failed with status 0x%08lx\n", Status
);
7956 /* Set NTPwdHistory attribute*/
7957 Status
= SampSetObjectAttribute(UserObject
,
7962 if (!NT_SUCCESS(Status
))
7964 TRACE("failed with status 0x%08lx\n", Status
);
7968 /* FIXME: Set SecDesc attribute*/
7970 if (NT_SUCCESS(Status
))
7972 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
7973 *RelativeId
= ulRid
;
7974 *GrantedAccess
= UserObject
->Access
;
7977 TRACE("returns with status 0x%08lx\n", Status
);
7986 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
7987 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
7988 IN
unsigned long Index
,
7989 IN
unsigned long EntryCount
,
7990 IN
unsigned long PreferredMaximumLength
,
7991 OUT
unsigned long *TotalAvailable
,
7992 OUT
unsigned long *TotalReturned
,
7993 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
7995 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
7996 DomainHandle
, DisplayInformationClass
, Index
,
7997 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
7998 TotalReturned
, Buffer
);
8000 return SamrQueryDisplayInformation(DomainHandle
,
8001 DisplayInformationClass
,
8004 PreferredMaximumLength
,
8014 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
8015 IN PSAMPR_PSID_ARRAY MembersBuffer
)
8018 NTSTATUS Status
= STATUS_SUCCESS
;
8020 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
8021 AliasHandle
, MembersBuffer
);
8023 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
8025 Status
= SamrAddMemberToAlias(AliasHandle
,
8026 ((PSID
*)MembersBuffer
->Sids
)[i
]);
8028 if (Status
== STATUS_MEMBER_IN_ALIAS
)
8029 Status
= STATUS_SUCCESS
;
8031 if (!NT_SUCCESS(Status
))
8042 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
8043 IN PSAMPR_PSID_ARRAY MembersBuffer
)
8046 NTSTATUS Status
= STATUS_SUCCESS
;
8048 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
8049 AliasHandle
, MembersBuffer
);
8051 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
8053 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
8054 ((PSID
*)MembersBuffer
->Sids
)[i
]);
8056 if (Status
== STATUS_MEMBER_IN_ALIAS
)
8057 Status
= STATUS_SUCCESS
;
8059 if (!NT_SUCCESS(Status
))
8070 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
8071 IN PRPC_STRING ServerName
,
8072 IN PRPC_STRING UserName
,
8073 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
8074 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
8077 return STATUS_NOT_IMPLEMENTED
;
8083 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
8084 IN PRPC_UNICODE_STRING ServerName
,
8085 IN PRPC_UNICODE_STRING UserName
,
8086 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
8087 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
8088 IN
unsigned char LmPresent
,
8089 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
8090 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
8093 return STATUS_NOT_IMPLEMENTED
;
8099 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
8100 IN PRPC_UNICODE_STRING Unused
,
8101 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
8104 return STATUS_NOT_IMPLEMENTED
;
8110 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
8111 OUT SAMPR_HANDLE
*ServerHandle
,
8112 IN ACCESS_MASK DesiredAccess
)
8115 return STATUS_NOT_IMPLEMENTED
;
8122 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
8123 IN USER_INFORMATION_CLASS UserInformationClass
,
8124 IN PSAMPR_USER_INFO_BUFFER Buffer
)
8126 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
8128 return SamrSetInformationUser(UserHandle
,
8129 UserInformationClass
,
8137 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
8140 return STATUS_NOT_IMPLEMENTED
;
8146 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
8149 return STATUS_NOT_IMPLEMENTED
;
8155 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
8158 return STATUS_NOT_IMPLEMENTED
;
8164 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
8165 OUT SAMPR_HANDLE
*ServerHandle
,
8166 IN
unsigned long ClientRevision
,
8167 IN ACCESS_MASK DesiredAccess
)
8170 return STATUS_NOT_IMPLEMENTED
;
8176 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
8179 return STATUS_NOT_IMPLEMENTED
;
8185 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
8186 IN ACCESS_MASK DesiredAccess
,
8187 IN
unsigned long InVersion
,
8188 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
8189 OUT
unsigned long *OutVersion
,
8190 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
8191 OUT SAMPR_HANDLE
*ServerHandle
)
8194 return STATUS_NOT_IMPLEMENTED
;
8200 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
8201 IN
unsigned long Rid
,
8205 return STATUS_NOT_IMPLEMENTED
;
8211 SamrSetDSRMPassword(IN handle_t BindingHandle
,
8212 IN PRPC_UNICODE_STRING Unused
,
8213 IN
unsigned long UserId
,
8214 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
8217 return STATUS_NOT_IMPLEMENTED
;
8223 SamrValidatePassword(IN handle_t Handle
,
8224 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
8225 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
8226 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
8229 return STATUS_NOT_IMPLEMENTED
;