Ошибка Win32_Printer ManagementObjectSearcher (VS2008 C #) - PullRequest
0 голосов
/ 05 октября 2009

Во-первых, этот код работал в VS2005.

Код в VS2008 аварийно завершает работу с UnauthorizedAccessException каждый раз, когда я пытаюсь перешагнуть цикл foreach и назначить ManagementObject.

public static List<string> GetPrintersCollection() {
  if (printers == null) {
    printers = new List<string>();
    string searchQuery = "SELECT * FROM Win32_Printer";
    try {
      using (ManagementObjectSearcher searchPrinters = new ManagementObjectSearcher(searchQuery)) {
        ManagementObjectCollection Printers = searchPrinters.Get(); // <= Printers data below
        foreach (ManagementObject printer in Printers) { // <= Error Here
          printers.Add(printer.Properties["Name"].Value.ToString());
        }
      }
    } catch (UnauthorizedAccessException err) {
      Console.WriteLine(err.Message); // the message is an empty string
      throw new Exception("PrinterSpool - GetPrintersCollection: You do not have authorization to access this printer.");
    } catch (Exception err) {
      throw new Exception(string.Format("PrinterSpool - GetPrintersCollection: {0}", err.Message));
    }
  }
  return printers;
}

StackTrace =
в System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo)
в System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext ()
at AcpClasses.PrinterSpool.GetPrintersCollection () ...

Когда я пытаюсь просмотреть данные в окне Locals, эти поля выглядят подозрительно сразу:
1. Count - значение: «Тайм-аут оценки функции.»
2. IsSynchronized - значение: оценка функции отключена, поскольку истек срок ожидания предыдущей оценки функции.
3. SyncRoot - значение: оценка функции отключена, поскольку истекло время предыдущей оценки функции.

Как я могу попытаться отладить это дальше, чтобы выяснить, что происходит?

Ответы [ 2 ]

1 голос
/ 07 января 2011

Попробуйте это

       `string strQuery = "SELECT * FROM Win32_Printer";

        ObjectQuery objectQuery = new ObjectQuery(strQuery);

        ManagementObjectSearcher query = new ManagementObjectSearcher(objectQuery);
        query.Options.Timeout=new TimeSpan(0,0,5);
        ManagementObjectCollection queryCollection = query.Get();

            foreach (ManagementObject managementObject in queryCollection)
            {....}`

Значением по умолчанию для Timeout должно быть TimeSpan.MaxValue, но ...

Это было решение в моем случае.

1 голос
/ 05 октября 2009

Для дальнейшей отладки необходимо проверить Printers перед входом в цикл foreach.

  1. Установите точку останова на searchPrinters.Get() строка.
  2. Нажмите F10
  3. Теперь осмотрите ваш предмет.

Еще одна вещь, которая должна помочь - это изменить err.Message на err.ToString().

Что бы это ни стоило, я отладил это без проблем, запустив VS 2005 и 2008 на XP.

РЕДАКТИРОВАТЬ : опубликовать код для вас попробовать.

public static List<string> GetPrintersCollection()
{
    if (printers == null)
    {
        printers = new List<string>();
        string searchQuery = "SELECT * FROM Win32_Printer";
        try
        {
            using (ManagementObjectSearcher searchPrinters = new ManagementObjectSearcher(searchQuery))
            {
                ManagementObjectCollection Printers = searchPrinters.Get(); // <= Printers data below
                foreach (ManagementObject printer in Printers)
                {
                    printers.Add(printer.Properties["Name"].Value.ToString());
                }
            }
        }
        catch (UnauthorizedAccessException err)
        {
            //Log & re-throw
            Console.WriteLine("Caught UnauthorizedAccessException:  " + err.ToString()); 
            throw;  //re-throw existing exception, not a new one
        }
        //there's no reason to catch the plain-old Exception 
    }

    return printers;
}

РЕДАКТИРОВАТЬ : Единственное, о чем я могу подумать, - это вручную просмотреть ваши принтеры и факсы , чтобы выяснить, не вызывают ли они у вас проблемы.

...