对于任何有兴趣从组中删除用户的人,您可以使用 ldap_mod_del(),如下所示
$group = 'CN=mygroup,OU=myOU,DC=mydomain,DC=com';
$group_info['member'] = 'CN=User\, Test,CN=Users,DC=mydomain,DC=com';
ldap_mod_del($ldap, $group, $group_info);
我在 Win 2K3 服务器上的 Active Directory 上测试了它。
(PHP 4, PHP 5, PHP 7, PHP 8)
ldap_mod_del — 从当前属性中删除属性值
从指定的 dn
中删除一个或多个属性值。对象删除由 ldap_delete() 函数完成。
ldap
一个 LDAP\Connection 实例,由 ldap_connect() 返回。
dn
LDAP 实体的识别名称。
entry
controls
要与请求一起发送的 LDAP 控制 数组。
版本 | 描述 |
---|---|
8.1.0 | ldap 参数现在需要一个 LDAP\Connection 实例;以前,需要一个有效的 ldap link 资源。 |
8.0.0 |
controls 现在可以为 null;以前,它默认为 [] 。 |
7.3.0 | 添加对 controls 的支持 |
对于任何有兴趣从组中删除用户的人,您可以使用 ldap_mod_del(),如下所示
$group = 'CN=mygroup,OU=myOU,DC=mydomain,DC=com';
$group_info['member'] = 'CN=User\, Test,CN=Users,DC=mydomain,DC=com';
ldap_mod_del($ldap, $group, $group_info);
我在 Win 2K3 服务器上的 Active Directory 上测试了它。
要删除所有特定属性,请向其提供一个空数组。
例如,要从组中删除所有成员
<?php
ldap_mod_del($ldapconn,$groupDN,array("member" => array()));
?>
要从 Apple 的 Open Directory 中删除用户,您还需要从组中删除生成的 uid。
删除用户的步骤如下
<?php
//设置变量
$ldapDN = "uid=myadmin,cn=users,dc=myserver,dc=com';
$ldapPass = "somepass";
$groupDn = 'cn=mygroup,cn=groups,dc=myserver,dc=com'
$removal = array(
"memberuid"=>"username",
"apple-group-memberguid"=>"846DE847-D73D-428D-83A8-B95B606C511B"
);
//连接并绑定
$ldapconnect = ldap_connect("myserver.com",389);
ldap_bind($ldapconnect, $ldapDN, $ldapPass);
//从组中删除成员
ldap_mod_del($ldapconnect, $groupDn, $removal);
//解除绑定
ldap_unbind($ldapconnect);
?>
我发现语法
$entry["mail"] = "";
不会使用 OpenLDAP 服务器删除 mail 属性。您必须指定要删除的属性值才能成功删除它,否则您将从服务器收到“无效语法”错误。
错误:“不匹配的匹配”将显示,如果您尝试删除的属性在架构中没有相等规则。我遇到了删除属性 facsimilieTelephoneNumber 的问题,这是因为我的 core.schema 文件没有为该属性定义 EQUALITY。我复制了 telephoneNumber 的 EQUALITY 规则,它完美地工作了。
我们通常需要删除“objectclass”,下面是一个简单的代码,可以成功地删除它。
$userdataModifydelSamba = array();
$userdataModifydelSamba['objectClass'] = array();
$userdataModifydelSamba['objectClass'][0] = 'sambaSamAccount';
$userdataModifydelSamba['sambasid'] = array();
$userdataModifydelSamba['sambantpassword'] = array();
$userdataModifydelSamba['sambahomedrive'] = array();
$userdataModifydelSamba['sambadomainname'] = array();
$userdataModifydelSamba['sambaacctflags'] = array();
$userdataModifydelSamba['sambaprimarygroupsid'] = array();
$userdataModifydelSamba['sambapwdlastset'] = array();
$sucess = @ldap_mod_del($connection, $dn, $result);
if(!$sucess)
{
throw new Exception("error " . ldap_err2str(ldap_errno($connection)));
}
以上示例已被证明在 iPlanet / Sun One Directory Server 5.0/5.1 中有效。例如
$attrs["mail"] = array();
ldap_mod_del($ldapConnID,$dn,$attrs);
或
$attrs["mail"] = array();
$attrs["telephonenumber"] = array();
ldap_mod_del($ldapConnID,$dn,$attrs);
这将删除由 dn 指定的条目中所有属性的出现。
至少在 OpenLDAP 1.2.x 中
要删除属性,无论其值如何,您都必须分配
$attrs["AttributeName"]=array();
在 ldap_mod_del($ds,$dn,$attrs) 之后
将删除 AttributeName 的所有出现
要删除属性的所有实例
$entry["attrname"][]="value1";
$entry["attrname"][]="value2";
...
$entry["attrname"][]="valueN";
ldap_mod_del($ds, $dn, $entry);
<pre>
uid: testuser
mail: [email protected]
mail: [email protected]
</pre>
如何删除 mail 的值,以便仅存在 mail 的第二个值
<pre>
$entry["mail"] = "[email protected]";
$result = ldap_mod_del($connID, $dn, $entry);
</pre>
如果您想删除属性的所有实例.....
==>
<pre>
$entry["mail"][0] = "[email protected]";
$entry["mail"][1] = "[email protected]";
$result = ldap_mod_del($connID, $dn, $entry);
</pre>
是吗?
如果您的 LDAP 数据库没有传播,则使用带有空字符串的 ldap_modify 将起作用,即使它返回错误。尽管如此,我想说不要这样做,因为它让人感觉将来某个版本会修复这个问题。
在搜索了几个小时后,没有找到任何关于 ldap_mod_del 函数的有用信息,我开始尝试自己弄清楚“数组条目”参数需要使用什么格式。以下是我发现的:
条目数组是一个哈希表,属性名称作为哈希键,要删除的特定属性值作为相应的哈希值。
-- 示例
特定条目的属性的当前值
uid: testuser
mail: [email protected]
mail: [email protected]
如何删除第一个邮件值,以便只保留第二个邮件值
$entry["mail"] = "[email protected]";
$result = ldap_mod_del($connID, $dn, $entry);
因此,如果您想删除所有属性实例,则必须逐个进行。
要删除所有属性实例,您可以使用 ldap_modify,对该属性使用空值。
$entry["mail"] = "";
$result = ldap_modify($connID, $dn, $entry);