SamrGetAliasMembership:
- Change requrred access right from DOMIN_LOOKUP to DOMAIN_GET_ALIAS_MEMBERSHIP.
- Handle the case properly where a user is not a member of any alias.
- Retrieve an alias members RID correctly.

svn path=/trunk/; revision=58094
This commit is contained in:
Eric Kohl 2013-01-01 22:04:41 +00:00
parent 23e600a0d7
commit cb52c27133

View file

@ -2877,6 +2877,7 @@ SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle,
ULONG DataLength;
ULONG i, j;
NTSTATUS Status;
WCHAR NameBuffer[9];
TRACE("SamrGetAliasMembership(%p %p %p)\n",
DomainHandle, SidArray, Membership);
@ -2884,7 +2885,7 @@ SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle,
/* Validate the domain handle */
Status = SampValidateDbObject(DomainHandle,
SamDbDomainObject,
DOMAIN_LOOKUP,
DOMAIN_GET_ALIAS_MEMBERSHIP,
&DomainObject);
if (!NT_SUCCESS(Status))
return Status;
@ -2902,6 +2903,13 @@ SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle,
KEY_READ,
&MembersKeyHandle);
TRACE("SampRegOpenKey returned %08lX\n", Status);
if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
{
Status = STATUS_SUCCESS;
goto done;
}
if (!NT_SUCCESS(Status))
goto done;
@ -2926,13 +2934,21 @@ TRACE("Open %S\n", MemberSidString);
MaxSidCount += ValueCount;
}
NtClose(MemberKeyHandle);
}
if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
Status = STATUS_SUCCESS;
LocalFree(MemberSidString);
}
if (MaxSidCount == 0)
{
Status = STATUS_SUCCESS;
goto done;
}
TRACE("Maximum sid count: %lu\n", MaxSidCount);
RidArray = midl_user_allocate(MaxSidCount * sizeof(ULONG));
if (RidArray == NULL)
@ -2962,14 +2978,18 @@ TRACE("Open %S\n", MemberSidString);
for (j = 0; j < ValueCount; j++)
{
DataLength = sizeof(ULONG);
DataLength = 9 * sizeof(WCHAR);
Status = SampRegEnumerateValue(MemberKeyHandle,
j,
NULL,
NULL,
NULL,
(PVOID)&RidArray[j],
&DataLength);
NameBuffer,
&DataLength,
NULL,
NULL,
NULL);
if (NT_SUCCESS(Status))
{
RidArray[j] = wcstoul(NameBuffer, NULL, 16);
}
}
}
@ -2979,7 +2999,6 @@ TRACE("Open %S\n", MemberSidString);
LocalFree(MemberSidString);
}
done:
if (NT_SUCCESS(Status))
{