7

さまざまな LDAP 操作のスクリプトについて調査しています。ただし、Active Directory ユーザーの作成で少し速度が落ちました。

次の LDIF は、ldapmodifyコマンドを使用してロードすると失敗します。

dn: CN=Frank,CN=Users,DC=domain,dc=local
changeType: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Frank
userPrincipalName: frank@domain.local
sAMAccountName: frank
givenName: Frank
sn: Stein
displayName: Frank Stein
description: Frankenstein's User
userAccountControl: 512
unicodePwd: "AnExamplePassword1!"

LDIF 経由でユーザーを追加しようとしたときに、次のコマンドを使用しました。

ldapmodify -H 'ldaps://<ip-of-server>:636' -D 'DOMAIN\Administrator' -x -W -f frank-add.ldif

これは次のエラーで失敗します。

ldap_add: Server is unwilling to perform (53)
        additional info: 0000001F: SvcErr: DSID-031A120C, problem 5003 (WILL_NOT_PERFORM), data 0

これは、ユーザーを拒否するパスワード ポリシーの問題です。

ただし、次の Python スクリプトは機能します。

#!/usr/bin/python

import ldap
import ldap.modlist as modlist

AD_LDAP_URL='ldaps://<ip-of-server>:636'
ADMIN_USER='DOMAIN\Administrator'
# User must be authorized to create accounts, naturally.
ADMIN_PASSWORD='password for ADMIN_USER'
BASE_DN='dc=domain,dc=local'

username='frank'
firstname='Frank'
surname='Stein'
displayName = "Frank Stein"

password='AnExamplePassword1!'
# The value of password still needs to adhere to the domain's password policy.
unicode_pass = unicode('\"' + password + '\"', 'iso-8859-1')
password_value = unicode_pass.encode('utf-16-le')

l = ldap.initialize(AD_LDAP_URL)
l.simple_bind_s(ADMIN_USER, ADMIN_PASSWORD)

dn=str('CN=%s,CN=Users,DC=domain,dc=local' % firstname)

attrs = {}

attrs['objectclass'] = ['top','person','organizationalPerson','user']
attrs['cn'] = str(username)
attrs['sAMAccountname'] = str(username)
attrs['unicodePwd'] = str(password_value)
attrs['givenName'] = str(firstname)
attrs['sn'] = str(surname)
attrs['displayName'] = str(displayName)
attrs['description'] = str("Frankenstein's User")
attrs['userPrincipalName'] = str("%s@domain.local" % username)
attrs['userAccountControl'] = str(512)

ldif = modlist.addModlist(attrs)
l.add_s(dn,ldif)

Python スクリプトを使用すると、ユーザーのパスワード (エスケープされた引用符を除く) を使用してすぐにサインインできます。「password」のような単純すぎるパスワードを選択すると、同じ「実行したくない」というエラーが引き続き発生する可能性があります。ただし、この場合、使用されているパスワードは同じです。

私が見る限り、操作は同じでなければなりません。LDIF ファイルを壊す違いは、パスワードを囲むために必要な引用符を処理する方法です。userAccountControl の値を 544 に設定し、パスワードを含めずに無効なアカウントを作成すると、LDIF による作成は成功します。ただし、これは、手動でユーザーのパスワードをリセットする必要があることを意味します。

これまでのところ、LDIF を介して次のパスワード形式を試しました。

  • 引用符なし。
  • 平易な引用.
  • \ でエスケープされた引用符
  • ASCII 経由で引用符をエスケープ: {\22}
  • Python を使用してパスワードを Base64 エンコードする (引用符の有無にかかわらず、LDIF の形式を に変更 unicodePwd::)

Python を介してユーザーを追加する作業方法があることには満足していますが、LDIF ファイルとldapmodify. 私が考えていない別の方法はありますか?

4

1 に答える 1