Serveur d'impression

Comment savoir quels utilisateurs sont connectés à une file d'attente d'impression? – Serveur d’impression

Le 28 février 2020 - 6 minutes de lecture

Avatar

Hé, le scripteur! Question

Hé, le scripteur! Comment savoir quels utilisateurs sont connectés à une file d'attente d'impression?

– RE

Entretoise Hé, le scripteur! Répondre Script Center

Hé, RE. Vous savez, si vos imprimantes ressemblent à celles avec lesquelles les Scripting Guys ont l'habitude de travailler, il est facile de dire quels utilisateurs sont connectés à une file d'attente d'impression: tout ce que vous avez à faire est d'entrer dans la salle d'impression et de voir qui s'y trouve frénétiquement regarder dans tous les coins et recoins pour le document que l'imprimante insiste il a imprimé. Chez Microsoft, le bureau sans papier est très proche d'une réalité. Non pas parce que nous avons consciemment décidé d'économiser du papier, mais parce que vous avez généralement plus de chances de remporter le jackpot à Las Vegas que d'obtenir un document à imprimer.

Si vous avez des imprimantes un peu plus fiables que cela, cependant, vous trouverez peut-être plus facile d'utiliser un script pour déterminer quels utilisateurs impriment actuellement sur une imprimante particulière. Il y a un peu d'astuce à faire, et vous devez utiliser une approche légèrement différente pour effectuer cette tâche sur n'importe quelle version de Windows antérieure à Windows XP. Mais nous expliquerons tout cela dans un instant. Pour l'instant, examinons un script qui fonctionne sous Windows XP et Windows Server 2003:

strComputer = "."
Définissez objWMIService = GetObject ("winmgmts: \" & strComputer & " root cimv2")

Définissez colPrintJobs = objWMIService.ExecQuery _
(«Sélectionnez * à partir de Win32_PrintJob où le nom comme«% FinancePrinter% »»)

Pour chaque objPrintJob dans colPrintJobs
Wscript.Echo objPrintJob.Owner
Prochain

Comme vous pouvez le voir, le script n’a pas grand-chose. Il commence par se connecter au service WMI sur l'ordinateur local (bien que le script puisse tout aussi bien s'exécuter sur une machine distante). Voici où cela devient un peu délicat.

En fait, la classe WMI Win32_PrintJob peut renvoyer le nom de connexion de tous les utilisateurs qui impriment actuellement tout les imprimantes connectées à un ordinateur. Curieusement, cependant, Win32_PrintJob n'a pas de classe qui identifie lequel file d'attente d'impression à laquelle un utilisateur est connecté. Au mieux, vous pouvez identifier l'imprimante à l'aide du Nom propriété. Les valeurs de cette propriété sont composées de deux éléments: le nom de l'imprimante et un ID de tâche d'impression. Par exemple, les travaux d'impression actuellement dans la file d'attente de l'imprimante FinancePrinter peuvent ressembler à ceci:

FinancePrinter, 1
FinancePrinter, 2
FinancePrinter, 3

Est-ce un problème? Oui, ça l'est; après tout, cela nous empêche d'utiliser une requête comme celle-ci pour renvoyer tous les travaux d'impression dans la file d'attente d'impression FinancePrinter:

Définissez colPrintJobs = objWMIService.ExecQuery _
(«Sélectionnez * à partir de Win32_PrintJob où nom =« FinancePrinter »»)

Pourquoi ne pouvons-nous pas utiliser cette requête? Eh bien, parce qu'il n'y aura pas être tout travail d'impression avec Name FinancePrinter; au lieu de cela, tous les travaux d'impression seront nommés des choses comme FinancePrinter, 1. Comme… délicieux….

Mais ça va; comme d'habitude, nous pouvons contourner les particularités de WMI. Sur Windows XP et Windows Server 2003, nous pouvons utiliser l'opérateur LIKE et une requête générique, qui ressemble à ceci:

Définissez colPrintJobs = objWMIService.ExecQuery _
(«Sélectionnez * à partir de Win32_PrintJob où le nom comme«% FinancePrinter% »»)

Notez la construction de notre clause Where: Où nom comme «% FinancePrinter%». Les signes de pourcentage sont nos caractères génériques: ils signifient n'importe quel caractère ou ensemble de caractères, de la même manière que l'astérisque lorsqu'il est utilisé avec la commande dir. La commande dir *. * signifie: "Montrez-moi tous les fichiers et dossiers dont les noms commencent par n'importe quel caractère ou ensemble de caractères, comportent un point, puis se terminent par n'importe quel caractère ou ensemble de caractères." Notre requête WQL peut être lue de la même manière: «Ramenez tous les travaux d'impression où la propriété Name commence par n'importe quel caractère ou ensemble de caractères, a le terme FinancePrinter en elle, puis se termine par n'importe quel caractère ou ensemble de caractères ". (Et, oui, «n'importe quel caractère ou ensemble de caractères» signifie également aucun caractère du tout.) En d'autres termes, ramenez tout travail d'impression dont le nom inclut la chaîne FinancePrinter.

À ce stade, tout ce que nous avons à faire est de configurer une boucle For Each et de parcourir la collection de travaux d'impression, en faisant écho à la valeur de la Propriétaire propriété pour chacun. La propriété Owner est le nom de connexion de l'utilisateur connecté; par exemple, kmyer ou packerman. C’est le mieux que vous puissiez faire avec Win32_PrintJob; si vous avez besoin, par exemple, du nom et du prénom de l'utilisateur, vous devrez faire autre chose. (Une suggestion: prenez le nom de connexion [also known as the sAMAccountName] et l'utiliser dans une recherche Active Directory qui peut renvoyer le prénom et le nom de l'utilisateur. Pour plus d'informations, consultez le Contes du script colonne Mec, où est mon imprimante?)

Maintenant, tout va bien sous Windows XP et Windows Server 2003; malheureusement, ce script ne fera pas grand-chose pour quiconque exécute une version antérieure de Windows. En effet, l'opérateur LIKE n'est pas disponible sur les versions antérieures de Windows. Cela ne signifie pas que vous n'avez pas de chance, cela signifie simplement que nous devons faire les choses à l'ancienne. Par exemple, au lieu d'écrire une requête qui renvoie uniquement les travaux d'impression en cours d'impression vers FinancePrinter, nous devons écrire une requête qui renvoie tout les travaux d'impression, quelle que soit l'imprimante:

Définissez colPrintJobs = objWMIService.ExecQuery _
("Sélectionnez * à partir de Win32_PrintJob")

Une fois que nous avons la collection complète des travaux d'impression, nous pouvons ensuite utiliser le InStr pour déterminer si la propriété Name inclut ou non la chaîne FinancePrinter:

Si Instr (objPrintJob.Name, «FinancePrinter») Alors

C'est un peu plus lourd, mais ça marchera. Voici un script complet qui renvoie la liste des utilisateurs actuellement connectés à une file d'attente d'impression Windows 2000:

strComputer = "."
Définissez objWMIService = GetObject ("winmgmts: \" & strComputer & " root cimv2")

Définissez colPrintJobs = objWMIService.ExecQuery _
("Sélectionnez * à partir de Win32_PrintJob")

Pour chaque objPrintJob dans colPrintJobs
Si Instr (objPrintJob.Name, «FinancePrinter») Alors
Wscript.Echo objPrintJob.Owner
Fin si
Prochain

Malheureusement, nous n'avons pas de script qui puisse vous dire où vont réellement les documents imprimés lorsque l'imprimante dit ils ont été imprimés mais les pages imprimées sont introuvables. Mais nous y travaillons.

Avatar

Commentaires

Laisser un commentaire

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