Gestion des imprimantes (installation / suppression)

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
marcgforce
Niveau 3
Niveau 3
Messages : 47
Enregistré le : lun. 07 mars 2016 07:20
Status : Hors ligne

Gestion des imprimantes (installation / suppression)

#1

Message par marcgforce »

Bonjour, voilà un petit script que j'ai écrit pour gérer l'installation ou la suppression des imprimantes depuis le poste de travail, il est possible d'interroger un serveur d'impression pour récupérer les imprimantes partagées du domaine et de les sélectionner depuis un treeview pour les installer en tant qu'administrateur pour tous les utilisateurs, la même chose est faite pour les imprimantes locales qu'il est possible de sélectionner pour suppression. Je partage ce script pour la sélection et la gestion des items dans un treeview mais aussi son alimentation. De plus ce script pourrait servir a quelques un qui ont peut-être des postes à installer dans leurs entreprise (les imprimantes installées le sont pour tous les utilisateurs).
le script nécessite d'être administrateur dans le domaine ou a minima sur le serveur d'impression) pour être utilisé dans toutes ses fonctions.

la source de printMGR.au3 :
https://www.autoitscript.com/forum/topi ... ement-udf/

le script :
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\Users\0469327\Pictures\Icones\imprimantes.ico
#AutoIt3Wrapper_Outfile=printergui.exe
#AutoIt3Wrapper_Res_Comment=Gestion de l'installation des imprimantes
#AutoIt3Wrapper_Res_Description=Gestion de l'installation des imprimantes
#AutoIt3Wrapper_Res_Fileversion=1.0
#AutoIt3Wrapper_Res_LegalCopyright=
#AutoIt3Wrapper_Res_Language=1036
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3> ; Only for viewing the array.
#include <printMgr.au3>
#include <GuiListView.au3>
#include <GuiTreeView.au3>
;---------------------------PRINTERGUI -----------------------------------------------------------------------------------
;cette application permet de visuliser dans un treeview les imprimantes d'un ordinateur ou d'un serveur
;d'impression distant, de selectionner et d'installer les imprimantes désirées depuis ce serveur.
;Elle permet également de visulaiser les imprimantes installées sur le poste de travail et de les selectionner
;pour suppression. Elle utilise l'UDF <printMgr.au3> pour la suppression.
;l'installation des imprimantes se fait via printui.dll /ga qui permet l'installation d'une imprimante
;pour tous les utilisateurs d'un poste de travail. Necessite des droits administrateur.
;--------------------------------------------------------------------------------------------------------------------------------
;--------------------------------------------------------DECLARATION DES VARIABLES-------------------------------
Global $aPrinterList
Global $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
Global $g_eventerror = 0
Global $TVItemsID_Array[0]
Global $idTreeview
Global $SelAll_TVItem
Global $version = "1.0.0"
;--------------------------------------------------   CREATION DE LA GUI-------------------------------------------------
#Region ### START Koda GUI section ### Form=C:\DEVAU3\gestion imprimantes gui.kxf
SplashTextOn("PrinterGUI " & $version, "Initialisation Veuillez patienter",300,50) ; splash text d'attende de chagement de la gui
$Form1 = GUICreate("Gestion des imprimantes " & $version, 579, 618, 263, 295)
$Group1 = GUICtrlCreateGroup("Installation des imprimantes", 8, 8, 561, 313)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$LabelServeurImp = GUICtrlCreateLabel("Entrez l'adresse IP ou le nom du serveur d'impression :                        ", 16, 40, 267, 17)
$printserver = GUICtrlCreateInput("", 16, 64, 249, 21)
$ButtonSuppression = GUICtrlCreateButton("Supprimer les imprimantes ", 24, 368, 145, 41)
$label_installation = GUICtrlCreateLabel("Entrez le nom ou l'@ IP du serveur d'impression puis selectionner les imprimantes à installer",16,150,230,25)
$label_supression = GUICtrlCreateLabel("Sélectionner les imprimantes à supprimer --------->", 16,478,260,41)
;$label_conception =GUICtrlCreateLabel("Marcgforce @ 06/2018", 16,600)
$ButtonQuitter = GUICtrlCreateButton("Quitter", 432, 566, 129, 41)
$ButtonInstallation = GUICtrlCreateButton("Installer" ,144, 96, 121, 25)
GUICtrlSetState($ButtonInstallation, $GUI_DISABLE)
$ButtonVerifier = GUICtrlCreateButton("Verifier ", 16, 96, 113, 25)
$Group2 = GUICtrlCreateGroup("Suppression des imprimantes sur le poste de travail", 8, 328, 561, 231)
GUICtrlCreateGroup("", -99, -99, 1, 1)
;---------------------------------------CREATION DES TREEVIEWS----------------------------------------------------
Global $idTreeview = GUICtrlCreateTreeView(304, 32, 241, 273, BitOR($TVS_HASBUTTONS, $TVS_DISABLEDRAGDROP, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)
Global $idTreeview_suppr = GUICtrlCreateTreeView(304, 350, 241, 190, BitOR($TVS_HASBUTTONS, $TVS_DISABLEDRAGDROP, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)
dim $TVItemsID_Array_suppr[1]; déclaration du tableau contenant les imprimantes a supprimer
global $SelAll_TVItem_suppr = GUICtrlCreateTreeViewItem("Tout selectionner",$idTreeview_suppr) ; création du noeud permettant la sélection complète
$aPrinterList_suppr = _GetLocalPrinterList(@ComputerName) ; récupération des imprimantes locales dans un tableau pour les imprimantes locales
for $i = 0 to UBound($aPrinterList_suppr) -1
   $TVItemsID_Array_suppr[$i] = GUICtrlCreateTreeViewItem($aPrinterList_suppr[$i][1], $SelAll_TVItem_suppr)
   GUICtrlSetColor(-1, 0x0000C0)
   ReDim $TVItemsID_Array_suppr[ubound($TVItemsID_Array_suppr)+1]
Next
GUICtrlSetState($SelAll_TVItem_suppr, $GUI_EXPAND) ; expension du noeud liste complète
SplashOff() ; fin du message d'attente
GUISetState(@SW_SHOW, $Form1) ; affichage de la gui
GUICtrlSetState($ButtonVerifier, $GUI_DEFBUTTON) ; mise en place du raccourcis clavier (ENTREE) pour le bouton verifier
#EndRegion ### END Koda GUI section ###

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE, $ButtonQuitter
         Exit

      Case $ButtonVerifier ; traitement lors de l'appui sur le bouton verifier
         $TVItemsID_Array = "" ; si le treeview est déjà alimenté il faut le vider
         dim $TVItemsID_Array[1] ; pour tou recréer
         _GUICtrlTreeView_DeleteAll ($idTreeview) ; suppression du treeview
         $print_ip = GUICtrlRead($printserver) ; lecture de l'inputbox
         if $print_ip = "" then ; controle de l'inputbox > ""
            msgbox(64,"Erreur","Veuillez entrer l'adresse IP ou le nom du serveur d'impression")
         Else
            local $ping = test($print_ip) ; on teste si c'est un ordinateur
            if $ping = true Then
               $aPrinterList = _GetLocalPrinterList($print_ip) ; récupération des imprimantes pour l'installation
               global $SelAll_TVItem = GUICtrlCreateTreeViewItem("Tout selectionner",$idTreeview); création du noeud pour la sélection totale
               for $i = 0 to ubound($aPrinterList) -1
                  if StringLen($aPrinterList[$i][0]) = 0 then ; si une cellule du tableau est vide (imprimante non partagée)
                     $TVItemsID_Array[$i] = GUICtrlCreateTreeViewItem($aPrinterList[$i][1], $SelAll_TVItem)
                  Else
                     $TVItemsID_Array[$i] = GUICtrlCreateTreeViewItem($aPrinterList[$i][0], $SelAll_TVItem) ;on prend dans la cellume a coté
                  EndIf
                  GUICtrlSetColor(-1, 0x0000C0)
                  ReDim $TVItemsID_Array[ubound($TVItemsID_Array)+1] ; redimensionnement de l'array
               Next
               GUICtrlSetState($SelAll_TVItem, $GUI_EXPAND)
               GUICtrlSetState($ButtonInstallation, $GUI_ENABLE)
            Else
               msgbox(64,"Erreur","Veuillez entrer l'adresse IP ou le nom du serveur d'impression")
            EndIf
         EndIf

      Case $ButtonInstallation ; installation des imprimantes
         local $j=1
         local $aarray_checked[1]; création d'un tableau regroupant les imprimantes sélectionnées
         $count = _GUICtrlTreeView_GetCount($idTreeview) ; comptage du nombre de noeuds dans le treeview
         For $i = 0 To $count - 2
            If _GUICtrlTreeView_GetChecked($idTreeview, $TVItemsID_Array[$i]) = True Then ; si la case est cochée
               $aarray_checked[ubound($aarray_checked) -1] = _GUICtrlTreeView_GetText($idTreeview,$TVItemsID_Array[$i]) ; on récupère le texte et on le met dans l'array
               redim $aarray_checked[ubound($aarray_checked)+1]
            EndIf
            Next
         ProgressOn("INSTALLATION DES IMPRIMANTES ", "Installation de  : ") ; petite barre de defilement des installation
         for $i = 0 to ubound($aarray_checked)-2 ; lecture de l'array
            $j = ($i + 1) * 100 / (ubound($aarray_checked) -2)
            ProgressSet($j, "Installation de  : " & $aarray_checked[$i])
            $print_ip = GUICtrlRead($printserver)
            RunWait('C:\WINDOWS\system32\cmd.exe /c "rundll32.exe printui.dll, PrintUIEntry /gd /q /n \\' & $print_ip & '\' & $aarray_checked[$i] & '"', '', @SW_HIDE) ; suppression de l'imprimante si elle existe déjà
            sleep(1500) ; sa ça l'installation est trop rapide
            RunWait('C:\WINDOWS\system32\cmd.exe /c "rundll32.exe printui.dll, PrintUIEntry /ga /n \\' & $print_ip & '\' & $aarray_checked[$i] & '"', '', @SW_HIDE) ; installation
         Next
         $aarray_checked = "" ; destruction de l'array
         ProgressSet(100,"Installation terminée... nettoyage des fichiers")
         sleep(2000)
         ProgressOff()
         $aarray_checked_suppr=""
         $aPrinterList_suppr =""
         $TVItemsID_Array_suppr=""
         dim $TVItemsID_Array_suppr[1]
         _GUICtrlTreeView_DeleteAll ($idTreeview_suppr)
         $aPrinterList_suppr = _GetLocalPrinterList(@ComputerName)
         ;_ArrayDisplay($aPrinterList_suppr)
         $SelAll_TVItem_suppr = GUICtrlCreateTreeViewItem("Tout selectionner",$idTreeview_suppr) ; l'idée ici est de rafraichir la liste des imprimantes installées localement
         for $i = 0 to UBound($aPrinterList_suppr) -1
            if StringLen($aPrinterList_suppr[$i][0]) = 0 then
               $TVItemsID_Array_suppr[$i] = GUICtrlCreateTreeViewItem($aPrinterList_suppr[$i][0], $SelAll_TVItem_suppr)
            Else
               $TVItemsID_Array_suppr[$i] = GUICtrlCreateTreeViewItem($aPrinterList_suppr[$i][1], $SelAll_TVItem_suppr)
            EndIf
            GUICtrlSetColor(-1, 0x0000C0)
            ReDim $TVItemsID_Array_suppr[ubound($TVItemsID_Array_suppr)+1]
         Next
         GUICtrlSetState($SelAll_TVItem_suppr, $GUI_EXPAND)

      Case $ButtonSuppression
         local $aarray_checked_suppr[1]
         $count = _GUICtrlTreeView_GetCount($idTreeview_suppr)
         For $i = 0 To $count - 2
            If _GUICtrlTreeView_GetChecked($idTreeview_suppr, $TVItemsID_Array_suppr[$i]) = True Then
               $aarray_checked_suppr[ubound($aarray_checked_suppr) -1] = _GUICtrlTreeView_GetText($idTreeview_suppr, $TVItemsID_Array_suppr[$i])
               redim $aarray_checked_suppr[ubound($aarray_checked_suppr)+1]
            EndIf
         Next
         $strComputer = "."
         ProgressOn("SUPPRESSION DES IMPRIMANTES ", "Suppression de  : ")
         for $i = 0 to ubound($aarray_checked_suppr) -1
            $j = ($i + 1) * 100 / (ubound($aarray_checked_suppr) -2)
            ProgressSet($j, "Suppression de  : " & $aarray_checked_suppr[$i])
            ;_arraydisplay($aarray_checked_suppr)
            _PrintMgr_RemovePrinter($aarray_checked_suppr[$i]) ; utilisation de l'UDF <printMgr.au3>
         Next
         ProgressSet(100, "Suppression terminée")
         sleep(1000)
         ProgressOff()
         $aarray_checked_suppr=""
         $aPrinterList_suppr =""
         $TVItemsID_Array_suppr=""
         dim $TVItemsID_Array_suppr[1]
         _GUICtrlTreeView_DeleteAll ($idTreeview_suppr)
         $aPrinterList_suppr = _GetLocalPrinterList(@ComputerName)
         ;_ArrayDisplay($aPrinterList_suppr)
         $SelAll_TVItem_suppr = GUICtrlCreateTreeViewItem("Tout selectionner",$idTreeview_suppr)
         for $i = 0 to UBound($aPrinterList_suppr) -1
            if StringLen($aPrinterList_suppr[$i][0]) = 0 then
               $TVItemsID_Array_suppr[$i] = GUICtrlCreateTreeViewItem($aPrinterList_suppr[$i][1], $SelAll_TVItem_suppr)
            Else
               $TVItemsID_Array_suppr[$i] = GUICtrlCreateTreeViewItem($aPrinterList_suppr[$i][0], $SelAll_TVItem_suppr)
            EndIf
            GUICtrlSetColor(-1, 0x0000C0)
            ReDim $TVItemsID_Array_suppr[ubound($TVItemsID_Array_suppr)+1]
         Next
         GUICtrlSetState($SelAll_TVItem_suppr, $GUI_EXPAND)

      Case $SelAll_TVItem ; sélection de tous les noeuds pour le treeview installation
            Local $State = $GUI_UNCHECKED

            If BitAND(GUICtrlRead($SelAll_TVItem), $GUI_CHECKED) Then
            $State = $GUI_CHECKED
                GUICtrlSetColor($SelAll_TVItem, 0x0)
                GUICtrlSetState($SelAll_TVItem, $GUI_DEFBUTTON + $GUI_CHECKED)
            Else
                GUICtrlSetColor($SelAll_TVItem, 0xC0C0C0)
                GUICtrlSetState($SelAll_TVItem, $GUI_UNCHECKED)
            EndIf

           For $a = 0 To UBound($TVItemsID_Array) - 1
               GUICtrlSetState($TVItemsID_Array[$a], $State)
           Next
      case $SelAll_TVItem_suppr ; idem pour les noeuds supression
         Local $State = $GUI_UNCHECKED

            If BitAND(GUICtrlRead($SelAll_TVItem_suppr), $GUI_CHECKED) Then
            $State = $GUI_CHECKED
                GUICtrlSetColor($SelAll_TVItem_suppr, 0x0)
                GUICtrlSetState($SelAll_TVItem_suppr, $GUI_DEFBUTTON + $GUI_CHECKED)
            Else
                GUICtrlSetColor($SelAll_TVItem_suppr, 0xC0C0C0)
                GUICtrlSetState($SelAll_TVItem_suppr, $GUI_UNCHECKED)
            EndIf

           For $a = 0 To UBound($TVItemsID_Array_suppr) - 1
               GUICtrlSetState($TVItemsID_Array_suppr[$a], $State)
           Next
   EndSwitch
WEnd

Func _GetLocalPrinterList($computer) ; récupération des imprimantes (locales ou serveur)
   Local $PrinterList[1][4], $PrinterCount
      Local $objWMIService = ObjGet("winmgmts:\\" & $computer & "\root\CIMV2")
   if @error Then
      msgbox(64,"Erreur ! (" & @error &")" ,"Veuillez utiliser un compte administrateur  sur le domaine pour visulaiser la liste des imprimantes sur le serveur " & $computer ) ; récupération de l'erreur si non autorisé
      Return
   Else
      Local $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Printer")
      If IsObj($colItems) Then
         For $objItem In $colItems
            ReDim $PrinterList[$PrinterCount + 1][4]
            $sharename = $objItem.ShareName
            $PrinterList[$PrinterCount][0] = $objItem.shareName
            $PrinterList[$PrinterCount][1] = $objItem.DeviceID
            $PrinterCount += 1
         Next
         Return $PrinterList
      EndIf
   EndIf

   EndFunc   ;==>_GetLocalPrinterList

Func test($computer) ; l'ordinateur est il allumé ou sur le réseau ?
   Local $ping = Ping($computer, 500)
   If $ping = 0 Then
      ;ConsoleWrite("Ordi : " & $computer & " ms : " & $ping & " erreur : " & @error & @CRLF)
      Return False

   Else
      ;consolewrite("Ordi : " & $computer & "ms : " & $ping & " erreur : " & @error & @CRLF)
      Return True

   EndIf
EndFunc   ;==>test
 
gabinhocity
Niveau 2
Niveau 2
Messages : 18
Enregistré le : jeu. 04 sept. 2014 09:45
Status : Hors ligne

Re: Gestion des imprimantes (installation / suppression)

#2

Message par gabinhocity »

Bonjour,
Merci pour ton code il est superbe ton logiciel !
Il ne manque plus que les options d'import et export d'imprimantes locales pour qu'il soit complet.
Merci beaucoup :D
Répondre