mirror of
https://github.com/reactos/reactos.git
synced 2025-06-05 01:10:26 +00:00
[SAMSRV]
- Fix the SAMPR_LOGON_HOURS type description. - Implement the LogonHours attribute query code for all user query functions. svn path=/trunk/; revision=58629
This commit is contained in:
parent
8792f3ef30
commit
c9fd3ba4bc
4 changed files with 153 additions and 13 deletions
|
@ -5410,7 +5410,14 @@ SampQueryUserLogon(PSAM_DB_OBJECT UserObject,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: LogonHours */
|
/* Get the LogonHours attribute */
|
||||||
|
Status = SampGetLogonHoursAttrbute(UserObject,
|
||||||
|
&InfoBuffer->Logon.LogonHours);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("Status 0x%08lx\n", Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
*Buffer = InfoBuffer;
|
*Buffer = InfoBuffer;
|
||||||
|
|
||||||
|
@ -5570,7 +5577,14 @@ SampQueryUserAccount(PSAM_DB_OBJECT UserObject,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: LogonHours */
|
/* Get the LogonHours attribute */
|
||||||
|
Status = SampGetLogonHoursAttrbute(UserObject,
|
||||||
|
&InfoBuffer->Account.LogonHours);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("Status 0x%08lx\n", Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
*Buffer = InfoBuffer;
|
*Buffer = InfoBuffer;
|
||||||
|
|
||||||
|
@ -5613,7 +5627,51 @@ done:
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: SampQueryUserLogonHours */
|
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
SampQueryUserLogonHours(PSAM_DB_OBJECT UserObject,
|
||||||
|
PSAMPR_USER_INFO_BUFFER *Buffer)
|
||||||
|
{
|
||||||
|
PSAMPR_USER_INFO_BUFFER InfoBuffer = NULL;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("(%p %p)\n", UserObject, Buffer);
|
||||||
|
|
||||||
|
*Buffer = NULL;
|
||||||
|
|
||||||
|
InfoBuffer = midl_user_allocate(sizeof(SAMPR_USER_INFO_BUFFER));
|
||||||
|
if (InfoBuffer == NULL)
|
||||||
|
{
|
||||||
|
TRACE("Failed to allocate InfoBuffer!\n");
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = SampGetLogonHoursAttrbute(UserObject,
|
||||||
|
&InfoBuffer->LogonHours.LogonHours);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("SampGetLogonHoursAttrbute failed (Status 0x%08lx)\n", Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
*Buffer = InfoBuffer;
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
if (InfoBuffer != NULL)
|
||||||
|
{
|
||||||
|
if (InfoBuffer->LogonHours.LogonHours.LogonHours != NULL)
|
||||||
|
midl_user_free(InfoBuffer->LogonHours.LogonHours.LogonHours);
|
||||||
|
|
||||||
|
midl_user_free(InfoBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -6363,14 +6421,21 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get the LogonHours attribute */
|
||||||
|
Status = SampGetLogonHoursAttrbute(UserObject,
|
||||||
|
&InfoBuffer->All.LogonHours);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("Status 0x%08lx\n", Status);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
InfoBuffer->All.LastLogon.LowPart = FixedData.LastLogon.LowPart;
|
InfoBuffer->All.LastLogon.LowPart = FixedData.LastLogon.LowPart;
|
||||||
InfoBuffer->All.LastLogon.HighPart = FixedData.LastLogon.HighPart;
|
InfoBuffer->All.LastLogon.HighPart = FixedData.LastLogon.HighPart;
|
||||||
|
|
||||||
InfoBuffer->All.LastLogoff.LowPart = FixedData.LastLogoff.LowPart;
|
InfoBuffer->All.LastLogoff.LowPart = FixedData.LastLogoff.LowPart;
|
||||||
InfoBuffer->All.LastLogoff.HighPart = FixedData.LastLogoff.HighPart;
|
InfoBuffer->All.LastLogoff.HighPart = FixedData.LastLogoff.HighPart;
|
||||||
|
|
||||||
// USER_ALL_LOGONHOURS
|
|
||||||
|
|
||||||
InfoBuffer->All.BadPasswordCount = FixedData.BadPasswordCount;
|
InfoBuffer->All.BadPasswordCount = FixedData.BadPasswordCount;
|
||||||
|
|
||||||
InfoBuffer->All.LogonCount = FixedData.LogonCount;
|
InfoBuffer->All.LogonCount = FixedData.LogonCount;
|
||||||
|
@ -6385,7 +6450,8 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
||||||
InfoBuffer->All.PasswordMustChange.LowPart = PasswordMustChange.LowPart;
|
InfoBuffer->All.PasswordMustChange.LowPart = PasswordMustChange.LowPart;
|
||||||
InfoBuffer->All.PasswordMustChange.HighPart = PasswordMustChange.HighPart;
|
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 |
|
||||||
USER_ALL_HOMEDIRECTORYDRIVE |
|
USER_ALL_HOMEDIRECTORYDRIVE |
|
||||||
USER_ALL_SCRIPTPATH |
|
USER_ALL_SCRIPTPATH |
|
||||||
|
@ -6393,11 +6459,12 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
||||||
USER_ALL_WORKSTATIONS |
|
USER_ALL_WORKSTATIONS |
|
||||||
USER_ALL_LASTLOGON |
|
USER_ALL_LASTLOGON |
|
||||||
USER_ALL_LASTLOGOFF |
|
USER_ALL_LASTLOGOFF |
|
||||||
// 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)
|
||||||
|
@ -6575,10 +6642,10 @@ SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle,
|
||||||
Buffer);
|
Buffer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// case UserLogonHoursInformation:
|
case UserLogonHoursInformation:
|
||||||
// Status = SampQueryUserLogonHours(UserObject,
|
Status = SampQueryUserLogonHours(UserObject,
|
||||||
// Buffer);
|
Buffer);
|
||||||
// break;
|
break;
|
||||||
|
|
||||||
case UserAccountInformation:
|
case UserAccountInformation:
|
||||||
Status = SampQueryUserAccount(UserObject,
|
Status = SampQueryUserAccount(UserObject,
|
||||||
|
|
|
@ -326,4 +326,8 @@ SampSetUserPassword(IN PSAM_DB_OBJECT UserObject,
|
||||||
IN PENCRYPTED_LM_OWF_PASSWORD LmPassword,
|
IN PENCRYPTED_LM_OWF_PASSWORD LmPassword,
|
||||||
IN BOOLEAN LmPasswordPresent);
|
IN BOOLEAN LmPasswordPresent);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
SampGetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject,
|
||||||
|
IN PSAMPR_LOGON_HOURS LogonHours);
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -581,4 +581,74 @@ done:
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
SampGetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject,
|
||||||
|
IN PSAMPR_LOGON_HOURS LogonHours)
|
||||||
|
{
|
||||||
|
PUCHAR RawBuffer = NULL;
|
||||||
|
ULONG Length = 0;
|
||||||
|
ULONG BufferLength = 0;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
Status = SampGetObjectAttribute(UserObject,
|
||||||
|
L"LogonHours",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&Length);
|
||||||
|
if (Status != STATUS_BUFFER_OVERFLOW)
|
||||||
|
{
|
||||||
|
TRACE("SampGetObjectAttribute failed (Status 0x%08lx)\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
if (Length == 0)
|
||||||
|
{
|
||||||
|
LogonHours->UnitsPerWeek = 0;
|
||||||
|
LogonHours->LogonHours = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RawBuffer = midl_user_allocate(Length);
|
||||||
|
if (RawBuffer == NULL)
|
||||||
|
{
|
||||||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = SampGetObjectAttribute(UserObject,
|
||||||
|
L"LogonHours",
|
||||||
|
NULL,
|
||||||
|
(PVOID)RawBuffer,
|
||||||
|
&Length);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
LogonHours->UnitsPerWeek = *((PUSHORT)RawBuffer);
|
||||||
|
|
||||||
|
BufferLength = (((ULONG)LogonHours->UnitsPerWeek) + 7) / 8;
|
||||||
|
|
||||||
|
LogonHours->LogonHours = midl_user_allocate(BufferLength);
|
||||||
|
if (LogonHours->LogonHours == NULL)
|
||||||
|
{
|
||||||
|
TRACE("Failed to allocate LogonHours buffer!\n");
|
||||||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(LogonHours->LogonHours,
|
||||||
|
&(RawBuffer[2]),
|
||||||
|
BufferLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
|
||||||
|
if (RawBuffer != NULL)
|
||||||
|
midl_user_free(RawBuffer);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -469,8 +469,7 @@ cpp_quote("#endif")
|
||||||
typedef struct _SAMPR_LOGON_HOURS
|
typedef struct _SAMPR_LOGON_HOURS
|
||||||
{
|
{
|
||||||
unsigned short UnitsPerWeek;
|
unsigned short UnitsPerWeek;
|
||||||
// [size_is(1260), length_is((UnitsPerWeek + 7) / 8)] unsigned char *LogonHours; // FIXME
|
[size_is(1260), length_is((UnitsPerWeek + 7) / 8)] unsigned char *LogonHours; // FIXME
|
||||||
[size_is(1260)] unsigned char *LogonHours;
|
|
||||||
} SAMPR_LOGON_HOURS, *PSAMPR_LOGON_HOURS;
|
} SAMPR_LOGON_HOURS, *PSAMPR_LOGON_HOURS;
|
||||||
|
|
||||||
typedef struct _SAMPR_USER_ALL_INFORMATION
|
typedef struct _SAMPR_USER_ALL_INFORMATION
|
||||||
|
|
Loading…
Reference in a new issue