php ldap_search,如果我不知道基本DN的OU,那么如何使用PHP ldap_search()获取用户OU

我有一个活动目录结构,其中用户对象驻留在OU中,例如IT,技术,人力资源,帐户等。我想编写一个PHP脚本,用于对AD进行身份验证,并根据他们的组来提供aproperiate Web服务。

ldap_search()需要基本DN。

我试图搜索

ldap_search($ldap, "dc=country,dc=company,dc=co,dc=uk", "(samaccountname=$username)", array("memberof"));

但PHP给出了“操作错误”。如果我指定OU

ldap_search($ldap, "ou=sales,dc=country,dc=company,dc=co,dc=uk", "(samaccountname=jake)", array("memberof"));

那么搜索就行了。

我可以使用通配符吗?

在旁注中,用户对象是否在OU中?因为我是第一个把他们搬到里面的noob!

解决方案是在连接和绑定之间添加2行。

ldap_connect(..)

ldap_set_option ($ldap, LDAP_OPT_REFERRALS, 0);

ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

ldap_bind(..)

谢谢=)

编辑2 – 全码:

namespace ldap;

abstract class AuthStatus

{

const FAIL = "Authentication failed";

const OK = "Authentication OK";

const SERVER_FAIL = "Unable to connect to LDAP server";

const ANONYMOUS = "Anonymous log on";

}

// The LDAP server

class LDAP

{

private $server = "127.0.0.1";

private $domain = "localhost";

private $admin = "admin";

private $password = "";

public function __construct($server, $domain, $admin = "", $password = "")

{

$this->server = $server;

$this->domain = $domain;

$this->admin = $admin;

$this->password = $password;

}

// Authenticate the against server the domain\username and password combination.

public function authenticate($user)

{

$user->auth_status = AuthStatus::FAIL;

$ldap = ldap_connect($this->server) or $user->auth_status = AuthStatus::SERVER_FAIL;

ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);

ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

$ldapbind = ldap_bind($ldap, $user->username."@".$this->domain, $user->password);

if($ldapbind)

{

if(empty($user->password))

{

$user->auth_status = AuthStatus::ANONYMOUS;

}

else

{

$result = $user->auth_status = AuthStatus::OK;

$this->_get_user_info($ldap, $user);

}

}

else

{

$result = $user->auth_status = AuthStatus::FAIL;

}

ldap_close($ldap);

}

// Get an array of users or return false on error

public function get_users()

{

if(!($ldap = ldap_connect($this->server))) return false;

ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);

ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);

$ldapbind = ldap_bind($ldap, $this->admin."@".$this->domain, $this->password);

$dc = explode(".", $this->domain);

$base_dn = "";

foreach($dc as $_dc) $base_dn .= "dc=".$_dc.",";

$base_dn = substr($base_dn, 0, -1);

$sr=ldap_search($ldap, $base_dn, "(&(objectClass=user)(objectCategory=person)(|(mail=*)(telephonenumber=*))(!(userAccountControl:1.2.840.113556.1.4.803:=2)))", array("cn", "dn", "memberof", "mail", "telephonenumber", "othertelephone", "mobile", "ipphone", "department", "title"));

$info = ldap_get_entries($ldap, $sr);

for($i = 0; $i < $info["count"]; $i++)

{

$users[$i]["name"] = $info[$i]["cn"][0];

$users[$i]["mail"] = $info[$i]["mail"][0];

$users[$i]["mobile"] = $info[$i]["mobile"][0];

$users[$i]["skype"] = $info[$i]["ipphone"][0];

$users[$i]["telephone"] = $info[$i]["telephonenumber"][0];

$users[$i]["department"] = $info[$i]["department"][0];

$users[$i]["title"] = $info[$i]["title"][0];

for($t = 0; $t < $info[$i]["othertelephone"]["count"]; $t++)

$users[$i]["othertelephone"][$t] = $info[$i]["othertelephone"][$t];

// set to empty array

if(!is_array($users[$i]["othertelephone"])) $users[$i]["othertelephone"] = Array();

}

return $users;

}

private function _get_user_info($ldap, $user)

{

$dc = explode(".", $this->domain);

$base_dn = "";

foreach($dc as $_dc) $base_dn .= "dc=".$_dc.",";

$base_dn = substr($base_dn, 0, -1);

$sr=ldap_search($ldap, $base_dn, "(&(objectClass=user)(objectCategory=person)(samaccountname=".$user->username."))", array("cn", "dn", "memberof", "mail", "telephonenumber", "othertelephone", "mobile", "ipphone", "department", "title"));

$info = ldap_get_entries($ldap, $sr);

$user->groups = Array();

for($i = 0; $i < $info[0]["memberof"]["count"]; $i++)

array_push($user->groups, $info[0]["memberof"][$i]);

$user->name = $info[0]["cn"][0];

$user->dn = $info[0]["dn"];

$user->mail = $info[0]["mail"][0];

$user->telephone = $info[0]["telephonenumber"][0];

$user->mobile = $info[0]["mobile"][0];

$user->skype = $info[0]["ipphone"][0];

$user->department = $info[0]["department"][0];

$user->title = $info[0]["title"][0];

for($t = 0; $t < $info[$i]["othertelephone"]["count"]; $t++)

$user->other_telephone[$t] = $info[$i]["othertelephone"][$t];

if(!is_array($user->other_telephone[$t])) $user->other_telephone[$t] = Array();

}

}

class User

{

var $auth_status = AuthStatus::FAIL;

var $username = "Anonymous";

var $password = "";

var $groups = Array();

var $dn = "";

var $name = "";

var $mail = "";

var $telephone = "";

var $other_telephone = Array();

var $mobile = "";

var $skype = "";

var $department = "";

var $title = "";

public function __construct($username, $password)

{

$this->auth_status = AuthStatus::FAIL;

$this->username = $username;

$this->password = $password;

}

public function get_auth_status()

{

return $this->auth_status;

}

}

?>

用法:

$ldap = new ldap\LDAP("192.168.1.123", "company.com", "admin", "mypassword");

$users = $ldap->get_users();

<think>好的,我需要回答用户关于ldapsearchOU(组织单元)的使用方法及示例的问题。首先,用户希望了解如何结合ou参数使用ldapsearch命令,并需要具体的示例。 首先,我需要回顾ldapsearch基本用法。根据引用[2]和[3],ldapsearch是一个用于查询LDAP目录的命令行工具,常用参数包括-D(绑定DN)、-w(密码)、-b(搜索基准)、-H(LDAP服务器地址)等。而OU作为组织单元,通常用于组织结构中的层级划分,属于LDAP目录树的一部分。 接下来,用户的问题集中在如何使用ou在搜索条件中。根据LDAP的搜索过滤器语法,可能需要使用filter参数来指定ou的条件。例如,查询特定OU下的条目,可以使用"(ou=xxx)"作为过滤器,或者结合其他属性进行查询。 我需要确保示例的正确性。引用[4]给出了一个基本示例,使用-b指定搜索基准,这里可能需要将ou包含在基准DN中,比如-b "ou=users,dc=example,dc=com"。同时,过滤器部分可能需要匹配对象类,如objectClass=organizationalUnit来获取OU本身的信息,或者查询特定OU下的用户。 另外,用户可能需要同时查询多个OU的情况,这时候可能需要使用更复杂的过滤器,或者调整搜索范围参数-s。例如,使用-s sub进行子树搜索,或者结合多个条件使用逻辑运算符。 需要注意的是,同的LDAP服务器可能有略微同的语法或配置,但基本结构应该是通用的。引用[3]中提到的参数如-s控制搜索范围(base、one、sub),这对确定搜索的深度很重要。例如,-s sub会搜索基准下的所有子树,而-s one仅搜索直接子级。 此外,引用[4]中的示例使用了-x进行简单认证,这可能在示例中需要保持一致。同时,确保命令中的转义字符正确,比如在bash中使用反斜杠换行,或者使用引号包裹过滤器中的特殊字符。 可能的示例包括: 1. 查询特定OU下的所有条目:使用-b指定包含OU的基准DN,并结合过滤器。 2. 查找所有OU的信息:使用过滤器objectClass=organizationalUnit。 3. 跨多个OU搜索用户:调整搜索基准到更高级的DN,并使用适当的过滤器。 需要验证这些示例是否符合实际命令结构,确保参数顺序和语法的正确性。例如,正确的命令格式应该是ldapsearch -H ldap://服务器 -x -D "绑定DN" -w 密码 -b "基准DN" "过滤器" 属性列表。 最后,整理这些信息,分步骤说明用法,并提供多个示例,涵盖同情况,如查询特定OU、查找所有OU、组合条件查询等。同时,注意引用相关的参考资料,如引用[3]和[4]中的参数说明和示例结构。</think>### ldapsearch 结合 OU使用方法及示例 OU(Organizational Unit)是 LDAP 目录中用于组织条目的常见结构。以下是 `ldapsearch` 查询 OU 的具体用法和示例: --- #### **1. 查询特定 OU 下的所有条目** **命令格式**: ```bash ldapsearch -H ldap://服务器地址 -x -D "绑定DN" -w 密码 -b "基准DN" "过滤器" [属性] ``` **示例**: 查询 `ou=users,dc=example,dc=com` 下的所有用户条目(`objectClass=inetOrgPerson`): ```bash ldapsearch -H ldap://localhost:389 -x -D "cn=admin,dc=example,dc=com" -w adminpass \ -b "ou=users,dc=example,dc=com" "(objectClass=inetOrgPerson)" cn mail ``` **说明**: - `-b "ou=users,dc=example,dc=com"`:限定搜索基准为 `users` OU。 - `"(objectClass=inetOrgPerson)"`:过滤器,匹配用户条目。 - `cn mail`:仅返回 `cn` 和 `mail` 属性[^4]。 --- #### **2. 查找所有 OU 的信息** **示例**: 列出 `dc=example,dc=com` 下所有 OU 的名称和描述: ```bash ldapsearch -H ldap://localhost:389 -x -D "cn=admin,dc=example,dc=com" -w adminpass \ -b "dc=example,dc=com" "(objectClass=organizationalUnit)" ou description ``` **说明**: - `"(objectClass=organizationalUnit)"`:匹配所有 OU 条目。 - `ou description`:返回 `ou` 和 `description` 属性[^3]。 --- #### **3. 跨多个 OU 搜索用户** **示例**: 在 `dc=example,dc=com` 的所有子 OU 中搜索邮箱包含 `sales` 的用户: ```bash ldapsearch -H ldap://localhost:389 -x -D "cn=admin,dc=example,dc=com" -w adminpass \ -b "dc=example,dc=com" -s sub "(&(objectClass=inetOrgPerson)(mail=*sales*))" ``` **说明**: - `-s sub`:递归搜索所有子树(包括嵌套 OU)。 - `(&(...))`:组合条件,筛选用户且邮箱含 `sales`[^4]。 --- #### **4. 创建或删除 OU 时的验证查询** **示例**: 确认 `ou=temp,dc=example,dc=com` 是否存在: ```bash ldapsearch -H ldap://localhost:389 -x -D "cn=admin,dc=example,dc=com" -w adminpass \ -b "ou=temp,dc=example,dc=com" -s base "(objectClass=*)" ``` **说明**: - `-s base`:仅检查基准条目是否存在。 - `"(objectClass=*)"`:匹配任意对象类[^3]。 --- #### **参数说明** | 参数 | 作用 | |------|------| | `-H` | LDAP 服务器地址 | | `-D` | 绑定 DN(管理员权限) | | `-b` | 指定搜索基准(含 OU 路径) | | `-s` | 搜索范围(`base`/`one`/`sub`) | | `-x` | 使用简单认证 | | `-w` | 绑定密码[^3][^4] | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值