通过PsExec与.Net应用程序发生间歇性灾难性故障异常

时间:2014-04-29 12:57:17

标签: c# .net

当我们尝试通过PsExec在远程计算机上运行.Net 4.0应用程序时,我们发现了间歇性问题。 目标计算机是安装了.Net 4.0和.Net 4.5的64位Windows Server 2008 SP2。

我已经被告知,自从.Net 4.5安装以来,这已经发生了,但我是该项目的新手,所以我无法确认这是问题何时开始发生

失败的代码是这样做的:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
return (ParameterData)config.GetSection("ParameterData");

这是堆栈跟踪:

System.Configuration.ConfigurationErrorsException: An error occurred loading a configuration file: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED)) ---> System.Runtime.InteropServices.COMException: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
   at System.Security.Policy.PEFileEvidenceFactory.GetLocationEvidence(SafePEFileHandle peFile, SecurityZone& zone, StringHandleOnStack retUrl)
   at System.Security.Policy.PEFileEvidenceFactory.GenerateLocationEvidence()
   at System.Security.Policy.PEFileEvidenceFactory.GenerateEvidence(Type evidenceType)
   at System.Security.Policy.AssemblyEvidenceFactory.GenerateEvidence(Type evidenceType)
   at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
   at System.Security.Policy.Evidence.GetHostEvidence(Type type, Boolean markDelayEvaluatedEvidenceUsed)
   at System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType)
   at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
   at System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext()
   at System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext()
   at System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName)
   at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath)
   at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
   at System.Configuration.ClientConfigurationHost.get_ConfigPaths()
   at System.Configuration.ClientConfigurationHost.GetStreamName(String configPath)
   at System.Configuration.BaseConfigurationRecord.InitConfigFromFile()
   --- End of inner exception stack trace ---
   at System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal)
   at System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(ConfigurationSchemaErrors schemaErrors)
   at System.Configuration.Configuration..ctor(String locationSubPath, Type typeConfigHost, Object[] hostInitConfigurationParams)
   at System.Configuration.ClientConfigurationHost.OpenExeConfiguration(ConfigurationFileMap fileMap, Boolean isMachine, ConfigurationUserLevel userLevel, String exePath)
   at System.Configuration.ConfigurationManager.OpenExeConfigurationImpl(ConfigurationFileMap fileMap, Boolean isMachine, ConfigurationUserLevel userLevel, String exePath, Boolean preLoad)
   at System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel userLevel)

这是在我们的自动化测试构建部署过程中执行的。我已经能够将其归结为一个执行上述代码的简单可执行文件,我从我的Windows 7开发机器调用PsExec,但问题是间歇性的。 如果我在PsExec的调用之间等待几分钟,似乎会更频繁地发生。我今天开始研究这个问题,并且能够在早上定期重复这个问题,但下午不是很容易。

我还在事件日志中看到这样的警告:

Windows检测到您的注册表文件仍在被其他应用程序或服务使用。该文件现在将被卸载。保存注册表文件的应用程序或服务可能在以后无法正常运行。

细节 -  从\ Registry \ User \ mySID泄露的1个用户注册表句柄: 进程5568()已打开键\ REGISTRY \ USER \ mySID

我不知道事件日志错误与异常的关系(如果有的话)。

PsExec命令行是:PsExec / accepteula \\ myServerName -d" path_to_exe"

我想知道用户个人资料服务是否存在问题,所以我在考虑在拨打PsExec时没有加载个人资料,但由于它是如此间歇性的,我还是我不知道如果我修好它怎么知道。 搜索互联网表明有些人认为它可能与模仿有关,但没有任何东西与我的情况直接相符。

有没有人见过这样的东西?这真的很奇怪。

谢谢! 菲尔

1 个答案:

答案 0 :(得分:1)

如果它在本地运行时有效,但在远程运行时无法运行,则有可能:

使用PsExec时,远程计算机上的程序限制为150MB内存

在远程计算机上运行此命令将允许远程命令使用超过150 MB的内存:

set-item wsman:localhost\Shell\MaxMemoryPerShellMB 2048