2012-03-19 21 views
1

PerlでLDAPに接続し、値を取り出してCSVファイルに投稿するスクリプトを作成しました。最初の2つの結果を正しく取り込み、解析してCSVファイルに書き込むことができますが、pwdLastSetはWIN32 :: OLE = HASH(0x。)を返しています。 ......)。私は疲れのsprintf、六角()を持っており、結果は私が18桁の長さで何かを期待していWIN32値または0のいずれかです。助けてくれてありがとう。atimeからLDAPへPerlへの変換

#!/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"); 
     } 
    } 
+0

出力はそれは、Win32 :: OLE型のオブジェクトの意味します。適切なメソッドを呼び出す必要があります。しかし、どうしてNet :: LDAP(http://search.cpan.org/~marschap/perl-ldap-0.44/lib/Net/LDAP.pod)のようなものを使っていないのですか?私はあなたがそれが簡単になるだろうと思うだろうと思う。 – Cfreak

+0

'printスカラーとは何か?Win32 :: OLE-> QueryObjectType($ strpwdLS);' print? – cjm

答えて

0

使用Net :: Ldapは、ADサーバーを検索するために高速で移植性があります.Linuxからでも、他のホストからADサーバーを検索することができます。 、Data :: Dumperを使用して。

使用Data :: 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/\..*$//; 
    } 
} 
+0

そのスクリプトは何らかの理由で私のSELECT文がWin32 :: OLEエラーを引き起こしているのを助けません。私はif文を入力する前に値を表示するので、私は知っています。ハイパーパーツと - >ローパートは定義されていないので、これを行う必要があるかもしれません。このリンクにはそれ以上の説明はありません。私はNet :: Ldapも探しています。 – cquadrini

+0

NET :: LDAPを使用して終了し、スクリプトを改善しています。それはより多くの問題を作り出しました。それは私にPerlをもっと学ばせる必要があったので、良いことです。 – cquadrini

+0

私は上記のスクリプトを使用すると、Ifステートメント if(($ hRef eq Win32 :: OLE)を入力しません。 – cquadrini

関連する問題