Introduction
Browsing the Active Directory is hard work if you don't have COM skills. With the simple class presented here, you will query Active Directory and start use the information on it in just a few minutes.
The class is called CNFCActiveDirBrowser
. And the basic methods available are:
bool OpenLDAP();
- Open the basic context.bool Search(_bstr_t ldappath);
- Search.bool First();
bool Next();
bool Previous();
bool Last();
bool GetNextColumnName(_bstr_t& colname);
_variant_t ColValue(_bstr_t colname);
You will navigate the Active Directory with:
br.OpenLDAP();
if (br.Search(_bstr_t(query))) {
int x = 0;
_bstr_t columnname;
int ic = 0;
while (br.GetNextColumnName(columnname)) {
m_lst.InsertColumn(ic++,(LPSTR)columnname, LVCFMT_LEFT, 150);
}
do {
char buf[_MAX_PATH];
LVCOLUMN col;
col.mask = LVCF_TEXT;
col.pszText = buf;
col.cchTextMax = _MAX_PATH;
for (int c = 0; m_lst.GetColumn(c, &col); c++) {
_bstr_t colname(col.pszText);
if (c == 0)
m_lst.InsertItem(x,(LPSTR)_bstr_t(br.ColValue(colname)),0);
else
m_lst.SetItemText(x,c,(LPSTR)_bstr_t(br.ColValue(colname)));
}
x++;
} while (br.Next());
}
Now, you can search by GUIDs with:
br.SearchGUID("{69B3EE5C-89DD-427c-8CC6-764E545ED0AB}");
And navigate all the members of a column:
short ColValue(DWORD index, _bstr_t colname, _variant_t& result);
Now, following comments, I'll populate the group members that Microsoft doesn't show in the member column. These are the members that have the primary group ID equal to the primary group token in the current group. Thanks to Kevin Stanush (SystemTools Software Inc.) for explaining to me the problem.
The primary group token will be retrieved now from the main class getprimaryGroupToken()
, and the users with this primary group token is populated with the same class; as simple as:
CNFCActiveDirBrowser pryusers;
pryusers.OpenLDAP();
s.Format("(&(objectCategory=user)(primaryGroupID=%s))",br.getprimaryGroupToken());
if (pryusers.Search(_bstr_t(s))) {
do {
m_tree.InsertItem((LPSTR)_bstr_t(pryusers.ColValue("cn")),0,0,membercol);
} while (pryusers.Next());
}
This class proved to be useful for my Active Directory integration.