我正在使用python的ldap模块验证用户登录.登录失败时,我会收到ldap.INVALID_CREDENTIALS登录信息,但这可能是因为密码错误或帐户被锁定.在第3次尝试后帐户被锁定.
我想检测到该帐户已被锁定并向受挫的用户报告,而不是相同的"无效登录"消息.
寻找解决方案我发现:
我应该用来查找锁定用户的LDAP查询是:
(&(objectClass=user)(lockoutTime>=1))
Run Code Online (Sandbox Code Playgroud)
或者对于特定用户:
(&(objectClass=user)(sAMAccountName=jabberwocky)(lockoutTime>=1))
Run Code Online (Sandbox Code Playgroud)
但这不起作用,查询每次都不返回任何结果.
美好的一天.
提前为我的英语道歉,我的国家论坛和资源没有帮助.
脚本中需要在AD中更改(或创建)用户密码.
在研究了这个问题后,很明显
一般来说,第二个没有问题,但首先有问题
$ python ldap-test-starttls.py
Traceback (most recent call last):
File "ldap-test-starttls.py", line 9, in <module>
l.simple_bind_s( "cn=admin,ou=users,dc=test,dc=ru", "password" )
File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 206, in simple_bind_s
msgid = self.simple_bind(who,cred,serverctrls,clientctrls)
File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 200, in simple_bind
return self._ldap_call(self._l.simple_bind,who,cred,EncodeControlTuples(serverctrls),EncodeControlTuples(clientctrls))
File "/usr/lib/python2.7/dist-packages/ldap/ldapobject.py", line 96, in _ldap_call
result = func(*args,**kwargs)
ldap.SERVER_DOWN: {'info': 'A TLS packet with unexpected length was received.', 'desc': "Can't contact LDAP server"}
Run Code Online (Sandbox Code Playgroud)
脚本代码
import ldap
host = 'ldaps://ldap:636'
l = ldap.initialize(host)
l.set_option( ldap.OPT_X_TLS_DEMAND, True )
l.set_option( …Run Code Online (Sandbox Code Playgroud) 与此问题类似,我尝试使用python ldap(CentOS 6.2 x86_64,Python 2.6.6,python-ldap 2.3.10)对2003 Active Directory执行简单身份验证.
尽管遵循init中的所有常规步骤,包括
conn.set_option(ldap.OPT_REFERRALS, 0)
Run Code Online (Sandbox Code Playgroud)
如果我传递正确的凭据,我总会得到一个(97, [])返回:
>>> import ldap
>>> conn = ldap.initialize('ldap://ad.server.domain.com')
>>> conn.protocol_version = 3
>>> conn.set_option(ldap.OPT_REFERRALS, 0)
>>> conn.simple_bind_s('user@domain.com', 'WrongPassword')
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece', 'desc': 'Invalid credentials'}
>>> conn.simple_bind_s('user@domain.com', 'CorrectPassword')
(97, [])
Run Code Online (Sandbox Code Playgroud)
错误代码97不成功; 这LDAP_REFERRAL_LIMIT_EXCEEDED是从AD返回的错误.我也不能将它用作事实上的成功指标,因为:
>>> conn.simple_bind_s('', 'CorrectPassword')
(97, [])
>>> conn.simple_bind_s('', '')
(97, [])
Run Code Online (Sandbox Code Playgroud)
更令人沮丧的是,这个脚本是使用网:: LDAP的老Perl脚本,其迁移也为成功认证绑定返回0相同的AD和服务器.
我在python-ldap上找到的所有信息表明我正在做的事情应该是Just Work; 我倾向于认为AD服务器有问题,但Perl脚本确实在成功绑定时返回正确的LDAP代码.
我已经在旧的CentOS 5.5盒子上测试了python-ldap …
我没有任何运气找到答案,所以在这里.
当我使用python-ldap连接到AD服务器时,它似乎可以成功地用于某些功能,而不是其他功能.我的联系:
>>>import sys
>>>import ldap
>>>l = ldap.initialize("ldap://company.com:389")
>>>l.set_option(ldap.OPT_PROTOCOL_VERSION, 3)
>>>l.simple_bind_s("user@company.com","password")
(97, [], 1, [])
Run Code Online (Sandbox Code Playgroud)
一些简单的谷歌搜索表明,97意味着成功,虽然成功的程度有点不稳定.但是,由于某种原因,我无法在状态代码1上找到任何内容.如果我在连接上运行一些ldap函数,其中一些工作,一些不工作.
>>>l.whoami_s()
'u:COMPANY.COM\\user'
Run Code Online (Sandbox Code Playgroud)
似乎还好,但是
>>> base_dn = 'dc=company,dc=com'
>>> retrieveAttributes = ["uniquemember"]
>>> searchFilter = "cn=user"
>>> l.search_s(base_dn, ldap.SCOPE_SUBTREE,searchFilter,retrieveAttributes)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/user/.envs/scoring/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 552, in search_s
return self.search_ext_s(base,scope,filterstr,attrlist,attrsonly,None,None,timeout=self.timeout)
File "/home/user/.envs/scoring/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 546, in search_ext_s
return self.result(msgid,all=1,timeout=timeout)[1]
File "/home/user/.envs/scoring/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 458, in result
resp_type, resp_data, resp_msgid = self.result2(msgid,all,timeout)
File "/home/user/.envs/scoring/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 462, in result2
resp_type, …Run Code Online (Sandbox Code Playgroud) 我正在使用python 2.7的官方python docker镜像.我正在使用的应用程序需要pyhon-ldap.
我的dockerfile看起来像这样:
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
Run Code Online (Sandbox Code Playgroud)
其中python-ldap在requirements.txt中
我自然会碰到这个:
In file included from Modules/LDAPObject.c:9:0:
Modules/errors.h:8:18: fatal error: lber.h: No such file or directory
#include "lber.h"
^
compilation terminated.
error: command 'gcc' failed with exit status
Run Code Online (Sandbox Code Playgroud)
我知道的是没有安装libldap2-dev和其他一些软件包.所以我做了一些研究,发现官方的python图像是由debian jessy构建的.我更像是一个redhat人,但我知道apt-get所以我将docker文件修改为:
FROM python:2.7
RUN apt-get install -y libldap2-dev
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . …Run Code Online (Sandbox Code Playgroud) 尝试添加属性时,我得到一个OBJECT_CLASS_VIOLATION.修改现有属性可以正常工作(即使是同一个属性,如果我先从AD添加它,然后修改它).
首先,我作为域管理员开玩笑,然后:
import ldap, ldap.sasl
l = ldap.initialize('ldap://TEST.DOM.DE')
auth_tokens = ldap.sasl.gssapi('')
l.sasl_interactive_bind_s('', auth_tokens)
l.add_s('CN=dmulder,CN=Users,DC=test,DC=dom,DC=de', [('gecos', ['something'])])
Run Code Online (Sandbox Code Playgroud)
哪个返回此错误:
ldap.OBJECT_CLASS_VIOLATION: {'info': '0000207B: UpdErr: DSID-0305124B, problem 6002 (OBJ_CLASS_VIOLATION), data 0\n', 'desc': 'Object class violation'}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在ADUC中提前创建属性,则此命令成功:
l.modify_s('CN=dmulder,CN=Users,DC=test,DC=dom,DC=de', [(1, 'gecos', None), (0, 'gecos', ['something'])])
Run Code Online (Sandbox Code Playgroud)
add命令与ldapmodify一起使用:
> ldapmodify -x -h TEST.DOM.DE -D Administrator@TEST.DOM.DE
dn:CN=dmulder,CN=Users,DC=test,DC=dom,DC=de
changetype: modify
add: gecos
gecos: something
modifying entry "CN=dmulder,CN=Users,DC=test,DC=dom,DC=de"
Run Code Online (Sandbox Code Playgroud)
知道我在这里做错了吗?
精简版
我有一段代码我正在调试它检查值__debug__并执行一些代码,如果它是True.
if __debug__:
<stuff happens>
Run Code Online (Sandbox Code Playgroud)
问题是"东西"永远不会发生,即使__debug__看起来是真的.
长版/细节
为了检查这一点,我__debug__使用以下模式将多个变量的值打印出来,最值得注意的是,在函数执行时打印到文件.(我正在使用os.open因为open已在此模块中定义.)
try:
myfile = os.open("test.txt", os.O_RDWR|os.O_CREAT|os.O_APPEND)
# work + some print statements to check the value of __DEBUG__
finally:
os.close(myfile)
Run Code Online (Sandbox Code Playgroud)
我最困惑的代码片段如下所示:
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, type(__debug__)))
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, bool(__debug__)))
if __debug__:
os.write(myfile, "LINE %s | LDAP FUNCTION …Run Code Online (Sandbox Code Playgroud) 我使用Windows作为我的主要python 2.7开发环境,我想在虚拟环境中安装python-ldap.
python-ldap包需要编译:(当然我无法在我的环境中编译它.所以我尝试通过easy_install在我的虚拟环境中安装二进制文件(FYI你可以做easy_install package.exe和包将安装).我在这里找到了分布式二进制文件:https://pypi.python.org/pypi/python-ldap/
不幸的是,他们只为python 2.7提供.msi包!为什么人们使用.msi?MSI不能通过easy_install安装.我讨厌MSI%$#$ ^#$ ^#$
是的我可以通过执行它来安装.msi包,但它将安装在全局python包中,而不是安装在我的虚拟环境中!
拜托,有人可以帮帮我吗?我记得在之前的项目中遇到了这个确切的问题,我不得不在虚拟环境之外开发它 - 但我现在不能这样做:(
更新:我在系统范围内安装了python-ldap并将目录ldap和python_ldap-2.4.10-py2.7.egg-info从PYTHON_GLOBAL\Lib\site-packages复制到VIRTUALENV\Lib\site-packages并且似乎正在运行现在.但是我真的不喜欢这个解决方案所以我不会回答我的问题.此外,Alexander关于使用--system-site-packages重新创建virtualenv的评论可能会起作用,但这意味着我需要卸载我的许多全局软件包,然后重新安装我的虚拟软件包等,一般情况下它不是干:(
更新2:在尝试cgohlke的建议之后,我看到MSI的内容是我上面提到的两个目录以及文件dsml.py,ldapurl.py和ldif.py. 所以我也把它复制到了我的VIRTUALENV\Lib\site-packages.现在我相信安装还可以:).但我相信cgohlke是最好的 - 只需使用msiexec.exe将msi的内容直接提取到您的VIRTUALENV.
更新3:在一个类似的问题(在Windows上的virtualenv中安装python-ldap)我发现了一个非常有趣的链接:http://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap.在那里你将能够找到python-ldap和其他很多的.EXE安装包!所以最后通过下载这些你将能够easy_install在你的virtualenv他们!
最近,我花了几个小时撕掉我的头发(或者剩下的东西)试图将python-ldap(通过pip)安装到Redhat Enterprise服务器上.
这是我会得到的错误消息(看起来很熟悉?):
Modules/constants.c:365: error: ‘LDAP_CONTROL_RELAX’ undeclared (first use in this function)
error: command 'gcc' failed with exit status 1
如果只有那里有人可以帮助我!
一些背景:
我正在从事的项目使用python-ldap库。由于我们是一个混合操作系统开发团队(一些使用 Linux,一些使用 macOS 和一些 Windows),我试图让项目在所有环境中构建。不幸的是,python-ldapWindows 没有正式支持,但有由 Christoph Gohlke 维护的非官方轮子。我已经测试了轮文件,它工作正常。
问题:我如何告诉 Poetry 在 Windows 上使用轮子以及python-ldap在 Linux 和 macOS 上使用官方包?
我尝试了多种方法,包括使用多个约束依赖项和标记:
python-ldap = [
{ markers = "sys_platform == 'linux'", version = "*" },
{ markers = "sys_platform == 'win32'", path="lib/python_ldap-3.2.0-cp36-cp36m-win_amd64.whl" }
Run Code Online (Sandbox Code Playgroud)
......但是,从判断poetry.lock文件,似乎再标记合并,只是确定是否库应安装在所有:
[[package]]
category = "main"
description = "Python modules for implementing LDAP clients"
marker = "sys_platform == \"linux\" or sys_platform == \"win32\""
name = …Run Code Online (Sandbox Code Playgroud) python-ldap ×10
python ×9
debugging ×1
docker ×1
easy-install ×1
iis-7 ×1
python-2.7 ×1
python-wheel ×1
redhat ×1
ssl ×1
virtualenv ×1