node.js - 如何使用 ldapjs 在活动目录中设置帐户选项?
问题描述
我使用ldapjs
nodejs 模块与我的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 password
a 下一次登录。这是默认的活动目录策略还是 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'
解决方案
您是否能够手动启用以这种方式创建的帐户?如果没有,我怀疑密码实际上没有设置。
该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 证书。
我在这里找到的密码的正确编码。
推荐阅读
- javascript - 单击Javascript后如何停用按钮
- excel - 提取最小值的名称excel
- c# - 视图更改后绑定的 ComboBoxItem 变量变为空
- javascript - 为什么我的 jQuery 可以内联工作,但不能在外部工作?
- swift - 如何选择 algolia 搜索命中并将其重定向到所需的 Viewcontroller?
- sql - 如何在 DolphinDB 查询中从分布式表中消除重复记录
- javascript - 在某些站点上,MouseEvent 对象的 x 和 y 值与 Debugger API 调度的 x 和 y 值不同
- java - 有没有办法让 System.out.print 在循环中打印一次不同的东西?
- c++ - 有没有办法用父类命名空间/类空间来引用子类?
- node.js - Firestore 函数 listCollections() 仅返回空数组