You are here
LDAP Search For Object By SID
All the interesting objects in an Active Directory DSA have an objectSID which is used throughout the Windows subsystems as the reference for the object. When using a Samba4 (or later) domain controller it is possible to simply query for an object by its SID, as one would expect - like "(&(objectSID=S-1-...))". However, when using a Microsoft DC searching for an object by its SID is not as straight-forward; attempting to do so will only result in an invalid search filter error. Active Directory stores the objectSID as a binary value and one needs to search for it as such. Fortunately converting the text string SID value to a hex string is easy: see the guid2hex(text_sid) below.
import ldap
import ldap.sasl
import ldaphelper
PDC_LDAP_URI = 'ldap://pdc.example.com'
OBJECT_SID = 'S-1-5-21-2037442776-3290224752-88127236-1874'
LDAP_ROOT_DN = 'DC=example,DC=com'
def guid2hex(text_sid):
"""convert the text string SID to a hex encoded string"""
s = ['\\{:02X}'.format(ord(x)) for x in text_sid]
return ''.join(s)
def get_ldap_results(result):
return ldaphelper.get_search_results(result)
if __name__ == '__main__':
pdc = ldap.initialize(PDC_LDAP_URI)
pdc.sasl_interactive_bind_s("", ldap.sasl.gssapi())
result = pdc.search_s(
LDAP_ROOT_DN, ldap.SCOPE_SUBTREE,
'(&(objectSID={0}))'.format(guid2hex(OBJECT_SID), ),
[ '*', ]
)
for obj in [x for x in get_ldap_results(result) if x.get_dn()]:
"""filter out objects lacking a DN - they are LDAP referrals"""
print('DN: {0}'.format(obj.get_dn(), ))
pdc.unbind()
- Log in to post comments