亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何利用VB編寫NT服務程序

2019-11-18 17:51:57
字體:
來源:轉載
供稿:網友

一、NT服務程序
所謂NT服務,實際上就是一個可以在系統啟動時自動在一定身份下啟動的伴隨系統長時間存在的進程。象FTPserver、HTTPserver、脫機打印等都是采用NT服務的形式提供的。這實際上類似Unix的rootdaemon進程。NT服務歸納起來,NT服務又以下幾個特征:

1、可以自啟動,不需要交互啟動。這對于服務器來說是一個重要的特征。當然,你可以決定服務是否自啟動,甚至可以屏蔽某個服務。
2、NT服務沒有用戶界面,基本上類似一個DOS程序,因為NT服務必須長時間運行,所以不想普通win32進程一樣有自己的界面。但是NT服務可以同用戶有界面交互,這是一類特殊的服務進程??梢酝ㄟ^NT的任務管理器來看到服務進程。
3、NT服務通過SCM(ServicesControlManager)接口來管理,安裝、啟動、停止、撤除等都需要SCM的接口功能來進行。控制面板的服務控制器就是利用SCM接口來管理系統中的所有服務的。實際上,還有一些可以控制服務的程序或者命令,有net.exe、服務器管理器等、SCM.exe等。
4、這些進程都以一定的身份運行,以方便進行服務器資源的存取。一般情況下使用域中的LocalSystem賬號運行,此賬號對本機上的大多數資源(除非特別禁止)有完全的存取權限,這樣可以保證服務程序的“強大”。但是,也有些服務采用特別的賬號運行,你也可以特別設定一個服務的帳號。
5、由系統自動以線程方式運行,一般情況下不過多占用系統資源,這同普通的進程有所區別,如果不采用線程方式,一般進程往往消耗整個CPU資源。一般需要時時存在,又不能過多消耗資源的任務以服務來實現最合適。

二、服務控件
一般認為編寫NT服務需要使用C/C 來實現,VC6利用ATL向導來提供一個基本的服務框架。具體實現步驟為:FileàNew…àATLCOMAppWizardàserviceàFinish.但是使用VC編寫NT服務需要編寫太多的代碼,這也意味著需要太多的調試、維護。實際上,NT服務不是必須由C/C 才可以編寫的,實際上可以由任何能夠實現上一節幾個特點的任何語言實現,包括VB。

VB編寫服務有那些好處呢,至少可以列出以下幾條:

1、編碼簡單,熟悉Vb語法的任何人理解本文后都可編寫。
2、意味著修改服務實現的邏輯簡單,維護簡單。
3、可以利用幾乎大多數的Vb中的組件功能,編寫一個強大的服務,譬如ado等,如果用VC來實現,相信任何人都會發怵。
4、(牽強一點)可以證明Vb在Bill的天空下是多么強大。
那么,Vb如何實現NT服務編寫呢?據我所至,至少有兩種途徑:

1、按照C/C 的思路利用WinAPI來實現。

2、利用組件按照Vb傳統方式實現。

如果利用方法1實際上是照搬C/C 的套路,如果有更好的路子可以實現,相信任何人都不會走這條“絕路”,因為相對于其他語言來說這種編程完全喪失了Vb自身得特點同時也沒有獲得其他語言的任何優勢。在這里,想告訴大家的是利用OCX來實現一個服務。如果您在MSDN中搜索Samples/msdn/techart/4920/,您可以看到一個已經編寫好的vc5的工程文件。編譯這個工程實際上會得到一個ntsvc.ocx的。如果您對C/C 不熟悉,可以從http://www.mywebtech.net/download/ntsvc.zip下載一個ntsvc.ocx,此OCX是我從backoffice碟中獲得的,將其拷貝到/winnt/system32/下,利用regsvr32ntsvc.ocx命令注冊之。這樣,您的Vb就可以從PRoject/components…引出的對話框列表中看到名為“MicrosoftNTServiceControl”項。此組件擁有我們創建一個服務的基本的功能,如果要編寫一個NT服務,我們將其拖進我們的窗體,然后設定其屬性,調用其與系統、注冊表、SCM交互的功能就可以實現完成一個服務了。

我們首先了解這個組件的屬性,并向大家解釋這些屬性的用法:
AccountString,賬號屬性,即本NT服務在哪一個NT域賬號下運行,缺省是LocalSystem賬號,實際上大多數的NT服務都可以在此賬號下安全圓滿的運行。
ControlsAcceptedLong,此服務接受那些SCM控制,為以下值:
0允許Start以及Stop.

2允許Pause以及Continue.

4允許shutdown。

其他值,用戶自定義的某些事件.
利用這個屬性,您可以自己決定NT服務進程某個(譬如某個不可中斷操作)時刻是否允許SCM停止、暫停、啟動等操作。
DependenciesString,如果您編寫的服務依賴于某個或者某些服務才能正常運行,您必須在注冊服務時指定依賴的服務列表。Dependencies按照依賴順序以chr(0)來分隔多個服務,最后必須以兩個chr(0)結束。(大家可以看到這是一個C/C 的存在痕跡)
DisplayNameString,顯示名,NT服務以何種名字顯示給察看者。
InteractiveBoolean,是否允許有同桌面用戶有交互的部分。
LoadOrderGroupString,同Dependencies相關,決定如果本服務啟動之前,那些服務必須啟動,格式也類似,也以chr(0)分割,連續的兩個chr(0)結尾。
PassWordString,服務啟動的口令,如果使用缺省得賬號,就沒有必要設定服務啟動的帳號。
ServiceNameString,服務名,如果使用net.exe來控制服務,net.exe的指定那一個服務的參數就是此屬性中的字符串。
StartMode枚舉型,具體為:
vcStartAutomatic2服務可以自己啟動

svcStartManual3服務手動啟動

svcStartDisabled4服務不能自啟動
另外有一個Debug屬性,不做討論。

我們要將一個VB程序當作一個NT服務,必須向系統作一些“申請”,而相應的工作VB是無法很好的完成的。所以,NTSVC.ocx提供了相應的方法留作我們想系統傳遞相關信息。
Install,將當前Vb程序安裝成NT服務,在此之前,您必須至少設置DisplayName,ServiceName,ControlsAccepted以及StartMode等屬性。除此之外您可能還要設置Account、Password、LoadOrderGroup、Dependencies等。這些信息的設置正確與否,決定您的服務程序能否正常啟動運行。
Uninstall,將當前NTSVC.ocx指定的服務從系統注冊表中刪除。NT服務取決于系統服務注冊表的設定,這是一個眾所周知的秘密。
StartService,將指定的服務啟動,如果該服務注冊了。
StopService,停止服務,如果服務正在運行。
LogEvent,記錄服務事件。服務運行中,可能發生錯誤以及意料不到的事件,這些可以通過此方法記錄下來,供管理員通過“事件察看器”察看相關的信息,以最優化服務。此方法有三個參數event,id,message.Event指發生的事件類型,可以設為以下值:
svcEventError1錯誤事件
svcEventWarning2警告事件.
svcEventInformation4提供參考信息.

svcEventAuditSuccess8審計成功.

svcEventAuditFailure10審計失敗
除了以上方法,可能用戶還需要讀寫注冊表,此控件還提供了注冊表的訪問方法:
DeleteSetting(section[,key])
GetAllSettings(section)
GetSetting(section,key[,default])
SaveSetting(section,key,setting).

三、編寫服務
了解以上內容,下面我們開始來設計一個服務,通過例子,讓大家理解如何在VB中編寫服務.
在此之前,我們決定寫一個什么樣的服務。我參考C Build中的一個例子,寫一個不斷報警的服務進程。該進程啟動后在后臺不斷間隔5秒發出Beep叫,這可以讓大家更深切知道此服務的存在,雖然有些令人討厭。服務的名字為VBBeepSVC,在SCM中顯示為TheVBNTSVCView。
跟著我一起來吧!
1、創建工程,設定相關使用到的控件。
所有的Vb的控件必須有一個Form作為載體,所以,首先我們創建一個標準工程,選擇菜單project—>Components…,然后選?。∕icrosoftNTServiceControl),會在Toolbar中出現NT服務控件。再拖一個Timer控件到Form上。然后保存一下。基本上,創建過程完成。
2、設定控件屬性。
選中NtSvc.ocx實例,在屬性欄中設定:DisplayName:TheVBNTSVCView,ServiceName:VBBeepSVC,StartMode:3(手動啟動服務).其他的就缺省吧。
由于我們希望每個5秒就beep一次,所以我們必須依靠一種定時機制來實現,所以我們將timer的Interval設定位5000毫秒。
以上屬性的設定視您的需要而定,我只是說在我的VBBeepSVC中如此設定足夠了。
3、編寫代碼,實現服務邏輯以及服務安裝、撤除。
因為服務程序實際上是一個Exe文件,并且需要自己解決安裝、撤除問題,因此需要在此程序中加入利用NT服務控件來實現安裝、撤除問題。那么,應當在什么時候進行了。VB程序啟動時正時Form裝載的時候,所以,我們需要在窗體的Load事件中加入一些代碼:
OnErrorGoToErr_Load‘如果出現錯誤就紀錄以供參考
DimstrDisplayNameAsString
strDisplayName=NTService1.DisplayName
IfCommand="-install"Then‘當啟動時帶上–install的參數時
NTService1.Interactive=True
IfNTService1.InstallThen
CallNTService1.SaveSetting("Parameters","TimerInterval","1000")‘系統參數存儲
MsgBoxstrDisplayName&"安裝成功!"
Else
MsgBoxstrDisplayName&"安裝失敗"
EndIf
End‘終止安裝
Else
IfCommand="-uninstall"Then‘如果啟動時帶上撤除參數
IfNTService1.UninstallThen
MsgBoxstrDisplayName&"撤除成功"
Else
MsgBoxstrDisplayName&"撤除失敗"
EndIf
End‘終止撤除
Else
EndIf
EndIf
‘假若不是安裝或撤除操作,即為啟動服務
Timer1.Interval=CInt(NTService1.GetSetting("Parameters","TimerInterval","2000"))
‘使用Timer控件來模擬服務的線程特性
NTService1.ControlsAccepted=svcCtrlPauseContinue‘接受暫停、停止操作,意味著需要為此編碼
NTService1.StartService‘設置好參數后啟動服務
Err_Load:
CallNTService1.LogEvent(svcMessageError,svcEventError,"["&Err.Number&"]"&Err.Description)‘svcMessageError為NT服務控件的錯誤值
4、添加控制服務的代碼。
盡管服務的連續線程等特性是依賴Timer實現的,但是服務的控制卻是有SCM接口向每一個服務發出的,表現在VB服務程序中為NT服務控件捕獲到相關的事件發生,我們就應當在這些事件中根據具體的情況響應,決定能不能、如何控制服務邏輯。當然,具體的邏輯在Timer事件中表現,但是通過改變NT服務控件和Timer控件均支持的全局變量,可以實現控制服務的邏輯實現。具體代碼演示:
PrivateSubNTService1_Control(ByValEventIDAsLong)
OnErrorGoToErr_Control
‘在此加入一些自己的處理邏輯,當然也可以如本例一樣空缺
Err_Control:
CallNTService1.LogEvent(svcMessageError,svcEventError,"["&Err.Number&"]"&Err.Description)‘紀錄
EndSub
PrivateSubNTService1_Pause(SuccessAsBoolean)
OnErrorGoToErr_Pause
Timer1.Enabled=False‘禁止Timer事件,因此也停止了服務的發生
CallNTService1.LogEvent(svcEventError,svcMessageError,"Servicepaused")
Success=True‘返回給SCM命令發出者,表示服務成功停止
Err_Pause:
CallNTService1.LogEvent(svcMessageError,svcEventError,"["&Err.Number&"]"&Err.Description)
EndSub
PrivateSubNTService1_Start(SuccessAsBoolean)
OnErrorGoToErr_Start
Success=True
Timer1.Enabled=True‘允許服務邏輯進行
Err_Start:
CallNTService1.LogEvent(svcMessageError,svcEventError,"["&Err.Number&"]"&Err.Description)
EndSub
PrivateSubNTService1_Stop()
OnErrorGoToErr_Stop
UnloadMe‘撤除Form,自然Timer也不存在,服務邏輯停止了

Err_Stop:
CallNTService1.LogEvent(svcMessageError,svcEventError,"["&Err.Number&"]"&Err.Description)
EndSub
5、編寫服務邏輯。
具體就是在Timer事件中,根據約定寫一些服務細節。本例中就是發出Been,但是考慮到對SCM命令的響應,所以需要編碼為:
OnErrorGoToErr_Timer
Beep‘此處即具體的服務細節
Err_Timer:
CallNTService1.LogEvent(svcMessageError,svcEventError,"["&Err.Number&"]"&Err.Description)
EndSub
6、編譯安裝、測試
如果以上沒有什么錯誤的話,現在可以編譯程序了。假設我們得到的服務程序的文件名為:VBBeepSVC.exe,我們需要通過以下命令進行安裝:
d:/vbprog/>VBBeepSVC–install
如果需要撤除已經安裝的服務,則:
d:/vbprog/>VBBeepSVC–uninstall
安裝完后,打開控制面板的“服務”(win2000中在“管理工具”),好了,看到其中的NT服務列表中包含我們加入的服務,顯示為:“TheVBNTSVCView”,我們可以類似啟動其他任何服務一樣啟動、停止、暫停此服務。啟動服務時,我們會聽到服務發出的討厭的beep聲音。我們的測試完成。

四、VB編寫服務的幾個說明:
1、首先聲明:VB編寫服務是一種嘗試,技術研究,并非提倡所有服務都要用VB寫才對頭。同理,也說明了服務非VC寫不可。
2、VB寫的服務僅適合win32服務,不適合NT底層服務。
3、VB的優勢在ActiveX控件,NT服務中我們可以使用絕大多數控件來完成我們的服務邏輯,譬如涉及數據庫操作,我們可以使用ADO組件,這方面,同VC相比,VB具有天然的優勢。
4、做好服務內部的錯誤事件記載,只有用好這一點,才能夠真正符合服務編寫規范,也方便我們的除錯。
5、最后一點,本文僅供參考,如有錯誤以及錯誤引起的后果,本人概不負責.
->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97国产精品免费视频| 亚洲色图35p| 亚洲韩国日本中文字幕| 亚洲区免费影片| 日韩欧美中文字幕在线播放| 久久理论片午夜琪琪电影网| 日韩在线观看免费| 亚洲黄在线观看| 午夜剧场成人观在线视频免费观看| 亚洲精品短视频| 97精品久久久中文字幕免费| 91麻豆国产语对白在线观看| 国产精品极品在线| 国产99久久久欧美黑人| 亚洲国产欧美一区二区丝袜黑人| 国产精品自拍偷拍视频| 久热99视频在线观看| 久久久久一本一区二区青青蜜月| 上原亚衣av一区二区三区| 国产亚洲欧美另类中文| 久久久久久中文| 欧美日韩国产成人在线| 亚洲精品美女在线观看| 91在线观看免费网站| 国产99久久久欧美黑人| 久久久久久av| 成人精品aaaa网站| 日韩视频免费看| 国产成人av网| 8050国产精品久久久久久| 日本欧美中文字幕| 国产精品丝袜白浆摸在线| 亚洲国产一区二区三区四区| 亚洲精品成a人在线观看| 国产精品露脸自拍| 伊是香蕉大人久久| 精品夜色国产国偷在线| 久久久免费观看视频| 一本一道久久a久久精品逆3p| 国产区精品在线观看| 国产欧美日韩视频| 国产精品电影久久久久电影网| 成人黄色av播放免费| 亚洲精品自拍偷拍| 狠狠爱在线视频一区| 国产一区二中文字幕在线看| 懂色av中文一区二区三区天美| 国产精品日韩在线一区| 日韩在线资源网| 狠狠躁夜夜躁久久躁别揉| 国产97在线观看| 国产精品入口尤物| 精品久久久久久久久久国产| 久久久久一本一区二区青青蜜月| 亚洲最大激情中文字幕| 欧美孕妇性xx| 91欧美日韩一区| 91经典在线视频| 亚洲国产精品一区二区三区| 最新国产精品亚洲| 国语自产精品视频在线看抢先版图片| 伊人久久久久久久久久久久久| 中文字幕av一区二区三区谷原希美| 午夜欧美大片免费观看| 福利一区福利二区微拍刺激| 高清欧美一区二区三区| 欧美另类在线播放| 亚洲女人初尝黑人巨大| 成人黄在线观看| 日韩精品中文字幕视频在线| 欧美亚洲第一区| 久久精品中文字幕一区| 久久影院免费观看| 亚洲最大的成人网| 成人网在线免费看| 88国产精品欧美一区二区三区| 亚洲欧美一区二区三区四区| 久久久精品视频成人| 国产精品美乳一区二区免费| 中文在线资源观看视频网站免费不卡| 久久成人免费视频| 欧美另类老女人| 色综合久久久久久中文网| 国产丝袜一区二区三区免费视频| 久久亚洲精品国产亚洲老地址| 国产自摸综合网| 亚洲国产成人91精品| 国产精品免费看久久久香蕉| 日韩国产在线看| 亚洲精品电影在线| 黑人巨大精品欧美一区免费视频| 亚洲精品福利视频| 色阁综合伊人av| 欧美午夜宅男影院在线观看| 亚洲日韩中文字幕在线播放| 成人亚洲欧美一区二区三区| 国产精品99久久久久久人| 色先锋资源久久综合5566| 国模精品一区二区三区色天香| 亚洲福利精品在线| 欧美成人激情视频| 日本在线观看天堂男亚洲| 97国产精品免费视频| 日韩精品视频观看| 欧美午夜精品久久久久久人妖| 欧美裸身视频免费观看| 欧洲亚洲在线视频| 欧美高清视频一区二区| 成人在线一区二区| 国产精品99久久99久久久二8| 欧美激情在线有限公司| 欧美三级欧美成人高清www| 日本道色综合久久影院| 91禁国产网站| 91久久精品国产91久久性色| 亚洲精品永久免费| 国产精品久久久久久久久免费| 国产va免费精品高清在线观看| 成人av番号网| 欧美黑人视频一区| 国产精品久久久久久av福利软件| 成人性教育视频在线观看| 国产suv精品一区二区| 欧美香蕉大胸在线视频观看| 狠狠躁夜夜躁人人爽天天天天97| 欧美人在线视频| 国产盗摄xxxx视频xxx69| 国产噜噜噜噜久久久久久久久| 国产精品都在这里| 91久久嫩草影院一区二区| 国产精品久久久久久久久久三级| 中文字幕精品一区久久久久| 欧美另类极品videosbestfree| 91精品久久久久久久久| 精品久久久久久国产91| 国产精品wwww| 在线观看国产精品91| 另类图片亚洲另类| 国产噜噜噜噜久久久久久久久| 91在线播放国产| 国产日韩欧美在线视频观看| 欧美巨猛xxxx猛交黑人97人| 亚洲小视频在线观看| 91久久国产婷婷一区二区| 中日韩午夜理伦电影免费| 亚洲xxxx在线| 少妇激情综合网| 亚洲成年人在线播放| 91亚洲精品久久久久久久久久久久| 亚洲精品影视在线观看| 精品呦交小u女在线| 亚洲一区二区在线| 国产成人av在线| 久久精品国亚洲| 亚洲福利在线播放| 亚洲最大福利视频网站| 亚洲999一在线观看www| 欧美成人免费全部观看天天性色| 热99精品只有里视频精品| 一区二区在线免费视频| 日韩在线激情视频| 欧美二区在线播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久中文字幕视频|