- 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:
Eric Kohl 2013-03-31 12:27:50 +00:00
parent 8792f3ef30
commit c9fd3ba4bc
4 changed files with 153 additions and 13 deletions

View file

@ -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,

View file

@ -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 */

View file

@ -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 */

View file

@ -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