Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Win32_打印机管理ObjectSearcher错误(VS2008 C)_C#_Visual Studio 2008_Object - Fatal编程技术网

C# Win32_打印机管理ObjectSearcher错误(VS2008 C)

C# Win32_打印机管理ObjectSearcher错误(VS2008 C),c#,visual-studio-2008,object,C#,Visual Studio 2008,Object,首先,这段代码在VS2005中起作用 每当我尝试跨过foreach循环并分配ManagementObject时,VS2008中的代码就会因UnauthorizedAccessException而崩溃 public static List<string> GetPrintersCollection() { if (printers == null) { printers = new List<string>(); string searchQuery =

首先,这段代码在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.ThroweException for hr内部32错误代码,IntPtr errorInfo 位于System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext 在AcpClasses.PrinterSpool.GetPrinterCollection

当我尝试在“本地人”窗口中查看数据时,这些字段立即看起来可疑: 1.Count-Value:函数求值超时。 2.IsSynchronized-值:由于上一个函数计算超时,因此禁用了函数计算。 3.SyncRoot-值:由于上一个函数计算超时,函数计算被禁用


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

要进一步调试,需要在进入foreach循环之前检查打印机

将断点放在 搜索打印机,接电话。 按F10 现在检查你的物品。 另一件应该有帮助的事情是将err.Message更改为err.ToString

值得一提的是,在XP上运行VS2005和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;
}
编辑:我唯一能想到的另一件事是手动检查打印机和传真,看看是否有任何问题给您带来。

试试这个

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


在我的例子中,这是一个解决方案。

Comment:在别处定义的是List printers=null;这段代码在Visual Studio 2005中也不再有效。我刚刚检查了一个仅查询Win32_打印机的控制台应用程序。我在回答中添加了一些代码,可以帮助诊断您的问题。-打印机{System.Management.ManagementObjectCollection}System.Management.ManagementObjectCollection“+”Count“Printers.Count”引发了类型为“System.UnauthorizedAccessException”的异常,同时,err.ToString提供了以下数据:PrinterSpool-GetPrinterCollection:您没有访问此打印机的权限。\r\n System.UnauthorizedAccessException\r\n位于System.Runtime.InteropServices.Marshall.ThroweException for hr Internality32错误代码,IntPtr errorInfo\r\n位于System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext\r\n位于win32\u printer.Program.GetPrinterCollection上面的信息有帮助吗?我不知道该怎么办。显然,我是自己机器上的管理员,但我也希望此应用程序能为其他机器上的非管理员工作。***注意:很抱歉在多条评论中发布此回复,但似乎对评论长度施加了限制,我不知道如何以其他方式回复邮件***我已经发布了一些代码供您尝试。从您的第二条评论中,您发布了异常处理的内容,我认为这部分阻止了您解决问题。相同的错误Salonen先生:捕获了UnauthorizedAccessException:System.UnauthorizedAccessException\r\n位于System.Runtime.InteropServices.Marshall.ThroweExceptionForHRInternality32错误代码,在C:\\Shared\\JP2 Testing\\win32\U printer\\Program.GetPrinterCollection2中的System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext\r\n处的IntPtr errorInfo\r\n