Преобразование времени из LDAP в Perl - PullRequest
1 голос
/ 20 марта 2012

Я создал скрипт на Perl для подключения к LDAP, получения значений и публикации их в файл CSV. Значения, которые я получаю с помощью запроса, - это d "отличительное имя, userAccountControl & pwdLastSet. Я могу правильно вытащить и проанализировать первые два результата и отправить их в файл CSV, но pwdLastSet возвращает WIN32 :: OLE = HASH (0x. ......). Я устал от sprintf, hex (), и результат равен либо значению WIN32, либо 0. Я ожидаю что-то из 18 цифр. Спасибо за помощь.

#!/usr/bin/perl
use xSV;
use Win32;
use Win32::OLE;
# use strict;
.
.
.
.  
  while ($line = <GROUPS>) {
        chomp($line);
        if ($line =~ m/^  user  .*/) {
            $line =~ s/^  user.\s//;
            my ($objRootDSE, $strDomain, $strUsername, $objConnection, $objCommand, $objRecordSet, $strDN, $arrSplitResponse, $strLName, $strFName, $strUserType);
            use constant ADS_SCOPE_SUBTREE => 2;
            # Get domain components
            $objRootDSE = Win32::OLE->GetObject('LDAP://RootDSE');
            $strDomain = $objRootDSE->Get('DefaultNamingContext');
            # Get username to search for
            $strUsername = $line;
            # Set ADO connection
            $objConnection = Win32::OLE->new('ADODB.Connection');
            $objConnection->{Provider} = 'ADsDSOObject';
            $objConnection->Open('Active Directory Provider');
            # Set ADO command
            $objCommand = Win32::OLE->new('ADODB.Command');
            $objCommand->{ActiveConnection} = $objConnection;
            $objCommand->SetProperty("Properties", 'Searchscope', ADS_SCOPE_SUBTREE);
            $objCommand->{CommandText} = 'SELECT distinguishedName, userAccountControl, pwdLastSet FROM \'LDAP://' . $strDomain . '\' WHERE objectCategory=\'user\' AND samAccountName = \'' . $strUsername . '\'';
            # Set recordset to hold the query result
            $objRecordSet = $objCommand->Execute;
            # If a user was found - Retrieve the distinguishedName
            if (!$objRecordSet->EOF) {
                $strDN = $objRecordSet->Fields('distinguishedName')->Value;
                $strAcctControl = $objRecordSet->Fields('userAccountControl')->Value;
                $strpwdLS = sprintf($objRecordSet->Fields('pwdLastSet')->Value);
                @arrSplitResponse = split(/,/, $strDN);
                $strLName = substr($arrSplitResponse[0],3);
                if ($strLName =~ m/\\$/) {
                    $strLName = substr($strLName,0,-1);
                }
                $strFName = $arrSplitResponse[1];
                if ($strFName =~ m/OU=/) {
                    $strUserType = $strFName;
                    $strFName = "";
                    $strUserType = substr($strUserType,3);
                } else {
                    $strUserType = substr($arrSplitResponse[2],3);
                    }
                if ($strAcctControl == 512) {
                    $strAcctControl = "Active";
                } else {
                    $strAcctControl = "Disabled";
                }
            } else {
                print "No user found";
            }
            &debug("Match!: $line in $group\n");
            $csv->print_data(
                AccountName => $line,
                LastName => $strLName,
                FirstName => $strFName,
                SYSGenericAcct => $strUserType,
                AccessLevel => $group,
                AccessCapability => "User",
                Description => $desc,
                Status => $strAcctControl,
                LastPwdChange => $strpwdLS
            );
        } else {
            $group = $line;
            chomp($desc = <GROUPS>);
            chomp($group2 = <GROUPS>);
            &debug("$group\n$desc\n$group\n");
        }
    }

1 Ответ

1 голос
/ 20 марта 2012

Используйте Net :: Ldap для поиска на сервере AD.Это быстро и портативно.Можно искать сервер AD с других хостов, даже с Linux.Это быстрый и зрелый модуль.

Вы также можете выполнить некоторую отладку, используя Data :: Dumper.

use Data :: Dumper;... print Dumper ($ strpwdLS);

Я нашел эту тему: http://code.activestate.com/lists/pdk/3876/

# Calculate password age in days
my $PWage;
my $LastPW  = $item->{pwdLastSet};
my $fRef = ref ($LastPW);
my ($Hval, $Lval);
if ($fRef eq 'Win32::OLE' )
{
   $Hval = $LastPW->HighPart;
   $Lval = $LastPW->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;
   if ($uPval != 0)
   {
      $uPval -= 134774*86400;  #Adjust for perl time!
       my $EpochSeconds = time;
      $PWage = ($EpochSeconds - int($uPval))/(60*60*24) ;
      $PWage =~ s/\..*$//;
   }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...