分享
 
 
 

扫描网络中电脑特定服务的方法

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

在目前的企业信息系统中,对客户端PC的管理,往往是容易出现问题的环节。因此,很多大公司引入了各种分布式的管理系统,例如防病毒方面的Norton AntiVirus Cooperation Editio

n,微软的 SMS (System Management Server),等等,这些系统都会在客户端的系统安装相应的客户端软件,一般都是以Service的形式出现,但是由于种种原因,这些Service会停止运行或者该客户机根本没有安装这些Service,这样管理系统就出现了疏漏,有可能造成问题,如因无法防御病毒而成为病毒源,无法为该客户端发布软件,无法管理客户PC等等。在此,我们提供一个方案,可以定时扫描网络,报告出那些系统的特定的Service出现了问题。

这个方案使用了Microsoft.NET技术,包括自由线程,类,事件等,同时也用到了.NET Framework中的,ADO.NET ,WMI management,XML,WQL等。其核心是一个由VB.NET写的程序以及它的两个配置文件,配置文件为XML格式,该程序按IP扫描网络,得到每个系统的Service 的状态。其次为了保存扫描的结果,我们需要一个很小的数据库MS-Access或MS-SQL server都可以,本文使用SQL2000 ,我们称为SCANSERVICE数据库。最后为了呈现出扫描的结果,以便我们采取行动,这里我们使用网页的形式把数据库中的结果展现出来。

1. ScanService程序

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

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

DBServer

DB

REPORT

REPORT

Norton AntiVirus Server

SMSServer

Res

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

另外,因为我们除了IP和Service的状态外,还需要知道客户机的名称,操作系统和登陆用户的名字,所以需要从SMS Server的数据库里得到相应信息。如果没有实施SMS系统的话,请忽略这些信息,可以用“NBTSTAT ?A ip”命令手工得到机器名字和用户信息。以下是每个TAG的含义。

SCANSERVICE数据库的服务器名

SCANSERVICE数据库名

用于更新SCANSERVICE数据库的数据库用户名

用于更新SCANSERVICE数据库的数据库用户的密码

该TAG的 inner 定义了我们希望扫描的Service的名字,这里我们希望扫描” Norton AntiVirus Server”

该TAG的属性定义了数据库中表名,该表用于保存扫描结果。

SMS服务器名

数据库中表名,该表用于保存从SMS数据库中得到的系统信息。

‘以下是程序的代码

‘首先我们定义一个类,主要用于得到某个IP地址的Service的状态信息。

Imports System.ServiceProcess ‘包含ServiceController的类

Imports System.Xml

Imports System.Management ‘

Public Class GetStatus

Private IServiceName As String ‘内部变量,服务明

Private IMachineIP As String ‘内部变量,IP地址

Private ITable As String ‘内部变量,表明

Event RowAdded(ByVal IPA As String)

‘利用构造器得到IP地址,需要扫描的服务名和需要更新信息的表名

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

IMachineIP = Ip

IServiceName = SvcName

ITable = updatetable

End Sub

‘该方法利用.NET Framework中的ServiceController类探测系统的某种服务的状态

Sub GetStausF() ' Get services status and update dataset

Dim ServiceP As New ServiceController()

ServiceP.MachineName = ImachineIP ‘IP地址信息

ServiceP.ServiceName = IserviceName ‘服务名

Dim myRow As DataRow

myRow = ds.Tables(ITable).NewRow

Try

If ServiceP.Status.ToString "Running" Then ‘如果Service的状态正常,我们忽略它,只记录不正常状态

myRow("msg") = ServiceP.Status.ToString

myRow("ip") = IMachineIP

SyncLock ds.Tables(ITable).Rows.SyncRoot ‘在多线程情况下访问DATATABLE类需要同步

ds.Tables(ITable).Rows.Add(myRow) ‘讲不正常的状态更新到DataSet中的表中

End SyncLock

Else

Exit Try ‘如果状态正常,退出

End If

'myRow("msg") = ServiceP.Status.ToString

Catch er As Exception ‘处理异常状况,包括得不到状态,服务没有安装,服务停止等

myRow("msg") = Left(er.Message, 35) ‘异常状况的前35的字符对于我们是有意义的

myRow("ip") = IMachineIP

SyncLock ds.Tables(ITable).Rows.SyncRoot

ds.Tables(ITable).Rows.SyncRoot.add(myRow) ‘记录异常状态

If InStr(er.Message, "Manager") 0 Then

RaiseEvent RowAdded(IMachineIP) ‘如果得不到状态,我们进一步判断是否为空地址,即PING timeout

End If

End SyncLock

End Try

ServiceP.Close() ‘关闭ServiceController,释放资源

End Sub

End Class

Class SysInfo‘该类作用是从SMS数据库中取出系统信息,如果没有实施SMS,该类将被忽略

Private smsserver, ScanResTable As String

Private da As SqlClient.SqlDataAdapter

‘简便期间,使用构造器得到SMS服务器名,用于存放取出得信息的SCANSERVICE数据库中的表名,还有SQL DataAdapter

Sub New(ByVal Esmsserver As String, ByVal EScanResTable As String, ByVal Eda As SqlClient.SqlDataAdapter)

smsserver = Esmsserver

ScanResTable = EScanResTable

da = Eda

End Sub

Sub UpdateDB() ‘该方法更新数据库

Dim ManObj As New ManagementObject()

Dim Coll As ManagementObjectCollection

‘ 以下定义了WQL语句用于从SMS数据库中得到用户名,机器名,操作系统和IP

Dim que As New ObjectQuery("select LastLogonUserName, Name, OperatingSystemNameandVersion, IPAddresses from SMS_R_System")

Dim scop As New ManagementScope("\" & smsserver & "

ootsmssitecode")

Dim Searcher As New ManagementObjectSearcher(que)

Dim row As DataRow

Dim combu1 As New SqlClient.SqlCommandBuilder(da)

Searcher.Scope = scop

Coll = Searcher.Get

SyncLock Coll.SyncRoot

For Each ManObj In Coll

Dim IPs As String()

‘将SMS中得到的信息,存取离线的数据表中

row = ds.Tables(ScanResTable).NewRow()

row.Item("LastUID") = ManObj("LastLogonUserName")

row.Item("Name") = ManObj("Name")

row.Item("OS") = ManObj("OperatingSystemNameandVersion")

IPs = ManObj("IPAddresses")

row.Item("IP") = IPs(0)

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

Console.WriteLine("Process system info of " & IPs(0) & "from SMS to scan DB")

Next

End SyncLock

da.InsertCommand = combu1.GetInsertCommand

da.Update(ds, ScanResTable)

Console.WriteLine("Resource table updated")

End Sub

End Class

‘以下为主程序代码

Imports System.Threading

Imports System.Xml

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有