2012-08-24 15 views
6

Esto es lo que estamos tratando de hacer:de Configuración de la impresora en .NET

Queremos una manera discreta de tomar todo lo que un cliente imprime en su ordenador (todos nuestros clientes están funcionando los sistemas de punto de venta y uso Windows XP exclusivamente) y enviándonoslo, y hemos decidido que la mejor manera de hacerlo es crear una aplicación de CA que nos envíe sus archivos de spool, que ya podemos analizar fácilmente.

Sin embargo, esto requiere configurar "Mantener todos los documentos impresos" en verdadero. Queremos hacer esto en nuestra aplicación en lugar de hacerlo manualmente, por la siguiente razón: algunos (cientos) de nuestros clientes son, a falta de una palabra mejor, tontos. No queremos obligarlos a perder el control en el panel de control ... nuestra gente de soporte técnico ya está lo suficientemente ocupada.

Aquí es donde me he encontrado con un problema:

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

Esto debería, por lo que yo puedo decir de varias horas de investigación WMI, establezca la propiedad KeepPrintedJobs de cada impresora para cierto ... pero no funciona. Tan pronto como el bucle foreach finalice, KeepPrintedJobs volverá a ser falso. Preferiríamos usar WMI y no perder el tiempo en el registro, pero no puedo pasar el resto de mi tiempo intentando que esto funcione. ¿Alguna idea sobre lo que falta?

+0

Alguien sabe algo de esto? En su lugar, hemos avanzado con un pequeño hack de registro, pero aún nos gustaría saber si esto es posible. –

+1

¿Has visto esto: http://msdn.microsoft.com/en-us/library/w09tfy94.aspx? Me parece que debe llamar a una de las sobrecargas de 'Put()' para confirmar explícitamente los cambios. –

+0

* Golpes en la frente * tonto, por supuesto, gracias hombre. Reg hacks se siente sucio. –

Respuesta

3

Trate de añadir una llamada a Put() en el ManagementObject a persistir de forma explícita el cambio, así:

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

Espero que ayude.

+0

Ya hemos lanzado a nuestro cliente de XP, muchos de los cuales utilizan XPe, por lo que habría tenido que usar el método de registro de todos modos, ya que tendríamos que apuntar a las versiones anteriores de .NET. Sin embargo, esto nos va a ser útil en el futuro cercano, ¡gracias! –

Cuestiones relacionadas