2009-10-05 10 views
0

Tout d'abord, ce code a fonctionné dans VS2005.Erreur Win32_Printer ManagementObjectSearcher (VS2008 C#)

Le code dans VS2008 se bloque avec une exception UnauthorizedAccessException chaque fois que j'essaie d'enjamber la boucle foreach et d'affecter un objet 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()
à AcpClasses.PrinterSpool.GetPrintersCollection() ...

Lorsque j'essaie d'afficher les données dans la fenêtre Variables locales, ces zones semblent immédiatement suspectes:
1. Count - Valeur: "Expiration de la fonction a expiré."
2. IsSynchronized - Value: évaluation de fonction désactivée car une évaluation de fonction précédente a expiré.
3. SyncRoot - Value: évaluation de la fonction désactivée car une évaluation de fonction précédente a expiré.

Comment puis-je essayer de déboguer davantage pour savoir ce qui se passe?

+0

Commentaire: Défini ailleurs est Liste printers = null; Ce code ne fonctionne plus non plus dans Visual Studio 2005 (je viens de vérifier avec une application console qui interroge Win32_Printer uniquement). – jp2code

+0

J'ai ajouté du code dans ma réponse qui devrait vous aider à diagnostiquer votre problème. –

Répondre

1

Pour déboguer davantage, vous devez inspecter Printers avant d'entrer dans la boucle foreach. Placez un point d'arrêt sur la ligne searchPrinters.Get().

  • Appuyez sur F10
  • Inspectez maintenant votre article. Une autre chose qui devrait aider est de changer err.Message à err.ToString().

    Pour ce que ça vaut, j'ai débogué cela sans aucun problème à la fois VS 2005 & 2008 sur XP.

    EDIT: code d'affichage pour vous d'essayer.

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

    EDIT: La seule autre chose que je peux penser est d'aller manuellement à travers vos Imprimantes et télécopieurs pour voir si causent des problèmes pour vous.

  • +0

    -\t \t Imprimantes \t {} System.Management.ManagementObjectCollection \t System.Management.ManagementObjectCollection '+' Count \t 'Printers.Count' a jeté une exception de type 'System.UnauthorizedAccessException' – jp2code

    +0

    Pendant ce temps, le err.ToString() a donné ces données: "PrinterSpool - GetPrintersCollection: Vous n'avez pas l'autorisation d'accéder à cette imprimante. \ r \ nSystem.UnauthorizedAccessException \ r \ n à System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo) \ r \ n à System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext() \ r \ n à win32_printer.Program.GetPrintersCollection() – jp2code

    +0

    Est-ce que les informations ci-dessus aident? Je ne sais pas Que dois-je faire avec ça. Évidemment, je suis un administrateur sur ma propre machine, mais je veux aussi que cette application fonctionne pour d'autres (c'est-à-dire non-admins) sur d'autres machines. *** (NOTE: Désolé de poster cette réponse dans plusieurs commentaires, mais SO semble imposer une limite à la longueur du commentaire, et je ne sais pas comment répondre autrement à un message.) *** – jp2code

    1

    Essayez cette

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

    La valeur par défaut pour le délai doit être TimeSpan.MaxValue, mais ...

    Il était une solution dans mon cas.