Bonjour,

Je sors à peine de formation powershell et j'aurais besoin de votre aide pour faire un script qui récupère les compteurs des imprimantes USB et Réseaux. Il existe déjà plusieurs outils pour faire cela mais mon script l'automatiserait, la personne qui va l'utiliser est un non informaticien et je souhaite pas lui faire sa requête chaque mois ^^

Pour cela, je voulais attaquer notre DNS ou DHCP mais comme nous sommes centralisés ... nous n'avons plus les droits pour y accéder .... j'ai donc pensé à lister les imprimantes recensés dans l'AD pour ensuite récupérer l'adresse IP de chaque imprimante via un get-wmiobject sur les classes Win32_printer et TCPIPPrinterPort ( comparer les port afin de retrouver l'adresse ip de chaque imprimante ) mais vu le nombre le script met énormément de temps car les 2 get-wmiobject étaient réalisés par imprimantes.

J'ai donc pensé à faire l'inverse, j'ai listé tous les serveurs/stations d'impressions ( purgé grâce au get-unique ) puis j'ai lancé une seul fois les 2 get-wmiobject sur chaque serveur/station d'impression, puis je cherche à comparaitre les valeurs des 2 résultats afin de retrouver les ip des imprimantes.

Je cherche donc à attaquer les imprimante USB, pour l'instant je fais un message, en attendant la solution.

Write-Host "Sur le Serveur " $srv "l'imprimante " $IMP.Name " est en USB"

Voici ce que j'ai commencé à scripter :


Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
$listprint = ""
$list = ""
$serveur = ""
$listserveur = @()
 
##### Liste des Imprimantes AD ####
 
$listprint = Get-ADObject -Filter {objectclass -like "printQueue"} | sort Name -Descending
$listprint = $listprint.Name
 
 
##### Liste des serveurs/stations d'impression ####
 
ForEach ($printer in $listprint){
 
$debut = 0
$milieu = $printer.IndexOf("-")
$fin = ($printer.Length) - ($milieu+1)
 
$serveur = $printer.Substring($debut,($milieu))
$nom = $printer.Substring(($milieu+1),$fin)
 
$listserveur = $listserveur + $printer.Substring($debut,($milieu))
$listserveurU = $listserveur | Get-Unique
 
}
 
 
##### Test si Reseau ou USB #####
 
Foreach ($srv in $listserveurU){
 
$srv = $srv.ToUpper()
 
    If ($srv.StartsWith("S")){
 
##### Récupération du imprimante/port et port/ip #####
 
    $PortsIMP = Get-WmiObject -Class Win32_Printer -ComputerName $srv | sort Name,Portname 
    $PortsIP = Get-WmiObject -Class Win32_TCPIPPrinterPort -ComputerName $srv | sort Name,Hostaddress
 
##### Association imprimante/ip #####
 
        Foreach($IMP in $PortsIMP){
            ForEach($IPs in $PortsIP){
 
                if ($IMP.portname -eq $IPs.Name){
                $IP=""
                $IP= $IPs.hostaddress
 
##### Test si l'imprimante est allumé #####
 
                    If (Test-Connection $IP -quiet) {
 
##### Récupération Compteur #####
 
                $SNMP = new-object -ComObject olePrn.OleSNMP
                $SNMP.open($IP,"public",2,3000)
 
                Write-Host "Sur le Serveur " $srv  "l'imprimante " $IMP.Name ", port " $IMP.portname " soit " $IPs.Name " a pour adresse ip " $IPs.hostaddress ", Compteur : "$snmp.Get(".1.3.6.1.2.1.43.10.2.1.4.1.1")
                    }else{
                Write-Host "Sur le Serveur " $srv  "l'imprimante " $IMP.Name " Ping KO, l'imprimante doit être éteinte"
                }
 
            }
 
        }
 
    }
 
}else{
 
    Write-Host "Sur le Serveur " $srv  "l'imprimante " $IMP.Name " est en USB"
 
    }
}

En tout cas, je vous remercie d'avance de votre aide