标签: python-ldap

检测是否在Python中使用LDAP锁定了Active Directory用户帐户

我正在使用python的ldap模块验证用户登录.登录失败时,我会收到ldap.INVALID_CREDENTIALS登录信息,但这可能是因为密码错误或帐户被锁定.在第3次尝试后帐户被锁定.

我想检测到该帐户已被锁定并向受挫的用户报告,而不是相同的"无效登录"消息.

寻找解决方案我发现:

  • AD不使用userAccountControl LOCKED标志;
  • 应该使用lockoutTime属性

我应该用来查找锁定用户的LDAP查询是:

(&(objectClass=user)(lockoutTime>=1))
Run Code Online (Sandbox Code Playgroud)

或者对于特定用户:

(&(objectClass=user)(sAMAccountName=jabberwocky)(lockoutTime>=1))
Run Code Online (Sandbox Code Playgroud)

但这不起作用,查询每次都不返回任何结果.

python active-directory python-ldap

17
推荐指数
2
解决办法
6万
查看次数

蟒蛇+ LDAP + SSL

美好的一天.

提前为我的英语道歉,我的国家论坛和资源没有帮助.

脚本中需要在AD中更改(或创建)用户密码.

在研究了这个问题后,很明显

  1. 分配或更改的密码只能建立与服务器的加密连接
  2. 只有在编码utf-16-le中才需要发送密码

一般来说,第二个没有问题,但首先有问题

$ 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 ssl active-directory python-ldap

14
推荐指数
1
解决办法
2万
查看次数

使用python-ldap对Active Directory进行身份验证始终返回(97,[])

此问题类似,我尝试使用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 authentication active-directory python-ldap

13
推荐指数
1
解决办法
2万
查看次数

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 active-directory python-ldap

10
推荐指数
2
解决办法
1万
查看次数

以官方python docker镜像为基础运行python-ldap

我正在使用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)

python-2.7 python-ldap docker

10
推荐指数
2
解决办法
4310
查看次数

python-ldap add_s无法使用OBJECT_CLASS_VIOLATION为AD用户添加属性

尝试添加属性时,我得到一个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)

知道我在这里做错了吗?

python active-directory python-ldap

10
推荐指数
1
解决办法
1497
查看次数

虽然__debug__没有执行条件__debug__语句是True

精简版

我有一段代码我正在调试它检查值__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)

python debugging iis-7 python-ldap

9
推荐指数
1
解决办法
5121
查看次数

如何在没有编译的Windows上的python 2.7 virtualenv上安装python-ldap

我使用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 virtualenv easy-install python-ldap

9
推荐指数
1
解决办法
9750
查看次数

在Redhat Enterprise Server上安装python-ldap时解决GCC错误

Python-LDAP + Redhat =咬牙切齿

最近,我花了几个小时撕掉我的头发(或者剩下的东西)试图将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 redhat python-ldap

8
推荐指数
1
解决办法
6059
查看次数

Python Poetry:如何指定特定于平台的依赖项替代方案?

一些背景: 我正在从事的项目使用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 python-ldap python-wheel python-poetry

8
推荐指数
2
解决办法
1672
查看次数