static VOID UpdateGroupsList(HWND hwndListView) { NET_API_STATUS netStatus; PLOCALGROUP_INFO_1 pBuffer; DWORD entriesread; DWORD totalentries; DWORD_PTR resume_handle = 0; DWORD i; LV_ITEM lvi; INT iItem; for (;;) { netStatus = NetLocalGroupEnum(NULL, 1, (LPBYTE*)&pBuffer, 1024, &entriesread, &totalentries, &resume_handle); if (netStatus != NERR_Success && netStatus != ERROR_MORE_DATA) break; for (i = 0; i < entriesread; i++) { memset(&lvi, 0x00, sizeof(lvi)); lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE; lvi.pszText = pBuffer[i].lgrpi1_name; lvi.state = 0; lvi.iImage = 0; iItem = ListView_InsertItem(hwndListView, &lvi); ListView_SetItemText(hwndListView, iItem, 1, pBuffer[i].lgrpi1_comment); } NetApiBufferFree(pBuffer); /* No more data left */ if (netStatus != ERROR_MORE_DATA) break; } }
std::vector<Group*> UserUtilities::GetGroupList() { std::vector<Group*> lstGroups; LOCALGROUP_INFO_1* grpInfo = NULL; LOCALGROUP_INFO_1* tempgrpInfo; DWORD entriesRead = 0; DWORD totalEntries = 0; DWORD resume = 0; int res = NetLocalGroupEnum(NULL, 1, (LPBYTE*)&grpInfo, -1, &entriesRead, &totalEntries, &resume); if(entriesRead > 0) { tempgrpInfo = grpInfo; for(int i = 0;i < entriesRead;i++) { Group* grp = new Group(); grp->m_StrGroupName = tempgrpInfo->lgrpi1_name; grp->m_StrDescription = tempgrpInfo->lgrpi1_comment; lstGroups.push_back(grp); tempgrpInfo++; } } if(grpInfo) { NetApiBufferFree(grpInfo); grpInfo = NULL; } return lstGroups; }
bool CWfpNET::LocalGroups_get(void) // Enumerate Groups { NET_API_STATUS nStatus = NULL; LPLOCALGROUP_INFO_1 pBuf = NULL, pTmpBuf = NULL; DWORD i = 0, entriesread = 0, totalentries = 0; CString tmp; // The NetQueryDisplayInformation function returns user account information // No special group membership is required to successfully execute the // NetQueryDisplayInformation function. // 1 indicates User account information do { nStatus = NetLocalGroupEnum(node.szComputerW,1,(LPBYTE *)&pBuf,MAX_PREFERRED_LENGTH, &entriesread, &totalentries, NULL); if(nStatus == NERR_Success || nStatus == ERROR_MORE_DATA) { if((pTmpBuf = pBuf) != NULL) { for(i = 0; i < entriesread; i++) { assert(pTmpBuf != NULL); if (pTmpBuf == NULL) break; tmp.Format(_T("%S \"%S\""), pTmpBuf->lgrpi1_name, pTmpBuf->lgrpi1_comment); Groups.Add(tmp); GroupMembers_get(pTmpBuf->lgrpi1_name); pTmpBuf++; } } if(pBuf != NULL) { NetApiBufferFree(pBuf); pBuf = NULL; } } else { ErrorHandler("NetLocalGroupEnum",nStatus); return false; } } while(nStatus==ERROR_MORE_DATA); return(1); }
static int get_all_local_groups(struct oscap_list *list) { NET_API_STATUS status; LOCALGROUP_INFO_0 *buffer = NULL; DWORD preffered_max_len = MAX_PREFERRED_LENGTH; DWORD entries_read = 0; DWORD total_entries = 0; DWORD resume_handle = 0; status = NetLocalGroupEnum(NULL, 0, (LPBYTE *)&buffer, preffered_max_len, &entries_read, &total_entries, &resume_handle); if (status != NERR_Success) { dD("NetLocalGroupEnum failed: %d", status); return 1; } for (DWORD i = 0; i < entries_read; i++) { WCHAR *group_name = buffer[i].lgrpi0_name; oscap_list_add(list, wcsdup(group_name)); } NetApiBufferFree(buffer); return 0; }
static VOID InitUserGroupsList(HWND hwndDlg) { HWND hwndLV; LV_COLUMN column; RECT rect; TCHAR szStr[32]; NET_API_STATUS netStatus; PLOCALGROUP_INFO_1 pBuffer; DWORD entriesread; DWORD totalentries; DWORD_PTR resume_handle = 0; DWORD i; LV_ITEM lvi; INT iItem; HIMAGELIST hImgList; HICON hIcon; hwndLV = GetDlgItem(hwndDlg, IDC_USER_ADD_MEMBERSHIP_LIST); GetClientRect(hwndLV, &rect); hImgList = ImageList_Create(16,16,ILC_COLOR8 | ILC_MASK,5,5); hIcon = LoadImage(hApplet,MAKEINTRESOURCE(IDI_GROUP),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); ImageList_AddIcon(hImgList,hIcon); DestroyIcon(hIcon); (void)ListView_SetImageList(hwndLV, hImgList, LVSIL_SMALL); (void)ListView_SetExtendedListViewStyle(hwndLV, LVS_EX_FULLROWSELECT); memset(&column, 0x00, sizeof(column)); column.mask = LVCF_FMT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; column.fmt = LVCFMT_LEFT; column.cx = (INT)((rect.right - rect.left) * 0.40); column.iSubItem = 0; LoadString(hApplet, IDS_NAME, szStr, sizeof(szStr) / sizeof(szStr[0])); column.pszText = szStr; (void)ListView_InsertColumn(hwndLV, 0, &column); column.cx = (INT)((rect.right - rect.left) * 0.60); column.iSubItem = 1; LoadString(hApplet, IDS_DESCRIPTION, szStr, sizeof(szStr) / sizeof(szStr[0])); column.pszText = szStr; (void)ListView_InsertColumn(hwndLV, 1, &column); for (;;) { netStatus = NetLocalGroupEnum(NULL, 1, (LPBYTE*)&pBuffer, 1024, &entriesread, &totalentries, &resume_handle); if (netStatus != NERR_Success && netStatus != ERROR_MORE_DATA) break; for (i = 0; i < entriesread; i++) { memset(&lvi, 0x00, sizeof(lvi)); lvi.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE; lvi.pszText = pBuffer[i].lgrpi1_name; lvi.state = 0; lvi.iImage = 0; iItem = ListView_InsertItem(hwndLV, &lvi); ListView_SetItemText(hwndLV, iItem, 1, pBuffer[i].lgrpi1_comment); } NetApiBufferFree(pBuffer); /* No more data left */ if (netStatus != ERROR_MORE_DATA) break; } }
static int enum_local_groups (domlist_t *mach, const char *sep, DWORD id_offset, char *disp_groupname, int print_builtin, int print_current) { WCHAR machine[INTERNET_MAX_HOST_NAME_LENGTH + 1]; LOCALGROUP_INFO_0 *buffer; DWORD entriesread = 0; DWORD totalentries = 0; DWORD_PTR resume_handle = 0; WCHAR gname[GNLEN + 1]; DWORD rc; int ret = mbstowcs (machine, mach->str, INTERNET_MAX_HOST_NAME_LENGTH + 1); if (ret < 1 || ret >= INTERNET_MAX_HOST_NAME_LENGTH + 1) { fprintf (stderr, "%s: Invalid machine name '%s'. Skipping...\n", program_invocation_short_name, mach->str); return 1; } do { DWORD i; if (disp_groupname) { mbstowcs (gname, disp_groupname, GNLEN + 1); rc = NetLocalGroupGetInfo (machine, gname, 0, (void *) &buffer); if (rc == ERROR_SUCCESS) entriesread = 1; /* Allow further searching for the group and avoid annoying error messages just because the group is not a local group or the group hasn't been found. */ else if (rc == ERROR_NO_SUCH_ALIAS || rc == NERR_GroupNotFound) return 0; } else rc = NetLocalGroupEnum (machine, 0, (void *) &buffer, MAX_PREFERRED_LENGTH, &entriesread, &totalentries, &resume_handle); switch (rc) { case ERROR_ACCESS_DENIED: print_win_error (rc); return 1; case ERROR_MORE_DATA: case ERROR_SUCCESS: break; default: print_win_error (rc); return 1; } for (i = 0; i < entriesread; i++) { WCHAR domain_name[MAX_DOMAIN_NAME_LEN + 1]; DWORD domname_len = MAX_DOMAIN_NAME_LEN + 1; char psid_buffer[MAX_SID_LEN]; PSID psid = (PSID) psid_buffer; DWORD sid_length = MAX_SID_LEN; DWORD gid; SID_NAME_USE acc_type; PDBGSID pdsid; BOOL is_builtin = FALSE; if (!LookupAccountNameW (machine, buffer[i].lgrpi0_name, psid, &sid_length, domain_name, &domname_len, &acc_type)) { print_win_error (GetLastError ()); fprintf (stderr, " (%ls)\n", buffer[i].lgrpi0_name); continue; } else if (acc_type == SidTypeDomain) { WCHAR domname[MAX_DOMAIN_NAME_LEN + GNLEN + 2]; wcscpy (domname, domain_name); wcscat (domname, L"\\"); wcscat (domname, buffer[i].lgrpi0_name); sid_length = MAX_SID_LEN; domname_len = MAX_DOMAIN_NAME_LEN + 1; if (!LookupAccountNameW (machine, domname, psid, &sid_length, domain_name, &domname_len, &acc_type)) { print_win_error (GetLastError ()); fprintf(stderr, " (%ls)\n", domname); continue; } } /* Store all local SIDs with prefix "S-1-5-32-" and check if it has been printed already. This allows to get all builtin groups exactly once and not once per domain. */ pdsid = (PDBGSID) psid; if (pdsid->IdentifierAuthority.Value[5] == sid_nt_auth.Value[5] && pdsid->SubAuthority[0] == SECURITY_BUILTIN_DOMAIN_RID) { int b; if (!print_builtin) goto skip_group; is_builtin = TRUE; if (builtin_sid_cnt) for (b = 0; b < builtin_sid_cnt; b++) if (EqualSid (&builtin_sid_list[b], psid)) goto skip_group; if (builtin_sid_cnt < MAX_BUILTIN_SIDS) CopySid (sizeof (DBGSID), &builtin_sid_list[builtin_sid_cnt++], psid); } if (!print_current) /* fall through */; else if (EqualSid (curr_pgrp.psid, psid)) got_curr_pgrp = TRUE; gid = *GetSidSubAuthority (psid, *GetSidSubAuthorityCount(psid) - 1); printf ("%ls%s%ls:%s:%" PRIu32 ":\n", mach->with_dom && !is_builtin ? domain_name : L"", mach->with_dom || is_builtin ? sep : "", buffer[i].lgrpi0_name, put_sid (psid), (unsigned int) (gid + (is_builtin ? 0 : id_offset))); skip_group: ; } NetApiBufferFree (buffer); } while (rc == ERROR_MORE_DATA); /* Return 1 if the single group we're looking for has been found here to avoid calling enum_groups for the same group, thus avoiding a spurious error message "group name could not be found" in enum_groups. */ return disp_groupname && entriesread ? 1 : 0; }