mirror of
https://github.com/reactos/reactos.git
synced 2025-06-03 00:10:39 +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;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
|
||||
|
@ -5570,7 +5577,14 @@ SampQueryUserAccount(PSAM_DB_OBJECT UserObject,
|
|||
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;
|
||||
|
||||
|
@ -5613,7 +5627,51 @@ done:
|
|||
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
|
||||
NTSTATUS
|
||||
|
@ -6363,14 +6421,21 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
|||
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.HighPart = FixedData.LastLogon.HighPart;
|
||||
|
||||
InfoBuffer->All.LastLogoff.LowPart = FixedData.LastLogoff.LowPart;
|
||||
InfoBuffer->All.LastLogoff.HighPart = FixedData.LastLogoff.HighPart;
|
||||
|
||||
// USER_ALL_LOGONHOURS
|
||||
|
||||
InfoBuffer->All.BadPasswordCount = FixedData.BadPasswordCount;
|
||||
|
||||
InfoBuffer->All.LogonCount = FixedData.LogonCount;
|
||||
|
@ -6385,7 +6450,8 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
|||
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_HOMEDIRECTORYDRIVE |
|
||||
USER_ALL_SCRIPTPATH |
|
||||
|
@ -6393,11 +6459,12 @@ SampQueryUserAll(PSAM_DB_OBJECT UserObject,
|
|||
USER_ALL_WORKSTATIONS |
|
||||
USER_ALL_LASTLOGON |
|
||||
USER_ALL_LASTLOGOFF |
|
||||
// USER_ALL_LOGONHOURS |
|
||||
USER_ALL_LOGONHOURS |
|
||||
USER_ALL_BADPASSWORDCOUNT |
|
||||
USER_ALL_LOGONCOUNT;
|
||||
USER_ALL_PASSWORDCANCHANGE |
|
||||
USER_ALL_PASSWORDMUSTCHANGE;
|
||||
*/
|
||||
}
|
||||
|
||||
if (UserObject->Access & USER_READ_ACCOUNT)
|
||||
|
@ -6575,10 +6642,10 @@ SamrQueryInformationUser(IN SAMPR_HANDLE UserHandle,
|
|||
Buffer);
|
||||
break;
|
||||
|
||||
// case UserLogonHoursInformation:
|
||||
// Status = SampQueryUserLogonHours(UserObject,
|
||||
// Buffer);
|
||||
// break;
|
||||
case UserLogonHoursInformation:
|
||||
Status = SampQueryUserLogonHours(UserObject,
|
||||
Buffer);
|
||||
break;
|
||||
|
||||
case UserAccountInformation:
|
||||
Status = SampQueryUserAccount(UserObject,
|
||||
|
|
|
@ -326,4 +326,8 @@ SampSetUserPassword(IN PSAM_DB_OBJECT UserObject,
|
|||
IN PENCRYPTED_LM_OWF_PASSWORD LmPassword,
|
||||
IN BOOLEAN LmPasswordPresent);
|
||||
|
||||
NTSTATUS
|
||||
SampGetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject,
|
||||
IN PSAMPR_LOGON_HOURS LogonHours);
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -581,4 +581,74 @@ done:
|
|||
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 */
|
||||
|
|
|
@ -469,8 +469,7 @@ cpp_quote("#endif")
|
|||
typedef struct _SAMPR_LOGON_HOURS
|
||||
{
|
||||
unsigned short UnitsPerWeek;
|
||||
// [size_is(1260), length_is((UnitsPerWeek + 7) / 8)] unsigned char *LogonHours; // FIXME
|
||||
[size_is(1260)] unsigned char *LogonHours;
|
||||
[size_is(1260), length_is((UnitsPerWeek + 7) / 8)] unsigned char *LogonHours; // FIXME
|
||||
} SAMPR_LOGON_HOURS, *PSAMPR_LOGON_HOURS;
|
||||
|
||||
typedef struct _SAMPR_USER_ALL_INFORMATION
|
||||
|
|
Loading…
Reference in a new issue