[SAMSRV]
authorEric Kohl <eric.kohl@reactos.org>
Sun, 13 Jan 2013 19:51:33 +0000 (19:51 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 13 Jan 2013 19:51:33 +0000 (19:51 +0000)
Implement SamrGetMembersInGroup.

svn path=/trunk/; revision=58170

reactos/dll/win32/samsrv/samrpc.c
reactos/dll/win32/samsrv/samsrv.h
reactos/dll/win32/samsrv/user.c

index 27516bb..6d7a257 100644 (file)
@@ -4055,10 +4055,102 @@ NTAPI
 SamrGetMembersInGroup(IN SAMPR_HANDLE GroupHandle,
                       OUT PSAMPR_GET_MEMBERS_BUFFER *Members)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
+    PSAMPR_GET_MEMBERS_BUFFER MembersBuffer = NULL;
+    PSAM_DB_OBJECT GroupObject;
+    ULONG Length = 0;
+    ULONG i;
+    NTSTATUS Status;
+
+    /* Validate the group handle */
+    Status = SampValidateDbObject(GroupHandle,
+                                  SamDbGroupObject,
+                                  GROUP_LIST_MEMBERS,
+                                  &GroupObject);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    MembersBuffer = midl_user_allocate(sizeof(SAMPR_GET_MEMBERS_BUFFER));
+    if (MembersBuffer == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    SampGetObjectAttribute(GroupObject,
+                           L"Members",
+                           NULL,
+                           NULL,
+                           &Length);
+
+    if (Length == 0)
+    {
+        MembersBuffer->MemberCount = 0;
+        MembersBuffer->Members = NULL;
+        MembersBuffer->Attributes = NULL;
+
+        *Members = MembersBuffer;
+
+        return STATUS_SUCCESS;
+    }
+
+    MembersBuffer->Members = midl_user_allocate(Length);
+    if (MembersBuffer->Members == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    MembersBuffer->Attributes = midl_user_allocate(Length);
+    if (MembersBuffer->Attributes == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    Status = SampGetObjectAttribute(GroupObject,
+                                    L"Members",
+                                    NULL,
+                                    MembersBuffer->Members,
+                                    &Length);
+    if (!NT_SUCCESS(Status))
+    {
+        TRACE("SampGetObjectAttributes() failed (Status 0x%08lx)\n", Status);
+        goto done;
+    }
+
+    MembersBuffer->MemberCount = Length / sizeof(ULONG);
+
+    for (i = 0; i < MembersBuffer->MemberCount; i++)
+    {
+        Status = SampGetUserGroupAttributes(GroupObject->ParentObject,
+                                            MembersBuffer->Members[i],
+                                            GroupObject->RelativeId,
+                                            &(MembersBuffer->Attributes[i]));
+        if (!NT_SUCCESS(Status))
+        {
+            TRACE("SampGetUserGroupAttributes() failed (Status 0x%08lx)\n", Status);
+            goto done;
+        }
+    }
+
+    *Members = MembersBuffer;
+
+done:
+    if (!NT_SUCCESS(Status))
+    {
+        if (MembersBuffer != NULL)
+        {
+            if (MembersBuffer->Members != NULL)
+                midl_user_free(MembersBuffer->Members);
+
+            if (MembersBuffer->Attributes != NULL)
+                midl_user_free(MembersBuffer->Attributes);
+
+            midl_user_free(MembersBuffer);
+        }
+    }
+
+    return Status;
 }
 
+
 /* Function 26 */
 NTSTATUS
 NTAPI
index eab6647..7de5ce1 100644 (file)
@@ -271,12 +271,18 @@ SampOpenUserObject(IN PSAM_DB_OBJECT DomainObject,
                    OUT PSAM_DB_OBJECT *UserObject);
 
 NTSTATUS
-SampAddGroupMembershipToUser(PSAM_DB_OBJECT UserObject,
-                             ULONG GroupId,
-                             ULONG Attributes);
+SampAddGroupMembershipToUser(IN PSAM_DB_OBJECT UserObject,
+                             IN ULONG GroupId,
+                             IN ULONG Attributes);
 
 NTSTATUS
-SampRemoveGroupMembershipFromUser(PSAM_DB_OBJECT UserObject,
-                                  ULONG GroupId);
+SampRemoveGroupMembershipFromUser(IN PSAM_DB_OBJECT UserObject,
+                                  IN ULONG GroupId);
+
+NTSTATUS
+SampGetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject,
+                           IN ULONG UserId,
+                           IN ULONG GroupId,
+                           OUT PULONG GroupAttributes);
 
 /* EOF */
index be7042e..f3174c6 100644 (file)
@@ -185,4 +185,72 @@ done:
     return Status;
 }
 
+
+NTSTATUS
+SampGetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject,
+                           IN ULONG UserId,
+                           IN ULONG GroupId,
+                           OUT PULONG 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)
+    {
+        *GroupAttributes = 0;
+        return STATUS_SUCCESS;
+    }
+
+    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)
+        {
+            *GroupAttributes = GroupsBuffer[i].Attributes;
+            goto done;
+        }
+    }
+
+done:
+    if (GroupsBuffer != NULL)
+        midl_user_free(GroupsBuffer);
+
+    if (UserObject != NULL)
+        SampCloseDbObject(UserObject);
+
+    return Status;
+}
+
 /* EOF */