在 C++ 中通过 LDAP 从 Active Directory 检索特定数据(获取锁定阈值)

Retrieving specific data from Active Directory via LDAP in C++ (getting lockout threshold)

我正在改进一些代码,以帮助测试是否正确监控了密码喷洒。 这是注入的 DLL 的源代码: https://github.com/outflanknl/Spray-AD/blob/master/Src/Spray-AD/Spray-AD/ReflectiveDll.cpp

此 DLL 当前的问题是它可能会锁定用户(因为某些用户的用户名可能已经有一些 badPwdCount),因此我需要正确检查用户当前的 badPwdCount 是多少以及在尝试作为特定用户进行身份验证之前为每个用户设置 thresholdLockout(因为不同的用户可能有不同的密码策略)。

幸运的是,badPwdCount 并不难实现,我已经正确修改了 LDAP 过滤器:

WCHAR* pszPropertyList[3] = { L"sAMAccountName" , L"badPwdCount" , L"lockoutThreshold"};

并正确配置了 ExecuteSearch 函数:

else
{
    // Return specified properties
    hr = pContainerToSearch->ExecuteSearch(pszSearchFilter,
        pszPropertyList,
        3,
        &hSearch);
}

还有 switch case,所以它会正确捕获 badPwdCount:

case ADSTYPE_INTEGER:
for (x = 0; x < col.dwNumValues; x++) {
    if (_wcsicmp(col.pszAttrName, L"badPwdCount") == 0) {
        if (col.pADsValues->Integer >= 4 || col.pADsValues->Integer == 0) {  
            /*some code*/
            break;
        }
    }
}

但由于我想将 badPwdCount 与该特定用户的锁定阈值(而不是上面示例中的 4)进行比较,我尝试提取 lockoutThreshold 属性,如下所示: https://docs.microsoft.com/en-us/windows/win32/adschema/a-lockoutthreshold

虽然我似乎无法得到阈值锁定的任何结果。代码甚至没有 return 未知类型错误:

default:
     wprintf(L"[!] Unknown type %d.\n", col.dwADsType);

这对我来说很奇怪,因为我可以毫无问题地检索其他属性(例如 badPasswordTime)。

如何正确检索锁定阈值?代码示例会很棒。

在您链接到的 documentation for lockoutThreshold 中,查看 "Classes used in",其中列出:

  • 域策略
  • Sam 域
  • Sam 域名基础

请注意,它不包括 "User"。

您不会在用户帐户上找到此属性。您会在域的根节点上找到它。

但是,正如您所发现的,lockoutThreshold 可以被细粒度的密码策略覆盖。