mirror of
https://github.com/reactos/reactos.git
synced 2025-04-30 02:58:48 +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;
|
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 */
|
/* EOF */
|
||||||
|
|
|
@ -4980,7 +4980,13 @@ SamrDeleteAlias(IN OUT SAMPR_HANDLE *AliasHandle)
|
||||||
goto done;
|
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 */
|
/* Delete the alias from the database */
|
||||||
Status = SampDeleteAccountDbObject(AliasObject);
|
Status = SampDeleteAccountDbObject(AliasObject);
|
||||||
|
@ -5085,10 +5091,8 @@ SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle,
|
||||||
OUT PSAMPR_PSID_ARRAY_OUT Members)
|
OUT PSAMPR_PSID_ARRAY_OUT Members)
|
||||||
{
|
{
|
||||||
PSAM_DB_OBJECT AliasObject;
|
PSAM_DB_OBJECT AliasObject;
|
||||||
HANDLE MembersKeyHandle = NULL;
|
|
||||||
PSAMPR_SID_INFORMATION MemberArray = NULL;
|
PSAMPR_SID_INFORMATION MemberArray = NULL;
|
||||||
ULONG ValueCount = 0;
|
ULONG MemberCount = 0;
|
||||||
ULONG DataLength;
|
|
||||||
ULONG Index;
|
ULONG Index;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
@ -5109,83 +5113,14 @@ SamrGetMembersInAlias(IN SAMPR_HANDLE AliasHandle,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the members key of the alias objct */
|
Status = SampGetMembersInAlias(AliasObject,
|
||||||
Status = SampRegOpenKey(AliasObject->KeyHandle,
|
&MemberCount,
|
||||||
L"Members",
|
&MemberArray);
|
||||||
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++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the number of members and the member array */
|
/* Return the number of members and the member array */
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
Members->Count = ValueCount;
|
Members->Count = MemberCount;
|
||||||
Members->Sids = MemberArray;
|
Members->Sids = MemberArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5195,7 +5130,7 @@ done:
|
||||||
{
|
{
|
||||||
if (MemberArray != NULL)
|
if (MemberArray != NULL)
|
||||||
{
|
{
|
||||||
for (Index = 0; Index < ValueCount; Index++)
|
for (Index = 0; Index < MemberCount; Index++)
|
||||||
{
|
{
|
||||||
if (MemberArray[Index].SidPointer != NULL)
|
if (MemberArray[Index].SidPointer != NULL)
|
||||||
midl_user_free(MemberArray[Index].SidPointer);
|
midl_user_free(MemberArray[Index].SidPointer);
|
||||||
|
@ -5205,9 +5140,6 @@ done:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close the members key */
|
|
||||||
SampRegCloseKey(&MembersKeyHandle);
|
|
||||||
|
|
||||||
RtlReleaseResource(&SampResource);
|
RtlReleaseResource(&SampResource);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
|
@ -141,6 +141,14 @@ NTAPI
|
||||||
SampRemoveMemberFromAlias(IN PSAM_DB_OBJECT AliasObject,
|
SampRemoveMemberFromAlias(IN PSAM_DB_OBJECT AliasObject,
|
||||||
IN PRPC_SID MemberId);
|
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 */
|
/* database.c */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue