how can I get the client's printer list in ASP.NET [closed]

0

Will someone know if there is any way to list the printers on the client side? I was using system.drawing but it just lists me from the server.

Any suggestions?

    
asked by Alex 20.06.2018 в 00:24
source

1 answer

0

You can not access the resources of an ASP.NET client directly because of security issues. You will need to implement a ActiveX control or use Silverlight for it. I show you an example of a control that I implemented years ago. (some steps I put text in English because this way I have my Visual Studio set.

  • You must create a class library and sign the assembly. Project properties\Signing\Sign the assembly .
  • Mark Project properties\Build\Output\Register for COM Interop .
  • Set postcompilation events (this is to test in your local) in Project properties\Build events\Post-build event command line put

      echo Un-register the components first
      "C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "$(TargetDir)$(TargetFileName)" /tlb:ActiveXPrinter.tlb /codebase /u
      echo Register the components
      "C:\Windows\Microsoft.NET\Framework\v4.0.30319 \RegAsm.exe" "$(TargetDir)$(TargetFileName)" /tlb:ActiveXPrinter.tlb /codebase
      echo All done
    
  • Now the code of your control.

    using System;
    using System.Linq;
    using System.Management;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Text;
    using Microsoft.Win32;
    
    namespace ActiveXPrinter
    {
        [ProgId("ActiveXPrinter.PrinterHelper")]
        [ClassInterface(ClassInterfaceType.AutoDual)]
        [Guid("C0167B9D-2987-331A-97F6-3BCEF78E041A")]
        [ComVisible(true)]
        public class PrinterHelper
        {
            #region Register/Unregister
    
            [ComRegisterFunction()]
            public static void RegisterClass(string key)
            {
                // Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it
                StringBuilder sb = new StringBuilder(key);
                sb.Replace(@"HKEY_CLASSES_ROOT\", "");
    
                // Open the CLSID\{guid} key for write access
                RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
    
                // And create the 'Control' key - this allows it to show up in 
                // the ActiveX control container 
                RegistryKey ctrl = k.CreateSubKey("Control");
                ctrl.Close();
    
                // Next create the CodeBase entry - needed if not string named and GACced.
                RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
                inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
                inprocServer32.Close();
    
                // Finally close the main key
                k.Close();
            }
    
            [ComUnregisterFunction()]
            public static void UnregisterClass(string key)
            {
                StringBuilder sb = new StringBuilder(key);
                sb.Replace(@"HKEY_CLASSES_ROOT\", "");
    
                // Open HKCR\CLSID\{guid} for write access
                RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
    
                // Delete the 'Control' key, but don't throw an exception if it does not exist
                k.DeleteSubKey("Control", false);
    
                // Next open up InprocServer32
                RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
    
                // And delete the CodeBase key, again not throwing if missing 
                k.DeleteSubKey("CodeBase", false);
    
                // Finally close the main key 
                k.Close();
            }
    
            #endregion
    
            [ComVisible(true)]
            public string Devuelve(string mensaje)
            {
                //Método "dummy" que devuelve la entrada. Vale para probar que el ActiveX está bien instalado
                return mensaje;
            }
    
            [ComVisible(true)]
            public string GetPrinters()
            {
                //Obtenemos las impresoras instaladas en el cliente
                SelectQuery oSelectQuery = new SelectQuery { QueryString = "select * from win32_printer" };
    
                ManagementObjectSearcher search = new ManagementObjectSearcher(oSelectQuery);
                ManagementObjectCollection results = search.Get();
    
                //Guardamos el nombre de la impresora que actualmente tiene por defecto el usuario
                string impresoraOriginalPorDefecto = string.Empty;
                foreach (ManagementObject printer in results)
                {
                    impresoraOriginalPorDefecto += printer["Name"].ToString() + "|";
                }
                return impresoraOriginalPorDefecto;
            }
    
            [ComVisible(true)]
            public string GetDefaultPrinter()
            {
                string salida = string.Empty;
                //Obtenemos la impresora instaladas en el cliente que esté marcada como "por defecto"
                SelectQuery oSelectQuery = new SelectQuery { QueryString = "select * from win32_printer where Default = True" };
    
                ManagementObjectSearcher search = new ManagementObjectSearcher(oSelectQuery);
                ManagementObjectCollection results = search.Get();
    
                if (results.Count > 0)
                {
                    salida = results.OfType<ManagementObject>().First()["Name"].ToString();
                }
    
                return salida;
            }
    
            [ComVisible(true)]
            public Boolean SetDefaultPrinter(string printerName)
            {
                bool salida = false;
    
                //Obtenemos las impresoras instaladas en el cliente con el nombre especificado
                SelectQuery oSelectQuery = new SelectQuery { QueryString = "select * from win32_printer where Name = '"+ printerName + "'" };
    
                ManagementObjectSearcher search = new ManagementObjectSearcher(oSelectQuery);
                ManagementObjectCollection results = search.Get();
    
    
                if (results.Count > 0)
                {
                    results.OfType<ManagementObject>().First().InvokeMethod("SetDefaultPrinter", null);
                    salida = true;
                }
    
                return salida;
            }
    
            [ComVisible(true)]
            public Boolean SetDefaultPrinterMask(string printerMask)
            {
                bool salida = false;
    
                //Obtenemos las impresoras instaladas en el cliente
                SelectQuery oSelectQuery = new SelectQuery { QueryString = "select * from win32_printer" };
    
                ManagementObjectSearcher search = new ManagementObjectSearcher(oSelectQuery);
                ManagementObjectCollection results = search.Get();
    
                //Establecemos la impresora por defecto para imprimir
                foreach (ManagementObject printer in results)
                {
                    //Se encuentra la impresora con nombre que contenga lo que nos especifican y se pone por defecto
                    if (printer["Name"].ToString().ToUpper().Trim().Contains(printerMask.ToUpper()))
                    {
                        printer.InvokeMethod("SetDefaultPrinter", null);
                        salida = true;
                        break;
                    }
                }
    
                return salida;
            }
        }
    }
    
  • answered by 20.06.2018 / 16:49
    source