mirror of
https://github.com/reactos/reactos.git
synced 2025-04-29 18:48:53 +00:00
[SAMSRV]
SamrDeleteAlias: Remove all members from an alias before it will be deleted. svn path=/trunk/; revision=60443
This commit is contained in:
parent
416ae6f094
commit
02d6ca3e35
3 changed files with 176 additions and 81 deletions
|
@ -218,4 +218,159 @@ done:
|
|||
return Status;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
SampGetMembersInAlias(IN PSAM_DB_OBJECT AliasObject,
|
||||
OUT PULONG MemberCount,
|
||||
OUT PSAMPR_SID_INFORMATION *MemberArray)
|
||||
{
|
||||
HANDLE MembersKeyHandle = NULL;
|
||||
PSAMPR_SID_INFORMATION Members = NULL;
|
||||
ULONG Count = 0;
|
||||
ULONG DataLength;
|
||||
ULONG Index;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Open the members key of the alias object */
|
||||
Status = SampRegOpenKey(AliasObject->KeyHandle,
|
||||
L"Members",
|
||||
KEY_READ,
|
||||
&MembersKeyHandle);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("SampRegOpenKey failed with status 0x%08lx\n", Status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Get the number of members */
|
||||
Status = SampRegQueryKeyInfo(MembersKeyHandle,
|
||||
NULL,
|
||||
&Count);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Allocate the member array */
|
||||
Members = midl_user_allocate(Count * sizeof(SAMPR_SID_INFORMATION));
|
||||
if (Members == NULL)
|
||||
{
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Enumerate the members */
|
||||
Index = 0;
|
||||
while (TRUE)
|
||||
{
|
||||
/* Get the size of the next SID */
|
||||
DataLength = 0;
|
||||
Status = SampRegEnumerateValue(MembersKeyHandle,
|
||||
Index,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&DataLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
if (Status == STATUS_NO_MORE_ENTRIES)
|
||||
Status = STATUS_SUCCESS;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Allocate a buffer for the SID */
|
||||
Members[Index].SidPointer = midl_user_allocate(DataLength);
|
||||
if (Members[Index].SidPointer == NULL)
|
||||
{
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Read the SID into the buffer */
|
||||
Status = SampRegEnumerateValue(MembersKeyHandle,
|
||||
Index,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
(PVOID)Members[Index].SidPointer,
|
||||
&DataLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
goto done;
|
||||
}
|
||||
|
||||
Index++;
|
||||
}
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
*MemberCount = Count;
|
||||
*MemberArray = Members;
|
||||
}
|
||||
|
||||
done:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
SampRemoveAllMembersFromAlias(IN PSAM_DB_OBJECT AliasObject)
|
||||
{
|
||||
HANDLE MembersKeyHandle = NULL;
|
||||
PSAMPR_SID_INFORMATION MemberArray = NULL;
|
||||
ULONG MemberCount = 0;
|
||||
ULONG Index;
|
||||
NTSTATUS Status;
|
||||
|
||||
TRACE("(%p)\n", AliasObject);
|
||||
|
||||
/* Open the members key of the alias object */
|
||||
Status = SampRegOpenKey(AliasObject->KeyHandle,
|
||||
L"Members",
|
||||
KEY_READ,
|
||||
&MembersKeyHandle);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("SampRegOpenKey failed (Status 0x%08lx)\n", Status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Get a list of all members of the alias */
|
||||
Status = SampGetMembersInAlias(AliasObject,
|
||||
&MemberCount,
|
||||
&MemberArray);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("SampGetMembersInAlias failed (Status 0x%08lx)\n", Status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Remove all members from the alias */
|
||||
for (Index = 0; Index < MemberCount; Index++)
|
||||
{
|
||||
Status = SampRemoveMemberFromAlias(AliasObject,
|
||||
MemberArray[Index].SidPointer);
|
||||
if (!NT_SUCCESS(Status))
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
if (MemberArray != NULL)
|
||||
{
|
||||
for (Index = 0; Index < MemberCount; Index++)
|
||||
{
|
||||
if (MemberArray[Index].SidPointer != NULL)
|
||||
midl_user_free(MemberArray[Index].SidPointer);
|
||||
}
|
||||
|
||||
midl_user_free(MemberArray);
|
||||
}
|
||||
|
||||
SampRegCloseKey(&MembersKeyHandle);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -4980,7 +4980,13 @@ SamrDeleteAlias(IN OUT SAMPR_HANDLE *AliasHandle)
|
|||
goto done;
|
||||
}
|
||||
|
||||
/* FIXME: Remove all members from the alias */
|
||||
/* Remove all members from the alias */
|
||||
Status = SampRemoveAllMembersFromAlias(AliasObject);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
TRACE("SampRemoveAllMembersFromAlias() failed (Status 0x%08lx)\n", Status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Delete the alias from the database */
|
||||
Status = SampDeleteAccountDbObject(AliasObject);
|
||||
|
@ -5085,10 +5091,8 @@ SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle,
|
|||
OUT PSAMPR_PSID_ARRAY_OUT Members)
|
||||
{
|
||||
PSAM_DB_OBJECT AliasObject;
|
||||
HANDLE MembersKeyHandle = NULL;
|
||||
PSAMPR_SID_INFORMATION MemberArray = NULL;
|
||||
ULONG ValueCount = 0;
|
||||
ULONG DataLength;
|
||||
ULONG MemberCount = 0;
|
||||
ULONG Index;
|
||||
NTSTATUS Status;
|
||||
|
||||
|
@ -5109,83 +5113,14 @@ SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle,
|
|||
goto done;
|
||||
}
|
||||
|
||||
/* Open the members key of the alias objct */
|
||||
Status = SampRegOpenKey(AliasObject->KeyHandle,
|
||||
L"Members",
|
||||
KEY_READ,
|
||||
&MembersKeyHandle);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("SampRegOpenKey failed with status 0x%08lx\n", Status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Get the number of members */
|
||||
Status = SampRegQueryKeyInfo(MembersKeyHandle,
|
||||
NULL,
|
||||
&ValueCount);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ERR("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Allocate the member array */
|
||||
MemberArray = midl_user_allocate(ValueCount * sizeof(SAMPR_SID_INFORMATION));
|
||||
if (MemberArray == NULL)
|
||||
{
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Enumerate the members */
|
||||
Index = 0;
|
||||
while (TRUE)
|
||||
{
|
||||
/* Get the size of the next SID */
|
||||
DataLength = 0;
|
||||
Status = SampRegEnumerateValue(MembersKeyHandle,
|
||||
Index,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
&DataLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
if (Status == STATUS_NO_MORE_ENTRIES)
|
||||
Status = STATUS_SUCCESS;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Allocate a buffer for the SID */
|
||||
MemberArray[Index].SidPointer = midl_user_allocate(DataLength);
|
||||
if (MemberArray[Index].SidPointer == NULL)
|
||||
{
|
||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Read the SID into the buffer */
|
||||
Status = SampRegEnumerateValue(MembersKeyHandle,
|
||||
Index,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
(PVOID)MemberArray[Index].SidPointer,
|
||||
&DataLength);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
goto done;
|
||||
}
|
||||
|
||||
Index++;
|
||||
}
|
||||
Status = SampGetMembersInAlias(AliasObject,
|
||||
&MemberCount,
|
||||
&MemberArray);
|
||||
|
||||
/* Return the number of members and the member array */
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Members->Count = ValueCount;
|
||||
Members->Count = MemberCount;
|
||||
Members->Sids = MemberArray;
|
||||
}
|
||||
|
||||
|
@ -5195,7 +5130,7 @@ done:
|
|||
{
|
||||
if (MemberArray != NULL)
|
||||
{
|
||||
for (Index = 0; Index < ValueCount; Index++)
|
||||
for (Index = 0; Index < MemberCount; Index++)
|
||||
{
|
||||
if (MemberArray[Index].SidPointer != NULL)
|
||||
midl_user_free(MemberArray[Index].SidPointer);
|
||||
|
@ -5205,9 +5140,6 @@ done:
|
|||
}
|
||||
}
|
||||
|
||||
/* Close the members key */
|
||||
SampRegCloseKey(&MembersKeyHandle);
|
||||
|
||||
RtlReleaseResource(&SampResource);
|
||||
|
||||
return Status;
|
||||
|
|
|
@ -141,6 +141,14 @@ NTAPI
|
|||
SampRemoveMemberFromAlias(IN PSAM_DB_OBJECT AliasObject,
|
||||
IN PRPC_SID MemberId);
|
||||
|
||||
NTSTATUS
|
||||
SampGetMembersInAlias(IN PSAM_DB_OBJECT AliasObject,
|
||||
OUT PULONG MemberCount,
|
||||
OUT PSAMPR_SID_INFORMATION *MemberArray);
|
||||
|
||||
NTSTATUS
|
||||
SampRemoveAllMembersFromAlias(IN PSAM_DB_OBJECT AliasObject);
|
||||
|
||||
|
||||
/* database.c */
|
||||
|
||||
|
|
Loading…
Reference in a new issue