94

Python + LDAP を使用して AD に対して認証するにはどうすればよいですか。私は現在 python-ldap ライブラリを使用していますが、それが生成しているのは涙だけです。

簡単なクエリを実行するためにバインドすることさえできません。

import sys
import ldap


Server = "ldap://my-ldap-server"
DN, Secret, un = sys.argv[1:4]

Base = "dc=mydomain,dc=co,dc=uk"
Scope = ldap.SCOPE_SUBTREE
Filter = "(&(objectClass=user)(sAMAccountName="+un+"))"
Attrs = ["displayName"]

l = ldap.initialize(Server)
l.protocol_version = 3
print l.simple_bind_s(DN, Secret)

r = l.search(Base, Scope, Filter, Attrs)
Type,user = l.result(r,60)
Name,Attrs = user[0]
if hasattr(Attrs, 'has_key') and Attrs.has_key('displayName'):
  displayName = Attrs['displayName'][0]
  print displayName

sys.exit()

これを実行するとmyusername@mydomain.co.uk password username、次の 2 つのエラーのいずれかが表示されます。

Invalid Credentials- 間違った資格情報を入力したり、意図的に間違った資格情報を使用したりすると、認証に失敗します。

ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334、コメント: AcceptSecurityContext エラー、データ 52e、vece'、'desc': '無効な認証情報'}

または

ldap.OPERATIONS_ERROR: {'info': '00000000: LdapErr: DSID-0C090627, コメント: この操作を実行するには、接続で正常にバインドする必要があります., データ 0, vece', 'desc': '操作エラー'}

適切にバインドするために何が欠けていますか?

Fedora と Windows で同じエラーが発生します。

4

11 に答える 11

50

行方不明だった

l.set_option(ldap.OPT_REFERRALS, 0)

初期から。

于 2008-09-26T16:18:18.320 に答える
31

pywin32 を使用できる場合は、Python から Win32 呼び出しを使用できます。これは、CherryPy Web サーバーで行うことです。

import win32security
token = win32security.LogonUser(
    username,
    domain,
    password,
    win32security.LOGON32_LOGON_NETWORK,
    win32security.LOGON32_PROVIDER_DEFAULT)
authenticated = bool(token)
于 2008-09-26T20:23:04.160 に答える
7

それは私にとってはうまくいきました.l.set_option(ldap.OPT_REFERRALS、0)はActiveDirectoryにアクセスするための鍵でした. また、スクリプトを終了する前に接続を閉じるために、「con.unbind()」を追加する必要があると思います。

于 2009-07-14T16:02:22.150 に答える
5

ここに私のために働くいくつかの簡単なコードがあります。

import ldap  # run 'pip install python-ldap' to install ldap module.
conn = ldap.open("ldaphost.company.com")
conn.simple_bind_s("myuser@company.com", "mypassword")

これは以前の回答に基づいています。

于 2013-08-16T21:32:24.373 に答える
3

たとえば、Centrify Express をインストールして実行している場合のように、Kerberos をインストールして AD と通信している場合は、python-kerberos を使用できます。例えば

import kerberos
kerberos.checkPassword('joe','pizza','krbtgt/x.pizza.com','X.PIZZA.COM')`

ユーザー 'joe' が Kerberos レルム X.PIZZA.COM でパスワード 'pizza' を持っている場合、True が返されます。(通常、後者はADドメインの名前と同じだと思います)

于 2011-08-01T18:46:53.913 に答える
2

DNが問題を解決していないという@Johan Buretへのコメントを見ましたが、それはあなたが調べるべきことでもあると思います。

あなたの例では、AD のデフォルトの管理者アカウントの DN は次のようになります: cn=Administrator,cn=Users,dc=mydomain,dc=co,dc=uk - 試してみてください。

于 2008-09-30T14:36:49.713 に答える
2

優れたldap3チュートリアルに基づいています:

>>> from ldap3 import Server, Connection, ALL, NTLM
>>> server = Server('server_name_or_ip', get_info=ALL)
>>> conn = Connection(server, user="user_name", password="password", auto_bind=True)
>>> conn.extend.standard.who_am_i()
>>> server.info

上記は Python3 で行いましたが、Python 2 と互換性があるはずです。

于 2019-01-29T08:22:01.843 に答える
1

私は同じ問題を抱えていましたが、それはパスワードのエンコーディングに関するものでした

.encode('iso-8859-1')

問題を解決しました。

于 2016-07-13T10:01:51.073 に答える
1

追加してみました

l.set_option(ldap.OPT_REFERRALS, 0)

しかし、エラーの代わりに Python がハングアップし、何にも応答しなくなります。検索クエリを間違って作成している可能性があります。検索のベース部分は何ですか? 単純なバインドの DN と同じものを使用しています (ああ、私はl.simple_bind, の代わりに ,をしなければなりませんでしたl.simple_bind_s):

import ldap
local = ldap.initialize("ldap://127.0.0.1")
local.simple_bind("CN=staff,DC=mydomain,DC=com")
#my pc is not actually connected to this domain 
result_id = local.search("CN=staff,DC=mydomain,DC=com", ldap.SCOPE_SUBTREE, "cn=foobar", None)
local.set_option(ldap.OPT_REFERRALS, 0)
result_type, result_data = local.result(result_id, 0)

AD LDS を使用しており、インスタンスは現在のアカウントに登録されています。

于 2010-10-13T04:11:36.473 に答える
0

識別名を使用してシステムにログオンします。"CN=Your user,CN=Users,DC=b2t,DC=local" ADを含むすべてのLDAPシステムで動作するはずです

于 2008-09-26T17:14:23.147 に答える
0

私にとっては、 からsimple_bind_s()に変更することでbind()うまくいきました。

于 2012-03-30T13:25:44.443 に答える