Windows Restart Manager 重启管理器

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 Restart Manager 重启管理器

时间: 2024-10-11 20:46:01

Windows Restart Manager 重启管理器的相关文章

【Windows】Windows Restart Manager 重启管理器

Restart Manager(以下简称RM)可以减少或避免安装或更新程序所需要的系统重启次数.安装(或更新)过程中需要重启的主要原因是需要更新的某些文件当前正被一些其它程序或服务所使用.RM允许除关键系统服务(Critical System Services)之外的所有程序(或服务)关闭和重启.这将释放正在使用的文件从而使安装得以完成. RM DLL导出了一组可供安装包使用的C接口.安装包可以向RM注册安装过程中需要被替换的文件列表,随后,安装包可以通过RM来判断其中哪些文件正在使用:RM可以

设计模式之美:Manager(管理器)

索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的变化独立于类本身,并且管理器还可以为不同的类进行重用. Encapsulates management of a class's objects into a separate manager object. This allows variation of management functionality independ

Windows 7 里进程管理器里面的各列是什么含义?主要是和内存有关的内存-专用工作集,内存-工作集,内存-提交大小???

内存 - 工作集:私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和. 内存 - 峰值工作集:进程所使用的工作集内存的最大数量. 内存 - 工作集增量:进程所使用的工作集内存中的更改量. 内存 - 私人工作集:工作集的子集,它专门描述了某个进程正在使用且无法与其他进程共享的内存数量. 内存 - 提交大小:为某进程使用而保留的虚拟内存的数量. 内存 - 页面缓冲池:由内核或驱动程序代表进程分配的可分页内核内存的数量.可分页内存是可写入其他存储媒体(例如硬盘)的内存. 内存 -

Win 管理器 运行命令 大全(Windows下的DOS运行命令)

DOS 运行命令管理器字符大全 Win 管理器  运行命令 大全(Windows下的DOS运行命令) Nslookup-------IP 地址侦测器 explorer-------打开资源管理器 devmgmt.msc--- 设备管理器 progman--------程序管理器 taskmgr-----任务管理器(2000/ xp/ 2003 ) ntmsmgr.msc----移动存储管理器 eventvwr-------事件查看器 sysedit--------系统配置编辑器 regedt32

如何设置windows server 2012 防火墙管理?

如何设置Windows Server 2012防火墙管理 本文将详细介绍如何设置Windows Server 2012防火墙管理,并创建自定义的入站和出站规则上执行的Windows防火墙最常见的任务. 管理防火墙设置 在 Windows高级安全防火墙的是,在Windows Server 2012上运行,并默认打开一个基于主机的防火墙.在Windows Server 2012中的防火墙设置从Windows防火墙MMC(Microsoft管理控制台)进行管理.要查看和设置防火墙设置执行以下操作: 1

Linux软件包管理器rpm与yum

在我们的运维工作,总是避免不了安装某些软件,或者编译安装某些软件,我们知道操作系统当中的程序都是有程序员通过开发工具开发的来,程序员直接编写的纯文本的文档我们称之为源代码,但我们的计算机只能识别二进制程序,那么必须要将源代码变成计算机能识别的二进制程序,这里需要通过编译器来进行编译,将源码转换成二进制程序,再通过安装即可. 还有一类程序就是二进制程序,系统是由某些厂商来做的,在厂商的系统上编译出来的程序,自然就在系统上运行了,这里是由厂商直接编译好程序然后释放出来给用户,如此一来,由于我们本来就

完美者右键扩展菜单管理器 1.2.1 中文绿色版

软件名称: 完美者右键扩展菜单管理器 1.2.1 中文绿色版软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 590KB图片预览: 软件简介:一款强大的Windows右键扩展菜单管理器,可以对右键菜单进行增加,修改,删除等操作. 主要特点:1.支持Windows XP.Windows 7系统(某些功能在win7下有限制)2.自定义增加文件类型3.自定义菜单4.增加.编辑.删除和导出菜单5.删除菜单时自动备份6.自定义清理

EBS并发管理器启动失败,系统暂挂,在重置计数器之前修复管理程序

今天EBS安装补丁之后,因为停并发管理器的时候,因为关闭EBS应用时,并发管理器没有在前台停止,就直接停了应用服务,导致启动时,并发管理器直接起不来了,使用adcmctl.sh也没有办法启动. 进入系统管理员->管理并发管理器 查看并发管理器状态,发现并发管理器都处于 System Hold, Fix Manager before resetting counters 系统暂挂,在重置计数器之前修复管理程序 的状态. 解决方法: 先终止最上面的标准并发管理器,等待所有并发管理器完全停止之后,再使

你需要知道的包管理器(Package Manager)

最近我花了一点时间关注了在不同系统之中所用到的包管理器(Package Manager) .最开始的时候,我是在使用Linux操作系统时,对这种工具以及它背后的想法深深迷恋住了:这真是自由的软件世界.全世界所有的开发人员都可以将自己觉得有用的组件或者软件发布到一个共用的地方,其他的所有人都可以很方便地按需取用. 让我们记住Richard Stallman 以及他提出并创立的GNU计划.http://baike.baidu.com/view/36272.htm   在Linux系统中,包管理器是如