You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP实现Active Directory用户临时入组(设置TTL)遇DN语法错误求助

解决PHP LDAP设置AD组临时成员(TTL)的DN语法错误问题

我在Debian Linux CLI环境下用PHP 7.4编写脚本,已经实现将Active Directory用户添加到组的功能,原代码如下:

<?php

$ldaphost = 'ldaps://domain.uk';
$ldapport = 636;

putenv('LDAPTLS_REQCERT=never');

$ds = ldap_connect($ldaphost, $ldapport) or die("Could not connect to $ldaphost");
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);

if ($ds) {
    
    $username = "cn=user1,ou=test,dc=domain,dc=uk";
    $upasswd = "XXXXXXX";

    $ldapbind = ldap_bind($ds, $username, $upasswd);

    $groupDN = 'cn=temp-access,ou=test,dc=domain,dc=uk';
    $userDN = 'cn=user1,ou=test,dc=domain,dc=uk';

    $entry = ['member' => $userDN];
    ldap_modify($ds, $groupDN, $entry);

}

实际需求是为组添加临时成员并设置TTL,但将$groupDN改为<ttl=1866,cn=temp-access,ou=test,dc=domain,dc=uk>时,触发错误:

PHP Warning: ldap_modify(): Modify: Invalid DN syntax

已知Python可实现该功能,寻求解决建议。


错误原因

<ttl=1866,...>是Python LDAP库的语法糖,并非标准LDAP DN格式,PHP LDAP扩展不支持直接将TTL嵌入DN,必须通过LDAP控制项实现临时成员TTL功能。

解决方法

使用ldap_modify_ext()替代ldap_modify(),显式添加TTL控制项(OID:1.3.6.1.4.1.1466.20037),具体修改后的代码如下:

<?php

$ldaphost = 'ldaps://domain.uk';
$ldapport = 636;

putenv('LDAPTLS_REQCERT=never');

$ds = ldap_connect($ldaphost, $ldapport) or die("Could not connect to $ldaphost");
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);

if ($ds) {
    $username = "cn=user1,ou=test,dc=domain,dc=uk";
    $upasswd = "XXXXXXX";

    $ldapbind = ldap_bind($ds, $username, $upasswd);

    $groupDN = 'cn=temp-access,ou=test,dc=domain,dc=uk';
    $userDN = 'cn=user1,ou=test,dc=domain,dc=uk';
    $ttlSeconds = 1866; // 临时成员有效期,单位:秒

    // 构造添加成员的修改条目
    $entry = ['member' => $userDN];

    // 构造TTL控制项:将秒数打包为32位无符号大端字节序
    $ttlControl = [
        'oid' => '1.3.6.1.4.1.1466.20037',
        'value' => pack('N', $ttlSeconds),
        'iscritical' => true
    ];

    // 带控制项执行LDAP修改操作
    $result = ldap_modify_ext($ds, $groupDN, $entry, [$ttlControl]);

    if ($result === false) {
        echo "操作失败: " . ldap_error($ds) . "\n";
    } else {
        echo "临时成员添加成功,有效期{$ttlSeconds}秒\n";
    }

    ldap_close($ds);
}
?>

关键注意事项

  • 必须使用ldap_modify_ext():标准ldap_modify()不支持自定义LDAP控制项
  • TTL值打包:需要用pack('N', $ttl)将秒数转换为符合LDAP控制要求的32位无符号大端字节格式
  • 权限验证:绑定的AD账号需具备目标组的写入权限,以及使用TTL控制的权限
  • 控制项OID:TTL控制的官方OID为1.3.6.1.4.1.1466.20037,不可随意更改

内容的提问来源于stack exchange,提问作者William Bargent-Ball

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:16:06