Обычно WMI работает так, что запрашивает, по крайней мере ... где у вас есть следующее ниже ... после вашего foreach я бы избавился от этих объектов ..
ManagementScope scope = new ManagementScope(@"\\" + computer + @"\root\cimv2");
//connect to the machine
scope.Connect();
//use a SelectQuery to tell what we're searching in
SelectQuery searchQuery = new SelectQuery("SELECT * FROM SoftwareLicensingProduct");
//set the search up
ManagementObjectSearcher searcherObj
если они реализуют IDisposeable, тогда вы можете сделать
((IDisposable)scope).Dispose();
((IDisposable)searchQuery).Dispose();
((IDisposable)searcherObj).Dispose();
если нет, тогда выполните if (), чтобы проверить, если объект! = Null, тогда утилизируйте их по отдельности
Попробуйте выполнить это несколько раз и посмотрите, вернется ли он быстрее или нет, как только вы избавитесь от объектов ... кроме этого ... не так много, что вы можете сделать из того, что похоже, чтобы сделать его быстрее ..