过滤字符串中的单词

filter word in string

我正在使用 PHP 查询 Active Directory 中的用户及其属性。我遇到的问题是部门经理的 LDAP 字段不仅返回用户名,还返回 FQDN(完全限定域名)路径,如下所示:

CN=User Name,OU=Users,OU=companyBranchOffice,OU=companyName,DC=subdomain,DC=domain,DC=com

结果保存在字符串 $depManager 中。如何只过滤掉用户名(CN=)?

提前致谢!

我有一个简单的(可能未优化的)函数可以从 DN 中获取信息:

<?php
function getInfosFromDN($dn)
{
    $regexCaptures = "/^(CN=.+),(OU=.+),(DC=.+)$/iU";

    $CN = preg_replace($regexCaptures, "", $dn);
    $OU = preg_replace($regexCaptures, "", $dn);
    $DC = preg_replace($regexCaptures, "", $dn);

    return array($CN, $OU, $DC);
}

list($CN, $OU, $DC) = getInfosFromDN("CN=User Name,OU=Users,OU=companyBranchOffice,OU=companyName,DC=subdomain,DC=domain,DC=com");

我想你目前正在使用 ldap_get_entries 来拉取 sn/cn/ou/uid 属性? 也许您可以尝试其中的另一个(取决于您的配置,也许是 uid)以仅获取真实用户名。不需要 preg_replacing.

示例:

$sr = ldap_search($ds, $dn, $filter) or die ("bummer");
$results = ldap_get_entries($ds, $sr);
var_dump($results);

现在您可以查看数据库中是否有任何属性只保存用户名的值,而不是整个 DN。如果这不起作用,您始终可以按照 Guillaume 的建议手动完成。

你有不同的选择。

  • 第一个选项是执行单独的 LDAP 查询以获取给定 DN 的 LDAP 条目并从中检索用户用户名
  • 然后您可以使用 PHP 字符串函数或正则表达式解析字符串以获取 CN=,
  • 之间的部分
  • 或者您可以使用 f.e。 Zend\Ldap\Dn 像这样:

    $dn = new \Zend\Ldap\Dn('CN=User Name,OU=Users,OU=companyBranchOffice,OU=companyName,DC=subdomain,DC=domain,DC=com');
    echo current($dn->get(0));
    // $dn->get(0) will return ['cn' => 'User Name']
    // so current($dn->get(0)) will return 'User Name'
    

免责声明:我是 Zend\Ldap

的维护者之一