Author: ekohl Date: Sat Jun 30 21:10:39 2012 New Revision: 56815
URL: http://svn.reactos.org/svn/reactos?rev=56815&view=rev Log: [SAMSRV] SamrSetInformationUser: Implement most information classes.
Modified: trunk/reactos/dll/win32/samsrv/samrpc.c
Modified: trunk/reactos/dll/win32/samsrv/samrpc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/samrpc.c?r... ============================================================================== --- trunk/reactos/dll/win32/samsrv/samrpc.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/samsrv/samrpc.c [iso-8859-1] Sat Jun 30 21:10:39 2012 @@ -2177,27 +2177,6 @@ return STATUS_NOT_IMPLEMENTED; }
- -static -NTSTATUS -SampSetPasswordInformation(PSAM_DB_OBJECT UserObject, - PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordInfo) -{ - NTSTATUS Status; - - TRACE("Password: %S\n", PasswordInfo->Password.Buffer); - TRACE("PasswordExpired: %d\n", PasswordInfo->PasswordExpired); - - Status = SampSetObjectAttribute(UserObject, - L"Password", - REG_SZ, - PasswordInfo->Password.Buffer, - PasswordInfo->Password.MaximumLength); - - return Status; -} - - /* Function 37 */ NTSTATUS NTAPI @@ -2206,15 +2185,40 @@ IN PSAMPR_USER_INFO_BUFFER Buffer) { PSAM_DB_OBJECT UserObject; + ACCESS_MASK DesiredAccess; NTSTATUS Status;
TRACE("SamrSetInformationUser(%p %lu %p)\n", UserHandle, UserInformationClass, Buffer); + + switch (UserInformationClass) + { + case UserNameInformation: + case UserAccountNameInformation: + case UserFullNameInformation: + case UserPrimaryGroupInformation: + case UserHomeInformation: + case UserScriptInformation: + case UserProfileInformation: + case UserAdminCommentInformation: + case UserWorkStationsInformation: + case UserControlInformation: + case UserExpiresInformation: + DesiredAccess = USER_WRITE_ACCOUNT; + break; + + case UserSetPasswordInformation: + DesiredAccess = USER_FORCE_PASSWORD_CHANGE; + break; + + default: + return STATUS_INVALID_INFO_CLASS; + }
/* Validate the domain handle */ Status = SampValidateDbObject(UserHandle, SamDbUserObject, - USER_FORCE_PASSWORD_CHANGE, + DesiredAccess, &UserObject); if (!NT_SUCCESS(Status)) { @@ -2224,14 +2228,135 @@
switch (UserInformationClass) { +// case UserGeneralInformation: +// case UserPreferencesInformation: +// case UserLogonHoursInformation: + + case UserNameInformation: + Status = SampSetObjectAttribute(UserObject, + L"Name", + REG_SZ, + Buffer->Name.UserName.Buffer, + Buffer->Name.UserName.MaximumLength); + if (!NT_SUCCESS(Status)) + break; + + Status = SampSetObjectAttribute(UserObject, + L"FullName", + REG_SZ, + Buffer->Name.FullName.Buffer, + Buffer->Name.FullName.MaximumLength); + break; + + case UserAccountNameInformation: + Status = SampSetObjectAttribute(UserObject, + L"Name", + REG_SZ, + Buffer->AccountName.UserName.Buffer, + Buffer->AccountName.UserName.MaximumLength); + break; + + case UserFullNameInformation: + Status = SampSetObjectAttribute(UserObject, + L"FullName", + REG_SZ, + Buffer->FullName.FullName.Buffer, + Buffer->FullName.FullName.MaximumLength); + break; + + case UserPrimaryGroupInformation: + Status = SampSetObjectAttribute(UserObject, + L"PrimaryGroupId", + REG_DWORD, + &Buffer->PrimaryGroup.PrimaryGroupId, + sizeof(ULONG)); + break; + + case UserHomeInformation: + Status = SampSetObjectAttribute(UserObject, + L"HomeDirectory", + REG_SZ, + Buffer->Home.HomeDirectory.Buffer, + Buffer->Home.HomeDirectory.MaximumLength); + if (!NT_SUCCESS(Status)) + break; + + Status = SampSetObjectAttribute(UserObject, + L"HomeDirectoryDrive", + REG_SZ, + Buffer->Home.HomeDirectoryDrive.Buffer, + Buffer->Home.HomeDirectoryDrive.MaximumLength); + break; + + case UserScriptInformation: + Status = SampSetObjectAttribute(UserObject, + L"ScriptPath", + REG_SZ, + Buffer->Script.ScriptPath.Buffer, + Buffer->Script.ScriptPath.MaximumLength); + break; + + case UserProfileInformation: + Status = SampSetObjectAttribute(UserObject, + L"ProfilePath", + REG_SZ, + Buffer->Profile.ProfilePath.Buffer, + Buffer->Profile.ProfilePath.MaximumLength); + break; + + case UserAdminCommentInformation: + Status = SampSetObjectAttribute(UserObject, + L"AdminComment", + REG_SZ, + Buffer->AdminComment.AdminComment.Buffer, + Buffer->AdminComment.AdminComment.MaximumLength); + break; + + case UserWorkStationsInformation: + Status = SampSetObjectAttribute(UserObject, + L"WorkStations", + REG_SZ, + Buffer->WorkStations.WorkStations.Buffer, + Buffer->WorkStations.WorkStations.MaximumLength); + break; + case UserSetPasswordInformation: - Status = SampSetPasswordInformation(UserObject, - (PSAMPR_USER_SET_PASSWORD_INFORMATION)Buffer); - break; + TRACE("Password: %S\n", Buffer->SetPassword.Password.Buffer); + TRACE("PasswordExpired: %d\n", Buffer->SetPassword.PasswordExpired); + + Status = SampSetObjectAttribute(UserObject, + L"Password", + REG_SZ, + Buffer->SetPassword.Password.Buffer, + Buffer->SetPassword.Password.MaximumLength); + break; + + case UserControlInformation: + Status = SampSetObjectAttribute(UserObject, + L"UserAccountControl", + REG_DWORD, + &Buffer->Control.UserAccountControl, + sizeof(ULONG)); + break; + + case UserExpiresInformation: + Status = SampSetObjectAttribute(UserObject, + L"AccountExpires", + REG_BINARY, + &Buffer->Expires.AccountExpires, + sizeof(OLD_LARGE_INTEGER)); + break; + +// case UserInternal1Information: +// case UserParametersInformation: +// case UserAllInformation: +// case UserInternal4Information: +// case UserInternal5Information: +// case UserInternal4InformationNew: +// case UserInternal5InformationNew:
default: Status = STATUS_INVALID_INFO_CLASS; - break; }
return Status;