知识大全 VB.NET开发扫描客户端服务工具
Posted 状态
篇首语:枕上从妨一夜睡,灯前读尽十年诗。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 VB.NET开发扫描客户端服务工具相关的知识,希望对你有一定的参考价值。
VB.NET开发扫描客户端服务工具 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在大中型企业信息系统中 对客户端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都可以 本文使用SQL 最后为了呈现出扫描的结果 以便我们采取行动 这里我们使用网页的形式把数据库中的结果展现出来
一 VB NET程序
该程序使用两个XML格式的配置文件 当程序启动时会读入这些配置 其中一个文件定义了需要扫描的网段 包括排除在外的地址段 另一个文件定义了连接数据库的信息 以及数据表的定义 这两个文件的内容如下
<IPLIST>
<IP LANID= ><EXP L= H= /></IP>
<IP LANID= />
<IP LANID= />
<IP LANID= />
<IP LANID= ><EXP L= H= /></IP>
</IPLIST>
该文件定义将要扫描 个网段 其中两个网段有些地址需要排除在外(分配给打印机等设备) 对于 段 我们排除从 到 对于 段我们排除 到
<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 )
If InStr(status Service Control Manager ) = Then
status = Not installed or open service failed 没有安装该服务
ElseIf InStr(er Message Manager ) > 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 HostInfo As New HostInfo(IMachineIP)
Dim HostThr As New Thread(New ThreadStart(AddressOf HostInfo sysInfo))
HostThr Start()
SyncLock GetType(HostInfoThreadCounter)
HostInfoThreadCounter counter += 启动线程数加
End SyncLock
End If
SyncLock GetType(StoppCounter)
StopThr AddStop()
End SyncLock
End Sub
End Class
该类只有一个方法 就是将停止的线程数减
Class StoppCounter
Sub AddStop()
ThreadCounterStopped = ThreadCounterStopped +
End Sub
End Class
此类用于将已有的行插入DataSet
Class AddRow
第一个构造函数 以构造好的行为输入参数
Sub New(ByVal row As DataRow)
Try
ds Tables( ) 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( ) 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 Module
Public ds As New DataSet()
Public conn 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 =
ThreadCounterStopped =
Dim server As String
Dim database As String
Dim uid As String
Dim pwd As String
Dim table As String
Dim connstr connstr 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( )
server = DBinfo ChildNodes( ) InnerText
database = DBinfo ChildNodes( ) InnerText
uid = DBinfo ChildNodes( ) InnerText
pwd = DBinfo ChildNodes( ) InnerText
ServiceName = DBinfo ChildNodes( ) InnerText
table = DBinfo ChildNodes( ) Attributes( ) Value
根据分析所得 构造连接字符串
connstr = server= & server & ;database= & database & ;uid= & uid & ;password= & pwd
conn = New SqlClient SqlConnection(connstr ) 实例化数据库连接
conn Open() 打开数据库连接
Dim sa As SqlClient SqlDataAdapter = New SqlClient SqlDataAdapter( select * from & table conn )
Dim bu As New SqlClient SqlCommandBuilder(sa)
sa Fill(ds table) 填充DataSet
ds Clear() 清空旧的数据
Dim IPAddress As String
分析IP列表文件
iplist = iplistF ChildNodes( )
Dim Ai As Integer
Dim ipexcepCount As Integer
Dim ipexcep As Xml XmlNode
For Each ipitem In iplist ChildNodes
Dim Excep( ) As Integer
LanID = ipitem Attributes( ) Value 得到网络ID
For i = To 从 到 根据每个网络ID构造IP地址
Ai =
以下判断是为了跳过保留地址段
If ipitem HasChildNodes Then
ipexcepCount = ipitem ChildNodes Count
ReDim Excep( ipexcepCount )
For Each ipexcep In ipitem ChildNodes
Excep( Ai) = CInt(ipexcep Attributes( ) Value)
Excep( Ai) = CInt(ipexcep Attributes( ) Value)
Ai = Ai +
Next
End If
For Ai = To ipexcepCount
If i >= Excep( Ai) And i <= Excep( 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 + 启动线程数加
Console WriteLine( 线程 & machineIP & 启动 检测 & ServiceName)
每启动 个线程 程序主线程停止 秒 避免太多线程造成内存溢出
If (ThreadCounterStarted Mod ) = Then
Console WriteLine( 等待 )
Thread CurrentThread Sleep( )
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( ) 以下程序等待所有线程结束
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 As New SqlClient SqlCommand(Purgestr conn )
ExecuteNonQuery() 删除旧记录
sa InsertCommand = bu GetInsertCommand
sa Update(ds table) 将新记录写入数据库
Else
GoTo Finish goto finish and wait another seconds
End If
End Sub
可以利用如下命令在DOS窗口启动该程序
Scanservice –i iplist xml –d dbinfo xml
二 SCANSERVICE 数据库
该数据库保存保存程序运行结果 以便用WEB等方式展现出来 以下是建立表的脚本 包含域名 用户名 机器名 IP以及服务状态
CREATE TABLE [dbo] [Service] (
[IP] [varchar] ( ) NULL
[状态] [varchar] ( ) NULL
[用户名] [varchar] ( ) NULL
[机器名] [varchar] ( ) NULL
[MAC地址] [varchar] ( ) NULL
[域] [varchar] ( ) NULL
[超时] [varchar] ( ) NULL
[时间安] [DateTime] ( ) NULL
)
三 总结
cha138/Article/program/net/201311/14499相关参考
VB.NET与WEB服务器通讯过程详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! WebRe
VB.NET中的组件开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!简介组件其实是一段可以重用的
同Java一样简单!VB.NET多线程开发实例 以下文字资料是由(历史新知网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! VBNET
使用VB.NET开发自定义Windows控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一前
VB.NET分层开发的几点心得 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 从这一章开始我们将
VB.NET中的组件开发源代码剖析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
消息队列在VB.NET数据库开发中的应用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我们先简单
VB.NET菜单设计初级入门[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 可视化编程工具
VB.net编码规范 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在开发中保持良好的编码规范是
在项目开发中充分体会到了一个精简数据存储模块的重要性及实用性在综合了三年开发经验的基础上向各位推介一下sqlite数据库希望更多的程序猿支持开源精神 &n