用VC建立Services服務(wù)應(yīng)用程序.doc_第1頁
用VC建立Services服務(wù)應(yīng)用程序.doc_第2頁
用VC建立Services服務(wù)應(yīng)用程序.doc_第3頁
用VC建立Services服務(wù)應(yīng)用程序.doc_第4頁
用VC建立Services服務(wù)應(yīng)用程序.doc_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

用VC+建立Service服務(wù)應(yīng)用程序 收藏 為什么要使用服務(wù)應(yīng)該程序呢?服務(wù)程序就像系統(tǒng)的一些服務(wù)一樣,能夠自動地啟動,并執(zhí)行相應(yīng)的操作;而且因為服務(wù)程序的在層次上和一般的應(yīng)用程序不同,其能夠在系統(tǒng)啟動時就自動地運行,而不像一般的應(yīng)用程序那樣一定要在登陸后才能運行,這些就是服務(wù)的一些好處了,如果你也想你的程序具有這樣的功能,那么你就可以建立一個服務(wù)應(yīng)用程序了。 下面就跟著我一步一步地教你怎么去創(chuàng)建一個服務(wù)應(yīng)用程序吧。本文主要介紹了OpenSCManager、CreateService、OpenService、ControlService、DeleteService、RegisterServiceCtrlHandler、SetServiceStatus、StartServiceCtrlDispatcher等操作服務(wù)程序的主要幾個API的用法,具體的函數(shù)參數(shù)大家可以查閱MSDN。一、建立Win32 Application應(yīng)用程序(當(dāng)然你也可以建立其它的應(yīng)用程序,但服務(wù)一般是沒有用戶界面的),并命名為ServiceTest。二、定義全局函數(shù)變量/定義全局函數(shù)變量void Init();BOOL IsInstalled();BOOL Install();BOOL Uninstall();void LogEvent(LPCTSTR pszFormat, .);void WINAPI ServiceMain();void WINAPI ServiceStrl(DWORD dwOpcode);TCHAR szServiceName = _T(ServiceTest);BOOL bInstall;SERVICE_STATUS_HANDLE hServiceStatus;SERVICE_STATUS status;DWORD dwThreadID; 三、添加Init初始化函數(shù)這里主要是設(shè)置服務(wù)句柄和狀態(tài)。hServiceStatus = NULL;status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;status.dwCurrentState = SERVICE_STOPPED;tatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;status.dwWin32ExitCode = 0;status.dwServiceSpecificExitCode = 0;status.dwCheckPoint = 0;status.dwWaitHint = 0; 四、添加安裝和刪除服務(wù)函數(shù)這里主要是用到了五個函數(shù)OpenSCManager、CreateService、OpenService、ControlService、DeleteService。OpenSCManager用于打開服務(wù)控制管理器;CreateService用于創(chuàng)建服務(wù);OpenService用于打開已有的服務(wù),返回該服務(wù)的句柄;ControlService則用于控制已打開的服務(wù)狀態(tài),這里是讓服務(wù)停止后才刪除;DeleteService用于刪除指定服務(wù)。BOOL Install();/這里列出主要的兩個函數(shù),其它的可以在代碼里找。/打開服務(wù)控制管理器OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);/創(chuàng)建服務(wù)SC_HANDLE hService = :CreateService(hSCM, szServiceName, szServiceName,SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,szFilePath, NULL, NULL, _T(), NULL, NULL);:CloseServiceHandle(hService);:CloseServiceHandle(hSCM);BOOL Uninstall();/這里列出主要的兩個函數(shù),其它的可以在代碼里找。/打開服務(wù)控制管理器OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);/打開服務(wù)OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);/停止服務(wù)ControlService(hService, SERVICE_CONTROL_STOP, &status);/刪除服務(wù)DeleteService(hService); 五、添加服務(wù)主線程函數(shù)和控制函數(shù)這里調(diào)用RegisterServiceCtrlHandler來注冊服務(wù)的控制函數(shù),這里要設(shè)置status.dwControlsAccepted為SERVICE_ACCEPT_STOP,否則你不能控制這個服務(wù)的狀態(tài)。void WINAPI ServiceMain()/ Register the control request handlerstatus.dwCurrentState = SERVICE_START_PENDING;status.dwControlsAccepted = SERVICE_ACCEPT_STOP;/這個要使用,否則你不能控制/注冊服務(wù)控制hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);if (hServiceStatus = NULL)LogEvent(_T(Handler not installed);return;SetServiceStatus(hServiceStatus, &status);status.dwWin32ExitCode = S_OK;status.dwCheckPoint = 0;status.dwWaitHint = 0;status.dwCurrentState = SERVICE_RUNNING;SetServiceStatus(hServiceStatus, &status);/模擬服務(wù)的運行,10后自動退出。應(yīng)用時將主要任務(wù)放于此即可int i = 0;while (i 10)Sleep(1000);i+;/status.dwCurrentState = SERVICE_STOPPED;SetServiceStatus(hServiceStatus, &status);LogEvent(_T(Service stopped); 六、在主線程函數(shù)里注冊控制函數(shù)和程序執(zhí)行主體void WINAPI ServiceMain()/如上,這里主要是說明這就是程序的執(zhí)行體/模擬服務(wù)的運行,10后自動退出。應(yīng)用時將主要任務(wù)放于此即可int i = 0;while (i 10)Sleep(1000);i+; 七、在main函數(shù)里注冊添加安裝、刪除、注冊主函數(shù)int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)Init();dwThreadID = :GetCurrentThreadId();SERVICE_TABLE_ENTRY st = szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain , NULL, NULL ;if (stricmp(lpCmdLine, /install) = 0)Install();else if (stricmp(lpCmdLine, /uninstall) = 0)Uninstall();elseif (!:StartServiceCtrlDispatcher(st)LogEvent(_T(Register Service Main Function Error!);return 0; 八、總結(jié)其實做一個服務(wù)程序并不難,主要是懂得程序的執(zhí)行體放于哪里?注冊程序的主函數(shù)和注冊控制函數(shù),如果這兩個沒有注冊的話,你的程序就不知道如何去控制了。status.dwControlsAccepted = SERVICE_ACCEPT_STOP;這個也重要,如果你沒有設(shè)置的話,那么服務(wù)就不會受你控制了。組策略編輯器用法如何使用組策略1、組策略編輯器的命令行啟動 您只需單擊選擇“開始”“運行”命令,在“運行”對話框的“打開”欄中輸入“gpedit.msc”,然后單擊“確定”按扭即可啟動Windows XP組策略編輯器。(注:這個“組策略”程序位于“C:WINNTSYSTEM32”中,文件名為“gpedit.msc”。) 當(dāng)多人共用一臺計算機時,在Windows XP中設(shè)置用戶權(quán)限,可以按照以下步驟進行: 1、運行組策略編輯器程序(gpedit.msc)。 2、在編輯器窗口的左側(cè)窗格中逐級展開“計算機配置”“Windows設(shè)置”“安全設(shè)置”“本地策略”“用戶權(quán)限指派”分支。 3、雙擊需要改變的用戶權(quán)限。單擊“增加”,然后雙擊想指派給權(quán)限的用戶帳號。如圖8所示。 連續(xù)兩次單擊“確定”按扭。 在Windows XP中,新增了一條命令行工具“shutdown”,其作用是“關(guān)閉或重新啟動本地或遠程計算機”。利用它,我們不但可以注銷用戶,關(guān)閉或重新啟動計算機,還可以實現(xiàn)定時關(guān)機、遠程關(guān)機。 該命令的語法格式如下: shutdown -i |-l|-s |-r |-a -f -m ComputerName -t xx -c message -d :xx:yy 其中,各參數(shù)的含義為: -i 顯示圖形界面的對話框。 -l 注銷當(dāng)前用戶,這是默認設(shè)置。 -m ComputerName優(yōu)先。 -s 關(guān)閉計算機。 -r 關(guān)閉之后重新啟動。 -a 中止關(guān)閉。除了-l 和ComputerName 外,系統(tǒng)將忽略其它參數(shù)。在超時期間,您只可以使用-a。 -f 強制運行要關(guān)閉的應(yīng)用程序。 -m ComputerName 指定要關(guān)閉的計算機。 -t xx 將用于系統(tǒng)關(guān)閉的定時器設(shè)置為 xx 秒。默認值是20秒。 -c message 指定將在“系統(tǒng)關(guān)閉”窗口中的“消息”區(qū)域顯示的消息。最多可以使用127 個字符。引號中必須包含消息。 -d :xx:yy 列出系統(tǒng)關(guān)閉的原因代碼。 首先,我們來看一下該命令的一些基本用法: 1、注銷當(dāng)前用戶 shutdown - l 該命令只能注銷本機用戶,對遠程計算機不適用。 2、關(guān)閉本地計算機 shutdown - s 3、重啟本地計算機 shutdown - r 4、定時關(guān)機 shutdown - s -t 30 指定在30秒之后自動關(guān)閉計算機。 向組策略安全組添加計算機和用戶無線網(wǎng)絡(luò)策略經(jīng)過配置并且能夠正常工作之后,向控制該策略應(yīng)用程序的安全組中添加其他計算機則非常簡單。 向無線網(wǎng)絡(luò)組策略安全組添加計算機 1. 在“Active Directory 用戶和計算機”中,找到與要應(yīng)用的無線網(wǎng)絡(luò)策略相對應(yīng)的 Wireless Network Policy - Computer 安全組。您必須作為對此組具有“修改成員身份”權(quán)限的用戶進行登錄。 2. 向選定的安全組添加計算機。 向遠程訪問策略安全組添加用戶 1. 登錄到管理計算機,要求作為 Domain Administrators 組成員登錄,或者使用具有修改 Remote Access Policy - Wireless Users 安全組成員身份所需的安全權(quán)限的其他帳戶登錄。 2. 在“Active Directory 用戶和計算機”中,找到與控制無線 LAN 訪問的遠程訪問策略相對應(yīng)的 Remote Access Policy - Wireless Users 安全組。 3. 將用戶添加到選定的安全組。 將計算機添加到遠程訪問策略安全組 1. 登錄到管理計算機上,要求作為 Domain Administrators 組成員登錄,或者使用具有修改 Remote Access Policy - Wireless Computers 安全組成員身份所需的安全權(quán)限的其他帳戶登錄。 2. 在“Active Directory 用戶和計算機”中,找到與控制無線 LAN 訪問的遠程訪問策略相對應(yīng)的 Remote Access Policy - Wireless Users 安全組。 3. 向選定的安全組中添加計算機。 下面是針對2003的將組策略應(yīng)用于組織單位或域 1. 依次單擊“開始”、“管理工具”、“Active Directory 用戶和計算機”,打開“Active Directory 用戶和計算機”。 2. 突出顯示相關(guān)域或組織單位,單擊“操作”菜單,選擇“屬性”。 3. 選擇“組策略”選項卡。 注意:每個容器可應(yīng)用多個策略。這些策略的處理順序是從列表的底部向上。如果出現(xiàn)沖突,最后應(yīng)用的策略優(yōu)先。 4. 單擊“新建”創(chuàng)建一個策略,并為其指定有實際意義的名稱,如“域策略”。 注意:單擊“選項”按鈕可配置“禁止替代”設(shè)置?!敖固娲笔菫槊總€單獨的策略配置的,而不是為整個容器;“阻止策略繼承”則是為整個容器配置的。如果“禁止替代”和“阻止策略繼承”設(shè)置發(fā)生沖突,“禁止替代”設(shè)置優(yōu)先。要配置“阻止策略繼承”,請選中 OU 屬性中的復(fù)選框。 組策略可自動更新,但為了立即啟動更新過程,可在命令提示符下使用下面的 GPUpdate 命令: GPUpdate /force 向“用戶權(quán)限分配”添加安全組 1. 依次單擊“開始”、“管理工具”、“Active Directory 用戶和計算機”,打開“Active Directory 用戶和計算機”。 2. 突出顯示相關(guān) OU(如“成員服務(wù)器”),單擊“操作”菜單,選擇“屬性”。 3. 單擊“組策略”選項卡,選擇相關(guān)策略(如“成員服務(wù)器基準策略”),然后單擊“編輯”。 4. 在“組策略對象編輯器”中,依次展開“計算機配置”、“Windows 設(shè)置”、“安全設(shè)置”、“本地策略”,然后突出顯示“用戶權(quán)限分配”。 5. 在右側(cè)窗格中,右鍵單擊相關(guān)用戶權(quán)限。 6. 選中“定義這些策略設(shè)置”復(fù)選框,單擊“添加用戶和組”修改該列表。 7. 單擊“確定”。 將安全模板導(dǎo)入組策略 導(dǎo)入安全模板 1. 依次單擊“開始”、“管理工具”、“Active Directory 用戶和計算機”,打開“Active Directory 用戶和計算機”。 2. 突出顯示相關(guān)域或 OU,單擊“操作”菜單,選擇“屬性”。 3. 選擇“組策略”選項卡。 4. 突出顯示相關(guān)策略,單擊“編輯”。 5. 依次展開“計算機配置”、“Windows 設(shè)置”,然后突出顯示“安全設(shè)置”。 6. 單擊“操作”菜單,選擇“導(dǎo)入策略”。 7. 導(dǎo)航到 Security GuideJob Aids,選擇相關(guān)模板,單擊“打開”。 8. 在“組策略對象編輯器”中,單擊“文件”菜單,選擇“退出”。 9. 在容器屬性中,單擊“確定”。 使用“安全配置和分析” 導(dǎo)入安全模板 1. 依次單擊“開始”、“運行”。在“打開”文本框中鍵入 mmc,然后單擊“確定”。 2. 在 Microsoft 管理控制臺中,單擊“文件”,選擇“添加/刪除管理單元”。 3. 單擊“添加”,突出顯示列表中的“安全配置和分析”。 4. 依次單擊“添加”、“關(guān)閉”、“確定”。 5. 突出顯示“安全配置和分析”,單擊“操作”菜單,選擇“打開數(shù)據(jù)庫”。 6. 鍵入新的數(shù)據(jù)庫名稱(如 Bastion Host),單擊“打開”。 7. 在“導(dǎo)入模板”界面中,導(dǎo)航到 Security GuideJob Aids,選擇相關(guān)模板。單擊“打開”。 分析導(dǎo)入的模板并與當(dāng)前設(shè)置比較 1. 突出顯示 Microsoft 管理單元中的“安全配置和分析”,單擊“操作”菜單,并選擇“立即分析計算機”。 2. 單擊“確定”,接受默認的“錯誤日志文件路徑”。 3. 完成分析后,展開節(jié)點標(biāo)題對結(jié)果進行研究。 應(yīng)用安全模板 1. 突出顯示 Microsoft 管理單元中的“安全配置和分析”,單擊“操作”菜單,選擇“立即配置計算機”。 2. 單擊“確定”,接受默認的“錯誤日志文件路徑”。 3. 在 Microsoft 管理控制臺,單擊“文件”,然后選擇“退出”關(guān)閉“安全配置和分析”。VC/MFC 實現(xiàn)禁止,停止,啟動,創(chuàng)建NT服務(wù)The CreateService function creates a service object and adds it to the specified service control manager database. SC_HANDLE CreateService( SC_HANDLE hSCManager, LPCTSTR lpServiceName, LPCTSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType, DWORD dwStartType, DWORD dwErrorControl, LPCTSTR lpBinaryPathName, LPCTSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCTSTR lpDependencies, LPCTSTR lpServiceStartName, LPCTSTR lpPassword ); The DeleteService function marks the specified service for deletion from the service control manager database. BOOL DeleteService( SC_HANDLE hService ); Installing a Service A service configuration program uses the CreateService function to install a service in a SCM database. The application-defined schSCManager handle must have SC_MANAGER_CREATE_SERVICE access to the SCManager object. The following example shows how to install a service. VOID CreateSampleService() LPCTSTR lpszBinaryPathName = %SystemRoot%systemtestserv.exe ; schService = CreateService( schSCManager, / SCManager database Sample_Srv , / name of service lpszDisplayName, / service name to display SERVICE_ALL_ACCESS, / desired access SERVICE_WIN32_OWN_PROCESS, / service type SERVICE_DEMAND_START, / start type SERVICE_ERROR_NORMAL, / error control type lpszBinaryPathName, / service s binary NULL, / no load ordering group NULL, / no tag identifier NULL, / no dependencies NULL, / LocalSystem account NULL); / no password if (schService = NULL) MyErrorExit( CreateService ); else printf( CreateService SUCCESS.n ); CloseServiceHandle(schService); ControlService The ControlService function sends a control code to a service. BOOL ControlService( SC_HANDLE hService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus );Stopping a Service A service can be stopped with the ControlService function by sending a SERVICE_CONTROL_STOP request. If the SCM receives a SERVICE_CONTROL_STOP request for a service, it instructs the service to stop by forwarding the request to the service s ServiceMain function. However, if the SCM determines that other running services are dependent on the specified service, it will not forward the stop request. Instead, it returns ERROR_DEPENDENT_SERVICES_RUNNING. Therefore, to programmatically stop such a service, you must first enumerate and stop its dependent services. The following code implements a StopService function, which optionally attempts to stop the specified service s dependent services. #include #include #include / This function attempts to stop a service. It allows the caller to / specify whether dependent services should also be stopped. It also / accepts a timeout value, to prevent a scenario in which a service / shutdown hangs, then the application stopping the service hangs. / / Parameters: / hSCM - Handle to the service control manager. / hService - Handle to the service to be stopped. / fStopDependencies - Indicates whether to stop dependent services. / dwTimeout - maximum time (in milliseconds) to wait / / If the operation is successful, returns ERROR_SUCCESS. Otherwise, / returns a system error code. DWORD StopService( SC_HANDLE hSCM, SC_HANDLE hService, BOOL fStopDependencies, DWORD dwTimeout ) SERVICE_STATUS ss; DWORD dwStartTime = GetTickCount(); / Make sure the service is not already stopped if ( !QueryServiceStatus( hService, &ss ) ) return GetLastError(); if ( ss.dwCurrentState = SERVICE_STOPPED ) return ERROR_SUCCESS; / If a stop is pending, just wait for it while ( ss.dwCurrentState = SERVICE_STOP_PENDING ) Sleep( ss.dwWaitHint ); if ( !QueryServiceStatus( hService, &ss ) ) return GetLastError(); if ( ss.dwCurrentState = SERVICE_STOPPED ) return ERROR_SUCCESS; if ( GetTickCount() - dwStartTime dwTimeout ) return ERROR_TIMEOUT; / If the service is running, dependencies must be stopped first if ( fStopDependencies ) DWORD i; DWORD dwBytesNeeded; DWORD dwCount; LPENUM_SERVICE_STATUS lpDependencies = NULL; ENUM_SERVICE_STATUS ess; SC_HANDLE hDepService; / Pass a zero-length buffer to get the required buffer size if ( EnumDependentServices( hService, SERVICE_ACTIVE, lpDependencies, 0, &dwBytesNeeded, &dwCount ) ) / If the Enum call succeeds, then there are no dependent / services so do nothing else if ( GetLastError() != ERROR_MORE_DATA ) return GetLastError(); / Unexpected error / Allocate a buffer for the dependencies lpDependencies = (LPENUM_SERVICE_STATUS) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytesNeeded ); if ( !lpDependencies ) return GetLastError(); _try / Enumerate the dependencies if ( !EnumDependentServices( hService, SERVICE_ACTIVE, lpDependencies, dwBytesNeeded, &dwBytesNeeded, &dwCount ) ) return GetLastError(); for ( i = 0; i dwTimeout ) return E

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論