PHP LDAP检索非默认属性/特性“lockedOut”

uttx8gqw  于 2023-01-16  发布在  PHP
关注(0)|答案(2)|浏览(129)

PHP LDAP扩展是否有办法检索默认情况下不返回的AD属性/特性?
具体来说,我正在尝试检索lockedOut属性。当您使用ldap_get_attributes时,默认情况下不会检索此属性。在PowerShell中,您必须指定属性才能检索它:

Get-AdUser -Identity foo -Properties LockedOut | Select LockedOut

但是尝试用PHPLDAP相同的方式指定属性似乎不起作用。

$result = ldap_search($conn, $dn, "cn=foo", ["lockedOut"]);
if ($result === false) {
    // Handling error...
}
$count = ldap_count_entries($conn, $result);
if ($count !== 1) {
    // Handling error...
}
$entry = ldap_first_entry($conn, $result);

// This array does not contain the expected "lockedOut" attribute
$attr = ldap_get_attributes($conn, $entry);

// No array returned but false (error)
$value = ldap_get_values($conn, $entry, "lockedOut")

我觉得这些非默认属性是不能用PHP LDAP(property!= attribute)检索的。

siv3szwd

siv3szwd1#

我不知道lockedOut属性,但是PHP手册页上的一个评论者设法获取了一些其他的非标准或操作属性,例如使用下面的方法创建和修改时间戳。也许,您可以尝试将lockedOut添加到该属性列表中,并使用此方法获得一些成功?

$conn = $ds;
   $attrs = array( 'creatorsname', 'createtimestamp', 'modifiersname',
         'structuralObjectClass', 'entryUUID',  'modifytimestamp',
         'subschemaSubentry', 'hasSubordinates', '+' );
   $search = @ldap_read( $conn, $dn, '(objectClass=*)', $attrs, 0, 0, 0, $deref );

正如手册页上的另一条注解所建议的,您也可以尝试遍历所有条目,直到找到lockedOut,这是另一个选项:

$entry = ldap_first_entry($ds, $sr);
write_attr($entry,$ds);
for ($i = 0; $i < $n_entries; $i++){
   $entry = ldap_next_entry($ds, $entry);
   write_attr($entry,$ds);
}
    • 编辑**

如前所述,另请参阅this answer
如果你只想知道用户是否被锁定,你可以读取lockoutTime并检查它的值,零或未设置的值表示用户没有被锁定。

luaexgnf

luaexgnf2#

有一个默认属性可作为解决方法执行此工作:lockoutTime.
它似乎是这样运作的:

  • 帐户从未锁定:lockoutTime = <not set>
  • 帐户过去锁定,但现在解除锁定:lockoutTime = 0
  • 帐户已锁定:lockoutTime = 1+

(= MS文件时间;自1601 - 01 - 01 UTC以来的100纳秒)
解决方法代码:

$result = ldap_search($conn, $dn, "cn=foo", ["lockoutTime"]);
if ($result === false) {
    // Handling error...
}
$count = ldap_count_entries($conn, $result);
if ($count !== 1) {
    // Handling error...
}
$entry = ldap_first_entry($conn, $result);
$attr = ldap_get_attributes($conn, $entry);

$rawLockoutTime = $attr["lockouttime"] ?? null;
$isLockedOut = $rawLockoutTime !== null && $rawLockoutTime[0] !== "0";

A reference about it在Python LDAP的帖子上。

相关问题