Во-первых, этот код работал в 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 - значение: оценка функции отключена, поскольку истекло время предыдущей оценки функции.
Как я могу попытаться отладить это дальше, чтобы выяснить, что происходит?