ICollection <SPUserInfo> EnumerateLocalGroup(SPUser group)
        {
            int    entriesRead;
            int    totalEntries;
            int    resume;
            IntPtr bufPtr;

            DomainAndName     names = new DomainAndName(group.LoginName);
            List <SPUserInfo> users = new List <SPUserInfo>();

            NetLocalGroupGetMembers(names.Domain, names.LoginName, 3, out bufPtr, -1, out entriesRead, out totalEntries, out resume);

            try
            {
                if (entriesRead > 0)
                {
                    LOCALGROUP_MEMBERS_INFO_3[] members = new LOCALGROUP_MEMBERS_INFO_3[entriesRead];
                    IntPtr pointer = bufPtr;
                    for (int i = 0; i < entriesRead; i++)
                    {
                        TimeSpan remaining = RemainingTime;
                        members[i] = (LOCALGROUP_MEMBERS_INFO_3)Marshal.PtrToStructure(pointer, typeof(LOCALGROUP_MEMBERS_INFO_3));
                        pointer    = (IntPtr)((int)pointer + Marshal.SizeOf(typeof(LOCALGROUP_MEMBERS_INFO_3)));

                        ProcessLocalGroupMember(users, names.Domain, members[i].lgrmi3_domainandname);
                    }
                }
            }
            finally
            {
                NetApiBufferFree(bufPtr);
            }

            return(users);
        }
        void ProcessLocalGroupMember(List <SPUserInfo> users, string machineName, string domainAndName)
        {
            DomainAndName names = new DomainAndName(domainAndName);

            if (string.Compare(names.Domain, machineName, true, CultureInfo.InvariantCulture) == 0)
            {
                // Same machine so is a local group
                IntPtr bufPtr = IntPtr.Zero;
                try
                {
                    if (NetUserGetInfo(names.Domain, names.LoginName, 2, out bufPtr) == 0)
                    {
                        USER_INFO_2 user = new USER_INFO_2();
                        user = (USER_INFO_2)Marshal.PtrToStructure(bufPtr, typeof(USER_INFO_2));

                        SPUserInfo spUser = new SPUserInfo();
                        spUser.LoginName = domainAndName;
                        spUser.Name      = user.usri2_full_name;
                        users.Add(spUser);
                    }
                }
                finally
                {
                    if (bufPtr != IntPtr.Zero)
                    {
                        NetApiBufferFree(bufPtr);
                    }
                }
            }
            else
            {
                // Domain user
                try
                {
                    using (DirectoryEntry root = new DirectoryEntry("LDAP://" + names.Domain))
                    {
                        string filter = string.Format(CultureInfo.InvariantCulture, "(sAMAccountname={0})", names.LoginName);
                        using (DirectorySearcher searcher = new DirectorySearcher(root, filter, searchAttributes, SearchScope.Subtree))
                        {
                            ProcessSearchResults(searcher, users);
                        }
                    }
                }
                catch (COMException ex)
                {
                    throw new DomainGroupEnumerationException(String.Format(culture.Culture, culture.Resources.DomainGroupEnumFailed, "LDAP://" + names.Domain), ex);
                }
            }
        }