PowerShell

Auswertung von Active Directory Printer Queues mit PowerShell

Auswertung von Active Directory Printer Queues mit PowerShell

Durch die einfache Möglichkeit Windows Eventlogs mit PowerShell abzufragen erhält man ein gutes Instrument diese auch auszuwerten. Hierdurch ist es beispielsweise möglich Statistiken über durchgeführte Druckaufträge zu erhalten.

Letzten Endes werden mittels den hier aufgeführten Befehlen die Eventlogeinträge aus dem Log Microsoft-Windows-PrintService/Operational eingelesen, interpretiert und in einer CSV-Datei abgespeichert. Zu beachten ist zum einen, dass standardmässig die Loggrösse dieses Logs auf 1 MB festgelegt ist und zum anderen, dass das Logging der Druck Events erst aktiviert werden muss. Es macht also Sinn die maximale Grösse dieses Logs auf die jeweiligen Bedürfnisse anzupassen. Um die beiden Einstellungen vorzunehmen, muss ein Rechtsklick im Eventviewer auf diesem Log durchgeführt werden und anschliessend Enable logging angewählt und maximum eventlog size (KB) auf die jeweiligen Anforderungen eingestellt werden. Als Beispielsystem dient uns hier ein Server 2012 mit der Print Services Rolle.

Print_Log_Reader_01

Die Logeinträge die uns in diesem Artikel beschäftigen werden, haben die Event ID 307.

Print_Log_Reader_02

Die eigentliche Abfrage des Eventlogs kann mit folgendem Befehl durchgeführt werden:

</pre>
$PrinterLog = "Microsoft-Windows-PrintService/Operational"

$PrintEvents = Get-WinEvent -FilterHashtable @{LogName="$PrinterLog";ID=307}

Eine zeitliche Eingrenzung dieser Abfrage ist mit folgenden Befehlen zu erreichen:

</pre>
$LastMonth = (Get-Date).AddMonths(-1)

$StartDate = Get-Date $LastMonth -day 1 -hour 0 -minute 0 -second 0

$EndDate = (($StartDate).AddMonths(1).AddSeconds(-1))

$PrintEvents = Get-WinEvent -FilterHashtable @{LogName="$PrinterLog";ID=307;StartTime=$StartDate;EndTime=$EndDate}

In diesem Beispiel ist der Betrachtungszeitraum immer der vorangegangene Monat. Man könnte dies verwenden, in dem man einen Task auf dem Print Server einrichtet, welcher immer am Ersten eines jeden Monats ausgeführt wird. Hiermit könnten dann Druckaufträge des vorangegangen Monats ausgewertet werden.

Die Werte eines jeweiligen Logeintrages sind zwar begrenzt, geben aber Aufschluss über folgende Eigenschaften:

  • Name des gedruckten Dokumentes
  • Besitzer des Dokuments
  • Gerät über welches gedruckt wurde
  • Verwendeter Drucker und Port
  • Grösse des Druckauftrages
  • Anzahl gedruckter Seiten
  • Zeitstempel

In diesem Beispiel verzichten wir aus Gründen des Datenschutzes auf den Namen des gedruckten Dokumentes (Z.B. Kündigung_User1).

Folgendes Skript beinhaltet die oben erwähnten Schritte und zeigt auf, wie die einzelnen Logeinträge in eine CSV-Datei geschrieben werden können:

###################################################################

# Script Name: AuditPrinterLog.ps1                                #

# Company: POHN IT-Consulting GmbH                                #

# Author: Alexander Wolfeil                                       #

# Date: 22.09.2014                                                #

# Version: V0.1                                                   #

###################################################################

<#

.SYNOPSIS

.DESCRIPTION

.PARAMETER

.INPUTS

.OUTPUTS

.EXAMPLE

.LINK

#>

### Modules #######################################################

### Variables #####################################################

$PrinterLog = "Microsoft-Windows-PrintService/Operational"

$LastMonth = (Get-Date).AddMonths(0)

$StartDate = Get-Date $LastMonth -day 1 -hour 0 -minute 0 -second 0

$EndDate = (($StartDate).AddMonths(1).AddSeconds(-1))

$CSVHeader = """TimeStamp"";""Owner"";""Printer"";""Computer"";""Pages"""

$OutputFileName = "PrinterAuditLog{0:yyyyMM}.csv" -f (Get-Date)

$DestinationFolder = "C:\Script\PrinterAuditLogs"

$FileDestination = $DestinationFolder + "\" + $OutputFileName

### Functions #####################################################

### Do Work #######################################################

# Check if destination folder exists

if(!(Test-Path $DestinationFolder))

{

New-Item -ItemType directory -Path $DestinationFolder | Out-Null

}

# Create .csv file with header

$CSVHeader | Out-File -FilePath $FileDestination

# Get print server events with print job details (Event ID 307) from last months

$PrintEvents = Get-WinEvent -FilterHashtable @{LogName="$PrinterLog";ID=307;StartTime=$StartDate;EndTime=$EndDate}

# Go through events and write those to a .csv file

ForEach($event in $PrintEvents)

{

# Get Event details

$TimeStamp = ($event.TimeCreated).ToString()

$Owner = $event.Properties.Value[2]

$Printer = $event.Properties.Value[4]

$Computer = $event.Properties.Value[3]

$Pages = $event.Properties.Value[7]

$line = """" + $TimeStamp + """;""" + $Owner + """;""" + $Printer + """;""" + $Computer + """;""" + $Pages + """"

$line | Out-File -FilePath $FileDestination -Append -Encoding UTF8

}

Wenn man das Skript ausführt, erhält man eine Ergebnisdatei im Ordner C:\Script\PrinterAuditLogs mit dem Namen PrinterAuditLog mit einem Datumszusatz. Öffnet man nun die Ergebnisdatei mit Excel, sollte man ein ähnliches Ergebnis wie dieses erhalten:

Print_Log_Reader_03

Mithilfe dieser Liste könnten im Anschluss beispielsweise Druckaufträge pro User pro Monat, Druckaufträge pro Drucker pro Monat oder etwa Gesamtzahl der gedruckten Seiten pro Monat ausgewertet werden.

One thought on “Auswertung von Active Directory Printer Queues mit PowerShell
  1. Andreas says:

    Ich erhlate mit dem Skript eine Tabelle mit lauter chinesischen Schriftzeichen!?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.