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