【问题标题】:Win32_Printer ManagementObjectSearcher Error (VS2008 C#)Win32_Printer ManagementObjectSearcher 错误(VS2008 C#)
【发布时间】:2011-01-07 20:44:05
【问题描述】:

首先,此代码在 VS2005 中有效。

每当我尝试跨过 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()...

当我尝试在 Locals 窗口中查看数据时,这些字段看起来很可疑:
1. 计数 - 值:“函数评估超时。”
2. IsSynchronized - 值:函数评估已禁用,因为之前的函数评估超时。
3. SyncRoot - 值:函数评估被禁用,因为之前的函数评估超时。

如何尝试进一步调试以了解发生了什么?

【问题讨论】:

  • 注释:在别处定义的是 List printers = null;此代码在 Visual Studio 2005 中也不再适用(我刚刚检查了一个仅查询 Win32_Printer 的控制台应用程序)。
  • 我在答案中添加了一些代码,应该有助于诊断您的问题。

标签: c# visual-studio-2008 object


【解决方案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;
}

编辑:我能想到的唯一另一件事是手动检查您的打印机和传真,看看是否有任何问题给您造成问题。

【讨论】:

  • - 打印机 {System.Management.ManagementObjectCollection} System.Management.ManagementObjectCollection '+' Count 'Printers.Count' 引发了“System.UnauthorizedAccessException”类型的异常
  • 同时,err.ToString() 给出了以下数据:“PrinterSpool - GetPrintersCollection:您无权访问此打印机。\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()
  • 以上信息有帮助吗?我不知道该怎么办。显然,我是我自己机器上的管理员,但我也希望这个应用程序能够为其他机器上的其他人(即非管理员)工作。 ***(注意:很抱歉在多个 cmets 中发布此回复,但 SO 似乎对评论长度施加了限制,我不知道如何回复消息。) ***
  • 我已经发布了一些代码供您尝试。从您的第二条评论中,您发布了 your 异常处理的内容,我认为这部分阻止了您解决问题。
  • Salonen 先生同样的错误:“Caught UnauthorizedAccessException: System.UnauthorizedAccessException\r\n at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)\r \n 在 System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()\r\n 在 win32_printer.Program.GetPrintersCollection2() 在 C:\\Shared\\jp2Testing\\win32_printer\\Program.cs:line 57"
【解决方案2】:

试试这个

       `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,但是...

对我来说这是一个解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多