2009-10-05 35 views
0

首先,此代碼在VS2005中工作。Win32_Printer ManagementObjectSearcher錯誤(VS2008 C#)

無論何時嘗試跨越foreach循環並分配ManagementObject時,VS2008中的代碼都會崩潰並伴隨UnauthorizedAccessException。

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

堆棧跟蹤=
在System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(的Int32的errorCode,IntPtr的errorInfo中)
在System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
在AcpClasses.PrinterSpool.GetPrintersCollection ()...

當我嘗試查看本地窗口中的數據時,這些字段看起來立即可疑:
1.計數 - 值:「功能評估超時。
2. IsSynchronized - 值:功能評估由於先前的功能評估超時而被禁用。
3. SyncRoot - 值:功能評估被禁用,因爲之前的功能評估超時。

我該如何嘗試進一步調試以找出發生了什麼?

+0

評論: 其他地方定義爲列表 printers = null; 此代碼也不再適用於Visual Studio 2005(我剛剛查詢了僅查詢Win32_Printer的控制檯應用程序)。 – jp2code 2009-10-05 15:20:13

+0

我在回答中添加了一些代碼,可以幫助診斷您的問題。 – 2009-10-05 19:54:15

回答

1

要進一步調試,您需要在進入foreach循環之前檢查Printers

  1. searchPrinters.Get()行上設置斷點。
  2. 新聞F10
  3. 現在檢查您的項目。

另一件應該幫助的事情是將err.Message更改爲err.ToString()

對於它的價值,我在XP上運行VS 2005 & 2008時沒有任何問題進行調試。

編輯:發佈代碼供您試用。

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

編輯:我能想到的唯一的另一件事是手動完成的打印機和傳真,看看是否有導致問題的爲您服務。

+0

- \t \t \t打印機{System.Management.ManagementObjectCollection} \t System.Management.ManagementObjectCollection '+' 計數\t 'Printers.Count' 扔類型 'System.UnauthorizedAccessException的' – jp2code 2009-10-05 17:46:07

+0

同時,err.ToString的異常() 「PrinterSpool - GetPrintersCollection:您沒有權限訪問此打印機。\ System \ n在System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()\ r \ n在win32_printer.Program.GetPrintersCollection() – jp2code 2009-10-05 17:46:42

+0

上面的信息有幫助嗎?我不知道如何處理它。顯然,我是我自己機器上的管理員,但我也希望此應用程序能夠在其他機器上爲其他人(即非管理員)工作。 ***(注意:很抱歉在多條評論中發佈此回覆,但是SO似乎對評論長度施加了限制,並且我不知道如何以其他方式回覆郵件。)*** – jp2code 2009-10-05 17:49:06

1

嘗試超時這個

 `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) 
      {....}` 

默認值必須是TimeSpan.MaxValue,但是......

這是在我的情況的解決方案。