Author: ekohl Date: Sat Mar 1 11:37:23 2014 New Revision: 62364
URL: http://svn.reactos.org/svn/reactos?rev=62364&view=rev Log: [NETAPI32] - NetUserSetInfo: Implement the info level 22. - Update the users DACL according to the user flags for the info levels 1, 2, 3, 4, 22 and 1008.
Modified: trunk/reactos/dll/win32/netapi32/user.c
Modified: trunk/reactos/dll/win32/netapi32/user.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netapi32/user.c?r... ============================================================================== --- trunk/reactos/dll/win32/netapi32/user.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/netapi32/user.c [iso-8859-1] Sat Mar 1 11:37:23 2014 @@ -247,6 +247,28 @@ RtlTimeToSecondsSince1970(PasswordLastSet, &PasswordSecondsSince1970);
return SystemSecondsSince1970 - PasswordSecondsSince1970; +} + + +static +VOID +ChangeUserDacl(IN PACL Dacl, + IN ULONG Flags) +{ + PACCESS_ALLOWED_ACE Ace = NULL; + NTSTATUS Status; + + if (Dacl == NULL) + return; + + Status = GetAllowedWorldAce(Dacl, &Ace); + if (!NT_SUCCESS(Status)) + return; + + if (Flags & UF_PASSWD_CANT_CHANGE) + Ace->Mask &= ~USER_CHANGE_PASSWORD; + else + Ace->Mask |= USER_CHANGE_PASSWORD; }
@@ -1511,6 +1533,7 @@ PUSER_INFO_2 UserInfo2; PUSER_INFO_3 UserInfo3; PUSER_INFO_4 UserInfo4; + PUSER_INFO_22 UserInfo22; PUSER_INFO_1003 UserInfo1003; PUSER_INFO_1006 UserInfo1006; PUSER_INFO_1007 UserInfo1007; @@ -1527,10 +1550,19 @@ PUSER_INFO_1051 UserInfo1051; PUSER_INFO_1052 UserInfo1052; PUSER_INFO_1053 UserInfo1053; + PACL Dacl = NULL; NET_API_STATUS ApiStatus = NERR_Success; NTSTATUS Status = STATUS_SUCCESS;
ZeroMemory(&UserAllInfo, sizeof(USER_ALL_INFORMATION)); + + if ((Level == 1) || (Level == 2) || (Level == 3) || + (Level == 4) || (Level == 22) || (Level == 1008)) + { + ApiStatus = GetUserDacl(UserHandle, &Dacl); + if (ApiStatus != NERR_Success) + goto done; + }
switch (Level) { @@ -1574,6 +1606,7 @@ UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT; }
+ ChangeUserDacl(Dacl, UserInfo1->usri1_flags); UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1->usri1_flags); UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
@@ -1616,6 +1649,7 @@ UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT; }
+ ChangeUserDacl(Dacl, UserInfo2->usri2_flags); UserAllInfo.UserAccountControl = GetAccountControl(UserInfo2->usri2_flags); UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
@@ -1718,6 +1752,7 @@ UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT; }
+ ChangeUserDacl(Dacl, UserInfo3->usri3_flags); UserAllInfo.UserAccountControl = GetAccountControl(UserInfo3->usri3_flags); UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
@@ -1842,6 +1877,7 @@ UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT; }
+ ChangeUserDacl(Dacl, UserInfo4->usri4_flags); UserAllInfo.UserAccountControl = GetAccountControl(UserInfo4->usri4_flags); UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
@@ -1899,8 +1935,8 @@
// usri4_max_storage ignored
-// UserInfo3->usri4_units_per_week; -// UserInfo3->usri4_logon_hours; +// UserInfo4->usri4_units_per_week; +// UserInfo4->usri4_logon_hours;
// usri4_bad_pw_count ignored // usri4_num_logons ignored @@ -1936,7 +1972,104 @@ break;
// case 21: -// case 22: +// break; + + case 22: + UserInfo22 = (PUSER_INFO_22)UserInfo; + + // usri22_name ignored + +// UserInfo22->usri22_password[ENCRYPTED_PWLEN]; + + // usri22_password_age ignored + +// UserInfo3->usri3_priv; + + if (UserInfo22->usri22_home_dir != NULL) + { + RtlInitUnicodeString(&UserAllInfo.HomeDirectory, + UserInfo22->usri22_home_dir); + UserAllInfo.WhichFields |= USER_ALL_HOMEDIRECTORY; + } + + if (UserInfo22->usri22_comment != NULL) + { + RtlInitUnicodeString(&UserAllInfo.AdminComment, + UserInfo22->usri22_comment); + UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT; + } + + ChangeUserDacl(Dacl, UserInfo22->usri22_flags); + UserAllInfo.UserAccountControl = GetAccountControl(UserInfo22->usri22_flags); + UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL; + + if (UserInfo22->usri22_script_path != NULL) + { + RtlInitUnicodeString(&UserAllInfo.ScriptPath, + UserInfo22->usri22_script_path); + UserAllInfo.WhichFields |= USER_ALL_SCRIPTPATH; + } + +// UserInfo22->usri22_auth_flags; + + if (UserInfo22->usri22_full_name != NULL) + { + RtlInitUnicodeString(&UserAllInfo.FullName, + UserInfo22->usri22_full_name); + UserAllInfo.WhichFields |= USER_ALL_FULLNAME; + } + + if (UserInfo22->usri22_usr_comment != NULL) + { + RtlInitUnicodeString(&UserAllInfo.UserComment, + UserInfo22->usri22_usr_comment); + UserAllInfo.WhichFields |= USER_ALL_USERCOMMENT; + } + + if (UserInfo22->usri22_parms != NULL) + { + RtlInitUnicodeString(&UserAllInfo.Parameters, + UserInfo22->usri22_parms); + UserAllInfo.WhichFields |= USER_ALL_PARAMETERS; + } + + if (UserInfo22->usri22_workstations != NULL) + { + RtlInitUnicodeString(&UserAllInfo.WorkStations, + UserInfo22->usri22_workstations); + UserAllInfo.WhichFields |= USER_ALL_WORKSTATIONS; + } + + // usri22_last_logon ignored + // usri22_last_logoff ignored + + if (UserInfo22->usri22_acct_expires == TIMEQ_FOREVER) + { + UserAllInfo.AccountExpires.LowPart = 0; + UserAllInfo.AccountExpires.HighPart = 0; + } + else + { + RtlSecondsSince1970ToTime(UserInfo22->usri22_acct_expires, + &UserAllInfo.AccountExpires); + } + UserAllInfo.WhichFields |= USER_ALL_ACCOUNTEXPIRES; + + // usri22_max_storage ignored + +// UserInfo22->usri22_units_per_week; +// UserInfo22->usri22_logon_hours; + + // usri22_bad_pw_count ignored + // usri22_num_logons ignored + // usri22_logon_server ignored + + UserAllInfo.CountryCode = UserInfo22->usri22_country_code; + UserAllInfo.WhichFields |= USER_ALL_COUNTRYCODE; + + UserAllInfo.CodePage = UserInfo22->usri22_code_page; + UserAllInfo.WhichFields |= USER_ALL_CODEPAGE; + break;
case 1003: UserInfo1003 = (PUSER_INFO_1003)UserInfo; @@ -1951,6 +2084,7 @@ break;
// case 1005: +// break;
case 1006: UserInfo1006 = (PUSER_INFO_1006)UserInfo; @@ -1976,6 +2110,7 @@
case 1008: UserInfo1008 = (PUSER_INFO_1008)UserInfo; + ChangeUserDacl(Dacl, UserInfo1008->usri1008_flags); UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1008->usri1008_flags); UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL; break; @@ -1992,6 +2127,7 @@ break;
// case 1010: +// break;
case 1011: UserInfo1011 = (PUSER_INFO_1011)UserInfo; @@ -2064,6 +2200,7 @@ break;
// case 1020: +// break;
case 1024: UserInfo1024 = (PUSER_INFO_1024)UserInfo; @@ -2124,6 +2261,9 @@ }
done: + if (Dacl != NULL) + HeapFree(GetProcessHeap(), 0, Dacl); + return ApiStatus; }
@@ -2934,14 +3074,6 @@ // *bufptr = (LPBYTE)Buffer;
return ApiStatus; - -#if 0 - *bufptr = NULL; - *entriesread = 0; - *totalentries = 0; - - return ERROR_INVALID_LEVEL; -#endif }