Restart Manager(以下简称RM)可以减少或避免安装或更新程序所需要的系统重启次数。安装(或更新)过程中需要重启的主要原因是需要更新的某些文件当前正被一些其它程序或服务所使用。RM允许除关键系统服务(Critical System Services)之外的所有程序(或服务)关闭和重启。这将释放正在使用的文件从而使安装得以完成。
RM DLL导出了一组可供安装包使用的C接口。安装包可以向RM注册安装过程中需要被替换的文件列表,随后,安装包可以通过RM来判断其中哪些文件正在使用;RM可以关闭并重启那些占用了这些文件的程序;安装包可以根据被占用的文件,进程ID,或Windows服务的短名称来指导RM关闭和重启应用程序(或服务)。
RM自Vista开始提供,Windows Installer V4会自动使用RM,自定义Installer也可以调用RM API来使用其功能。在不可避免需要重启的情况下,Installer可以借助RM来规划何时重启以最大限度减少对用户工作流的干扰。
对占用文件的程序,RM以下列顺序关闭它们,并在完成更新后,以相反的顺序重启它们:
1. GUI应用程序
2. Console应用程序
3. Windows服务
4. Windows Explorer
RM只有得到调用方允许后才会关闭程序(或服务)。不支持跨会话进行关闭操作。
对于使用Windows Installer V4的安装包,如果它是交互式的,则其用户接口应包括MsiRMFilesInUse对话框。
1. 在自定义安装包中使用RM API
所有通过RM API执行的操作都必须与一个session关联。在一个用户会话中,最多可以同时开启64个RM session。主安装包(Primary Installer)负责启动和停止RM session。
必要的情况下,若干个从安装包(Secondary Installer)可以加入RM Session并与主安装包同时运行(在同一进程或不同进程中)。加入RM Session需要使用其session key。
交互式安装包的用户界面应包括一个MsiRMFilesInUse对话框 —— 用于请求用户关闭应用程序或服务。
安装包不能在调用RM API前禁用文件系统重定向,这意味着在64位Windows上运行的32位安装包不能注册“%windir\system32”目录中的文件。
1.1 在主安装包中使用RM
当在单个安装包中使用RM时,该安装包也就是主安装包。
1. 调用RmStartSession启动一个RM session,得到session handle和key。
2. 调用RmRegisterResources注册资源。RM只能通过注册的资源来判断哪些程序和服务需要被重启。资源可以是文件名、服务的短名称,或一个RM_UNIQUE_PROCESS结构。
3. 调用RmGetList获得一个RM_PROCESS_INFO数组,其中包含了所有需要被重启的进程和服务。
如果RmGetList返回的lpdwRebootReason不为0,则表示RM无法通过重启来释放所注册的资源。在这种情况下,则需要重启OS来完成安装。
如果RmGetList返回的lpdwRebootReason为0,则可以通过调用RmShutdown来关闭占用资源的程序和服务,然后安装包可以进行安装操作,最后,调用RmRestart来重启被关闭的程序。
4. 可以通过RmAddFilter来防止某些程序(或服务)被RM关闭,这称为添加一个过滤器。RmRemoveFilter可以移除一个过滤器,RmGetFilterList则可以获得当前的过滤器列表。
5. 调用RmEndSession关闭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,调用RMJoinSession来加入session。主安装包和从安装包必须运行在相同的用户上下文中。
2. 使用RmRegisterResources注册资源;使用RmGetList可以获取占用资源的程序列表;
3. 可以调用RmShutdown(存疑!如果能够调用的话,那会不会多次调用RmShutdown的可能?)。
4. 主安装包和从安装包调用RmEndSession(存疑,不知道是指任何一方调用即可还是双方都需要调用一次)。
示例:
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;
}
来自:ms-help://MS.MSDNQTR.v90.chs/rstmgr/rstmgr/using_restart_manager.htm
- 【Windows】Windows Restart Manager 重启管理器
Restart Manager(以下简称RM)可以减少或避免安装或更新程序所需要的系统重启次数.安装(或更新)过程中需要重启的主要原因是需要更新的某些文件当前正被一些其它程序或服务所使用.RM允许除关 ...
- Windows RestartManeger重启管理器
介绍 重启管理器API可以消除或是减少在完成安装或是更新的过程中系统需要重启的次数.软件安装或是更新过程之所以需要重启系统的原因在于一些需要更新的文件正在被运行中的程序或服务使用.而重启管理器可以 ...
- 宣布 Windows Azure 通过 PCI DSS 合规性验证并且 ISO 认证范围扩大,同时正式发布 Windows Azure Hyper-V 恢复管理器和其他更新功能
今天,我们高兴地宣布两个重大里程碑事件,客户将能借此提高基于 Windows Azure 构建安全且合规的应用程序的能力.此外,我们还宣布正式发布 Windows Azure Hyper-V 恢复管理 ...
- Manager(管理器)
Manager(管理器) 索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的 ...
- 设计模式---Manager(管理器)
设计模式之美:Manager(管理器) 索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这 ...
- 设计模式之美:Manager(管理器)
索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的变化独立于类本身,并且管理 ...
- Windows Cluster 在群集管理器下 集群或可用性组 都不显示的问题
作为一个IT成员,特别是偏支持的.很多时候就是和各种异常打交道,总会碰到一些奇奇怪怪的问题.很多时候,可能是一个小小的异常都需要花费很长时间去解决. SQL Server AlwaysOn 是建立在W ...
- Chocolatey——windows下的包管理器
前言 windows 包管理器 | https://chocolatey.org/ 命令 文档 | https://chocolatey.org/docs 根据使用会补充命令
- EBS Concurrent Manager(并发管理器)异常处理[final]
来自:http://blog.itpub.net/35489/viewspace-742191/ 有时候我们在通过 adstpall.sh 关闭应用后,然后再使用adstrtal.sh开启.发现并发 ...
随机推荐
- SpringBoot全家桶
前言 Spring简化了Java的开发,而SpringBoot简化了Spring.本文用SpringBoot采用分层的结构整合了filter,aspect,mybaits,logback,redis, ...
- Join, Group Join
Linq的 Join对应SQL中的inner join,当左右两张表有匹配数据时才返回一条记录: Linq的 Group Join对应SQL中的LEFT OUTER JOIN,即使右表中没有匹配,也从 ...
- Linux:ln命令详解(软连接,硬链接)
ln ln命令用来为文件创件连接,连接类型分为硬连接和软连接(符号连接)两种,默认的连接类型是硬连接.如果要创建软连接必须使用"-s"选项. 硬链接 建立硬链接时,在另外的目录或本 ...
- 使用nrm管理npm仓库
使用nrm管理npm仓库 用npm装包的时候,经常碰到太慢或者npm官网被墙的情况,有时候凑合一下就改一下 "~/.npmrc" 文件,但是经常改来改去也挺麻烦的,于是找到了可以使 ...
- 使用fill_n算法
今天使用这个算法来给一个数组赋值,所以把它的使用过程记录下来: fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val.把从起始点开始依次赋予count个元素val的值. 注意 ...
- 3. 什么是JSR参考实现? - JavaEE基础系列
本文是JavaEE基础系列的第三节. Java EE简介 - JavaEE基础系列 JSR简介 - JavaEE基础系列 上一节中, 我们介绍了什么是JSR.JSR就是一个提交到JCP的抽象请求,包含 ...
- OPEN(SAP) UI5 学习入门系列之三:MVC (上) - 模型
这次我们来一起学习MVC,这个专题分为两个小节,本次主要是总览以及模型,下一次着重会介绍视图以及控制器,因为控制器其实没有太多可以讲的,所以和视图合并在一块. 1 Model View Control ...
- 单机ZooKeeper配置
1.创建zoo.cfg copy D:\zookeeper3.4.6\conf\zoo_sample.cfg zoo.cfg 修改追加如下内容 dataDir=D:/zookeeper3.4.6/da ...
- MPLS基础一(上)
在上图中,关于PC-A和PC-B之间互相访问的过程中 1.所有三层网络设备形成源和目的的路由条目 2.PC-A发出报文,source-IP为A,destination-IP为B 3.R1收到报文后,根 ...
- [IC]Lithograph(1)光刻技术分析与展望
文章主体转载自: 1.zol摩尔定律全靠它 CPU光刻技术分析与展望 2.wiki:Extreme ultraviolet lithography 3.ITRS 2012 1. 光刻技术组成和关键点 ...