4

以编程方式创建系统还原点是“禁忌”吗?我会在执行软件更新之前执行此操作。如果有更好的方法可以仅使用我的软件文件和数据创建还原点,请告诉我。

我想要一种方法,如果在更新期间一切正常(关闭/终止更新应用程序、断电、用户拔掉插头等),我可以让用户恢复到已知的工作状态

    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); 
    }
4

6 回答 6

4

以编程方式创建系统还原点是“禁忌”吗?

不,这就是 API 存在的原因。这样您就可以对系统进行伪原子更新。

于 2008-08-28T18:19:49.850 回答
3

这是否是一个好主意真的取决于你做了多少。一个完整的系统还原点很重要——它需要时间来创建,需要磁盘空间来存储,并被添加到还原点的界面,可能会将较早的还原点推出存储。

所以,如果你的更新真的只是改变你的应用程序(即它存储的数据、组成它的二进制文件、它的注册表项),那么它并不是真正的系统级更改,我会投票支持无还原点. 您可以通过仅备份您正在更改的部分并提供恢复到备份选项来模拟该功能。我的观点是,系统还原应该是在进行可能损坏系统的全局更改(应用程序安装等)时还原系统。

应该只使用系统服务的反驳论点对我来说是站不住脚的。我担心,如果您必须对应用程序进行多次更新,那么系统还原点集可能会变得如此之大,以至于重要的、真正的“系统范围”更新可能会被推出,或者在噪音中消失。

于 2008-08-28T18:18:13.877 回答
2

不,这不是禁忌——事实上,我会鼓励它。操作系统管理着硬盘驱动器的消耗量,我认为微软花费更多的金钱和时间来测试系统还原,而不是你投入测试设置应用程序的金钱和时间。

于 2008-08-28T17:34:40.753 回答
1

如果您正在为 Vista 开发应用程序,您可以使用 Transactional NTFS,它支持与您正在寻找的功能类似的功能。

http://en.wikipedia.org/wiki/Transactional_NTFS

但是,安装程序包不会已经包含这种类型的回滚支持吗?我对它们中的大多数都不是很熟悉,所以我不确定。

最后,Windows 通常会在您运行安装应用程序时自动创建还原点。

于 2008-08-28T18:00:02.937 回答
0

看看以下链接: http: //www.calumgrant.net/atomic/

作者描述了“事务性编程”。这类似于数据库中的事务。

例子:

开始交易:

  1. 第1步
  2. 第2步
  3. 在步骤 2 中遇到错误
  4. 回滚到事务开始之前。

这是一个新框架,但您可以将其更多地视为一种解决方案,而不是使用该框架。

通过使用交易,您可以获得您正在寻找的“恢复积分”。

于 2008-08-28T17:46:58.820 回答
-1

我认为完整的系统还原不是一个好计划。很快想到的两个原因:

  • 浪费的磁盘空间
  • 回滚的意外后果
于 2008-08-28T17:22:18.350 回答