Author: ekohl Date: Sun Jan 26 10:43:58 2014 New Revision: 61826
URL: http://svn.reactos.org/svn/reactos?rev=61826&view=rev Log: [MSV1_0] MsvpChangePassword: Open the SAM domain and user objects that represent the logon domain and user account.
Modified: trunk/reactos/dll/win32/msv1_0/msv1_0.c trunk/reactos/dll/win32/msv1_0/msv1_0.h
Modified: trunk/reactos/dll/win32/msv1_0/msv1_0.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msv1_0/msv1_0.c?r... ============================================================================== --- trunk/reactos/dll/win32/msv1_0/msv1_0.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msv1_0/msv1_0.c [iso-8859-1] Sun Jan 26 10:43:58 2014 @@ -428,6 +428,15 @@ PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer; ULONG_PTR PtrOffset;
+ SAMPR_HANDLE ServerHandle = NULL; + SAMPR_HANDLE DomainHandle = NULL; + SAMPR_HANDLE UserHandle = NULL; + PRPC_SID DomainSid = NULL; + RPC_UNICODE_STRING Names[1]; + SAMPR_ULONG_ARRAY RelativeIds = {0, NULL}; + SAMPR_ULONG_ARRAY Use = {0, NULL}; + NTSTATUS Status; + TRACE("()\n");
RequestBuffer = (PMSV1_0_CHANGEPASSWORD_REQUEST)ProtocolSubmitBuffer; @@ -445,8 +454,113 @@ TRACE("Old Password: %S\n", RequestBuffer->OldPassword.Buffer); TRACE("New Password: %S\n", RequestBuffer->NewPassword.Buffer);
- - return STATUS_SUCCESS; + /* Connect to the SAM server */ + Status = SamIConnect(NULL, + &ServerHandle, + SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN, + TRUE); + if (!NT_SUCCESS(Status)) + { + TRACE("SamIConnect() failed (Status 0x%08lx)\n", Status); + goto done; + } + + /* Get the domain SID */ + Status = SamrLookupDomainInSamServer(ServerHandle, + (PRPC_UNICODE_STRING)&RequestBuffer->DomainName, + &DomainSid); + if (!NT_SUCCESS(Status)) + { + TRACE("SamrLookupDomainInSamServer failed (Status %08lx)\n", Status); + goto done; + } + + /* Open the domain */ + Status = SamrOpenDomain(ServerHandle, + DOMAIN_LOOKUP, + DomainSid, + &DomainHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("SamrOpenDomain failed (Status %08lx)\n", Status); + goto done; + } + + Names[0].Length = RequestBuffer->AccountName.Length; + Names[0].MaximumLength = RequestBuffer->AccountName.MaximumLength; + Names[0].Buffer = RequestBuffer->AccountName.Buffer; + + /* Try to get the RID for the user name */ + Status = SamrLookupNamesInDomain(DomainHandle, + 1, + Names, + &RelativeIds, + &Use); + if (!NT_SUCCESS(Status)) + { + TRACE("SamrLookupNamesInDomain failed (Status %08lx)\n", Status); + Status = STATUS_NO_SUCH_USER; + goto done; + } + + /* Fail, if it is not a user account */ + if (Use.Element[0] != SidTypeUser) + { + TRACE("Account is not a user account!\n"); + Status = STATUS_NO_SUCH_USER; + goto done; + } + + /* Open the user object */ + Status = SamrOpenUser(DomainHandle, + USER_CHANGE_PASSWORD, + RelativeIds.Element[0], + &UserHandle); + if (!NT_SUCCESS(Status)) + { + TRACE("SamrOpenUser failed (Status %08lx)\n", Status); + goto done; + } + + + +#if 0 + /* Change the password */ + Status = SamrChangePasswordUser(UserHandle, + IN unsigned char LmPresent, + IN PENCRYPTED_LM_OWF_PASSWORD OldLmEncryptedWithNewLm, + IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithOldLm, + IN unsigned char NtPresent, + IN PENCRYPTED_NT_OWF_PASSWORD OldNtEncryptedWithNewNt, + IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithOldNt, + IN unsigned char NtCrossEncryptionPresent, + IN PENCRYPTED_NT_OWF_PASSWORD NewNtEncryptedWithNewLm, + IN unsigned char LmCrossEncryptionPresent, + IN PENCRYPTED_LM_OWF_PASSWORD NewLmEncryptedWithNewNt) + if (!NT_SUCCESS(Status)) + { + TRACE("SamrChangePasswordUser failed (Status %08lx)\n", Status); + goto done; + } +#endif + +done: + if (UserHandle != NULL) + SamrCloseHandle(&UserHandle); + + SamIFree_SAMPR_ULONG_ARRAY(&RelativeIds); + SamIFree_SAMPR_ULONG_ARRAY(&Use); + + if (DomainHandle != NULL) + SamrCloseHandle(&DomainHandle); + + if (DomainSid != NULL) + SamIFreeVoid(DomainSid); + + if (ServerHandle != NULL) + SamrCloseHandle(&ServerHandle); + + return Status; }
Modified: trunk/reactos/dll/win32/msv1_0/msv1_0.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msv1_0/msv1_0.h?r... ============================================================================== --- trunk/reactos/dll/win32/msv1_0/msv1_0.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msv1_0/msv1_0.h [iso-8859-1] Sun Jan 26 10:43:58 2014 @@ -173,6 +173,10 @@
VOID NTAPI +SamIFreeVoid(PVOID Ptr); + +VOID +NTAPI SamIFree_SAMPR_ULONG_ARRAY(PSAMPR_ULONG_ARRAY Ptr);
VOID @@ -183,6 +187,12 @@ NTSTATUS NTAPI SamrCloseHandle(IN OUT SAMPR_HANDLE *SamHandle); + +NTSTATUS +NTAPI +SamrLookupDomainInSamServer(IN SAMPR_HANDLE ServerHandle, + IN PRPC_UNICODE_STRING Name, + OUT PRPC_SID *DomainId);
NTSTATUS NTAPI