在 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
可以被细粒度的密码策略覆盖。
我正在改进一些代码,以帮助测试是否正确监控了密码喷洒。 这是注入的 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
可以被细粒度的密码策略覆盖。