Honza Kovář
Honza Kovář

Reputation: 764

ManagementException Quota violation, Call cancelled, Provider load failure

During past half of the year three users had problem which you can see below.

(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)

The Provider load failure exception persists until shutdown of the application or until CTD due to memory leak (which is caused by this problem). Also I am not able to reproduce this problem, I tried call this method from test application +/- 1,5M times, but it was without problem.

Method should be OK, but you can see it below:

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;
    }
}

Question is if I am getting Provider load failure can I somehow restart it? I tried to find answer on google, but I didn't find anything useful. I will be very grateful for any help.

Upvotes: 0

Views: 2445

Answers (1)

Honza Kov&#225;ř
Honza Kov&#225;ř

Reputation: 764

Well I found that use Process.GetProcesses() and there use MainModule.FilePath is much more faster then check processes through WMI, so problems with WMI will be gone.

return Process.GetProcesses().Where(p => p.Id > 4 && !p.HasExited && p.MainModule.FileName.StartsWith(directory));

Upvotes: 1

Related Questions