in reply to Re: Re: Problem with ascertaining last NT logon - Roth script
in thread Problem with ascertaining last NT logon - Roth script

Ok, here comes the code... Give this a try. See if this gives you what you expect:
foreach my $Machine ( @MachineList ) { ( $Machine = "\\\\$Machine" ) =~ s/^\\+/\\\\/; print "Querying $Machine\n"; foreach my $Account ( sort keys %AccountList ) { my %Attrib; if( Win32::AdminMisc::UserGetMiscAttributes( $Machine, $Account, \%Attrib ) ) { my $Data = $Result{$Machine}{$Account} = {}; $Data->{fullname} = $Attrib{USER_FULL_NAME}; if( $Data->{lastlogon}->{value} < $Attrib{USER_LAST_LOGON} ) { $Data->{lastlogon}->{value} = $Attrib{USER_LAST_LOGON}; $Data->{lastlogon}->{machine} = $Machine; } if( $Data->{lastlogoff}->{value} < $Attrib{USER_LAST_LOGOFF} ) { $Data->{lastlogoff}->{value} = $Attrib{USER_LAST_LOGOFF}; $Data->{lastlogoff}->{machine} = $Machine; } $Data->{badpwcount} += $Attrib{USER_BAD_PW_COUNT}; $Data->{logons} += $Attrib{USER_NUM_LOGONS}; } } } foreach my $Machine ( sort keys %Result ) { my $MachineInfo = $Results{$Machine}; foreach my $Account ( sort keys %{$MachineInfo} ) { print "$Account ($MachineInfo->{$Account}{fullname}):\n"; print Report( "Last logon", $MachineInfo->{$Account}{lastlogon +} ), "\n"; print Report( "Last logoff", $MachineInfo->{$Account}{lastlogo +ff} ), "\n"; print "\tTotal number of bad password attempts: "; print "$MachineInfo->{$Account}{badpwcount}\n"; print "\tTotal number of logons: $MachineInfo->{$Account}{logo +ns}\n"; print "\n"; } } sub Report { my( $Field, $Data ) = @_; my $Date = scalar localtime($Data->{value} ); my $Location = "( $Data->{machine} )"; $Date = "Not available" if( 0 == $Data->{value} ); $Location = "" if( 0 == $Data->{value} ); return( "\t$Field: $Date $Location" ); }

Replies are listed 'Best First'.
Re: Re: Re: Re: Problem with ascertaining last NT logon - Roth script
by billie_t (Sexton) on Feb 17, 2004 at 08:22 UTC
    That's great! -other than what I presume was a typo,
    foreach my $Machine ( sort keys %Result ) { my $MachineInfo = $Results{$Machine}; foreach my $Account ( sort keys %{$MachineInfo} )
    should be my $MachineInfo = $Result{Machine}??

    The output now produces an entry for each machine in the list. All I have to do now is compare the two entries and get it to spit out the last value in each field from all servers, but I can do that with what you've given me.

    Thanks!

      No, it's not a typo. :-)

      $Machine is a variable that gets populated with a different key from the hash (in sorted order) for each iteration of the outer for loop.

        It would continually return the same value if you used a literal like Machine instead of $Machine.

        It is very rare that a programmer would hardcode hash values like that. There are uses for it (mainly learning about hashes), but typically its done by reading data from another source to populate a hash for a (sometimes predefined) set of keys.

        Running the command: perldoc perldata from your command_line/terminal should help you get more acquainted with hashes. Also just write some test hash scripts to learn more about the behavior of hashes. You'll always learn more by writing test scripts, and experiencing the behavior first hand.


        Grygonos