mirror of
https://github.com/reactos/reactos.git
synced 2025-06-10 12:24:48 +00:00
[SAMSRV]
- Implement SamrAddMemberToGroup and SamrRemoveMemberFromGroup partially. - Constify some parameters. svn path=/trunk/; revision=58159
This commit is contained in:
parent
741b1a9b33
commit
542200a48d
6 changed files with 240 additions and 37 deletions
|
@ -9,6 +9,7 @@ spec2def(samsrv.dll samsrv.spec ADD_IMPORTLIB)
|
||||||
|
|
||||||
list(APPEND SOURCE
|
list(APPEND SOURCE
|
||||||
database.c
|
database.c
|
||||||
|
group.c
|
||||||
registry.c
|
registry.c
|
||||||
samrpc.c
|
samrpc.c
|
||||||
samsrv.c
|
samsrv.c
|
||||||
|
|
|
@ -555,7 +555,7 @@ done:
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
|
SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
|
||||||
IN LPWSTR lpAccountName)
|
IN LPCWSTR lpAccountName)
|
||||||
{
|
{
|
||||||
HANDLE AccountKey;
|
HANDLE AccountKey;
|
||||||
HANDLE NamesKey;
|
HANDLE NamesKey;
|
||||||
|
|
154
reactos/dll/win32/samsrv/group.c
Normal file
154
reactos/dll/win32/samsrv/group.c
Normal file
|
@ -0,0 +1,154 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: Local Security Authority Server DLL
|
||||||
|
* LICENSE: GPL - See COPYING in the top level directory
|
||||||
|
* FILE: dll/win32/samsrv/group.c
|
||||||
|
* PURPOSE: Group specific helper functions
|
||||||
|
* COPYRIGHT: Copyright 2013 Eric Kohl
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ****************************************************************/
|
||||||
|
|
||||||
|
#include "samsrv.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
|
||||||
|
|
||||||
|
|
||||||
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject,
|
||||||
|
IN ULONG MemberId)
|
||||||
|
{
|
||||||
|
PULONG MembersBuffer = NULL;
|
||||||
|
ULONG MembersCount = 0;
|
||||||
|
ULONG Length = 0;
|
||||||
|
ULONG i;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
Status = SampGetObjectAttribute(GroupObject,
|
||||||
|
L"Members",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&Length);
|
||||||
|
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_NOT_FOUND)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
MembersBuffer = midl_user_allocate(Length + sizeof(ULONG));
|
||||||
|
if (MembersBuffer == NULL)
|
||||||
|
{
|
||||||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Status != STATUS_OBJECT_NAME_NOT_FOUND)
|
||||||
|
{
|
||||||
|
Status = SampGetObjectAttribute(GroupObject,
|
||||||
|
L"Members",
|
||||||
|
NULL,
|
||||||
|
MembersBuffer,
|
||||||
|
&Length);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
MembersCount = Length / sizeof(ULONG);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MembersCount; i++)
|
||||||
|
{
|
||||||
|
if (MembersBuffer[i] == MemberId)
|
||||||
|
{
|
||||||
|
Status = STATUS_MEMBER_IN_GROUP;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MembersBuffer[MembersCount] = MemberId;
|
||||||
|
Length += sizeof(ULONG);
|
||||||
|
|
||||||
|
Status = SampSetObjectAttribute(GroupObject,
|
||||||
|
L"Members",
|
||||||
|
REG_BINARY,
|
||||||
|
MembersBuffer,
|
||||||
|
Length);
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (MembersBuffer != NULL)
|
||||||
|
midl_user_free(MembersBuffer);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
SampRemoveMemberFromGroup(IN PSAM_DB_OBJECT GroupObject,
|
||||||
|
IN ULONG MemberId)
|
||||||
|
{
|
||||||
|
PULONG MembersBuffer = NULL;
|
||||||
|
ULONG MembersCount = 0;
|
||||||
|
ULONG Length = 0;
|
||||||
|
ULONG i;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
Status = SampGetObjectAttribute(GroupObject,
|
||||||
|
L"Members",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&Length);
|
||||||
|
|
||||||
|
if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
|
||||||
|
return STATUS_MEMBER_NOT_IN_GROUP;
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
MembersBuffer = midl_user_allocate(Length);
|
||||||
|
if (MembersBuffer == NULL)
|
||||||
|
{
|
||||||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = SampGetObjectAttribute(GroupObject,
|
||||||
|
L"Members",
|
||||||
|
NULL,
|
||||||
|
MembersBuffer,
|
||||||
|
&Length);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
Status = STATUS_MEMBER_NOT_IN_GROUP;
|
||||||
|
|
||||||
|
MembersCount = Length / sizeof(ULONG);
|
||||||
|
for (i = 0; i < MembersCount; i++)
|
||||||
|
{
|
||||||
|
if (MembersBuffer[i] == MemberId)
|
||||||
|
{
|
||||||
|
Length -= sizeof(ULONG);
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Status == STATUS_SUCCESS && i < MembersCount - 1)
|
||||||
|
{
|
||||||
|
MembersBuffer[i] = MembersBuffer[i + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
Status = SampSetObjectAttribute(GroupObject,
|
||||||
|
L"Members",
|
||||||
|
REG_BINARY,
|
||||||
|
MembersBuffer,
|
||||||
|
Length);
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (MembersBuffer != NULL)
|
||||||
|
midl_user_free(MembersBuffer);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -202,7 +202,7 @@ SampRegQueryKeyInfo(IN HANDLE KeyHandle,
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampRegDeleteValue(IN HANDLE KeyHandle,
|
SampRegDeleteValue(IN HANDLE KeyHandle,
|
||||||
IN LPWSTR ValueName)
|
IN LPCWSTR ValueName)
|
||||||
{
|
{
|
||||||
UNICODE_STRING Name;
|
UNICODE_STRING Name;
|
||||||
|
|
||||||
|
@ -322,7 +322,7 @@ done:
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampRegQueryValue(IN HANDLE KeyHandle,
|
SampRegQueryValue(IN HANDLE KeyHandle,
|
||||||
IN LPWSTR ValueName,
|
IN LPCWSTR ValueName,
|
||||||
OUT PULONG Type OPTIONAL,
|
OUT PULONG Type OPTIONAL,
|
||||||
OUT PVOID Data OPTIONAL,
|
OUT PVOID Data OPTIONAL,
|
||||||
IN OUT PULONG DataLength OPTIONAL)
|
IN OUT PULONG DataLength OPTIONAL)
|
||||||
|
@ -392,7 +392,7 @@ SampRegQueryValue(IN HANDLE KeyHandle,
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampRegSetValue(HANDLE KeyHandle,
|
SampRegSetValue(HANDLE KeyHandle,
|
||||||
LPWSTR ValueName,
|
LPCWSTR ValueName,
|
||||||
ULONG Type,
|
ULONG Type,
|
||||||
LPVOID Data,
|
LPVOID Data,
|
||||||
ULONG DataLength)
|
ULONG DataLength)
|
||||||
|
|
|
@ -191,7 +191,7 @@ NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle,
|
SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle,
|
||||||
IN SECURITY_INFORMATION SecurityInformation,
|
IN SECURITY_INFORMATION SecurityInformation,
|
||||||
OUT PSAMPR_SR_SECURITY_DESCRIPTOR * SecurityDescriptor)
|
OUT PSAMPR_SR_SECURITY_DESCRIPTOR *SecurityDescriptor)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
@ -3593,8 +3593,8 @@ SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject,
|
||||||
PSAMPR_GROUP_INFO_BUFFER *Buffer)
|
PSAMPR_GROUP_INFO_BUFFER *Buffer)
|
||||||
{
|
{
|
||||||
PSAMPR_GROUP_INFO_BUFFER InfoBuffer = NULL;
|
PSAMPR_GROUP_INFO_BUFFER InfoBuffer = NULL;
|
||||||
HANDLE MembersKeyHandle = NULL;
|
|
||||||
SAM_GROUP_FIXED_DATA FixedData;
|
SAM_GROUP_FIXED_DATA FixedData;
|
||||||
|
ULONG MembersLength = 0;
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
@ -3633,33 +3633,22 @@ SampQueryGroupGeneral(PSAM_DB_OBJECT GroupObject,
|
||||||
|
|
||||||
InfoBuffer->General.Attributes = FixedData.Attributes;
|
InfoBuffer->General.Attributes = FixedData.Attributes;
|
||||||
|
|
||||||
/* Open the Members subkey */
|
Status = SampGetObjectAttribute(GroupObject,
|
||||||
Status = SampRegOpenKey(GroupObject->KeyHandle,
|
L"Members",
|
||||||
L"Members",
|
NULL,
|
||||||
KEY_READ,
|
NULL,
|
||||||
&MembersKeyHandle);
|
&MembersLength);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_NOT_FOUND)
|
||||||
{
|
|
||||||
TRACE("Status 0x%08lx\n", Status);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
|
||||||
|
|
||||||
/* Retrieve the number of members of the alias */
|
if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
|
||||||
Status = SampRegQueryKeyInfo(MembersKeyHandle,
|
InfoBuffer->General.MemberCount = 0;
|
||||||
NULL,
|
else
|
||||||
&InfoBuffer->General.MemberCount);
|
InfoBuffer->General.MemberCount = MembersLength / sizeof(ULONG);
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
TRACE("Status 0x%08lx\n", Status);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
*Buffer = InfoBuffer;
|
*Buffer = InfoBuffer;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
if (MembersKeyHandle != NULL)
|
|
||||||
SampRegCloseKey(MembersKeyHandle);
|
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
if (InfoBuffer != NULL)
|
if (InfoBuffer != NULL)
|
||||||
|
@ -3941,10 +3930,29 @@ SamrAddMemberToGroup(IN SAMPR_HANDLE GroupHandle,
|
||||||
IN unsigned long MemberId,
|
IN unsigned long MemberId,
|
||||||
IN unsigned long Attributes)
|
IN unsigned long Attributes)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PSAM_DB_OBJECT GroupObject;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("(%p %lu %lx)\n",
|
||||||
|
GroupHandle, MemberId, Attributes);
|
||||||
|
|
||||||
|
/* Validate the group handle */
|
||||||
|
Status = SampValidateDbObject(GroupHandle,
|
||||||
|
SamDbGroupObject,
|
||||||
|
GROUP_ADD_MEMBER,
|
||||||
|
&GroupObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
/* FIXME: Add group membership to the user object */
|
||||||
|
|
||||||
|
Status = SampAddMemberToGroup(GroupObject,
|
||||||
|
MemberId);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Function 21 */
|
/* Function 21 */
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -3954,16 +3962,36 @@ SamrDeleteGroup(IN OUT SAMPR_HANDLE *GroupHandle)
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Function 24 */
|
/* Function 24 */
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle,
|
SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle,
|
||||||
IN unsigned long MemberId)
|
IN unsigned long MemberId)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PSAM_DB_OBJECT GroupObject;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("(%p %lu)\n",
|
||||||
|
GroupHandle, MemberId);
|
||||||
|
|
||||||
|
/* Validate the group handle */
|
||||||
|
Status = SampValidateDbObject(GroupHandle,
|
||||||
|
SamDbGroupObject,
|
||||||
|
GROUP_REMOVE_MEMBER,
|
||||||
|
&GroupObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
/* FIXME: Remove group membership from the user object */
|
||||||
|
|
||||||
|
Status = SampRemoveMemberFromGroup(GroupObject,
|
||||||
|
MemberId);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Function 25 */
|
/* Function 25 */
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: Security Account Manager (LSA) Server
|
* PROJECT: Security Account Manager (SAM) Server
|
||||||
* FILE: reactos/dll/win32/samsrv/samsrv.h
|
* FILE: reactos/dll/win32/samsrv/samsrv.h
|
||||||
* PURPOSE: Common header file
|
* PURPOSE: Common header file
|
||||||
*
|
*
|
||||||
|
@ -109,6 +109,7 @@ typedef struct _SAM_USER_FIXED_DATA
|
||||||
USHORT OperatorCount;
|
USHORT OperatorCount;
|
||||||
} SAM_USER_FIXED_DATA, *PSAM_USER_FIXED_DATA;
|
} SAM_USER_FIXED_DATA, *PSAM_USER_FIXED_DATA;
|
||||||
|
|
||||||
|
|
||||||
/* database.c */
|
/* database.c */
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -143,7 +144,7 @@ SampCloseDbObject(PSAM_DB_OBJECT DbObject);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
|
SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
|
||||||
IN LPWSTR lpAccountName);
|
IN LPCWSTR lpAccountName);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampSetAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
|
SampSetAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
|
||||||
|
@ -170,7 +171,20 @@ SampGetObjectAttributeString(PSAM_DB_OBJECT DbObject,
|
||||||
LPWSTR AttributeName,
|
LPWSTR AttributeName,
|
||||||
RPC_UNICODE_STRING *String);
|
RPC_UNICODE_STRING *String);
|
||||||
|
|
||||||
|
|
||||||
|
/* group.h */
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject,
|
||||||
|
IN ULONG MemberId);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
SampRemoveMemberFromGroup(IN PSAM_DB_OBJECT GroupObject,
|
||||||
|
IN ULONG MemberId);
|
||||||
|
|
||||||
|
|
||||||
/* registry.h */
|
/* registry.h */
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampRegCloseKey(IN HANDLE KeyHandle);
|
SampRegCloseKey(IN HANDLE KeyHandle);
|
||||||
|
|
||||||
|
@ -203,7 +217,7 @@ SampRegQueryKeyInfo(IN HANDLE KeyHandle,
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampRegDeleteValue(IN HANDLE KeyHandle,
|
SampRegDeleteValue(IN HANDLE KeyHandle,
|
||||||
IN LPWSTR ValueName);
|
IN LPCWSTR ValueName);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampRegEnumerateValue(IN HANDLE KeyHandle,
|
SampRegEnumerateValue(IN HANDLE KeyHandle,
|
||||||
|
@ -216,21 +230,27 @@ SampRegEnumerateValue(IN HANDLE KeyHandle,
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampRegQueryValue(IN HANDLE KeyHandle,
|
SampRegQueryValue(IN HANDLE KeyHandle,
|
||||||
IN LPWSTR ValueName,
|
IN LPCWSTR ValueName,
|
||||||
OUT PULONG Type OPTIONAL,
|
OUT PULONG Type OPTIONAL,
|
||||||
OUT LPVOID Data OPTIONAL,
|
OUT LPVOID Data OPTIONAL,
|
||||||
IN OUT PULONG DataLength OPTIONAL);
|
IN OUT PULONG DataLength OPTIONAL);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
SampRegSetValue(IN HANDLE KeyHandle,
|
SampRegSetValue(IN HANDLE KeyHandle,
|
||||||
IN LPWSTR ValueName,
|
IN LPCWSTR ValueName,
|
||||||
IN ULONG Type,
|
IN ULONG Type,
|
||||||
IN LPVOID Data,
|
IN LPVOID Data,
|
||||||
IN ULONG DataLength);
|
IN ULONG DataLength);
|
||||||
|
|
||||||
|
|
||||||
/* samspc.c */
|
/* samspc.c */
|
||||||
|
|
||||||
VOID SampStartRpcServer(VOID);
|
VOID SampStartRpcServer(VOID);
|
||||||
|
|
||||||
|
|
||||||
/* setup.c */
|
/* setup.c */
|
||||||
|
|
||||||
BOOL SampIsSetupRunning(VOID);
|
BOOL SampIsSetupRunning(VOID);
|
||||||
BOOL SampInitializeSAM(VOID);
|
BOOL SampInitializeSAM(VOID);
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue