Aquí explico como contar impresiones realizadas a través de impresoras controladas por un Windows 2003 Server con perl.
PSLOGLIST
Primero es necesario extraer del visor de sucesos, los sucesos de impresión hacia un archivo de texto. Esto lo conseguimos usando el programa psloglist, de las pstools. Por ejemplo, para sacar las impresiones de Julio:
3568|System|Print|INFORMATION|SERVER|31/07/2012 23:53:49|10|USER|"El documento 199, que pertenece a USER se imprimió en IMPRESORA por el puerto IP_10.0.0.11. Tamaño en bytes: 74249; páginas impresas: 1 "
PERL
Una vez tenemos el archivo en texto con los campos delimitados por el carácter '|' solo hace falta pasarlo por un script en perl que contabilice por Impresora-usuario:
con lo que obtenemos un resultado del estilo:
PSLOGLIST
Primero es necesario extraer del visor de sucesos, los sucesos de impresión hacia un archivo de texto. Esto lo conseguimos usando el programa psloglist, de las pstools. Por ejemplo, para sacar las impresiones de Julio:
psloglist -o Print -s -t "|" -a 06/30/12 -b 08/01/12 system > Julio.txtSi miramos el contenido del archivo vemos que las líneas son del estilo:
3568|System|Print|INFORMATION|SERVER|31/07/2012 23:53:49|10|USER|"El documento 199, que pertenece a USER se imprimió en IMPRESORA por el puerto IP_10.0.0.11. Tamaño en bytes: 74249; páginas impresas: 1 "
PERL
Una vez tenemos el archivo en texto con los campos delimitados por el carácter '|' solo hace falta pasarlo por un script en perl que contabilice por Impresora-usuario:
cat Julio.txt | grep impresas | ./counter.pl
donde counter.pl:
#!/usr/bin/env perl use strict; use warnings; # resultado my %printings; while (<STDIN>) { chomp; (undef,undef,undef,my $tipo,undef,undef,undef, my $user, my $rest) = split(/\|/,$_,9);
unless (($tipo =~ /WARNING/) || ($rest=~/eliminado/) || ($user =~ /SYSTEM/)) {
(my $printer) = ($rest =~ /en\ (\S*)\ por/); ($user, undef) = split(/\\/, $user,2); #cogemos el n. de impresiones my $ltotal = length $rest; my $imp_idx = index ($rest, "impresas:") + 10; my $imp = substr $rest, $imp_idx, $ltotal-$imp_idx-3; #hash de hashes if (exists $printings{"$printer"}{"$user"}) { $printings{"$printer"}{"$user"} += $imp; } else { $printings{"$printer"}{"$user"} = $imp; }
} } #imprimir el resultado foreach my $elem (sort keys %printings) { #Impresora (+ subrallar) print "$elem\n"; for (my $i=0; $i < length $elem; $i++) { print "-"; } print "\n"; #impresiones de cada usuario en la impresora foreach my $user (sort keys %{ $printings{$elem} }) { print "$user - $printings{$elem}{$user} \n"; } print "\n"; }
con lo que obtenemos un resultado del estilo:
Impresora 0 ----------- user3 - 102 user1 - 1298 Impresora 1 ----------- user1 - 27 user2 - 17
Comentarios