Reputation: 2165
Is there a way with the PHP LDAP extension to retrieve AD attributes/properties that are not returned by default?
Specifically, I am trying to retrieve the lockedOut
property. This one is not retrieved by default when you use ldap_get_attributes
. In PowerShell, you have to specify the property in order to retrieve it:
Get-AdUser -Identity foo -Properties LockedOut | Select LockedOut
But trying to specify the attribute the same way with PHP LDAP does not seem to work.
$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")
I feel like those non default properties are not retrievable with PHP LDAP (property != attribute).
Upvotes: 1
Views: 274
Reputation: 2165
There is a default attribute that does the job as a workaround: lockoutTime
.
It seems to work this way:
lockoutTime = <not set>
lockoutTime = 0
lockoutTime = 1+
The workaround code:
$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 on a post for the Python LDAP.
Upvotes: 1
Reputation: 3663
I don't know about the lockedOut
property but one commenter on PHP manual page managed to fetch a few other non-standard or operational attributes such as create and modify timestamps using the below method. Maybe, you can try adding lockedOut
to that list of attributes and achieve some success with this method too?
$conn = $ds;
$attrs = array( 'creatorsname', 'createtimestamp', 'modifiersname',
'structuralObjectClass', 'entryUUID', 'modifytimestamp',
'subschemaSubentry', 'hasSubordinates', '+' );
$search = @ldap_read( $conn, $dn, '(objectClass=*)', $attrs, 0, 0, 0, $deref );
As another comment on the manual page suggests, you can also try looping through all entries until you find the lockedOut
, this is another option:
$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);
}
Edit
As discussed, also refer to this answer.
If you just want to know if the user is locked out, you can fetch lockoutTime
instead and check its value. A zero or unset value for this means the user isn't locked out.
Upvotes: 1