}
+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
NET_API_STATUS
GetUserDacl(IN SAM_HANDLE UserHandle,
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;
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)
{
case 0:
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
}
+ ChangeUserDacl(Dacl, UserInfo1->usri1_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1->usri1_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
}
+ ChangeUserDacl(Dacl, UserInfo2->usri2_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo2->usri2_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
}
+ ChangeUserDacl(Dacl, UserInfo3->usri3_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo3->usri3_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
UserAllInfo.WhichFields |= USER_ALL_ADMINCOMMENT;
}
+ ChangeUserDacl(Dacl, UserInfo4->usri4_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo4->usri4_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
// 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
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;
break;
// case 1005:
+// break;
case 1006:
UserInfo1006 = (PUSER_INFO_1006)UserInfo;
case 1008:
UserInfo1008 = (PUSER_INFO_1008)UserInfo;
+ ChangeUserDacl(Dacl, UserInfo1008->usri1008_flags);
UserAllInfo.UserAccountControl = GetAccountControl(UserInfo1008->usri1008_flags);
UserAllInfo.WhichFields |= USER_ALL_USERACCOUNTCONTROL;
break;
break;
// case 1010:
+// break;
case 1011:
UserInfo1011 = (PUSER_INFO_1011)UserInfo;
break;
// case 1020:
+// break;
case 1024:
UserInfo1024 = (PUSER_INFO_1024)UserInfo;
}
done:
+ if (Dacl != NULL)
+ HeapFree(GetProcessHeap(), 0, Dacl);
+
return ApiStatus;
}
// *bufptr = (LPBYTE)Buffer;
return ApiStatus;
-
-#if 0
- *bufptr = NULL;
- *entriesread = 0;
- *totalentries = 0;
-
- return ERROR_INVALID_LEVEL;
-#endif
}