Gestion des imprimantes (installation / suppression)

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

Gestion des imprimantes (installation / suppression)

#1

Message par marcgforce » ven. 29 juin 2018 13:49

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
 

Répondre