管理异常配额冲突、呼叫已取消、提供程序加载失败

本文关键字:程序 失败 加载 取消 呼叫 异常 冲突 管理 | 更新日期: 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));