2009-03-24 8 views
2

Je voudrais déterminer l'adresse IP d'une imprimante en utilisant C# (.NET 2.0). J'ai seulement le nom de partage d'imprimante comme configuré sur le système d'exploitation Windows, dans le format \\PC Name\Printer Name. L'imprimante est une imprimante réseau et possède une adresse IP différente de celle du PC. Quelqu'un at-il des pointeurs?Déterminer l'adresse IP d'une imprimante en C#

Merci d'avance pour votre aide.

Cordialement, Andy.

Répondre

0

Cette imprimante est-elle configurée sur un réseau disposant d'Active Directory? Ou est-ce sur votre propre réseau local avec juste un commutateur et votre imprimante branché à l'intérieur?

S'il s'agit du premier, vous devriez pouvoir l'interroger en fonction du "nom de l'imprimante". This article show how to get c# .net to connect to the AD. Mais cela nécessite une certaine connaissance des serveurs AD de votre réseau.

Cette solution me semble un peu longue, mais peut-être un bon point de départ?

1

Basé sur le lien How to get Printer Info in .NET? (Merci, Panos, je cherchais déjà le lien), j'ai la solution suivante de Panos's réponse:

using System.Management; 

... 

string printerName = "YourPrinterName"; 
string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
ManagementObjectCollection coll = searcher.Get(); 

foreach (ManagementObject printer in coll) 
{ 
    string portName = printer["PortName"].ToString(); 
    if(portName.StartsWith("IP_")) 
    { 
     Console.WriteLine(string.Format("Printer IP Address: {0}", portName.Substring(3))); 
    } 
} 

De toute évidence, cela ne fonctionne que si le nom du port l'imprimante est donnée au format "IP_IPAddress", ce qui est, je crois, la valeur par défaut.

4

Je sais que c'est un vieux message, mais j'ai eu le même problème où j'ai pu obtenir le nom du port de l'imprimante, mais pas l'adresse IP. Dans mon cas, je ne pouvais pas compter sur le nom du port étant IP_ [adresse IP] mais j'ai trouvé comment obtenir l'adresse IP réelle à partir du nom du port.

Windows stocke les informations sur les ports dans le Registre sous

HKLM \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors \ Ports Port TCP/IP \ \ [Nom du port]

Cette clé contient la les valeurs définies dans la page de configuration du port, y compris l'adresse IP et le numéro de port.

Un exemple rapide C# pour obtenir l'adresse IP

using Microsoft.Win32; 

RegistryKey key = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" + printerPortName, RegistryKeyPermissionCheck.Default, System.Security.AccessControl.RegistryRights.QueryValues); 
if (key != null) 
{ 
    String IP = (String)key.GetValue("IPAddress", String.Empty, RegistryValueOptions.DoNotExpandEnvironmentNames); 
} 
+0

Michael, merci pour les informations supplémentaires. +1 – MagicAndi

+0

Merci Michael. C'est la réponse réelle, le nom du port n'est pas fiable pour obtenir IPAdress. J'ai dû changer le code en 'String IP = (Chaîne) key.GetValue (" HostName ", String.Empty, RegistryValueOptions.DoNotExpandEnvironmentNames);' pour mes besoins. – Kishor

+0

Pour être clair, cela doit être fait une fois que vous obtenez le port des autres réponses – StingyJack

4

juste ajouter une autre solution ici en utilisant Net Framework 4.0 ou supérieur

Using System.Printing 

var server = new PrintServer(); 
      var queues = server.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }); 
      foreach (var queue in queues) 
      { 
       string printerName = queue.Name; 
       string printerPort = queue.QueuePort.Name; 
      } 
2

utilisant des WIN32_Printer de classe ne suffit pas ici. Il devrait être combiné avec Win32_TCPIPPrinterPort.

est Ci-dessous le code qui devrait aider:

static void Main(string[] args) 
     { 
      var scope = new ManagementScope(@"\root\cimv2"); 
      scope.Connect(); 

      var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer"); 
      var results = searcher.Get(); 
      Console.WriteLine("Network printers list:"); 
      foreach (var printer in results) 
      { 
       var portName = printer.Properties["PortName"].Value; 

       var searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_TCPIPPrinterPort where Name LIKE '" + portName + "'"); 
       var results2 = searcher2.Get(); 
       foreach (var printer2 in results2) 
       { 
        Console.WriteLine("Name:" + printer.Properties["Name"].Value); 
        //Console.WriteLine("PortName:" + portName); 
        Console.WriteLine("PortNumber:" + printer2.Properties["PortNumber"].Value); 
        Console.WriteLine("HostAddress:" + printer2.Properties["HostAddress"].Value); 
       } 
       Console.WriteLine(); 
      } 

      Console.ReadLine(); 
      } 
Questions connexes