我正在编写PowerShell脚本以使用rsync备份Windows计算机.为此,我试图使用所述脚本中的WMI创建一个具有编写器参与的非持久性Shadow副本(显然建议用于备份).
我从另一个问题(从PowerShell访问卷影复制(VSS)快照)中发现了一种通常创建卷影副本的方法,但是那里给出的示例使用"ClientAccessible"作为上下文参数,这导致创建持久性影子复制,没有作家参与.
在搜索解决方案时,我发现我可以使用以下命令获取上下文列表,我假设WMI理解这些上下文:
Get-WmiObject win32_shadowcontext | Out-GridView
Run Code Online (Sandbox Code Playgroud)
它列表有一个名为"备份"的上下文,这是我想要的方便.我继续尝试使用该上下文创建非持久性卷影副本:
$shadow = (Get-WmiObject -list win32_shadowcopy).Create("C:\", "Backup")
Run Code Online (Sandbox Code Playgroud)
但是,这似乎失败了,$ shadow变量的内容设置为
ReturnValue : 5
ShadowID : {00000000-0000-0000-0000-000000000000}
Run Code Online (Sandbox Code Playgroud)
根据相关文档(Win32_ShadowCopy类的Create方法),返回值表示"不支持的卷影副本上下文".
我找不到任何相关文档,说明为什么不支持此上下文或者是否可以使用它.我也尝试了"FileShareBackup"和"AppRollback"上下文没有成功.
我假设我要么缺少明显的东西,要么由于某种原因,WMI在创建卷影副本时不支持"clientAccessible"以外的任何其他内容,或者这是依赖于操作系统的(我在Windows 7上测试这个,64位)
我怎样才能让它发挥作用?
我的项目(某种处理引擎)分为2个dll:一个具有接口声明,一个具有功能.通常,项目由外部Delphi项目通过COM技术使用.
让我们说我的程序切片水果.外部delphi程序创建Fruit对象并填充其属性:weight(int),Name(字符串)和ProgressUpdater(类型为IProgressUpdater,在第二个dll中使用接口声明).在此exst programm creater Slicer之后,生成Slicer.AddFruit(newFruit)并调用Slicer.Slice().
没什么特别的.在现实生活中,delphi项目是Outlook插件.但问题是这样 - 有时一些VSTO插件使Outlook工作在"影子复制文件"模式,所以当delphi项目启动并创建Slicer对象时,我们的c#程序集将被放入临时文件夹,并将使用此本地路径创建程序集.嗯......这仍然不是问题.但问题是当delphi项目创建newFruit然后传递ProgressUpdater对象时,在我的Slicer程序集中我无法获得外部ProgressUpdater:"返回参数具有无效类型",但仍然可以获得具有简单类型(权重,名称)的字段.
它仅在启用shadowCopyFiles模式时发生.所以我的猜测是 - 外部ProgressUpdater的装配和切片器装配放置在不同的地方,因此它们无法通过.我的问题是如何避免我的dll被"影子复制"?还是有一些不同的解决方案?
我正在使用VSS api创建卷的一些卷影副本,然后使用它们的UNC路径访问它们.
是否有可能获得某种类型的列表,只是在两个连续阴影之间发生了变化?
这样做的显而易见的方法是遍历卷中的所有文件并检查更改,但必须有一个更简单的方法来执行此操作,因为VSS的一个关键功能是它可以节省信息的增量并且只保存改变了.
我们最近更新了一个相当大的ASP.NET网站(~1500th alexa流量排名),以使用在Windows Server 2008 R2上运行的VS2010和.NET 4.0
从那时起,当我们部署新版本的网站时,我们偶尔会注意到这篇文章中的相同错误: ASP.Net无法创建/卷影副本 错误消息是:无法创建/卷影复制'xxxx,版本= 4.0.4301.26898,Culture =当该文件已存在时,中性,PublicKeyToken = null'
但是,与该帖子不同,错误仅在我们的生产环境中发生,并且仅在某些服务器上发生.
在我们发布新版本的代码之后,我们回收所有AppPools并且错误开始发生.
另一个AppPool回收似乎解决了这个问题,但我真的想知道如何才能首先避免这个问题?
我试图阻止我的应用程序锁定我的MEF插件目录中的DLL,以便我可以在运行时覆盖程序集(注意我实际上并没有尝试让MEF在运行时重新加载它们,在下一个应用程序启动很好,我只是不想要停止应用程序来复制)
我试图通过为我的mef加载的程序集创建一个阴影复制的应用程序域来执行此操作,如下所示:
[Serializable]
public class Composer:IComposer
{
private readonly string _pluginPath;
public Composer(IConfigurePluginDirectory pluginDirectoryConfig)
{
_pluginPath = pluginDirectoryConfig.Path;
var setup = new AppDomainSetup();
setup.ShadowCopyFiles = "true"; // really??? is bool not good enough for you?
var appDomain = AppDomain.CreateDomain(AppDomain.CurrentDomain.FriendlyName + "_PluginDomain", AppDomain.CurrentDomain.Evidence, setup);
appDomain.DoCallBack(new CrossAppDomainDelegate(DoWorkInShadowCopiedDomain));
}
private void DoWorkInShadowCopiedDomain()
{
// This work will happen in the shadow copied AppDomain.
var catalog = new AggregateCatalog();
var dc = new DirectoryCatalog(_pluginPath);
catalog.Catalogs.Add(dc);
Container = new CompositionContainer(catalog);
}
public CompositionContainer Container { …Run Code Online (Sandbox Code Playgroud) 我刚刚开始尝试使用moq对我的模块进行单元测试.
实际上,我必须编写单元测试的类使用
Assembly.GetExecutingAssembly().Location 在内部确定路径.
但是,这在编写单元测试时不起作用,因为执行程序集的路径不同(采用单元测试程序集的路径)
AppData\\Local\\Temp\\3ylnx32t.ukg\\TestApplication.Test\\assembly\\dl3\\aeb938e6\\f3664631_d982ce01.
我试过,禁用阴影复制.
AppDomainSetup appDomain= new AppDomainSetup{ShadowCopyFiles = "false",};
appDomain.ShadowCopyFiles=false.ToString();
Run Code Online (Sandbox Code Playgroud)
不过,它不起作用!
任何建议表示赞赏.提前致谢.
我正在编写一个Asp.Net Core应用程序,该应用程序应该能够自行更新(在运行时替换自己的二进制文件).
这篇MSDN文章用经典的.Net框架描述了阴影复制,这正是我所需要的.但.Net Core中缺少整个AppDomain的东西.
所以我的问题是:
有关我可以使默认AppDomain使用某些程序集的卷影副本吗?,它描述了一个工作解决方案,用于在特定目录的默认AppDomain中激活卷影复制.
基本上它说使用这些简单的方法:
AppDomain.CurrentDomain.SetShadowCopyPath(aDirectory);
AppDomain.CurrentDomain.SetShadowCopyFiles();
Run Code Online (Sandbox Code Playgroud)
但是因为这里使用的方法被标记为过时,我想知道现在正是什么方法来实现同样的目标.警告消息提示:
请调查AppDomainSetup.ShadowCopyDirectories的使用
AppDomain有一个这种类型的成员SetupInformation,可以带你进入这个简单的实现
AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories = aDirectory;
AppDomain.CurrentDomain.SetupInformation.ShadowCopyFiles = "true";
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有效果.所以问题是,有没有办法改变当前appdomain的AppDomainSetup以激活阴影复制?
我知道当你设置为true时,它会将文件复制阴影.但是阴影复制是什么意思以及为什么我们需要阴影复制文件?
shadow-copy ×10
.net ×4
appdomain ×3
c# ×3
.net-4.5 ×1
.net-core ×1
asp.net ×1
asp.net-4.0 ×1
asp.net-core ×1
auto-update ×1
backup ×1
com ×1
delphi ×1
dll ×1
mef ×1
nunit ×1
powershell ×1
unit-testing ×1
windows ×1
wmi ×1