Okay, this was such a pain in the buttocks that I decided to post the
"final" code. (I'll tweak it a bit later, but this is functional) My
apologies to someone, I found the pack(),unpack() part on the Internet,
and I'm not sure who the original author is.
####################################################
use strict;
use warnings;
no warnings qw(uninitialized);
use Win32::OLE qw(in);
use Win32::OLE::Variant;
use Tim::Date_Time;
use Tim::GetClients;
my @dc = qw(dc1 dc2 dc3 dc4);
print "\n\nFinding all available DCs...\n\n";
for(0..$#dc){
unless(GetClients::Ping($dc[$_])){
delete $dc[$_];
}
}
my %users;
foreach my $dc(@dc){
print "Checking $dc";
my $ADUser = Win32::OLE->GetObject("LDAP://$dc/OU=Groups and
Users,OU=HQ,DC=domain,DC=com") || die;
foreach(in($ADUser)){
unless($_->{objectCategory} =~ /Group/i){
my $lastlogon = $_->{lastLogon};
my $name = $_->{name};
my $lastlogontime = 1;
if($lastlogon){
my $Hval = $lastlogon->{HighPart};
my $Lval = $lastlogon->{LowPart};
my $Factor = 10000000; # convert to seconds
my $uPval = pack("II",$Lval,$Hval);
my($bVp, $aVp) = unpack("LL", $uPval);
$uPval = ($aVp * 2**32 + $bVp)/$Factor;
$lastlogontime = $uPval - (134774*86400);
#convert to Perl time
}
print ".";
$name =~ s/^CN=//;
push @{$users{$name}},$lastlogontime;
}
}
print "\n\n"
}
open(OUTFILE,">lastlogon.csv") || die;
print "Finding last logon...\n";
foreach(sort keys %users){
my $name = $_;
my $lastlogon;
foreach my $logon(@{$users{$_}}){
if($logon > $lastlogon){
$lastlogon = $logon;
}
}
$lastlogon = (Date_Time::SimpleDT($lastlogon))[0];
print OUTFILE "$name,$lastlogon\n";
}
close OUTFILE;
######################################################
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]