當(dāng)前位置:
首頁 >
【Windows】Windows Restart Manager 重启管理器
發(fā)布時(shí)間:2025/5/22
38
豆豆
生活随笔
收集整理的這篇文章主要介紹了
【Windows】Windows Restart Manager 重启管理器
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Restart Manager(以下簡稱RM)可以減少或避免安裝或更新程序所需要的系統(tǒng)重啟次數(shù)。安裝(或更新)過程中需要重啟的主要原因是需要更新的某些文件當(dāng)前正被一些其它程序或服務(wù)所使用。RM允許除關(guān)鍵系統(tǒng)服務(wù)(Critical System Services)之外的所有程序(或服務(wù))關(guān)閉和重啟。這將釋放正在使用的文件從而使安裝得以完成。
RM DLL導(dǎo)出了一組可供安裝包使用的C接口。安裝包可以向RM注冊安裝過程中需要被替換的文件列表,隨后,安裝包可以通過RM來判斷其中哪些文件正在使用;RM可以關(guān)閉并重啟那些占用了這些文件的程序;安裝包可以根據(jù)被占用的文件,進(jìn)程ID,或Windows服務(wù)的短名稱來指導(dǎo)RM關(guān)閉和重啟應(yīng)用程序(或服務(wù))。 RM自Vista開始提供,Windows Installer V4會(huì)自動(dòng)使用RM,自定義Installer也可以調(diào)用RM API來使用其功能。在不可避免需要重啟的情況下,Installer可以借助RM來規(guī)劃何時(shí)重啟以最大限度減少對用戶工作流的干擾。 對占用文件的程序,RM以下列順序關(guān)閉它們,并在完成更新后,以相反的順序重啟它們: 1. GUI應(yīng)用程序 2. Console應(yīng)用程序 3. Windows服務(wù) 4. Windows Explorer RM只有得到調(diào)用方允許后才會(huì)關(guān)閉程序(或服務(wù))。不支持跨會(huì)話進(jìn)行關(guān)閉操作。 對于使用Windows Installer V4的安裝包,如果它是交互式的,則其用戶接口應(yīng)包括MsiRMFilesInUse對話框。1. 在自定義安裝包中使用RM API
所有通過RM API執(zhí)行的操作都必須與一個(gè)session關(guān)聯(lián)。在一個(gè)用戶會(huì)話中,最多可以同時(shí)開啟64個(gè)RM session。主安裝包(Primary Installer)負(fù)責(zé)啟動(dòng)和停止RM session。 必要的情況下,若干個(gè)從安裝包(Secondary Installer)可以加入RM Session并與主安裝包同時(shí)運(yùn)行(在同一進(jìn)程或不同進(jìn)程中)。加入RM Session需要使用其session key。 交互式安裝包的用戶界面應(yīng)包括一個(gè)MsiRMFilesInUse對話框 —— 用于請求用戶關(guān)閉應(yīng)用程序或服務(wù)。 安裝包不能在調(diào)用RM API前禁用文件系統(tǒng)重定向,這意味著在64位Windows上運(yùn)行的32位安裝包不能注冊“%windir\system32”目錄中的文件。1.1 在主安裝包中使用RM
當(dāng)在單個(gè)安裝包中使用RM時(shí),該安裝包也就是主安裝包。 1. 調(diào)用RmStartSession啟動(dòng)一個(gè)RM session,得到session handle和key。 2. 調(diào)用RmRegisterResources注冊資源。RM只能通過注冊的資源來判斷哪些程序和服務(wù)需要被重啟。資源可以是文件名、服務(wù)的短名稱,或一個(gè)RM_UNIQUE_PROCESS結(jié)構(gòu)。 3. 調(diào)用RmGetList獲得一個(gè)RM_PROCESS_INFO數(shù)組,其中包含了所有需要被重啟的進(jìn)程和服務(wù)。 如果RmGetList返回的lpdwRebootReason不為0,則表示RM無法通過重啟來釋放所注冊的資源。在這種情況下,則需要重啟OS來完成安裝。 如果RmGetList返回的lpdwRebootReason為0,則可以通過調(diào)用RmShutdown來關(guān)閉占用資源的程序和服務(wù),然后安裝包可以進(jìn)行安裝操作,最后,調(diào)用RmRestart來重啟被關(guān)閉的程序。 4. 可以通過RmAddFilter來防止某些程序(或服務(wù))被RM關(guān)閉,這稱為添加一個(gè)過濾器。RmRemoveFilter可以移除一個(gè)過濾器,RmGetFilterList則可以獲得當(dāng)前的過濾器列表。 5. 調(diào)用RmEndSession關(guān)閉RM session。 示例: DWORD dVal = 0; DWORD dwSessionHandle = (DWORD) -1; WCHAR sessKey[CCH_RM_SESSION_KEY+1]; UINT nProcInfo = 100; UINT nProcInfoNeeded; UINT nAffectedApps = 0; RM_PROCESS_INFO rgAffectedApps[100]; //Size depends on # of entries found by RmGetList DWORD lpdwRebootReason = 0; DWORD nServices = 1; LPCWSTR rgsServices[] = { L"iisadmin" }; DWORD nProcs = 0; DWORD nFiles = 1; LPCWSTR rgsFiles[] = { L"c:\\windows\\system32\\oleaut32.dll" }; // Starting Session dVal = RmStartSession( &dwSessionHandle, 0, sessKey ); if (dVal != ERROR_SUCCESS) goto RM_END; // Register items dVal = RmRegisterResources( dwSessionHandle, nFiles, rgsFiles,?// Files nProcs, NULL,?// Processes nServices, rgsServices );?// Services if (dVal != ERROR_SUCCESS) goto RM_END; // Getting affected apps dVal = RmGetList( dwSessionHandle, &nProcInfoNeeded, &nAffectedApps, rgAffectedApps, &lpdwRebootReason ); if (dVal != ERROR_SUCCESS) goto RM_END; //Results of RmGetList can be presented & interpreted? //by the user for determining subsequent action. // Shut down apps dVal = RmShutdown( dwSessionHandle, 0, NULL ); if (dVal != ERROR_SUCCESS) goto RM_END; //An installer can now replace the files. // Restart apps dVal = RmRestart( dwSessionHandle, 0, NULL ); if (dVal != ERROR_SUCCESS) goto RM_END; RM_END: if (rgAffectedApps) { delete [] rgAffectedApps; rgAffectedApps = NULL; } if (dwSessionHandle != -1) { // Clean up session dVal = RmEndSession( dwSessionHandle ); dwSessionHandle = -1; }1.2 在從安裝包中使用RM
1. 想辦法從主安裝包中獲取RM session key,調(diào)用RMJoinSession來加入session。主安裝包和從安裝包必須運(yùn)行在相同的用戶上下文中。 2. 使用RmRegisterResources注冊資源;使用RmGetList可以獲取占用資源的程序列表; 3. 可以調(diào)用RmShutdown(存疑!如果能夠調(diào)用的話,那會(huì)不會(huì)多次調(diào)用RmShutdown的可能?)。 4. 主安裝包和從安裝包調(diào)用RmEndSession(存疑,不知道是指任何一方調(diào)用即可還是雙方都需要調(diào)用一次)。 示例: DWORD dVal = 0; DWORD dwSessionHandle = (DWORD) -1; WCHAR sessKey[CCH_RM_SESSION_KEY+1]; //Primary installer session key. DWORD nServices = 1; LPCWSTR rgsServices[] = { L"iisadmin" }; DWORD nProcs = 0; DWORD nFiles = 1; LPCWSTR rgsFiles[] = { L"c:\\windows\\system32\\oleaut32.dll" }; // Secondary installer obtains the session key from the // primary installer & uses it to join the session. // Joining Session dVal = RmJoinSession( &dwSessionHandle, sessKey ); if (dVal != ERROR_SUCCESS) goto RMSUB_END; // Register items. The Secondary installer is only allowed to register resources // and cannot perform other Restart Manager operations. dVal = RmRegisterResources( dwSessionHandle, nFiles, rgsFiles,??????????? // Files nProcs, NULL,??????????? // Processes nServices, rgsServices );??????? // Services if (dVal != ERROR_SUCCESS) goto RMSUB_END; RMSUB_END: if (dwSessionHandle != -1) { // Clean up session dVal = RmEndSession( dwSessionHandle ); dwSessionHandle = -1; }總結(jié)
以上是生活随笔為你收集整理的【Windows】Windows Restart Manager 重启管理器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于VS配置环境
- 下一篇: 在VMware环境Windows ser