#!/usr/bin/perl -w use strict; use warnings; use DBI; use Net::LDAP; use Net::LDAP::Util qw(ldap_error_text); use Mail::Sender; use Unicode::String qw(utf8 utf16le); require '/usr/local/Candy/private.pl'; my($ldapbase, $password, $today, $outdir, $outfile, $binddn, $ldap, $mesg, $searchresult); my($result, $candyconnection, $query, $SQL, @data, $jobcode, $deptcode, $membrof, $mo, $moquery); my($ou, $lname, $fname, $candyID, $dept_desc, $job_desc, $homeDrive, $homeDirectory, $scriptPath); sub init { $ldapbase = "OU=candy Users and Computers,DC=candy,DC=com"; $password = get_password(); $binddn = get_binddn(); $outdir="/tmp"; $outfile="newADusers.csv"; $candyconnection = DBI->connect('DBI:mysql:candyTEST;host=123.123.123.123', 'root', 'candy') || die "Could not connect to database: $DBI::errstr"; # system("rm $outdir/$outfile*"); } sub chk4newuser { # open(OUTFILE,"> $outdir/$outfile"); $ldap = Net::LDAP->new ( "ds.candy.com" ) or die "$@"; $mesg = $ldap->start_tls( ); die $mesg->error( ) if $mesg->code( ); $mesg = $ldap->bind ( dn => $binddn, password => $password,version => 3 ); # use for changes/edits if($mesg->code){ die "An error occurred binding to the LDAP server: ".ldap_error_text($mesg->code)."\n"; } $SQL="SELECT `ou`, `lname`, `fname`, `candyID`, `dept_desc`, `job_desc` , `homeDrive`, `homeDirectory`, `scriptPath`, `Dept`.`Deptcode`, `Job`.`Jobcode` FROM `AD_Prov`, `Job`, `Dept` WHERE `type` ='TM' and `create_dt` is NULL and `Dept`.`Deptcode` = `AD_Prov`.`Deptcode` and `Job`.`Jobcode` = `AD_Prov`.`Jobcode`;"; $query = $candyconnection->prepare($SQL); # print "$SQL\n"; $query->execute(); while (@data = $query->fetchrow_array()) { $ou = $data[0]; $lname = $data[1]; $fname = $data[2]; $candyID = $data[3]; $dept_desc = $data[4]; $job_desc = $data[5]; $homeDrive = $data[6]; $homeDirectory = $data[7]; $scriptPath = (!defined $data[8] || $data[8] eq "") ? "Main.bat" : $data[8]; $deptcode = $data[9]; $jobcode = $data[10]; $searchresult = $ldap->search(base => $ldapbase, filter => "(&(objectCategory=person)(objectClass=user)(sAMAccountName=$candyID))", scope => "sub" ); if ($searchresult->entries) { print "Already Exists\n";#Found an AD Account ALREADY } else { EmpaddADaccount(); } } # close(OUTFILE); } sub EmpaddADaccount { my $pass_utf8 = utf8('"pass1234"'); my $pass_win = $pass_utf8->utf16le(); $result = $ldap->add ( "cn=" . $fname . " " . $lname . "," . $ou, attr => [ 'cn' => $fname . " " . $lname, 'sn' => $lname, 'displayName' => $fname . " " . $lname, 'givenName' => $fname, 'mail' => $fname . "." . $lname . "\@candycane.com", 'sAMAccountName' => $candyID, 'employeeID' => $candyID, 'userPrincipalName' => $candyID . "\@candy.com", 'userAccountControl' => '512', 'unicodePwd' => $pass_win, 'pwdLastSet' => '0', 'department' => $dept_desc, 'title' => $job_desc, 'description' => $dept_desc . " - " . $job_desc, 'homeDirectory' => $homeDirectory, 'homeDrive' => $homeDrive, 'company' => 'candy', 'mailNickname' => $candyID, 'telephoneNumber' => '555 123 4567', 'postalCode' => '33458', 'scriptPath' => $scriptPath, 'streetAddress' => '123 Main St', 'l' => 'Anytown', 'st' => 'GA', 'c' => 'US', 'co' => 'United States', 'countryCode' => '840', 'proxyAddresses' => "SMTP:" . $fname . "." . $lname . "\@candycane.com", 'proxyAddresses' => "smtp:" . substr($fname,0,1) . $lname . "\@candycane.com", 'objectclass' => [ "top", "person", "organizationalPerson", "user" ] ] ); $result->code && warn "failed to add entry: ", $result->error ; $SQL="SELECT `dn` FROM `AD_memberOf` WHERE (`deptcode` = '999' and `jobcode` = '99') OR (`deptcode` = '$deptcode' and `jobcode` = '99') OR (`deptcode` = '$deptcode' and `jobcode` = '$jobcode');"; $moquery = $candyconnection->prepare($SQL); # print "$SQL\n"; $moquery->execute(); while ($membrof = $moquery->fetchrow_array()) { # print "$membrof\n"; $result = $ldap->modify($membrof, add => { member => [ "cn=" . $fname . " " . $lname . "," . $ou ] } ); $result->code && warn "failed to add entry: ", $result->error ; } mkdir "/mnt/winserver/users/" . $candyID; } &init; &chk4newuser;