首页 > 解决方案 > 如何使用 ldapjs 在活动目录中设置帐户选项?

问题描述

我使用ldapjsnodejs 模块与我的active directory.

我可以使用这些功能将用户绑定并添加到活动目录中......

    ldapOptions = {
      url: //my ldap server ip,
      connectionTimeOut: 30000,
      reconnect: true
    }

    const ldapClient = ldapJs.createClient(ldapOptions)

    ldapClient.bind(adminDn, adminPass, (error) => {
      if (error) {
        // break the code
      } else {
          let newUser = {
                cn: username,
                sn: username,
                description: // some desc,
                objectClass: ['inetOrgPerson', 'user', 'person', 'top'],
                userPassword: password
            }

           ldapClient.add(dn, newUser, err => {
                if (err) {
                    console.log(err)
                    // break the code
                } else {
                    console.log('success')
                 }
        }

    }

但在添加进程后,该帐户是disabled和用户must change passworda 下一次登录。这是默认的活动目录策略还是 ldapjs 默认值?如果是我如何更改默认值...

Update

Active Directory Certificate Service在我的 Windows 服务器上处于活动状态(活动目录)

之后,将该证书导出到活动目录并添加到我机器上的信任证书中......

ldapjs 文档建议使用 nodejs/tls 选项与ldaps服务器通信...

const ldapOptions = {
    url: 'ldaps://test-server.part.loc',
    connectTimeout: 1000,
    reconnect: false,
    tlsOptions: {
        // key and cert is create on my own but just created by openssl. do i have ti trusted it to my machine or server?
        key: fs.readFileSync('my_cert.pem'),
        cert: fs.readFileSync('my_key.pem'),
        // this is the certificate of the active directory 
        ca: fs.readFileSync('fuck_cert.pem'),

        checkServerIdentity: () => { return null; },
    }
}

但仍然收到错误:

Error: error:0909006C:PEM routines:get_name:no start line

库:“PEM 例程”,

功能:'get_name',

原因:'没有起跑线',

代码:'ERR_OSSL_PEM_NO_START_LINE'

标签: node.jsactive-directoryldapldapjs

解决方案


您是否能够手动启用以这种方式创建的帐户?如果没有,我怀疑密码实际上没有设置。

userPassword属性只有在启用时才能使用。即便如此,它实际上只是真实密码属性的别名,unicodePwd. 但unicodePwd需要一些非常具体的格式。

在设置密码之前,您还必须确保与 AD 建立了安全连接。您可以通过连接到 636 的 LDAPS(基于 SSL 的 LDAP)端口来执行此操作。该ldapjs库允许您仅在服务器名称ldaps://前面使用- 您不能使用 IP,因为 SSL 证书上的名称必须与域匹配您用于连接的名称。并且 SSL 证书必须在您运行它的计算机上受信任。这可能会给您带来问题。

我还注意到您缺少该sAMAccountName属性,这是必需的属性。我看到您将sn属性设置为username,但该属性用于用户的姓氏(姓氏)。

所有这些一起,你可以试试这个(只需更改顶部的域名称):

ldapOptions = {
  url: "ldaps://example.com",
  connectionTimeOut: 30000,
  reconnect: true
}

const ldapClient = ldapJs.createClient(ldapOptions)

ldapClient.bind(adminDn, adminPass, (error) => {
    if (error) {
        // break the code
    } else {
        let newUser = {
            cn: username,
            sAMAccountName: username,
            description: // some desc,
            objectClass: 'user',
            unicodePwd: new Buffer('"' + password + '"', 'utf16le').toString(),
            userAccountControl: 512 //NORMAL_ACCOUNT
        }

        ldapClient.add(dn, newUser, err => {
            if (err) {
                console.log(err)
                // break the code
            } else {
                console.log('success')
            }
        }
    }
}

我不是 NodeJS 开发人员,所以我从来没有真正用这个ldapjs库做过这个。但我已经用 C# 完成了这一切。这应该让你非常接近。让我知道这是否会给您带来任何错误。我怀疑任何错误都可能来自 SSL 证书。

我在这里找到的密码的正确编码。


推荐阅读