Serveur d'impression

Audits du serveur d'impression (nombre d'impressions effectuées par personne par mois) – Serveur d’impression

Le 12 octobre 2019 - 14 minutes de lecture

Voici le code tel que je l’ai actuellement mis en place. D'après ce que je peux dire, tous les prérequis sont terminés et je veux que les fichiers CSV soient exportés vers le dossier D: Scripts tels que je les ai déjà en place. Le fichier .ps1 est situé dans D: Scripts

<#

GeneratePrintJobAccountingReports.ps1
ver. 2014-09-26-01

Ce script lit les journaux d'événements ID 307 et 805 dans le journal "Journaux des applications et des services> Microsoft> Windows> PrintService".
à partir du serveur spécifié et pour la période spécifiée, puis calcule les données du travail d'impression et du nombre total de pages à partir de ces données.

entrées du journal des événements.

Il écrit ensuite la sortie dans deux fichiers .CSV, l'un montrant les données des travaux d'impression par impression et l'autre, les données des travaux d'impression par utilisateur.

Le script dépend des données et du texte spécifiques du journal des événements dans les enregistrements 307 et 805 du journal des événements et a été testé uniquement sur

Windows Server 2008 R2 avec SP1.

Exigences:
– Assurez-vous que .NET Framework 3.5 ou version ultérieure est installé:
– Ajoutez ".NET Framework 3.5.1" sous l'option ".NET Framework 3.5.1 Features" à l'aide de l'option "Ajouter des fonctionnalités" du Gestionnaire de serveur, ou

– Tous les programmes> Accessoires> Windows PowerShell> cliquez avec le bouton droit de la souris sur Windows PowerShell> Exécuter en tant qu'administrateur …
Module d'importation ServerManager
Ajouter-WindowsFeature NET-Framework-Core
– Activer et configurer la journalisation des événements des travaux d'impression sur le serveur d'impression souhaité:
– démarrez Périphériques et imprimantes> (surlignez toutes les imprimantes)> Propriétés du serveur d'impression> Avancé
– cocher "Afficher les notifications d'information pour les imprimantes locales"
– cochez la case "Afficher les notifications d'information pour les imprimantes réseau"
– D'ACCORD
– démarrez l'Observateur d'événements> Journaux des applications et des services> Microsoft> Windows> PrintService

– cliquez avec le bouton droit de la souris sur Opérationnel> Activer le journal
– cliquez avec le bouton droit de la souris sur Opérationnel> Propriétés> Taille maximale du journal (Ko): 65536 (1028 Ko par défaut)
– D'ACCORD
– Assurez-vous que le compte d'utilisateur utilisé pour exécuter le script dispose d'une autorisation d'écriture sur le répertoire de destination qui contiendra le
fichiers de sortie .CSV ("D: Scripts " dans le code ci-dessous). Modifiez les chemins et les noms de fichiers .CSV dans le code ci-dessous, selon vos besoins.
– Si le serveur d'impression est un serveur distant, vérifiez que le compte d'utilisateur utilisé pour exécuter le script dispose d'un appel de procédure à distance.

accès réseau au nom d’hôte spécifié et que les règles de pare-feu autorisent un tel accès au réseau.
– Si le serveur d'impression enregistre les événements dans une langue autre que l'anglais, personnalisez la chaîne de recherche du message ID 805 ci-dessous.
pour correspondre à la chaîne appropriée à la langue utilisée dans le message du journal des événements ID 805 du serveur d'impression.

Usage:
– voir la fonction PrintCommandLineUsage ci-dessous

Codes de sortie:
– errorlevel 0 indique aucune erreur (des enregistrements ont été trouvés et générés, ou aucun enregistrement n'a été trouvé)
– errorlevel 1 indique une erreur (paramètres de ligne de commande imparables ou enregistrements de journal d'événements ID 805 manquants)

Notes d'implémentation:
– Cas d'une imprimante HP LaserJet P2055dn utilisant le pilote HP Universal Printing PCL 5 (v5.2)
L’imprimante enregistre 0 copie pour tous les travaux.
Si un script indiquant un nombre de copies égal à 0 est visualisé par le script, un avertissement est généré, puis le fichier affecté est considéré.

tâche d'impression à imprimer avec 1 copie pour deviner le nombre réel de copies.
Dans ce cas particulier, le correctif consistait à mettre à niveau le pilote d'imprimante vers le pilote HP Universal Printing PCL 5 (v5.5.0).
– Cas d’une imprimante couleur HP LaserJet Pro 400, modèle M451dn (CE957A), utilisant le pilote HP Universal Printing PCL 6 (v5.0.3),

le pilote HP Universal Printing PCL 5 (v5.2) et le pilote HP Universal Printing PS (v.5.0.3):
Dans tous les cas, cette imprimante enregistre 1 copie de tous les travaux dans l'ID d'événement 805, même lorsque l'utilisateur imprime plus d'une copie du travail.

Le script ne détecte aucun problème. Il a été découvert par observation.
Le correctif consistait à effacer le paramètre "Partage> Rendu des travaux d'impression sur les ordinateurs clients" des propriétés de l'imprimante ("activé" par défaut).

Avec cette modification, le nombre de copies par travail a été signalé avec précision dans le journal des événements Windows.
SUGGESTION: Consultez le fichier .CSV généré le premier mois et recherchez les imprimantes ne signalant qu'une seule copie de toutes les tâches. Celles-ci
les imprimantes peuvent avoir besoin de la solution de contournement pour être restituées côté serveur.

Histoire:
– 2010-02 Script original écrit par Sh_Con à
http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/007be664-1d8d-461c-9e0b-d8177106d4f8

– 2011-05 Modifié par BSOD2600 à
http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/007be664-1d8d-461c-9e0b-d8177106d4f8

– 2011-10 Modifié par Tim Miller Dyck de PeaceWorks Technology Solutions pour inclure le nombre de copies dans la comptabilisation de page par corrélation avec

ID d'événement 805, ajout des paramètres de nom d'hôte et de date du serveur d'impression cible, ajout du rapport de total des pages par utilisateur et du codage du commutateur à partir de
Unicode vers ASCII pour une meilleure compatibilité Excel .CSV.
Merci au Comité central mennonite du Canada d’avoir parrainé ce développement supplémentaire.
– 2012-09 Modifié par Tim Miller Dyck de PeaceWorks Technology Solutions pour inclure un avertissement concernant les travaux d'impression ne rapportant aucun exemplaire,

ajouter un avertissement concernant certains travaux d'impression rapportant de manière incorrecte une copie lorsque plusieurs copies ont été imprimées, ajoutez le numéro d'identification du travail d'impression

dans la sortie .CSV et remplacez les virgules dans le nom du travail d'impression par des soulignés pour une analyse plus fiable des fichiers .CSV avec certains clients.
– 2014-09 Modifié par Tim Miller Dyck de PeaceWorks Technology Solutions pour ajouter une journalisation des alertes et une robustesse supplémentaires dans de rares cas où
Les messages d'événement ID 805 sont enregistrés soit 0, soit plus d'une fois, pour le même travail d'impression; ajouter la gestion des caractères de nom de document non valide et PreviousDay

améliorations suggérées par les commentateurs à
http://gallery.technet.microsoft.com/scriptcenter/Script-to-generate-print-84bdcf69/view/Discussions#content

#>

#####
# exécuté en mode strict version 2 pour intercepter des variables initialisées et des propriétés / fonctions inexistantes

Set-StrictMode -version 2

#####
# définir les variables initiales

$ PrintJobCounter = 1 # compteur de sortie d'affichage de la console
$ PerUserTotalPagesRecords = @ # crée une table de hachage vide

#####
# déclarer des fonctions auxiliaires

# fonction pour imprimer les données d'utilisation sur la console
Fonction PrintCommandLineUsage
Write-Host "

Voici les paramètres du script:
(nom d'hôte) PreviousMonth – Récupère les données de travail d'impression de (nom d'hôte) en fonction de
tout le mois précédent.
ou
(nom d'hôte) PreviousDay – Récupère les données de travail d'impression de (nom d'hôte) en fonction de
toute la journée précédente.
ou
(hostname) (startdate) (enddate) – Récupère les données de travail d'impression de (hostname)
basé sur le début et la fin spécifiés
Rendez-vous. La date doit être spécifiée
 dans un
format qui correspond au système actuel

locale (par exemple, MM / jj / aaaa pour United
 États).

Exemples:
powershell.exe -commande `". GeneratePrintJobAccountingReports.ps1 localhost PreviousMonth` "
powershell.exe – commande `". GeneratePrintJobAccountingReports.ps1 printserver.domain.local 08/01/2014 08/02 / 2014` "

"

#####
# analyser les paramètres de ligne de commande

switch ($ args.count)
($ _ -eq 2) -or ($ __eq 3)
# s'il y a deux ou trois paramètres, le premier paramètre est le nom d'hôte du serveur d'impression à partir duquel les journaux des événements seront extraits
$ PrintServerName = $ args[0]

Write-Host "Nom d'hôte du serveur d'impression à interroger:" $ PrintServerName

2
# s'il y a exactement deux paramètres, vérifiez que le second est "PreviousMonth" ou "PreviousDay" (en utilisant la comparaison par défaut sans distinction de casse)
si ($ args[1].CompareTo ("PreviousMonth") -eq 0)
# l'heure de début est au début (00:00:00) du premier jour du mois précédent
$ StartDate = (Get-Date-Day 1 -Hour 0 -Minute 0 -Second 0) .AddMonths (-1)
# l'heure de fin est à la fin (23:59:59) du dernier jour du mois précédent
$ EndDate = (Get-Date – Jour 1 – Heure 0 – Minute 0 – Seconde 0) – (New-Timespan – Seconde 1)

elseif ($ args[1].CompareTo ("PreviousDay") -eq 0)
# l'heure de début est au début (00:00:00) du jour précédent
$ StartDate = (Get-Date -Hour 0 -Minute 0 -Second 0) .AddDays (-1)
# l'heure de fin est à la fin (23:59:59) du jour précédent
$ EndDate = (Get-Date -Hour 23 – Minute 59 – Seconde 59) .AddDays (-1)

autre
# il y avait un paramètre de ligne de commande non reconnu, donc imprimez les données d'utilisation et quittez avec errorlevel 1
Write-Host "` nERROR: Deux paramètres de ligne de commande ont été détectés, mais le deuxième paramètre de ligne de commande n'était pas `" PreviousMonth` "ou` "PreviousDay`". "
PrintCommandLineUsage
Sortie 1

3
# s'il y a exactement trois paramètres, vérifiez que les deuxième et troisième sont des dates
# définit la gestion des erreurs pour continuer silencieusement car les erreurs sont vérifiées explicitement
$ ErrorActionPreference = "SilentlyContinue"
# l'heure de début est au début de la date indiquée (12:00:00 AM)
$ StartDate = Get-Date -Date $ args[1]

# vérifie si le paramètre de ligne de commande a été reconnu comme une date valide
si (! $?)
# il y avait un paramètre de ligne de commande non reconnu, donc imprimez les données d'utilisation et quittez avec errorlevel 1
Write-Host "` nERROR: Trois paramètres de ligne de commande ont été détectés, mais le deuxième paramètre de ligne de commande n'était pas une date valide. "
PrintCommandLineUsage
Sortie 1

# l'heure de fin est à la fin de la date indiquée (23:59:59) – ajoutez un jour puis soustrayez une seconde
$ EndDate = (Get-Date -Date $ args[2]) + (New-Timespan – Jour 1) – (New-Timespan – Deuxième 1)
# vérifie si le paramètre de ligne de commande a été reconnu comme une date valide
si (! $?)
# il y avait un paramètre de ligne de commande non reconnu, donc imprimez les données d'utilisation et quittez avec errorlevel 1
Write-Host "` nERROR: Trois paramètres de ligne de commande ont été détectés, mais le troisième paramètre de ligne de commande n'était pas une date valide. "
PrintCommandLineUsage
Sortie 1

# redéfinit le traitement des erreurs par défaut
$ ErrorActionPreference = "Continuer"

défaut
# il n'y a pas ou trop de paramètres de ligne de commande présents, donc imprimez les données d'utilisation et quittez avec errorlevel 1
Write-Host "` nERROR: Aucun ou trop de paramètres de ligne de commande n'ont été détectés. "
PrintCommandLineUsage
Sortie 1

#####
# définir les noms de fichiers de sortie .CSV

$ OutputFilenameByPrintJob = "D: Scripts Rapport de comptabilisation des travaux d'impression par travail d'impression pour l'hôte du serveur d'impression" + $ PrintServerName + "-" + $ StartDate.ToString ("aaaa-MM-jj") + "à" + $ EndDate. ToString ("aaaa-MM-jj")
 + ".csv" # entrez le nom du fichier de sortie souhaité
$ OutputFilenameByUser = "D: Scripts Rapport de comptabilisation des travaux d'impression par utilisateur pour l'hôte du serveur d'impression" + $ PrintServerName + "-" + $ StartDate.ToString ("aaaa-MM-jj") + "à" + $ EndDate.ToString ("aaaa-MM-jj")
 + ".csv" # entrez le nom du fichier de sortie souhaité

#####
# obtenir les entrées du journal des événements ID 307 et 805

# afficher le message d'état
Write-Host "La collecte des journaux d'événements trouvés dans l'intervalle de temps spécifié va de $ StartDate à $ EndDate."

# les entrées de travail d'impression principales sont l'ID d'événement 307 (utilisez "-ErrorAction SilentlyContinue" pour gérer le cas où aucun message du journal des événements n'a été trouvé).
$ PrintEntries = Get-WinEvent -ErrorAction SilentlyContinue-ComputerName $ PrintServerName -FilterHashTable @ ProviderName = "Microsoft-Windows-PrintService"; StartTime = $ StartDate; EndTime = $ EndDate; ID = 307
# le nombre de copies correspondant au travail est dans l'ID d'événement 805 (utilisez "-ErrorAction SilentlyContinue" pour traiter le cas où aucun message du journal des événements n'a été trouvé)
$ PrintEntriesNumberofCopies = Get-WinEvent -ErrorAction SilentlyContinue -ComputerName $ PrintServerName -FilterHashTable @ ProviderName = "Microsoft-Windows-PrintService"; StartTime = $ StartDate; EndTime = $ EndDate; ID = 805

# vérifier les données trouvées; si aucun enregistrement ID de journal des événements 307 n'a été trouvé, quittez le script sans créer de fichier de sortie (il ne s'agit pas d'une condition d'erreur)
si (! $ PrintEntries)
Write-Host "Aucun ID d'événement de travail d'impression 307 entrées trouvées dans la plage de temps spécifiée va de $ StartDate à $ EndDate. Script de sortie."
Sortie

# sinon, affiche le nombre d'enregistrements trouvés et continue
# Measure-Object est nécessaire pour gérer le cas où exactement une entrée de journal d'événements est renvoyée.
Write-Host "Nombre d'ID d'événement de travail d'impression 307 entrées trouvées:" ($ PrintEntries | Measure-Object) .Count
Write-Host "Nombre d'ID d'événement de travail d'impression 805 entrées trouvées:" ($ PrintEntriesNumberofCopies | Measure-Object) .Count

# afficher le message d'état
Write-Host "Analyse les entrées du journal des événements et écrit les données dans le fichier de sortie .CSV du travail d'impression auxiliaire` "$ OutputFilenameByPrintJob`" … "

# écrit l'en-tête initial dans le fichier de sortie du job
Write-Output "Date, ID du travail d'impression, nom d'utilisateur, nom complet, nom de l'ordinateur client, nom de l'imprimante, nom du document, taille du travail d'impression en octets, nombre de pages pour une copie, nombre de copies, nombre total de pages" | Out-File -FilePath $ OutputFilenameByPrintJob -Encoding ASCII

#####
# boucle pour analyser les entrées du journal des événements ID 307

ForEach ($ PrintEntry in $ PrintEntries) Out-File -FilePath $ OutputFilenameByPrintJob -Encoding ASCII -Append

# mettre à jour le nombre total de pages du travail de l'utilisateur
$ UserNameKey = "` "$ UserName ($ ADName)` ""
# si l'utilisateur n'est pas encore dans la table de hachage, ajoutez-les et leur nombre total de pages initial
if (! $ PerUserTotalPagesRecords.ContainsKey ($ UserNameKey))
$ PerUserTotalPagesRecords.Add ($ UserNameKey, $ TotalPages)

# si l'utilisateur est déjà dans la table de hachage, met à jour le nombre total de pages
autre
$ PerUserTotalPagesRecords.Set_Item ($ UserNameKey, $ PerUserTotalPagesRecords.Get_Item ($ UserNameKey) + $ TotalPages)

# afficher le message d'état
Write-Host "Traitement du travail d'impression $ PrintJobCounter (ID du travail $ PrintJobId imprimé à $ StartDate_Time)."
$ PrintJobCounter ++

#####
# faire la comptabilité de travail par utilisateur

# afficher le message d'état
Write-Host "Écriture de données dans le fichier de sortie .CSV par utilisateur` "$ OutputFilenameByUser`" … "

# écrit l'en-tête initial dans le fichier de sortie par utilisateur
Write-Output "Nom d'utilisateur (Nom complet), Nombre total de pages" | Out-File -FilePath $ OutputFilenameByUser -Encoding ASCII

# écrit la sortie dans le fichier de sortie par utilisateur dans un ordre trié alphabétiquement par nom d'utilisateur
ForEach ($ PerUserTotalPagesRecordsKey in ($ PerUserTotalPagesRecords.Keys | sort)) Out-File -FilePath $ OutputFilenameByUser -Encoding ASCII -Append

#####
# quitter

Write-Host "Terminé."

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.