Как обновить thumbnailPhoto в Active Directory, используя NodeJS и ldap js? - PullRequest
2 голосов
/ 06 августа 2020

Я новичок в работе с Active Directory в целом. Я пытаюсь обновить атрибут thumbnailPhoto, используя ldapjs npm пакет У меня есть настройка кода, чтобы иметь возможность обновлять атрибуты в целом, и он работает хорошо.

Я получаю своего пользователя так:

const customeParser = function(entry, raw, callback){ if (raw.hasOwnProperty("thumbnailPhoto")){ entry.thumbnailPhoto = raw.thumbnailPhoto; } callback(entry) }

find(filter, cb) {
        const client = ldap.createClient(this.ldapOptions)

        client.on('error', err => {
            console.error(err.message)
        })

        //Serach for users
        client.bind(
            this.options.dn,
            this.options.password,
            (err) => {
                if (err) {
                    console.error((new Date).toUTCString(), 'Initial Bind Error', err)
                    client.unbind(() => {
                        client.destroy()
                        cb(err)
                    })
                } else {
                    client.search(
                        'DC=foo,DC=local', {
                        scope: 'sub',
                        attributes: [
                            'distinguishedName',
                            'name',
                            'sn',
                            'givenName',
                            'mail',
                            'sAMAccountName',
                            'telephoneNumber',
                            'thumbnailPhoto', 
                            // 'photoURL', 
                            // 'profileImage',
                            'extensionAttribute1',
                            'msExchExtensionCustomAttribute1'

                        ],
                        entryParser: customeParser,
                        filter: `${filter}`
                    },
                        (err, ee) => {


                            if (err) {
                                console.log((new Date).toUTCString(), 'SEARCH RESULT', err)
                                client.unbind(() => {
                                    client.destroy()
                                    cb(err)
                                })
                            }
                            ee.on('searchEntry', (entry) => {
                                ee.on('end', () => {
                                    client.unbind(() => {
                                        client.destroy()
                                        cb(null, entry.object)
                                    })
                                })
                            });
                        });
                }
            });
    }

Я вызываю свой метод modifyUser из моего класса LDAP следующим образом:

let changes = {
  thumbnailPhoto: 'http://<ip>:<port>/img/photo.jpg'
}

ad.modifyUser(user.dn, changes, function (err, mod) {
      if (err) {
        console.log('ERROR: ' + JSON.stringify(err));
        return;
      }

      if (!mod) {
        console.log('Search: ' + mod + ' not found.');
      } else {
        console.log('MOD: ', JSON.stringify(mod));
      }
    })

modifyUser:

modifyUser(user, attributes, cb) {
        const client = ldap.createClient(this.ldapOptions)

        client.on('error', err => {
            console.error(err.message)
        })

        //Serach for users
        client.bind(
            this.options.dn,
            this.options.password,
            (err) => {
                if (err) {
                    console.error((new Date).toUTCString(), 'Initial Bind Error', err)
                    client.unbind(() => {
                        client.destroy()
                        cb(err)
                    })
                } else {
                    var change = new ldap.Change({
                        operation: 'replace',
                        modification: attributes
                      });
                      console.log('CHANGE: ', attributes)
                      client.modify(user, change, function(err) {
                          if(err) console.error('ERROR: ', err);
                      },
                        (err, ee) => {
                            

                            if (err) {
                                console.log((new Date).toUTCString(), 'SEARCH RESULT', err)
                                client.unbind(() => {
                                    client.destroy()
                                    cb(err)
                                })
                            }
                            ee.on('searchEntry', (entry) => {
                                ee.on('end', () => {
                                    client.unbind(() => {
                                        client.destroy()
                                        cb(null, entry.object)
                                    })
                                })
                            });
                        });
                }
            });
    }

Когда я обновляю фотографию с помощью инструмента LDAP, он преобразует ее в то, что я считаю октетом или каким-то шестнадцатеричным значением. Как мне превратить c в nodejs?

На правильном ли я пути? Все остальные атрибуты обновляются мгновенно с использованием приведенного выше кода, но изображение не обновляется ...

Также есть способ обновить сразу несколько атрибутов? Я получаю сообщение об ошибке, что за один раз можно изменить только один атрибут.

Заранее благодарим за уделенное время!

...