After a little digging, I came up with a way to track that information without having to walk to every printer. To be honest, I had a lot of ideas but I eventually found a Windows event log that that gave me everything I needed. The event log is called Microsoft-Windows-PrintService/Operational. You first need to enable the log but it collects a lot of good details.
$log = Get-WinEvent -FilterHashTable @{ "LogName"= "Microsoft-Windows-PrintService/Operational";"ID"="307"}
Once we pull all of the events, it they will be easy enough to parse with RegEx. Through this together quite quickly but it gets the job done. I have only tested this message format on Server 2012R2.
Once I parse out the values I need, I package it back into an object. From there you can do whatever you need to do with it.
*RegEx excluded from the post because I can't get it to render correctly in blogger without a lot of rework. See script at the end.
$log | ?{$_.message -match $MessageRegEx} | %{ New-Object PSObject -property @{"Document"=$Matches.Document; "UserName"=$Matches.Username; "IP"=$Matches.IP; "ComputerName"=$Matches.Computer; "Pages"=$Matches.Pages; "TimeStamp"= $_.TimeCreated; "Printer" = $Matches.Printer; "PrintHost" = $_.MachineName }}
Then write that out to a CSV file when you are done. If you take a look at the values that I can parse out of it, I get a lot more information that I expected. Not only can you get page counts per printer, you can track printed page counts back to individual users. I pull this dataset into Excel and transform it into a pivot table for easy reporting.
After I clean this up a bit, here is my resulting CmdLet: Get-PrintHistory
No comments:
Post a Comment