Move some alias-specific code to alias.c, for later use by the setup code.

svn path=/trunk/; revision=59069
This commit is contained in:
Eric Kohl 2013-05-23 09:42:25 +00:00
parent 09bc88e829
commit 7f698415cf
3 changed files with 205 additions and 157 deletions

View file

@ -39,4 +39,191 @@ SampOpenAliasObject(IN PSAM_DB_OBJECT DomainObject,
AliasObject);
}
NTSTATUS
SampAddMemberToAlias(IN PSAM_DB_OBJECT AliasObject,
IN PRPC_SID MemberId)
{
LPWSTR MemberIdString = NULL;
HANDLE MembersKeyHandle = NULL;
HANDLE MemberKeyHandle = NULL;
ULONG MemberIdLength;
NTSTATUS Status;
TRACE("(%p %p)\n",
AliasObject, MemberId);
ConvertSidToStringSidW(MemberId, &MemberIdString);
TRACE("Member SID: %S\n", MemberIdString);
MemberIdLength = RtlLengthSid(MemberId);
Status = SampRegCreateKey(AliasObject->KeyHandle,
L"Members",
KEY_WRITE,
&MembersKeyHandle);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegSetValue(MembersKeyHandle,
MemberIdString,
REG_BINARY,
MemberId,
MemberIdLength);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegSetValue failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegCreateKey(AliasObject->MembersKeyHandle,
MemberIdString,
KEY_WRITE,
&MemberKeyHandle);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegSetValue(MemberKeyHandle,
AliasObject->Name,
REG_BINARY,
MemberId,
MemberIdLength);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegSetValue failed with status 0x%08lx\n", Status);
goto done;
}
done:
if (MemberKeyHandle != NULL)
SampRegCloseKey(MemberKeyHandle);
if (MembersKeyHandle != NULL)
SampRegCloseKey(MembersKeyHandle);
if (MemberIdString != NULL)
LocalFree(MemberIdString);
return Status;
}
NTSTATUS
NTAPI
SampRemoveMemberFromAlias(IN PSAM_DB_OBJECT AliasObject,
IN PRPC_SID MemberId)
{
LPWSTR MemberIdString = NULL;
HANDLE MembersKeyHandle = NULL;
HANDLE MemberKeyHandle = NULL;
ULONG ulValueCount;
NTSTATUS Status;
TRACE("(%p %p)\n",
AliasObject, MemberId);
ConvertSidToStringSidW(MemberId, &MemberIdString);
TRACE("Member SID: %S\n", MemberIdString);
Status = SampRegOpenKey(AliasObject->MembersKeyHandle,
MemberIdString,
KEY_WRITE | KEY_QUERY_VALUE,
&MemberKeyHandle);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegDeleteValue(MemberKeyHandle,
AliasObject->Name);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegQueryKeyInfo(MemberKeyHandle,
NULL,
&ulValueCount);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status);
goto done;
}
if (ulValueCount == 0)
{
SampRegCloseKey(MemberKeyHandle);
MemberKeyHandle = NULL;
Status = SampRegDeleteKey(AliasObject->MembersKeyHandle,
MemberIdString);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status);
goto done;
}
}
Status = SampRegOpenKey(AliasObject->KeyHandle,
L"Members",
KEY_WRITE | KEY_QUERY_VALUE,
&MembersKeyHandle);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegDeleteValue(MembersKeyHandle,
MemberIdString);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegQueryKeyInfo(MembersKeyHandle,
NULL,
&ulValueCount);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status);
goto done;
}
if (ulValueCount == 0)
{
SampRegCloseKey(MembersKeyHandle);
MembersKeyHandle = NULL;
Status = SampRegDeleteKey(AliasObject->KeyHandle,
L"Members");
if (!NT_SUCCESS(Status))
{
TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status);
goto done;
}
}
done:
if (MemberKeyHandle != NULL)
SampRegCloseKey(MemberKeyHandle);
if (MembersKeyHandle != NULL)
SampRegCloseKey(MembersKeyHandle);
if (MemberIdString != NULL)
LocalFree(MemberIdString);
return Status;
}
/* EOF */

View file

@ -4669,7 +4669,7 @@ SamrDeleteAlias(IN OUT SAMPR_HANDLE *AliasHandle)
&AliasObject);
if (!NT_SUCCESS(Status))
{
TRACE("failed with status 0x%08lx\n", Status);
TRACE("SampValidateDbObject failed (Status 0x%08lx)\n", Status);
return Status;
}
@ -4704,14 +4704,9 @@ SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle,
IN PRPC_SID MemberId)
{
PSAM_DB_OBJECT AliasObject;
LPWSTR MemberIdString = NULL;
HANDLE MembersKeyHandle = NULL;
HANDLE MemberKeyHandle = NULL;
ULONG MemberIdLength;
NTSTATUS Status;
TRACE("SamrAddMemberToAlias(%p %p)\n",
AliasHandle, MemberId);
TRACE("(%p %p)\n", AliasHandle, MemberId);
/* Validate the alias handle */
Status = SampValidateDbObject(AliasHandle,
@ -4724,63 +4719,13 @@ SamrAddMemberToAlias(IN SAMPR_HANDLE AliasHandle,
return Status;
}
ConvertSidToStringSidW(MemberId, &MemberIdString);
TRACE("Member SID: %S\n", MemberIdString);
MemberIdLength = RtlLengthSid(MemberId);
Status = SampRegCreateKey(AliasObject->KeyHandle,
L"Members",
KEY_WRITE,
&MembersKeyHandle);
Status = SampAddMemberToAlias(AliasObject,
MemberId);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status);
goto done;
TRACE("failed with status 0x%08lx\n", Status);
}
Status = SampRegSetValue(MembersKeyHandle,
MemberIdString,
REG_BINARY,
MemberId,
MemberIdLength);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegSetValue failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegCreateKey(AliasObject->MembersKeyHandle,
MemberIdString,
KEY_WRITE,
&MemberKeyHandle);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegCreateKey failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegSetValue(MemberKeyHandle,
AliasObject->Name,
REG_BINARY,
MemberId,
MemberIdLength);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegSetValue failed with status 0x%08lx\n", Status);
goto done;
}
done:
if (MemberKeyHandle != NULL)
SampRegCloseKey(MemberKeyHandle);
if (MembersKeyHandle != NULL)
SampRegCloseKey(MembersKeyHandle);
if (MemberIdString != NULL)
LocalFree(MemberIdString);
return Status;
}
@ -4792,14 +4737,9 @@ SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle,
IN PRPC_SID MemberId)
{
PSAM_DB_OBJECT AliasObject;
LPWSTR MemberIdString = NULL;
HANDLE MembersKeyHandle = NULL;
HANDLE MemberKeyHandle = NULL;
ULONG ulValueCount;
NTSTATUS Status;
TRACE("SamrRemoveMemberFromAlias(%p %p)\n",
AliasHandle, MemberId);
TRACE("(%p %p)\n", AliasHandle, MemberId);
/* Validate the alias handle */
Status = SampValidateDbObject(AliasHandle,
@ -4812,101 +4752,13 @@ SamrRemoveMemberFromAlias(IN SAMPR_HANDLE AliasHandle,
return Status;
}
ConvertSidToStringSidW(MemberId, &MemberIdString);
TRACE("Member SID: %S\n", MemberIdString);
Status = SampRegOpenKey(AliasObject->MembersKeyHandle,
MemberIdString,
KEY_WRITE | KEY_QUERY_VALUE,
&MemberKeyHandle);
Status = SampRemoveMemberFromAlias(AliasObject,
MemberId);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status);
goto done;
TRACE("failed with status 0x%08lx\n", Status);
}
Status = SampRegDeleteValue(MemberKeyHandle,
AliasObject->Name);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegQueryKeyInfo(MemberKeyHandle,
NULL,
&ulValueCount);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status);
goto done;
}
if (ulValueCount == 0)
{
SampRegCloseKey(MemberKeyHandle);
MemberKeyHandle = NULL;
Status = SampRegDeleteKey(AliasObject->MembersKeyHandle,
MemberIdString);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status);
goto done;
}
}
Status = SampRegOpenKey(AliasObject->KeyHandle,
L"Members",
KEY_WRITE | KEY_QUERY_VALUE,
&MembersKeyHandle);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegOpenKey failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegDeleteValue(MembersKeyHandle,
MemberIdString);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegDeleteValue failed with status 0x%08lx\n", Status);
goto done;
}
Status = SampRegQueryKeyInfo(MembersKeyHandle,
NULL,
&ulValueCount);
if (!NT_SUCCESS(Status))
{
TRACE("SampRegQueryKeyInfo failed with status 0x%08lx\n", Status);
goto done;
}
if (ulValueCount == 0)
{
SampRegCloseKey(MembersKeyHandle);
MembersKeyHandle = NULL;
Status = SampRegDeleteKey(AliasObject->KeyHandle,
L"Members");
if (!NT_SUCCESS(Status))
{
TRACE("SampRegDeleteKey failed with status 0x%08lx\n", Status);
goto done;
}
}
done:
if (MemberKeyHandle != NULL)
SampRegCloseKey(MemberKeyHandle);
if (MembersKeyHandle != NULL)
SampRegCloseKey(MembersKeyHandle);
if (MemberIdString != NULL)
LocalFree(MemberIdString);
return Status;
}

View file

@ -128,6 +128,15 @@ SampOpenAliasObject(IN PSAM_DB_OBJECT DomainObject,
IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *AliasObject);
NTSTATUS
SampAddMemberToAlias(IN PSAM_DB_OBJECT AliasObject,
IN PRPC_SID MemberId);
NTSTATUS
NTAPI
SampRemoveMemberFromAlias(IN PSAM_DB_OBJECT AliasObject,
IN PRPC_SID MemberId);
/* database.c */