Создание почтовых учетных записей на Комнигейте по членству в локальной группе AD

От: Sergey Sakirkin <CGatePro_at_mx_ru>
Дата: Tue 10 Jun 2008 - 13:37:15 MSD

Доброго времени суток.
Может кому пригодиться этот скрипт.

Создание почтовых учетных записей на Комнигейте по членству в локальной группе AD и отсылает оповещение о создании на почту. reportlist@DOMMm.ru

требует модулей:
LDAP CGP GeneratePassword
В стандартную поставку ActivePerl вроде не входят, приходится до устанавливать через PPM



К сожелению проблема перекодировки полного имени, мной до конца не решена отчет приходит не особо читаемым :(

Пример отчета:
<skip>
test2--- present skip user
Atemp to create new user - ц░б⌠ц░б╟ц░б╩ц░б╦ц░б╪ц░б╬ц░б╡ц░б╟ ц░б∙ц░б╩ц░б╣ц░б╫ц░б╟ ц░б÷ц░б╣ц▒б┌ц▒б─ц░б╬ц░б╡ц░б╫ц░б╟ .........
Atemp to create new user - ц░б⌠ц░б╟ц░б╩ц░б╦ц░б╪ц░б╬ц░б╡ц░б╟ ц░б∙ц░б╩ц░б╣ц░б╫ц░б╟ ц░б÷ц░б╣ц▒б┌ц▒б─ц░б╬ц░б╡ц░б╫ц░б╟ successfully greate user-name:XYZ
.........
 Set new password for XYZ as:password
<skip>

#perl
use strict;

use Net::LDAP;
use CLI;
use CGP::CLI;
use Crypt::GeneratePassword qw(word chars); use Net::SMTP;

#################### Глобальные константы ####################
## DC-IP
my $LDAPServerAddress = '192.168.21.2'; # ## От какого пользюка подключаемся
my $LDAPAdminDN = 'cgatepro@DOMMm.lan';
## его пароль
my $LDAPAdminPassword = 'pass';
## Откуда искать
my $LDAPSearchBase = 'DC=DOMMm,DC=lan';
my $ADGroop = '(&(memberOf=CN=EMailUser,DC=DOMMm,DC=lan) )'; ## Почтовый сервер
my $CGServerAddress = '192.168.0.8'; # You should redefine these values ## Заходим на CGP в качестве админа
my $CLILogin = 'postmaster';
## Почтовый домен
my $MailDomain = 'DOMMm.ru';
## его пароль.
my $CLIPassword = 'PASSWORD';
#################### Глобальные константы ####################

my $CGPAccont;
my @ADAccount;

my $cli;
my $Accym;
my $addUser;

$addUser = 0;

loadADAccount ();
$CGPAccont = LoadCGPAccont ();
ChekDiferent ();

$Accym = $Accym ."\n---------------------------------------------\nEnd\n";
if ($addUser > 0) {SendMail ();}
########################################################################
####################### загрузка учеток из АД ##########################
########################################################################
sub loadADAccount {
  my $user=$_[0];
  my $result;
  my ($name,$domain)=("","");
  my $realName;
  my $entry;
  my $displayName;
  my $atrRef;
  my $ldap = Net::LDAP->new($LDAPServerAddress,port=>389,timeout=>20)
       or die "Can't connect to $LDAPServerAddress via LDAP";
  $result=$ldap->bind($LDAPAdminDN,password=>$LDAPAdminPassword)
       or die "Can't bind as admin: ".$result->error;
  $result->code && return "Can't bind as admin: ".$result->error;

  my $mesg = $ldap->search ( # perform a search

               base   => $LDAPSearchBase,  #"cn=$domain",
               filter => $ADGroop#,
               #attrs => $name
       );
  $ldap->unbind();                        # unbind & disconnect

  unless(defined $mesg && !$mesg->code) {     return "LDAP search failed: ".$result->error;   }
  if($mesg->all_entries() eq 0) {
    return "LDAP: nothing groop ".$ADGroop;   }

  foreach $entry ($mesg->all_entries)
  {my $ref1=@$entry{'asn'};

        my $attrs=@$ref1{'attributes'};
            foreach $atrRef (@$attrs)
            {   my $type=@$atrRef{'type'};
                my $vals=@$atrRef{'vals'};
               $realName=@$vals[0] if($type eq 'sAMAccountName');
               $displayName=@$vals[0] if($type eq 'displayName');}
        #last; # we need only 1 entry
        my $userData = {
         RealName => $realName,
         Password => word(6,8),
         displayName => $displayName
 };
        push(@ADAccount, $userData);

  }
}
########################################################################
################### загрузка учеток из комунигада ######################
########################################################################
sub LoadCGPAccont {

    my @special=("public", "dilest","postmaster","pdx","200");     my $accounts;
    my @accounts;
    my $accountList;
    my $i=0;
    $cli = new CGP::CLI( { PeerAddr => $CGServerAddress,

                          PeerPort => 106,
                          login    => $CLILogin,
                          password => $CLIPassword } )
                       || die "Can't login to CGPro: 
".$CGP::ERR_STRING."\n";
        #Array of undeleted\special accounts

    $accountList = $cli->ListAccounts($MailDomain);
        die "\nError " . $cli->getErrMessage . "(".$cli->getErrCode.
       ") fetching accounts list\n"
        unless ($accountList);

#Create array of accounts

    foreach (keys %$accountList) {

                             $accounts[$i]=$_;
                             ++$i;};

# Delete special accounts from array of accounts

    $i=0;
    my $j=0;
    foreach (@special) {

       foreach (@accounts) {
           if ($accounts[$i] eq $special[$j])
                {splice (@accounts, $i, 1);}
                       ++$i;
            }
     ++$j;
     $i=0;

    }
return $accountList;
$cli->Logout();
}
########################################################################
###################      сравнение массивов и создане пользователя 
###########
########################################################################
sub ChekDiferent {

    $Accym = $Accym ."Connect to Comunigate.....\n";

   $cli = new CGP::CLI( { PeerAddr => $CGServerAddress,
                          PeerPort => 106,
                          login    => $CLILogin,
                          password => $CLIPassword
                        } )

  || die "Can't login to CGPro via CLI: ".$CGP::ERR_STRING;

    foreach my $item (@ADAccount) {
      #$Accym = $Accym
.$item->{'RealName'}."\t\t".$item->{'displayName'}."\n";

      if ( defined $CGPAccont->{$item->{'RealName'}})
        {
            $Accym = $Accym .$item->{'RealName'}. "--- present skip user\n";
        }else
        {
              $Accym = $Accym ."Atemp to create new user - " . 
$item->{'displayName'} . "\n.........\n";
              $cli->SendCommand('CreateAccount '.$item->{'RealName'}. ' 
{RealName= "'.$item->{'displayName'}.'";}')
                || die "Can't create account via CLI:".$cli->getErrMessage;
              $Accym = $Accym ."Atemp to create new user - " . 
$item->{'displayName'} . " \n\nnsuccessfully greate user-name:".$item->{'RealName'}."\n.........\n Set new password for ".$item->{'RealName'}." as:". $item->{'Password'} ."\n";

               $cli->UpdateAccountSettings($item->{'RealName'},{Password => $item->{'Password'}})

                || die "Error: ".$cli->getErrMessage.", quitting";
              $Accym = $Accym ."All successfully \n.........\n"  ;
     ++$addUser;
        }

    }
    $cli->Logout();
}

sub SendMail ()
{

   my $smtp = Net::SMTP->new(Host => '192.168.0.8',

                           Hello => 'DOMMm.ru',
                           Timeout => 30,
                          );

    $smtp->mail('reportlist@DOMMm.ru <reportlist@DOMMm.ru>');
    $smtp->to('reportlist@DOMMm.ru <reportlist@DOMMm.ru>');
    $smtp->data();
    $smtp->datasend("To: reportlist\@DOMMm.ru\n");
    $smtp->datasend("From: ScriptCMD\@DOMMm.ru\n");
    $smtp->datasend("Subject: Adding new user to Comunigate from AD\n");
    $smtp->datasend("\n\n");
    $smtp->datasend("Hello ADMIN!!!!!! :-), last news from Comunigate\n\n\n\n");
    $smtp->datasend ($Accym);
    $smtp->dataend();
    $smtp->quit;

} Получено Tue Jun 10 09:37:38 2008

Этот архив был сгенерирован hypermail 2.1.8 : Tue 10 Jun 2008 - 16:14:30 MSD