mirror of
https://github.com/reactos/reactos.git
synced 2025-06-10 04:14:53 +00:00
[SAMSRV]
Calculate PasswordCanChange and PasswordMustChange time for SamQueryInformationUser.UserLogonInformation and SamQueryInformationUser.UserAllInformation. svn path=/trunk/; revision=58560
This commit is contained in:
parent
cbfb30da1c
commit
936f15a924
1 changed files with 64 additions and 6 deletions
|
@ -62,6 +62,22 @@ PGENERIC_MAPPING pServerMapping = &ServerMapping;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
static
|
||||||
|
LARGE_INTEGER
|
||||||
|
SampAddRelativeTimeToTime(IN LARGE_INTEGER AbsoluteTime,
|
||||||
|
IN LARGE_INTEGER RelativeTime)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER NewTime;
|
||||||
|
|
||||||
|
NewTime.QuadPart = AbsoluteTime.QuadPart - RelativeTime.QuadPart;
|
||||||
|
|
||||||
|
if (NewTime.QuadPart < 0)
|
||||||
|
NewTime.QuadPart = 0;
|
||||||
|
|
||||||
|
return NewTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
SampStartRpcServer(VOID)
|
SampStartRpcServer(VOID)
|
||||||
{
|
{
|
||||||
|
@ -5269,7 +5285,10 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject,
|
||||||
PSAMPR_USER_INFO_BUFFER *Buffer)
|
PSAMPR_USER_INFO_BUFFER *Buffer)
|
||||||
{
|
{
|
||||||
PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL;
|
PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL;
|
||||||
|
SAM_DOMAIN_FIXED_DATA DomainFixedData;
|
||||||
SAM_USER_FIXED_DATA FixedData;
|
SAM_USER_FIXED_DATA FixedData;
|
||||||
|
LARGE_INTEGER PasswordCanChange;
|
||||||
|
LARGE_INTEGER PasswordMustChange;
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
@ -5279,6 +5298,17 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject,
|
||||||
if (InfoBuffer == NULL)
|
if (InfoBuffer == NULL)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/* Get the fixed size domain data */
|
||||||
|
Length = sizeof(SAM_DOMAIN_FIXED_DATA);
|
||||||
|
Status = SampGetObjectAttribute(UserObject->ParentObject,
|
||||||
|
L"F",
|
||||||
|
NULL,
|
||||||
|
(PVOID)&DomainFixedData,
|
||||||
|
&Length);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
/* Get the fixed size user data */
|
||||||
Length = sizeof(SAM_USER_FIXED_DATA);
|
Length = sizeof(SAM_USER_FIXED_DATA);
|
||||||
Status = SampGetObjectAttribute(UserObject,
|
Status = SampGetObjectAttribute(UserObject,
|
||||||
L"F",
|
L"F",
|
||||||
|
@ -5300,8 +5330,15 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject,
|
||||||
InfoBuffer->Logon.LogonCount = FixedData.LogonCount;
|
InfoBuffer->Logon.LogonCount = FixedData.LogonCount;
|
||||||
InfoBuffer->Logon.UserAccountControl = FixedData.UserAccountControl;
|
InfoBuffer->Logon.UserAccountControl = FixedData.UserAccountControl;
|
||||||
|
|
||||||
// OLD_LARGE_INTEGER PasswordCanChange;
|
PasswordCanChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet,
|
||||||
// OLD_LARGE_INTEGER PasswordMustChange;
|
DomainFixedData.MinPasswordAge);
|
||||||
|
InfoBuffer->Logon.PasswordCanChange.LowPart = PasswordCanChange.LowPart;
|
||||||
|
InfoBuffer->Logon.PasswordCanChange.HighPart = PasswordCanChange.HighPart;
|
||||||
|
|
||||||
|
PasswordMustChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet,
|
||||||
|
DomainFixedData.MaxPasswordAge);
|
||||||
|
InfoBuffer->Logon.PasswordMustChange.LowPart = PasswordMustChange.LowPart;
|
||||||
|
InfoBuffer->Logon.PasswordMustChange.HighPart = PasswordMustChange.HighPart;
|
||||||
|
|
||||||
/* Get the Name string */
|
/* Get the Name string */
|
||||||
Status = SampGetObjectAttributeString(UserObject,
|
Status = SampGetObjectAttributeString(UserObject,
|
||||||
|
@ -6184,7 +6221,10 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
||||||
PSAMPR_USER_INFO_BUFFER *Buffer)
|
PSAMPR_USER_INFO_BUFFER *Buffer)
|
||||||
{
|
{
|
||||||
PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL;
|
PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL;
|
||||||
|
SAM_DOMAIN_FIXED_DATA DomainFixedData;
|
||||||
SAM_USER_FIXED_DATA FixedData;
|
SAM_USER_FIXED_DATA FixedData;
|
||||||
|
LARGE_INTEGER PasswordCanChange;
|
||||||
|
LARGE_INTEGER PasswordMustChange;
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
@ -6194,6 +6234,17 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
||||||
if (InfoBuffer == NULL)
|
if (InfoBuffer == NULL)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/* Get the fixed size domain data */
|
||||||
|
Length = sizeof(SAM_DOMAIN_FIXED_DATA);
|
||||||
|
Status = SampGetObjectAttribute(UserObject->ParentObject,
|
||||||
|
L"F",
|
||||||
|
NULL,
|
||||||
|
(PVOID)&DomainFixedData,
|
||||||
|
&Length);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
/* Get the fixed size user data */
|
||||||
Length = sizeof(SAM_USER_FIXED_DATA);
|
Length = sizeof(SAM_USER_FIXED_DATA);
|
||||||
Status = SampGetObjectAttribute(UserObject,
|
Status = SampGetObjectAttribute(UserObject,
|
||||||
L"F",
|
L"F",
|
||||||
|
@ -6324,8 +6375,15 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
||||||
|
|
||||||
InfoBuffer->All.LogonCount = FixedData.LogonCount;
|
InfoBuffer->All.LogonCount = FixedData.LogonCount;
|
||||||
|
|
||||||
// USER_ALL_PASSWORDCANCHANGE
|
PasswordCanChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet,
|
||||||
// USER_ALL_PASSWORDMUSTCHANGE
|
DomainFixedData.MinPasswordAge);
|
||||||
|
InfoBuffer->All.PasswordCanChange.LowPart = PasswordCanChange.LowPart;
|
||||||
|
InfoBuffer->All.PasswordCanChange.HighPart = PasswordCanChange.HighPart;
|
||||||
|
|
||||||
|
PasswordMustChange = SampAddRelativeTimeToTime(FixedData.PasswordLastSet,
|
||||||
|
DomainFixedData.MaxPasswordAge);
|
||||||
|
InfoBuffer->All.PasswordMustChange.LowPart = PasswordMustChange.LowPart;
|
||||||
|
InfoBuffer->All.PasswordMustChange.HighPart = PasswordMustChange.HighPart;
|
||||||
|
|
||||||
InfoBuffer->All. WhichFields |= /* USER_ALL_READ_LOGON_MASK; */
|
InfoBuffer->All. WhichFields |= /* USER_ALL_READ_LOGON_MASK; */
|
||||||
USER_ALL_HOMEDIRECTORY |
|
USER_ALL_HOMEDIRECTORY |
|
||||||
|
@ -6338,8 +6396,8 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
||||||
// USER_ALL_LOGONHOURS |
|
// USER_ALL_LOGONHOURS |
|
||||||
USER_ALL_BADPASSWORDCOUNT |
|
USER_ALL_BADPASSWORDCOUNT |
|
||||||
USER_ALL_LOGONCOUNT;
|
USER_ALL_LOGONCOUNT;
|
||||||
// USER_ALL_PASSWORDCANCHANGE |
|
USER_ALL_PASSWORDCANCHANGE |
|
||||||
// USER_ALL_PASSWORDMUSTCHANGE;
|
USER_ALL_PASSWORDMUSTCHANGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UserObject->Access & USER_READ_ACCOUNT)
|
if (UserObject->Access & USER_READ_ACCOUNT)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue