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); } } }