Lister les imprimantes par utilisateur

Lister les imprimantes par utilisateur - VB/VBA/VBS - Programmation

Marsh Posté le 23-06-2017 à 15:57:38    

Bonjour à tous,
 
J'aimerai créer un script qui serai capable de me lister les imprimantes connectées à mes utilisateurs.
En clair pour chaque utilisateur une liste des imprimantes qu'il utilise.
 
Si quelqu'un a une idée  
 
j'ai trouvé un script mais c'etait par rapport au nom du pc et fallait taper chaque pc donc bon...
 
 
Merci d'avance

Reply

Marsh Posté le 23-06-2017 à 15:57:38   

Reply

Marsh Posté le 23-06-2017 à 16:45:16    

Bonjour,
 
Un vieux code que fonctionne toujours en 32 bits (à adapter si 64 bits) :

Code :
  1. Option Explicit
  2. Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" _
  3.         (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
  4. Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
  5. Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" _
  6.         (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Long, _
  7.         ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
  8. Type Imprimante_1
  9.   flags As Long
  10.   pDescription As String
  11.   pName As String
  12.   pComment As String
  13. End Type
  14. Function EnumèreImprimantes() As String
  15. ' Objet     : Liste les imprimantes installées
  16. '
  17. ' Retour    : String              Liste des noms des imprimantes installées ou chaine vide si
  18. '                                 aucune imprimante n'est installée.
  19. '
  20. ' 04/07/07    Patrice             Création
  21.  
  22.   Dim BufferLong() As Long         ' Tableau qui reçoit les informations de EnumPrinters
  23.   Dim Données() As Imprimante_1    ' Recoit les valeurs de BufferLong()
  24.   Dim TailleBuffer As Long         ' Taille en bytes de BufferLong()
  25.   Dim BesoinBuffer As Long         ' Nbre de bytes necessaires si BufferLong() trop court
  26.   Dim NbImprimantes As Long        ' Nbre d'imprimantes trouvées
  27.   Dim Résultat As Long             ' Résultat retournée
  28.   Dim Compteur As Integer               ' Compteur
  29.   EnumèreImprimantes = ""
  30.   ' Récolte les informations sur les imprimantes locales
  31.   TailleBuffer = 1200                                ' Taille assez importante mais pas trop
  32.   ReDim BufferLong(0 To TailleBuffer / 4) As Long    ' Redimension buffer (1 Long = 4 bytes)
  33.   Résultat = EnumPrinters(2, "", 1, BufferLong(0), TailleBuffer, BesoinBuffer, NbImprimantes)
  34.   If Résultat = 0 Then
  35.     TailleBuffer = BesoinBuffer
  36.     ReDim BufferLong(0 To TailleBuffer / 4) As Long  ' Agrandir buffer à la taille nécessaire
  37.     Résultat = EnumPrinters(2, "", 1, BufferLong(0), TailleBuffer, BesoinBuffer, NbImprimantes)
  38.     If Résultat = 0 Then Exit Function                ' Si nouvel échec, terminer
  39.   End If
  40.   If NbImprimantes = 0 Then Exit Function
  41.   ' Converti les données de BufferLong() vers Données()
  42.   ReDim Données(0 To NbImprimantes - 1) As Imprimante_1
  43.   ' Boucle qui définit chaque élément à partir du jeu d'informations reçues
  44.   For Compteur = 0 To NbImprimantes - 1
  45.     ' BufferLong(4 * Compteur) = .flags, BufferLong(4 * Compteur + 1) = .pDescription, etc.
  46.     ' Pour chaque élément, la chaine est est d'abord stockée dans le buffer pour disposer
  47.     ' d'assez de place, et alors l'élément est copié. »
  48.     Données(Compteur).flags = BufferLong(4 * Compteur)
  49.     Données(Compteur).pDescription = Space(lstrlen(BufferLong(4 * Compteur + 1)))
  50.     Résultat = lstrcpy(Données(Compteur).pDescription, BufferLong(4 * Compteur + 1))
  51.     Données(Compteur).pName = Space(lstrlen(BufferLong(4 * Compteur + 2)))
  52.     Résultat = lstrcpy(Données(Compteur).pName, BufferLong(4 * Compteur + 2))
  53.     Données(Compteur).pComment = Space(lstrlen(BufferLong(4 * Compteur + 3)))
  54.     Résultat = lstrcpy(Données(Compteur).pComment, BufferLong(4 * Compteur + 3))
  55.   Next Compteur
  56.   ' Renvoie le nom de chaque imprimante
  57.   For Compteur = 0 To NbImprimantes - 1
  58.     EnumèreImprimantes = EnumèreImprimantes & Données(Compteur).pName & vbCr
  59.   Next Compteur
  60.  
  61. End Function


---------------
Cordialement, Patrice
Reply

Marsh Posté le 26-06-2017 à 08:17:34    

Bonjour et Merci pour votre réponse.
N'étant pas un as du codage pouvez vous me dire que faut il changer pour un système 64 bits.  
Et j'ai oublié de vous dire que c'étaient des imprimantes paratgées via le serveur d'impression je ne sais pas si cela change quelque chose.
Cordialement

Reply

Marsh Posté le 26-06-2017 à 11:44:33    

J'ai essayer de mettre ce script en ouverture de session par gpo mais la commande en elle meme n'a pas l'air de fonctionner  
 
reg query HKEY_CURRENT_USER\Printers\Connections >> //monserveur/printers/%username%.txt
 
avec le dossier printers partager et tout le monde a tous les droits

Reply

Marsh Posté le 26-06-2017 à 22:35:30    

Bonjour,
 
Voila une version x32 et x64 simplifiée (il s'agit de VBA Excel)

Code :
  1. Option Explicit
  2. Private Const PRINTER_ENUM_CONNECTIONS = &H4
  3. Private Const PRINTER_ENUM_LOCAL = &H2
  4. #If Win64 Then
  5.   Private Declare PtrSafe Function StrCopy Lib "kernel32.dll" Alias "lstrcpyA" _
  6.      (ByVal lpString1 As String, ByVal lpString2 As Long) As LongPtr
  7.   Private Declare PtrSafe Function StrLen Lib "kernel32.dll" Alias "lstrlenA" _
  8.     (ByVal lpString As Long) As LongPtr
  9.   Private Declare PtrSafe Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" _
  10.     (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Any, _
  11.      ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As LongPtr
  12. #Else
  13.   Private Declare Function StrCopy Lib "kernel32.dll" Alias "lstrcpyA" _
  14.     (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
  15.   Private Declare Function StrLen Lib "kernel32.dll" Alias "lstrlenA" _
  16.     (ByVal lpString As Long) As Long
  17.   Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" _
  18.     (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Any, _
  19.      ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
  20. #End If
  21. Public Sub Test()
  22. ' Exemple d'utilisation
  23. '
  24.   MsgBox EnumèreImprimantes
  25. End Sub
  26. Public Function EnumèreImprimantes() As String
  27. Dim BufferLong() As Long          ' Informations de EnumPrinters
  28. Dim NomImprimante As String       ' Nom de l'imprimante
  29. Dim TailleBuffer As Long          ' Taille en bytes de BufferLong()
  30. Dim BesoinBuffer As Long          ' Nbre de bytes necessaires si BufferLong() trop court
  31. Dim NbImprimantes As Long         ' Nbre d'imprimantes trouvées
  32. Dim Pointeur As Long              ' Pointeur
  33. Dim Compteur As Integer           ' Compteur
  34. Dim Réussite As Boolean           ' Réussite énumération
  35.        
  36.   EnumèreImprimantes = ""
  37.   TailleBuffer = 1200
  38.   ReDim BufferLong(0 To TailleBuffer / 4) As Long
  39.   Réussite = EnumPrinters(PRINTER_ENUM_LOCAL Or PRINTER_ENUM_CONNECTIONS, vbNullString, 4, BufferLong(0), _
  40.                           TailleBuffer, BesoinBuffer, NbImprimantes)
  41.   If Not Réussite Then
  42.     ReDim BufferLong(0 To BesoinBuffer / 4) As Long
  43.     Réussite = EnumPrinters(PRINTER_ENUM_LOCAL Or PRINTER_ENUM_CONNECTIONS, vbNullString, 4, BufferLong(0), _
  44.                             BesoinBuffer, BesoinBuffer, NbImprimantes)
  45.     If Not Réussite Then Exit Function
  46.   End If
  47.   If NbImprimantes = 0 Then Exit Function
  48.  
  49.   For Compteur = 0 To NbImprimantes - 1
  50.     NomImprimante = Space$(StrLen(BufferLong(Compteur * 3)))
  51.     Pointeur = StrCopy(NomImprimante, BufferLong(Compteur * 3))
  52.     EnumèreImprimantes = EnumèreImprimantes & NomImprimante & vbCr
  53.   Next Compteur
  54. End Function


---------------
Cordialement, Patrice
Reply

Marsh Posté le 27-06-2017 à 09:39:47    

Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed