2009-03-24 29 views
2

Ich möchte die IP-Adresse eines Druckers mit C# (.NET 2.0) ermitteln. Ich habe nur den Namen der Druckerfreigabe wie auf dem Windows-Betriebssystem eingerichtet, im Format \\PC Name\Printer Name. Der Drucker ist ein Netzwerkdrucker und hat eine andere IP-Adresse als der PC. Hat jemand irgendwelche Hinweise?Ermitteln Sie die IP-Adresse eines Druckers in C#

Vielen Dank im Voraus für Ihre Hilfe.

Grüße, Andy.

Antwort

0

Ist dieser Drucker in einem Netzwerk mit Active Directory eingerichtet? Oder ist dies in Ihrem eigenen lokalen Netzwerk mit nur einem Schalter und Ihrem Drucker angeschlossen?

Wenn es ersteres ist, dann sollten Sie in der Lage sein, basierend auf dem "Druckernamen" danach zu fragen. This article show how to get c# .net to connect to the AD. Dies erfordert jedoch einige Kenntnisse von AD-Servern in Ihrem Netzwerk.

Diese Lösung scheint mir ein bisschen lang, aber kann ein guter Ausgangspunkt sein?

1

Basierend auf dem Link How to get Printer Info in .NET? (! Danke, Panos, ich war schon auf dem Link), ich habe die folgende Lösung aus Panos's Antwort:

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))); 
    } 
} 

Offensichtlich funktioniert dies nur, wenn der Anschlussname für Der Drucker wird im Format "IP_IPAddress" angegeben, was meiner Meinung nach der Standardwert ist.

4

Ich weiß, das ist ein alter Beitrag, aber ich hatte das gleiche Problem, wo ich den Namen des Druckeranschlusses bekommen konnte, aber nicht die IP. In meinem Fall konnte ich mich nicht darauf verlassen, dass der Portname IP_ [IP-Adresse] war, sondern wie man die tatsächliche IP-Adresse aus dem Port-Namen bezieht.

speichert Windows die Informationen über Häfen in der Registrierung unter

HKLM \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors Standard TCP/IP Port \ Ports \ \ [Portname]

Dieser Schlüssel enthält die Werte, die auf der Portkonfigurationsseite eingerichtet wurden, einschließlich IP-Adresse und Portnummer.

Ein kurzes Beispiel C#, um die IP-Adresse

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, danke für die zusätzlichen Informationen. +1 – MagicAndi

+0

Danke Michael. Dies ist die tatsächliche Antwort, Portname ist nicht zuverlässig für IPAdress. Ich musste den Code in 'String IP = (String) key.GetValue (" HostName ", String.Empty, RegistryValueOptions.DoNotExpandEnvironmentNames) ändern;' für meine Anforderung. – Kishor

+0

Um klar zu sein, muss dies getan werden, sobald Sie den Port von den anderen Antworten erhalten – StingyJack

4

Gerade Hinzufügen einer weiteren Lösung hier mit .Net Framework 4.0 oder höher

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

mit der Klasse WIN32_Printer zu bekommen, ist hier nicht genug. Es sollte mit Win32_TCPIPPrinterPort kombiniert werden.

Unten ist der Code, der helfen soll:

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(); 
      } 
Verwandte Themen