HOW TO:枚举网络所有打印机

来源:互联网 发布:淘宝洋垃圾衣服 编辑:程序博客网 时间:2024/05/22 14:46
Author:水如烟

Imports System.DirectoryServices
Imports System.Management
Public Class HowToSearchPrinter

    
Public Shared Function NetPrinters(ByVal GetWay As GetComputer) As String()
        
Dim mResult(-1As String
        
Dim mPrinterFormat As String = "Computer:{0} Printer:{1}"
        
Dim mNetComputerNames(-1As 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() As String()
        
Dim mResult(-1As 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() As String()
        
If Not My.Computer.Network.IsAvailable Then Return Nothing
        
Dim Result(-1As 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), 100Then
                
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(ByVal computerName As StringAs String()
        
Dim mResult(-1As 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 GetComputer
        Simple
        Ping
    
End Enum

End Class


测试:
    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)
            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