perl
  • ldap
  • 2014-12-05 43 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

    相關問題