8

这是我们正在尝试做的事情:

我们想要一种不显眼的方式来获取客户在他们的计算机上打印的所有内容(我们所有的客户都运行 POS 系统并专门使用 Windows XP)并将其发送给我们,我们已经决定最好的方法是创建 ac # 向我们发送他们的假脱机文件的应用程序,我们已经可以轻松解析这些文件。

但是,这需要将“保留所有打印的文档”设置为 true。我们希望在我们的应用程序中而不是手动执行此操作,原因如下:我们的一些(数百)客户,因为没有更好的词,是愚蠢的。我们不想强迫他们在控制面板里乱来……我们的技术支持人员已经够忙了。

这是我遇到问题的地方:

string searchQuery = "SELECT * FROM Win32_Printer";
ManagementObjectSearcher searchPrinters = new ManagementObjectSearcher(searchQuery);
ManagementObjectCollection printerCollection = searchPrinters.Get();


foreach (ManagementObject printer in printerCollection)
{
    PropertyDataCollection printerProperties = printer.Properties;
    foreach (PropertyData property in printerProperties)
    {
        if (property.Name == "KeepPrintedJobs")
        {
            printerProperties[property.Name].Value = true;
        }
    }
}

据我从几个小时的 WMI 研究中可以看出,这应该将每台打印机的 KeepPrintedJobs 属性设置为 true ......但它不起作用。一旦 foreach 循环结束,KeepPrintedJobs 就会被设置回 false。我们更喜欢使用 WMI 而不是在注册表中乱七八糟,但我不能永远花时间尝试使这项工作。关于缺少什么的任何想法?

4

1 回答 1

5

Put()尝试在 上添加调用以ManagementObject显式保留更改,如下所示:

foreach (ManagementObject printer in printerCollection)
{
    PropertyDataCollection printerProperties = printer.Properties;
    foreach (PropertyData property in printerProperties)
    {
        if (property.Name == "KeepPrintedJobs")
        {
            printerProperties[property.Name].Value = true;
        }
    }
    printer.Put();
}

希望有帮助。

于 2013-06-06T17:04:41.603 回答