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
12 /* GLOBALS *******************************************************************/
14 static SID_IDENTIFIER_AUTHORITY NtSidAuthority
= {SECURITY_NT_AUTHORITY
};
16 static GENERIC_MAPPING ServerMapping
=
24 static GENERIC_MAPPING DomainMapping
=
32 static GENERIC_MAPPING AliasMapping
=
40 static GENERIC_MAPPING GroupMapping
=
48 static GENERIC_MAPPING UserMapping
=
56 PGENERIC_MAPPING pServerMapping
= &ServerMapping
;
59 /* FUNCTIONS *****************************************************************/
63 SampAddRelativeTimeToTime(IN LARGE_INTEGER AbsoluteTime
,
64 IN LARGE_INTEGER RelativeTime
)
66 LARGE_INTEGER NewTime
;
68 NewTime
.QuadPart
= AbsoluteTime
.QuadPart
- RelativeTime
.QuadPart
;
70 if (NewTime
.QuadPart
< 0)
78 SampStartRpcServer(VOID
)
82 TRACE("SampStartRpcServer() called\n");
84 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
85 RPC_C_PROTSEQ_MAX_REQS_DEFAULT
,
88 if (Status
!= RPC_S_OK
)
90 WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
94 Status
= RpcServerRegisterIf(samr_v1_0_s_ifspec
,
97 if (Status
!= RPC_S_OK
)
99 WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
103 Status
= RpcServerListen(1, 20, TRUE
);
104 if (Status
!= RPC_S_OK
)
106 WARN("RpcServerListen() failed (Status %lx)\n", Status
);
110 TRACE("SampStartRpcServer() done\n");
114 void __RPC_FAR
* __RPC_USER
midl_user_allocate(SIZE_T len
)
116 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
120 void __RPC_USER
midl_user_free(void __RPC_FAR
* ptr
)
122 HeapFree(GetProcessHeap(), 0, ptr
);
126 void __RPC_USER
SAMPR_HANDLE_rundown(SAMPR_HANDLE hHandle
)
134 SamrConnect(IN PSAMPR_SERVER_NAME ServerName
,
135 OUT SAMPR_HANDLE
*ServerHandle
,
136 IN ACCESS_MASK DesiredAccess
)
138 PSAM_DB_OBJECT ServerObject
;
141 TRACE("SamrConnect(%p %p %lx)\n",
142 ServerName
, ServerHandle
, DesiredAccess
);
144 RtlAcquireResourceShared(&SampResource
,
147 /* Map generic access rights */
148 RtlMapGenericMask(&DesiredAccess
,
151 /* Open the Server Object */
152 Status
= SampOpenDbObject(NULL
,
159 if (NT_SUCCESS(Status
))
160 *ServerHandle
= (SAMPR_HANDLE
)ServerObject
;
162 RtlReleaseResource(&SampResource
);
164 TRACE("SamrConnect done (Status 0x%08lx)\n", Status
);
173 SamrCloseHandle(IN OUT SAMPR_HANDLE
*SamHandle
)
175 PSAM_DB_OBJECT DbObject
;
176 NTSTATUS Status
= STATUS_SUCCESS
;
178 TRACE("SamrCloseHandle(%p)\n", SamHandle
);
180 RtlAcquireResourceShared(&SampResource
,
183 Status
= SampValidateDbObject(*SamHandle
,
187 if (Status
== STATUS_SUCCESS
)
189 Status
= SampCloseDbObject(DbObject
);
193 RtlReleaseResource(&SampResource
);
195 TRACE("SamrCloseHandle done (Status 0x%08lx)\n", Status
);
204 SamrSetSecurityObject(IN SAMPR_HANDLE ObjectHandle
,
205 IN SECURITY_INFORMATION SecurityInformation
,
206 IN PSAMPR_SR_SECURITY_DESCRIPTOR SecurityDescriptor
)
208 PSAM_DB_OBJECT DbObject
= NULL
;
209 ACCESS_MASK DesiredAccess
= 0;
210 PSECURITY_DESCRIPTOR RelativeSd
= NULL
;
211 ULONG RelativeSdSize
= 0;
212 HANDLE TokenHandle
= NULL
;
213 PGENERIC_MAPPING Mapping
;
216 TRACE("SamrSetSecurityObject(%p %lx %p)\n",
217 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
219 if ((SecurityDescriptor
== NULL
) ||
220 (SecurityDescriptor
->SecurityDescriptor
== NULL
) ||
221 !RtlValidSecurityDescriptor((PSECURITY_DESCRIPTOR
)SecurityDescriptor
->SecurityDescriptor
))
222 return ERROR_INVALID_PARAMETER
;
224 if (SecurityInformation
== 0 ||
225 SecurityInformation
& ~(OWNER_SECURITY_INFORMATION
| GROUP_SECURITY_INFORMATION
226 | DACL_SECURITY_INFORMATION
| SACL_SECURITY_INFORMATION
))
227 return ERROR_INVALID_PARAMETER
;
229 if (SecurityInformation
& SACL_SECURITY_INFORMATION
)
230 DesiredAccess
|= ACCESS_SYSTEM_SECURITY
;
232 if (SecurityInformation
& DACL_SECURITY_INFORMATION
)
233 DesiredAccess
|= WRITE_DAC
;
235 if (SecurityInformation
& (OWNER_SECURITY_INFORMATION
| GROUP_SECURITY_INFORMATION
))
236 DesiredAccess
|= WRITE_OWNER
;
238 if ((SecurityInformation
& OWNER_SECURITY_INFORMATION
) &&
239 (((PISECURITY_DESCRIPTOR
)SecurityDescriptor
)->Owner
== NULL
))
240 return ERROR_INVALID_PARAMETER
;
242 if ((SecurityInformation
& GROUP_SECURITY_INFORMATION
) &&
243 (((PISECURITY_DESCRIPTOR
)SecurityDescriptor
)->Group
== NULL
))
244 return ERROR_INVALID_PARAMETER
;
246 /* Validate the server handle */
247 Status
= SampValidateDbObject(ObjectHandle
,
251 if (!NT_SUCCESS(Status
))
254 /* Get the mapping for the object type */
255 switch (DbObject
->ObjectType
)
257 case SamDbServerObject
:
258 Mapping
= &ServerMapping
;
261 case SamDbDomainObject
:
262 Mapping
= &DomainMapping
;
265 case SamDbAliasObject
:
266 Mapping
= &AliasMapping
;
269 case SamDbGroupObject
:
270 Mapping
= &GroupMapping
;
273 case SamDbUserObject
:
274 Mapping
= &UserMapping
;
278 return STATUS_INVALID_HANDLE
;
281 /* Get the size of the SD */
282 Status
= SampGetObjectAttribute(DbObject
,
287 if (!NT_SUCCESS(Status
))
290 /* Allocate a buffer for the SD */
291 RelativeSd
= RtlAllocateHeap(RtlGetProcessHeap(), 0, RelativeSdSize
);
292 if (RelativeSd
== NULL
)
293 return STATUS_INSUFFICIENT_RESOURCES
;
296 Status
= SampGetObjectAttribute(DbObject
,
301 if (!NT_SUCCESS(Status
))
304 /* Build the new security descriptor */
305 Status
= RtlSetSecurityObject(SecurityInformation
,
306 (PSECURITY_DESCRIPTOR
)SecurityDescriptor
->SecurityDescriptor
,
310 if (!NT_SUCCESS(Status
))
312 ERR("RtlSetSecurityObject failed (Status 0x%08lx)\n", Status
);
316 /* Set the modified SD */
317 Status
= SampSetObjectAttribute(DbObject
,
321 RtlLengthSecurityDescriptor(RelativeSd
));
322 if (!NT_SUCCESS(Status
))
324 ERR("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
328 if (TokenHandle
!= NULL
)
329 NtClose(TokenHandle
);
331 if (RelativeSd
!= NULL
)
332 RtlFreeHeap(RtlGetProcessHeap(), 0, RelativeSd
);
341 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle
,
342 IN SECURITY_INFORMATION SecurityInformation
,
343 OUT PSAMPR_SR_SECURITY_DESCRIPTOR
*SecurityDescriptor
)
345 PSAM_DB_OBJECT SamObject
;
346 PSAMPR_SR_SECURITY_DESCRIPTOR SdData
= NULL
;
347 PSECURITY_DESCRIPTOR RelativeSd
= NULL
;
348 PSECURITY_DESCRIPTOR ResultSd
= NULL
;
349 ACCESS_MASK DesiredAccess
= 0;
350 ULONG RelativeSdSize
= 0;
351 ULONG ResultSdSize
= 0;
354 TRACE("(%p %lx %p)\n",
355 ObjectHandle
, SecurityInformation
, SecurityDescriptor
);
357 *SecurityDescriptor
= NULL
;
359 RtlAcquireResourceShared(&SampResource
,
362 if (SecurityInformation
& (DACL_SECURITY_INFORMATION
|
363 OWNER_SECURITY_INFORMATION
|
364 GROUP_SECURITY_INFORMATION
))
365 DesiredAccess
|= READ_CONTROL
;
367 if (SecurityInformation
& SACL_SECURITY_INFORMATION
)
368 DesiredAccess
|= ACCESS_SYSTEM_SECURITY
;
370 /* Validate the server handle */
371 Status
= SampValidateDbObject(ObjectHandle
,
375 if (!NT_SUCCESS(Status
))
378 /* Get the size of the SD */
379 Status
= SampGetObjectAttribute(SamObject
,
384 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
386 TRACE("Status 0x%08lx\n", Status
);
390 /* Allocate a buffer for the SD */
391 RelativeSd
= midl_user_allocate(RelativeSdSize
);
392 if (RelativeSd
== NULL
)
394 Status
= STATUS_INSUFFICIENT_RESOURCES
;
399 Status
= SampGetObjectAttribute(SamObject
,
404 if (!NT_SUCCESS(Status
))
406 TRACE("Status 0x%08lx\n", Status
);
410 /* Invalidate the SD information that was not requested */
411 if (!(SecurityInformation
& OWNER_SECURITY_INFORMATION
))
412 ((PISECURITY_DESCRIPTOR
)RelativeSd
)->Owner
= NULL
;
414 if (!(SecurityInformation
& GROUP_SECURITY_INFORMATION
))
415 ((PISECURITY_DESCRIPTOR
)RelativeSd
)->Group
= NULL
;
417 if (!(SecurityInformation
& DACL_SECURITY_INFORMATION
))
418 ((PISECURITY_DESCRIPTOR
)RelativeSd
)->Control
&= ~SE_DACL_PRESENT
;
420 if (!(SecurityInformation
& SACL_SECURITY_INFORMATION
))
421 ((PISECURITY_DESCRIPTOR
)RelativeSd
)->Control
&= ~SE_SACL_PRESENT
;
423 /* Calculate the required SD size */
424 Status
= RtlMakeSelfRelativeSD(RelativeSd
,
427 if (Status
!= STATUS_BUFFER_TOO_SMALL
)
430 /* Allocate a buffer for the new SD */
431 ResultSd
= MIDL_user_allocate(ResultSdSize
);
432 if (ResultSd
== NULL
)
434 Status
= STATUS_INSUFFICIENT_RESOURCES
;
438 /* Build the new SD */
439 Status
= RtlMakeSelfRelativeSD(RelativeSd
,
442 if (!NT_SUCCESS(Status
))
445 /* Allocate the SD data buffer */
446 SdData
= midl_user_allocate(sizeof(SAMPR_SR_SECURITY_DESCRIPTOR
));
449 Status
= STATUS_INSUFFICIENT_RESOURCES
;
453 /* Fill the SD data buffer and return it to the caller */
454 SdData
->Length
= RelativeSdSize
;
455 SdData
->SecurityDescriptor
= (PBYTE
)ResultSd
;
457 *SecurityDescriptor
= SdData
;
460 RtlReleaseResource(&SampResource
);
462 if (!NT_SUCCESS(Status
))
464 if (ResultSd
!= NULL
)
465 MIDL_user_free(ResultSd
);
468 if (RelativeSd
!= NULL
)
469 MIDL_user_free(RelativeSd
);
478 SamrShutdownSamServer(IN SAMPR_HANDLE ServerHandle
)
480 PSAM_DB_OBJECT ServerObject
;
483 TRACE("(%p)\n", ServerHandle
);
485 RtlAcquireResourceShared(&SampResource
,
488 /* Validate the server handle */
489 Status
= SampValidateDbObject(ServerHandle
,
494 RtlReleaseResource(&SampResource
);
496 if (!NT_SUCCESS(Status
))
499 /* Shut the server down */
500 RpcMgmtStopServerListening(0);
502 return STATUS_SUCCESS
;
509 SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle
,
510 IN PRPC_UNICODE_STRING Name
,
511 OUT PRPC_SID
*DomainId
)
513 PSAM_DB_OBJECT ServerObject
;
514 HANDLE DomainsKeyHandle
= NULL
;
515 HANDLE DomainKeyHandle
= NULL
;
516 WCHAR DomainKeyName
[64];
518 WCHAR DomainNameString
[MAX_COMPUTERNAME_LENGTH
+ 1];
519 UNICODE_STRING DomainName
;
524 TRACE("SamrLookupDomainInSamServer(%p %p %p)\n",
525 ServerHandle
, Name
, DomainId
);
527 RtlAcquireResourceShared(&SampResource
,
530 /* Validate the server handle */
531 Status
= SampValidateDbObject(ServerHandle
,
533 SAM_SERVER_LOOKUP_DOMAIN
,
535 if (!NT_SUCCESS(Status
))
540 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
544 if (!NT_SUCCESS(Status
))
548 while (Found
== FALSE
)
550 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
554 if (!NT_SUCCESS(Status
))
556 if (Status
== STATUS_NO_MORE_ENTRIES
)
557 Status
= STATUS_NO_SUCH_DOMAIN
;
561 TRACE("Domain key name: %S\n", DomainKeyName
);
563 Status
= SampRegOpenKey(DomainsKeyHandle
,
567 if (NT_SUCCESS(Status
))
569 Length
= (MAX_COMPUTERNAME_LENGTH
+ 1) * sizeof(WCHAR
);
570 Status
= SampRegQueryValue(DomainKeyHandle
,
573 (PVOID
)&DomainNameString
,
575 if (NT_SUCCESS(Status
))
577 TRACE("Domain name: %S\n", DomainNameString
);
579 RtlInitUnicodeString(&DomainName
,
581 if (RtlEqualUnicodeString(&DomainName
, (PUNICODE_STRING
)Name
, TRUE
))
583 TRACE("Found it!\n");
586 Status
= SampRegQueryValue(DomainKeyHandle
,
591 if (NT_SUCCESS(Status
))
593 *DomainId
= midl_user_allocate(Length
);
595 SampRegQueryValue(DomainKeyHandle
,
601 Status
= STATUS_SUCCESS
;
607 SampRegCloseKey(&DomainKeyHandle
);
614 SampRegCloseKey(&DomainKeyHandle
);
615 SampRegCloseKey(&DomainsKeyHandle
);
617 RtlReleaseResource(&SampResource
);
626 SamrEnumerateDomainsInSamServer(IN SAMPR_HANDLE ServerHandle
,
627 IN OUT
unsigned long *EnumerationContext
,
628 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
629 IN ULONG PreferedMaximumLength
,
630 OUT PULONG CountReturned
)
632 PSAM_DB_OBJECT ServerObject
;
633 WCHAR DomainKeyName
[64];
634 HANDLE DomainsKeyHandle
= NULL
;
635 HANDLE DomainKeyHandle
= NULL
;
638 ULONG RequiredLength
;
641 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
644 TRACE("SamrEnumerateDomainsInSamServer(%p %p %p %lu %p)\n",
645 ServerHandle
, EnumerationContext
, Buffer
, PreferedMaximumLength
,
648 RtlAcquireResourceShared(&SampResource
,
651 /* Validate the server handle */
652 Status
= SampValidateDbObject(ServerHandle
,
654 SAM_SERVER_ENUMERATE_DOMAINS
,
656 if (!NT_SUCCESS(Status
))
659 Status
= SampRegOpenKey(ServerObject
->KeyHandle
,
663 if (!NT_SUCCESS(Status
))
666 EnumIndex
= *EnumerationContext
;
672 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
676 if (!NT_SUCCESS(Status
))
679 TRACE("EnumIndex: %lu\n", EnumIndex
);
680 TRACE("Domain key name: %S\n", DomainKeyName
);
682 Status
= SampRegOpenKey(DomainsKeyHandle
,
686 TRACE("SampRegOpenKey returned %08lX\n", Status
);
687 if (NT_SUCCESS(Status
))
690 Status
= SampRegQueryValue(DomainKeyHandle
,
695 TRACE("SampRegQueryValue returned %08lX\n", Status
);
696 if (NT_SUCCESS(Status
))
698 TRACE("Data length: %lu\n", DataLength
);
700 if ((RequiredLength
+ DataLength
+ sizeof(UNICODE_STRING
)) > PreferedMaximumLength
)
703 RequiredLength
+= (DataLength
+ sizeof(UNICODE_STRING
));
707 SampRegCloseKey(&DomainKeyHandle
);
713 TRACE("EnumCount: %lu\n", EnumCount
);
714 TRACE("RequiredLength: %lu\n", RequiredLength
);
716 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
717 if (EnumBuffer
== NULL
)
719 Status
= STATUS_INSUFFICIENT_RESOURCES
;
723 EnumBuffer
->EntriesRead
= EnumCount
;
724 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
725 if (EnumBuffer
->Buffer
== NULL
)
727 Status
= STATUS_INSUFFICIENT_RESOURCES
;
731 EnumIndex
= *EnumerationContext
;
732 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
734 Status
= SampRegEnumerateSubKey(DomainsKeyHandle
,
738 if (!NT_SUCCESS(Status
))
741 TRACE("EnumIndex: %lu\n", EnumIndex
);
742 TRACE("Domain key name: %S\n", DomainKeyName
);
744 Status
= SampRegOpenKey(DomainsKeyHandle
,
748 TRACE("SampRegOpenKey returned %08lX\n", Status
);
749 if (NT_SUCCESS(Status
))
752 Status
= SampRegQueryValue(DomainKeyHandle
,
757 TRACE("SampRegQueryValue returned %08lX\n", Status
);
758 if (NT_SUCCESS(Status
))
760 EnumBuffer
->Buffer
[i
].RelativeId
= 0;
761 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)DataLength
- sizeof(WCHAR
);
762 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)DataLength
;
763 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(DataLength
);
764 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
766 SampRegCloseKey(&DomainKeyHandle
);
767 Status
= STATUS_INSUFFICIENT_RESOURCES
;
771 Status
= SampRegQueryValue(DomainKeyHandle
,
774 EnumBuffer
->Buffer
[i
].Name
.Buffer
,
776 TRACE("SampRegQueryValue returned %08lX\n", Status
);
777 if (NT_SUCCESS(Status
))
779 TRACE("Domain name: %S\n", EnumBuffer
->Buffer
[i
].Name
.Buffer
);
783 SampRegCloseKey(&DomainKeyHandle
);
785 if (!NT_SUCCESS(Status
))
790 if (NT_SUCCESS(Status
))
792 *EnumerationContext
+= EnumCount
;
793 *Buffer
= EnumBuffer
;
794 *CountReturned
= EnumCount
;
798 SampRegCloseKey(&DomainKeyHandle
);
799 SampRegCloseKey(&DomainsKeyHandle
);
801 if (!NT_SUCCESS(Status
))
803 *EnumerationContext
= 0;
807 if (EnumBuffer
!= NULL
)
809 if (EnumBuffer
->Buffer
!= NULL
)
811 if (EnumBuffer
->EntriesRead
!= 0)
813 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
815 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
816 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
820 midl_user_free(EnumBuffer
->Buffer
);
823 midl_user_free(EnumBuffer
);
827 RtlReleaseResource(&SampResource
);
836 SamrOpenDomain(IN SAMPR_HANDLE ServerHandle
,
837 IN ACCESS_MASK DesiredAccess
,
838 IN PRPC_SID DomainId
,
839 OUT SAMPR_HANDLE
*DomainHandle
)
841 PSAM_DB_OBJECT ServerObject
;
842 PSAM_DB_OBJECT DomainObject
;
845 TRACE("SamrOpenDomain(%p %lx %p %p)\n",
846 ServerHandle
, DesiredAccess
, DomainId
, DomainHandle
);
848 /* Map generic access rights */
849 RtlMapGenericMask(&DesiredAccess
,
852 RtlAcquireResourceShared(&SampResource
,
855 /* Validate the server handle */
856 Status
= SampValidateDbObject(ServerHandle
,
858 SAM_SERVER_LOOKUP_DOMAIN
,
860 if (!NT_SUCCESS(Status
))
863 /* Validate the Domain SID */
864 if ((DomainId
->Revision
!= SID_REVISION
) ||
865 (DomainId
->SubAuthorityCount
> SID_MAX_SUB_AUTHORITIES
) ||
866 (memcmp(&DomainId
->IdentifierAuthority
, &NtSidAuthority
, sizeof(SID_IDENTIFIER_AUTHORITY
)) != 0))
867 return STATUS_INVALID_PARAMETER
;
869 /* Open the domain object */
870 if ((DomainId
->SubAuthorityCount
== 1) &&
871 (DomainId
->SubAuthority
[0] == SECURITY_BUILTIN_DOMAIN_RID
))
873 /* Builtin domain object */
874 TRACE("Opening the builtin domain object.\n");
876 Status
= SampOpenDbObject(ServerObject
,
884 else if ((DomainId
->SubAuthorityCount
== 4) &&
885 (DomainId
->SubAuthority
[0] == SECURITY_NT_NON_UNIQUE
))
887 /* Account domain object */
888 TRACE("Opening the account domain object.\n");
890 /* FIXME: Check the account domain sub authorities!!! */
892 Status
= SampOpenDbObject(ServerObject
,
902 /* No valid domain SID */
903 Status
= STATUS_INVALID_PARAMETER
;
906 if (NT_SUCCESS(Status
))
907 *DomainHandle
= (SAMPR_HANDLE
)DomainObject
;
909 RtlReleaseResource(&SampResource
);
911 TRACE("SamrOpenDomain done (Status 0x%08lx)\n", Status
);
918 SampQueryDomainPassword(PSAM_DB_OBJECT DomainObject
,
919 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
921 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
922 SAM_DOMAIN_FIXED_DATA FixedData
;
928 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
929 if (InfoBuffer
== NULL
)
930 return STATUS_INSUFFICIENT_RESOURCES
;
932 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
933 Status
= SampGetObjectAttribute(DomainObject
,
938 if (!NT_SUCCESS(Status
))
941 InfoBuffer
->Password
.MinPasswordLength
= FixedData
.MinPasswordLength
;
942 InfoBuffer
->Password
.PasswordHistoryLength
= FixedData
.PasswordHistoryLength
;
943 InfoBuffer
->Password
.PasswordProperties
= FixedData
.PasswordProperties
;
944 InfoBuffer
->Password
.MaxPasswordAge
.LowPart
= FixedData
.MaxPasswordAge
.LowPart
;
945 InfoBuffer
->Password
.MaxPasswordAge
.HighPart
= FixedData
.MaxPasswordAge
.HighPart
;
946 InfoBuffer
->Password
.MinPasswordAge
.LowPart
= FixedData
.MinPasswordAge
.LowPart
;
947 InfoBuffer
->Password
.MinPasswordAge
.HighPart
= FixedData
.MinPasswordAge
.HighPart
;
949 *Buffer
= InfoBuffer
;
952 if (!NT_SUCCESS(Status
))
954 if (InfoBuffer
!= NULL
)
956 midl_user_free(InfoBuffer
);
965 SampGetNumberOfAccounts(PSAM_DB_OBJECT DomainObject
,
969 HANDLE AccountKeyHandle
= NULL
;
970 HANDLE NamesKeyHandle
= NULL
;
975 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
979 if (!NT_SUCCESS(Status
))
982 Status
= SampRegOpenKey(AccountKeyHandle
,
986 if (!NT_SUCCESS(Status
))
989 Status
= SampRegQueryKeyInfo(NamesKeyHandle
,
994 SampRegCloseKey(&NamesKeyHandle
);
995 SampRegCloseKey(&AccountKeyHandle
);
1002 SampQueryDomainGeneral(PSAM_DB_OBJECT DomainObject
,
1003 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1005 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1006 SAM_DOMAIN_FIXED_DATA FixedData
;
1012 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1013 if (InfoBuffer
== NULL
)
1014 return STATUS_INSUFFICIENT_RESOURCES
;
1016 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1017 Status
= SampGetObjectAttribute(DomainObject
,
1022 if (!NT_SUCCESS(Status
))
1025 InfoBuffer
->General
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1026 InfoBuffer
->General
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1027 InfoBuffer
->General
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1028 InfoBuffer
->General
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1029 InfoBuffer
->General
.DomainServerState
= FixedData
.DomainServerState
;
1030 InfoBuffer
->General
.DomainServerRole
= FixedData
.DomainServerRole
;
1031 InfoBuffer
->General
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1033 /* Get the OemInformation string */
1034 Status
= SampGetObjectAttributeString(DomainObject
,
1036 &InfoBuffer
->General
.OemInformation
);
1037 if (!NT_SUCCESS(Status
))
1039 TRACE("Status 0x%08lx\n", Status
);
1043 /* Get the Name string */
1044 Status
= SampGetObjectAttributeString(DomainObject
,
1046 &InfoBuffer
->General
.DomainName
);
1047 if (!NT_SUCCESS(Status
))
1049 TRACE("Status 0x%08lx\n", Status
);
1053 /* Get the ReplicaSourceNodeName string */
1054 Status
= SampGetObjectAttributeString(DomainObject
,
1055 L
"ReplicaSourceNodeName",
1056 &InfoBuffer
->General
.ReplicaSourceNodeName
);
1057 if (!NT_SUCCESS(Status
))
1059 TRACE("Status 0x%08lx\n", Status
);
1063 /* Get the number of Users in the Domain */
1064 Status
= SampGetNumberOfAccounts(DomainObject
,
1066 &InfoBuffer
->General
.UserCount
);
1067 if (!NT_SUCCESS(Status
))
1069 TRACE("Status 0x%08lx\n", Status
);
1073 /* Get the number of Groups in the Domain */
1074 Status
= SampGetNumberOfAccounts(DomainObject
,
1076 &InfoBuffer
->General
.GroupCount
);
1077 if (!NT_SUCCESS(Status
))
1079 TRACE("Status 0x%08lx\n", Status
);
1083 /* Get the number of Aliases in the Domain */
1084 Status
= SampGetNumberOfAccounts(DomainObject
,
1086 &InfoBuffer
->General
.AliasCount
);
1087 if (!NT_SUCCESS(Status
))
1089 TRACE("Status 0x%08lx\n", Status
);
1093 *Buffer
= InfoBuffer
;
1096 if (!NT_SUCCESS(Status
))
1098 if (InfoBuffer
!= NULL
)
1100 if (InfoBuffer
->General
.OemInformation
.Buffer
!= NULL
)
1101 midl_user_free(InfoBuffer
->General
.OemInformation
.Buffer
);
1103 if (InfoBuffer
->General
.DomainName
.Buffer
!= NULL
)
1104 midl_user_free(InfoBuffer
->General
.DomainName
.Buffer
);
1106 if (InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1107 midl_user_free(InfoBuffer
->General
.ReplicaSourceNodeName
.Buffer
);
1109 midl_user_free(InfoBuffer
);
1118 SampQueryDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1119 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1121 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1122 SAM_DOMAIN_FIXED_DATA FixedData
;
1128 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1129 if (InfoBuffer
== NULL
)
1130 return STATUS_INSUFFICIENT_RESOURCES
;
1132 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1133 Status
= SampGetObjectAttribute(DomainObject
,
1138 if (!NT_SUCCESS(Status
))
1141 InfoBuffer
->Logoff
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1142 InfoBuffer
->Logoff
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1144 *Buffer
= InfoBuffer
;
1147 if (!NT_SUCCESS(Status
))
1149 if (InfoBuffer
!= NULL
)
1151 midl_user_free(InfoBuffer
);
1160 SampQueryDomainOem(PSAM_DB_OBJECT DomainObject
,
1161 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1163 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1168 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1169 if (InfoBuffer
== NULL
)
1170 return STATUS_INSUFFICIENT_RESOURCES
;
1172 /* Get the OemInformation string */
1173 Status
= SampGetObjectAttributeString(DomainObject
,
1175 &InfoBuffer
->Oem
.OemInformation
);
1176 if (!NT_SUCCESS(Status
))
1178 TRACE("Status 0x%08lx\n", Status
);
1182 *Buffer
= InfoBuffer
;
1185 if (!NT_SUCCESS(Status
))
1187 if (InfoBuffer
!= NULL
)
1189 if (InfoBuffer
->Oem
.OemInformation
.Buffer
!= NULL
)
1190 midl_user_free(InfoBuffer
->Oem
.OemInformation
.Buffer
);
1192 midl_user_free(InfoBuffer
);
1201 SampQueryDomainName(PSAM_DB_OBJECT DomainObject
,
1202 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1204 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1209 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1210 if (InfoBuffer
== NULL
)
1211 return STATUS_INSUFFICIENT_RESOURCES
;
1213 /* Get the Name string */
1214 Status
= SampGetObjectAttributeString(DomainObject
,
1216 &InfoBuffer
->Name
.DomainName
);
1217 if (!NT_SUCCESS(Status
))
1219 TRACE("Status 0x%08lx\n", Status
);
1223 *Buffer
= InfoBuffer
;
1226 if (!NT_SUCCESS(Status
))
1228 if (InfoBuffer
!= NULL
)
1230 if (InfoBuffer
->Name
.DomainName
.Buffer
!= NULL
)
1231 midl_user_free(InfoBuffer
->Name
.DomainName
.Buffer
);
1233 midl_user_free(InfoBuffer
);
1242 SampQueryDomainReplication(PSAM_DB_OBJECT DomainObject
,
1243 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1245 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1250 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1251 if (InfoBuffer
== NULL
)
1252 return STATUS_INSUFFICIENT_RESOURCES
;
1254 /* Get the ReplicaSourceNodeName string */
1255 Status
= SampGetObjectAttributeString(DomainObject
,
1256 L
"ReplicaSourceNodeName",
1257 &InfoBuffer
->Replication
.ReplicaSourceNodeName
);
1258 if (!NT_SUCCESS(Status
))
1260 TRACE("Status 0x%08lx\n", Status
);
1264 *Buffer
= InfoBuffer
;
1267 if (!NT_SUCCESS(Status
))
1269 if (InfoBuffer
!= NULL
)
1271 if (InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1272 midl_user_free(InfoBuffer
->Replication
.ReplicaSourceNodeName
.Buffer
);
1274 midl_user_free(InfoBuffer
);
1283 SampQueryDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1284 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1286 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1287 SAM_DOMAIN_FIXED_DATA FixedData
;
1293 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1294 if (InfoBuffer
== NULL
)
1295 return STATUS_INSUFFICIENT_RESOURCES
;
1297 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1298 Status
= SampGetObjectAttribute(DomainObject
,
1303 if (!NT_SUCCESS(Status
))
1306 InfoBuffer
->Role
.DomainServerRole
= FixedData
.DomainServerRole
;
1308 *Buffer
= InfoBuffer
;
1311 if (!NT_SUCCESS(Status
))
1313 if (InfoBuffer
!= NULL
)
1315 midl_user_free(InfoBuffer
);
1324 SampQueryDomainModified(PSAM_DB_OBJECT DomainObject
,
1325 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1327 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1328 SAM_DOMAIN_FIXED_DATA FixedData
;
1334 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1335 if (InfoBuffer
== NULL
)
1336 return STATUS_INSUFFICIENT_RESOURCES
;
1338 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1339 Status
= SampGetObjectAttribute(DomainObject
,
1344 if (!NT_SUCCESS(Status
))
1347 InfoBuffer
->Modified
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1348 InfoBuffer
->Modified
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1349 InfoBuffer
->Modified
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1350 InfoBuffer
->Modified
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1352 *Buffer
= InfoBuffer
;
1355 if (!NT_SUCCESS(Status
))
1357 if (InfoBuffer
!= NULL
)
1359 midl_user_free(InfoBuffer
);
1368 SampQueryDomainState(PSAM_DB_OBJECT DomainObject
,
1369 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1371 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1372 SAM_DOMAIN_FIXED_DATA FixedData
;
1378 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1379 if (InfoBuffer
== NULL
)
1380 return STATUS_INSUFFICIENT_RESOURCES
;
1382 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1383 Status
= SampGetObjectAttribute(DomainObject
,
1388 if (!NT_SUCCESS(Status
))
1391 InfoBuffer
->State
.DomainServerState
= FixedData
.DomainServerState
;
1393 *Buffer
= InfoBuffer
;
1396 if (!NT_SUCCESS(Status
))
1398 if (InfoBuffer
!= NULL
)
1400 midl_user_free(InfoBuffer
);
1409 SampQueryDomainGeneral2(PSAM_DB_OBJECT DomainObject
,
1410 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1412 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1413 SAM_DOMAIN_FIXED_DATA FixedData
;
1419 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1420 if (InfoBuffer
== NULL
)
1421 return STATUS_INSUFFICIENT_RESOURCES
;
1423 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1424 Status
= SampGetObjectAttribute(DomainObject
,
1429 if (!NT_SUCCESS(Status
))
1432 InfoBuffer
->General2
.I1
.ForceLogoff
.LowPart
= FixedData
.ForceLogoff
.LowPart
;
1433 InfoBuffer
->General2
.I1
.ForceLogoff
.HighPart
= FixedData
.ForceLogoff
.HighPart
;
1434 InfoBuffer
->General2
.I1
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1435 InfoBuffer
->General2
.I1
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1436 InfoBuffer
->General2
.I1
.DomainServerState
= FixedData
.DomainServerState
;
1437 InfoBuffer
->General2
.I1
.DomainServerRole
= FixedData
.DomainServerRole
;
1438 InfoBuffer
->General2
.I1
.UasCompatibilityRequired
= FixedData
.UasCompatibilityRequired
;
1440 InfoBuffer
->General2
.LockoutDuration
= FixedData
.LockoutDuration
;
1441 InfoBuffer
->General2
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1442 InfoBuffer
->General2
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1444 /* Get the OemInformation string */
1445 Status
= SampGetObjectAttributeString(DomainObject
,
1447 &InfoBuffer
->General2
.I1
.OemInformation
);
1448 if (!NT_SUCCESS(Status
))
1450 TRACE("Status 0x%08lx\n", Status
);
1454 /* Get the Name string */
1455 Status
= SampGetObjectAttributeString(DomainObject
,
1457 &InfoBuffer
->General2
.I1
.DomainName
);
1458 if (!NT_SUCCESS(Status
))
1460 TRACE("Status 0x%08lx\n", Status
);
1464 /* Get the ReplicaSourceNodeName string */
1465 Status
= SampGetObjectAttributeString(DomainObject
,
1466 L
"ReplicaSourceNodeName",
1467 &InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
);
1468 if (!NT_SUCCESS(Status
))
1470 TRACE("Status 0x%08lx\n", Status
);
1474 /* Get the number of Users in the Domain */
1475 Status
= SampGetNumberOfAccounts(DomainObject
,
1477 &InfoBuffer
->General2
.I1
.UserCount
);
1478 if (!NT_SUCCESS(Status
))
1480 TRACE("Status 0x%08lx\n", Status
);
1484 /* Get the number of Groups in the Domain */
1485 Status
= SampGetNumberOfAccounts(DomainObject
,
1487 &InfoBuffer
->General2
.I1
.GroupCount
);
1488 if (!NT_SUCCESS(Status
))
1490 TRACE("Status 0x%08lx\n", Status
);
1494 /* Get the number of Aliases in the Domain */
1495 Status
= SampGetNumberOfAccounts(DomainObject
,
1497 &InfoBuffer
->General2
.I1
.AliasCount
);
1498 if (!NT_SUCCESS(Status
))
1500 TRACE("Status 0x%08lx\n", Status
);
1504 *Buffer
= InfoBuffer
;
1507 if (!NT_SUCCESS(Status
))
1509 if (InfoBuffer
!= NULL
)
1511 if (InfoBuffer
->General2
.I1
.OemInformation
.Buffer
!= NULL
)
1512 midl_user_free(InfoBuffer
->General2
.I1
.OemInformation
.Buffer
);
1514 if (InfoBuffer
->General2
.I1
.DomainName
.Buffer
!= NULL
)
1515 midl_user_free(InfoBuffer
->General2
.I1
.DomainName
.Buffer
);
1517 if (InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
!= NULL
)
1518 midl_user_free(InfoBuffer
->General2
.I1
.ReplicaSourceNodeName
.Buffer
);
1520 midl_user_free(InfoBuffer
);
1529 SampQueryDomainLockout(PSAM_DB_OBJECT DomainObject
,
1530 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1532 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1533 SAM_DOMAIN_FIXED_DATA FixedData
;
1539 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1540 if (InfoBuffer
== NULL
)
1541 return STATUS_INSUFFICIENT_RESOURCES
;
1543 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1544 Status
= SampGetObjectAttribute(DomainObject
,
1549 if (!NT_SUCCESS(Status
))
1552 InfoBuffer
->Lockout
.LockoutDuration
= FixedData
.LockoutDuration
;
1553 InfoBuffer
->Lockout
.LockoutObservationWindow
= FixedData
.LockoutObservationWindow
;
1554 InfoBuffer
->Lockout
.LockoutThreshold
= FixedData
.LockoutThreshold
;
1556 *Buffer
= InfoBuffer
;
1559 if (!NT_SUCCESS(Status
))
1561 if (InfoBuffer
!= NULL
)
1563 midl_user_free(InfoBuffer
);
1572 SampQueryDomainModified2(PSAM_DB_OBJECT DomainObject
,
1573 PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1575 PSAMPR_DOMAIN_INFO_BUFFER InfoBuffer
= NULL
;
1576 SAM_DOMAIN_FIXED_DATA FixedData
;
1582 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_DOMAIN_INFO_BUFFER
));
1583 if (InfoBuffer
== NULL
)
1584 return STATUS_INSUFFICIENT_RESOURCES
;
1586 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1587 Status
= SampGetObjectAttribute(DomainObject
,
1592 if (!NT_SUCCESS(Status
))
1595 InfoBuffer
->Modified2
.DomainModifiedCount
.LowPart
= FixedData
.DomainModifiedCount
.LowPart
;
1596 InfoBuffer
->Modified2
.DomainModifiedCount
.HighPart
= FixedData
.DomainModifiedCount
.HighPart
;
1597 InfoBuffer
->Modified2
.CreationTime
.LowPart
= FixedData
.CreationTime
.LowPart
;
1598 InfoBuffer
->Modified2
.CreationTime
.HighPart
= FixedData
.CreationTime
.HighPart
;
1599 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.LowPart
= FixedData
.ModifiedCountAtLastPromotion
.LowPart
;
1600 InfoBuffer
->Modified2
.ModifiedCountAtLastPromotion
.HighPart
= FixedData
.ModifiedCountAtLastPromotion
.HighPart
;
1602 *Buffer
= InfoBuffer
;
1605 if (!NT_SUCCESS(Status
))
1607 if (InfoBuffer
!= NULL
)
1609 midl_user_free(InfoBuffer
);
1620 SamrQueryInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1621 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1622 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
1624 PSAM_DB_OBJECT DomainObject
;
1625 ACCESS_MASK DesiredAccess
;
1628 TRACE("SamrQueryInformationDomain(%p %lu %p)\n",
1629 DomainHandle
, DomainInformationClass
, Buffer
);
1631 switch (DomainInformationClass
)
1633 case DomainPasswordInformation
:
1634 case DomainLockoutInformation
:
1635 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
;
1638 case DomainGeneralInformation
:
1639 case DomainLogoffInformation
:
1640 case DomainOemInformation
:
1641 case DomainNameInformation
:
1642 case DomainReplicationInformation
:
1643 case DomainServerRoleInformation
:
1644 case DomainModifiedInformation
:
1645 case DomainStateInformation
:
1646 case DomainModifiedInformation2
:
1647 DesiredAccess
= DOMAIN_READ_OTHER_PARAMETERS
;
1650 case DomainGeneralInformation2
:
1651 DesiredAccess
= DOMAIN_READ_PASSWORD_PARAMETERS
|
1652 DOMAIN_READ_OTHER_PARAMETERS
;
1656 return STATUS_INVALID_INFO_CLASS
;
1659 RtlAcquireResourceShared(&SampResource
,
1662 /* Validate the server handle */
1663 Status
= SampValidateDbObject(DomainHandle
,
1667 if (!NT_SUCCESS(Status
))
1670 switch (DomainInformationClass
)
1672 case DomainPasswordInformation
:
1673 Status
= SampQueryDomainPassword(DomainObject
,
1677 case DomainGeneralInformation
:
1678 Status
= SampQueryDomainGeneral(DomainObject
,
1682 case DomainLogoffInformation
:
1683 Status
= SampQueryDomainLogoff(DomainObject
,
1687 case DomainOemInformation
:
1688 Status
= SampQueryDomainOem(DomainObject
,
1692 case DomainNameInformation
:
1693 Status
= SampQueryDomainName(DomainObject
,
1697 case DomainReplicationInformation
:
1698 Status
= SampQueryDomainReplication(DomainObject
,
1702 case DomainServerRoleInformation
:
1703 Status
= SampQueryDomainServerRole(DomainObject
,
1707 case DomainModifiedInformation
:
1708 Status
= SampQueryDomainModified(DomainObject
,
1712 case DomainStateInformation
:
1713 Status
= SampQueryDomainState(DomainObject
,
1717 case DomainGeneralInformation2
:
1718 Status
= SampQueryDomainGeneral2(DomainObject
,
1722 case DomainLockoutInformation
:
1723 Status
= SampQueryDomainLockout(DomainObject
,
1727 case DomainModifiedInformation2
:
1728 Status
= SampQueryDomainModified2(DomainObject
,
1733 Status
= STATUS_NOT_IMPLEMENTED
;
1737 RtlReleaseResource(&SampResource
);
1744 SampSetDomainPassword(PSAM_DB_OBJECT DomainObject
,
1745 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1747 SAM_DOMAIN_FIXED_DATA FixedData
;
1751 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1752 Status
= SampGetObjectAttribute(DomainObject
,
1757 if (!NT_SUCCESS(Status
))
1760 FixedData
.MinPasswordLength
= Buffer
->Password
.MinPasswordLength
;
1761 FixedData
.PasswordHistoryLength
= Buffer
->Password
.PasswordHistoryLength
;
1762 FixedData
.PasswordProperties
= Buffer
->Password
.PasswordProperties
;
1763 FixedData
.MaxPasswordAge
.LowPart
= Buffer
->Password
.MaxPasswordAge
.LowPart
;
1764 FixedData
.MaxPasswordAge
.HighPart
= Buffer
->Password
.MaxPasswordAge
.HighPart
;
1765 FixedData
.MinPasswordAge
.LowPart
= Buffer
->Password
.MinPasswordAge
.LowPart
;
1766 FixedData
.MinPasswordAge
.HighPart
= Buffer
->Password
.MinPasswordAge
.HighPart
;
1768 Status
= SampSetObjectAttribute(DomainObject
,
1780 SampSetDomainLogoff(PSAM_DB_OBJECT DomainObject
,
1781 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1783 SAM_DOMAIN_FIXED_DATA FixedData
;
1787 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1788 Status
= SampGetObjectAttribute(DomainObject
,
1793 if (!NT_SUCCESS(Status
))
1796 FixedData
.ForceLogoff
.LowPart
= Buffer
->Logoff
.ForceLogoff
.LowPart
;
1797 FixedData
.ForceLogoff
.HighPart
= Buffer
->Logoff
.ForceLogoff
.HighPart
;
1799 Status
= SampSetObjectAttribute(DomainObject
,
1811 SampSetDomainServerRole(PSAM_DB_OBJECT DomainObject
,
1812 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1814 SAM_DOMAIN_FIXED_DATA FixedData
;
1818 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1819 Status
= SampGetObjectAttribute(DomainObject
,
1824 if (!NT_SUCCESS(Status
))
1827 FixedData
.DomainServerRole
= Buffer
->Role
.DomainServerRole
;
1829 Status
= SampSetObjectAttribute(DomainObject
,
1841 SampSetDomainState(PSAM_DB_OBJECT DomainObject
,
1842 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1844 SAM_DOMAIN_FIXED_DATA FixedData
;
1848 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1849 Status
= SampGetObjectAttribute(DomainObject
,
1854 if (!NT_SUCCESS(Status
))
1857 FixedData
.DomainServerState
= Buffer
->State
.DomainServerState
;
1859 Status
= SampSetObjectAttribute(DomainObject
,
1871 SampSetDomainLockout(PSAM_DB_OBJECT DomainObject
,
1872 PSAMPR_DOMAIN_INFO_BUFFER Buffer
)
1874 SAM_DOMAIN_FIXED_DATA FixedData
;
1878 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
1879 Status
= SampGetObjectAttribute(DomainObject
,
1884 if (!NT_SUCCESS(Status
))
1887 FixedData
.LockoutDuration
= Buffer
->Lockout
.LockoutDuration
;
1888 FixedData
.LockoutObservationWindow
= Buffer
->Lockout
.LockoutObservationWindow
;
1889 FixedData
.LockoutThreshold
= Buffer
->Lockout
.LockoutThreshold
;
1891 Status
= SampSetObjectAttribute(DomainObject
,
1905 SamrSetInformationDomain(IN SAMPR_HANDLE DomainHandle
,
1906 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
1907 IN PSAMPR_DOMAIN_INFO_BUFFER DomainInformation
)
1909 PSAM_DB_OBJECT DomainObject
;
1910 ACCESS_MASK DesiredAccess
;
1913 TRACE("SamrSetInformationDomain(%p %lu %p)\n",
1914 DomainHandle
, DomainInformationClass
, DomainInformation
);
1916 switch (DomainInformationClass
)
1918 case DomainPasswordInformation
:
1919 case DomainLockoutInformation
:
1920 DesiredAccess
= DOMAIN_WRITE_PASSWORD_PARAMS
;
1923 case DomainLogoffInformation
:
1924 case DomainOemInformation
:
1925 case DomainNameInformation
:
1926 DesiredAccess
= DOMAIN_WRITE_OTHER_PARAMETERS
;
1929 case DomainReplicationInformation
:
1930 case DomainServerRoleInformation
:
1931 case DomainStateInformation
:
1932 DesiredAccess
= DOMAIN_ADMINISTER_SERVER
;
1936 return STATUS_INVALID_INFO_CLASS
;
1939 RtlAcquireResourceExclusive(&SampResource
,
1942 /* Validate the server handle */
1943 Status
= SampValidateDbObject(DomainHandle
,
1947 if (!NT_SUCCESS(Status
))
1950 switch (DomainInformationClass
)
1952 case DomainPasswordInformation
:
1953 Status
= SampSetDomainPassword(DomainObject
,
1957 case DomainLogoffInformation
:
1958 Status
= SampSetDomainLogoff(DomainObject
,
1962 case DomainOemInformation
:
1963 Status
= SampSetObjectAttributeString(DomainObject
,
1965 &DomainInformation
->Oem
.OemInformation
);
1968 case DomainNameInformation
:
1969 Status
= SampSetObjectAttributeString(DomainObject
,
1971 &DomainInformation
->Name
.DomainName
);
1974 case DomainReplicationInformation
:
1975 Status
= SampSetObjectAttributeString(DomainObject
,
1976 L
"ReplicaSourceNodeName",
1977 &DomainInformation
->Replication
.ReplicaSourceNodeName
);
1980 case DomainServerRoleInformation
:
1981 Status
= SampSetDomainServerRole(DomainObject
,
1985 case DomainStateInformation
:
1986 Status
= SampSetDomainState(DomainObject
,
1990 case DomainLockoutInformation
:
1991 Status
= SampSetDomainLockout(DomainObject
,
1996 Status
= STATUS_NOT_IMPLEMENTED
;
2000 RtlReleaseResource(&SampResource
);
2009 SamrCreateGroupInDomain(IN SAMPR_HANDLE DomainHandle
,
2010 IN PRPC_UNICODE_STRING Name
,
2011 IN ACCESS_MASK DesiredAccess
,
2012 OUT SAMPR_HANDLE
*GroupHandle
,
2013 OUT
unsigned long *RelativeId
)
2015 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2016 SAM_GROUP_FIXED_DATA FixedGroupData
;
2017 PSAM_DB_OBJECT DomainObject
;
2018 PSAM_DB_OBJECT GroupObject
;
2019 PSECURITY_DESCRIPTOR Sd
= NULL
;
2026 TRACE("SamrCreateGroupInDomain(%p %p %lx %p %p)\n",
2027 DomainHandle
, Name
, DesiredAccess
, GroupHandle
, RelativeId
);
2029 /* Map generic access rights */
2030 RtlMapGenericMask(&DesiredAccess
,
2033 RtlAcquireResourceExclusive(&SampResource
,
2036 /* Validate the domain handle */
2037 Status
= SampValidateDbObject(DomainHandle
,
2039 DOMAIN_CREATE_GROUP
,
2041 if (!NT_SUCCESS(Status
))
2043 TRACE("failed with status 0x%08lx\n", Status
);
2047 /* Check the group account name */
2048 Status
= SampCheckAccountName(Name
, 256);
2049 if (!NT_SUCCESS(Status
))
2051 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
2055 /* Check if the group name already exists in the domain */
2056 Status
= SampCheckAccountNameInDomain(DomainObject
,
2058 if (!NT_SUCCESS(Status
))
2060 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
2061 Name
->Buffer
, Status
);
2065 /* Create the security descriptor */
2066 Status
= SampCreateGroupSD(&Sd
,
2068 if (!NT_SUCCESS(Status
))
2070 TRACE("SampCreateGroupSD failed (Status 0x%08lx)\n", Status
);
2074 /* Get the fixed domain attributes */
2075 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2076 Status
= SampGetObjectAttribute(DomainObject
,
2079 (PVOID
)&FixedDomainData
,
2081 if (!NT_SUCCESS(Status
))
2083 TRACE("failed with status 0x%08lx\n", Status
);
2087 /* Increment the NextRid attribute */
2088 ulRid
= FixedDomainData
.NextRid
;
2089 FixedDomainData
.NextRid
++;
2091 /* Store the fixed domain attributes */
2092 Status
= SampSetObjectAttribute(DomainObject
,
2097 if (!NT_SUCCESS(Status
))
2099 TRACE("failed with status 0x%08lx\n", Status
);
2103 TRACE("RID: %lx\n", ulRid
);
2105 /* Convert the RID into a string (hex) */
2106 swprintf(szRid
, L
"%08lX", ulRid
);
2108 /* Create the group object */
2109 Status
= SampCreateDbObject(DomainObject
,
2116 if (!NT_SUCCESS(Status
))
2118 TRACE("failed with status 0x%08lx\n", Status
);
2122 /* Add the account name of the user object */
2123 Status
= SampSetAccountNameInDomain(DomainObject
,
2127 if (!NT_SUCCESS(Status
))
2129 TRACE("failed with status 0x%08lx\n", Status
);
2133 /* Initialize fixed user data */
2134 memset(&FixedGroupData
, 0, sizeof(SAM_GROUP_FIXED_DATA
));
2135 FixedGroupData
.Version
= 1;
2136 FixedGroupData
.GroupId
= ulRid
;
2138 /* Set fixed user data attribute */
2139 Status
= SampSetObjectAttribute(GroupObject
,
2142 (LPVOID
)&FixedGroupData
,
2143 sizeof(SAM_GROUP_FIXED_DATA
));
2144 if (!NT_SUCCESS(Status
))
2146 TRACE("failed with status 0x%08lx\n", Status
);
2150 /* Set the Name attribute */
2151 Status
= SampSetObjectAttributeString(GroupObject
,
2154 if (!NT_SUCCESS(Status
))
2156 TRACE("failed with status 0x%08lx\n", Status
);
2160 /* Set the AdminComment attribute */
2161 Status
= SampSetObjectAttributeString(GroupObject
,
2164 if (!NT_SUCCESS(Status
))
2166 TRACE("failed with status 0x%08lx\n", Status
);
2170 /* Set the SecDesc attribute*/
2171 Status
= SampSetObjectAttribute(GroupObject
,
2176 if (!NT_SUCCESS(Status
))
2178 TRACE("failed with status 0x%08lx\n", Status
);
2182 if (NT_SUCCESS(Status
))
2184 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
2185 *RelativeId
= ulRid
;
2190 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
2192 RtlReleaseResource(&SampResource
);
2194 TRACE("returns with status 0x%08lx\n", Status
);
2203 SamrEnumerateGroupsInDomain(IN SAMPR_HANDLE DomainHandle
,
2204 IN OUT
unsigned long *EnumerationContext
,
2205 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2206 IN
unsigned long PreferedMaximumLength
,
2207 OUT
unsigned long *CountReturned
)
2209 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2210 PSAM_DB_OBJECT DomainObject
;
2211 HANDLE GroupsKeyHandle
= NULL
;
2212 HANDLE NamesKeyHandle
= NULL
;
2213 WCHAR GroupName
[64];
2215 ULONG EnumCount
= 0;
2216 ULONG RequiredLength
= 0;
2221 BOOLEAN MoreEntries
= FALSE
;
2224 TRACE("SamrEnumerateUsersInDomain(%p %p %p %lu %p)\n",
2225 DomainHandle
, EnumerationContext
, Buffer
,
2226 PreferedMaximumLength
, CountReturned
);
2228 RtlAcquireResourceShared(&SampResource
,
2231 /* Validate the domain handle */
2232 Status
= SampValidateDbObject(DomainHandle
,
2234 DOMAIN_LIST_ACCOUNTS
,
2236 if (!NT_SUCCESS(Status
))
2239 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2243 if (!NT_SUCCESS(Status
))
2246 Status
= SampRegOpenKey(GroupsKeyHandle
,
2250 if (!NT_SUCCESS(Status
))
2255 EnumIndex
= *EnumerationContext
;
2259 NameLength
= 64 * sizeof(WCHAR
);
2260 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2267 if (!NT_SUCCESS(Status
))
2269 if (Status
== STATUS_NO_MORE_ENTRIES
)
2270 Status
= STATUS_SUCCESS
;
2274 TRACE("EnumIndex: %lu\n", EnumIndex
);
2275 TRACE("Group name: %S\n", GroupName
);
2276 TRACE("Name length: %lu\n", NameLength
);
2278 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2284 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2290 TRACE("EnumCount: %lu\n", EnumCount
);
2291 TRACE("RequiredLength: %lu\n", RequiredLength
);
2293 if (!NT_SUCCESS(Status
))
2296 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2297 if (EnumBuffer
== NULL
)
2299 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2303 EnumBuffer
->EntriesRead
= EnumCount
;
2307 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2308 if (EnumBuffer
->Buffer
== NULL
)
2310 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2316 EnumIndex
= *EnumerationContext
;
2317 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2319 NameLength
= 64 * sizeof(WCHAR
);
2320 DataLength
= sizeof(ULONG
);
2321 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2328 if (!NT_SUCCESS(Status
))
2330 if (Status
== STATUS_NO_MORE_ENTRIES
)
2331 Status
= STATUS_SUCCESS
;
2335 TRACE("EnumIndex: %lu\n", EnumIndex
);
2336 TRACE("Group name: %S\n", GroupName
);
2337 TRACE("Name length: %lu\n", NameLength
);
2338 TRACE("RID: %lu\n", Rid
);
2340 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2342 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2343 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(NameLength
+ sizeof(UNICODE_NULL
));
2345 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2347 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2348 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2350 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2354 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2356 EnumBuffer
->Buffer
[i
].Name
.Length
);
2361 if (NT_SUCCESS(Status
))
2363 *EnumerationContext
+= EnumCount
;
2364 *Buffer
= EnumBuffer
;
2365 *CountReturned
= EnumCount
;
2369 *EnumerationContext
= 0;
2373 if (EnumBuffer
!= NULL
)
2375 if (EnumBuffer
->Buffer
!= NULL
)
2377 if (EnumBuffer
->EntriesRead
!= 0)
2379 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2381 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2382 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2386 midl_user_free(EnumBuffer
->Buffer
);
2389 midl_user_free(EnumBuffer
);
2393 SampRegCloseKey(&NamesKeyHandle
);
2394 SampRegCloseKey(&GroupsKeyHandle
);
2396 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
!= FALSE
))
2397 Status
= STATUS_MORE_ENTRIES
;
2399 RtlReleaseResource(&SampResource
);
2408 SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle
,
2409 IN PRPC_UNICODE_STRING Name
,
2410 IN ACCESS_MASK DesiredAccess
,
2411 OUT SAMPR_HANDLE
*UserHandle
,
2412 OUT
unsigned long *RelativeId
)
2414 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
2415 SAM_USER_FIXED_DATA FixedUserData
;
2416 PSAM_DB_OBJECT DomainObject
;
2417 PSAM_DB_OBJECT UserObject
;
2418 GROUP_MEMBERSHIP GroupMembership
;
2419 UCHAR LogonHours
[23];
2423 PSECURITY_DESCRIPTOR Sd
= NULL
;
2425 PSID UserSid
= NULL
;
2428 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
2429 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
2432 Name
->Length
== 0 ||
2433 Name
->Buffer
== NULL
||
2434 UserHandle
== NULL
||
2436 return STATUS_INVALID_PARAMETER
;
2438 /* Map generic access rights */
2439 RtlMapGenericMask(&DesiredAccess
,
2442 RtlAcquireResourceExclusive(&SampResource
,
2445 /* Validate the domain handle */
2446 Status
= SampValidateDbObject(DomainHandle
,
2450 if (!NT_SUCCESS(Status
))
2452 TRACE("failed with status 0x%08lx\n", Status
);
2456 /* Check the user account name */
2457 Status
= SampCheckAccountName(Name
, 20);
2458 if (!NT_SUCCESS(Status
))
2460 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
2464 /* Check if the user name already exists in the domain */
2465 Status
= SampCheckAccountNameInDomain(DomainObject
,
2467 if (!NT_SUCCESS(Status
))
2469 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
2470 Name
->Buffer
, Status
);
2474 /* Get the fixed domain attributes */
2475 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
2476 Status
= SampGetObjectAttribute(DomainObject
,
2479 (PVOID
)&FixedDomainData
,
2481 if (!NT_SUCCESS(Status
))
2483 TRACE("failed with status 0x%08lx\n", Status
);
2487 /* Increment the NextRid attribute */
2488 ulRid
= FixedDomainData
.NextRid
;
2489 FixedDomainData
.NextRid
++;
2491 TRACE("RID: %lx\n", ulRid
);
2493 /* Create the user SID */
2494 Status
= SampCreateAccountSid(DomainObject
,
2497 if (!NT_SUCCESS(Status
))
2499 TRACE("SampCreateAccountSid failed (Status 0x%08lx)\n", Status
);
2503 /* Create the security descriptor */
2504 Status
= SampCreateUserSD(UserSid
,
2507 if (!NT_SUCCESS(Status
))
2509 TRACE("SampCreateUserSD failed (Status 0x%08lx)\n", Status
);
2513 /* Store the fixed domain attributes */
2514 Status
= SampSetObjectAttribute(DomainObject
,
2519 if (!NT_SUCCESS(Status
))
2521 TRACE("failed with status 0x%08lx\n", Status
);
2525 /* Convert the RID into a string (hex) */
2526 swprintf(szRid
, L
"%08lX", ulRid
);
2528 /* Create the user object */
2529 Status
= SampCreateDbObject(DomainObject
,
2536 if (!NT_SUCCESS(Status
))
2538 TRACE("failed with status 0x%08lx\n", Status
);
2542 /* Add the account name for the user object */
2543 Status
= SampSetAccountNameInDomain(DomainObject
,
2547 if (!NT_SUCCESS(Status
))
2549 TRACE("failed with status 0x%08lx\n", Status
);
2553 /* Initialize fixed user data */
2554 memset(&FixedUserData
, 0, sizeof(SAM_USER_FIXED_DATA
));
2555 FixedUserData
.Version
= 1;
2556 FixedUserData
.Reserved
= 0;
2557 FixedUserData
.LastLogon
.QuadPart
= 0;
2558 FixedUserData
.LastLogoff
.QuadPart
= 0;
2559 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
2560 FixedUserData
.AccountExpires
.QuadPart
= MAXLONGLONG
;
2561 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
2562 FixedUserData
.UserId
= ulRid
;
2563 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
2564 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
2565 USER_PASSWORD_NOT_REQUIRED
|
2566 USER_NORMAL_ACCOUNT
;
2567 FixedUserData
.CountryCode
= 0;
2568 FixedUserData
.CodePage
= 0;
2569 FixedUserData
.BadPasswordCount
= 0;
2570 FixedUserData
.LogonCount
= 0;
2571 FixedUserData
.AdminCount
= 0;
2572 FixedUserData
.OperatorCount
= 0;
2574 /* Set fixed user data attribute */
2575 Status
= SampSetObjectAttribute(UserObject
,
2578 (LPVOID
)&FixedUserData
,
2579 sizeof(SAM_USER_FIXED_DATA
));
2580 if (!NT_SUCCESS(Status
))
2582 TRACE("failed with status 0x%08lx\n", Status
);
2586 /* Set the Name attribute */
2587 Status
= SampSetObjectAttributeString(UserObject
,
2590 if (!NT_SUCCESS(Status
))
2592 TRACE("failed with status 0x%08lx\n", Status
);
2596 /* Set the FullName attribute */
2597 Status
= SampSetObjectAttributeString(UserObject
,
2600 if (!NT_SUCCESS(Status
))
2602 TRACE("failed with status 0x%08lx\n", Status
);
2606 /* Set the HomeDirectory attribute */
2607 Status
= SampSetObjectAttributeString(UserObject
,
2610 if (!NT_SUCCESS(Status
))
2612 TRACE("failed with status 0x%08lx\n", Status
);
2616 /* Set the HomeDirectoryDrive attribute */
2617 Status
= SampSetObjectAttributeString(UserObject
,
2618 L
"HomeDirectoryDrive",
2620 if (!NT_SUCCESS(Status
))
2622 TRACE("failed with status 0x%08lx\n", Status
);
2626 /* Set the ScriptPath attribute */
2627 Status
= SampSetObjectAttributeString(UserObject
,
2630 if (!NT_SUCCESS(Status
))
2632 TRACE("failed with status 0x%08lx\n", Status
);
2636 /* Set the ProfilePath attribute */
2637 Status
= SampSetObjectAttributeString(UserObject
,
2640 if (!NT_SUCCESS(Status
))
2642 TRACE("failed with status 0x%08lx\n", Status
);
2646 /* Set the AdminComment attribute */
2647 Status
= SampSetObjectAttributeString(UserObject
,
2650 if (!NT_SUCCESS(Status
))
2652 TRACE("failed with status 0x%08lx\n", Status
);
2656 /* Set the UserComment attribute */
2657 Status
= SampSetObjectAttributeString(UserObject
,
2660 if (!NT_SUCCESS(Status
))
2662 TRACE("failed with status 0x%08lx\n", Status
);
2666 /* Set the WorkStations attribute */
2667 Status
= SampSetObjectAttributeString(UserObject
,
2670 if (!NT_SUCCESS(Status
))
2672 TRACE("failed with status 0x%08lx\n", Status
);
2676 /* Set the Parameters attribute */
2677 Status
= SampSetObjectAttributeString(UserObject
,
2680 if (!NT_SUCCESS(Status
))
2682 TRACE("failed with status 0x%08lx\n", Status
);
2686 /* Set LogonHours attribute*/
2687 *((PUSHORT
)LogonHours
) = 168;
2688 memset(&(LogonHours
[2]), 0xff, 21);
2690 Status
= SampSetObjectAttribute(UserObject
,
2694 sizeof(LogonHours
));
2695 if (!NT_SUCCESS(Status
))
2697 TRACE("failed with status 0x%08lx\n", Status
);
2701 /* Set Groups attribute*/
2702 GroupMembership
.RelativeId
= DOMAIN_GROUP_RID_USERS
;
2703 GroupMembership
.Attributes
= SE_GROUP_MANDATORY
|
2705 SE_GROUP_ENABLED_BY_DEFAULT
;
2707 Status
= SampSetObjectAttribute(UserObject
,
2711 sizeof(GROUP_MEMBERSHIP
));
2712 if (!NT_SUCCESS(Status
))
2714 TRACE("failed with status 0x%08lx\n", Status
);
2718 /* Set LMPwd attribute*/
2719 Status
= SampSetObjectAttribute(UserObject
,
2723 sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
2724 if (!NT_SUCCESS(Status
))
2726 TRACE("failed with status 0x%08lx\n", Status
);
2730 /* Set NTPwd attribute*/
2731 Status
= SampSetObjectAttribute(UserObject
,
2735 sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
2736 if (!NT_SUCCESS(Status
))
2738 TRACE("failed with status 0x%08lx\n", Status
);
2742 /* Set LMPwdHistory attribute*/
2743 Status
= SampSetObjectAttribute(UserObject
,
2748 if (!NT_SUCCESS(Status
))
2750 TRACE("failed with status 0x%08lx\n", Status
);
2754 /* Set NTPwdHistory attribute*/
2755 Status
= SampSetObjectAttribute(UserObject
,
2760 if (!NT_SUCCESS(Status
))
2762 TRACE("failed with status 0x%08lx\n", Status
);
2766 /* Set the PrivateData attribute */
2767 Status
= SampSetObjectAttributeString(UserObject
,
2770 if (!NT_SUCCESS(Status
))
2772 TRACE("failed with status 0x%08lx\n", Status
);
2776 /* Set the SecDesc attribute*/
2777 Status
= SampSetObjectAttribute(UserObject
,
2782 if (!NT_SUCCESS(Status
))
2784 TRACE("failed with status 0x%08lx\n", Status
);
2788 if (NT_SUCCESS(Status
))
2790 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
2791 *RelativeId
= ulRid
;
2796 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
2798 if (UserSid
!= NULL
)
2799 RtlFreeHeap(RtlGetProcessHeap(), 0, UserSid
);
2801 RtlReleaseResource(&SampResource
);
2803 TRACE("returns with status 0x%08lx\n", Status
);
2812 SamrEnumerateUsersInDomain(IN SAMPR_HANDLE DomainHandle
,
2813 IN OUT
unsigned long *EnumerationContext
,
2814 IN
unsigned long UserAccountControl
,
2815 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
2816 IN
unsigned long PreferedMaximumLength
,
2817 OUT
unsigned long *CountReturned
)
2819 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
2820 PSAM_DB_OBJECT DomainObject
;
2821 HANDLE UsersKeyHandle
= NULL
;
2822 HANDLE NamesKeyHandle
= NULL
;
2825 ULONG EnumCount
= 0;
2826 ULONG RequiredLength
= 0;
2831 BOOLEAN MoreEntries
= FALSE
;
2834 TRACE("SamrEnumerateUsersInDomain(%p %p %lx %p %lu %p)\n",
2835 DomainHandle
, EnumerationContext
, UserAccountControl
, Buffer
,
2836 PreferedMaximumLength
, CountReturned
);
2838 RtlAcquireResourceShared(&SampResource
,
2841 /* Validate the domain handle */
2842 Status
= SampValidateDbObject(DomainHandle
,
2844 DOMAIN_LIST_ACCOUNTS
,
2846 if (!NT_SUCCESS(Status
))
2849 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
2853 if (!NT_SUCCESS(Status
))
2856 Status
= SampRegOpenKey(UsersKeyHandle
,
2860 if (!NT_SUCCESS(Status
))
2865 EnumIndex
= *EnumerationContext
;
2869 NameLength
= 64 * sizeof(WCHAR
);
2870 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2877 if (!NT_SUCCESS(Status
))
2879 if (Status
== STATUS_NO_MORE_ENTRIES
)
2880 Status
= STATUS_SUCCESS
;
2884 TRACE("EnumIndex: %lu\n", EnumIndex
);
2885 TRACE("User name: %S\n", UserName
);
2886 TRACE("Name length: %lu\n", NameLength
);
2888 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
2894 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
2900 TRACE("EnumCount: %lu\n", EnumCount
);
2901 TRACE("RequiredLength: %lu\n", RequiredLength
);
2903 if (!NT_SUCCESS(Status
))
2906 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
2907 if (EnumBuffer
== NULL
)
2909 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2913 EnumBuffer
->EntriesRead
= EnumCount
;
2917 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
2918 if (EnumBuffer
->Buffer
== NULL
)
2920 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2926 EnumIndex
= *EnumerationContext
;
2927 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
2929 NameLength
= 64 * sizeof(WCHAR
);
2930 DataLength
= sizeof(ULONG
);
2931 Status
= SampRegEnumerateValue(NamesKeyHandle
,
2938 if (!NT_SUCCESS(Status
))
2940 if (Status
== STATUS_NO_MORE_ENTRIES
)
2941 Status
= STATUS_SUCCESS
;
2945 TRACE("EnumIndex: %lu\n", EnumIndex
);
2946 TRACE("User name: %S\n", UserName
);
2947 TRACE("Name length: %lu\n", NameLength
);
2948 TRACE("RID: %lu\n", Rid
);
2950 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
2952 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
2953 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(NameLength
+ sizeof(UNICODE_NULL
));
2955 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
2957 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
2958 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
2960 Status
= STATUS_INSUFFICIENT_RESOURCES
;
2964 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
2966 EnumBuffer
->Buffer
[i
].Name
.Length
);
2971 if (NT_SUCCESS(Status
))
2973 *EnumerationContext
+= EnumCount
;
2974 *Buffer
= EnumBuffer
;
2975 *CountReturned
= EnumCount
;
2979 *EnumerationContext
= 0;
2983 if (EnumBuffer
!= NULL
)
2985 if (EnumBuffer
->Buffer
!= NULL
)
2987 if (EnumBuffer
->EntriesRead
!= 0)
2989 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
2991 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
2992 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
2996 midl_user_free(EnumBuffer
->Buffer
);
2999 midl_user_free(EnumBuffer
);
3003 SampRegCloseKey(&NamesKeyHandle
);
3004 SampRegCloseKey(&UsersKeyHandle
);
3006 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
!= FALSE
))
3007 Status
= STATUS_MORE_ENTRIES
;
3009 RtlReleaseResource(&SampResource
);
3018 SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle
,
3019 IN PRPC_UNICODE_STRING AccountName
,
3020 IN ACCESS_MASK DesiredAccess
,
3021 OUT SAMPR_HANDLE
*AliasHandle
,
3022 OUT
unsigned long *RelativeId
)
3024 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
3025 PSAM_DB_OBJECT DomainObject
;
3026 PSAM_DB_OBJECT AliasObject
;
3027 PSECURITY_DESCRIPTOR Sd
= NULL
;
3034 TRACE("SamrCreateAliasInDomain(%p %p %lx %p %p)\n",
3035 DomainHandle
, AccountName
, DesiredAccess
, AliasHandle
, RelativeId
);
3037 /* Map generic access rights */
3038 RtlMapGenericMask(&DesiredAccess
,
3041 RtlAcquireResourceExclusive(&SampResource
,
3044 /* Validate the domain handle */
3045 Status
= SampValidateDbObject(DomainHandle
,
3047 DOMAIN_CREATE_ALIAS
,
3049 if (!NT_SUCCESS(Status
))
3051 TRACE("failed with status 0x%08lx\n", Status
);
3055 /* Check the alias account name */
3056 Status
= SampCheckAccountName(AccountName
, 256);
3057 if (!NT_SUCCESS(Status
))
3059 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
3063 /* Check if the alias name already exists in the domain */
3064 Status
= SampCheckAccountNameInDomain(DomainObject
,
3065 AccountName
->Buffer
);
3066 if (!NT_SUCCESS(Status
))
3068 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
3069 AccountName
->Buffer
, Status
);
3073 /* Create the security descriptor */
3074 Status
= SampCreateAliasSD(&Sd
,
3076 if (!NT_SUCCESS(Status
))
3078 TRACE("SampCreateAliasSD failed (Status 0x%08lx)\n", Status
);
3082 /* Get the fixed domain attributes */
3083 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
3084 Status
= SampGetObjectAttribute(DomainObject
,
3087 (PVOID
)&FixedDomainData
,
3089 if (!NT_SUCCESS(Status
))
3091 TRACE("failed with status 0x%08lx\n", Status
);
3095 /* Increment the NextRid attribute */
3096 ulRid
= FixedDomainData
.NextRid
;
3097 FixedDomainData
.NextRid
++;
3099 /* Store the fixed domain attributes */
3100 Status
= SampSetObjectAttribute(DomainObject
,
3105 if (!NT_SUCCESS(Status
))
3107 TRACE("failed with status 0x%08lx\n", Status
);
3111 TRACE("RID: %lx\n", ulRid
);
3113 /* Convert the RID into a string (hex) */
3114 swprintf(szRid
, L
"%08lX", ulRid
);
3116 /* Create the alias object */
3117 Status
= SampCreateDbObject(DomainObject
,
3124 if (!NT_SUCCESS(Status
))
3126 TRACE("failed with status 0x%08lx\n", Status
);
3130 /* Add the account name for the alias object */
3131 Status
= SampSetAccountNameInDomain(DomainObject
,
3133 AccountName
->Buffer
,
3135 if (!NT_SUCCESS(Status
))
3137 TRACE("failed with status 0x%08lx\n", Status
);
3141 /* Set the Name attribute */
3142 Status
= SampSetObjectAttributeString(AliasObject
,
3145 if (!NT_SUCCESS(Status
))
3147 TRACE("failed with status 0x%08lx\n", Status
);
3151 /* Set the Description attribute */
3152 Status
= SampSetObjectAttributeString(AliasObject
,
3155 if (!NT_SUCCESS(Status
))
3157 TRACE("failed with status 0x%08lx\n", Status
);
3161 /* Set the SecDesc attribute*/
3162 Status
= SampSetObjectAttribute(AliasObject
,
3167 if (!NT_SUCCESS(Status
))
3169 TRACE("failed with status 0x%08lx\n", Status
);
3173 if (NT_SUCCESS(Status
))
3175 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
3176 *RelativeId
= ulRid
;
3181 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
3183 RtlReleaseResource(&SampResource
);
3185 TRACE("returns with status 0x%08lx\n", Status
);
3194 SamrEnumerateAliasesInDomain(IN SAMPR_HANDLE DomainHandle
,
3195 IN OUT
unsigned long *EnumerationContext
,
3196 OUT PSAMPR_ENUMERATION_BUFFER
*Buffer
,
3197 IN
unsigned long PreferedMaximumLength
,
3198 OUT
unsigned long *CountReturned
)
3200 PSAMPR_ENUMERATION_BUFFER EnumBuffer
= NULL
;
3201 PSAM_DB_OBJECT DomainObject
;
3202 HANDLE AliasesKeyHandle
= NULL
;
3203 HANDLE NamesKeyHandle
= NULL
;
3204 WCHAR AliasName
[64];
3206 ULONG EnumCount
= 0;
3207 ULONG RequiredLength
= 0;
3212 BOOLEAN MoreEntries
= FALSE
;
3215 TRACE("SamrEnumerateAliasesInDomain(%p %p %p %lu %p)\n",
3216 DomainHandle
, EnumerationContext
, Buffer
,
3217 PreferedMaximumLength
, CountReturned
);
3219 RtlAcquireResourceShared(&SampResource
,
3222 /* Validate the domain handle */
3223 Status
= SampValidateDbObject(DomainHandle
,
3225 DOMAIN_LIST_ACCOUNTS
,
3227 if (!NT_SUCCESS(Status
))
3230 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3234 if (!NT_SUCCESS(Status
))
3237 Status
= SampRegOpenKey(AliasesKeyHandle
,
3241 if (!NT_SUCCESS(Status
))
3246 EnumIndex
= *EnumerationContext
;
3250 NameLength
= 64 * sizeof(WCHAR
);
3251 Status
= SampRegEnumerateValue(NamesKeyHandle
,
3258 if (!NT_SUCCESS(Status
))
3260 if (Status
== STATUS_NO_MORE_ENTRIES
)
3261 Status
= STATUS_SUCCESS
;
3265 TRACE("EnumIndex: %lu\n", EnumIndex
);
3266 TRACE("Alias name: %S\n", AliasName
);
3267 TRACE("Name length: %lu\n", NameLength
);
3269 if ((RequiredLength
+ NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
)) > PreferedMaximumLength
)
3275 RequiredLength
+= (NameLength
+ sizeof(UNICODE_NULL
) + sizeof(SAMPR_RID_ENUMERATION
));
3281 TRACE("EnumCount: %lu\n", EnumCount
);
3282 TRACE("RequiredLength: %lu\n", RequiredLength
);
3284 if (!NT_SUCCESS(Status
))
3287 EnumBuffer
= midl_user_allocate(sizeof(SAMPR_ENUMERATION_BUFFER
));
3288 if (EnumBuffer
== NULL
)
3290 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3294 EnumBuffer
->EntriesRead
= EnumCount
;
3298 EnumBuffer
->Buffer
= midl_user_allocate(EnumCount
* sizeof(SAMPR_RID_ENUMERATION
));
3299 if (EnumBuffer
->Buffer
== NULL
)
3301 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3307 EnumIndex
= *EnumerationContext
;
3308 for (i
= 0; i
< EnumCount
; i
++, EnumIndex
++)
3310 NameLength
= 64 * sizeof(WCHAR
);
3311 DataLength
= sizeof(ULONG
);
3312 Status
= SampRegEnumerateValue(NamesKeyHandle
,
3319 if (!NT_SUCCESS(Status
))
3321 if (Status
== STATUS_NO_MORE_ENTRIES
)
3322 Status
= STATUS_SUCCESS
;
3326 TRACE("EnumIndex: %lu\n", EnumIndex
);
3327 TRACE("Alias name: %S\n", AliasName
);
3328 TRACE("Name length: %lu\n", NameLength
);
3329 TRACE("RID: %lu\n", Rid
);
3331 EnumBuffer
->Buffer
[i
].RelativeId
= Rid
;
3333 EnumBuffer
->Buffer
[i
].Name
.Length
= (USHORT
)NameLength
;
3334 EnumBuffer
->Buffer
[i
].Name
.MaximumLength
= (USHORT
)(NameLength
+ sizeof(UNICODE_NULL
));
3336 /* FIXME: Disabled because of bugs in widl and rpcrt4 */
3338 EnumBuffer
->Buffer
[i
].Name
.Buffer
= midl_user_allocate(EnumBuffer
->Buffer
[i
].Name
.MaximumLength
);
3339 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
== NULL
)
3341 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3345 memcpy(EnumBuffer
->Buffer
[i
].Name
.Buffer
,
3347 EnumBuffer
->Buffer
[i
].Name
.Length
);
3352 if (NT_SUCCESS(Status
))
3354 *EnumerationContext
+= EnumCount
;
3355 *Buffer
= EnumBuffer
;
3356 *CountReturned
= EnumCount
;
3360 *EnumerationContext
= 0;
3364 if (EnumBuffer
!= NULL
)
3366 if (EnumBuffer
->Buffer
!= NULL
)
3368 if (EnumBuffer
->EntriesRead
!= 0)
3370 for (i
= 0; i
< EnumBuffer
->EntriesRead
; i
++)
3372 if (EnumBuffer
->Buffer
[i
].Name
.Buffer
!= NULL
)
3373 midl_user_free(EnumBuffer
->Buffer
[i
].Name
.Buffer
);
3377 midl_user_free(EnumBuffer
->Buffer
);
3380 midl_user_free(EnumBuffer
);
3384 SampRegCloseKey(&NamesKeyHandle
);
3385 SampRegCloseKey(&AliasesKeyHandle
);
3387 if ((Status
== STATUS_SUCCESS
) && (MoreEntries
!= FALSE
))
3388 Status
= STATUS_MORE_ENTRIES
;
3390 RtlReleaseResource(&SampResource
);
3399 SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle
,
3400 IN PSAMPR_PSID_ARRAY SidArray
,
3401 OUT PSAMPR_ULONG_ARRAY Membership
)
3403 PSAM_DB_OBJECT DomainObject
;
3404 HANDLE AliasesKeyHandle
= NULL
;
3405 HANDLE MembersKeyHandle
= NULL
;
3406 HANDLE MemberKeyHandle
= NULL
;
3407 LPWSTR MemberSidString
= NULL
;
3408 PULONG RidArray
= NULL
;
3409 ULONG MaxSidCount
= 0;
3415 WCHAR NameBuffer
[9];
3417 TRACE("SamrGetAliasMembership(%p %p %p)\n",
3418 DomainHandle
, SidArray
, Membership
);
3420 RtlAcquireResourceShared(&SampResource
,
3423 /* Validate the domain handle */
3424 Status
= SampValidateDbObject(DomainHandle
,
3426 DOMAIN_GET_ALIAS_MEMBERSHIP
,
3428 if (!NT_SUCCESS(Status
))
3431 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3435 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3436 if (!NT_SUCCESS(Status
))
3439 Status
= SampRegOpenKey(AliasesKeyHandle
,
3443 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3445 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3447 Status
= STATUS_SUCCESS
;
3451 if (!NT_SUCCESS(Status
))
3454 for (i
= 0; i
< SidArray
->Count
; i
++)
3456 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3457 TRACE("Open %S\n", MemberSidString
);
3459 Status
= SampRegOpenKey(MembersKeyHandle
,
3463 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3464 if (NT_SUCCESS(Status
))
3466 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3469 if (NT_SUCCESS(Status
))
3471 TRACE("Found %lu values\n", ValueCount
);
3472 MaxSidCount
+= ValueCount
;
3475 SampRegCloseKey(&MemberKeyHandle
);
3478 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3479 Status
= STATUS_SUCCESS
;
3481 LocalFree(MemberSidString
);
3484 if (MaxSidCount
== 0)
3486 Status
= STATUS_SUCCESS
;
3490 TRACE("Maximum sid count: %lu\n", MaxSidCount
);
3491 RidArray
= midl_user_allocate(MaxSidCount
* sizeof(ULONG
));
3492 if (RidArray
== NULL
)
3494 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3499 for (i
= 0; i
< SidArray
->Count
; i
++)
3501 ConvertSidToStringSid(SidArray
->Sids
[i
].SidPointer
, &MemberSidString
);
3502 TRACE("Open %S\n", MemberSidString
);
3504 Status
= SampRegOpenKey(MembersKeyHandle
,
3508 TRACE("SampRegOpenKey returned %08lX\n", Status
);
3509 if (NT_SUCCESS(Status
))
3511 Status
= SampRegQueryKeyInfo(MemberKeyHandle
,
3514 if (NT_SUCCESS(Status
))
3516 TRACE("Found %lu values\n", ValueCount
);
3518 for (j
= 0; j
< ValueCount
; j
++)
3520 DataLength
= 9 * sizeof(WCHAR
);
3521 Status
= SampRegEnumerateValue(MemberKeyHandle
,
3528 if (NT_SUCCESS(Status
))
3530 /* FIXME: Do not return each RID more than once. */
3531 RidArray
[RidIndex
] = wcstoul(NameBuffer
, NULL
, 16);
3537 SampRegCloseKey(&MemberKeyHandle
);
3540 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3541 Status
= STATUS_SUCCESS
;
3543 LocalFree(MemberSidString
);
3547 SampRegCloseKey(&MembersKeyHandle
);
3548 SampRegCloseKey(&AliasesKeyHandle
);
3550 if (NT_SUCCESS(Status
))
3552 Membership
->Count
= MaxSidCount
;
3553 Membership
->Element
= RidArray
;
3557 if (RidArray
!= NULL
)
3558 midl_user_free(RidArray
);
3561 RtlReleaseResource(&SampResource
);
3570 SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle
,
3572 IN RPC_UNICODE_STRING Names
[],
3573 OUT PSAMPR_ULONG_ARRAY RelativeIds
,
3574 OUT PSAMPR_ULONG_ARRAY Use
)
3576 PSAM_DB_OBJECT DomainObject
;
3577 HANDLE AccountsKeyHandle
= NULL
;
3578 HANDLE NamesKeyHandle
= NULL
;
3579 ULONG MappedCount
= 0;
3585 TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
3586 DomainHandle
, Count
, Names
, RelativeIds
, Use
);
3588 RtlAcquireResourceShared(&SampResource
,
3591 /* Validate the domain handle */
3592 Status
= SampValidateDbObject(DomainHandle
,
3596 if (!NT_SUCCESS(Status
))
3598 TRACE("failed with status 0x%08lx\n", Status
);
3602 RelativeIds
->Count
= 0;
3607 Status
= STATUS_SUCCESS
;
3611 /* Allocate the relative IDs array */
3612 RelativeIds
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3613 if (RelativeIds
->Element
== NULL
)
3615 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3619 /* Allocate the use array */
3620 Use
->Element
= midl_user_allocate(Count
* sizeof(ULONG
));
3621 if (Use
->Element
== NULL
)
3623 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3627 RelativeIds
->Count
= Count
;
3630 for (i
= 0; i
< Count
; i
++)
3632 TRACE("Name: %S\n", Names
[i
].Buffer
);
3636 /* Lookup aliases */
3637 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3640 &AccountsKeyHandle
);
3641 if (NT_SUCCESS(Status
))
3643 Status
= SampRegOpenKey(AccountsKeyHandle
,
3647 if (NT_SUCCESS(Status
))
3649 DataLength
= sizeof(ULONG
);
3650 Status
= SampRegQueryValue(NamesKeyHandle
,
3656 SampRegCloseKey(&NamesKeyHandle
);
3659 SampRegCloseKey(&AccountsKeyHandle
);
3662 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3665 /* Return alias account */
3666 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3668 TRACE("Rid: %lu\n", RelativeId
);
3669 RelativeIds
->Element
[i
] = RelativeId
;
3670 Use
->Element
[i
] = SidTypeAlias
;
3676 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3679 &AccountsKeyHandle
);
3680 if (NT_SUCCESS(Status
))
3682 Status
= SampRegOpenKey(AccountsKeyHandle
,
3686 if (NT_SUCCESS(Status
))
3688 DataLength
= sizeof(ULONG
);
3689 Status
= SampRegQueryValue(NamesKeyHandle
,
3695 SampRegCloseKey(&NamesKeyHandle
);
3698 SampRegCloseKey(&AccountsKeyHandle
);
3701 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3704 /* Return group account */
3705 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3707 TRACE("Rid: %lu\n", RelativeId
);
3708 RelativeIds
->Element
[i
] = RelativeId
;
3709 Use
->Element
[i
] = SidTypeGroup
;
3715 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3718 &AccountsKeyHandle
);
3719 if (NT_SUCCESS(Status
))
3721 Status
= SampRegOpenKey(AccountsKeyHandle
,
3725 if (NT_SUCCESS(Status
))
3727 DataLength
= sizeof(ULONG
);
3728 Status
= SampRegQueryValue(NamesKeyHandle
,
3734 SampRegCloseKey(&NamesKeyHandle
);
3737 SampRegCloseKey(&AccountsKeyHandle
);
3740 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3743 /* Return user account */
3744 if (NT_SUCCESS(Status
) && RelativeId
!= 0)
3746 TRACE("Rid: %lu\n", RelativeId
);
3747 RelativeIds
->Element
[i
] = RelativeId
;
3748 Use
->Element
[i
] = SidTypeUser
;
3753 /* Return unknown account */
3754 RelativeIds
->Element
[i
] = 0;
3755 Use
->Element
[i
] = SidTypeUnknown
;
3759 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
3760 Status
= STATUS_SUCCESS
;
3762 if (NT_SUCCESS(Status
))
3764 if (MappedCount
== 0)
3765 Status
= STATUS_NONE_MAPPED
;
3766 else if (MappedCount
< Count
)
3767 Status
= STATUS_SOME_NOT_MAPPED
;
3771 if (RelativeIds
->Element
!= NULL
)
3773 midl_user_free(RelativeIds
->Element
);
3774 RelativeIds
->Element
= NULL
;
3777 RelativeIds
->Count
= 0;
3779 if (Use
->Element
!= NULL
)
3781 midl_user_free(Use
->Element
);
3782 Use
->Element
= NULL
;
3788 RtlReleaseResource(&SampResource
);
3790 TRACE("Returned Status %lx\n", Status
);
3799 SamrLookupIdsInDomain(IN SAMPR_HANDLE DomainHandle
,
3801 IN ULONG
*RelativeIds
,
3802 OUT PSAMPR_RETURNED_USTRING_ARRAY Names
,
3803 OUT PSAMPR_ULONG_ARRAY Use
)
3805 PSAM_DB_OBJECT DomainObject
;
3807 HANDLE AccountsKeyHandle
= NULL
;
3808 HANDLE AccountKeyHandle
= NULL
;
3809 ULONG MappedCount
= 0;
3814 TRACE("SamrLookupIdsInDomain(%p %lu %p %p %p)\n",
3815 DomainHandle
, Count
, RelativeIds
, Names
, Use
);
3817 RtlAcquireResourceShared(&SampResource
,
3820 /* Validate the domain handle */
3821 Status
= SampValidateDbObject(DomainHandle
,
3825 if (!NT_SUCCESS(Status
))
3827 TRACE("failed with status 0x%08lx\n", Status
);
3836 Status
= STATUS_SUCCESS
;
3840 /* Allocate the names array */
3841 Names
->Element
= midl_user_allocate(Count
* sizeof(*Names
->Element
));
3842 if (Names
->Element
== NULL
)
3844 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3848 /* Allocate the use array */
3849 Use
->Element
= midl_user_allocate(Count
* sizeof(*Use
->Element
));
3850 if (Use
->Element
== NULL
)
3852 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3856 Names
->Count
= Count
;
3859 for (i
= 0; i
< Count
; i
++)
3861 TRACE("RID: %lu\n", RelativeIds
[i
]);
3863 swprintf(RidString
, L
"%08lx", RelativeIds
[i
]);
3865 /* Lookup aliases */
3866 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3869 &AccountsKeyHandle
);
3870 if (NT_SUCCESS(Status
))
3872 Status
= SampRegOpenKey(AccountsKeyHandle
,
3876 if (NT_SUCCESS(Status
))
3879 Status
= SampRegQueryValue(AccountKeyHandle
,
3884 if (NT_SUCCESS(Status
))
3886 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3887 if (Names
->Element
[i
].Buffer
== NULL
)
3888 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3890 if (NT_SUCCESS(Status
))
3892 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3893 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3895 Status
= SampRegQueryValue(AccountKeyHandle
,
3898 Names
->Element
[i
].Buffer
,
3903 SampRegCloseKey(&AccountKeyHandle
);
3906 SampRegCloseKey(&AccountsKeyHandle
);
3909 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3912 /* Return alias account */
3913 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3915 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3916 Use
->Element
[i
] = SidTypeAlias
;
3922 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3925 &AccountsKeyHandle
);
3926 if (NT_SUCCESS(Status
))
3928 Status
= SampRegOpenKey(AccountsKeyHandle
,
3932 if (NT_SUCCESS(Status
))
3935 Status
= SampRegQueryValue(AccountKeyHandle
,
3940 if (NT_SUCCESS(Status
))
3942 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
3943 if (Names
->Element
[i
].Buffer
== NULL
)
3944 Status
= STATUS_INSUFFICIENT_RESOURCES
;
3946 if (NT_SUCCESS(Status
))
3948 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
3949 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
3951 Status
= SampRegQueryValue(AccountKeyHandle
,
3954 Names
->Element
[i
].Buffer
,
3959 SampRegCloseKey(&AccountKeyHandle
);
3962 SampRegCloseKey(&AccountsKeyHandle
);
3965 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
3968 /* Return group account */
3969 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
3971 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
3972 Use
->Element
[i
] = SidTypeGroup
;
3978 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
3981 &AccountsKeyHandle
);
3982 if (NT_SUCCESS(Status
))
3984 Status
= SampRegOpenKey(AccountsKeyHandle
,
3988 if (NT_SUCCESS(Status
))
3991 Status
= SampRegQueryValue(AccountKeyHandle
,
3996 if (NT_SUCCESS(Status
))
3998 TRACE("DataLength: %lu\n", DataLength
);
4000 Names
->Element
[i
].Buffer
= midl_user_allocate(DataLength
);
4001 if (Names
->Element
[i
].Buffer
== NULL
)
4002 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4004 if (NT_SUCCESS(Status
))
4006 Names
->Element
[i
].MaximumLength
= (USHORT
)DataLength
;
4007 Names
->Element
[i
].Length
= (USHORT
)(DataLength
- sizeof(WCHAR
));
4009 Status
= SampRegQueryValue(AccountKeyHandle
,
4012 Names
->Element
[i
].Buffer
,
4017 SampRegCloseKey(&AccountKeyHandle
);
4020 SampRegCloseKey(&AccountsKeyHandle
);
4023 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
4026 /* Return user account */
4027 if (NT_SUCCESS(Status
) && Names
->Element
[i
].Buffer
!= NULL
)
4029 TRACE("Name: %S\n", Names
->Element
[i
].Buffer
);
4030 Use
->Element
[i
] = SidTypeUser
;
4035 /* Return unknown account */
4036 Use
->Element
[i
] = SidTypeUnknown
;
4040 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4041 Status
= STATUS_SUCCESS
;
4043 if (NT_SUCCESS(Status
))
4045 if (MappedCount
== 0)
4046 Status
= STATUS_NONE_MAPPED
;
4047 else if (MappedCount
< Count
)
4048 Status
= STATUS_SOME_NOT_MAPPED
;
4052 if (Names
->Element
!= NULL
)
4054 for (i
= 0; i
< Count
; i
++)
4056 if (Names
->Element
[i
].Buffer
!= NULL
)
4057 midl_user_free(Names
->Element
[i
].Buffer
);
4060 midl_user_free(Names
->Element
);
4061 Names
->Element
= NULL
;
4066 if (Use
->Element
!= NULL
)
4068 midl_user_free(Use
->Element
);
4069 Use
->Element
= NULL
;
4075 RtlReleaseResource(&SampResource
);
4084 SamrOpenGroup(IN SAMPR_HANDLE DomainHandle
,
4085 IN ACCESS_MASK DesiredAccess
,
4086 IN
unsigned long GroupId
,
4087 OUT SAMPR_HANDLE
*GroupHandle
)
4089 PSAM_DB_OBJECT DomainObject
;
4090 PSAM_DB_OBJECT GroupObject
;
4094 TRACE("SamrOpenGroup(%p %lx %lx %p)\n",
4095 DomainHandle
, DesiredAccess
, GroupId
, GroupHandle
);
4097 /* Map generic access rights */
4098 RtlMapGenericMask(&DesiredAccess
,
4101 RtlAcquireResourceShared(&SampResource
,
4104 /* Validate the domain handle */
4105 Status
= SampValidateDbObject(DomainHandle
,
4109 if (!NT_SUCCESS(Status
))
4111 TRACE("failed with status 0x%08lx\n", Status
);
4115 /* Convert the RID into a string (hex) */
4116 swprintf(szRid
, L
"%08lX", GroupId
);
4118 /* Create the group object */
4119 Status
= SampOpenDbObject(DomainObject
,
4126 if (!NT_SUCCESS(Status
))
4128 TRACE("failed with status 0x%08lx\n", Status
);
4132 *GroupHandle
= (SAMPR_HANDLE
)GroupObject
;
4135 RtlReleaseResource(&SampResource
);
4142 SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject
,
4143 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4145 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
4146 SAM_GROUP_FIXED_DATA FixedData
;
4147 ULONG MembersLength
= 0;
4153 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
4154 if (InfoBuffer
== NULL
)
4155 return STATUS_INSUFFICIENT_RESOURCES
;
4157 Status
= SampGetObjectAttributeString(GroupObject
,
4159 &InfoBuffer
->General
.Name
);
4160 if (!NT_SUCCESS(Status
))
4162 TRACE("Status 0x%08lx\n", Status
);
4166 Status
= SampGetObjectAttributeString(GroupObject
,
4168 &InfoBuffer
->General
.AdminComment
);
4169 if (!NT_SUCCESS(Status
))
4171 TRACE("Status 0x%08lx\n", Status
);
4175 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
4176 Status
= SampGetObjectAttribute(GroupObject
,
4181 if (!NT_SUCCESS(Status
))
4183 TRACE("Status 0x%08lx\n", Status
);
4187 InfoBuffer
->General
.Attributes
= FixedData
.Attributes
;
4189 Status
= SampGetObjectAttribute(GroupObject
,
4194 if (!NT_SUCCESS(Status
) && Status
!= STATUS_OBJECT_NAME_NOT_FOUND
)
4196 TRACE("Status 0x%08lx\n", Status
);
4200 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
4202 InfoBuffer
->General
.MemberCount
= 0;
4203 Status
= STATUS_SUCCESS
;
4207 InfoBuffer
->General
.MemberCount
= MembersLength
/ sizeof(ULONG
);
4210 *Buffer
= InfoBuffer
;
4213 if (!NT_SUCCESS(Status
))
4215 if (InfoBuffer
!= NULL
)
4217 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
4218 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
4220 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
4221 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
4223 midl_user_free(InfoBuffer
);
4232 SampQueryGroupName(PSAM_DB_OBJECT GroupObject
,
4233 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4235 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
4240 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
4241 if (InfoBuffer
== NULL
)
4242 return STATUS_INSUFFICIENT_RESOURCES
;
4244 Status
= SampGetObjectAttributeString(GroupObject
,
4246 &InfoBuffer
->Name
.Name
);
4247 if (!NT_SUCCESS(Status
))
4249 TRACE("Status 0x%08lx\n", Status
);
4253 *Buffer
= InfoBuffer
;
4256 if (!NT_SUCCESS(Status
))
4258 if (InfoBuffer
!= NULL
)
4260 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
4261 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
4263 midl_user_free(InfoBuffer
);
4272 SampQueryGroupAttribute(PSAM_DB_OBJECT GroupObject
,
4273 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4275 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
4276 SAM_GROUP_FIXED_DATA FixedData
;
4282 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
4283 if (InfoBuffer
== NULL
)
4284 return STATUS_INSUFFICIENT_RESOURCES
;
4286 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
4287 Status
= SampGetObjectAttribute(GroupObject
,
4292 if (!NT_SUCCESS(Status
))
4294 TRACE("Status 0x%08lx\n", Status
);
4298 InfoBuffer
->Attribute
.Attributes
= FixedData
.Attributes
;
4300 *Buffer
= InfoBuffer
;
4303 if (!NT_SUCCESS(Status
))
4305 if (InfoBuffer
!= NULL
)
4307 midl_user_free(InfoBuffer
);
4316 SampQueryGroupAdminComment(PSAM_DB_OBJECT GroupObject
,
4317 PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4319 PSAMPR_GROUP_INFO_BUFFER InfoBuffer
= NULL
;
4324 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_GROUP_INFO_BUFFER
));
4325 if (InfoBuffer
== NULL
)
4326 return STATUS_INSUFFICIENT_RESOURCES
;
4328 Status
= SampGetObjectAttributeString(GroupObject
,
4330 &InfoBuffer
->AdminComment
.AdminComment
);
4331 if (!NT_SUCCESS(Status
))
4333 TRACE("Status 0x%08lx\n", Status
);
4337 *Buffer
= InfoBuffer
;
4340 if (!NT_SUCCESS(Status
))
4342 if (InfoBuffer
!= NULL
)
4344 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
4345 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
4347 midl_user_free(InfoBuffer
);
4358 SamrQueryInformationGroup(IN SAMPR_HANDLE GroupHandle
,
4359 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
4360 OUT PSAMPR_GROUP_INFO_BUFFER
*Buffer
)
4362 PSAM_DB_OBJECT GroupObject
;
4365 TRACE("SamrQueryInformationGroup(%p %lu %p)\n",
4366 GroupHandle
, GroupInformationClass
, Buffer
);
4368 RtlAcquireResourceShared(&SampResource
,
4371 /* Validate the group handle */
4372 Status
= SampValidateDbObject(GroupHandle
,
4374 GROUP_READ_INFORMATION
,
4376 if (!NT_SUCCESS(Status
))
4379 switch (GroupInformationClass
)
4381 case GroupGeneralInformation
:
4382 Status
= SampQueryGroupGeneral(GroupObject
,
4386 case GroupNameInformation
:
4387 Status
= SampQueryGroupName(GroupObject
,
4391 case GroupAttributeInformation
:
4392 Status
= SampQueryGroupAttribute(GroupObject
,
4396 case GroupAdminCommentInformation
:
4397 Status
= SampQueryGroupAdminComment(GroupObject
,
4402 Status
= STATUS_INVALID_INFO_CLASS
;
4407 RtlReleaseResource(&SampResource
);
4414 SampSetGroupName(PSAM_DB_OBJECT GroupObject
,
4415 PSAMPR_GROUP_INFO_BUFFER Buffer
)
4417 UNICODE_STRING OldGroupName
= {0, 0, NULL
};
4418 UNICODE_STRING NewGroupName
;
4421 Status
= SampGetObjectAttributeString(GroupObject
,
4423 (PRPC_UNICODE_STRING
)&OldGroupName
);
4424 if (!NT_SUCCESS(Status
))
4426 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
4430 /* Check the new account name */
4431 Status
= SampCheckAccountName(&Buffer
->Name
.Name
, 256);
4432 if (!NT_SUCCESS(Status
))
4434 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
4438 NewGroupName
.Length
= Buffer
->Name
.Name
.Length
;
4439 NewGroupName
.MaximumLength
= Buffer
->Name
.Name
.MaximumLength
;
4440 NewGroupName
.Buffer
= Buffer
->Name
.Name
.Buffer
;
4442 if (!RtlEqualUnicodeString(&OldGroupName
, &NewGroupName
, TRUE
))
4444 Status
= SampCheckAccountNameInDomain(GroupObject
->ParentObject
,
4445 NewGroupName
.Buffer
);
4446 if (!NT_SUCCESS(Status
))
4448 TRACE("Group name \'%S\' already exists in domain (Status 0x%08lx)\n",
4449 NewGroupName
.Buffer
, Status
);
4454 Status
= SampSetAccountNameInDomain(GroupObject
->ParentObject
,
4456 NewGroupName
.Buffer
,
4457 GroupObject
->RelativeId
);
4458 if (!NT_SUCCESS(Status
))
4460 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
4464 Status
= SampRemoveAccountNameFromDomain(GroupObject
->ParentObject
,
4466 OldGroupName
.Buffer
);
4467 if (!NT_SUCCESS(Status
))
4469 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
4473 Status
= SampSetObjectAttributeString(GroupObject
,
4475 (PRPC_UNICODE_STRING
)&NewGroupName
);
4476 if (!NT_SUCCESS(Status
))
4478 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
4482 if (OldGroupName
.Buffer
!= NULL
)
4483 midl_user_free(OldGroupName
.Buffer
);
4490 SampSetGroupAttribute(PSAM_DB_OBJECT GroupObject
,
4491 PSAMPR_GROUP_INFO_BUFFER Buffer
)
4493 SAM_GROUP_FIXED_DATA FixedData
;
4497 Length
= sizeof(SAM_GROUP_FIXED_DATA
);
4498 Status
= SampGetObjectAttribute(GroupObject
,
4503 if (!NT_SUCCESS(Status
))
4506 FixedData
.Attributes
= Buffer
->Attribute
.Attributes
;
4508 Status
= SampSetObjectAttribute(GroupObject
,
4522 SamrSetInformationGroup(IN SAMPR_HANDLE GroupHandle
,
4523 IN GROUP_INFORMATION_CLASS GroupInformationClass
,
4524 IN PSAMPR_GROUP_INFO_BUFFER Buffer
)
4526 PSAM_DB_OBJECT GroupObject
;
4529 TRACE("SamrSetInformationGroup(%p %lu %p)\n",
4530 GroupHandle
, GroupInformationClass
, Buffer
);
4532 RtlAcquireResourceExclusive(&SampResource
,
4535 /* Validate the group handle */
4536 Status
= SampValidateDbObject(GroupHandle
,
4538 GROUP_WRITE_ACCOUNT
,
4540 if (!NT_SUCCESS(Status
))
4543 switch (GroupInformationClass
)
4545 case GroupNameInformation
:
4546 Status
= SampSetGroupName(GroupObject
,
4550 case GroupAttributeInformation
:
4551 Status
= SampSetGroupAttribute(GroupObject
,
4555 case GroupAdminCommentInformation
:
4556 Status
= SampSetObjectAttributeString(GroupObject
,
4558 &Buffer
->AdminComment
.AdminComment
);
4562 Status
= STATUS_INVALID_INFO_CLASS
;
4567 RtlReleaseResource(&SampResource
);
4576 SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle
,
4577 IN
unsigned long MemberId
,
4578 IN
unsigned long Attributes
)
4580 PSAM_DB_OBJECT GroupObject
;
4581 PSAM_DB_OBJECT UserObject
= NULL
;
4584 TRACE("(%p %lu %lx)\n",
4585 GroupHandle
, MemberId
, Attributes
);
4587 RtlAcquireResourceExclusive(&SampResource
,
4590 /* Validate the group handle */
4591 Status
= SampValidateDbObject(GroupHandle
,
4595 if (!NT_SUCCESS(Status
))
4598 /* Open the user object in the same domain */
4599 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4603 if (!NT_SUCCESS(Status
))
4605 TRACE("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4609 /* Add group membership to the user object */
4610 Status
= SampAddGroupMembershipToUser(UserObject
,
4611 GroupObject
->RelativeId
,
4613 if (!NT_SUCCESS(Status
))
4615 TRACE("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4619 /* Add the member to the group object */
4620 Status
= SampAddMemberToGroup(GroupObject
,
4622 if (!NT_SUCCESS(Status
))
4624 TRACE("SampAddMemberToGroup() failed (Status 0x%08lx)\n", Status
);
4629 SampCloseDbObject(UserObject
);
4631 RtlReleaseResource(&SampResource
);
4640 SamrDeleteGroup(IN OUT SAMPR_HANDLE
*GroupHandle
)
4642 PSAM_DB_OBJECT GroupObject
;
4646 TRACE("(%p)\n", GroupHandle
);
4648 RtlAcquireResourceExclusive(&SampResource
,
4651 /* Validate the group handle */
4652 Status
= SampValidateDbObject(*GroupHandle
,
4656 if (!NT_SUCCESS(Status
))
4658 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
4662 /* Fail, if the group is built-in */
4663 if (GroupObject
->RelativeId
< 1000)
4665 TRACE("You can not delete a special account!\n");
4666 Status
= STATUS_SPECIAL_ACCOUNT
;
4670 /* Get the length of the Members attribute */
4671 SampGetObjectAttribute(GroupObject
,
4677 /* Fail, if the group has members */
4680 TRACE("There are still members in the group!\n");
4681 Status
= STATUS_MEMBER_IN_GROUP
;
4685 /* FIXME: Remove the group from all aliases */
4687 /* Delete the group from the database */
4688 Status
= SampDeleteAccountDbObject(GroupObject
);
4689 if (!NT_SUCCESS(Status
))
4691 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
4695 /* Invalidate the handle */
4696 *GroupHandle
= NULL
;
4699 RtlReleaseResource(&SampResource
);
4708 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle
,
4709 IN
unsigned long MemberId
)
4711 PSAM_DB_OBJECT GroupObject
;
4712 PSAM_DB_OBJECT UserObject
= NULL
;
4716 GroupHandle
, MemberId
);
4718 RtlAcquireResourceExclusive(&SampResource
,
4721 /* Validate the group handle */
4722 Status
= SampValidateDbObject(GroupHandle
,
4724 GROUP_REMOVE_MEMBER
,
4726 if (!NT_SUCCESS(Status
))
4729 /* Open the user object in the same domain */
4730 Status
= SampOpenUserObject(GroupObject
->ParentObject
,
4734 if (!NT_SUCCESS(Status
))
4736 ERR("SampOpenUserObject() failed (Status 0x%08lx)\n", Status
);
4740 /* Remove group membership from the user object */
4741 Status
= SampRemoveGroupMembershipFromUser(UserObject
,
4742 GroupObject
->RelativeId
);
4743 if (!NT_SUCCESS(Status
))
4745 ERR("SampAddGroupMembershipToUser() failed (Status 0x%08lx)\n", Status
);
4749 /* Remove the member from the group object */
4750 Status
= SampRemoveMemberFromGroup(GroupObject
,
4752 if (!NT_SUCCESS(Status
))
4754 ERR("SampRemoveMemberFromGroup() failed (Status 0x%08lx)\n", Status
);
4759 SampCloseDbObject(UserObject
);
4761 RtlReleaseResource(&SampResource
);
4770 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle
,
4771 OUT PSAMPR_GET_MEMBERS_BUFFER
*Members
)
4773 PSAMPR_GET_MEMBERS_BUFFER MembersBuffer
= NULL
;
4774 PSAM_DB_OBJECT GroupObject
;
4779 RtlAcquireResourceShared(&SampResource
,
4782 /* Validate the group handle */
4783 Status
= SampValidateDbObject(GroupHandle
,
4787 if (!NT_SUCCESS(Status
))
4790 MembersBuffer
= midl_user_allocate(sizeof(SAMPR_GET_MEMBERS_BUFFER
));
4791 if (MembersBuffer
== NULL
)
4793 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4797 SampGetObjectAttribute(GroupObject
,
4805 MembersBuffer
->MemberCount
= 0;
4806 MembersBuffer
->Members
= NULL
;
4807 MembersBuffer
->Attributes
= NULL
;
4809 *Members
= MembersBuffer
;
4811 Status
= STATUS_SUCCESS
;
4815 MembersBuffer
->Members
= midl_user_allocate(Length
);
4816 if (MembersBuffer
->Members
== NULL
)
4818 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4822 MembersBuffer
->Attributes
= midl_user_allocate(Length
);
4823 if (MembersBuffer
->Attributes
== NULL
)
4825 Status
= STATUS_INSUFFICIENT_RESOURCES
;
4829 Status
= SampGetObjectAttribute(GroupObject
,
4832 MembersBuffer
->Members
,
4834 if (!NT_SUCCESS(Status
))
4836 TRACE("SampGetObjectAttributes() failed (Status 0x%08lx)\n", Status
);
4840 MembersBuffer
->MemberCount
= Length
/ sizeof(ULONG
);
4842 for (i
= 0; i
< MembersBuffer
->MemberCount
; i
++)
4844 Status
= SampGetUserGroupAttributes(GroupObject
->ParentObject
,
4845 MembersBuffer
->Members
[i
],
4846 GroupObject
->RelativeId
,
4847 &(MembersBuffer
->Attributes
[i
]));
4848 if (!NT_SUCCESS(Status
))
4850 TRACE("SampGetUserGroupAttributes() failed (Status 0x%08lx)\n", Status
);
4855 *Members
= MembersBuffer
;
4858 if (!NT_SUCCESS(Status
))
4860 if (MembersBuffer
!= NULL
)
4862 if (MembersBuffer
->Members
!= NULL
)
4863 midl_user_free(MembersBuffer
->Members
);
4865 if (MembersBuffer
->Attributes
!= NULL
)
4866 midl_user_free(MembersBuffer
->Attributes
);
4868 midl_user_free(MembersBuffer
);
4872 RtlReleaseResource(&SampResource
);
4881 SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle
,
4882 IN
unsigned long MemberId
,
4883 IN
unsigned long Attributes
)
4885 PSAM_DB_OBJECT GroupObject
;
4888 RtlAcquireResourceExclusive(&SampResource
,
4891 /* Validate the group handle */
4892 Status
= SampValidateDbObject(GroupHandle
,
4896 if (!NT_SUCCESS(Status
))
4898 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
4902 Status
= SampSetUserGroupAttributes(GroupObject
->ParentObject
,
4904 GroupObject
->RelativeId
,
4906 if (!NT_SUCCESS(Status
))
4908 TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status
);
4912 RtlReleaseResource(&SampResource
);
4921 SamrOpenAlias(IN SAMPR_HANDLE DomainHandle
,
4922 IN ACCESS_MASK DesiredAccess
,
4924 OUT SAMPR_HANDLE
*AliasHandle
)
4926 PSAM_DB_OBJECT DomainObject
;
4927 PSAM_DB_OBJECT AliasObject
;
4931 TRACE("SamrOpenAlias(%p %lx %lx %p)\n",
4932 DomainHandle
, DesiredAccess
, AliasId
, AliasHandle
);
4934 /* Map generic access rights */
4935 RtlMapGenericMask(&DesiredAccess
,
4938 RtlAcquireResourceShared(&SampResource
,
4941 /* Validate the domain handle */
4942 Status
= SampValidateDbObject(DomainHandle
,
4946 if (!NT_SUCCESS(Status
))
4948 TRACE("failed with status 0x%08lx\n", Status
);
4952 /* Convert the RID into a string (hex) */
4953 swprintf(szRid
, L
"%08lX", AliasId
);
4955 /* Create the alias object */
4956 Status
= SampOpenDbObject(DomainObject
,
4963 if (!NT_SUCCESS(Status
))
4965 TRACE("failed with status 0x%08lx\n", Status
);
4969 *AliasHandle
= (SAMPR_HANDLE
)AliasObject
;
4972 RtlReleaseResource(&SampResource
);
4979 SampQueryAliasGeneral(PSAM_DB_OBJECT AliasObject
,
4980 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
4982 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
4983 HANDLE MembersKeyHandle
= NULL
;
4988 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
4989 if (InfoBuffer
== NULL
)
4990 return STATUS_INSUFFICIENT_RESOURCES
;
4992 Status
= SampGetObjectAttributeString(AliasObject
,
4994 &InfoBuffer
->General
.Name
);
4995 if (!NT_SUCCESS(Status
))
4997 TRACE("Status 0x%08lx\n", Status
);
5001 Status
= SampGetObjectAttributeString(AliasObject
,
5003 &InfoBuffer
->General
.AdminComment
);
5004 if (!NT_SUCCESS(Status
))
5006 TRACE("Status 0x%08lx\n", Status
);
5010 /* Open the Members subkey */
5011 Status
= SampRegOpenKey(AliasObject
->KeyHandle
,
5015 if (NT_SUCCESS(Status
))
5017 /* Retrieve the number of members of the alias */
5018 Status
= SampRegQueryKeyInfo(MembersKeyHandle
,
5020 &InfoBuffer
->General
.MemberCount
);
5021 if (!NT_SUCCESS(Status
))
5023 TRACE("Status 0x%08lx\n", Status
);
5027 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
5029 InfoBuffer
->General
.MemberCount
= 0;
5030 Status
= STATUS_SUCCESS
;
5034 TRACE("Status 0x%08lx\n", Status
);
5038 *Buffer
= InfoBuffer
;
5041 SampRegCloseKey(&MembersKeyHandle
);
5043 if (!NT_SUCCESS(Status
))
5045 if (InfoBuffer
!= NULL
)
5047 if (InfoBuffer
->General
.Name
.Buffer
!= NULL
)
5048 midl_user_free(InfoBuffer
->General
.Name
.Buffer
);
5050 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
5051 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
5053 midl_user_free(InfoBuffer
);
5062 SampQueryAliasName(PSAM_DB_OBJECT AliasObject
,
5063 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
5065 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
5070 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
5071 if (InfoBuffer
== NULL
)
5072 return STATUS_INSUFFICIENT_RESOURCES
;
5074 Status
= SampGetObjectAttributeString(AliasObject
,
5076 &InfoBuffer
->Name
.Name
);
5077 if (!NT_SUCCESS(Status
))
5079 TRACE("Status 0x%08lx\n", Status
);
5083 *Buffer
= InfoBuffer
;
5086 if (!NT_SUCCESS(Status
))
5088 if (InfoBuffer
!= NULL
)
5090 if (InfoBuffer
->Name
.Name
.Buffer
!= NULL
)
5091 midl_user_free(InfoBuffer
->Name
.Name
.Buffer
);
5093 midl_user_free(InfoBuffer
);
5102 SampQueryAliasAdminComment(PSAM_DB_OBJECT AliasObject
,
5103 PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
5105 PSAMPR_ALIAS_INFO_BUFFER InfoBuffer
= NULL
;
5110 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_ALIAS_INFO_BUFFER
));
5111 if (InfoBuffer
== NULL
)
5112 return STATUS_INSUFFICIENT_RESOURCES
;
5114 Status
= SampGetObjectAttributeString(AliasObject
,
5116 &InfoBuffer
->AdminComment
.AdminComment
);
5117 if (!NT_SUCCESS(Status
))
5119 TRACE("Status 0x%08lx\n", Status
);
5123 *Buffer
= InfoBuffer
;
5126 if (!NT_SUCCESS(Status
))
5128 if (InfoBuffer
!= NULL
)
5130 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
5131 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
5133 midl_user_free(InfoBuffer
);
5144 SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle
,
5145 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
5146 OUT PSAMPR_ALIAS_INFO_BUFFER
*Buffer
)
5148 PSAM_DB_OBJECT AliasObject
;
5151 TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
5152 AliasHandle
, AliasInformationClass
, Buffer
);
5154 RtlAcquireResourceShared(&SampResource
,
5157 /* Validate the alias handle */
5158 Status
= SampValidateDbObject(AliasHandle
,
5160 ALIAS_READ_INFORMATION
,
5162 if (!NT_SUCCESS(Status
))
5165 switch (AliasInformationClass
)
5167 case AliasGeneralInformation
:
5168 Status
= SampQueryAliasGeneral(AliasObject
,
5172 case AliasNameInformation
:
5173 Status
= SampQueryAliasName(AliasObject
,
5177 case AliasAdminCommentInformation
:
5178 Status
= SampQueryAliasAdminComment(AliasObject
,
5183 Status
= STATUS_INVALID_INFO_CLASS
;
5188 RtlReleaseResource(&SampResource
);
5195 SampSetAliasName(PSAM_DB_OBJECT AliasObject
,
5196 PSAMPR_ALIAS_INFO_BUFFER Buffer
)
5198 UNICODE_STRING OldAliasName
= {0, 0, NULL
};
5199 UNICODE_STRING NewAliasName
;
5202 Status
= SampGetObjectAttributeString(AliasObject
,
5204 (PRPC_UNICODE_STRING
)&OldAliasName
);
5205 if (!NT_SUCCESS(Status
))
5207 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
5211 /* Check the new account name */
5212 Status
= SampCheckAccountName(&Buffer
->Name
.Name
, 256);
5213 if (!NT_SUCCESS(Status
))
5215 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
5219 NewAliasName
.Length
= Buffer
->Name
.Name
.Length
;
5220 NewAliasName
.MaximumLength
= Buffer
->Name
.Name
.MaximumLength
;
5221 NewAliasName
.Buffer
= Buffer
->Name
.Name
.Buffer
;
5223 if (!RtlEqualUnicodeString(&OldAliasName
, &NewAliasName
, TRUE
))
5225 Status
= SampCheckAccountNameInDomain(AliasObject
->ParentObject
,
5226 NewAliasName
.Buffer
);
5227 if (!NT_SUCCESS(Status
))
5229 TRACE("Alias name \'%S\' already exists in domain (Status 0x%08lx)\n",
5230 NewAliasName
.Buffer
, Status
);
5235 Status
= SampSetAccountNameInDomain(AliasObject
->ParentObject
,
5237 NewAliasName
.Buffer
,
5238 AliasObject
->RelativeId
);
5239 if (!NT_SUCCESS(Status
))
5241 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
5245 Status
= SampRemoveAccountNameFromDomain(AliasObject
->ParentObject
,
5247 OldAliasName
.Buffer
);
5248 if (!NT_SUCCESS(Status
))
5250 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
5254 Status
= SampSetObjectAttributeString(AliasObject
,
5256 (PRPC_UNICODE_STRING
)&NewAliasName
);
5257 if (!NT_SUCCESS(Status
))
5259 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
5263 if (OldAliasName
.Buffer
!= NULL
)
5264 midl_user_free(OldAliasName
.Buffer
);
5273 SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle
,
5274 IN ALIAS_INFORMATION_CLASS AliasInformationClass
,
5275 IN PSAMPR_ALIAS_INFO_BUFFER Buffer
)
5277 PSAM_DB_OBJECT AliasObject
;
5280 TRACE("SamrSetInformationAlias(%p %lu %p)\n",
5281 AliasHandle
, AliasInformationClass
, Buffer
);
5283 RtlAcquireResourceExclusive(&SampResource
,
5286 /* Validate the alias handle */
5287 Status
= SampValidateDbObject(AliasHandle
,
5289 ALIAS_WRITE_ACCOUNT
,
5291 if (!NT_SUCCESS(Status
))
5294 switch (AliasInformationClass
)
5296 case AliasNameInformation
:
5297 Status
= SampSetAliasName(AliasObject
,
5301 case AliasAdminCommentInformation
:
5302 Status
= SampSetObjectAttributeString(AliasObject
,
5304 &Buffer
->AdminComment
.AdminComment
);
5308 Status
= STATUS_INVALID_INFO_CLASS
;
5313 RtlReleaseResource(&SampResource
);
5322 SamrDeleteAlias(IN OUT SAMPR_HANDLE
*AliasHandle
)
5324 PSAM_DB_OBJECT AliasObject
;
5327 RtlAcquireResourceExclusive(&SampResource
,
5330 /* Validate the alias handle */
5331 Status
= SampValidateDbObject(*AliasHandle
,
5335 if (!NT_SUCCESS(Status
))
5337 TRACE("SampValidateDbObject failed (Status 0x%08lx)\n", Status
);
5341 /* Fail, if the alias is built-in */
5342 if (AliasObject
->RelativeId
< 1000)
5344 TRACE("You can not delete a special account!\n");
5345 Status
= STATUS_SPECIAL_ACCOUNT
;
5349 /* Remove all members from the alias */
5350 Status
= SampRemoveAllMembersFromAlias(AliasObject
);
5351 if (!NT_SUCCESS(Status
))
5353 TRACE("SampRemoveAllMembersFromAlias() failed (Status 0x%08lx)\n", Status
);
5357 /* Delete the alias from the database */
5358 Status
= SampDeleteAccountDbObject(AliasObject
);
5359 if (!NT_SUCCESS(Status
))
5361 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5365 /* Invalidate the handle */
5366 *AliasHandle
= NULL
;
5369 RtlReleaseResource(&SampResource
);
5378 SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle
,
5379 IN PRPC_SID MemberId
)
5381 PSAM_DB_OBJECT AliasObject
;
5384 TRACE("(%p %p)\n", AliasHandle
, MemberId
);
5386 RtlAcquireResourceExclusive(&SampResource
,
5389 /* Validate the alias handle */
5390 Status
= SampValidateDbObject(AliasHandle
,
5394 if (!NT_SUCCESS(Status
))
5396 TRACE("failed with status 0x%08lx\n", Status
);
5400 Status
= SampAddMemberToAlias(AliasObject
,
5402 if (!NT_SUCCESS(Status
))
5404 TRACE("failed with status 0x%08lx\n", Status
);
5408 RtlReleaseResource(&SampResource
);
5417 SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle
,
5418 IN PRPC_SID MemberId
)
5420 PSAM_DB_OBJECT AliasObject
;
5423 TRACE("(%p %p)\n", AliasHandle
, MemberId
);
5425 RtlAcquireResourceExclusive(&SampResource
,
5428 /* Validate the alias handle */
5429 Status
= SampValidateDbObject(AliasHandle
,
5431 ALIAS_REMOVE_MEMBER
,
5433 if (!NT_SUCCESS(Status
))
5435 TRACE("failed with status 0x%08lx\n", Status
);
5439 Status
= SampRemoveMemberFromAlias(AliasObject
,
5441 if (!NT_SUCCESS(Status
))
5443 TRACE("failed with status 0x%08lx\n", Status
);
5447 RtlReleaseResource(&SampResource
);
5456 SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle
,
5457 OUT PSAMPR_PSID_ARRAY_OUT Members
)
5459 PSAM_DB_OBJECT AliasObject
;
5460 PSAMPR_SID_INFORMATION MemberArray
= NULL
;
5461 ULONG MemberCount
= 0;
5465 TRACE("SamrGetMembersInAlias(%p %p %p)\n",
5466 AliasHandle
, Members
);
5468 RtlAcquireResourceShared(&SampResource
,
5471 /* Validate the alias handle */
5472 Status
= SampValidateDbObject(AliasHandle
,
5476 if (!NT_SUCCESS(Status
))
5478 ERR("failed with status 0x%08lx\n", Status
);
5482 Status
= SampGetMembersInAlias(AliasObject
,
5486 /* Return the number of members and the member array */
5487 if (NT_SUCCESS(Status
))
5489 Members
->Count
= MemberCount
;
5490 Members
->Sids
= MemberArray
;
5494 /* Clean up the members array and the SID buffers if something failed */
5495 if (!NT_SUCCESS(Status
))
5497 if (MemberArray
!= NULL
)
5499 for (Index
= 0; Index
< MemberCount
; Index
++)
5501 if (MemberArray
[Index
].SidPointer
!= NULL
)
5502 midl_user_free(MemberArray
[Index
].SidPointer
);
5505 midl_user_free(MemberArray
);
5509 RtlReleaseResource(&SampResource
);
5518 SamrOpenUser(IN SAMPR_HANDLE DomainHandle
,
5519 IN ACCESS_MASK DesiredAccess
,
5520 IN
unsigned long UserId
,
5521 OUT SAMPR_HANDLE
*UserHandle
)
5523 PSAM_DB_OBJECT DomainObject
;
5524 PSAM_DB_OBJECT UserObject
;
5528 TRACE("SamrOpenUser(%p %lx %lx %p)\n",
5529 DomainHandle
, DesiredAccess
, UserId
, UserHandle
);
5531 /* Map generic access rights */
5532 RtlMapGenericMask(&DesiredAccess
,
5535 RtlAcquireResourceShared(&SampResource
,
5538 /* Validate the domain handle */
5539 Status
= SampValidateDbObject(DomainHandle
,
5543 if (!NT_SUCCESS(Status
))
5545 TRACE("failed with status 0x%08lx\n", Status
);
5549 /* Convert the RID into a string (hex) */
5550 swprintf(szRid
, L
"%08lX", UserId
);
5552 /* Create the user object */
5553 Status
= SampOpenDbObject(DomainObject
,
5560 if (!NT_SUCCESS(Status
))
5562 TRACE("failed with status 0x%08lx\n", Status
);
5566 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
5569 RtlReleaseResource(&SampResource
);
5578 SamrDeleteUser(IN OUT SAMPR_HANDLE
*UserHandle
)
5580 PSAM_DB_OBJECT UserObject
;
5583 TRACE("(%p)\n", UserHandle
);
5585 RtlAcquireResourceExclusive(&SampResource
,
5588 /* Validate the user handle */
5589 Status
= SampValidateDbObject(*UserHandle
,
5593 if (!NT_SUCCESS(Status
))
5595 TRACE("SampValidateDbObject() failed (Status 0x%08lx)\n", Status
);
5599 /* Fail, if the user is built-in */
5600 if (UserObject
->RelativeId
< 1000)
5602 TRACE("You can not delete a special account!\n");
5603 Status
= STATUS_SPECIAL_ACCOUNT
;
5607 /* Remove the user from all groups */
5608 Status
= SampRemoveUserFromAllGroups(UserObject
);
5609 if (!NT_SUCCESS(Status
))
5611 TRACE("SampRemoveUserFromAllGroups() failed (Status 0x%08lx)\n", Status
);
5615 /* Remove the user from all aliases */
5616 Status
= SampRemoveUserFromAllAliases(UserObject
);
5617 if (!NT_SUCCESS(Status
))
5619 TRACE("SampRemoveUserFromAllAliases() failed (Status 0x%08lx)\n", Status
);
5623 /* Delete the user from the database */
5624 Status
= SampDeleteAccountDbObject(UserObject
);
5625 if (!NT_SUCCESS(Status
))
5627 TRACE("SampDeleteAccountDbObject() failed (Status 0x%08lx)\n", Status
);
5631 /* Invalidate the handle */
5635 RtlReleaseResource(&SampResource
);
5643 SampQueryUserGeneral(PSAM_DB_OBJECT UserObject
,
5644 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5646 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5647 SAM_USER_FIXED_DATA FixedData
;
5653 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5654 if (InfoBuffer
== NULL
)
5655 return STATUS_INSUFFICIENT_RESOURCES
;
5657 Length
= sizeof(SAM_USER_FIXED_DATA
);
5658 Status
= SampGetObjectAttribute(UserObject
,
5663 if (!NT_SUCCESS(Status
))
5666 InfoBuffer
->General
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5668 /* Get the Name string */
5669 Status
= SampGetObjectAttributeString(UserObject
,
5671 &InfoBuffer
->General
.UserName
);
5672 if (!NT_SUCCESS(Status
))
5674 TRACE("Status 0x%08lx\n", Status
);
5678 /* Get the FullName string */
5679 Status
= SampGetObjectAttributeString(UserObject
,
5681 &InfoBuffer
->General
.FullName
);
5682 if (!NT_SUCCESS(Status
))
5684 TRACE("Status 0x%08lx\n", Status
);
5688 /* Get the AdminComment string */
5689 Status
= SampGetObjectAttributeString(UserObject
,
5691 &InfoBuffer
->General
.AdminComment
);
5692 if (!NT_SUCCESS(Status
))
5694 TRACE("Status 0x%08lx\n", Status
);
5698 /* Get the UserComment string */
5699 Status
= SampGetObjectAttributeString(UserObject
,
5701 &InfoBuffer
->General
.UserComment
);
5702 if (!NT_SUCCESS(Status
))
5704 TRACE("Status 0x%08lx\n", Status
);
5708 *Buffer
= InfoBuffer
;
5711 if (!NT_SUCCESS(Status
))
5713 if (InfoBuffer
!= NULL
)
5715 if (InfoBuffer
->General
.UserName
.Buffer
!= NULL
)
5716 midl_user_free(InfoBuffer
->General
.UserName
.Buffer
);
5718 if (InfoBuffer
->General
.FullName
.Buffer
!= NULL
)
5719 midl_user_free(InfoBuffer
->General
.FullName
.Buffer
);
5721 if (InfoBuffer
->General
.AdminComment
.Buffer
!= NULL
)
5722 midl_user_free(InfoBuffer
->General
.AdminComment
.Buffer
);
5724 if (InfoBuffer
->General
.UserComment
.Buffer
!= NULL
)
5725 midl_user_free(InfoBuffer
->General
.UserComment
.Buffer
);
5727 midl_user_free(InfoBuffer
);
5737 SampQueryUserPreferences(PSAM_DB_OBJECT UserObject
,
5738 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5740 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5741 SAM_USER_FIXED_DATA FixedData
;
5747 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5748 if (InfoBuffer
== NULL
)
5749 return STATUS_INSUFFICIENT_RESOURCES
;
5751 Length
= sizeof(SAM_USER_FIXED_DATA
);
5752 Status
= SampGetObjectAttribute(UserObject
,
5757 if (!NT_SUCCESS(Status
))
5760 InfoBuffer
->Preferences
.CountryCode
= FixedData
.CountryCode
;
5761 InfoBuffer
->Preferences
.CodePage
= FixedData
.CodePage
;
5763 /* Get the UserComment string */
5764 Status
= SampGetObjectAttributeString(UserObject
,
5766 &InfoBuffer
->Preferences
.UserComment
);
5767 if (!NT_SUCCESS(Status
))
5769 TRACE("Status 0x%08lx\n", Status
);
5773 *Buffer
= InfoBuffer
;
5776 if (!NT_SUCCESS(Status
))
5778 if (InfoBuffer
!= NULL
)
5780 if (InfoBuffer
->Preferences
.UserComment
.Buffer
!= NULL
)
5781 midl_user_free(InfoBuffer
->Preferences
.UserComment
.Buffer
);
5783 midl_user_free(InfoBuffer
);
5793 SampQueryUserLogon(PSAM_DB_OBJECT UserObject
,
5794 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5796 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5797 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
5798 SAM_USER_FIXED_DATA FixedData
;
5799 LARGE_INTEGER PasswordCanChange
;
5800 LARGE_INTEGER PasswordMustChange
;
5806 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5807 if (InfoBuffer
== NULL
)
5808 return STATUS_INSUFFICIENT_RESOURCES
;
5810 /* Get the fixed size domain data */
5811 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
5812 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
5815 (PVOID
)&DomainFixedData
,
5817 if (!NT_SUCCESS(Status
))
5820 /* Get the fixed size user data */
5821 Length
= sizeof(SAM_USER_FIXED_DATA
);
5822 Status
= SampGetObjectAttribute(UserObject
,
5827 if (!NT_SUCCESS(Status
))
5830 InfoBuffer
->Logon
.UserId
= FixedData
.UserId
;
5831 InfoBuffer
->Logon
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5832 InfoBuffer
->Logon
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5833 InfoBuffer
->Logon
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5834 InfoBuffer
->Logon
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
5835 InfoBuffer
->Logon
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
5836 InfoBuffer
->Logon
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
5837 InfoBuffer
->Logon
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
5838 InfoBuffer
->Logon
.BadPasswordCount
= FixedData
.BadPasswordCount
;
5839 InfoBuffer
->Logon
.LogonCount
= FixedData
.LogonCount
;
5840 InfoBuffer
->Logon
.UserAccountControl
= FixedData
.UserAccountControl
;
5842 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5843 DomainFixedData
.MinPasswordAge
);
5844 InfoBuffer
->Logon
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
5845 InfoBuffer
->Logon
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
5847 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
5848 DomainFixedData
.MaxPasswordAge
);
5849 InfoBuffer
->Logon
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
5850 InfoBuffer
->Logon
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
5852 /* Get the Name string */
5853 Status
= SampGetObjectAttributeString(UserObject
,
5855 &InfoBuffer
->Logon
.UserName
);
5856 if (!NT_SUCCESS(Status
))
5858 TRACE("Status 0x%08lx\n", Status
);
5862 /* Get the FullName string */
5863 Status
= SampGetObjectAttributeString(UserObject
,
5865 &InfoBuffer
->Logon
.FullName
);
5866 if (!NT_SUCCESS(Status
))
5868 TRACE("Status 0x%08lx\n", Status
);
5872 /* Get the HomeDirectory string */
5873 Status
= SampGetObjectAttributeString(UserObject
,
5875 &InfoBuffer
->Logon
.HomeDirectory
);
5876 if (!NT_SUCCESS(Status
))
5878 TRACE("Status 0x%08lx\n", Status
);
5882 /* Get the HomeDirectoryDrive string */
5883 Status
= SampGetObjectAttributeString(UserObject
,
5884 L
"HomeDirectoryDrive",
5885 &InfoBuffer
->Logon
.HomeDirectoryDrive
);
5886 if (!NT_SUCCESS(Status
))
5888 TRACE("Status 0x%08lx\n", Status
);
5892 /* Get the ScriptPath string */
5893 Status
= SampGetObjectAttributeString(UserObject
,
5895 &InfoBuffer
->Logon
.ScriptPath
);
5896 if (!NT_SUCCESS(Status
))
5898 TRACE("Status 0x%08lx\n", Status
);
5902 /* Get the ProfilePath string */
5903 Status
= SampGetObjectAttributeString(UserObject
,
5905 &InfoBuffer
->Logon
.ProfilePath
);
5906 if (!NT_SUCCESS(Status
))
5908 TRACE("Status 0x%08lx\n", Status
);
5912 /* Get the WorkStations string */
5913 Status
= SampGetObjectAttributeString(UserObject
,
5915 &InfoBuffer
->Logon
.WorkStations
);
5916 if (!NT_SUCCESS(Status
))
5918 TRACE("Status 0x%08lx\n", Status
);
5922 /* Get the LogonHours attribute */
5923 Status
= SampGetLogonHoursAttribute(UserObject
,
5924 &InfoBuffer
->Logon
.LogonHours
);
5925 if (!NT_SUCCESS(Status
))
5927 TRACE("Status 0x%08lx\n", Status
);
5931 *Buffer
= InfoBuffer
;
5934 if (!NT_SUCCESS(Status
))
5936 if (InfoBuffer
!= NULL
)
5938 if (InfoBuffer
->Logon
.UserName
.Buffer
!= NULL
)
5939 midl_user_free(InfoBuffer
->Logon
.UserName
.Buffer
);
5941 if (InfoBuffer
->Logon
.FullName
.Buffer
!= NULL
)
5942 midl_user_free(InfoBuffer
->Logon
.FullName
.Buffer
);
5944 if (InfoBuffer
->Logon
.HomeDirectory
.Buffer
!= NULL
)
5945 midl_user_free(InfoBuffer
->Logon
.HomeDirectory
.Buffer
);
5947 if (InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
!= NULL
)
5948 midl_user_free(InfoBuffer
->Logon
.HomeDirectoryDrive
.Buffer
);
5950 if (InfoBuffer
->Logon
.ScriptPath
.Buffer
!= NULL
)
5951 midl_user_free(InfoBuffer
->Logon
.ScriptPath
.Buffer
);
5953 if (InfoBuffer
->Logon
.ProfilePath
.Buffer
!= NULL
)
5954 midl_user_free(InfoBuffer
->Logon
.ProfilePath
.Buffer
);
5956 if (InfoBuffer
->Logon
.WorkStations
.Buffer
!= NULL
)
5957 midl_user_free(InfoBuffer
->Logon
.WorkStations
.Buffer
);
5959 if (InfoBuffer
->Logon
.LogonHours
.LogonHours
!= NULL
)
5960 midl_user_free(InfoBuffer
->Logon
.LogonHours
.LogonHours
);
5962 midl_user_free(InfoBuffer
);
5972 SampQueryUserAccount(PSAM_DB_OBJECT UserObject
,
5973 PSAMPR_USER_INFO_BUFFER
*Buffer
)
5975 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
5976 SAM_USER_FIXED_DATA FixedData
;
5982 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
5983 if (InfoBuffer
== NULL
)
5984 return STATUS_INSUFFICIENT_RESOURCES
;
5986 Length
= sizeof(SAM_USER_FIXED_DATA
);
5987 Status
= SampGetObjectAttribute(UserObject
,
5992 if (!NT_SUCCESS(Status
))
5995 InfoBuffer
->Account
.UserId
= FixedData
.UserId
;
5996 InfoBuffer
->Account
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
5997 InfoBuffer
->Account
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
5998 InfoBuffer
->Account
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
5999 InfoBuffer
->Account
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
6000 InfoBuffer
->Account
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
6001 InfoBuffer
->Account
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
6002 InfoBuffer
->Account
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
6003 InfoBuffer
->Account
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6004 InfoBuffer
->Account
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6005 InfoBuffer
->Account
.BadPasswordCount
= FixedData
.BadPasswordCount
;
6006 InfoBuffer
->Account
.LogonCount
= FixedData
.LogonCount
;
6007 InfoBuffer
->Account
.UserAccountControl
= FixedData
.UserAccountControl
;
6009 /* Get the Name string */
6010 Status
= SampGetObjectAttributeString(UserObject
,
6012 &InfoBuffer
->Account
.UserName
);
6013 if (!NT_SUCCESS(Status
))
6015 TRACE("Status 0x%08lx\n", Status
);
6019 /* Get the FullName string */
6020 Status
= SampGetObjectAttributeString(UserObject
,
6022 &InfoBuffer
->Account
.FullName
);
6023 if (!NT_SUCCESS(Status
))
6025 TRACE("Status 0x%08lx\n", Status
);
6029 /* Get the HomeDirectory string */
6030 Status
= SampGetObjectAttributeString(UserObject
,
6032 &InfoBuffer
->Account
.HomeDirectory
);
6033 if (!NT_SUCCESS(Status
))
6035 TRACE("Status 0x%08lx\n", Status
);
6039 /* Get the HomeDirectoryDrive string */
6040 Status
= SampGetObjectAttributeString(UserObject
,
6041 L
"HomeDirectoryDrive",
6042 &InfoBuffer
->Account
.HomeDirectoryDrive
);
6043 if (!NT_SUCCESS(Status
))
6045 TRACE("Status 0x%08lx\n", Status
);
6049 /* Get the ScriptPath string */
6050 Status
= SampGetObjectAttributeString(UserObject
,
6052 &InfoBuffer
->Account
.ScriptPath
);
6053 if (!NT_SUCCESS(Status
))
6055 TRACE("Status 0x%08lx\n", Status
);
6059 /* Get the ProfilePath string */
6060 Status
= SampGetObjectAttributeString(UserObject
,
6062 &InfoBuffer
->Account
.ProfilePath
);
6063 if (!NT_SUCCESS(Status
))
6065 TRACE("Status 0x%08lx\n", Status
);
6069 /* Get the AdminComment string */
6070 Status
= SampGetObjectAttributeString(UserObject
,
6072 &InfoBuffer
->Account
.AdminComment
);
6073 if (!NT_SUCCESS(Status
))
6075 TRACE("Status 0x%08lx\n", Status
);
6079 /* Get the WorkStations string */
6080 Status
= SampGetObjectAttributeString(UserObject
,
6082 &InfoBuffer
->Account
.WorkStations
);
6083 if (!NT_SUCCESS(Status
))
6085 TRACE("Status 0x%08lx\n", Status
);
6089 /* Get the LogonHours attribute */
6090 Status
= SampGetLogonHoursAttribute(UserObject
,
6091 &InfoBuffer
->Account
.LogonHours
);
6092 if (!NT_SUCCESS(Status
))
6094 TRACE("Status 0x%08lx\n", Status
);
6098 *Buffer
= InfoBuffer
;
6101 if (!NT_SUCCESS(Status
))
6103 if (InfoBuffer
!= NULL
)
6105 if (InfoBuffer
->Account
.UserName
.Buffer
!= NULL
)
6106 midl_user_free(InfoBuffer
->Account
.UserName
.Buffer
);
6108 if (InfoBuffer
->Account
.FullName
.Buffer
!= NULL
)
6109 midl_user_free(InfoBuffer
->Account
.FullName
.Buffer
);
6111 if (InfoBuffer
->Account
.HomeDirectory
.Buffer
!= NULL
)
6112 midl_user_free(InfoBuffer
->Account
.HomeDirectory
.Buffer
);
6114 if (InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
!= NULL
)
6115 midl_user_free(InfoBuffer
->Account
.HomeDirectoryDrive
.Buffer
);
6117 if (InfoBuffer
->Account
.ScriptPath
.Buffer
!= NULL
)
6118 midl_user_free(InfoBuffer
->Account
.ScriptPath
.Buffer
);
6120 if (InfoBuffer
->Account
.ProfilePath
.Buffer
!= NULL
)
6121 midl_user_free(InfoBuffer
->Account
.ProfilePath
.Buffer
);
6123 if (InfoBuffer
->Account
.AdminComment
.Buffer
!= NULL
)
6124 midl_user_free(InfoBuffer
->Account
.AdminComment
.Buffer
);
6126 if (InfoBuffer
->Account
.WorkStations
.Buffer
!= NULL
)
6127 midl_user_free(InfoBuffer
->Account
.WorkStations
.Buffer
);
6129 if (InfoBuffer
->Account
.LogonHours
.LogonHours
!= NULL
)
6130 midl_user_free(InfoBuffer
->Account
.LogonHours
.LogonHours
);
6132 midl_user_free(InfoBuffer
);
6142 SampQueryUserLogonHours(PSAM_DB_OBJECT UserObject
,
6143 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6145 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6148 TRACE("(%p %p)\n", UserObject
, Buffer
);
6152 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6153 if (InfoBuffer
== NULL
)
6155 TRACE("Failed to allocate InfoBuffer!\n");
6156 return STATUS_INSUFFICIENT_RESOURCES
;
6159 Status
= SampGetLogonHoursAttribute(UserObject
,
6160 &InfoBuffer
->LogonHours
.LogonHours
);
6161 if (!NT_SUCCESS(Status
))
6163 TRACE("SampGetLogonHoursAttribute failed (Status 0x%08lx)\n", Status
);
6167 *Buffer
= InfoBuffer
;
6170 if (!NT_SUCCESS(Status
))
6172 if (InfoBuffer
!= NULL
)
6174 if (InfoBuffer
->LogonHours
.LogonHours
.LogonHours
!= NULL
)
6175 midl_user_free(InfoBuffer
->LogonHours
.LogonHours
.LogonHours
);
6177 midl_user_free(InfoBuffer
);
6187 SampQueryUserName(PSAM_DB_OBJECT UserObject
,
6188 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6190 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6195 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6196 if (InfoBuffer
== NULL
)
6197 return STATUS_INSUFFICIENT_RESOURCES
;
6199 /* Get the Name string */
6200 Status
= SampGetObjectAttributeString(UserObject
,
6202 &InfoBuffer
->Name
.UserName
);
6203 if (!NT_SUCCESS(Status
))
6205 TRACE("Status 0x%08lx\n", Status
);
6209 /* Get the FullName string */
6210 Status
= SampGetObjectAttributeString(UserObject
,
6212 &InfoBuffer
->Name
.FullName
);
6213 if (!NT_SUCCESS(Status
))
6215 TRACE("Status 0x%08lx\n", Status
);
6219 *Buffer
= InfoBuffer
;
6222 if (!NT_SUCCESS(Status
))
6224 if (InfoBuffer
!= NULL
)
6226 if (InfoBuffer
->Name
.UserName
.Buffer
!= NULL
)
6227 midl_user_free(InfoBuffer
->Name
.UserName
.Buffer
);
6229 if (InfoBuffer
->Name
.FullName
.Buffer
!= NULL
)
6230 midl_user_free(InfoBuffer
->Name
.FullName
.Buffer
);
6232 midl_user_free(InfoBuffer
);
6241 SampQueryUserAccountName(PSAM_DB_OBJECT UserObject
,
6242 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6244 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6249 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6250 if (InfoBuffer
== NULL
)
6251 return STATUS_INSUFFICIENT_RESOURCES
;
6253 /* Get the Name string */
6254 Status
= SampGetObjectAttributeString(UserObject
,
6256 &InfoBuffer
->AccountName
.UserName
);
6257 if (!NT_SUCCESS(Status
))
6259 TRACE("Status 0x%08lx\n", Status
);
6263 *Buffer
= InfoBuffer
;
6266 if (!NT_SUCCESS(Status
))
6268 if (InfoBuffer
!= NULL
)
6270 if (InfoBuffer
->AccountName
.UserName
.Buffer
!= NULL
)
6271 midl_user_free(InfoBuffer
->AccountName
.UserName
.Buffer
);
6273 midl_user_free(InfoBuffer
);
6282 SampQueryUserFullName(PSAM_DB_OBJECT UserObject
,
6283 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6285 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6290 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6291 if (InfoBuffer
== NULL
)
6292 return STATUS_INSUFFICIENT_RESOURCES
;
6294 /* Get the FullName string */
6295 Status
= SampGetObjectAttributeString(UserObject
,
6297 &InfoBuffer
->FullName
.FullName
);
6298 if (!NT_SUCCESS(Status
))
6300 TRACE("Status 0x%08lx\n", Status
);
6304 *Buffer
= InfoBuffer
;
6307 if (!NT_SUCCESS(Status
))
6309 if (InfoBuffer
!= NULL
)
6311 if (InfoBuffer
->FullName
.FullName
.Buffer
!= NULL
)
6312 midl_user_free(InfoBuffer
->FullName
.FullName
.Buffer
);
6314 midl_user_free(InfoBuffer
);
6324 SampQueryUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
6325 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6327 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6328 SAM_USER_FIXED_DATA FixedData
;
6334 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6335 if (InfoBuffer
== NULL
)
6336 return STATUS_INSUFFICIENT_RESOURCES
;
6338 Length
= sizeof(SAM_USER_FIXED_DATA
);
6339 Status
= SampGetObjectAttribute(UserObject
,
6344 if (!NT_SUCCESS(Status
))
6347 InfoBuffer
->PrimaryGroup
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
6349 *Buffer
= InfoBuffer
;
6352 if (!NT_SUCCESS(Status
))
6354 if (InfoBuffer
!= NULL
)
6356 midl_user_free(InfoBuffer
);
6365 SampQueryUserHome(PSAM_DB_OBJECT UserObject
,
6366 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6368 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6373 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6374 if (InfoBuffer
== NULL
)
6375 return STATUS_INSUFFICIENT_RESOURCES
;
6377 /* Get the HomeDirectory string */
6378 Status
= SampGetObjectAttributeString(UserObject
,
6380 &InfoBuffer
->Home
.HomeDirectory
);
6381 if (!NT_SUCCESS(Status
))
6383 TRACE("Status 0x%08lx\n", Status
);
6387 /* Get the HomeDirectoryDrive string */
6388 Status
= SampGetObjectAttributeString(UserObject
,
6389 L
"HomeDirectoryDrive",
6390 &InfoBuffer
->Home
.HomeDirectoryDrive
);
6391 if (!NT_SUCCESS(Status
))
6393 TRACE("Status 0x%08lx\n", Status
);
6397 *Buffer
= InfoBuffer
;
6400 if (!NT_SUCCESS(Status
))
6402 if (InfoBuffer
!= NULL
)
6404 if (InfoBuffer
->Home
.HomeDirectory
.Buffer
!= NULL
)
6405 midl_user_free(InfoBuffer
->Home
.HomeDirectory
.Buffer
);
6407 if (InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
!= NULL
)
6408 midl_user_free(InfoBuffer
->Home
.HomeDirectoryDrive
.Buffer
);
6410 midl_user_free(InfoBuffer
);
6419 SampQueryUserScript(PSAM_DB_OBJECT UserObject
,
6420 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6422 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6427 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6428 if (InfoBuffer
== NULL
)
6429 return STATUS_INSUFFICIENT_RESOURCES
;
6431 /* Get the ScriptPath string */
6432 Status
= SampGetObjectAttributeString(UserObject
,
6434 &InfoBuffer
->Script
.ScriptPath
);
6435 if (!NT_SUCCESS(Status
))
6437 TRACE("Status 0x%08lx\n", Status
);
6441 *Buffer
= InfoBuffer
;
6444 if (!NT_SUCCESS(Status
))
6446 if (InfoBuffer
!= NULL
)
6448 if (InfoBuffer
->Script
.ScriptPath
.Buffer
!= NULL
)
6449 midl_user_free(InfoBuffer
->Script
.ScriptPath
.Buffer
);
6451 midl_user_free(InfoBuffer
);
6460 SampQueryUserProfile(PSAM_DB_OBJECT UserObject
,
6461 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6463 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6468 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6469 if (InfoBuffer
== NULL
)
6470 return STATUS_INSUFFICIENT_RESOURCES
;
6472 /* Get the ProfilePath string */
6473 Status
= SampGetObjectAttributeString(UserObject
,
6475 &InfoBuffer
->Profile
.ProfilePath
);
6476 if (!NT_SUCCESS(Status
))
6478 TRACE("Status 0x%08lx\n", Status
);
6482 *Buffer
= InfoBuffer
;
6485 if (!NT_SUCCESS(Status
))
6487 if (InfoBuffer
!= NULL
)
6489 if (InfoBuffer
->Profile
.ProfilePath
.Buffer
!= NULL
)
6490 midl_user_free(InfoBuffer
->Profile
.ProfilePath
.Buffer
);
6492 midl_user_free(InfoBuffer
);
6501 SampQueryUserAdminComment(PSAM_DB_OBJECT UserObject
,
6502 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6504 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6509 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6510 if (InfoBuffer
== NULL
)
6511 return STATUS_INSUFFICIENT_RESOURCES
;
6513 /* Get the AdminComment string */
6514 Status
= SampGetObjectAttributeString(UserObject
,
6516 &InfoBuffer
->AdminComment
.AdminComment
);
6517 if (!NT_SUCCESS(Status
))
6519 TRACE("Status 0x%08lx\n", Status
);
6523 *Buffer
= InfoBuffer
;
6526 if (!NT_SUCCESS(Status
))
6528 if (InfoBuffer
!= NULL
)
6530 if (InfoBuffer
->AdminComment
.AdminComment
.Buffer
!= NULL
)
6531 midl_user_free(InfoBuffer
->AdminComment
.AdminComment
.Buffer
);
6533 midl_user_free(InfoBuffer
);
6542 SampQueryUserWorkStations(PSAM_DB_OBJECT UserObject
,
6543 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6545 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6550 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6551 if (InfoBuffer
== NULL
)
6552 return STATUS_INSUFFICIENT_RESOURCES
;
6554 /* Get the WorkStations string */
6555 Status
= SampGetObjectAttributeString(UserObject
,
6557 &InfoBuffer
->WorkStations
.WorkStations
);
6558 if (!NT_SUCCESS(Status
))
6560 TRACE("Status 0x%08lx\n", Status
);
6564 *Buffer
= InfoBuffer
;
6567 if (!NT_SUCCESS(Status
))
6569 if (InfoBuffer
!= NULL
)
6571 if (InfoBuffer
->WorkStations
.WorkStations
.Buffer
!= NULL
)
6572 midl_user_free(InfoBuffer
->WorkStations
.WorkStations
.Buffer
);
6574 midl_user_free(InfoBuffer
);
6584 SampQueryUserControl(PSAM_DB_OBJECT UserObject
,
6585 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6587 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6588 SAM_USER_FIXED_DATA FixedData
;
6594 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6595 if (InfoBuffer
== NULL
)
6596 return STATUS_INSUFFICIENT_RESOURCES
;
6598 Length
= sizeof(SAM_USER_FIXED_DATA
);
6599 Status
= SampGetObjectAttribute(UserObject
,
6604 if (!NT_SUCCESS(Status
))
6607 InfoBuffer
->Control
.UserAccountControl
= FixedData
.UserAccountControl
;
6609 *Buffer
= InfoBuffer
;
6612 if (!NT_SUCCESS(Status
))
6614 if (InfoBuffer
!= NULL
)
6616 midl_user_free(InfoBuffer
);
6626 SampQueryUserExpires(PSAM_DB_OBJECT UserObject
,
6627 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6629 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6630 SAM_USER_FIXED_DATA FixedData
;
6636 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6637 if (InfoBuffer
== NULL
)
6638 return STATUS_INSUFFICIENT_RESOURCES
;
6640 Length
= sizeof(SAM_USER_FIXED_DATA
);
6641 Status
= SampGetObjectAttribute(UserObject
,
6646 if (!NT_SUCCESS(Status
))
6649 InfoBuffer
->Expires
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
6650 InfoBuffer
->Expires
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
6652 *Buffer
= InfoBuffer
;
6655 if (!NT_SUCCESS(Status
))
6657 if (InfoBuffer
!= NULL
)
6659 midl_user_free(InfoBuffer
);
6669 SampQueryUserInternal1(PSAM_DB_OBJECT UserObject
,
6670 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6672 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6674 NTSTATUS Status
= STATUS_SUCCESS
;
6676 /* Fail, if the caller is not a trusted caller */
6677 if (UserObject
->Trusted
== FALSE
)
6678 return STATUS_INVALID_INFO_CLASS
;
6682 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6683 if (InfoBuffer
== NULL
)
6684 return STATUS_INSUFFICIENT_RESOURCES
;
6686 InfoBuffer
->Internal1
.LmPasswordPresent
= FALSE
;
6687 InfoBuffer
->Internal1
.NtPasswordPresent
= FALSE
;
6689 /* Get the NT password */
6691 SampGetObjectAttribute(UserObject
,
6697 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
6699 Status
= SampGetObjectAttribute(UserObject
,
6702 (PVOID
)&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6704 if (!NT_SUCCESS(Status
))
6707 if (memcmp(&InfoBuffer
->Internal1
.EncryptedNtOwfPassword
,
6709 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
6710 InfoBuffer
->Internal1
.NtPasswordPresent
= TRUE
;
6714 /* Get the LM password */
6716 SampGetObjectAttribute(UserObject
,
6722 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
6724 Status
= SampGetObjectAttribute(UserObject
,
6727 (PVOID
)&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6729 if (!NT_SUCCESS(Status
))
6732 if (memcmp(&InfoBuffer
->Internal1
.EncryptedLmOwfPassword
,
6734 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
6735 InfoBuffer
->Internal1
.LmPasswordPresent
= TRUE
;
6738 InfoBuffer
->Internal1
.PasswordExpired
= FALSE
;
6740 *Buffer
= InfoBuffer
;
6743 if (!NT_SUCCESS(Status
))
6745 if (InfoBuffer
!= NULL
)
6747 midl_user_free(InfoBuffer
);
6757 SampQueryUserInternal2(PSAM_DB_OBJECT UserObject
,
6758 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6760 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6761 SAM_USER_FIXED_DATA FixedData
;
6767 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6768 if (InfoBuffer
== NULL
)
6769 return STATUS_INSUFFICIENT_RESOURCES
;
6771 Length
= sizeof(SAM_USER_FIXED_DATA
);
6772 Status
= SampGetObjectAttribute(UserObject
,
6777 if (!NT_SUCCESS(Status
))
6780 InfoBuffer
->Internal2
.Flags
= 0;
6781 InfoBuffer
->Internal2
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
6782 InfoBuffer
->Internal2
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
6783 InfoBuffer
->Internal2
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
6784 InfoBuffer
->Internal2
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
6785 InfoBuffer
->Internal2
.BadPasswordCount
= FixedData
.BadPasswordCount
;
6786 InfoBuffer
->Internal2
.LogonCount
= FixedData
.LogonCount
;
6788 *Buffer
= InfoBuffer
;
6791 if (!NT_SUCCESS(Status
))
6793 if (InfoBuffer
!= NULL
)
6795 midl_user_free(InfoBuffer
);
6804 SampQueryUserParameters(PSAM_DB_OBJECT UserObject
,
6805 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6807 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6812 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6813 if (InfoBuffer
== NULL
)
6814 return STATUS_INSUFFICIENT_RESOURCES
;
6816 /* Get the Parameters string */
6817 Status
= SampGetObjectAttributeString(UserObject
,
6819 &InfoBuffer
->Parameters
.Parameters
);
6820 if (!NT_SUCCESS(Status
))
6822 TRACE("Status 0x%08lx\n", Status
);
6826 *Buffer
= InfoBuffer
;
6829 if (!NT_SUCCESS(Status
))
6831 if (InfoBuffer
!= NULL
)
6833 if (InfoBuffer
->Parameters
.Parameters
.Buffer
!= NULL
)
6834 midl_user_free(InfoBuffer
->Parameters
.Parameters
.Buffer
);
6836 midl_user_free(InfoBuffer
);
6845 SampQueryUserAll(PSAM_DB_OBJECT UserObject
,
6846 PSAMPR_USER_INFO_BUFFER
*Buffer
)
6848 PSAMPR_USER_INFO_BUFFER InfoBuffer
= NULL
;
6849 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
6850 SAM_USER_FIXED_DATA FixedData
;
6851 LARGE_INTEGER PasswordCanChange
;
6852 LARGE_INTEGER PasswordMustChange
;
6858 InfoBuffer
= midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER
));
6859 if (InfoBuffer
== NULL
)
6860 return STATUS_INSUFFICIENT_RESOURCES
;
6862 /* Get the fixed size domain data */
6863 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
6864 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
6867 (PVOID
)&DomainFixedData
,
6869 if (!NT_SUCCESS(Status
))
6872 /* Get the fixed size user data */
6873 Length
= sizeof(SAM_USER_FIXED_DATA
);
6874 Status
= SampGetObjectAttribute(UserObject
,
6879 if (!NT_SUCCESS(Status
))
6882 /* Set the fields to be returned */
6883 if (UserObject
->Trusted
)
6885 InfoBuffer
->All
.WhichFields
= USER_ALL_READ_GENERAL_MASK
|
6886 USER_ALL_READ_LOGON_MASK
|
6887 USER_ALL_READ_ACCOUNT_MASK
|
6888 USER_ALL_READ_PREFERENCES_MASK
|
6889 USER_ALL_READ_TRUSTED_MASK
;
6893 InfoBuffer
->All
.WhichFields
= 0;
6895 if (UserObject
->Access
& USER_READ_GENERAL
)
6896 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_GENERAL_MASK
;
6898 if (UserObject
->Access
& USER_READ_LOGON
)
6899 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_LOGON_MASK
;
6901 if (UserObject
->Access
& USER_READ_ACCOUNT
)
6902 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_ACCOUNT_MASK
;
6904 if (UserObject
->Access
& USER_READ_PREFERENCES
)
6905 InfoBuffer
->All
.WhichFields
|= USER_ALL_READ_PREFERENCES_MASK
;
6908 /* Fail, if no fields are to be returned */
6909 if (InfoBuffer
->All
.WhichFields
== 0)
6911 Status
= STATUS_ACCESS_DENIED
;
6915 /* Get the UserName attribute */
6916 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERNAME
)
6918 Status
= SampGetObjectAttributeString(UserObject
,
6920 &InfoBuffer
->All
.UserName
);
6921 if (!NT_SUCCESS(Status
))
6923 TRACE("Status 0x%08lx\n", Status
);
6928 /* Get the FullName attribute */
6929 if (InfoBuffer
->All
.WhichFields
& USER_ALL_FULLNAME
)
6931 Status
= SampGetObjectAttributeString(UserObject
,
6933 &InfoBuffer
->All
.FullName
);
6934 if (!NT_SUCCESS(Status
))
6936 TRACE("Status 0x%08lx\n", Status
);
6941 /* Get the UserId attribute */
6942 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERID
)
6944 InfoBuffer
->All
.UserId
= FixedData
.UserId
;
6947 /* Get the PrimaryGroupId attribute */
6948 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PRIMARYGROUPID
)
6950 InfoBuffer
->All
.PrimaryGroupId
= FixedData
.PrimaryGroupId
;
6953 /* Get the AdminComment attribute */
6954 if (InfoBuffer
->All
.WhichFields
& USER_ALL_ADMINCOMMENT
)
6956 Status
= SampGetObjectAttributeString(UserObject
,
6958 &InfoBuffer
->All
.AdminComment
);
6959 if (!NT_SUCCESS(Status
))
6961 TRACE("Status 0x%08lx\n", Status
);
6966 /* Get the UserComment attribute */
6967 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERCOMMENT
)
6969 Status
= SampGetObjectAttributeString(UserObject
,
6971 &InfoBuffer
->All
.UserComment
);
6972 if (!NT_SUCCESS(Status
))
6974 TRACE("Status 0x%08lx\n", Status
);
6979 /* Get the HomeDirectory attribute */
6980 if (InfoBuffer
->All
.WhichFields
& USER_ALL_HOMEDIRECTORY
)
6982 Status
= SampGetObjectAttributeString(UserObject
,
6984 &InfoBuffer
->All
.HomeDirectory
);
6985 if (!NT_SUCCESS(Status
))
6987 TRACE("Status 0x%08lx\n", Status
);
6992 /* Get the HomeDirectoryDrive attribute */
6993 if (InfoBuffer
->All
.WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
6995 Status
= SampGetObjectAttributeString(UserObject
,
6996 L
"HomeDirectoryDrive",
6997 &InfoBuffer
->Home
.HomeDirectoryDrive
);
6998 if (!NT_SUCCESS(Status
))
7000 TRACE("Status 0x%08lx\n", Status
);
7005 /* Get the ScriptPath attribute */
7006 if (InfoBuffer
->All
.WhichFields
& USER_ALL_SCRIPTPATH
)
7008 Status
= SampGetObjectAttributeString(UserObject
,
7010 &InfoBuffer
->All
.ScriptPath
);
7011 if (!NT_SUCCESS(Status
))
7013 TRACE("Status 0x%08lx\n", Status
);
7018 /* Get the ProfilePath attribute */
7019 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PROFILEPATH
)
7021 Status
= SampGetObjectAttributeString(UserObject
,
7023 &InfoBuffer
->All
.ProfilePath
);
7024 if (!NT_SUCCESS(Status
))
7026 TRACE("Status 0x%08lx\n", Status
);
7031 /* Get the WorkStations attribute */
7032 if (InfoBuffer
->All
.WhichFields
& USER_ALL_WORKSTATIONS
)
7034 Status
= SampGetObjectAttributeString(UserObject
,
7036 &InfoBuffer
->All
.WorkStations
);
7037 if (!NT_SUCCESS(Status
))
7039 TRACE("Status 0x%08lx\n", Status
);
7044 /* Get the LastLogon attribute */
7045 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LASTLOGON
)
7047 InfoBuffer
->All
.LastLogon
.LowPart
= FixedData
.LastLogon
.LowPart
;
7048 InfoBuffer
->All
.LastLogon
.HighPart
= FixedData
.LastLogon
.HighPart
;
7051 /* Get the LastLogoff attribute */
7052 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LASTLOGOFF
)
7054 InfoBuffer
->All
.LastLogoff
.LowPart
= FixedData
.LastLogoff
.LowPart
;
7055 InfoBuffer
->All
.LastLogoff
.HighPart
= FixedData
.LastLogoff
.HighPart
;
7058 /* Get the LogonHours attribute */
7059 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LOGONHOURS
)
7061 Status
= SampGetLogonHoursAttribute(UserObject
,
7062 &InfoBuffer
->All
.LogonHours
);
7063 if (!NT_SUCCESS(Status
))
7065 TRACE("Status 0x%08lx\n", Status
);
7070 /* Get the BadPasswordCount attribute */
7071 if (InfoBuffer
->All
.WhichFields
& USER_ALL_BADPASSWORDCOUNT
)
7073 InfoBuffer
->All
.BadPasswordCount
= FixedData
.BadPasswordCount
;
7076 /* Get the LogonCount attribute */
7077 if (InfoBuffer
->All
.WhichFields
& USER_ALL_LOGONCOUNT
)
7079 InfoBuffer
->All
.LogonCount
= FixedData
.LogonCount
;
7082 /* Get the PasswordCanChange attribute */
7083 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDCANCHANGE
)
7085 PasswordCanChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
7086 DomainFixedData
.MinPasswordAge
);
7087 InfoBuffer
->All
.PasswordCanChange
.LowPart
= PasswordCanChange
.LowPart
;
7088 InfoBuffer
->All
.PasswordCanChange
.HighPart
= PasswordCanChange
.HighPart
;
7091 /* Get the PasswordMustChange attribute */
7092 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDMUSTCHANGE
)
7094 PasswordMustChange
= SampAddRelativeTimeToTime(FixedData
.PasswordLastSet
,
7095 DomainFixedData
.MaxPasswordAge
);
7096 InfoBuffer
->All
.PasswordMustChange
.LowPart
= PasswordMustChange
.LowPart
;
7097 InfoBuffer
->All
.PasswordMustChange
.HighPart
= PasswordMustChange
.HighPart
;
7100 /* Get the PasswordLastSet attribute */
7101 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDLASTSET
)
7103 InfoBuffer
->All
.PasswordLastSet
.LowPart
= FixedData
.PasswordLastSet
.LowPart
;
7104 InfoBuffer
->All
.PasswordLastSet
.HighPart
= FixedData
.PasswordLastSet
.HighPart
;
7107 /* Get the AccountExpires attribute */
7108 if (InfoBuffer
->All
.WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
7110 InfoBuffer
->All
.AccountExpires
.LowPart
= FixedData
.AccountExpires
.LowPart
;
7111 InfoBuffer
->All
.AccountExpires
.HighPart
= FixedData
.AccountExpires
.HighPart
;
7114 /* Get the UserAccountControl attribute */
7115 if (InfoBuffer
->All
.WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
7117 InfoBuffer
->All
.UserAccountControl
= FixedData
.UserAccountControl
;
7120 /* Get the Parameters attribute */
7121 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PARAMETERS
)
7123 Status
= SampGetObjectAttributeString(UserObject
,
7125 &InfoBuffer
->All
.Parameters
);
7126 if (!NT_SUCCESS(Status
))
7128 TRACE("Status 0x%08lx\n", Status
);
7133 /* Get the CountryCode attribute */
7134 if (InfoBuffer
->All
.WhichFields
& USER_ALL_COUNTRYCODE
)
7136 InfoBuffer
->All
.CountryCode
= FixedData
.CountryCode
;
7139 /* Get the CodePage attribute */
7140 if (InfoBuffer
->All
.WhichFields
& USER_ALL_CODEPAGE
)
7142 InfoBuffer
->All
.CodePage
= FixedData
.CodePage
;
7145 /* Get the LmPassword and NtPassword attributes */
7146 if (InfoBuffer
->All
.WhichFields
& (USER_ALL_NTPASSWORDPRESENT
| USER_ALL_LMPASSWORDPRESENT
))
7148 InfoBuffer
->All
.LmPasswordPresent
= FALSE
;
7149 InfoBuffer
->All
.NtPasswordPresent
= FALSE
;
7151 /* Get the NT password */
7153 SampGetObjectAttribute(UserObject
,
7159 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
7161 InfoBuffer
->All
.NtOwfPassword
.Buffer
= midl_user_allocate(sizeof(ENCRYPTED_NT_OWF_PASSWORD
));
7162 if (InfoBuffer
->All
.NtOwfPassword
.Buffer
== NULL
)
7164 Status
= STATUS_INSUFFICIENT_RESOURCES
;
7168 InfoBuffer
->All
.NtOwfPassword
.Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
7169 InfoBuffer
->All
.NtOwfPassword
.MaximumLength
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
7171 Status
= SampGetObjectAttribute(UserObject
,
7174 (PVOID
)InfoBuffer
->All
.NtOwfPassword
.Buffer
,
7176 if (!NT_SUCCESS(Status
))
7179 if (memcmp(InfoBuffer
->All
.NtOwfPassword
.Buffer
,
7181 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
7182 InfoBuffer
->All
.NtPasswordPresent
= TRUE
;
7185 /* Get the LM password */
7187 SampGetObjectAttribute(UserObject
,
7193 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
7195 InfoBuffer
->All
.LmOwfPassword
.Buffer
= midl_user_allocate(sizeof(ENCRYPTED_LM_OWF_PASSWORD
));
7196 if (InfoBuffer
->All
.LmOwfPassword
.Buffer
== NULL
)
7198 Status
= STATUS_INSUFFICIENT_RESOURCES
;
7202 InfoBuffer
->All
.LmOwfPassword
.Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
7203 InfoBuffer
->All
.LmOwfPassword
.MaximumLength
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
7205 Status
= SampGetObjectAttribute(UserObject
,
7208 (PVOID
)InfoBuffer
->All
.LmOwfPassword
.Buffer
,
7210 if (!NT_SUCCESS(Status
))
7213 if (memcmp(InfoBuffer
->All
.LmOwfPassword
.Buffer
,
7215 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
7216 InfoBuffer
->All
.LmPasswordPresent
= TRUE
;
7220 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PRIVATEDATA
)
7222 Status
= SampGetObjectAttributeString(UserObject
,
7224 &InfoBuffer
->All
.PrivateData
);
7225 if (!NT_SUCCESS(Status
))
7227 TRACE("Status 0x%08lx\n", Status
);
7232 if (InfoBuffer
->All
.WhichFields
& USER_ALL_PASSWORDEXPIRED
)
7237 if (InfoBuffer
->All
.WhichFields
& USER_ALL_SECURITYDESCRIPTOR
)
7240 SampGetObjectAttribute(UserObject
,
7248 InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
= midl_user_allocate(Length
);
7249 if (InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
== NULL
)
7251 Status
= STATUS_INSUFFICIENT_RESOURCES
;
7255 InfoBuffer
->All
.SecurityDescriptor
.Length
= Length
;
7257 Status
= SampGetObjectAttribute(UserObject
,
7260 (PVOID
)InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
,
7262 if (!NT_SUCCESS(Status
))
7267 *Buffer
= InfoBuffer
;
7270 if (!NT_SUCCESS(Status
))
7272 if (InfoBuffer
!= NULL
)
7274 if (InfoBuffer
->All
.UserName
.Buffer
!= NULL
)
7275 midl_user_free(InfoBuffer
->All
.UserName
.Buffer
);
7277 if (InfoBuffer
->All
.FullName
.Buffer
!= NULL
)
7278 midl_user_free(InfoBuffer
->All
.FullName
.Buffer
);
7280 if (InfoBuffer
->All
.AdminComment
.Buffer
!= NULL
)
7281 midl_user_free(InfoBuffer
->All
.AdminComment
.Buffer
);
7283 if (InfoBuffer
->All
.UserComment
.Buffer
!= NULL
)
7284 midl_user_free(InfoBuffer
->All
.UserComment
.Buffer
);
7286 if (InfoBuffer
->All
.HomeDirectory
.Buffer
!= NULL
)
7287 midl_user_free(InfoBuffer
->All
.HomeDirectory
.Buffer
);
7289 if (InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
!= NULL
)
7290 midl_user_free(InfoBuffer
->All
.HomeDirectoryDrive
.Buffer
);
7292 if (InfoBuffer
->All
.ScriptPath
.Buffer
!= NULL
)
7293 midl_user_free(InfoBuffer
->All
.ScriptPath
.Buffer
);
7295 if (InfoBuffer
->All
.ProfilePath
.Buffer
!= NULL
)
7296 midl_user_free(InfoBuffer
->All
.ProfilePath
.Buffer
);
7298 if (InfoBuffer
->All
.WorkStations
.Buffer
!= NULL
)
7299 midl_user_free(InfoBuffer
->All
.WorkStations
.Buffer
);
7301 if (InfoBuffer
->All
.LogonHours
.LogonHours
!= NULL
)
7302 midl_user_free(InfoBuffer
->All
.LogonHours
.LogonHours
);
7304 if (InfoBuffer
->All
.Parameters
.Buffer
!= NULL
)
7305 midl_user_free(InfoBuffer
->All
.Parameters
.Buffer
);
7307 if (InfoBuffer
->All
.LmOwfPassword
.Buffer
!= NULL
)
7308 midl_user_free(InfoBuffer
->All
.LmOwfPassword
.Buffer
);
7310 if (InfoBuffer
->All
.NtOwfPassword
.Buffer
!= NULL
)
7311 midl_user_free(InfoBuffer
->All
.NtOwfPassword
.Buffer
);
7313 if (InfoBuffer
->All
.PrivateData
.Buffer
!= NULL
)
7314 midl_user_free(InfoBuffer
->All
.PrivateData
.Buffer
);
7316 if (InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
!= NULL
)
7317 midl_user_free(InfoBuffer
->All
.SecurityDescriptor
.SecurityDescriptor
);
7319 midl_user_free(InfoBuffer
);
7330 SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle
,
7331 IN USER_INFORMATION_CLASS UserInformationClass
,
7332 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
7334 PSAM_DB_OBJECT UserObject
;
7335 ACCESS_MASK DesiredAccess
;
7338 TRACE("SamrQueryInformationUser(%p %lu %p)\n",
7339 UserHandle
, UserInformationClass
, Buffer
);
7341 switch (UserInformationClass
)
7343 case UserGeneralInformation
:
7344 case UserNameInformation
:
7345 case UserAccountNameInformation
:
7346 case UserFullNameInformation
:
7347 case UserPrimaryGroupInformation
:
7348 case UserAdminCommentInformation
:
7349 DesiredAccess
= USER_READ_GENERAL
;
7352 case UserLogonHoursInformation
:
7353 case UserHomeInformation
:
7354 case UserScriptInformation
:
7355 case UserProfileInformation
:
7356 case UserWorkStationsInformation
:
7357 DesiredAccess
= USER_READ_LOGON
;
7360 case UserControlInformation
:
7361 case UserExpiresInformation
:
7362 case UserParametersInformation
:
7363 DesiredAccess
= USER_READ_ACCOUNT
;
7366 case UserPreferencesInformation
:
7367 DesiredAccess
= USER_READ_GENERAL
|
7368 USER_READ_PREFERENCES
;
7371 case UserLogonInformation
:
7372 case UserAccountInformation
:
7373 DesiredAccess
= USER_READ_GENERAL
|
7374 USER_READ_PREFERENCES
|
7379 case UserInternal1Information
:
7380 case UserInternal2Information
:
7381 case UserAllInformation
:
7386 return STATUS_INVALID_INFO_CLASS
;
7389 RtlAcquireResourceShared(&SampResource
,
7392 /* Validate the domain handle */
7393 Status
= SampValidateDbObject(UserHandle
,
7397 if (!NT_SUCCESS(Status
))
7399 TRACE("failed with status 0x%08lx\n", Status
);
7403 switch (UserInformationClass
)
7405 case UserGeneralInformation
:
7406 Status
= SampQueryUserGeneral(UserObject
,
7410 case UserPreferencesInformation
:
7411 Status
= SampQueryUserPreferences(UserObject
,
7415 case UserLogonInformation
:
7416 Status
= SampQueryUserLogon(UserObject
,
7420 case UserLogonHoursInformation
:
7421 Status
= SampQueryUserLogonHours(UserObject
,
7425 case UserAccountInformation
:
7426 Status
= SampQueryUserAccount(UserObject
,
7430 case UserNameInformation
:
7431 Status
= SampQueryUserName(UserObject
,
7435 case UserAccountNameInformation
:
7436 Status
= SampQueryUserAccountName(UserObject
,
7440 case UserFullNameInformation
:
7441 Status
= SampQueryUserFullName(UserObject
,
7445 case UserPrimaryGroupInformation
:
7446 Status
= SampQueryUserPrimaryGroup(UserObject
,
7450 case UserHomeInformation
:
7451 Status
= SampQueryUserHome(UserObject
,
7454 case UserScriptInformation
:
7455 Status
= SampQueryUserScript(UserObject
,
7459 case UserProfileInformation
:
7460 Status
= SampQueryUserProfile(UserObject
,
7464 case UserAdminCommentInformation
:
7465 Status
= SampQueryUserAdminComment(UserObject
,
7469 case UserWorkStationsInformation
:
7470 Status
= SampQueryUserWorkStations(UserObject
,
7474 case UserControlInformation
:
7475 Status
= SampQueryUserControl(UserObject
,
7479 case UserExpiresInformation
:
7480 Status
= SampQueryUserExpires(UserObject
,
7484 case UserInternal1Information
:
7485 Status
= SampQueryUserInternal1(UserObject
,
7489 case UserInternal2Information
:
7490 Status
= SampQueryUserInternal2(UserObject
,
7494 case UserParametersInformation
:
7495 Status
= SampQueryUserParameters(UserObject
,
7499 case UserAllInformation
:
7500 Status
= SampQueryUserAll(UserObject
,
7504 // case UserInternal4Information:
7505 // case UserInternal5Information:
7506 // case UserInternal4InformationNew:
7507 // case UserInternal5InformationNew:
7510 Status
= STATUS_INVALID_INFO_CLASS
;
7514 RtlReleaseResource(&SampResource
);
7521 SampSetUserName(PSAM_DB_OBJECT UserObject
,
7522 PRPC_UNICODE_STRING NewUserName
)
7524 UNICODE_STRING OldUserName
= {0, 0, NULL
};
7527 /* Check the account name */
7528 Status
= SampCheckAccountName(NewUserName
, 20);
7529 if (!NT_SUCCESS(Status
))
7531 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
7535 Status
= SampGetObjectAttributeString(UserObject
,
7537 (PRPC_UNICODE_STRING
)&OldUserName
);
7538 if (!NT_SUCCESS(Status
))
7540 TRACE("SampGetObjectAttributeString failed (Status 0x%08lx)\n", Status
);
7544 if (!RtlEqualUnicodeString(&OldUserName
, (PCUNICODE_STRING
)NewUserName
, TRUE
))
7546 Status
= SampCheckAccountNameInDomain(UserObject
->ParentObject
,
7547 NewUserName
->Buffer
);
7548 if (!NT_SUCCESS(Status
))
7550 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
7551 NewUserName
->Buffer
, Status
);
7556 Status
= SampSetAccountNameInDomain(UserObject
->ParentObject
,
7558 NewUserName
->Buffer
,
7559 UserObject
->RelativeId
);
7560 if (!NT_SUCCESS(Status
))
7562 TRACE("SampSetAccountNameInDomain failed (Status 0x%08lx)\n", Status
);
7566 Status
= SampRemoveAccountNameFromDomain(UserObject
->ParentObject
,
7568 OldUserName
.Buffer
);
7569 if (!NT_SUCCESS(Status
))
7571 TRACE("SampRemoveAccountNameFromDomain failed (Status 0x%08lx)\n", Status
);
7575 Status
= SampSetObjectAttributeString(UserObject
,
7578 if (!NT_SUCCESS(Status
))
7580 TRACE("SampSetObjectAttribute failed (Status 0x%08lx)\n", Status
);
7584 if (OldUserName
.Buffer
!= NULL
)
7585 midl_user_free(OldUserName
.Buffer
);
7592 SampSetUserGeneral(PSAM_DB_OBJECT UserObject
,
7593 PSAMPR_USER_INFO_BUFFER Buffer
)
7595 SAM_USER_FIXED_DATA FixedData
;
7599 Length
= sizeof(SAM_USER_FIXED_DATA
);
7600 Status
= SampGetObjectAttribute(UserObject
,
7605 if (!NT_SUCCESS(Status
))
7608 FixedData
.PrimaryGroupId
= Buffer
->General
.PrimaryGroupId
;
7610 Status
= SampSetObjectAttribute(UserObject
,
7615 if (!NT_SUCCESS(Status
))
7618 Status
= SampSetUserName(UserObject
,
7619 &Buffer
->General
.UserName
);
7620 if (!NT_SUCCESS(Status
))
7623 Status
= SampSetObjectAttributeString(UserObject
,
7625 &Buffer
->General
.FullName
);
7626 if (!NT_SUCCESS(Status
))
7629 Status
= SampSetObjectAttributeString(UserObject
,
7631 &Buffer
->General
.AdminComment
);
7632 if (!NT_SUCCESS(Status
))
7635 Status
= SampSetObjectAttributeString(UserObject
,
7637 &Buffer
->General
.UserComment
);
7645 SampSetUserPreferences(PSAM_DB_OBJECT UserObject
,
7646 PSAMPR_USER_INFO_BUFFER Buffer
)
7648 SAM_USER_FIXED_DATA FixedData
;
7652 Length
= sizeof(SAM_USER_FIXED_DATA
);
7653 Status
= SampGetObjectAttribute(UserObject
,
7658 if (!NT_SUCCESS(Status
))
7661 FixedData
.CountryCode
= Buffer
->Preferences
.CountryCode
;
7662 FixedData
.CodePage
= Buffer
->Preferences
.CodePage
;
7664 Status
= SampSetObjectAttribute(UserObject
,
7669 if (!NT_SUCCESS(Status
))
7672 Status
= SampSetObjectAttributeString(UserObject
,
7674 &Buffer
->Preferences
.UserComment
);
7682 SampSetUserPrimaryGroup(PSAM_DB_OBJECT UserObject
,
7683 PSAMPR_USER_INFO_BUFFER Buffer
)
7685 SAM_USER_FIXED_DATA FixedData
;
7689 Length
= sizeof(SAM_USER_FIXED_DATA
);
7690 Status
= SampGetObjectAttribute(UserObject
,
7695 if (!NT_SUCCESS(Status
))
7698 FixedData
.PrimaryGroupId
= Buffer
->PrimaryGroup
.PrimaryGroupId
;
7700 Status
= SampSetObjectAttribute(UserObject
,
7712 SampSetUserControl(PSAM_DB_OBJECT UserObject
,
7713 PSAMPR_USER_INFO_BUFFER Buffer
)
7715 SAM_USER_FIXED_DATA FixedData
;
7719 Length
= sizeof(SAM_USER_FIXED_DATA
);
7720 Status
= SampGetObjectAttribute(UserObject
,
7725 if (!NT_SUCCESS(Status
))
7728 FixedData
.UserAccountControl
= Buffer
->Control
.UserAccountControl
;
7730 Status
= SampSetObjectAttribute(UserObject
,
7742 SampSetUserExpires(PSAM_DB_OBJECT UserObject
,
7743 PSAMPR_USER_INFO_BUFFER Buffer
)
7745 SAM_USER_FIXED_DATA FixedData
;
7749 Length
= sizeof(SAM_USER_FIXED_DATA
);
7750 Status
= SampGetObjectAttribute(UserObject
,
7755 if (!NT_SUCCESS(Status
))
7758 FixedData
.AccountExpires
.LowPart
= Buffer
->Expires
.AccountExpires
.LowPart
;
7759 FixedData
.AccountExpires
.HighPart
= Buffer
->Expires
.AccountExpires
.HighPart
;
7761 Status
= SampSetObjectAttribute(UserObject
,
7773 SampSetUserInternal1(PSAM_DB_OBJECT UserObject
,
7774 PSAMPR_USER_INFO_BUFFER Buffer
)
7776 SAM_USER_FIXED_DATA FixedData
;
7778 NTSTATUS Status
= STATUS_SUCCESS
;
7780 /* FIXME: Decrypt NT password */
7781 /* FIXME: Decrypt LM password */
7783 Status
= SampSetUserPassword(UserObject
,
7784 &Buffer
->Internal1
.EncryptedNtOwfPassword
,
7785 Buffer
->Internal1
.NtPasswordPresent
,
7786 &Buffer
->Internal1
.EncryptedLmOwfPassword
,
7787 Buffer
->Internal1
.LmPasswordPresent
);
7788 if (!NT_SUCCESS(Status
))
7791 /* Get the fixed user attributes */
7792 Length
= sizeof(SAM_USER_FIXED_DATA
);
7793 Status
= SampGetObjectAttribute(UserObject
,
7798 if (!NT_SUCCESS(Status
))
7801 if (Buffer
->Internal1
.PasswordExpired
)
7803 /* The password was last set ages ago */
7804 FixedData
.PasswordLastSet
.LowPart
= 0;
7805 FixedData
.PasswordLastSet
.HighPart
= 0;
7809 /* The password was last set right now */
7810 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
7811 if (!NT_SUCCESS(Status
))
7815 /* Set the fixed user attributes */
7816 Status
= SampSetObjectAttribute(UserObject
,
7828 SampSetUserInternal2(PSAM_DB_OBJECT UserObject
,
7829 PSAMPR_USER_INFO_BUFFER Buffer
)
7831 SAM_USER_FIXED_DATA FixedData
;
7833 NTSTATUS Status
= STATUS_SUCCESS
;
7835 /* Get the fixed user attributes */
7836 Length
= sizeof(SAM_USER_FIXED_DATA
);
7837 Status
= SampGetObjectAttribute(UserObject
,
7842 if (!NT_SUCCESS(Status
))
7845 if ((Buffer
->Internal2
.Flags
& USER_LOGON_SUCCESS
) &&
7846 ((Buffer
->Internal2
.Flags
& ~USER_LOGON_SUCCESS
) == 0))
7848 /* Update the LastLogon time */
7849 Status
= NtQuerySystemTime(&FixedData
.LastLogon
);
7850 if (!NT_SUCCESS(Status
))
7853 FixedData
.LogonCount
++;
7854 FixedData
.BadPasswordCount
= 0;
7857 if ((Buffer
->Internal2
.Flags
& USER_LOGON_BAD_PASSWORD
) &&
7858 ((Buffer
->Internal2
.Flags
& ~USER_LOGON_BAD_PASSWORD
) == 0))
7860 /* Update the LastBadPasswordTime */
7861 Status
= NtQuerySystemTime(&FixedData
.LastBadPasswordTime
);
7862 if (!NT_SUCCESS(Status
))
7865 FixedData
.BadPasswordCount
++;
7868 /* Set the fixed user attributes */
7869 Status
= SampSetObjectAttribute(UserObject
,
7881 SampSetUserAll(PSAM_DB_OBJECT UserObject
,
7882 PSAMPR_USER_INFO_BUFFER Buffer
)
7884 SAM_USER_FIXED_DATA FixedData
;
7887 PENCRYPTED_NT_OWF_PASSWORD NtPassword
= NULL
;
7888 PENCRYPTED_LM_OWF_PASSWORD LmPassword
= NULL
;
7889 BOOLEAN NtPasswordPresent
= FALSE
;
7890 BOOLEAN LmPasswordPresent
= FALSE
;
7891 BOOLEAN WriteFixedData
= FALSE
;
7892 NTSTATUS Status
= STATUS_SUCCESS
;
7894 WhichFields
= Buffer
->All
.WhichFields
;
7896 /* Get the fixed size attributes */
7897 Length
= sizeof(SAM_USER_FIXED_DATA
);
7898 Status
= SampGetObjectAttribute(UserObject
,
7903 if (!NT_SUCCESS(Status
))
7906 if (WhichFields
& USER_ALL_USERNAME
)
7908 Status
= SampSetUserName(UserObject
,
7909 &Buffer
->All
.UserName
);
7910 if (!NT_SUCCESS(Status
))
7914 if (WhichFields
& USER_ALL_FULLNAME
)
7916 Status
= SampSetObjectAttributeString(UserObject
,
7918 &Buffer
->All
.FullName
);
7919 if (!NT_SUCCESS(Status
))
7923 if (WhichFields
& USER_ALL_ADMINCOMMENT
)
7925 Status
= SampSetObjectAttributeString(UserObject
,
7927 &Buffer
->All
.AdminComment
);
7928 if (!NT_SUCCESS(Status
))
7932 if (WhichFields
& USER_ALL_USERCOMMENT
)
7934 Status
= SampSetObjectAttributeString(UserObject
,
7936 &Buffer
->All
.UserComment
);
7937 if (!NT_SUCCESS(Status
))
7941 if (WhichFields
& USER_ALL_HOMEDIRECTORY
)
7943 Status
= SampSetObjectAttributeString(UserObject
,
7945 &Buffer
->All
.HomeDirectory
);
7946 if (!NT_SUCCESS(Status
))
7950 if (WhichFields
& USER_ALL_HOMEDIRECTORYDRIVE
)
7952 Status
= SampSetObjectAttributeString(UserObject
,
7953 L
"HomeDirectoryDrive",
7954 &Buffer
->All
.HomeDirectoryDrive
);
7955 if (!NT_SUCCESS(Status
))
7959 if (WhichFields
& USER_ALL_SCRIPTPATH
)
7961 Status
= SampSetObjectAttributeString(UserObject
,
7963 &Buffer
->All
.ScriptPath
);
7964 if (!NT_SUCCESS(Status
))
7968 if (WhichFields
& USER_ALL_PROFILEPATH
)
7970 Status
= SampSetObjectAttributeString(UserObject
,
7972 &Buffer
->All
.ProfilePath
);
7973 if (!NT_SUCCESS(Status
))
7977 if (WhichFields
& USER_ALL_WORKSTATIONS
)
7979 Status
= SampSetObjectAttributeString(UserObject
,
7981 &Buffer
->All
.WorkStations
);
7982 if (!NT_SUCCESS(Status
))
7986 if (WhichFields
& USER_ALL_PARAMETERS
)
7988 Status
= SampSetObjectAttributeString(UserObject
,
7990 &Buffer
->All
.Parameters
);
7991 if (!NT_SUCCESS(Status
))
7995 if (WhichFields
& USER_ALL_LOGONHOURS
)
7997 Status
= SampSetLogonHoursAttribute(UserObject
,
7998 &Buffer
->All
.LogonHours
);
7999 if (!NT_SUCCESS(Status
))
8003 if (WhichFields
& USER_ALL_PRIMARYGROUPID
)
8005 FixedData
.PrimaryGroupId
= Buffer
->All
.PrimaryGroupId
;
8006 WriteFixedData
= TRUE
;
8009 if (WhichFields
& USER_ALL_ACCOUNTEXPIRES
)
8011 FixedData
.AccountExpires
.LowPart
= Buffer
->All
.AccountExpires
.LowPart
;
8012 FixedData
.AccountExpires
.HighPart
= Buffer
->All
.AccountExpires
.HighPart
;
8013 WriteFixedData
= TRUE
;
8016 if (WhichFields
& USER_ALL_USERACCOUNTCONTROL
)
8018 FixedData
.UserAccountControl
= Buffer
->All
.UserAccountControl
;
8019 WriteFixedData
= TRUE
;
8022 if (WhichFields
& USER_ALL_COUNTRYCODE
)
8024 FixedData
.CountryCode
= Buffer
->All
.CountryCode
;
8025 WriteFixedData
= TRUE
;
8028 if (WhichFields
& USER_ALL_CODEPAGE
)
8030 FixedData
.CodePage
= Buffer
->All
.CodePage
;
8031 WriteFixedData
= TRUE
;
8034 if (WhichFields
& (USER_ALL_NTPASSWORDPRESENT
|
8035 USER_ALL_LMPASSWORDPRESENT
))
8037 if (WhichFields
& USER_ALL_NTPASSWORDPRESENT
)
8039 NtPassword
= (PENCRYPTED_NT_OWF_PASSWORD
)Buffer
->All
.NtOwfPassword
.Buffer
;
8040 NtPasswordPresent
= Buffer
->All
.NtPasswordPresent
;
8043 if (WhichFields
& USER_ALL_LMPASSWORDPRESENT
)
8045 LmPassword
= (PENCRYPTED_LM_OWF_PASSWORD
)Buffer
->All
.LmOwfPassword
.Buffer
;
8046 LmPasswordPresent
= Buffer
->All
.LmPasswordPresent
;
8049 Status
= SampSetUserPassword(UserObject
,
8054 if (!NT_SUCCESS(Status
))
8057 /* The password has just been set */
8058 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
8059 if (!NT_SUCCESS(Status
))
8062 WriteFixedData
= TRUE
;
8065 if (WhichFields
& USER_ALL_PRIVATEDATA
)
8067 Status
= SampSetObjectAttributeString(UserObject
,
8069 &Buffer
->All
.PrivateData
);
8070 if (!NT_SUCCESS(Status
))
8074 if (WhichFields
& USER_ALL_PASSWORDEXPIRED
)
8076 if (Buffer
->All
.PasswordExpired
)
8078 /* The password was last set ages ago */
8079 FixedData
.PasswordLastSet
.LowPart
= 0;
8080 FixedData
.PasswordLastSet
.HighPart
= 0;
8084 /* The password was last set right now */
8085 Status
= NtQuerySystemTime(&FixedData
.PasswordLastSet
);
8086 if (!NT_SUCCESS(Status
))
8090 WriteFixedData
= TRUE
;
8093 if (WhichFields
& USER_ALL_SECURITYDESCRIPTOR
)
8095 Status
= SampSetObjectAttribute(UserObject
,
8098 Buffer
->All
.SecurityDescriptor
.SecurityDescriptor
,
8099 Buffer
->All
.SecurityDescriptor
.Length
);
8102 if (WriteFixedData
!= FALSE
)
8104 Status
= SampSetObjectAttribute(UserObject
,
8109 if (!NT_SUCCESS(Status
))
8121 SamrSetInformationUser(IN SAMPR_HANDLE UserHandle
,
8122 IN USER_INFORMATION_CLASS UserInformationClass
,
8123 IN PSAMPR_USER_INFO_BUFFER Buffer
)
8125 PSAM_DB_OBJECT UserObject
;
8126 ACCESS_MASK DesiredAccess
;
8129 TRACE("SamrSetInformationUser(%p %lu %p)\n",
8130 UserHandle
, UserInformationClass
, Buffer
);
8132 switch (UserInformationClass
)
8134 case UserLogonHoursInformation
:
8135 case UserNameInformation
:
8136 case UserAccountNameInformation
:
8137 case UserFullNameInformation
:
8138 case UserPrimaryGroupInformation
:
8139 case UserHomeInformation
:
8140 case UserScriptInformation
:
8141 case UserProfileInformation
:
8142 case UserAdminCommentInformation
:
8143 case UserWorkStationsInformation
:
8144 case UserControlInformation
:
8145 case UserExpiresInformation
:
8146 case UserParametersInformation
:
8147 DesiredAccess
= USER_WRITE_ACCOUNT
;
8150 case UserGeneralInformation
:
8151 DesiredAccess
= USER_WRITE_ACCOUNT
|
8152 USER_WRITE_PREFERENCES
;
8155 case UserPreferencesInformation
:
8156 DesiredAccess
= USER_WRITE_PREFERENCES
;
8159 case UserSetPasswordInformation
:
8160 case UserInternal1Information
:
8161 DesiredAccess
= USER_FORCE_PASSWORD_CHANGE
;
8164 case UserAllInformation
:
8165 case UserInternal2Information
:
8166 DesiredAccess
= 0; /* FIXME */
8170 return STATUS_INVALID_INFO_CLASS
;
8173 RtlAcquireResourceExclusive(&SampResource
,
8176 /* Validate the domain handle */
8177 Status
= SampValidateDbObject(UserHandle
,
8181 if (!NT_SUCCESS(Status
))
8183 TRACE("failed with status 0x%08lx\n", Status
);
8187 switch (UserInformationClass
)
8189 case UserGeneralInformation
:
8190 Status
= SampSetUserGeneral(UserObject
,
8194 case UserPreferencesInformation
:
8195 Status
= SampSetUserPreferences(UserObject
,
8199 case UserLogonHoursInformation
:
8200 Status
= SampSetLogonHoursAttribute(UserObject
,
8201 &Buffer
->LogonHours
.LogonHours
);
8204 case UserNameInformation
:
8205 Status
= SampSetUserName(UserObject
,
8206 &Buffer
->Name
.UserName
);
8207 if (!NT_SUCCESS(Status
))
8210 Status
= SampSetObjectAttributeString(UserObject
,
8212 &Buffer
->Name
.FullName
);
8215 case UserAccountNameInformation
:
8216 Status
= SampSetUserName(UserObject
,
8217 &Buffer
->AccountName
.UserName
);
8220 case UserFullNameInformation
:
8221 Status
= SampSetObjectAttributeString(UserObject
,
8223 &Buffer
->FullName
.FullName
);
8226 case UserPrimaryGroupInformation
:
8227 Status
= SampSetUserPrimaryGroup(UserObject
,
8231 case UserHomeInformation
:
8232 Status
= SampSetObjectAttributeString(UserObject
,
8234 &Buffer
->Home
.HomeDirectory
);
8235 if (!NT_SUCCESS(Status
))
8238 Status
= SampSetObjectAttributeString(UserObject
,
8239 L
"HomeDirectoryDrive",
8240 &Buffer
->Home
.HomeDirectoryDrive
);
8243 case UserScriptInformation
:
8244 Status
= SampSetObjectAttributeString(UserObject
,
8246 &Buffer
->Script
.ScriptPath
);
8249 case UserProfileInformation
:
8250 Status
= SampSetObjectAttributeString(UserObject
,
8252 &Buffer
->Profile
.ProfilePath
);
8255 case UserAdminCommentInformation
:
8256 Status
= SampSetObjectAttributeString(UserObject
,
8258 &Buffer
->AdminComment
.AdminComment
);
8261 case UserWorkStationsInformation
:
8262 Status
= SampSetObjectAttributeString(UserObject
,
8264 &Buffer
->WorkStations
.WorkStations
);
8267 case UserSetPasswordInformation
:
8268 TRACE("Password: %S\n", Buffer
->SetPassword
.Password
.Buffer
);
8269 TRACE("PasswordExpired: %d\n", Buffer
->SetPassword
.PasswordExpired
);
8271 Status
= SampSetObjectAttributeString(UserObject
,
8273 &Buffer
->SetPassword
.Password
);
8276 case UserControlInformation
:
8277 Status
= SampSetUserControl(UserObject
,
8281 case UserExpiresInformation
:
8282 Status
= SampSetUserExpires(UserObject
,
8286 case UserInternal1Information
:
8287 Status
= SampSetUserInternal1(UserObject
,
8291 case UserInternal2Information
:
8292 Status
= SampSetUserInternal2(UserObject
,
8296 case UserParametersInformation
:
8297 Status
= SampSetObjectAttributeString(UserObject
,
8299 &Buffer
->Parameters
.Parameters
);
8302 case UserAllInformation
:
8303 Status
= SampSetUserAll(UserObject
,
8307 // case UserInternal4Information:
8308 // case UserInternal5Information:
8309 // case UserInternal4InformationNew:
8310 // case UserInternal5InformationNew:
8313 Status
= STATUS_INVALID_INFO_CLASS
;
8317 RtlReleaseResource(&SampResource
);
8326 SamrChangePasswordUser(IN SAMPR_HANDLE UserHandle
,
8327 IN
unsigned char LmPresent
,
8328 IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm
,
8329 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm
,
8330 IN
unsigned char NtPresent
,
8331 IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt
,
8332 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt
,
8333 IN
unsigned char NtCrossEncryptionPresent
,
8334 IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm
,
8335 IN
unsigned char LmCrossEncryptionPresent
,
8336 IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt
)
8338 ENCRYPTED_LM_OWF_PASSWORD StoredLmPassword
;
8339 ENCRYPTED_NT_OWF_PASSWORD StoredNtPassword
;
8340 LM_OWF_PASSWORD OldLmPassword
;
8341 LM_OWF_PASSWORD NewLmPassword
;
8342 NT_OWF_PASSWORD OldNtPassword
;
8343 NT_OWF_PASSWORD NewNtPassword
;
8344 BOOLEAN StoredLmPresent
= FALSE
;
8345 BOOLEAN StoredNtPresent
= FALSE
;
8346 BOOLEAN StoredLmEmpty
= TRUE
;
8347 BOOLEAN StoredNtEmpty
= TRUE
;
8348 PSAM_DB_OBJECT UserObject
;
8350 SAM_USER_FIXED_DATA UserFixedData
;
8351 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
8352 LARGE_INTEGER SystemTime
;
8355 DBG_UNREFERENCED_LOCAL_VARIABLE(StoredLmPresent
);
8356 DBG_UNREFERENCED_LOCAL_VARIABLE(StoredNtPresent
);
8357 DBG_UNREFERENCED_LOCAL_VARIABLE(StoredLmEmpty
);
8359 TRACE("(%p %u %p %p %u %p %p %u %p %u %p)\n",
8360 UserHandle
, LmPresent
, OldLmEncryptedWithNewLm
, NewLmEncryptedWithOldLm
,
8361 NtPresent
, OldNtEncryptedWithNewNt
, NewNtEncryptedWithOldNt
, NtCrossEncryptionPresent
,
8362 NewNtEncryptedWithNewLm
, LmCrossEncryptionPresent
, NewLmEncryptedWithNewNt
);
8364 RtlAcquireResourceExclusive(&SampResource
,
8367 /* Validate the user handle */
8368 Status
= SampValidateDbObject(UserHandle
,
8370 USER_CHANGE_PASSWORD
,
8372 if (!NT_SUCCESS(Status
))
8374 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8378 /* Get the current time */
8379 Status
= NtQuerySystemTime(&SystemTime
);
8380 if (!NT_SUCCESS(Status
))
8382 TRACE("NtQuerySystemTime failed (Status 0x%08lx)\n", Status
);
8386 /* Retrieve the LM password */
8387 Length
= sizeof(ENCRYPTED_LM_OWF_PASSWORD
);
8388 Status
= SampGetObjectAttribute(UserObject
,
8393 if (NT_SUCCESS(Status
))
8395 if (Length
== sizeof(ENCRYPTED_LM_OWF_PASSWORD
))
8397 StoredLmPresent
= TRUE
;
8398 if (!RtlEqualMemory(&StoredLmPassword
,
8400 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8401 StoredLmEmpty
= FALSE
;
8405 /* Retrieve the NT password */
8406 Length
= sizeof(ENCRYPTED_NT_OWF_PASSWORD
);
8407 Status
= SampGetObjectAttribute(UserObject
,
8412 if (NT_SUCCESS(Status
))
8414 if (Length
== sizeof(ENCRYPTED_NT_OWF_PASSWORD
))
8416 StoredNtPresent
= TRUE
;
8417 if (!RtlEqualMemory(&StoredNtPassword
,
8419 sizeof(ENCRYPTED_NT_OWF_PASSWORD
)))
8420 StoredNtEmpty
= FALSE
;
8424 /* Retrieve the fixed size user data */
8425 Length
= sizeof(SAM_USER_FIXED_DATA
);
8426 Status
= SampGetObjectAttribute(UserObject
,
8431 if (!NT_SUCCESS(Status
))
8433 TRACE("SampGetObjectAttribute failed to retrieve the fixed user data (Status 0x%08lx)\n", Status
);
8437 /* Check if we can change the password at this time */
8438 if ((StoredLmEmpty
== FALSE
) || (StoredNtEmpty
== FALSE
))
8440 /* Get fixed domain data */
8441 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8442 Status
= SampGetObjectAttribute(UserObject
->ParentObject
,
8447 if (!NT_SUCCESS(Status
))
8449 TRACE("SampGetObjectAttribute failed to retrieve the fixed domain data (Status 0x%08lx)\n", Status
);
8453 if (DomainFixedData
.MinPasswordAge
.QuadPart
> 0)
8455 if (SystemTime
.QuadPart
< (UserFixedData
.PasswordLastSet
.QuadPart
+ DomainFixedData
.MinPasswordAge
.QuadPart
))
8457 Status
= STATUS_ACCOUNT_RESTRICTION
;
8463 /* Decrypt the LM passwords, if present */
8466 Status
= SystemFunction013((const BYTE
*)NewLmEncryptedWithOldLm
,
8467 (const BYTE
*)&StoredLmPassword
,
8468 (LPBYTE
)&NewLmPassword
);
8469 if (!NT_SUCCESS(Status
))
8471 TRACE("SystemFunction013 failed (Status 0x%08lx)\n", Status
);
8475 Status
= SystemFunction013((const BYTE
*)OldLmEncryptedWithNewLm
,
8476 (const BYTE
*)&NewLmPassword
,
8477 (LPBYTE
)&OldLmPassword
);
8478 if (!NT_SUCCESS(Status
))
8480 TRACE("SystemFunction013 failed (Status 0x%08lx)\n", Status
);
8485 /* Decrypt the NT passwords, if present */
8488 Status
= SystemFunction013((const BYTE
*)NewNtEncryptedWithOldNt
,
8489 (const BYTE
*)&StoredNtPassword
,
8490 (LPBYTE
)&NewNtPassword
);
8491 if (!NT_SUCCESS(Status
))
8493 TRACE("SystemFunction013 failed (Status 0x%08lx)\n", Status
);
8497 Status
= SystemFunction013((const BYTE
*)OldNtEncryptedWithNewNt
,
8498 (const BYTE
*)&NewNtPassword
,
8499 (LPBYTE
)&OldNtPassword
);
8500 if (!NT_SUCCESS(Status
))
8502 TRACE("SystemFunction013 failed (Status 0x%08lx)\n", Status
);
8507 /* Check if the old passwords match the stored ones */
8512 if (!RtlEqualMemory(&StoredLmPassword
,
8514 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8516 TRACE("Old LM Password does not match!\n");
8517 Status
= STATUS_WRONG_PASSWORD
;
8521 if (!RtlEqualMemory(&StoredNtPassword
,
8523 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8525 TRACE("Old NT Password does not match!\n");
8526 Status
= STATUS_WRONG_PASSWORD
;
8532 if (!RtlEqualMemory(&StoredNtPassword
,
8534 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8536 TRACE("Old NT Password does not match!\n");
8537 Status
= STATUS_WRONG_PASSWORD
;
8545 if (!RtlEqualMemory(&StoredLmPassword
,
8547 sizeof(ENCRYPTED_LM_OWF_PASSWORD
)))
8549 TRACE("Old LM Password does not match!\n");
8550 Status
= STATUS_WRONG_PASSWORD
;
8555 Status
= STATUS_INVALID_PARAMETER
;
8559 /* Store the new password hashes */
8560 if (NT_SUCCESS(Status
))
8562 Status
= SampSetUserPassword(UserObject
,
8567 if (NT_SUCCESS(Status
))
8569 /* Update PasswordLastSet */
8570 UserFixedData
.PasswordLastSet
.QuadPart
= SystemTime
.QuadPart
;
8572 /* Set the fixed size user data */
8573 Length
= sizeof(SAM_USER_FIXED_DATA
);
8574 Status
= SampSetObjectAttribute(UserObject
,
8582 if (Status
== STATUS_WRONG_PASSWORD
)
8584 /* Update BadPasswordCount and LastBadPasswordTime */
8585 UserFixedData
.BadPasswordCount
++;
8586 UserFixedData
.LastBadPasswordTime
.QuadPart
= SystemTime
.QuadPart
;
8588 /* Set the fixed size user data */
8589 Length
= sizeof(SAM_USER_FIXED_DATA
);
8590 Status
= SampSetObjectAttribute(UserObject
,
8598 RtlReleaseResource(&SampResource
);
8607 SamrGetGroupsForUser(IN SAMPR_HANDLE UserHandle
,
8608 OUT PSAMPR_GET_GROUPS_BUFFER
*Groups
)
8610 PSAMPR_GET_GROUPS_BUFFER GroupsBuffer
= NULL
;
8611 PSAM_DB_OBJECT UserObject
;
8615 TRACE("SamrGetGroupsForUser(%p %p)\n",
8616 UserHandle
, Groups
);
8618 RtlAcquireResourceShared(&SampResource
,
8621 /* Validate the user handle */
8622 Status
= SampValidateDbObject(UserHandle
,
8626 if (!NT_SUCCESS(Status
))
8628 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8632 /* Allocate the groups buffer */
8633 GroupsBuffer
= midl_user_allocate(sizeof(SAMPR_GET_GROUPS_BUFFER
));
8634 if (GroupsBuffer
== NULL
)
8636 Status
= STATUS_INSUFFICIENT_RESOURCES
;
8641 * Get the size of the Groups attribute.
8642 * Do not check the status code because in case of an error
8643 * Length will be 0. And that is all we need.
8645 SampGetObjectAttribute(UserObject
,
8651 /* If there is no Groups attribute, return a groups buffer without an array */
8654 GroupsBuffer
->MembershipCount
= 0;
8655 GroupsBuffer
->Groups
= NULL
;
8657 *Groups
= GroupsBuffer
;
8659 Status
= STATUS_SUCCESS
;
8663 /* Allocate a buffer for the Groups attribute */
8664 GroupsBuffer
->Groups
= midl_user_allocate(Length
);
8665 if (GroupsBuffer
->Groups
== NULL
)
8667 Status
= STATUS_INSUFFICIENT_RESOURCES
;
8671 /* Retrieve the Grous attribute */
8672 Status
= SampGetObjectAttribute(UserObject
,
8675 GroupsBuffer
->Groups
,
8677 if (!NT_SUCCESS(Status
))
8679 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8683 /* Calculate the membership count */
8684 GroupsBuffer
->MembershipCount
= Length
/ sizeof(GROUP_MEMBERSHIP
);
8686 /* Return the groups buffer to the caller */
8687 *Groups
= GroupsBuffer
;
8690 if (!NT_SUCCESS(Status
))
8692 if (GroupsBuffer
!= NULL
)
8694 if (GroupsBuffer
->Groups
!= NULL
)
8695 midl_user_free(GroupsBuffer
->Groups
);
8697 midl_user_free(GroupsBuffer
);
8701 RtlReleaseResource(&SampResource
);
8710 SamrQueryDisplayInformation(IN SAMPR_HANDLE DomainHandle
,
8711 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8712 IN
unsigned long Index
,
8713 IN
unsigned long EntryCount
,
8714 IN
unsigned long PreferredMaximumLength
,
8715 OUT
unsigned long *TotalAvailable
,
8716 OUT
unsigned long *TotalReturned
,
8717 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8720 return STATUS_NOT_IMPLEMENTED
;
8726 SamrGetDisplayEnumerationIndex(IN SAMPR_HANDLE DomainHandle
,
8727 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8728 IN PRPC_UNICODE_STRING Prefix
,
8729 OUT
unsigned long *Index
)
8732 return STATUS_NOT_IMPLEMENTED
;
8738 SamrTestPrivateFunctionsDomain(IN SAMPR_HANDLE DomainHandle
)
8741 return STATUS_NOT_IMPLEMENTED
;
8747 SamrTestPrivateFunctionsUser(IN SAMPR_HANDLE UserHandle
)
8750 return STATUS_NOT_IMPLEMENTED
;
8757 SamrGetUserDomainPasswordInformation(IN SAMPR_HANDLE UserHandle
,
8758 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
8760 SAM_DOMAIN_FIXED_DATA DomainFixedData
;
8761 SAM_USER_FIXED_DATA UserFixedData
;
8762 PSAM_DB_OBJECT DomainObject
;
8763 PSAM_DB_OBJECT UserObject
;
8768 UserHandle
, PasswordInformation
);
8770 RtlAcquireResourceShared(&SampResource
,
8773 /* Validate the user handle */
8774 Status
= SampValidateDbObject(UserHandle
,
8778 if (!NT_SUCCESS(Status
))
8780 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8784 /* Validate the domain object */
8785 Status
= SampValidateDbObject((SAMPR_HANDLE
)UserObject
->ParentObject
,
8787 DOMAIN_READ_PASSWORD_PARAMETERS
,
8789 if (!NT_SUCCESS(Status
))
8791 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8795 /* Get fixed user data */
8796 Length
= sizeof(SAM_USER_FIXED_DATA
);
8797 Status
= SampGetObjectAttribute(UserObject
,
8800 (PVOID
)&UserFixedData
,
8802 if (!NT_SUCCESS(Status
))
8804 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8808 if ((UserObject
->RelativeId
== DOMAIN_USER_RID_KRBTGT
) ||
8809 (UserFixedData
.UserAccountControl
& (USER_INTERDOMAIN_TRUST_ACCOUNT
|
8810 USER_WORKSTATION_TRUST_ACCOUNT
|
8811 USER_SERVER_TRUST_ACCOUNT
)))
8813 PasswordInformation
->MinPasswordLength
= 0;
8814 PasswordInformation
->PasswordProperties
= 0;
8818 /* Get fixed domain data */
8819 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
8820 Status
= SampGetObjectAttribute(DomainObject
,
8823 (PVOID
)&DomainFixedData
,
8825 if (!NT_SUCCESS(Status
))
8827 TRACE("SampGetObjectAttribute failed with status 0x%08lx\n", Status
);
8831 PasswordInformation
->MinPasswordLength
= DomainFixedData
.MinPasswordLength
;
8832 PasswordInformation
->PasswordProperties
= DomainFixedData
.PasswordProperties
;
8836 RtlReleaseResource(&SampResource
);
8838 return STATUS_SUCCESS
;
8845 SamrRemoveMemberFromForeignDomain(IN SAMPR_HANDLE DomainHandle
,
8846 IN PRPC_SID MemberSid
)
8848 PSAM_DB_OBJECT DomainObject
;
8853 DomainHandle
, MemberSid
);
8855 RtlAcquireResourceExclusive(&SampResource
,
8858 /* Validate the domain object */
8859 Status
= SampValidateDbObject(DomainHandle
,
8863 if (!NT_SUCCESS(Status
))
8865 TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status
);
8869 /* Retrieve the RID from the MemberSID */
8870 Status
= SampGetRidFromSid((PSID
)MemberSid
,
8872 if (!NT_SUCCESS(Status
))
8874 TRACE("SampGetRidFromSid failed with status 0x%08lx\n", Status
);
8878 /* Fail, if the RID represents a special account */
8881 TRACE("Cannot remove a special account (RID: %lu)\n", Rid
);
8882 Status
= STATUS_SPECIAL_ACCOUNT
;
8886 /* Remove the member from all aliases in the domain */
8887 Status
= SampRemoveMemberFromAllAliases(DomainObject
,
8889 if (!NT_SUCCESS(Status
))
8891 TRACE("SampRemoveMemberFromAllAliases failed with status 0x%08lx\n", Status
);
8895 RtlReleaseResource(&SampResource
);
8904 SamrQueryInformationDomain2(IN SAMPR_HANDLE DomainHandle
,
8905 IN DOMAIN_INFORMATION_CLASS DomainInformationClass
,
8906 OUT PSAMPR_DOMAIN_INFO_BUFFER
*Buffer
)
8908 TRACE("(%p %lu %p)\n", DomainHandle
, DomainInformationClass
, Buffer
);
8910 return SamrQueryInformationDomain(DomainHandle
,
8911 DomainInformationClass
,
8919 SamrQueryInformationUser2(IN SAMPR_HANDLE UserHandle
,
8920 IN USER_INFORMATION_CLASS UserInformationClass
,
8921 OUT PSAMPR_USER_INFO_BUFFER
*Buffer
)
8923 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
8925 return SamrQueryInformationUser(UserHandle
,
8926 UserInformationClass
,
8934 SamrQueryDisplayInformation2(IN SAMPR_HANDLE DomainHandle
,
8935 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8936 IN
unsigned long Index
,
8937 IN
unsigned long EntryCount
,
8938 IN
unsigned long PreferredMaximumLength
,
8939 OUT
unsigned long *TotalAvailable
,
8940 OUT
unsigned long *TotalReturned
,
8941 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
8943 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
8944 DomainHandle
, DisplayInformationClass
, Index
,
8945 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
8946 TotalReturned
, Buffer
);
8948 return SamrQueryDisplayInformation(DomainHandle
,
8949 DisplayInformationClass
,
8952 PreferredMaximumLength
,
8962 SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle
,
8963 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
8964 IN PRPC_UNICODE_STRING Prefix
,
8965 OUT
unsigned long *Index
)
8967 TRACE("(%p %lu %p %p)\n",
8968 DomainHandle
, DisplayInformationClass
, Prefix
, Index
);
8970 return SamrGetDisplayEnumerationIndex(DomainHandle
,
8971 DisplayInformationClass
,
8980 SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle
,
8981 IN PRPC_UNICODE_STRING Name
,
8982 IN
unsigned long AccountType
,
8983 IN ACCESS_MASK DesiredAccess
,
8984 OUT SAMPR_HANDLE
*UserHandle
,
8985 OUT
unsigned long *GrantedAccess
,
8986 OUT
unsigned long *RelativeId
)
8988 SAM_DOMAIN_FIXED_DATA FixedDomainData
;
8989 SAM_USER_FIXED_DATA FixedUserData
;
8990 PSAM_DB_OBJECT DomainObject
;
8991 PSAM_DB_OBJECT UserObject
;
8992 GROUP_MEMBERSHIP GroupMembership
;
8993 UCHAR LogonHours
[23];
8997 PSECURITY_DESCRIPTOR Sd
= NULL
;
8999 PSID UserSid
= NULL
;
9002 TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
9003 DomainHandle
, Name
, DesiredAccess
, UserHandle
, RelativeId
);
9006 Name
->Length
== 0 ||
9007 Name
->Buffer
== NULL
||
9008 UserHandle
== NULL
||
9010 return STATUS_INVALID_PARAMETER
;
9012 /* Check for valid account type */
9013 if (AccountType
!= USER_NORMAL_ACCOUNT
&&
9014 AccountType
!= USER_WORKSTATION_TRUST_ACCOUNT
&&
9015 AccountType
!= USER_INTERDOMAIN_TRUST_ACCOUNT
&&
9016 AccountType
!= USER_SERVER_TRUST_ACCOUNT
&&
9017 AccountType
!= USER_TEMP_DUPLICATE_ACCOUNT
)
9018 return STATUS_INVALID_PARAMETER
;
9020 /* Map generic access rights */
9021 RtlMapGenericMask(&DesiredAccess
,
9024 RtlAcquireResourceExclusive(&SampResource
,
9027 /* Validate the domain handle */
9028 Status
= SampValidateDbObject(DomainHandle
,
9032 if (!NT_SUCCESS(Status
))
9034 TRACE("failed with status 0x%08lx\n", Status
);
9038 /* Check the user account name */
9039 Status
= SampCheckAccountName(Name
, 20);
9040 if (!NT_SUCCESS(Status
))
9042 TRACE("SampCheckAccountName failed (Status 0x%08lx)\n", Status
);
9046 /* Check if the user name already exists in the domain */
9047 Status
= SampCheckAccountNameInDomain(DomainObject
,
9049 if (!NT_SUCCESS(Status
))
9051 TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
9052 Name
->Buffer
, Status
);
9056 /* Get the fixed domain attributes */
9057 ulSize
= sizeof(SAM_DOMAIN_FIXED_DATA
);
9058 Status
= SampGetObjectAttribute(DomainObject
,
9061 (PVOID
)&FixedDomainData
,
9063 if (!NT_SUCCESS(Status
))
9065 TRACE("failed with status 0x%08lx\n", Status
);
9069 /* Increment the NextRid attribute */
9070 ulRid
= FixedDomainData
.NextRid
;
9071 FixedDomainData
.NextRid
++;
9073 TRACE("RID: %lx\n", ulRid
);
9075 /* Create the user SID */
9076 Status
= SampCreateAccountSid(DomainObject
,
9079 if (!NT_SUCCESS(Status
))
9081 TRACE("SampCreateAccountSid failed (Status 0x%08lx)\n", Status
);
9085 /* Create the security descriptor */
9086 Status
= SampCreateUserSD(UserSid
,
9089 if (!NT_SUCCESS(Status
))
9091 TRACE("SampCreateUserSD failed (Status 0x%08lx)\n", Status
);
9095 /* Store the fixed domain attributes */
9096 Status
= SampSetObjectAttribute(DomainObject
,
9101 if (!NT_SUCCESS(Status
))
9103 TRACE("failed with status 0x%08lx\n", Status
);
9107 /* Convert the RID into a string (hex) */
9108 swprintf(szRid
, L
"%08lX", ulRid
);
9110 /* Create the user object */
9111 Status
= SampCreateDbObject(DomainObject
,
9118 if (!NT_SUCCESS(Status
))
9120 TRACE("failed with status 0x%08lx\n", Status
);
9124 /* Add the account name for the user object */
9125 Status
= SampSetAccountNameInDomain(DomainObject
,
9129 if (!NT_SUCCESS(Status
))
9131 TRACE("failed with status 0x%08lx\n", Status
);
9135 /* Initialize fixed user data */
9136 FixedUserData
.Version
= 1;
9137 FixedUserData
.Reserved
= 0;
9138 FixedUserData
.LastLogon
.QuadPart
= 0;
9139 FixedUserData
.LastLogoff
.QuadPart
= 0;
9140 FixedUserData
.PasswordLastSet
.QuadPart
= 0;
9141 FixedUserData
.AccountExpires
.LowPart
= MAXULONG
;
9142 FixedUserData
.AccountExpires
.HighPart
= MAXLONG
;
9143 FixedUserData
.LastBadPasswordTime
.QuadPart
= 0;
9144 FixedUserData
.UserId
= ulRid
;
9145 FixedUserData
.PrimaryGroupId
= DOMAIN_GROUP_RID_USERS
;
9146 FixedUserData
.UserAccountControl
= USER_ACCOUNT_DISABLED
|
9147 USER_PASSWORD_NOT_REQUIRED
|
9149 FixedUserData
.CountryCode
= 0;
9150 FixedUserData
.CodePage
= 0;
9151 FixedUserData
.BadPasswordCount
= 0;
9152 FixedUserData
.LogonCount
= 0;
9153 FixedUserData
.AdminCount
= 0;
9154 FixedUserData
.OperatorCount
= 0;
9156 /* Set fixed user data attribute */
9157 Status
= SampSetObjectAttribute(UserObject
,
9160 (LPVOID
)&FixedUserData
,
9161 sizeof(SAM_USER_FIXED_DATA
));
9162 if (!NT_SUCCESS(Status
))
9164 TRACE("failed with status 0x%08lx\n", Status
);
9168 /* Set the Name attribute */
9169 Status
= SampSetObjectAttributeString(UserObject
,
9172 if (!NT_SUCCESS(Status
))
9174 TRACE("failed with status 0x%08lx\n", Status
);
9178 /* Set the FullName attribute */
9179 Status
= SampSetObjectAttributeString(UserObject
,
9182 if (!NT_SUCCESS(Status
))
9184 TRACE("failed with status 0x%08lx\n", Status
);
9188 /* Set the HomeDirectory attribute */
9189 Status
= SampSetObjectAttributeString(UserObject
,
9192 if (!NT_SUCCESS(Status
))
9194 TRACE("failed with status 0x%08lx\n", Status
);
9198 /* Set the HomeDirectoryDrive attribute */
9199 Status
= SampSetObjectAttributeString(UserObject
,
9200 L
"HomeDirectoryDrive",
9202 if (!NT_SUCCESS(Status
))
9204 TRACE("failed with status 0x%08lx\n", Status
);
9208 /* Set the ScriptPath attribute */
9209 Status
= SampSetObjectAttributeString(UserObject
,
9212 if (!NT_SUCCESS(Status
))
9214 TRACE("failed with status 0x%08lx\n", Status
);
9218 /* Set the ProfilePath attribute */
9219 Status
= SampSetObjectAttributeString(UserObject
,
9222 if (!NT_SUCCESS(Status
))
9224 TRACE("failed with status 0x%08lx\n", Status
);
9228 /* Set the AdminComment attribute */
9229 Status
= SampSetObjectAttributeString(UserObject
,
9232 if (!NT_SUCCESS(Status
))
9234 TRACE("failed with status 0x%08lx\n", Status
);
9238 /* Set the UserComment attribute */
9239 Status
= SampSetObjectAttributeString(UserObject
,
9242 if (!NT_SUCCESS(Status
))
9244 TRACE("failed with status 0x%08lx\n", Status
);
9248 /* Set the WorkStations attribute */
9249 Status
= SampSetObjectAttributeString(UserObject
,
9252 if (!NT_SUCCESS(Status
))
9254 TRACE("failed with status 0x%08lx\n", Status
);
9258 /* Set the Parameters attribute */
9259 Status
= SampSetObjectAttributeString(UserObject
,
9262 if (!NT_SUCCESS(Status
))
9264 TRACE("failed with status 0x%08lx\n", Status
);
9268 /* Set LogonHours attribute*/
9269 *((PUSHORT
)LogonHours
) = 168;
9270 memset(&(LogonHours
[2]), 0xff, 21);
9272 Status
= SampSetObjectAttribute(UserObject
,
9276 sizeof(LogonHours
));
9277 if (!NT_SUCCESS(Status
))
9279 TRACE("failed with status 0x%08lx\n", Status
);
9283 /* Set Groups attribute*/
9284 GroupMembership
.RelativeId
= DOMAIN_GROUP_RID_USERS
;
9285 GroupMembership
.Attributes
= SE_GROUP_MANDATORY
|
9287 SE_GROUP_ENABLED_BY_DEFAULT
;
9289 Status
= SampSetObjectAttribute(UserObject
,
9293 sizeof(GROUP_MEMBERSHIP
));
9294 if (!NT_SUCCESS(Status
))
9296 TRACE("failed with status 0x%08lx\n", Status
);
9300 /* Set LMPwd attribute*/
9301 Status
= SampSetObjectAttribute(UserObject
,
9306 if (!NT_SUCCESS(Status
))
9308 TRACE("failed with status 0x%08lx\n", Status
);
9312 /* Set NTPwd attribute*/
9313 Status
= SampSetObjectAttribute(UserObject
,
9318 if (!NT_SUCCESS(Status
))
9320 TRACE("failed with status 0x%08lx\n", Status
);
9324 /* Set LMPwdHistory attribute*/
9325 Status
= SampSetObjectAttribute(UserObject
,
9330 if (!NT_SUCCESS(Status
))
9332 TRACE("failed with status 0x%08lx\n", Status
);
9336 /* Set NTPwdHistory attribute*/
9337 Status
= SampSetObjectAttribute(UserObject
,
9342 if (!NT_SUCCESS(Status
))
9344 TRACE("failed with status 0x%08lx\n", Status
);
9348 /* Set the PrivateData attribute */
9349 Status
= SampSetObjectAttributeString(UserObject
,
9352 if (!NT_SUCCESS(Status
))
9354 TRACE("failed with status 0x%08lx\n", Status
);
9358 /* Set the SecDesc attribute*/
9359 Status
= SampSetObjectAttribute(UserObject
,
9364 if (!NT_SUCCESS(Status
))
9366 TRACE("failed with status 0x%08lx\n", Status
);
9370 if (NT_SUCCESS(Status
))
9372 *UserHandle
= (SAMPR_HANDLE
)UserObject
;
9373 *RelativeId
= ulRid
;
9374 *GrantedAccess
= UserObject
->Access
;
9379 RtlFreeHeap(RtlGetProcessHeap(), 0, Sd
);
9381 if (UserSid
!= NULL
)
9382 RtlFreeHeap(RtlGetProcessHeap(), 0, UserSid
);
9384 RtlReleaseResource(&SampResource
);
9386 TRACE("returns with status 0x%08lx\n", Status
);
9395 SamrQueryDisplayInformation3(IN SAMPR_HANDLE DomainHandle
,
9396 IN DOMAIN_DISPLAY_INFORMATION DisplayInformationClass
,
9397 IN
unsigned long Index
,
9398 IN
unsigned long EntryCount
,
9399 IN
unsigned long PreferredMaximumLength
,
9400 OUT
unsigned long *TotalAvailable
,
9401 OUT
unsigned long *TotalReturned
,
9402 OUT PSAMPR_DISPLAY_INFO_BUFFER Buffer
)
9404 TRACE("%p %lu %lu %lu %lu %p %p %p\n",
9405 DomainHandle
, DisplayInformationClass
, Index
,
9406 EntryCount
, PreferredMaximumLength
, TotalAvailable
,
9407 TotalReturned
, Buffer
);
9409 return SamrQueryDisplayInformation(DomainHandle
,
9410 DisplayInformationClass
,
9413 PreferredMaximumLength
,
9423 SamrAddMultipleMembersToAlias(IN SAMPR_HANDLE AliasHandle
,
9424 IN PSAMPR_PSID_ARRAY MembersBuffer
)
9427 NTSTATUS Status
= STATUS_SUCCESS
;
9429 TRACE("SamrAddMultipleMembersToAlias(%p %p)\n",
9430 AliasHandle
, MembersBuffer
);
9432 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
9434 Status
= SamrAddMemberToAlias(AliasHandle
,
9435 ((PSID
*)MembersBuffer
->Sids
)[i
]);
9437 if (Status
== STATUS_MEMBER_IN_ALIAS
)
9438 Status
= STATUS_SUCCESS
;
9440 if (!NT_SUCCESS(Status
))
9451 SamrRemoveMultipleMembersFromAlias(IN SAMPR_HANDLE AliasHandle
,
9452 IN PSAMPR_PSID_ARRAY MembersBuffer
)
9455 NTSTATUS Status
= STATUS_SUCCESS
;
9457 TRACE("SamrRemoveMultipleMembersFromAlias(%p %p)\n",
9458 AliasHandle
, MembersBuffer
);
9460 for (i
= 0; i
< MembersBuffer
->Count
; i
++)
9462 Status
= SamrRemoveMemberFromAlias(AliasHandle
,
9463 ((PSID
*)MembersBuffer
->Sids
)[i
]);
9465 if (Status
== STATUS_MEMBER_IN_ALIAS
)
9466 Status
= STATUS_SUCCESS
;
9468 if (!NT_SUCCESS(Status
))
9479 SamrOemChangePasswordUser2(IN handle_t BindingHandle
,
9480 IN PRPC_STRING ServerName
,
9481 IN PRPC_STRING UserName
,
9482 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
9483 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewLm
)
9486 return STATUS_NOT_IMPLEMENTED
;
9492 SamrUnicodeChangePasswordUser2(IN handle_t BindingHandle
,
9493 IN PRPC_UNICODE_STRING ServerName
,
9494 IN PRPC_UNICODE_STRING UserName
,
9495 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldNt
,
9496 IN PENCRYPTED_NT_OWF_PASSWORD OldNtOwfPasswordEncryptedWithNewNt
,
9497 IN
unsigned char LmPresent
,
9498 IN PSAMPR_ENCRYPTED_USER_PASSWORD NewPasswordEncryptedWithOldLm
,
9499 IN PENCRYPTED_LM_OWF_PASSWORD OldLmOwfPasswordEncryptedWithNewNt
)
9502 return STATUS_NOT_IMPLEMENTED
;
9509 SamrGetDomainPasswordInformation(IN handle_t BindingHandle
,
9510 IN PRPC_UNICODE_STRING Unused
,
9511 OUT PUSER_DOMAIN_PASSWORD_INFORMATION PasswordInformation
)
9513 SAMPR_HANDLE ServerHandle
= NULL
;
9514 PSAM_DB_OBJECT DomainObject
= NULL
;
9515 SAM_DOMAIN_FIXED_DATA FixedData
;
9519 TRACE("(%p %p %p)\n", BindingHandle
, Unused
, PasswordInformation
);
9521 Status
= SamrConnect(NULL
,
9523 SAM_SERVER_LOOKUP_DOMAIN
);
9524 if (!NT_SUCCESS(Status
))
9526 TRACE("SamrConnect() failed (Status 0x%08lx)\n", Status
);
9530 Status
= SampOpenDbObject((PSAM_DB_OBJECT
)ServerHandle
,
9535 DOMAIN_READ_PASSWORD_PARAMETERS
,
9537 if (!NT_SUCCESS(Status
))
9539 TRACE("SampOpenDbObject() failed (Status 0x%08lx)\n", Status
);
9543 Length
= sizeof(SAM_DOMAIN_FIXED_DATA
);
9544 Status
= SampGetObjectAttribute(DomainObject
,
9549 if (!NT_SUCCESS(Status
))
9551 TRACE("SampGetObjectAttribute() failed (Status 0x%08lx)\n", Status
);
9555 PasswordInformation
->MinPasswordLength
= FixedData
.MinPasswordLength
;
9556 PasswordInformation
->PasswordProperties
= FixedData
.PasswordProperties
;
9559 if (DomainObject
!= NULL
)
9560 SampCloseDbObject(DomainObject
);
9562 if (ServerHandle
!= NULL
)
9563 SamrCloseHandle(ServerHandle
);
9572 SamrConnect2(IN PSAMPR_SERVER_NAME ServerName
,
9573 OUT SAMPR_HANDLE
*ServerHandle
,
9574 IN ACCESS_MASK DesiredAccess
)
9576 TRACE("(%p %p %lx)\n", ServerName
, ServerHandle
, DesiredAccess
);
9578 return SamrConnect(ServerName
,
9587 SamrSetInformationUser2(IN SAMPR_HANDLE UserHandle
,
9588 IN USER_INFORMATION_CLASS UserInformationClass
,
9589 IN PSAMPR_USER_INFO_BUFFER Buffer
)
9591 TRACE("(%p %lu %p)\n", UserHandle
, UserInformationClass
, Buffer
);
9593 return SamrSetInformationUser(UserHandle
,
9594 UserInformationClass
,
9602 SamrSetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
9605 return STATUS_NOT_IMPLEMENTED
;
9611 SamrGetBootKeyInformation(IN handle_t BindingHandle
) /* FIXME */
9614 return STATUS_NOT_IMPLEMENTED
;
9620 SamrConnect3(IN handle_t BindingHandle
) /* FIXME */
9623 return STATUS_NOT_IMPLEMENTED
;
9629 SamrConnect4(IN PSAMPR_SERVER_NAME ServerName
,
9630 OUT SAMPR_HANDLE
*ServerHandle
,
9631 IN
unsigned long ClientRevision
,
9632 IN ACCESS_MASK DesiredAccess
)
9635 return STATUS_NOT_IMPLEMENTED
;
9641 SamrUnicodeChangePasswordUser3(IN handle_t BindingHandle
) /* FIXME */
9644 return STATUS_NOT_IMPLEMENTED
;
9650 SamrConnect5(IN PSAMPR_SERVER_NAME ServerName
,
9651 IN ACCESS_MASK DesiredAccess
,
9652 IN
unsigned long InVersion
,
9653 IN SAMPR_REVISION_INFO
*InRevisionInfo
,
9654 OUT
unsigned long *OutVersion
,
9655 OUT SAMPR_REVISION_INFO
*OutRevisionInfo
,
9656 OUT SAMPR_HANDLE
*ServerHandle
)
9659 return STATUS_NOT_IMPLEMENTED
;
9665 SamrRidToSid(IN SAMPR_HANDLE ObjectHandle
,
9666 IN
unsigned long Rid
,
9670 return STATUS_NOT_IMPLEMENTED
;
9676 SamrSetDSRMPassword(IN handle_t BindingHandle
,
9677 IN PRPC_UNICODE_STRING Unused
,
9678 IN
unsigned long UserId
,
9679 IN PENCRYPTED_NT_OWF_PASSWORD EncryptedNtOwfPassword
)
9682 return STATUS_NOT_IMPLEMENTED
;
9688 SamrValidatePassword(IN handle_t Handle
,
9689 IN PASSWORD_POLICY_VALIDATION_TYPE ValidationType
,
9690 IN PSAM_VALIDATE_INPUT_ARG InputArg
,
9691 OUT PSAM_VALIDATE_OUTPUT_ARG
*OutputArg
)
9694 return STATUS_NOT_IMPLEMENTED
;