创建系统还原点-有何想法?
以编程方式创建系统还原点是"禁忌"吗?在执行软件更新之前,我会这样做。如果有更好的方法仅使用我软件的文件和数据来创建还原点,请告诉我。
我希望有一种方法可以使用户在更新过程中一切正常(关闭/杀死更新应用程序,断电,用户拔下插头等)时,使用户回到已知的工作状态
private void CreateRestorePoint(string description) { ManagementScope oScope = new ManagementScope("\\localhost\root\default"); ManagementPath oPath = new ManagementPath("SystemRestore"); ObjectGetOptions oGetOp = new ObjectGetOptions(); ManagementClass oProcess = new ManagementClass(oScope, oPath, oGetOp); ManagementBaseObject oInParams = oProcess.GetMethodParameters("CreateRestorePoint"); oInParams["Description"] = description; oInParams["RestorePointType"] = 12; // MODIFY_SETTINGS oInParams["EventType"] = 100; ManagementBaseObject oOutParams = oProcess.InvokeMethod("CreateRestorePoint", oInParams, null); }
解决方案
回答
我认为完整的系统还原不是一个好的计划。很快就会想到两个原因:
- 浪费的磁盘空间
- 回滚带来的意外后果
回答
不,实际上这不是禁忌,我鼓励我们这样做。操作系统管理着多少硬盘驱动器,我会花钱在Microsoft身上花费更多的金钱和时间来测试System Restore,而不是花在测试安装应用程序上的金钱和时间。
回答
看一下以下链接:http://www.calumgrant.net/atomic/
作者描述了"事务编程"。这类似于数据库中的事务。
例子:
开始交易:
- 步骤1
- 第2步
- 步骤2遇到错误
- 回滚到事务开始之前。
这是一个新的框架,但是我们可以将其更多地视为一种解决方案,而不是使用该框架。
通过使用事务,我们可以获得所需的"还原点"。
回答
如果要为Vista开发应用程序,则可以使用Transactional NTFS,它支持与我们所寻找的功能类似的功能。
http://en.wikipedia.org/wiki/Transactional_NTFS
但是,安装程序包中是否已经包括此类回滚支持?我对他们中的大多数人不是很熟悉,所以我不确定。
最后,Windows通常会在我们运行安装应用程序时自动创建一个还原点。
回答
这是一个好主意,实际上取决于工作量。完整的系统还原点很重,创建时间,存储磁盘空间并添加到还原点的接口中很可能会导致将较早的还原点从存储中推出。
因此,如果更新实际上只是在更改应用程序(即,它存储的数据,组成它的二进制文件,它的注册表项),那么它实际上并不是系统级的更改,因此我不赞成使用任何还原点。我们可以通过备份要更改的部分并提供"还原到备份"选项来模拟功能。我的观点是,系统还原应该是在进行可能会损坏系统(应用程序安装等)的全局更改时还原系统。
有人认为应该只使用系统服务这一反驳论点对我来说是没有用的。我担心,如果我们必须对应用程序发布许多更新,那么系统还原点的集合可能会变得很大,以至于重要的,真正的"系统范围内"的更新可能会被推出,或者陷入噪音之中。
回答
Is it "taboo" to programatically create system restore points?
不。这就是为什么提供API的原因。这样我们就可以对系统进行伪原子更新。