# encoding: ascii
# api: powershell
# title: New-PrintJob
# description: This script works in conjunction with an Event Trigger on the PrintService event on our print servers. This script queries the Microsoft-Windows-PrintService/Operational log for EventID 307, and returns the drive letter from the most recent event.         
# version: 3.5
# type: script
# author: Jeff Patton
# license: CC0
# x-poshcode-id: 2916
# x-archived: 2016-08-20T20:26:32
# x-published: 2011-08-17T15:01:00
#
# This should be the same event that triggered this script to run in the first place.        
# It appends to a CSV log file if it exists, or creates a new file if it doesn’t.
#
<#
    .SYNOPSIS
        Log a print job to a file.
    .DESCRIPTION
        This script works in conjunction with an Event Trigger on the PrintService
        event on our print servers. This script queries the Microsoft-Windows-PrintService/Operational
        log for EventID 307, and returns the drive letter from the most recent event. 
        
        This should be the same event that triggered this script to
        run in the first place.
        
        It appends to a CSV log file if it exists, or creates a new file if it doesn't.
    .PARAMETER FileName
        The fully qualified path and filename for the report.
    .EXAMPLE
        .\New-PrintJob.ps1
        
        Description
        -----------
        This is the only syntax for this script.
    .NOTES
        ScriptName: New-PrintJob.ps1
        Created By: Jeff Patton
        Date Coded: August 17, 2011
        ScriptName is used to register events for this script
        LogName is used to determine which classic log to write to
        Microsoft .NET Framework 3.5 or greater is required.
    .LINK
        http://scripts.patton-tech.com/wiki/PowerShell/Production/New-PrintJob
#>
Param
    (
        $FileName = "PrintLog-$((get-date -format "yyyMMdd")).csv"
    )
Begin
    {
        $ScriptName = $MyInvocation.MyCommand.ToString()
        $LogName = "Microsoft-Windows-PrintService/Operational"
        $ScriptPath = $MyInvocation.MyCommand.Path
        $Username = $env:USERDOMAIN + "\" + $env:USERNAME
        $ErrorActionPreference = "Stop"
        
        New-EventLog -Source $ScriptName -LogName $LogName -ErrorAction SilentlyContinue

        $Message = "Script: " + $ScriptPath + "`nScript User: " + $Username + "`nStarted: " + (Get-Date).toString()
        Write-EventLog -LogName $LogName -Source $ScriptName -EventID "100" -EntryType "Information" -Message $Message 

        #	Dotsource in the functions you need.
    }
Process
    {
        Try
        {
            $Event307 = Get-WinEvent -LogName $LogName |Where-Object {$_.id -eq 307}
            }
        Catch
        {
            Write-Warning "This script requires Microsoft .NET Framework version 3.5 or greater"
            Break
            }
            
        if ($Event307.Count -eq $null)
        {
            $PrintJob = $Event307
            }
        else
        {
            $PrintJob = $Event307[0]
            }

        $Client = $PrintJob.Properties[3].Value
        if($Client.IndexOf("\\") -gt -1)
        {
            $Lookup = "nslookup $($Client.Substring(2,($Client.Length)-2)) |Select-String 'Name:'"
            }
        else
        {
            $Lookup = "nslookup $($Client) |Select-String 'Name:'"
            }
        
        Try
        {
            [string]$Return = Invoke-Expression $Lookup
            $Client = $Return.Substring($Return.IndexOf(" "),(($Return.Length) - $Return.IndexOf(" "))).Trim()
            }
        Catch
        {
            $Client = $PrintJob.Properties[3].Value
            }
            
        $PrintLog = New-Object -TypeName PSObject -Property @{
            Time = $PrintJob.TimeCreated
            Job = $PrintJob.Properties[0].Value
            Document = $PrintJob.Properties[1].Value
            User = $PrintJob.Properties[2].Value
            Client = $Client
            Printer = $PrintJob.Properties[4].Value
            Port = $PrintJob.Properties[5].Value
            Size = $PrintJob.Properties[6].Value
            Pages = $PrintJob.Properties[7].Value
            }        
        $PrintLog = ConvertTo-Csv -InputObject $PrintLog -NoTypeInformation
    }
End
    {
        $Message = "Script: " + $ScriptPath + "`nScript User: " + $Username + "`nFinished: " + (Get-Date).toString()
        Write-EventLog -LogName $LogName -Source $ScriptName -EventID "100" -EntryType "Information" -Message $Message
        if ((Test-Path -Path "P:\PrintLogs\$($FileName)") -eq $true)
        {
            $PrintLog |Select-Object -Skip 1 |Out-File -FilePath $FileName -Append
            }
        else
        {
            $PrintLog |Out-File -FilePath $FileName
            }
    }
