Author:水如烟
Imports System.DirectoryServicesImports System.ManagementPublic Class HowToSearchPrinterClass HowToSearchPrinter Public Shared Function NetPrinters()Function NetPrinters(ByVal GetWay As GetComputer) As String() Dim mResult(-1) As String Dim mPrinterFormat As String = "Computer:{0} Printer:{1}" Dim mNetComputerNames(-1) As String Select Case GetWay Case GetComputer.Simple mNetComputerNames = GetNetComputerNames() Case GetComputer.Ping mNetComputerNames = GetNetComputerNamesByPing() End Select For Each mComputer As String In mNetComputerNames For Each mPrinter As String In GetPrinterName(mComputer) ReDim Preserve mResult(mResult.Length) mResult(mResult.Length - 1) = String.Format(mPrinterFormat, mComputer, mPrinter) Next Next Return mResult End Function '这里不保证得到所有的计算机 Private Shared Function GetNetComputerNames()Function GetNetComputerNames() As String() Dim mResult(-1) As String Dim root As DirectoryEntry = New DirectoryEntry("WinNT:") For Each Domain As DirectoryEntry In root.Children '枚举工作组或域 For Each Computer As DirectoryEntry In Domain.Children '枚举指定工作组或域的计算机 If Computer.SchemaClassName.Equals("Computer") Then ReDim Preserve mResult(mResult.Length) mResult(mResult.Length - 1) = Computer.Name End If Next Next Return mResult End Function '这倒是可以得到所有的计算机,可是也太慢了 Private Shared Function GetNetComputerNamesByPing()Function GetNetComputerNamesByPing() As String() If Not My.Computer.Network.IsAvailable Then Return Nothing Dim Result(-1) As String Dim PingFormat As String = "192.168.0.{0}" For i As Integer = 1 To 254 If My.Computer.Network.Ping(String.Format(PingFormat, i), 100) Then ReDim Preserve Result(Result.Length) Result(Result.Length - 1) = Net.Dns.GetHostEntry(String.Format(PingFormat, i)).HostName '这个方法是Net2.0 End If Next Return Result End Function Private Shared Function GetPrinterName()Function GetPrinterName(ByVal computerName As String) As String() Dim mResult(-1) As String Dim o As New ManagementObject o.Scope = New ManagementScope(String.Format("\\{0}\root\cimv2", computerName)) Dim mSearch As New ManagementObjectSearcher(String.Format("SELECT DeviceID FROM {0}", "Win32_Printer")) mSearch.Scope = o.Scope Try For Each mManagementObject As ManagementObject In mSearch.Get() ReDim Preserve mResult(mResult.Length) mResult(mResult.Length - 1) = System.Text.RegularExpressions.Regex.Replace(mManagementObject.ToString, ".*""(.*)""", "${1}") Next Catch ex As Exception Console.WriteLine(ex.Message) Finally mSearch.Dispose() o.Dispose() End Try Return mResult End Function Public Enum GetComputerEnum GetComputer Simple Ping End EnumEnd Class测试:
Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For Each s As String In HowToSearchPrinter.NetPrinters(HowToSearchPrinter.GetComputer.Simple) Console.WriteLine(s) Next End Sub结果:
Computer:FK-A05-01 Printer:hp LaserJet 1000 DOS
Computer:FK-A05-01 Printer:hp LaserJet 1000 (副本 3)
Computer:FK-A05-01 Printer:hp LaserJet 1000
Computer:FK-A05-01 Printer:EPSON AL-C8600 Advanced
Computer:FK-A09-05 Printer:在 PK 上自动 Canon LBP-810
Computer:FK-A09-05 Printer:OKi5530结算单
Computer:FK-A09-05 Printer:OKi5530
Computer:FK-A09-05 Printer:Microsoft Office Document Image Writer
Computer:FK-A09-05 Printer:EPSON LQ-1600KIII
Computer:PK Printer:Tencent Virtual Printer
Computer:PK Printer:Canon LBP-810