perl
  • ldap
  • 2014-12-05 72 views 1 likes 
    1

    当前有一个小的perl脚本给定的username使用Net :: LDAP从ActiveDirectory获取他的电子邮件地址。使用Net :: LDAP获取所有用户信息

    搜索部分如下:

    my $user = "myuser"; 
    my $mesg = $ldap->search(
        base => "dc=some,dc=example,dc=com", 
        filter => '(&(sAMAccountName=' . $user . ')(mail=*))', #?!? 
    ); 
    for my $entry ($mesg->entries) { 
        my $val = $entry->get_value('mail'); 
        say "==$val=="; 
    } 
    

    工作正常。

    我应该如何修改上述语句以获取所有可用的给定用户的信息myuser?我希望得到一个Perl的十岁上下的数据结构,例如像下一个:

    my $alldata = search(... all info for the given $user ...); 
    say Dumper $alldata; #hashref with all stored informations for the $user 
    

    这可能是死的简单 - 但我总的AD & LDAP哑人...

    编辑:当我倾倒出$msg->entries(什么是LADP :: Entry对象)有什么,但我不知道它包含的一切或只有部分存储的数据...

    +0

    ,如果你想看看你一个快速的方法是转储出来... \t的foreach我的$ E($ mesg->项) {$ E->转储; }。但是除非你规定你只需要一些属性,否则你的服务帐户只能访问某些属性,你应该获得所有的数据属性。 – 2014-12-05 19:48:50

    +0

    因此,使用'filer => ...'我的上面的代码中有什么,我应该为给定的用户获取我的服务帐户的所有信息? – jm666 2014-12-05 19:59:46

    +0

    是正确的,那么您将为每个拥有(e)邮件地址的用户获得服务帐户可用的所有内容。如果你想要没有邮件的用户(不是没有邮件的用户),你可以在'filter =>'(sAMAccountName ='。$ user。')'中使用特定的samaccountname。你可以迭代所有返回的属性......'foreach $ a($ e-> attributes)''。每个值都将是一个标量还是一个数组,取决于它是单值还是多值。 – 2014-12-05 20:13:00

    回答

    2

    我已经完成类似的东西,我用它来查询LDAP:

    my $ldapResponse = $ldap->search(base => $base, filter => $filter, attrs => $attrs); 
    

    然后这个解析它:

    if ($ldapResponse && $ldapResponse->count()) { 
        $ldapResponse->code && die $ldapResponse->error; 
        my %domainNames = %{$ldapResponse->as_struct}; 
        foreach my $domainName (keys %domainNames) { 
         my %ldapResponse; 
    
         my %dnHash = %{$domainNames{$domainName}}; 
    
         foreach my $attr (sort(keys %dnHash)) { 
         # Note that the value for each key of %dnHash is an array, 
         # so join it together into a string. 
         my $value = join(" ", @{$dnHash{$attr}}); 
         $ldapResponse{$attr} = $value; 
         } 
         // Dump/use %ldapResponse 
        } 
        } 
    

    我从来没有尝试过在你的代码中使用了ldap->entries,但对我来说,上述工程!

    我明确指定了一个(长)属性列表($attr),但也许这是可选的,如您的示例所示,并且您可以通过跳过该参数到search()来获得所有LDAP字段。

    +0

    Thanx,主要问题是**如何构建正确的' $ filter'来获取所有存储的信息。 – jm666 2014-12-05 19:57:50

    +0

    '$ filter'限制了返回的记录,将其视为查询的WHO。 '$ attr'限制每条记录返回的字段。刚刚检查过文档,'$ attr'是可选的。所以,如果你想给一个给定用户的所有字段,按照它在代码中的方式运行search(),然后使用我的代码来解析结果并获得所有字段。 – jimtut 2014-12-05 20:20:26

    相关问题