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
相关产品推荐
相关产品推荐

