diff --git a/reactos/dll/win32/samsrv/samrpc.c b/reactos/dll/win32/samsrv/samrpc.c index 6d7a257a1ed..dcdb4cef3d3 100644 --- a/reactos/dll/win32/samsrv/samrpc.c +++ b/reactos/dll/win32/samsrv/samrpc.c @@ -4158,8 +4158,30 @@ SamrSetMemberAttributesOfGroup(IN SAMPR_HANDLE GroupHandle, IN unsigned long MemberId, IN unsigned long Attributes) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PSAM_DB_OBJECT GroupObject; + NTSTATUS Status; + + /* Validate the group handle */ + Status = SampValidateDbObject(GroupHandle, + SamDbGroupObject, + GROUP_ADD_MEMBER, + &GroupObject); + if (!NT_SUCCESS(Status)) + { + TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status); + return Status; + } + + Status = SampSetUserGroupAttributes(GroupObject->ParentObject, + MemberId, + GroupObject->RelativeId, + Attributes); + if (!NT_SUCCESS(Status)) + { + TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status); + } + + return Status; } diff --git a/reactos/dll/win32/samsrv/samsrv.h b/reactos/dll/win32/samsrv/samsrv.h index 7de5ce15cfb..c07d0ea40a1 100644 --- a/reactos/dll/win32/samsrv/samsrv.h +++ b/reactos/dll/win32/samsrv/samsrv.h @@ -285,4 +285,10 @@ SampGetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject, IN ULONG GroupId, OUT PULONG GroupAttributes); +NTSTATUS +SampSetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject, + IN ULONG UserId, + IN ULONG GroupId, + IN ULONG GroupAttributes); + /* EOF */ diff --git a/reactos/dll/win32/samsrv/user.c b/reactos/dll/win32/samsrv/user.c index f3174c627a5..0805e4475e0 100644 --- a/reactos/dll/win32/samsrv/user.c +++ b/reactos/dll/win32/samsrv/user.c @@ -214,10 +214,7 @@ SampGetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject, &Length); if (Length == 0) - { - *GroupAttributes = 0; - return STATUS_SUCCESS; - } + return STATUS_UNSUCCESSFUL; /* FIXME */ GroupsBuffer = midl_user_allocate(Length); if (GroupsBuffer == NULL) @@ -253,4 +250,75 @@ done: return Status; } + +NTSTATUS +SampSetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject, + IN ULONG UserId, + IN ULONG GroupId, + IN ULONG GroupAttributes) +{ + PSAM_DB_OBJECT UserObject = NULL; + PGROUP_MEMBERSHIP GroupsBuffer = NULL; + ULONG Length = 0; + ULONG i; + NTSTATUS Status; + + Status = SampOpenUserObject(DomainObject, + UserId, + 0, + &UserObject); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + SampGetObjectAttribute(UserObject, + L"Groups", + NULL, + NULL, + &Length); + + if (Length == 0) + return STATUS_UNSUCCESSFUL; /* FIXME */ + + GroupsBuffer = midl_user_allocate(Length); + if (GroupsBuffer == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = SampGetObjectAttribute(UserObject, + L"Groups", + NULL, + GroupsBuffer, + &Length); + if (!NT_SUCCESS(Status)) + goto done; + + for (i = 0; i < (Length / sizeof(GROUP_MEMBERSHIP)); i++) + { + if (GroupsBuffer[i].RelativeId == GroupId) + { + GroupsBuffer[i].Attributes = GroupAttributes; + break; + } + } + + Status = SampSetObjectAttribute(UserObject, + L"Groups", + REG_BINARY, + GroupsBuffer, + Length); + +done: + if (GroupsBuffer != NULL) + midl_user_free(GroupsBuffer); + + if (UserObject != NULL) + SampCloseDbObject(UserObject); + + return Status; +} + /* EOF */