mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 16:32:57 +00:00
[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. svn path=/trunk/; revision=62364
This commit is contained in:
parent
de68f2df0f
commit
2d1a100b57
1 changed files with 143 additions and 11 deletions
|
@ -250,6 +250,28 @@ GetPasswordAge(IN PLARGE_INTEGER PasswordLastSet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
NET_API_STATUS
|
NET_API_STATUS
|
||||||
GetUserDacl(IN SAM_HANDLE UserHandle,
|
GetUserDacl(IN SAM_HANDLE UserHandle,
|
||||||
|
@ -1511,6 +1533,7 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
PUSER_INFO_2 UserInfo2;
|
PUSER_INFO_2 UserInfo2;
|
||||||
PUSER_INFO_3 UserInfo3;
|
PUSER_INFO_3 UserInfo3;
|
||||||
PUSER_INFO_4 UserInfo4;
|
PUSER_INFO_4 UserInfo4;
|
||||||
|
PUSER_INFO_22 UserInfo22;
|
||||||
PUSER_INFO_1003 UserInfo1003;
|
PUSER_INFO_1003 UserInfo1003;
|
||||||
PUSER_INFO_1006 UserInfo1006;
|
PUSER_INFO_1006 UserInfo1006;
|
||||||
PUSER_INFO_1007 UserInfo1007;
|
PUSER_INFO_1007 UserInfo1007;
|
||||||
|
@ -1527,11 +1550,20 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
PUSER_INFO_1051 UserInfo1051;
|
PUSER_INFO_1051 UserInfo1051;
|
||||||
PUSER_INFO_1052 UserInfo1052;
|
PUSER_INFO_1052 UserInfo1052;
|
||||||
PUSER_INFO_1053 UserInfo1053;
|
PUSER_INFO_1053 UserInfo1053;
|
||||||
|
PACL Dacl = NULL;
|
||||||
NET_API_STATUS ApiStatus = NERR_Success;
|
NET_API_STATUS ApiStatus = NERR_Success;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
ZeroMemory(&UserAllInfo, sizeof(USER_ALL_INFORMATION));
|
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)
|
switch (Level)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -1574,6 +1606,7 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
|
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChangeUserDacl(Dacl, UserInfo1->usri1_flags);
|
||||||
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1->usri1_flags);
|
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1->usri1_flags);
|
||||||
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
||||||
|
|
||||||
|
@ -1616,6 +1649,7 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
|
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChangeUserDacl(Dacl, UserInfo2->usri2_flags);
|
||||||
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo2->usri2_flags);
|
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo2->usri2_flags);
|
||||||
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
||||||
|
|
||||||
|
@ -1718,6 +1752,7 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
|
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChangeUserDacl(Dacl, UserInfo3->usri3_flags);
|
||||||
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo3->usri3_flags);
|
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo3->usri3_flags);
|
||||||
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
||||||
|
|
||||||
|
@ -1842,6 +1877,7 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
|
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChangeUserDacl(Dacl, UserInfo4->usri4_flags);
|
||||||
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo4->usri4_flags);
|
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo4->usri4_flags);
|
||||||
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
||||||
|
|
||||||
|
@ -1899,8 +1935,8 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
|
|
||||||
// usri4_max_storage ignored
|
// usri4_max_storage ignored
|
||||||
|
|
||||||
// UserInfo3->usri4_units_per_week;
|
// UserInfo4->usri4_units_per_week;
|
||||||
// UserInfo3->usri4_logon_hours;
|
// UserInfo4->usri4_logon_hours;
|
||||||
|
|
||||||
// usri4_bad_pw_count ignored
|
// usri4_bad_pw_count ignored
|
||||||
// usri4_num_logons ignored
|
// usri4_num_logons ignored
|
||||||
|
@ -1936,7 +1972,104 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// case 21:
|
// 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:
|
case 1003:
|
||||||
UserInfo1003 = (PUSER_INFO_1003)UserInfo;
|
UserInfo1003 = (PUSER_INFO_1003)UserInfo;
|
||||||
|
@ -1951,6 +2084,7 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// case 1005:
|
// case 1005:
|
||||||
|
// break;
|
||||||
|
|
||||||
case 1006:
|
case 1006:
|
||||||
UserInfo1006 = (PUSER_INFO_1006)UserInfo;
|
UserInfo1006 = (PUSER_INFO_1006)UserInfo;
|
||||||
|
@ -1976,6 +2110,7 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
|
|
||||||
case 1008:
|
case 1008:
|
||||||
UserInfo1008 = (PUSER_INFO_1008)UserInfo;
|
UserInfo1008 = (PUSER_INFO_1008)UserInfo;
|
||||||
|
ChangeUserDacl(Dacl, UserInfo1008->usri1008_flags);
|
||||||
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1008->usri1008_flags);
|
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1008->usri1008_flags);
|
||||||
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
|
||||||
break;
|
break;
|
||||||
|
@ -1992,6 +2127,7 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// case 1010:
|
// case 1010:
|
||||||
|
// break;
|
||||||
|
|
||||||
case 1011:
|
case 1011:
|
||||||
UserInfo1011 = (PUSER_INFO_1011)UserInfo;
|
UserInfo1011 = (PUSER_INFO_1011)UserInfo;
|
||||||
|
@ -2064,6 +2200,7 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// case 1020:
|
// case 1020:
|
||||||
|
// break;
|
||||||
|
|
||||||
case 1024:
|
case 1024:
|
||||||
UserInfo1024 = (PUSER_INFO_1024)UserInfo;
|
UserInfo1024 = (PUSER_INFO_1024)UserInfo;
|
||||||
|
@ -2124,6 +2261,9 @@ SetUserInfo(SAM_HANDLE UserHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
if (Dacl != NULL)
|
||||||
|
HeapFree(GetProcessHeap(), 0, Dacl);
|
||||||
|
|
||||||
return ApiStatus;
|
return ApiStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2934,14 +3074,6 @@ done:
|
||||||
// *bufptr = (LPBYTE)Buffer;
|
// *bufptr = (LPBYTE)Buffer;
|
||||||
|
|
||||||
return ApiStatus;
|
return ApiStatus;
|
||||||
|
|
||||||
#if 0
|
|
||||||
*bufptr = NULL;
|
|
||||||
*entriesread = 0;
|
|
||||||
*totalentries = 0;
|
|
||||||
|
|
||||||
return ERROR_INVALID_LEVEL;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue