- 积分
- 6709
- 最后登录
- 2024-3-29
- 精华
- 0
- 阅读权限
- 220
- 主题
- 145
- UID
- 3887572
- 帖子
- 2897
- PB币
- 3573
- 威望
- 925
- 贡献
- 0
- 技术
- 801
- 活跃
- 4706
14N.M.
- UID
- 3887572
- 帖子
- 2897
- PB币
- 3573
- 贡献
- 0
- 技术
- 801
- 活跃
- 4706
|
发表于 2014-4-25 19:00:32
IP属地江苏
|显示全部楼层
本帖最后由 Mouri_Naruto 于 2014-7-18 19:53 编辑
PS:为何叫较深入了解,因为楼主的所使用的技术不是那么高深,而且我自知在这方面我不算大神;毕竟最了解的还是微软
PS:这篇帖子的目标是成为远景的技术贴,仅此而已
PS:针对一些人的以下看法,我自己的回答是这样的:技术性较高,实用性不大。这里是远景,不是卡饭,CSDN |
PS:我又要开更了,只是开更前先改个标题;要看英文版(我翻译的很慢)戳这里:http://forums.mydigitallife.info/threads/55667-Updating-Some-things-About-System-Restore
作为一个技术党的我曾经是混贴吧的,可惜里面谈技术的人太少;比如我曾在贴吧里发过关于系统还原的笔记(相当于这篇文章的Beta)但讨论的人很少,对我打击颇大;于是我看中了远景的大神众多的特点就来了(也证明我没看错);我更喜欢把远景和看雪论坛比较,而不是卡饭和CSDN……(你懂的,这就是我发技术性较高文章(稍稍自恋了些,和远景的众大神还是没法比)的原因)
一.概论
Windows从ME开始,系统还原成为系统的一部分;由于这个功能相当耗磁盘而且并不像同类的快照类工具强大,所以别人都把这个功能当作了鸡肋,于是也就成为了冷门,进而这个功能出了十多年了知道的人也不多。为了帮助人们更好的了解系统还原也为了完成我从小学五年级就一直研究系统还原的总结;楼主特地发了这个帖子。
说到系统还原,首先要说说它的实现方式;这东东不要看功能如此简陋,但是却是第一个基于Windows卷影复制技术的工具(XP那个时候也不例外,只是XP系统还原比较特殊,由于那时卷影复制微软还没有正式对外发布,所以它和卷影复制是分开的);到了Vista后,系统还原更名为系统保护;在功能上有了长足的改进(比如与卷影复制合并,可以离线还原,可以使用vssadmin管理等);在Windows8上面,为了解决系统还原磁盘占用庞大和NT6系统保护和NT5系统还原的兼容性的问题;微软又提供了兼容NT5系统还原的注册表选项和系统还原创建了还原点后24小时内用其他程序不会创建单独的系统还原点的机制(但如果你想创建的话,也是有办法的)。总体上来说,系统还原虽然是冷门功能,但微软一直在对他进行改进
以上是系统还原的原理和历史的简介,接下来就说说,如何让系统还原为我们所用。
首先说说如何进入系统还原的图形化设置界面(以Windows 8.1为例)
首先右击“这台电脑”出现菜单后点属性进入“系统”;然后再点“系统保护”既可以进入系统还原的图形化设置界面了;这里面的选项设置对于不深入使用系统还原的人已经足够了;而且界面也十分简单;但这儿不是这个文章的重点,毕竟如果就写这中的话,怎么符合较深入研究这个标题呢;所以图形化设置就略过了
请勿使用多线程下载工具下载论坛附件!
二.如何使用命令行管理系统还原
接下来步入我想着重介绍的部分,那就是命令行管理系统还原……我相信这个部分知道的人很少,也是我写这篇文章的初衷
开始介绍之前,首先打开管理员权限的命令提示符(Windows 8/8.1可以WinKey+X出现菜单点命令提示符(管理员)即可;Win7去开始菜单找)
打开命令提示符后,输入vssadmin后,出现如下界面- vssadmin 1.1 - 卷影复制服务管理命令行工具
- (C) 版权所有 2001-2013 Microsoft Corp.
- 错误: 无效命令。
- ---- 支持的命令 ----
- Delete Shadows - 删除卷影副本
- List Providers - 列出已注册的卷影副本提供程序
- List Shadows - 列出现有卷影副本
- List ShadowStorage - 列出卷影副本存储关联
- List Volumes - 列出可以进行卷影副本处理的卷
- List Writers - 列出订阅的卷影副本写入程序
- Resize ShadowStorage - 重新调整卷影副本存储关联的大小
复制代码 看到这个工具,可能有些人会觉得熟悉,也有人觉得疑问;为什么是卷影副本呢?由于Vista开始的系统还原和卷影复制合并,所以可以用卷影复制工具管理;这些命令详细都可以用 /? 参数查看,以下提供一些常用的命令:
查看系统还原和卷影副本对磁盘的占用情况(与系统保护选项卡里面的配置里面显示的磁盘占用等价;甚至更详细)- vssadmin.exe List ShadowStorage
复制代码 运行后结果大致如下- vssadmin 1.1 - 卷影复制服务管理命令行工具
- (C) 版权所有 2001-2013 Microsoft Corp.
- 卷影副本存储关联
- 卷: (C:)\\?\Volume{90d3964c-535e-4e40-977c-2765087cf8c4}\
- 卷影副本存储卷: (C:)\\?\Volume{90d3964c-535e-4e40-977c-2765087cf8c4}\
- 已用卷影副本存储空间: 129 MB (0%)
- 分配的卷影副本存储空间: 405 MB (0%)
- 最大卷影副本存储空间: 2.38 GB (1%)
- 卷影副本存储关联
- 卷: (G:)\\?\Volume{cf8dcaa0-c1e3-11e3-824e-806e6f6e6963}\
- 卷影副本存储卷: (G:)\\?\Volume{cf8dcaa0-c1e3-11e3-824e-806e6f6e6963}\
- 已用卷影副本存储空间: 0 字节 (0%)
- 分配的卷影副本存储空间: 0 字节 (0%)
- 最大卷影副本存储空间: 19.7 GB (30%)
复制代码 如果你觉得系统还原占的空间过大,可以运行如下方式清理
1.如果你要删除某分区中的所有还原点,可以使用以下命令- vssadmin.exe Delete Shadows /For=你想删除的盘符(如 C: ) /All /Quiet
复制代码 2.如果你要删除所有分区的所有还原点,可以使用以下命令- vssadmin.exe Delete Shadows /All /Quiet
复制代码 3.如果你要在某分区删除并保留最近的还原点,可以使用以下命令- vssadmin.exe Delete Shadows /For=你想删除的盘符(如 C: ) /Oldest /Quiet
复制代码 4.如果你要在所有分区删除并保留最近的还原点,可以使用以下命令- vssadmin.exe Delete Shadows /Oldest /Quiet
复制代码 如果你要调整系统还原点所占分区的最大大小,可以看看下面的说明- Resize ShadowStorage /For=ForVolumeSpec /On=OnVolumeSpec /MaxSize=MaxSizeSpec
复制代码 这些命令对于系统还原的管理已经足够,我曾经也研究过如何用API去管理系统还原;但由于卷影复制的API太复杂;对于一些人来说(包括我)实在费力不讨好;如果有会用卷影复制API的大神,请帮我写一篇文章解决我的遗憾
三.使用程序语言创建系统还原点(可以参考本文附注和MSDN)
1.使用mshta调用WMI管理系统还原
(1)创建系统还原点- mshta.exe vbscript:getobject("winmgmts:\\.\root\default:Systemrestore").createrestorepoint("New Snapshot",0,100)(window.close)
复制代码 (2)开启系统还原- mshta.exe vbscript:getobject("winmgmts:\\.\root\default:Systemrestore").Enable(你想开启系统还原的分区,如C:;如果你要开启全部分区,请在这里输入"")(window.close)
复制代码 (3)关闭系统还原- mshta.exe vbscript:getobject("winmgmts:\\.\root\default:Systemrestore").Disable(你想关闭系统还原的分区,如C:;如果你要关闭全部分区,请在这里输入"")(window.close)
复制代码 2.使用VBScript调用WMI管理系统还原- getobject("winmgmts:\\.\root\default:Systemrestore").createrestorepoint("New Snapshot",0,100)
复制代码 (2)开启系统还原- getobject("winmgmts:\\.\root\default:Systemrestore").Enable(你想开启系统还原的分区,如C:;如果你要开启全部分区,请在这里输入"")
复制代码 (3)关闭系统还原- getobject("winmgmts:\\.\root\default:Systemrestore").Disable(你想关闭系统还原的分区,如C:;如果你要关闭全部分区,请在这里输入"")
复制代码 (4)执行系统还原- Set obj = GetObject("winmgmts:{impersonationLevel=impersonate}!root/default:SystemRestore")
- if obj.Restore(还原点的序号) <> 0 Then
- wscript.Echo "Restore failed"
- End If
- Set OpSysSet = GetObject("winmgmts:{(Shutdown)}//./root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
- for each OpSys in OpSysSet
- OpSys.Reboot()
- next
复制代码 (5)获取还原点的序号- Set RPSet = GetObject("winmgmts:root/default").InstancesOf ("SystemRestore")
- for each RP in RPSet
- wscript.Echo "还原点序号: " & RP.SequenceNumber & ", 还原点名称: " & RP.Description & ", 还原点类型: ", RP.RestorePointType & ", 创建时间: " & RP.CreationTime
- next
复制代码 3.使用Win32 API创建系统还原点的例子(本节程序使用C#语言编写,C++的例子请参考Using System Restore;我主要介绍用.net创建还原点)- [StructLayout(LayoutKind.Sequential)]
- public struct RESTOREPOINTINFO
- {
- public int dwEventType;
- public int dwRestorePtType;
- public Int64 llSequenceNumber;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
- public string szDescription;
- }
- [StructLayout(LayoutKind.Sequential)]
- public struct STATEMGRSTATUS
- {
- public uint nStatus;
- public Int64 llSequenceNumber;
- }
- [DllImport("SrClient.dll")]
- public static extern bool SRSetRestorePoint(ref RESTOREPOINTINFO SRPInfo, ref STATEMGRSTATUS SRPStatus);
- static void Main(string[] args)
- {
- RegistryKey SystemRestoreKey = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion\\SystemRestore",true);
- SystemRestoreKey.SetValue("SystemRestorePointCreationFrequency", 0,RegistryValueKind.DWord);
- bool result = false;
- RESTOREPOINTINFO RPInfo = new RESTOREPOINTINFO();
- STATEMGRSTATUS RPStatus = new STATEMGRSTATUS();
- RPInfo.dwEventType = 100;
- RPInfo.dwRestorePtType = 0;
- RPInfo.llSequenceNumber = 0;
- RPInfo.szDescription = "创建还原点";
- result = SRSetRestorePoint(ref RPInfo, ref RPStatus);
- SystemRestoreKey.DeleteValue("SystemRestorePointCreationFrequency");
- }
复制代码 4.使用WMI创建系统还原点的例子(本节程序使用C#语言编写,C++的例子请参考Using System Restore;我主要介绍用.net创建还原点)- private static bool CreateSRP(string RPName, int RPType, int EventType)
- {
- ManagementClass SRClass = new ManagementClass("//./root/default:SystemRestore");
- ManagementBaseObject SRArgs = SRClass.GetMethodParameters("CreateRestorePoint");
- SRArgs["Description"] = RPName;
- SRArgs["RestorePointType"] = RPType;
- SRArgs["EventType"] = EventType;
- try
- {
- ManagementBaseObject outParams = SRClass.InvokeMethod("CreateRestorePoint", SRArgs, new InvokeMethodOptions(null, System.TimeSpan.MaxValue));
- return true;
- }
- catch
- {
- return false;
- }
- }
- static void Main(string[] args)
- {
- value = CreateSRP("创建还原点", 0, 100);
- if (value == true)
- {
- Console.Write("Success");
- }
- else
- {
- Console.Write("Failed");
- }
- Console.Read();
- }
复制代码 5.使用AlphaVSS库删除所有系统还原点的例子(本节程序使用C#语言编写,本代码与vssadmin.exe Delete Shadows /All /Quiet等效)
PS:AlphaVSS库主页:http://alphavss.codeplex.com/- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Alphaleonis.Win32.Vss;
- namespace SRDemoVSS
- {
- class Program
- {
- static void Main(string[] args)
- {
- IVssImplementation vssImplementation = VssUtils.LoadImplementation();
- using (IVssBackupComponents backupComponents = vssImplementation.CreateVssBackupComponents())
- {
- backupComponents.InitializeForBackup(null);
- backupComponents.SetContext(VssSnapshotContext.All);
- IList<VssSnapshotProperties> snapshots = backupComponents.QuerySnapshots().ToArray();
- if (snapshots.Count == 0)
- {
- Console.WriteLine("There were no shadow copies on the system.");
- return;
- }
- try
- {
- foreach (VssSnapshotProperties snapshot in snapshots)
- {
- Console.WriteLine("- Deleting shadow copy {0:B} on {1} from provider {2} [{3}]...", snapshot.SnapshotId, snapshot.OriginalVolumeName, snapshot.ProviderId, snapshot.SnapshotAttributes);
- backupComponents.DeleteSnapshot(snapshot.SnapshotId, false);
- }
- }
- finally { }
- }
- }
- }
- }
复制代码 6.使用Win32 API和WMI删除所有系统还原点的例子(本节程序使用C#语言编写,本代码与vssadmin.exe Delete Shadows /All /Quiet等效)
以下代码是反编译SystemRestoreExplorer后得到的启发- using System;
- using System.Management;
- using System.Runtime.InteropServices;
- namespace SRDeleteDemoAPI
- {
- class Program
- {
- [DllImport("SrClient.dll")]
- public static extern int SRRemoveRestorePoint(int dwRPNum);
- static void Main(string[] args)
- {
- try
- {
- ManagementObjectSearcher SRObject = new ManagementObjectSearcher("root/default", "SELECT * FROM SystemRestore");
- foreach (ManagementObject SRInfo in SRObject.Get())
- {
- SRRemoveRestorePoint(Convert.ToInt32(SRInfo["SequenceNumber"].ToString()));
- }
- Console.WriteLine("Success");
- }
- catch (Exception)
- {
- Console.WriteLine("Failure");
- }
- }
- }
- }
复制代码
7.使用WMI执行系统还原(本节程序使用C#语言编写)
- using System;
- using System.Management;
- public static bool RestoreFromRestorePoint(int RPNum)
- {
- ManagementClass SRClass = new ManagementClass("//./root/default:SystemRestore");
- try
- {
- object[] SRArgs = { RPNum };
- SRClass.InvokeMethod("Restore", SRArgs);
- return true;
- }
- catch
- {
- return false;
- }
- }
复制代码
四.对系统还原点类型的介绍
系统还原点有许多类型,如果你看过本节内容,就可以自己创建一个24小时检查点了(做到别人做不到的事情,是不是很不错啊?)
以下是系统还原点的类型(包括微软未公开的类型):
请勿使用多线程下载工具下载论坛附件!
如果想创建一个指定类型的还原点,只要在第三点第二个例子小小改动即可(特殊类型还原点,经我测试只有用API才有效),具体改动部分如下
RPInfo.dwEventType = 100; //还原点事件类型(一定要序号)
RPInfo.dwRestorePtType = 0; //还原点类型(一定要序号)
RPInfo.szDescription = "RPTest"; //还原点名称
这些都可以根据上面的表格可以改成你想要的值
五.关于系统还原的存储结构
很多人不用系统还原就是因为系统还原占磁盘空间太大了,但是他们没有探究为何系统还原点要占很大的磁盘空间……还有它的存储目录结构如何
PS:我曾经研究过得出结论发到百度Windows8吧(我的贴吧ID和远景ID相同),由于那儿发技术贴回复率寥寥无几(相当于没发);我就把这个结论从我曾经的帖子搬过来吧
系统还原点的大小经过我的观察后得出了一个公式
还原点的大小等于注册表的大小+配置文件大小+修改过的监视范围内的文件的大小
这个结果是楼主创建了1536个XP的还原点和创建了30个Win8.1下的还原点得出来的结论
在NT6下创建一个还原点的大小约等于注册表文件的大小(即Config文件夹的系统注册表文件和每个用户文件下的NTUSER即用户注册表文件),随着对系统改动的增多,还原点的大小会越来越大……
配置文件虽然一般不会超过1MB,但里面记录着系统还原后受影响的软件列表,工作组名,还原点信息(还原点ID,还原点序号,还原点名称,创建时间)等重要信息
系统还原点文件夹就是每个分区根目录下的System Volume Information文件夹,顺便说说当系统还原开启时这个文件夹在NT6下的大致结构
System Volume Information
|- SPP(文件夹) 系统还原点配置文件(包括受影响的程序列表,工作组/域名称)
|- SystemRestore(文件夹) 系统还原 未知作用
|- {很长的ID} (文件夹) 还原点
|- {很长的ID} (文件) 还原点
|- IndexerVolumeGuid (文件) 分区ID信息
|- tracking.log 未知
|- MountPointManagerRemoteDatabase (文件)未知
六.对Windows ME系统还原的探索(这样才符合我自定义的Windows考古队员的头衔)
Windows ME的系统还原虽然功能少得可怜(只有创建还原点和还原);但也有一些优秀的地方可以让微软参考,比如,WinME的还原点是用cab压缩的(cab和wim的压缩算法都是lzx,压缩率和7z差不多,但只有makecab命令行压缩工具;所以用的人少……);而且通过对
ME的%systemdrive%\Windows\System\Restore的文件夹的研究,居然发现可以更改系统还原点的存放位置(我去,这么好的功能,为何在XP开始就消失了呢?);ME的系统还原监视是用一个文件过滤驱动来实现的(类似于UBWF的原理)
虽然WinME被人谩骂;但有些地方还是不错的
七.本文的结局
楼主觉得以自己的渣渣水平这篇文章只能写到这儿了,如果要转载的话,不要忘记给我提供阅读者对这篇文章的建议。
PS:第二次更新还没有结束 |
-
18
查看全部评分
-
|