[SAMSRV]
authorEric Kohl <eric.kohl@reactos.org>
Sat, 30 Jun 2012 21:10:39 +0000 (21:10 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 30 Jun 2012 21:10:39 +0000 (21:10 +0000)
SamrSetInformationUser: Implement most information classes.

svn path=/trunk/; revision=56815

reactos/dll/win32/samsrv/samrpc.c

index b3426d4..11d4442 100644 (file)
@@ -2177,27 +2177,6 @@ SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle,
     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 @@ SamrSetInformationUser(IN SAMPR_HANDLE UserHandle,
                        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 @@ SamrSetInformationUser(IN SAMPR_HANDLE UserHandle,
 
     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);
+            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;