2012-08-03 29 views
12

में एलडीएपी का उपयोग कर एक सक्रिय निर्देशिका उपयोगकर्ता खाता लॉक है या नहीं, मैं पाइथन के एलडीएपी मॉड्यूल का उपयोग कर उपयोगकर्ता लॉगिन को मान्य कर रहा हूं। जब लॉगिन विफल रहता है, तो मुझे ldap.INVALID_CREDENTIALS लॉगिन मिलता है, लेकिन यह गलत पासवर्ड की वजह से हो सकता है या क्योंकि खाता लॉक हो जाता है। तीसरे प्रयास के बाद खाता लॉक हो गया है।पता लगाएं कि पाइथन

मैं यह जानना चाहता हूं कि खाता लॉक है और उसी "अमान्य लॉगिन" संदेश की बजाय निराश उपयोगकर्ता को रिपोर्ट करें।

एक समाधान मैंने पाया इसकी खोज:

  • userAccountControl LOCKED झंडा ई द्वारा नहीं किया जाता है;
  • lockoutTime विशेषता के बजाय इस्तेमाल किया जाना चाहिए

LDAP क्वेरी मैं बंद कर दिया उपयोगकर्ताओं को खोजने के लिए उपयोग करना चाहिए है:

(&(objectClass=user)(lockoutTime>=1)) 

या किसी विशिष्ट उपयोगकर्ता के लिए:

(&(objectClass=user)(sAMAccountName=jabberwocky)(lockoutTime>=1)) 

लेकिन यह काम नहीं कर रहा है, क्वेरी हर बार कोई परिणाम नहीं देता है।

उत्तर

7

lockoutTime में शून्य का मान यह है कि यह लॉक नहीं है। तो, आपको यह कोशिश करनी चाहिए।

(&(objectClass=user)(!lockoutTime=0)) 

वास्तव में, उपरोक्त क्वेरी अभी भी 100% सही नहीं है। यदि आप एमएसडीएन से बढ़िया प्रिंट पढ़ते हैं, तो माइक्रोसॉफ्ट आपको Lockout-Time विशेषता Lockout-Duration विशेषता में जोड़ने का सुझाव दे रहा है और फिर वर्तमान समय के साथ तुलना करें। ऐसा इसलिए है क्योंकि लॉकआउट अवधि कहा जाता है। एक बार लॉकआउट अवधि गुजरने के बाद, उपयोगकर्ता स्वचालित रूप से अनलॉक हो जाता है। शून्य में Lockout-Duration का अर्थ है कि जब तक व्यवस्थापक इसे अनलॉक नहीं करता तब तक खाता हमेशा लॉक हो जाता है।

इस MSDN article

This attribute value is only reset when the account is logged onto successfully. This means that this value may be non zero, yet the account is not locked out. To accurately determine if the account is locked out, you must add the Lockout-Duration to this time and compare the result to the current time, accounting for local time zones and daylight savings time.

+0

के बराबर नहीं है मैं 'मिल ldap.FILTER_ERROR: { 'की वर्णन': 'बुरा खोज फ़िल्टर'} 'अगर उपयोग कर रहे हैं (! lockoutTime = 0) ', या यहां तक ​​कि' (लॉकआउटटाइम> 0) '। केवल '(! LockoutTime> = 1) 'इस से बचने के लिए प्रतीत होता है। –

3

इसके अलावा देखें, मैंने पाया कि lockoutTime ईस्वी में सभी उपयोगकर्ताओं (कम से कम हमारे विन्यास में) के लिए गारंटी नहीं है, लेकिन असफल तालाबंदी प्रयासों की संख्या पर पहुंच कर बनाया जाएगा। इसलिए लॉक किए गए खातों की जांच में, किसी भी या समकक्ष की जांच करने की आवश्यकता नहीं होगी।

(&(objectClass=user)(lockoutDuration=*))) 

गैर खाली प्रविष्टियों के लिए:

+3

मुझे यह मामला भी मिला। यदि उपयोगकर्ता ने कभी भी अपना खाता लॉक नहीं किया है तो विशेषता 'लॉकआउटटाइम' सेट नहीं होगी। यदि किसी भी समय उन्होंने अपना खाता लॉक कर लिया है और तब से लॉग इन किया है, लेकिन उनका खाता अब लॉक नहीं है, तो विशेषता 0 पर सेट की जाएगी। – ChadSikorra

4

lockoutTime तो सबसे आसान तरीका उपयोग करने के लिए है एक <not set> विशेषता है।

अद्यतन:

हालांकि, इस मूल्य भी सेट कर दिया जाता है जब पासवर्ड समाप्त होने से, पासवर्ड बदलने की जरूरत आदि

तो यह द्वारा फ़िल्टर किया जा करने की जरूरत है:

UserPrincipal userPrincipal = new UserPrincipal(context); 
bool isLocked = userPrincipal.IsAccountLockedOut(); 

को उन मामलों को प्राप्त करें जहां उपयोगकर्ता लॉक हो गया है क्योंकि उन्होंने पासवर्ड नीति का उल्लंघन किया है, उदाहरण के लिए गलत तरीके से पासवर्ड दर्ज किया गया है।

1

उपयोग इस क्वेरी के लिए सबसे अच्छा परिणाम प्राप्त करने के,

प्राप्त करें-ADUser -LDAPFilter "(& (objectCategory = व्यक्ति) (objectClass = user) (lockoutTime> = 1))" -Properties LockedOut

0

How to use the UserAccountControl flags

SCRIPT 0x0001 1 
ACCOUNTDISABLE 0x0002 2 
HOMEDIR_REQUIRED 0x0008 8 
LOCKOUT 0x0010 16 
PASSWD_NOTREQD 0x0020 32 
PASSWD_CANT_CHANGE 0x0040 64 
ENCRYPTED_TEXT_PWD_ALLOWED 0x0080 128 
TEMP_DUPLICATE_ACCOUNT 0x0100 256 
NORMAL_ACCOUNT 0x0200 512 
INTERDOMAIN_TRUST_ACCOUNT 0x0800 2048 
WORKSTATION_TRUST_ACCOUNT 0x1000 4096 
SERVER_TRUST_ACCOUNT 0x2000 8192 
DONT_EXPIRE_PASSWORD 0x10000 65536 
MNS_LOGON_ACCOUNT 0x20000 131072 
SMARTCARD_REQUIRED 0x40000 262144 
TRUSTED_FOR_DELEGATION 0x80000 524288 
NOT_DELEGATED 0x100000 1048576 
USE_DES_KEY_ONLY 0x200000 2097152 
DONT_REQ_PREAUTH 0x400000 4194304 
PASSWORD_EXPIRED 0x800000 8388608 
TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000 16777216 
PARTIAL_SECRETS_ACCOUNT 0x04000000  67108864 

आप बनाना चाहिए एक द्विआधारी-और संपत्ति userAccountControl की 0x002 साथ: मैं भी संपत्ति झंडे की इस सूची में पाया। आदेश में सभी लॉक हो जाए (यानी विकलांग) खातों

(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2)) 

उपयोग कर सकते हैं ऑपरेटर 1.2.840.113556.1.4.803 देख LDAP Matching Rules

0

(& (objectClass = user) (& (lockoutTime = *) (! (lockoutTime = 0 के लिए))))

वस्तुओं उन जो कर रहे हैं वापसी करेंगे और है lockoutTime नाम के एक वर्तमान विशेषता है जो 0.

संबंधित मुद्दे