VB.NET开发扫描客户端服务工具

客户端

  在大中型企业信息系统中,对客户端PC的管理,往往是容易出现问题的环节。因此,很多大公司引入了各种分布式的管理系统,例如防病毒方面的Norton AntiVirus,BlackICE防火墙,微软的 SMS (System Management Server),等等,这些系统都会在客户端安装相应的客户端软件,一般都是以服务的形式出现,但是由于种种原因,这些服务会停止运行或者该客户机根本没有安装这些客户端服务,这样管理系统就会出现疏漏,有可能造成问题,如因无法防御病毒而成为病毒源,无法为该客户端发布软件,无法管理客户PC等等。在此,我们提供一个方案,可以定时按照IP地址扫描网络,报告出特定的服务的状态。

  这个方案使用了Microsoft.NET技术,同时也用到了.NET Framework中的ADO.NET ,WMI management,XML。其核心是一个由VB.NET写的程序以及它的两个配置文件,配置文件为XML格式,该程序按IP扫描网络,得到每个系统的服务 的状态,如果IP地址没有对应系统,则忽略该IP,针对没有安装服务或服务停止的系统我们在另一个线程中运行NBTSTAT命令,得到其机器名,用户名,MAC地址域等信息,以便我们找到机器解决问题。其次为了保存扫描的结果,我们需要一个很小的数据库MS-Access或MS-SQL server都可以,本文使用SQL2000 。最后为了呈现出扫描的结果,以便我们采取行动,这里我们使用网页的形式把数据库中的结果展现出来。

  1. VB.NET程序

  该程序使用两个XML格式的配置文件,当程序启动时会读入这些配置。其中一个文件定义了需要扫描的网段,包括排除在外的地址段。另一个文件定义了连接数据库的信息,以及数据表的定义。这两个文件的内容如下:

<IPLIST>

<IP LANID="192.168.100." ><EXP L=”1” H=”30”/></IP>

<IP LANID="192.168.101." />

<IP LANID="192.168.102." />

<IP LANID="192.168.103." />

<IP LANID="192.168.104." ><EXP L=”1” H=”40”/></IP>

</IPLIST>

  该文件定义将要扫描5个网段,其中两个网段有些地址需要排除在外(分配给打印机等设备),对于192.168.100段,我们排除从1到30,对于192.168.104段我们排除1到40。

<DBINFO>

<SERVER>DBServer</SERVER>

<DATABASE>DB</DATABASE>

<UID>REPORT</UID>

<PWD>REPORT</PWD>

<SERVICE TABLE=”SERVICE”>SERVICE</SERVICE>

</DBINFO>

  该文件定义了连接数据库所需的信息

TAG Meaning
<SERVER> SCANSERVICE数据库的服务器名
<DATABASE> SCANSERVICE数据库名
<UID> 用于更新SCANSERVICE数据库的数据库用户名
<PWD> 用于更新SCANSERVICE数据库的数据库用户的密码
<SERVICE> 该TAG的 inner 定义了我们希望扫描的Service的名字,
这里我们假定希望扫描服务名为SERVICE。
该TAG的属性定义了数据库中表名,该表用于保存扫描结果。

  ‘首先我们定义一个类,主要用于得到某个IP地址的Service的状态信息,并在服务状态不正常时触发另一线程得到该系统的详细信息。

Imports System.ServiceProcess

Imports System.Xml

Imports System.Threading

Public Class GetStatus

Private IServiceName As String ‘服务的名称

Private IMachineIP As String ‘IP地址

Private ITable As String ‘在DATESET中的表名

‘构造函数

Sub New(ByVal Ip As String, ByVal SvcName As String, ByVal updatetable As String)

IMachineIP = Ip

IServiceName = SvcName

ITable = updatetable

End Sub

‘每个线程所运行的方法,用于得到服务的状态,如果状态不正常则触发另一线程得到该IP的信息

Sub GetStausF()

Dim ServiceP As New ServiceController() ‘实例化一个ServiceController类

ServiceP.MachineName = IMachineIP

ServiceP.ServiceName = IServiceName

Dim myRow As DataRow

Dim status As String

Dim Run As Boolean = False

myRow = ds.Tables(ITable).NewRow

Try

If ServiceP.Status.ToString <> "Running" Then

status = ServiceP.Status.ToString‘如果状态不是RUNNING则将状态赋予字符串变量

Else

Run = True ‘如果状态为RUNNING,则不做任何事

End If

Catch er As Exception ‘以下处理取得状态时候发生的异常

status = Left(er.Message, 35)

If InStr(status, "Service Control Manager") = 0 Then

status = "Not installed or open service failed" ‘没有安装该服务

ElseIf InStr(er.Message, "Manager") > 0 Then

status = "Can not detected" ‘服务的状态不可得

End If

End Try

ServiceP.Close() ‘关闭ServiceController实例

‘以下判断如果状态不是RUNNING,则记录该系统,并触发线程得到它的详细信息。

If Not Run Then

myRow("msg") = status

myRow("ip") = IMachineIP

SyncLock GetType(AddRow) ‘为保证多线程情况下,对DataSet只有一个写操作,锁定AddRow类

Dim AddRowIns As New AddRow(myRow) ‘将IP和状态通过我们自己写的AddRow类插入DataSet

End SyncLock

‘触发另一线程取得机器信息

Dim HostInfo2 As New HostInfo(IMachineIP)

Dim HostThr2 As New Thread(New ThreadStart(AddressOf HostInfo2.sysInfo))

HostThr2.Start()

SyncLock GetType(HostInfoThreadCounter)

HostInfoThreadCounter.counter += 1 ‘启动线程数加1

End SyncLock

End If

SyncLock GetType(StoppCounter)

StopThr.AddStop()

End SyncLock

End Sub

End Class

‘该类只有一个方法,就是将停止的线程数减1

Class StoppCounter

Sub AddStop()

ThreadCounterStopped = ThreadCounterStopped + 1

End Sub

End Class

‘此类用于将已有的行插入DataSet

Class AddRow

‘第一个构造函数,以构造好的行为输入参数

Sub New(ByVal row As DataRow)

Try

ds.Tables(0).Rows.Add(row)

Catch ee As Exception

End Try

End Sub

‘第二个构造函数,以机器名用户名等字符串为参数,更新已有的行

Sub New(ByVal IP As String, ByVal user As String, ByVal hostname As String, ByVal Mac As String, ByVal domain As String, ByVal timeout As Char)

Dim RowTimeOut As DataRow

Try

For Each RowTimeOut In ds.Tables(0).Select("IP='" & IP & "'")

RowTimeOut.Item("LastUID") = user

RowTimeOut.Item("Name") = hostname

RowTimeOut.Item("Mac") = Mac

RowTimeOut.Item("Domain") = domain

RowTimeOut.Item("Timeout") = timeout 'Set timeout flag to this item

Exit For 'just run once

Next

Catch er As Exception

End Try

End Sub

End Class

‘由于篇幅限制,这里省略了根据IP取得机器信息的类的代码。

Imports System.Threading ‘用于支持多线程

Imports System.Xml ‘用于分析XML格式的参数文件

Imports System.Data ‘用于保存结果到数据库

Module Module1

Public ds As New DataSet()

Public conn1 As SqlClient.SqlConnection ‘数据库连接

Public ipf As String ‘IP列表文件名

Public dbf As String ‘数据库信息文件

Public ThreadCounterStopped As Integer

Public StopThr As New StoppCounter()

Sub Main() ‘程序主程序

Dim machineIP As String

Dim iplistF As New Xml.XmlDocument()

Dim iplist As Xml.XmlNode

Dim ipitem As Xml.XmlNode

Dim DBinfoF As New Xml.XmlDocument()

Dim DBinfo As Xml.XmlNode

Dim LanID As String

Dim i As Integer

Dim timestart As Integer

Dim ThreadCounterStarted As Integer

ThreadCounterStarted = 0

ThreadCounterStopped = 0

Dim server As String

Dim database As String

Dim uid As String

Dim pwd As String

Dim table As String

Dim connstr, connstr1 As String

Dim ServiceName As String

Dim Purgestr As String

Try

DBinfoF.Load(dbf) ‘读取数据库信息文件

Catch nodb As Exception

MsgBox(nodb.Message & "Wrong DB info file name.")

Exit Sub

End Try

Try

iplistF.Load(ipf) ‘读取IP列表文件

Catch noip As Exception

MsgBox(noip.Message & "Wrong IP list file name.")

Exit Sub

End Try

‘分析数据库信息文件

DBinfo = DBinfoF.ChildNodes(0)

server = DBinfo.ChildNodes(0).InnerText

database = DBinfo.ChildNodes(1).InnerText

uid = DBinfo.ChildNodes(2).InnerText

pwd = DBinfo.ChildNodes(3).InnerText

ServiceName = DBinfo.ChildNodes(4).InnerText

table = DBinfo.ChildNodes(4).Attributes(0).Value

‘根据分析所得,构造连接字符串

connstr1 = "server=" & server & ";database=" & database & ";uid=" & uid & ";password=" & pwd

conn1 = New SqlClient.SqlConnection(connstr1) ‘实例化数据库连接

conn1.Open() ‘打开数据库连接

Dim sa As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter("select * from " & table, conn1)

Dim combu As New SqlClient.SqlCommandBuilder(sa)

sa.Fill(ds, table) ‘填充DataSet

ds.Clear() ‘清空旧的数据

Dim IPAddress As String

‘分析IP列表文件

iplist = iplistF.ChildNodes(0)

Dim Ai As Integer

Dim ipexcepCount As Integer

Dim ipexcep As Xml.XmlNode

For Each ipitem In iplist.ChildNodes

Dim Excep(2, 83) As Integer

LanID = ipitem.Attributes(0).Value‘得到网络ID

For i = 2 To 254 ‘从2到254,根据每个网络ID构造IP地址

Ai = 0

‘以下判断是为了跳过保留地址段

If ipitem.HasChildNodes Then

ipexcepCount = ipitem.ChildNodes.Count

ReDim Excep(2, ipexcepCount - 1)

For Each ipexcep In ipitem.ChildNodes

Excep(0, Ai) = CInt(ipexcep.Attributes(0).Value)

Excep(1, Ai) = CInt(ipexcep.Attributes(1).Value)

Ai = Ai + 1

Next

End If

For Ai = 0 To ipexcepCount - 1

If i >= Excep(0, Ai) And i <= Excep(1, Ai) Then

Console.WriteLine("跳过保留地址: " & LanID & i.ToString)

GoTo SkipIP

End If

Next

machineIP = LanID & i.ToString ‘IP地址

‘以下触发线程以,得到服务状态

Dim getSt As New GetStatus(machineIP, ServiceName, table)

Dim GetStThread As New Thread(New ThreadStart(AddressOf getSt.GetStausF))

GetStThread.Start()

ThreadCounterStarted = ThreadCounterStarted + 1‘启动线程数加1

Console.WriteLine("线程" & machineIP & " 启动。检测 " & ServiceName)

‘每启动100个线程,程序主线程停止15秒,避免太多线程造成内存溢出

If (ThreadCounterStarted Mod 100) = 0 Then

Console.WriteLine("等待 .......")

Thread.CurrentThread.Sleep(15000)

GC.Collect() 'force garbage collection to aviod outOfMemory when run with long IP list

End If

SkipIP:

Next

Next

Console.WriteLine("Exiting program ...") ‘所有线程都已触发

Finish:

Thread.CurrentThread.Sleep(5000) ‘以下程序等待所有线程结束

GC.Collect()

If ThreadCounterStopped = ThreadCounterStarted And HostInfoThreadCounter.counter = HostInfoThreadCounter.counterSTOP Then‘如果触发线程等于结束线程

Dim row As Data.DataRow

For Each row In ds.Tables(table).Rows

row.Item("SysTime") = Now

Next

Purgestr = "delete " & table

Dim com1 As New SqlClient.SqlCommand(Purgestr, conn1)

com1.ExecuteNonQuery() ‘删除旧记录

sa.InsertCommand = combu.GetInsertCommand

sa.Update(ds, table) ' 将新记录写入数据库

Else

GoTo Finish ' goto finish and wait another 30 seconds

End If

End Sub

  可以利用如下命令在DOS窗口启动该程序。

Scanservice –i iplist.xml –d dbinfo.xml

  2. SCANSERVICE 数据库

  该数据库保存保存程序运行结果,以便用WEB等方式展现出来。以下是建立表的脚本,包含域名,用户名,机器名,IP以及服务状态。

CREATE TABLE [dbo].[Service] (

[IP] [varchar] (50) NULL ,

[状态] [varchar] (50) NULL ,

[用户名] [varchar] (50) NULL ,

[机器名] [varchar] (50) NULL ,

[MAC地址] [varchar] (50) NULL ,

[域] [varchar] (50) NULL ,

[超时] [varchar] (10) NULL ,

[时间安] [DateTime] (8) NULL ,

)

  总结:

  以上是一个完整的方法,也是比较简单明晰的解决方法,如果要求技巧和性能的话,还有一些地方可以做些改进,比如对线程池的使用。另外还有一些方面需要大家自己完成,比如将数据库中的信息以WEB的方式展现出来。

时间: 2024-08-03 06:13:04

VB.NET开发扫描客户端服务工具的相关文章

GNU 黑客开发端口扫描反制工具

德国知名IT媒体Heise上周报道了英国情报机构GCHQ的大规模监视系统HACIENDA,HACIENDA系统使用端口扫描工具扫描了27个国家的所有联网服务器,寻找存在漏洞的系统.为了避开端口扫描保护不公开的服务器,几位GNU开发者在德国举行的GNU黑客会议上透露了他们开发的规避工具TCP Stealth系统及其自由软件实现Knock.TCP Stealth团队成员之一的Jacob Appelbaum也是Tor项目的资深开发者,该系统用一个身份验证令牌替换传统的随机TCP SQN数.

VB外接程序的制做-在VB中创建您自己工具条和菜单

菜单|程序|创建|工具条 VB外接程序的制做二,在VB中创建您自己工具条和菜单 创建工具条依然需要使用到VBI,只要和VB打交道,必须有它,同时在上篇文章所阐述的菜单项的制做方法是对你现在即将做的工作有用的.有一点你必须知道,无论是创建按钮,还是创建菜单项,他们之间是没有区别的.只是有一些地方有一点点不同而已. 怎样创建工具条呢?非常简单. VBI.CommandBars.Add cbsToolsBarName 此方法后面当然有其它可选参数,但是有些东西对于现在我要阐述的问题是无关的. Func

文件系统扫描的工具类

文件系统扫描的工具类   说明 递归扫描文件夹系统,并以树形结构组织起来 支持沙盒.bundle扫描 支持扫描深度设置 用File对象表示一个扫描出来的文件,File对象包含了一个文件或者文件夹的基本文件信息(如文件名字,是否隐藏,文件扩展名,文件url地址等等),便于后续操作 源码 https://github.com/YouXianMing/iOS-Utilities // // ViewController.m // FileManager // // Created by YouXian

几种优秀的开发ASP的工具

大家好! 今天给大家介绍几种优秀的开发ASP的工具. 1,Microsoft FrontPage:以HTML页面为基础,不但可以对站点进行可视化编程,还可以管理整个网站平台. 2,Macromedia Dreamverver:和FrontPage类似的工具,但更好的支持不同浏览器. 3,Microsoft Visual InterDev:是一个非常强大的WWW设计编辑工具,它支持 Web小组独立开发网页时同时维护一个主版本等功能.

swing开发图形界面工具配置(可自由拖控件上去)

swing开发图形界面工具,eclipse swing图形化操作界面工具配置 1.有一个小功能要有一个界面,之前知道有一个 图形化界面的(就是可以往上面拖控件布局的工具)JBuilder,今天上午就下了一个(1.6GB)好不容易下载完了,最新版本的(没找到老版本的,记得老版本的特好用)安装好之后发现没有swing拖控件的组件 ,还要去下载GUI等等插件(而且还是试用版).太无语JBuilder,还付费 ,果断给卸载了 卸载JBuilder后就不能用图形化界面的功能了吗?答案是有. 2. 中午吃饭

Android手机灭屏的情况下,自己开发的聊天工具如何接受信息提示

问题描述 Android手机灭屏的情况下,自己开发的聊天工具如何接受信息提示 现在的手机厂商都会做深度优化功能,在手机灭屏的时候,第三方的应用会被挂起或者是kill掉. 目前自己做了一个即时通讯聊天的Android App,但是在华为手机上灭屏的时候进程就被挂起了,这样就无法接受到别人发送过来的信息.想请问下大神们有没有什么好的处理方式,让程序在手机灭屏的时候每隔一段时间唤醒一次. 我看华为的手机设置里会为微信支付宝等应用提供定时唤醒的功能,第三方其他应用就没有提供这个定时唤醒的功能.不知道对于

vb opc-如何在VB中开发opc客户端

问题描述 如何在VB中开发opc客户端 前面服务器已经连接成功 Dim WithEvents ConnectedGroup As OPCAutomation.OPCGroup ConnectedOPCServer.OPCGroups.DefaultGroupIsActive = True ConnectedOPCServer.OPCGroups.DefaultGroupDeadband = 40 ConnectedGroup = ConnectedOPCServer.OPCGroups.Add(

c++-C++图形页面开发用什么工具

问题描述 C++图形页面开发用什么工具 我是一个在校大学生,主要学习C/C++语言,我们现在写的程序都是一些控制台应用程序.怎样网上一些一样做出有图形呢?百度了一下,好像有两种Qt和cocos2dx,我想自学一下其中的一个或者其它的,现在企业一般用那种图形库开发呢? 解决方案 Qt:可以支持多种操作系统,包括Windows.Linux.Mac OS.Android.VxWorks等: VS C++.net(MFC):只支持Windows系统: cocos2dx:不了解. 解决方案二: vs201

《例说51单片机(C语言版)(第3版)》——1-5 MCS-51的开发流程与工具

1-5 MCS-51的开发流程与工具 例说51单片机(C语言版)(第3版) 8x51系统的开发流程与一般单片机微控制器的开发流程类似,其基本开发流程可分为软件与硬件两部分,而这两部分可以并行开发.在硬件开发方面,主要是设计原型电路板(prototype),也就是目标板(target board).在软件开发方面,则是编写源程序(可使用C语言或汇编语言),再经过编译.汇编成为可执行码,然后进行调试/仿真.当完成软件设计后,即可应用在线仿真器(In-Circuit Emulator,ICE),加载该