Zimbra offers Open Source email server software and shared calendar for Linux and the Mac
Go Back   Zimbra :: Forums > Zimbra Collaboration Suite > Administrators

Welcome to the Zimbra :: Forums!
Welcome, if you would like to post a comment please register. We also encourage you to explore all things Zimbra with our team and members of the community.

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 03-12-2011, 10:57 AM
Junior Member
 
Posts: 6
Default Zcs 7 + Ms Ad 2008r2 Rus

There is a script that hourly checks users in AD, if the new users it adds it to the ZCS but user names are displayed characters ;5:A59 ;5:A0=4@>2
Here's the script:

Code:
#!/usr/bin/perl
use Net::LDAP;
use utf8;
use Encode;

my $domain="mail_domain";
my $zmprov="/opt/zimbra/bin/zmprov -l";

my $AD_server="10.0.0.150";
my $AD_user="jabberd\@domain.ru";
my $AD_pass="passwd";
my $AD_base="dc=domain,dc=ru";

my $LDAP_server="10.0.0.242";
my $LDAP_user="uid=zimbra,cn=admins,cn=zimbra";
my $LDAP_pass="ldap";
my $LDAP_base="dc=mail_domain,dc=ru";

my %LDAP=(),%AD=();

#----------AD
$ldap = Net::LDAP->new($AD_server);
$ldap->bind($AD_user, password=>$AD_pass);

$mesg = $ldap->search(filter=>"(&(objectclass=user)(mail=*\@$domain)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))",
        base=>$AD_base,
        attrs=> ['sAMAccountName','displayName','sn', 'givenname', 
                'initials','department','description','userAccountControl','mail','company','telephoneNumber']);

@entries = $mesg->entries;
foreach $entry (@entries) {

my $name,$sn,$mail,$department,$company,$sAMAccountName;

            $id=$entry->get_value(sAMAccountName);
            $id=lc($id);
            $displayName=$entry->get_value(displayName);
            $sn=$entry->get_value(sn);
            $givenname=$entry->get_value(givenname);
            $initials=$entry->get_value(initials);
            $department=$entry->get_value(department);
            $description=$entry->get_value(description);
            $userAccountControl=$entry->get_value(userAccountControl);
            $mail=$entry->get_value(mail);
            $mail=lc($mail);
            $telephoneNumber=$entry->get_value(telephoneNumber);
            $company=$entry->get_value(company);

            $disabled=false;
            if (length($displayName)>0)   {
                $AD{$id}{displayName} = $displayName;
            }
            if (length($sn)>0)   {
                $AD{$id}{sn} = $sn;
            }
            if (length($givenname)>0)   {
                $AD{$id}{givenname} = $givenname;
            }
            if (length($initials)>0)   {
                $AD{$id}{initials} = $initials;
            }
            if (length($description)>0)   {
                $AD{$id}{description} = $description;
            }
            if (length($disabled)>0)   {
                $AD{$id}{disabled} = $disabled;
            }
            if (length($mail)>0)   {
                $AD{$id}{mail} = $mail;
            }
            if (length($telephoneNumber)>0) {
                $AD{$id}{telephoneNumber} = $telephoneNumber;
            }
            if (length($company)>0) {
                $AD{$id}{company} = $company;
            }
}

#---------- zimbra ldap

print "\nZIMBRA\n";
$ldap2 = Net::LDAP->new($LDAP_server);
$ldap2->bind($LDAP_user, password=>$LDAP_pass);

$mesg = $ldap2->search(filter=>"(&(objectClass=zimbraAccount)(!(userPassword=*))(!(zimbraCalResType=*)))",
        base=>$LDAP_base, attrs=> ['uid', 'displayName','sn','givenname','sn','mail','initials',
            'description','zimbraPrefFromAddress','zimbraMailDeliveryAddress','zimbraAccountStatus','telephoneNumber','company'] );

my $id='',$displayName='',$sn='',$givenname='',$initials='',$department='',$description='',$disabled='',$mail='';
@entries = $mesg->entries;
foreach $entry (@entries) {
    $id=$entry->get_value(uid);
#    if (($id ne "admin")&&($id ne "admin")&&($id ne "wiki")&&($id ne "spam.2bv4rvsjs")&&($id ne "ham.xdnsnpsmd3"))  {
        $displayName=$entry->get_value(displayName);
        $sn=$entry->get_value(sn);
        $givenname=$entry->get_value(givenname);
        $sn=$entry->get_value(sn);
        $initials=$entry->get_value(initials);
        $description=$entry->get_value(description);
        $telephoneNumber=$entry->get_value(telephoneNumber);
        $company=$entry->get_value(company);
        $status=$entry->get_value(zimbraAccountStatus);

        if (defined ($AD{$id})) {
            if ("$status" ne "active")
            {
                print "$id status=active\n";
                $status="active";
            }
            else{
                $status="";
            }
        }
        else {
            if ("$status" eq "active")
            {
                print "$id status=locked\n";
                $status="locked";
            }
            else{
                $status="";
            }
        }

        $mail=$entry->get_value(zimbraPrefFromAddress);

        if (length($mail)==0)
        {
            $mail=$entry->get_value('zimbraMailDeliveryAddress');
        }

        if (length($displayName)>0) {
            $LDAP{$id}{displayName} = $displayName;
        }
        if (length($sn)) {
            $LDAP{$id}{sn} = $sn;
        }
        if (length($givenname)>0) {
            $LDAP{$id}{givenname} = $givenname;
        }
        if (length($initials)>0) {
            $LDAP{$id}{initials} = $initials;
        }
        if (length($description)>0) {
            $LDAP{$id}{description} = $description;
        }
        if (length($telephoneNumber)>0) {
            $LDAP{$id}{telephoneNumber} = $telephoneNumber;
        }
        if (length($company)>0) {
            $LDAP{$id}{company} = $company;
        }
        if (length($mail)>0) {
            $LDAP{$id}{mail} = $mail;
        }
        if (length($status)>0) {
            $AD{$id}{status} = $status;
        }
#    }

}
print ("\n===AD==\n");

my $id='',$displayName='',$sn='',$givenname='',$initials='',$department='',$description='',$disabled='',$mail='';

print "удаляем одинаковые и несовпадающие с ад поля\n";
my $k2,$v2;
while(my ($k,$v)=each(%AD)) {
#Юзер уже есть
     if (defined ($LDAP{$k})) {
         while(($k2,$v2)=each(%{$AD{$k}})) {
#            print "$k2 # $v2\n";
            if ($LDAP{$k}{$k2} ne $AD{$k}{$k2}) {
                delete $LDAP{$k}{$k2};
#               print "удалено значение не соответсвующее АД значение\n";

            }
            else  {
#               print "Удалены идентичные значения\n";
                delete $AD{$k}{$k2};
                delete $LDAP{$k}{$k2};
            }
        }
    }
}

open(PIPE,'|/opt/zimbra/bin/zmprov -l');

my $create;
my $attr_st;
my $alias_st;
open (FILE, ">commands.list");

while(my ($k,$v)=each(%AD)) {
    $create=0;
    $attr_st="";
    $alias_st="";
    $from_st="";
    if (!(defined ($LDAP{$k})))  {
        $create=1;
    }
    #обновляем данные юзера
    while(my ($k2,$v2)=each(%{$AD{$k}})) {
#        print "$k --> $k2:$v2\n";
        if ($k2 eq "mail") {
            if ("$k\@$domain" ne "$v2" ) {
                $alias_st=$v2;
            }
        }
        if ($k2 eq "displayName") {
            $attr_st="$attr_st displayName \"$v2\"";
        }
        if ($k2 eq "sn") {
            $attr_st="$attr_st sn \"$v2\"";
        }
        if ($k2 eq "givenname") {
            $attr_st="$attr_st givenname \"$v2\"";
        }
        if ($k2 eq "initials") {
            $attr_st="$attr_st initials \"$v2\"";
        }
        if ($k2 eq "description") {
            $attr_st="$attr_st description \"$v2\"";
        }
        if ($k2 eq "sn") {
            $attr_st="$attr_st sn \"$v2\"";
        }
        if ($k2 eq "status") {
            print "$k zimbraAccountStatus \"$v2\"\n";
            $attr_st="$attr_st zimbraAccountStatus \"$v2\"";
        }
        if ($k2 eq "telephoneNumber") {
            print "$k telephoneNumber \"$v2\"\n";
            $attr_st="$attr_st telephoneNumber \"$v2\"";
        }
        if ($k2 eq "company") {
            print "$k company \"$v2\"\n";
            $attr_st="$attr_st company \"$v2\"";
        }
    }

    if ($create==1) {
        print PIPE "ca $k\@$domain '' $attr_st\n";
        print FILE "ca $k\@$domain '' $attr_st\n";

    }
    else  {
        if (length($attr_st)>0)
        {
            print PIPE "ma $k\@$domain $attr_st\n";
            print FILE "ma $k\@$domain $attr_st\n";
        }
    }

    if (length($alias_st)>0) {
        print PIPE "aaa $k\@$domain $alias_st\n";
        print FILE "aaa $k\@$domain $alias_st\n";
    }
    if (length($alias_st)>0) {
        print PIPE "ma $k\@$domain  zimbraPrefFromAddress $alias_st\n";
        print FILE "ma $k\@$domain  zimbraPrefFromAddress $alias_st\n";
    }

}
close(FILE);
close(PIPE);
What you need to alter the script so that the names were in Russian ?
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes


Similar Threads

Why Join?

Registering let's you ask questions, makes it easier to search, displays any files attached to posts, and notifies you about replies.

blog.zimbra.com




 

SEO by vBSEO ©2011, Crawlability, Inc.