mirror of
https://github.com/reactos/reactos.git
synced 2025-04-29 10:39:07 +00:00
[SAMLIB]
- Implement SamGetAliasMembership, SamQueryInformationAlias and SamSetInformationAlias. - Add stub SamLookupNamesInDomain. [SAMSRV] - Implement SamrGetAliasMembership and SamrSetInformationAlias. - Add stub for SamrQueryInformationAlias. - SamrCreateAliasInDomain and SAM setup code: Set the description attribute for aliases. svn path=/trunk/; revision=56785
This commit is contained in:
parent
99944e4408
commit
44cc31028b
5 changed files with 552 additions and 12 deletions
|
@ -351,6 +351,57 @@ SamFreeMemory(IN PVOID Buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamGetAliasMembership(IN SAM_HANDLE DomainHandle,
|
||||||
|
IN ULONG PassedCount,
|
||||||
|
IN PSID *Sids,
|
||||||
|
OUT PULONG MembershipCount,
|
||||||
|
OUT PULONG *Aliases)
|
||||||
|
{
|
||||||
|
SAMPR_PSID_ARRAY SidArray;
|
||||||
|
SAMPR_ULONG_ARRAY Membership;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamAliasMembership(%p %ul %p %p %p)\n",
|
||||||
|
DomainHandle, PassedCount, Sids, MembershipCount, Aliases);
|
||||||
|
|
||||||
|
if (Sids == NULL ||
|
||||||
|
MembershipCount == NULL ||
|
||||||
|
Aliases == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
Membership.Element = NULL;
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
|
{
|
||||||
|
SidArray.Count = PassedCount;
|
||||||
|
SidArray.Sids = (PSAMPR_SID_INFORMATION)Sids;
|
||||||
|
|
||||||
|
Status = SamrGetAliasMembership((SAMPR_HANDLE)DomainHandle,
|
||||||
|
&SidArray,
|
||||||
|
&Membership);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
*MembershipCount = Membership.Count;
|
||||||
|
*Aliases = Membership.Element;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Membership.Element != NULL)
|
||||||
|
midl_user_free(Membership.Element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamGetMembersInAlias(IN SAM_HANDLE AliasHandle,
|
SamGetMembersInAlias(IN SAM_HANDLE AliasHandle,
|
||||||
|
@ -379,7 +430,7 @@ SamGetMembersInAlias(IN SAM_HANDLE AliasHandle,
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
*MemberCount = SidArray.Count;
|
*MemberCount = SidArray.Count;
|
||||||
*MemberIds = (PSID *)(SidArray.Sids);
|
*MemberIds = (PSID *)SidArray.Sids;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -420,6 +471,19 @@ SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
IN ULONG Count,
|
||||||
|
IN PUNICODE_STRING Names,
|
||||||
|
OUT PULONG *RelativeIds,
|
||||||
|
OUT PSID_NAME_USE *Use)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamOpenAlias(IN SAM_HANDLE DomainHandle,
|
SamOpenAlias(IN SAM_HANDLE DomainHandle,
|
||||||
|
@ -507,6 +571,33 @@ SamOpenUser(IN SAM_HANDLE DomainHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamQueryInformationAlias(IN SAM_HANDLE AliasHandle,
|
||||||
|
IN ALIAS_INFORMATION_CLASS AliasInformationClass,
|
||||||
|
OUT PVOID *Buffer)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamQueryInformationAlias(%p %lu %p)\n",
|
||||||
|
AliasHandle, AliasInformationClass, Buffer);
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
|
{
|
||||||
|
Status = SamrQueryInformationAlias((SAMPR_HANDLE)AliasHandle,
|
||||||
|
AliasInformationClass,
|
||||||
|
(PSAMPR_ALIAS_INFO_BUFFER *)Buffer);
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamQueryInformationDomain(IN SAM_HANDLE DomainHandle,
|
SamQueryInformationDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
@ -561,6 +652,33 @@ SamQueryInformationUser(IN SAM_HANDLE UserHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamSetInformationAlias(IN SAM_HANDLE AliasHandle,
|
||||||
|
IN ALIAS_INFORMATION_CLASS AliasInformationClass,
|
||||||
|
IN PVOID Buffer)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamSetInformationAlias(%p %lu %p)\n",
|
||||||
|
AliasHandle, AliasInformationClass, Buffer);
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
|
{
|
||||||
|
Status = SamrSetInformationAlias((SAMPR_HANDLE)AliasHandle,
|
||||||
|
AliasInformationClass,
|
||||||
|
Buffer);
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamSetInformationDomain(IN SAM_HANDLE DomainHandle,
|
SamSetInformationDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
@ stub SamEnumerateGroupsInDomain
|
@ stub SamEnumerateGroupsInDomain
|
||||||
@ stub SamEnumerateUsersInDomain
|
@ stub SamEnumerateUsersInDomain
|
||||||
@ stdcall SamFreeMemory(ptr)
|
@ stdcall SamFreeMemory(ptr)
|
||||||
@ stub SamGetAliasMembership
|
@ stdcall SamGetAliasMembership(ptr long ptr ptr ptr)
|
||||||
@ stub SamGetCompatibilityMode
|
@ stub SamGetCompatibilityMode
|
||||||
@ stub SamGetDisplayEnumerationIndex
|
@ stub SamGetDisplayEnumerationIndex
|
||||||
@ stub SamGetGroupsForUser
|
@ stub SamGetGroupsForUser
|
||||||
|
@ -27,13 +27,13 @@
|
||||||
@ stub SamGetMembersInGroup
|
@ stub SamGetMembersInGroup
|
||||||
@ stdcall SamLookupDomainInSamServer(ptr ptr ptr)
|
@ stdcall SamLookupDomainInSamServer(ptr ptr ptr)
|
||||||
@ stub SamLookupIdsInDomain
|
@ stub SamLookupIdsInDomain
|
||||||
@ stub SamLookupNamesInDomain
|
@ stdcall SamLookupNamesInDomain(ptr long ptr ptr ptr)
|
||||||
@ stdcall SamOpenAlias(ptr long long ptr)
|
@ stdcall SamOpenAlias(ptr long long ptr)
|
||||||
@ stdcall SamOpenDomain(ptr long ptr ptr)
|
@ stdcall SamOpenDomain(ptr long ptr ptr)
|
||||||
@ stub SamOpenGroup
|
@ stub SamOpenGroup
|
||||||
@ stdcall SamOpenUser(ptr long long ptr)
|
@ stdcall SamOpenUser(ptr long long ptr)
|
||||||
@ stub SamQueryDisplayInformation
|
@ stub SamQueryDisplayInformation
|
||||||
@ stub SamQueryInformationAlias
|
@ stdcall SamQueryInformationAlias(ptr long ptr)
|
||||||
@ stdcall SamQueryInformationDomain(ptr long ptr)
|
@ stdcall SamQueryInformationDomain(ptr long ptr)
|
||||||
@ stub SamQueryInformationGroup
|
@ stub SamQueryInformationGroup
|
||||||
@ stdcall SamQueryInformationUser(ptr long ptr)
|
@ stdcall SamQueryInformationUser(ptr long ptr)
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
@ stub SamRemoveMemberFromGroup
|
@ stub SamRemoveMemberFromGroup
|
||||||
@ stub SamRemoveMultipleMembersFromAlias
|
@ stub SamRemoveMultipleMembersFromAlias
|
||||||
@ stub SamRidToSid
|
@ stub SamRidToSid
|
||||||
@ stub SamSetInformationAlias
|
@ stdcall SamSetInformationAlias(ptr long ptr)
|
||||||
@ stdcall SamSetInformationDomain(ptr long ptr)
|
@ stdcall SamSetInformationDomain(ptr long ptr)
|
||||||
@ stub SamSetInformationGroup
|
@ stub SamSetInformationGroup
|
||||||
@ stdcall SamSetInformationUser(ptr long ptr)
|
@ stdcall SamSetInformationUser(ptr long ptr)
|
||||||
|
|
|
@ -853,6 +853,7 @@ SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle,
|
||||||
{
|
{
|
||||||
PSAM_DB_OBJECT DomainObject;
|
PSAM_DB_OBJECT DomainObject;
|
||||||
PSAM_DB_OBJECT AliasObject;
|
PSAM_DB_OBJECT AliasObject;
|
||||||
|
UNICODE_STRING EmptyString = RTL_CONSTANT_STRING(L"");
|
||||||
ULONG ulSize;
|
ULONG ulSize;
|
||||||
ULONG ulRid;
|
ULONG ulRid;
|
||||||
WCHAR szRid[9];
|
WCHAR szRid[9];
|
||||||
|
@ -941,7 +942,17 @@ SamrCreateAliasInDomain(IN SAMPR_HANDLE DomainHandle,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: Set default alias attributes */
|
/* Set the Description attribute */
|
||||||
|
Status = SampSetObjectAttribute(AliasObject,
|
||||||
|
L"Description",
|
||||||
|
REG_SZ,
|
||||||
|
EmptyString.Buffer,
|
||||||
|
EmptyString.MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
@ -1198,8 +1209,142 @@ SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle,
|
||||||
IN PSAMPR_PSID_ARRAY SidArray,
|
IN PSAMPR_PSID_ARRAY SidArray,
|
||||||
OUT PSAMPR_ULONG_ARRAY Membership)
|
OUT PSAMPR_ULONG_ARRAY Membership)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PSAM_DB_OBJECT DomainObject;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
HANDLE AliasesKeyHandle = NULL;
|
||||||
|
HANDLE MembersKeyHandle = NULL;
|
||||||
|
HANDLE MemberKeyHandle = NULL;
|
||||||
|
LPWSTR MemberSidString = NULL;
|
||||||
|
PULONG RidArray = NULL;
|
||||||
|
ULONG MaxSidCount = 0;
|
||||||
|
ULONG ValueCount;
|
||||||
|
ULONG DataLength;
|
||||||
|
ULONG i, j;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamrGetAliasMembership(%p %p %p)\n",
|
||||||
|
DomainHandle, SidArray, Membership);
|
||||||
|
|
||||||
|
/* Validate the domain handle */
|
||||||
|
Status = SampValidateDbObject(DomainHandle,
|
||||||
|
SamDbDomainObject,
|
||||||
|
DOMAIN_LOOKUP,
|
||||||
|
&DomainObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
Status = SampRegOpenKey(DomainObject->KeyHandle,
|
||||||
|
L"Aliases",
|
||||||
|
KEY_READ,
|
||||||
|
&AliasesKeyHandle);
|
||||||
|
TRACE("SampRegOpenKey returned %08lX\n", Status);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
Status = SampRegOpenKey(AliasesKeyHandle,
|
||||||
|
L"Members",
|
||||||
|
KEY_READ,
|
||||||
|
&MembersKeyHandle);
|
||||||
|
TRACE("SampRegOpenKey returned %08lX\n", Status);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
for (i = 0; i < SidArray->Count; i++)
|
||||||
|
{
|
||||||
|
ConvertSidToStringSid(SidArray->Sids[i].SidPointer, &MemberSidString);
|
||||||
|
TRACE("Open %S\n", MemberSidString);
|
||||||
|
|
||||||
|
Status = SampRegOpenKey(MembersKeyHandle,
|
||||||
|
MemberSidString,
|
||||||
|
KEY_READ,
|
||||||
|
&MemberKeyHandle);
|
||||||
|
TRACE("SampRegOpenKey returned %08lX\n", Status);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Status = SampRegQueryKeyInfo(MemberKeyHandle,
|
||||||
|
NULL,
|
||||||
|
&ValueCount);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("Found %lu values\n", ValueCount);
|
||||||
|
MaxSidCount += ValueCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NtClose(MemberKeyHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalFree(MemberSidString);
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("Maximum sid count: %lu\n", MaxSidCount);
|
||||||
|
RidArray = midl_user_allocate(MaxSidCount * sizeof(ULONG));
|
||||||
|
if (RidArray == NULL)
|
||||||
|
{
|
||||||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < SidArray->Count; i++)
|
||||||
|
{
|
||||||
|
ConvertSidToStringSid(SidArray->Sids[i].SidPointer, &MemberSidString);
|
||||||
|
TRACE("Open %S\n", MemberSidString);
|
||||||
|
|
||||||
|
Status = SampRegOpenKey(MembersKeyHandle,
|
||||||
|
MemberSidString,
|
||||||
|
KEY_READ,
|
||||||
|
&MemberKeyHandle);
|
||||||
|
TRACE("SampRegOpenKey returned %08lX\n", Status);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Status = SampRegQueryKeyInfo(MemberKeyHandle,
|
||||||
|
NULL,
|
||||||
|
&ValueCount);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("Found %lu values\n", ValueCount);
|
||||||
|
|
||||||
|
for (j = 0; j < ValueCount; j++)
|
||||||
|
{
|
||||||
|
DataLength = sizeof(ULONG);
|
||||||
|
Status = SampRegEnumerateValue(MemberKeyHandle,
|
||||||
|
j,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
(PVOID)&RidArray[j],
|
||||||
|
&DataLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NtClose(MemberKeyHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalFree(MemberSidString);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Membership->Count = MaxSidCount;
|
||||||
|
Membership->Element = RidArray;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (RidArray != NULL)
|
||||||
|
midl_user_free(RidArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MembersKeyHandle != NULL)
|
||||||
|
NtClose(MembersKeyHandle);
|
||||||
|
|
||||||
|
if (MembersKeyHandle != NULL)
|
||||||
|
NtClose(MembersKeyHandle);
|
||||||
|
|
||||||
|
if (AliasesKeyHandle != NULL)
|
||||||
|
NtClose(AliasesKeyHandle);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function 17 */
|
/* Function 17 */
|
||||||
|
@ -1368,8 +1513,76 @@ SamrQueryInformationAlias(IN SAMPR_HANDLE AliasHandle,
|
||||||
IN ALIAS_INFORMATION_CLASS AliasInformationClass,
|
IN ALIAS_INFORMATION_CLASS AliasInformationClass,
|
||||||
OUT PSAMPR_ALIAS_INFO_BUFFER *Buffer)
|
OUT PSAMPR_ALIAS_INFO_BUFFER *Buffer)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PSAM_DB_OBJECT AliasObject;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamrQueryInformationAlias(%p %lu %p)\n",
|
||||||
|
AliasHandle, AliasInformationClass, Buffer);
|
||||||
|
|
||||||
|
/* Validate the alias handle */
|
||||||
|
Status = SampValidateDbObject(AliasHandle,
|
||||||
|
SamDbAliasObject,
|
||||||
|
ALIAS_READ_INFORMATION,
|
||||||
|
&AliasObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
switch (AliasInformationClass)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
case AliasGeneralInformation:
|
||||||
|
Status = SampQueryAliasGeneral(AliasObject,
|
||||||
|
&Buffer->General);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AliasNameInformation:
|
||||||
|
Status = SampQueryAliasName(AliasObject,
|
||||||
|
&Buffer->Name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AliasAdminCommentInformation:
|
||||||
|
Status = SampQueryAliasAdminComment(AliasObject,
|
||||||
|
&Buffer->AdminComment);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
Status = STATUS_INVALID_INFO_CLASS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static NTSTATUS
|
||||||
|
SampSetAliasName(PSAM_DB_OBJECT AliasObject,
|
||||||
|
PSAMPR_ALIAS_NAME_INFORMATION AliasNameInfo)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
Status = SampSetObjectAttribute(AliasObject,
|
||||||
|
L"Name",
|
||||||
|
REG_SZ,
|
||||||
|
AliasNameInfo->Name.Buffer,
|
||||||
|
AliasNameInfo->Name.Length + sizeof(WCHAR));
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static NTSTATUS
|
||||||
|
SampSetAliasAdminComment(PSAM_DB_OBJECT AliasObject,
|
||||||
|
PSAMPR_ALIAS_ADM_COMMENT_INFORMATION AliasAdminCommentInfo)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
Status = SampSetObjectAttribute(AliasObject,
|
||||||
|
L"Description",
|
||||||
|
REG_SZ,
|
||||||
|
AliasAdminCommentInfo->AdminComment.Buffer,
|
||||||
|
AliasAdminCommentInfo->AdminComment.Length + sizeof(WCHAR));
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function 29 */
|
/* Function 29 */
|
||||||
|
@ -1379,8 +1592,38 @@ SamrSetInformationAlias(IN SAMPR_HANDLE AliasHandle,
|
||||||
IN ALIAS_INFORMATION_CLASS AliasInformationClass,
|
IN ALIAS_INFORMATION_CLASS AliasInformationClass,
|
||||||
IN PSAMPR_ALIAS_INFO_BUFFER Buffer)
|
IN PSAMPR_ALIAS_INFO_BUFFER Buffer)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PSAM_DB_OBJECT AliasObject;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamrSetInformationAlias(%p %lu %p)\n",
|
||||||
|
AliasHandle, AliasInformationClass, Buffer);
|
||||||
|
|
||||||
|
/* Validate the alias handle */
|
||||||
|
Status = SampValidateDbObject(AliasHandle,
|
||||||
|
SamDbAliasObject,
|
||||||
|
ALIAS_WRITE_ACCOUNT,
|
||||||
|
&AliasObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
switch (AliasInformationClass)
|
||||||
|
{
|
||||||
|
case AliasNameInformation:
|
||||||
|
Status = SampSetAliasName(AliasObject,
|
||||||
|
&Buffer->Name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AliasAdminCommentInformation:
|
||||||
|
Status = SampSetAliasAdminComment(AliasObject,
|
||||||
|
&Buffer->AdminComment);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Status = STATUS_INVALID_INFO_CLASS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function 30 */
|
/* Function 30 */
|
||||||
|
|
|
@ -58,9 +58,110 @@ SampIsSetupRunning(VOID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PSID
|
||||||
|
AppendRidToSid(PSID SrcSid,
|
||||||
|
ULONG Rid)
|
||||||
|
{
|
||||||
|
ULONG Rids[8] = {0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
UCHAR RidCount;
|
||||||
|
PSID DstSid;
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
RidCount = *RtlSubAuthorityCountSid(SrcSid);
|
||||||
|
if (RidCount >= 8)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (i = 0; i < RidCount; i++)
|
||||||
|
Rids[i] = *RtlSubAuthoritySid(SrcSid, i);
|
||||||
|
|
||||||
|
Rids[RidCount] = Rid;
|
||||||
|
RidCount++;
|
||||||
|
|
||||||
|
RtlAllocateAndInitializeSid(RtlIdentifierAuthoritySid(SrcSid),
|
||||||
|
RidCount,
|
||||||
|
Rids[0],
|
||||||
|
Rids[1],
|
||||||
|
Rids[2],
|
||||||
|
Rids[3],
|
||||||
|
Rids[4],
|
||||||
|
Rids[5],
|
||||||
|
Rids[6],
|
||||||
|
Rids[7],
|
||||||
|
&DstSid);
|
||||||
|
|
||||||
|
return DstSid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL
|
||||||
|
SampAddMemberToAlias(HKEY hDomainKey,
|
||||||
|
ULONG AliasId,
|
||||||
|
PSID MemberSid)
|
||||||
|
{
|
||||||
|
DWORD dwDisposition;
|
||||||
|
LPWSTR MemberSidString = NULL;
|
||||||
|
WCHAR szKeyName[256];
|
||||||
|
HKEY hMembersKey;
|
||||||
|
|
||||||
|
ConvertSidToStringSidW(MemberSid, &MemberSidString);
|
||||||
|
|
||||||
|
swprintf(szKeyName, L"Aliases\\%08lX\\Members", AliasId);
|
||||||
|
|
||||||
|
if (!RegCreateKeyExW(hDomainKey,
|
||||||
|
szKeyName,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_ALL_ACCESS,
|
||||||
|
NULL,
|
||||||
|
&hMembersKey,
|
||||||
|
&dwDisposition))
|
||||||
|
{
|
||||||
|
RegSetValueEx(hMembersKey,
|
||||||
|
MemberSidString,
|
||||||
|
0,
|
||||||
|
REG_BINARY,
|
||||||
|
(LPVOID)MemberSid,
|
||||||
|
RtlLengthSid(MemberSid));
|
||||||
|
|
||||||
|
RegCloseKey(hMembersKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
swprintf(szKeyName, L"Aliases\\Members\\%s", MemberSidString);
|
||||||
|
|
||||||
|
if (!RegCreateKeyExW(hDomainKey,
|
||||||
|
szKeyName,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_ALL_ACCESS,
|
||||||
|
NULL,
|
||||||
|
&hMembersKey,
|
||||||
|
&dwDisposition))
|
||||||
|
{
|
||||||
|
swprintf(szKeyName, L"%08lX", AliasId);
|
||||||
|
|
||||||
|
RegSetValueEx(hMembersKey,
|
||||||
|
szKeyName,
|
||||||
|
0,
|
||||||
|
REG_BINARY,
|
||||||
|
(LPVOID)MemberSid,
|
||||||
|
RtlLengthSid(MemberSid));
|
||||||
|
|
||||||
|
RegCloseKey(hMembersKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MemberSidString != NULL)
|
||||||
|
LocalFree(MemberSidString);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
SampCreateAliasAccount(HKEY hDomainKey,
|
SampCreateAliasAccount(HKEY hDomainKey,
|
||||||
LPCWSTR lpAccountName,
|
LPCWSTR lpAccountName,
|
||||||
|
LPCWSTR lpDescription,
|
||||||
ULONG ulRelativeId)
|
ULONG ulRelativeId)
|
||||||
{
|
{
|
||||||
DWORD dwDisposition;
|
DWORD dwDisposition;
|
||||||
|
@ -87,6 +188,13 @@ SampCreateAliasAccount(HKEY hDomainKey,
|
||||||
(LPVOID)lpAccountName,
|
(LPVOID)lpAccountName,
|
||||||
(wcslen(lpAccountName) + 1) * sizeof(WCHAR));
|
(wcslen(lpAccountName) + 1) * sizeof(WCHAR));
|
||||||
|
|
||||||
|
RegSetValueEx(hAccountKey,
|
||||||
|
L"Description",
|
||||||
|
0,
|
||||||
|
REG_SZ,
|
||||||
|
(LPVOID)lpDescription,
|
||||||
|
(wcslen(lpDescription) + 1) * sizeof(WCHAR));
|
||||||
|
|
||||||
RegCloseKey(hAccountKey);
|
RegCloseKey(hAccountKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,6 +440,7 @@ SampInitializeSAM(VOID)
|
||||||
HKEY hDomainKey = NULL;
|
HKEY hDomainKey = NULL;
|
||||||
PSID pBuiltinSid = NULL;
|
PSID pBuiltinSid = NULL;
|
||||||
BOOL bResult = TRUE;
|
BOOL bResult = TRUE;
|
||||||
|
PSID pSid;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
TRACE("SampInitializeSAM() called\n");
|
TRACE("SampInitializeSAM() called\n");
|
||||||
|
@ -398,20 +507,37 @@ SampInitializeSAM(VOID)
|
||||||
{
|
{
|
||||||
SampCreateAliasAccount(hDomainKey,
|
SampCreateAliasAccount(hDomainKey,
|
||||||
L"Administrators",
|
L"Administrators",
|
||||||
|
L"",
|
||||||
DOMAIN_ALIAS_RID_ADMINS);
|
DOMAIN_ALIAS_RID_ADMINS);
|
||||||
|
|
||||||
SampCreateAliasAccount(hDomainKey,
|
SampCreateAliasAccount(hDomainKey,
|
||||||
L"Users",
|
L"Users",
|
||||||
|
L"",
|
||||||
DOMAIN_ALIAS_RID_USERS);
|
DOMAIN_ALIAS_RID_USERS);
|
||||||
|
|
||||||
SampCreateAliasAccount(hDomainKey,
|
SampCreateAliasAccount(hDomainKey,
|
||||||
L"Guests",
|
L"Guests",
|
||||||
|
L"",
|
||||||
DOMAIN_ALIAS_RID_GUESTS);
|
DOMAIN_ALIAS_RID_GUESTS);
|
||||||
|
|
||||||
SampCreateAliasAccount(hDomainKey,
|
SampCreateAliasAccount(hDomainKey,
|
||||||
L"Power Users",
|
L"Power Users",
|
||||||
|
L"",
|
||||||
DOMAIN_ALIAS_RID_POWER_USERS);
|
DOMAIN_ALIAS_RID_POWER_USERS);
|
||||||
|
|
||||||
|
|
||||||
|
pSid = AppendRidToSid(AccountDomainInfo->DomainSid,
|
||||||
|
DOMAIN_USER_RID_ADMIN);
|
||||||
|
if (pSid != NULL)
|
||||||
|
{
|
||||||
|
SampAddMemberToAlias(hDomainKey,
|
||||||
|
DOMAIN_ALIAS_RID_ADMINS,
|
||||||
|
pSid);
|
||||||
|
|
||||||
|
RtlFreeHeap(RtlGetProcessHeap(), 0, pSid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
RegCloseKey(hDomainKey);
|
RegCloseKey(hDomainKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,31 @@ typedef struct _SAM_SID_ENUMERATION
|
||||||
UNICODE_STRING Name;
|
UNICODE_STRING Name;
|
||||||
} SAM_SID_ENUMERATION, *PSAM_SID_ENUMERATION;
|
} SAM_SID_ENUMERATION, *PSAM_SID_ENUMERATION;
|
||||||
|
|
||||||
|
typedef enum _ALIAS_INFORMATION_CLASS
|
||||||
|
{
|
||||||
|
AliasGeneralInformation = 1,
|
||||||
|
AliasNameInformation,
|
||||||
|
AliasAdminCommentInformation
|
||||||
|
} ALIAS_INFORMATION_CLASS, *PALIAS_INFORMATION_CLASS;
|
||||||
|
|
||||||
|
typedef struct _SAMPR_ALIAS_GENERAL_INFORMATION
|
||||||
|
{
|
||||||
|
UNICODE_STRING Name;
|
||||||
|
ULONG MemberCount;
|
||||||
|
UNICODE_STRING AdminComment;
|
||||||
|
} SAMPR_ALIAS_GENERAL_INFORMATION, *PSAMPR_ALIAS_GENERAL_INFORMATION;
|
||||||
|
|
||||||
|
typedef struct _SAMPR_ALIAS_NAME_INFORMATION
|
||||||
|
{
|
||||||
|
UNICODE_STRING Name;
|
||||||
|
} SAMPR_ALIAS_NAME_INFORMATION, *PSAMPR_ALIAS_NAME_INFORMATION;
|
||||||
|
|
||||||
|
typedef struct _SAMPR_ALIAS_ADM_COMMENT_INFORMATION
|
||||||
|
{
|
||||||
|
UNICODE_STRING AdminComment;
|
||||||
|
} SAMPR_ALIAS_ADM_COMMENT_INFORMATION, *PSAMPR_ALIAS_ADM_COMMENT_INFORMATION;
|
||||||
|
|
||||||
|
|
||||||
typedef enum _DOMAIN_INFORMATION_CLASS
|
typedef enum _DOMAIN_INFORMATION_CLASS
|
||||||
{
|
{
|
||||||
DomainPasswordInformation = 1,
|
DomainPasswordInformation = 1,
|
||||||
|
@ -172,6 +197,14 @@ NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamFreeMemory(IN PVOID Buffer);
|
SamFreeMemory(IN PVOID Buffer);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamGetAliasMembership(IN SAM_HANDLE DomainHandle,
|
||||||
|
IN ULONG PassedCount,
|
||||||
|
IN PSID *Sids,
|
||||||
|
OUT PULONG MembershipCount,
|
||||||
|
OUT PULONG *Aliases);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamGetMembersInAlias(IN SAM_HANDLE AliasHandle,
|
SamGetMembersInAlias(IN SAM_HANDLE AliasHandle,
|
||||||
|
@ -184,6 +217,14 @@ SamLookupDomainInSamServer(IN SAM_HANDLE ServerHandle,
|
||||||
IN PUNICODE_STRING Name,
|
IN PUNICODE_STRING Name,
|
||||||
OUT PSID *DomainId);
|
OUT PSID *DomainId);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
IN ULONG Count,
|
||||||
|
IN PUNICODE_STRING Names,
|
||||||
|
OUT PULONG *RelativeIds,
|
||||||
|
OUT PSID_NAME_USE *Use);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamOpenAlias(IN SAM_HANDLE DomainHandle,
|
SamOpenAlias(IN SAM_HANDLE DomainHandle,
|
||||||
|
@ -205,6 +246,12 @@ SamOpenUser(IN SAM_HANDLE DomainHandle,
|
||||||
IN ULONG UserId,
|
IN ULONG UserId,
|
||||||
OUT PSAM_HANDLE UserHandle);
|
OUT PSAM_HANDLE UserHandle);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamQueryInformationAlias(IN SAM_HANDLE AliasHandle,
|
||||||
|
IN ALIAS_INFORMATION_CLASS AliasInformationClass,
|
||||||
|
OUT PVOID *Buffer);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamQueryInformationDomain(IN SAM_HANDLE DomainHandle,
|
SamQueryInformationDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
@ -217,6 +264,12 @@ SamQueryInformationUser(IN SAM_HANDLE UserHandle,
|
||||||
IN USER_INFORMATION_CLASS UserInformationClass,
|
IN USER_INFORMATION_CLASS UserInformationClass,
|
||||||
OUT PVOID *Buffer);
|
OUT PVOID *Buffer);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamSetInformationAlias(IN SAM_HANDLE AliasHandle,
|
||||||
|
IN ALIAS_INFORMATION_CLASS AliasInformationClass,
|
||||||
|
IN PVOID Buffer);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamSetInformationDomain(IN SAM_HANDLE DomainHandle,
|
SamSetInformationDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
|
Loading…
Reference in a new issue