Author:水如烟
 Imports System.DirectoryServices
Imports System.DirectoryServices
 Imports System.Management
Imports System.Management
 Public Class HowToSearchPrinter
Public Class HowToSearchPrinter

 Public Shared Function NetPrinters(ByVal GetWay As GetComputer) As String()
    Public Shared Function NetPrinters(ByVal GetWay As GetComputer) As String()
 Dim mResult(-1) As String
        Dim mResult(-1) As String
 Dim mPrinterFormat As String = "Computer:{0} Printer:{1}"
        Dim mPrinterFormat As String = "Computer:{0} Printer:{1}"
 Dim mNetComputerNames(-1) As String
        Dim mNetComputerNames(-1) As String

 Select Case GetWay
        Select Case GetWay
 Case GetComputer.Simple
            Case GetComputer.Simple
 mNetComputerNames = GetNetComputerNames()
                mNetComputerNames = GetNetComputerNames()
 Case GetComputer.Ping
            Case GetComputer.Ping
 mNetComputerNames = GetNetComputerNamesByPing()
                mNetComputerNames = GetNetComputerNamesByPing()
 End Select
        End Select

 For Each mComputer As String In mNetComputerNames
        For Each mComputer As String In mNetComputerNames
 For Each mPrinter As String In GetPrinterName(mComputer)
            For Each mPrinter As String In GetPrinterName(mComputer)
 ReDim Preserve mResult(mResult.Length)
                ReDim Preserve mResult(mResult.Length)
 mResult(mResult.Length - 1) = String.Format(mPrinterFormat, mComputer, mPrinter)
                mResult(mResult.Length - 1) = String.Format(mPrinterFormat, mComputer, mPrinter)
 Next
            Next
 Next
        Next

 Return mResult
        Return mResult
 End Function
    End Function

 '这里不保证得到所有的计算机
    '这里不保证得到所有的计算机
 Private Shared Function GetNetComputerNames() As String()
    Private Shared Function GetNetComputerNames() As String()
 Dim mResult(-1) As String
        Dim mResult(-1) As String

 Dim root As DirectoryEntry = New DirectoryEntry("WinNT:")
        Dim root As DirectoryEntry = New DirectoryEntry("WinNT:")
 For Each Domain As DirectoryEntry In root.Children
        For Each Domain As DirectoryEntry In root.Children
 '枚举工作组或域
            '枚举工作组或域 
 For Each Computer As DirectoryEntry In Domain.Children
            For Each Computer As DirectoryEntry In Domain.Children
 '枚举指定工作组或域的计算机
                '枚举指定工作组或域的计算机 
 If Computer.SchemaClassName.Equals("Computer") Then
                If Computer.SchemaClassName.Equals("Computer") Then
 ReDim Preserve mResult(mResult.Length)
                    ReDim Preserve mResult(mResult.Length)
 mResult(mResult.Length - 1) = Computer.Name
                    mResult(mResult.Length - 1) = Computer.Name
 End If
                End If
 Next
            Next
 Next
        Next
 Return mResult
        Return mResult
 End Function
    End Function

 '这倒是可以得到所有的计算机,可是也太慢了
    '这倒是可以得到所有的计算机,可是也太慢了
 Private Shared Function GetNetComputerNamesByPing() As String()
    Private Shared Function GetNetComputerNamesByPing() As String()
 If Not My.Computer.Network.IsAvailable Then Return Nothing
        If Not My.Computer.Network.IsAvailable Then Return Nothing
 Dim Result(-1) As String
        Dim Result(-1) As String
 Dim PingFormat As String = "192.168.0.{0}"
        Dim PingFormat As String = "192.168.0.{0}"
 For i As Integer = 1 To 254
        For i As Integer = 1 To 254
 If My.Computer.Network.Ping(String.Format(PingFormat, i), 100) Then
            If My.Computer.Network.Ping(String.Format(PingFormat, i), 100) Then
 ReDim Preserve Result(Result.Length)
                ReDim Preserve Result(Result.Length)
 Result(Result.Length - 1) = Net.Dns.GetHostEntry(String.Format(PingFormat, i)).HostName '这个方法是Net2.0
                Result(Result.Length - 1) = Net.Dns.GetHostEntry(String.Format(PingFormat, i)).HostName '这个方法是Net2.0
 End If
            End If
 Next
        Next
 Return Result
        Return Result
 End Function
    End Function

 Private Shared Function GetPrinterName(ByVal computerName As String) As String()
    Private Shared Function GetPrinterName(ByVal computerName As String) As String()
 Dim mResult(-1) As String
        Dim mResult(-1) As String

 Dim o As New ManagementObject
        Dim o As New ManagementObject
 o.Scope = New ManagementScope(String.Format("\\{0}\root\cimv2", computerName))
        o.Scope = New ManagementScope(String.Format("\\{0}\root\cimv2", computerName))
 Dim mSearch As New ManagementObjectSearcher(String.Format("SELECT DeviceID FROM {0}", "Win32_Printer"))
        Dim mSearch As New ManagementObjectSearcher(String.Format("SELECT DeviceID FROM {0}", "Win32_Printer"))
 mSearch.Scope = o.Scope
        mSearch.Scope = o.Scope
 Try
        Try
 For Each mManagementObject As ManagementObject In mSearch.Get()
            For Each mManagementObject As ManagementObject In mSearch.Get()
 ReDim Preserve mResult(mResult.Length)
                ReDim Preserve mResult(mResult.Length)
 mResult(mResult.Length - 1) = System.Text.RegularExpressions.Regex.Replace(mManagementObject.ToString, ".*""(.*)""", "${1}")
                mResult(mResult.Length - 1) = System.Text.RegularExpressions.Regex.Replace(mManagementObject.ToString, ".*""(.*)""", "${1}")
 Next
            Next
 Catch ex As Exception
        Catch ex As Exception
 Console.WriteLine(ex.Message)
            Console.WriteLine(ex.Message)
 Finally
        Finally
 mSearch.Dispose()
            mSearch.Dispose()
 o.Dispose()
            o.Dispose()
 End Try
        End Try

 Return mResult
        Return mResult
 End Function
    End Function

 Public Enum GetComputer
    Public Enum GetComputer
 Simple
        Simple
 Ping
        Ping
 End Enum
    End Enum
 End Class
End Class

 测试:
测试:
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Private 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)
        For Each s As String In HowToSearchPrinter.NetPrinters(HowToSearchPrinter.GetComputer.Simple)
 Console.WriteLine(s)
            Console.WriteLine(s)
 Next
        Next
 End Sub
    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
 Imports System.DirectoryServices
Imports System.DirectoryServices Imports System.Management
Imports System.Management Public Class HowToSearchPrinter
Public Class HowToSearchPrinter
 Public Shared Function NetPrinters(ByVal GetWay As GetComputer) As String()
    Public Shared Function NetPrinters(ByVal GetWay As GetComputer) As String() Dim mResult(-1) As String
        Dim mResult(-1) As String Dim mPrinterFormat As String = "Computer:{0} Printer:{1}"
        Dim mPrinterFormat As String = "Computer:{0} Printer:{1}" Dim mNetComputerNames(-1) As String
        Dim mNetComputerNames(-1) As String
 Select Case GetWay
        Select Case GetWay Case GetComputer.Simple
            Case GetComputer.Simple mNetComputerNames = GetNetComputerNames()
                mNetComputerNames = GetNetComputerNames() Case GetComputer.Ping
            Case GetComputer.Ping mNetComputerNames = GetNetComputerNamesByPing()
                mNetComputerNames = GetNetComputerNamesByPing() End Select
        End Select
 For Each mComputer As String In mNetComputerNames
        For Each mComputer As String In mNetComputerNames For Each mPrinter As String In GetPrinterName(mComputer)
            For Each mPrinter As String In GetPrinterName(mComputer) ReDim Preserve mResult(mResult.Length)
                ReDim Preserve mResult(mResult.Length) mResult(mResult.Length - 1) = String.Format(mPrinterFormat, mComputer, mPrinter)
                mResult(mResult.Length - 1) = String.Format(mPrinterFormat, mComputer, mPrinter) Next
            Next Next
        Next
 Return mResult
        Return mResult End Function
    End Function
 '这里不保证得到所有的计算机
    '这里不保证得到所有的计算机 Private Shared Function GetNetComputerNames() As String()
    Private Shared Function GetNetComputerNames() As String() Dim mResult(-1) As String
        Dim mResult(-1) As String
 Dim root As DirectoryEntry = New DirectoryEntry("WinNT:")
        Dim root As DirectoryEntry = New DirectoryEntry("WinNT:") For Each Domain As DirectoryEntry In root.Children
        For Each Domain As DirectoryEntry In root.Children '枚举工作组或域
            '枚举工作组或域  For Each Computer As DirectoryEntry In Domain.Children
            For Each Computer As DirectoryEntry In Domain.Children '枚举指定工作组或域的计算机
                '枚举指定工作组或域的计算机  If Computer.SchemaClassName.Equals("Computer") Then
                If Computer.SchemaClassName.Equals("Computer") Then ReDim Preserve mResult(mResult.Length)
                    ReDim Preserve mResult(mResult.Length) mResult(mResult.Length - 1) = Computer.Name
                    mResult(mResult.Length - 1) = Computer.Name End If
                End If Next
            Next Next
        Next Return mResult
        Return mResult End Function
    End Function
 '这倒是可以得到所有的计算机,可是也太慢了
    '这倒是可以得到所有的计算机,可是也太慢了 Private Shared Function GetNetComputerNamesByPing() As String()
    Private Shared Function GetNetComputerNamesByPing() As String() If Not My.Computer.Network.IsAvailable Then Return Nothing
        If Not My.Computer.Network.IsAvailable Then Return Nothing Dim Result(-1) As String
        Dim Result(-1) As String Dim PingFormat As String = "192.168.0.{0}"
        Dim PingFormat As String = "192.168.0.{0}" For i As Integer = 1 To 254
        For i As Integer = 1 To 254 If My.Computer.Network.Ping(String.Format(PingFormat, i), 100) Then
            If My.Computer.Network.Ping(String.Format(PingFormat, i), 100) Then ReDim Preserve Result(Result.Length)
                ReDim Preserve Result(Result.Length) Result(Result.Length - 1) = Net.Dns.GetHostEntry(String.Format(PingFormat, i)).HostName '这个方法是Net2.0
                Result(Result.Length - 1) = Net.Dns.GetHostEntry(String.Format(PingFormat, i)).HostName '这个方法是Net2.0 End If
            End If Next
        Next Return Result
        Return Result End Function
    End Function
 Private Shared Function GetPrinterName(ByVal computerName As String) As String()
    Private Shared Function GetPrinterName(ByVal computerName As String) As String() Dim mResult(-1) As String
        Dim mResult(-1) As String
 Dim o As New ManagementObject
        Dim o As New ManagementObject o.Scope = New ManagementScope(String.Format("\\{0}\root\cimv2", computerName))
        o.Scope = New ManagementScope(String.Format("\\{0}\root\cimv2", computerName)) Dim mSearch As New ManagementObjectSearcher(String.Format("SELECT DeviceID FROM {0}", "Win32_Printer"))
        Dim mSearch As New ManagementObjectSearcher(String.Format("SELECT DeviceID FROM {0}", "Win32_Printer")) mSearch.Scope = o.Scope
        mSearch.Scope = o.Scope Try
        Try For Each mManagementObject As ManagementObject In mSearch.Get()
            For Each mManagementObject As ManagementObject In mSearch.Get() ReDim Preserve mResult(mResult.Length)
                ReDim Preserve mResult(mResult.Length) mResult(mResult.Length - 1) = System.Text.RegularExpressions.Regex.Replace(mManagementObject.ToString, ".*""(.*)""", "${1}")
                mResult(mResult.Length - 1) = System.Text.RegularExpressions.Regex.Replace(mManagementObject.ToString, ".*""(.*)""", "${1}") Next
            Next Catch ex As Exception
        Catch ex As Exception Console.WriteLine(ex.Message)
            Console.WriteLine(ex.Message) Finally
        Finally mSearch.Dispose()
            mSearch.Dispose() o.Dispose()
            o.Dispose() End Try
        End Try
 Return mResult
        Return mResult End Function
    End Function
 Public Enum GetComputer
    Public Enum GetComputer Simple
        Simple Ping
        Ping End Enum
    End Enum End Class
End Class

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Private 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)
        For Each s As String In HowToSearchPrinter.NetPrinters(HowToSearchPrinter.GetComputer.Simple) Console.WriteLine(s)
            Console.WriteLine(s) Next
        Next End Sub
    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
 
                     
                    
                 
                    
                 
        
 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号