返回列表 回复 发帖

[分享] 从AD查询用户并按ou生成outlook 2003地址簿

自己写的从AD查询用户并按ou生成outlook 2003地址簿
#!/usr/bin/perl -w

my $ldapserver = '192.168.1.111';
my $ldapbase = "dc=cx,dc=com";
my $ldapuser = 'tt@cx.com';
my $ldappass = '12345678';
my $mail_attr = 'userprincipalname';
#my $mail_attr = 'mail';


my $filepath = './addrbook.csv';
my $surname_attr = 'sn';
my $givenname_attr = 'givenname';
my $name_attr = 'name';

use Net::LDAP;
use Encode;
use utf8;
$ldap = Net::LDAP->new( $ldapserver );
# 绑定到ldap服务器
$mesg = $ldap->bind( $ldapuser,password => $ldappass);
# 查询出域中的ou
$mesg = $ldap->search(
                        base   => $ldapbase,
                        filter => "(&(ou=*)(!(ou=domain controllers)))"
                      );
$mesg->code && die $mesg->error;

# 循环获取ou中的信息
foreach $entry ($mesg->entries){
         my $oudn = $entry->get_value('distinguishedname');
         # 查询ou的名称
         my $ouname = $entry->get_value('ou');
         print "------",$oudn,"\n";
         # 查询ou中的用户
         my $mesg = $ldap->search( # perform a search
                        base   => "$oudn",
                        filter => "(objectclass=person)"
                      );
         $mesg->code && die $mesg->error;
     # 循环获取ou中的条目
         for($mesg->entries){
                         my $email = $_->get_value($mail_attr);
                         my $surname = $_->get_value($surname_attr);
                         my $givenname = $_->get_value($givenname_attr);
                         my $name = $_->get_value($name_attr);
                         
                         $email = &utf8togb2312($email);
                         $surname = &utf8togb2312($surname);
                         $givenname = &utf8togb2312($givenname);
                         $name = &utf8togb2312($name);
                         
                     
                         print $name,"\n";
                 #print $email,"\n";
                         $email = lc($email);
                         &addbook($filepath) unless -e $filepath;
                         &addaddr($filepath,$surname,$givenname,$name,$email);
                         &addbook($filepath."_".$ouname.".csv") unless -e $filepath."_".$ouname.".csv";
                         &addaddr($filepath."_".$ouname.".csv",$surname,$givenname,$name,$email);
                         
                         
         }       
}

$mesg = $ldap->unbind;  # take down session



# 在创建好的csv地址簿中添加地址
sub addaddr {
   my($filepath) = shift;
   my($surname,$givenname,$name,$email) = @_;
   open(FH,">>",$filepath)or die "Can't open csv file:$!";
   # 写入数据
   # 0 英文称谓 1 名  3 姓 4 中文称谓 6 部门 51 电子邮件地址 52 电子邮件类型 53 电子邮件显示名称
   &wrdata(\*FH,'1',$givenname,'3',$surname,'4',$name,'51',$email,'52','SMTP','53',$name);
   close FH;
}
# 创建csv地址簿并写入标题
sub addbook {
   my($filepath) = shift;
   print "make csv \n";
   #                        1                        2                                3                                        4                                5
   my @title = qw(英文称谓        名                                中间名                                姓                                中文称谓       
                        单位                部门                        职务                                商务地址街道        商务地址街道2
                        商务地址街道3 商务地址市县        商务地址省市自治区 商务地址邮政编码 商务地址国家地区
                        住宅地址街道 住宅地址街道2  住宅地址街道3                住宅地址市县        住宅地址省市自治区       
                        住宅地址邮政编码 住宅地址国家地区 其他地址街道        其他地址街道2        其他地址街道3       
                        其他地址市县 其他地址省市自治区        其他地址邮政编码 其他地址国家地区 助理的电话
                        商务传真        商务电话                商务电话2                        回电话                        车载电话
                        单位主要电话 住宅传真                住宅电话                        住宅电话2                ISDN
                        移动电话        其他传真                其他电话                        寻呼机                        主要电话
                        无绳电话        TTYTDD电话                电报                                Internet忙闲        办公地点       
                        地点                电子邮件地址        电子邮件类型                电子邮件显示名称 电子邮件3显示名
                        电子邮件3类型 电子邮件3地址 电子邮件2地址                电子邮件2类型        电子邮件2显示名
                        附注                工作证号码                关键字                                记帐信息                纪念日
                        经理姓名        类别                        里程                                敏感度                        目录服务器
                        配偶                其他地址邮箱        商务地址邮箱                身份证编号                生日
                        私有                缩写                        网页                                性别                        业余爱好
                        引用者                用户1                        用户2                                用户3                        用户4
                        优先级                语言                        帐户                                职业                        住宅地址邮箱
                        助理的姓名        子女
           );

   open(FH,">",$filepath)or die "Can't open csv file:$!";
   # 写入标题
   my $i = 0;
   for(@title){
          binmode(FH, ':encoding(utf8)');
      print FH "\"$_\"";
          &printcomma($i,\*FH);
          $i++;
   }
   close FH;
}

# 往csv中写入数据
sub wrdata {
          my $handle = shift;
      my %date = @_;
          my $i = 0;
          while($i le 91){
                if (defined($date{$i})) {
                        print FH "\"$date{$i}\"";
                        &printcomma($i,$handle);
                }else{
                        &printcomma($i,$handle);
                }
            $i++ ;
         }
}
# 打印逗号和换行符
sub printcomma {
        my ($i,$handle) = @_;
        if ($i ne 91) {
                print $handle ",";
        }else{
                print $handle "\n";
        }
}

sub utf8togb2312 {
        my $a = shift;
        my $b = encode("gb2312",decode("utf8",$a));
        return $b;
}
[ 本帖最后由 xia_y_h 于 2009-9-10 11:56 编辑 ]
楼上强人啊!
走自己的路,让别人说去吧
呵呵   见笑了,菜鸟一个
学习中
呵呵。水平不错了。欢迎xia_y_h来多交流,如有兴趣,可加入extmail高级群。
高性能开源邮件系统- ExtMail Server
踩一下,留下个猫印。

厉害

佩服,厉害,学习了
楼主强人来的呀
学习学习,还不能全看懂哈哈!
编译了下  没成功  为什么
返回列表