Reputation: 764
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
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