Ошибка при попытке использовать pyad для обновления учетной записи пользователя

Я пытаюсь обновить атрибут пользователя в Active Directory с помощью pyad. Это мой код

from pyad import *

pyad.set_defaults(ldap_server="server.domain.local", 
username="admin", password="password")

pyad.adobject.ADObject.update_attribute(self='testuser1', attribute='mail', 
newvalue='my@email.com')

и это ошибка, которую я получаю.

Traceback (most recent call last):
 File "c:\Users\Administrator\Desktop\scripts\AD-Edit-user.py", line 12, in 
 <module>
 pyad.adobject.ADObject.update_attribute(self='testuser1', attribute='mail', 
 newvalue='my@email.com')
 File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-
 32\lib\site-packages\pyad-0.5.20-py3.6.egg\pyad\adobject.py", line 318, in 
 update_attribute
 elif pyadutils.generate_list(newvalue) != self.get_attribute(attribute):
 AttributeError: 'str' object has no attribute 'get_attribute'

Это заставляет меня предположить, что мне нужно изменить тип атрибута с str к чему-то еще. Я подтвердил, что почта является правильным именем атрибута.

Я знаю, что соединение ldap работает, потому что я могу создать пользователя, используя подобный скрипт.

1 ответ

Решение

Ваша проблема в том, как вы используете pyad. Конкретно в этой строке:

pyad.adobject.ADObject.update_attribute(self='testuser1', attribute='mail', 
newvalue='my@email.com')

если мы посмотрим на источник pyad.adobject.ADObject, то увидим следующее:

def update_attribute(self, attribute, newvalue, no_flush=False):
    """Updates any mutable LDAP attribute for the object. If you are adding or removing
    values from a multi-valued attribute, see append_to_attribute and remove_from_attribute."""
    if newvalue in ((),[],None,''):
        return self.clear_attribute(attribute)
    elif pyadutils.generate_list(newvalue) != self.get_attribute(attribute):
        self._set_attribute(attribute, 2, pyadutils.generate_list(newvalue))
        if not no_flush:
            self._flush()

self здесь это не параметр функции, это ссылка на экземпляр класса. Ваш звонок включает в себя self='testuser1' который str,

Пожалуйста, посмотрите документацию о том, как использовать эту функцию / функциональность / модуль, здесь. Вы заметите, что нет "я"... кроме как смотреть в исходный код, я не уверен, как вы пришли к выводу, что вам нужно self,

У меня нет возможности проверить следующее, но это примерно так и должно работать:

# first you create an instance of the object, based on 
# the distinguished name of the user object which you 
# want to change
my_ad_object = pyad.adobject.ADObject.from_dn('the_distinguished_name')

# then you call the update_attribute() method on the instance
my_ad_object.update_attribute(attribute='mail', newvalue='my@email.com')
Другие вопросы по тегам