管理异常配额冲突、呼叫已取消、提供程序加载失败
本文关键字:程序 失败 加载 取消 呼叫 异常 冲突 管理 | 更新日期: 2023-09-27 18:34:44
在过去的半年中,有三个用户遇到了问题,您可以在下面看到。
(Error, 27.11.2014 15:47:53+01:00) The request for Windows processes was terminated by an error.
System.Management.ManagementException: Quota violation
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
at System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext()
at System.Linq.Lookup`2.CreateForJoin(IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer)
at System.Linq.Enumerable.<JoinIterator>d__61`4.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
at XY.IsProcessFromDirectoryRunning(String directory)
(Error, 27.11.2014 15:47:53+01:00) The request for Windows processes was terminated by an error.
System.Management.ManagementException: Call cancelled
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
at System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext()
at System.Linq.Lookup`2.CreateForJoin(IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer)
at System.Linq.Enumerable.<JoinIterator>d__61`4.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
at XY.IsProcessFromDirectoryRunning(String directory)
(Error, 27.11.2014 15:47:53+01:00) The request for Windows processes was terminated by an error.
System.Management.ManagementException: Provider load failure
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
at System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext()
at System.Linq.Lookup`2.CreateForJoin(IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer)
at System.Linq.Enumerable.<JoinIterator>d__61`4.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
at XY.IsProcessFromDirectoryRunning(String directory)
(Error, 27.11.2014 15:47:53+01:00) The request for Windows processes was terminated by an error.
System.Management.ManagementException: Provider load failure
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
at System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext()
at System.Linq.Lookup`2.CreateForJoin(IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer)
at System.Linq.Enumerable.<JoinIterator>d__61`4.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
at XY.IsProcessFromDirectoryRunning(String directory)
提供程序加载失败异常将一直持续到应用程序关闭或由于内存泄漏(由此问题导致(而导致的 CTD 为止。我也无法重现这个问题,我尝试从测试应用程序 +/- 1,5M 次调用此方法,但没有问题。
方法应该没问题,但你可以在下面看到它:
public static IEnumerable<Process> GetProcessesFromDirectory(string directory)
{
if (directory.Last() != Path.DirectorySeparatorChar)
{
directory += Path.DirectorySeparatorChar;
}
var wmiQueryString = "SELECT ProcessId, ExecutablePath FROM Win32_Process";
try
{
using (var searcher = new ManagementObjectSearcher(wmiQueryString))
{
return
from process in Process.GetProcesses()
join managementObject in searcher.Get().Cast<ManagementObject>()
on process.Id equals (int)(uint)managementObject["ProcessId"]
let processExecutable = (string)managementObject["ExecutablePath"]
where processExecutable != null && processExecutable.StartsWith(directory, StringComparison.OrdinalIgnoreCase)
select process;
}
}
catch (ManagementException ex)
{
return Enumerable.Empty<Process>();
}
}
public bool IsProcessFromDirectoryRunning(string directory)
{
try
{
return this.GetProcessesFromDirectory(directory).Any();
}
catch (ManagementException ex)
{
this.logger.Log(ex, Strings.ProcessSearchError);
return false;
}
}
问题是如果我遇到提供程序加载失败,我可以以某种方式重新启动它吗?我试图在谷歌上找到答案,但我没有找到任何有用的东西。我将非常感谢任何帮助。
好吧,
我发现使用Process.GetProcesses((并且使用MainModule.FilePath比通过WMI检查进程要快得多,因此WMI的问题将消失。
return Process.GetProcesses().Where(p => p.Id > 4 && !p.HasExited && p.MainModule.FileName.StartsWith(directory));