Getting an error while creating a printer: "Generic failure"

474 Views Asked by At

I'm attempting to install a local network printer without administrative privileges. However, during the installation process, I encounter the following error: Error CreatePrinter: Generic failure. The error is in the function CreatePrinter in the catch block.

I would greatly appreciate it if you could provide guidance on what might be incorrect in my code.

Please find below my PrinterInstaller class for your reference.

namespace ClassName
{
    public class PrinterInstaller
    {
        private string printerIP = "127.0.0.1";
        private string driverName = "Generic / Text Only";
        private string printerName = "printerName";
        private string PrinterPortName = "printerName";
        private int listeningPort = 9200;
        private ManagementScope managementScope;

        [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool SetDefaultPrinter(string Name);

        public PrinterInstaller()
        {
            CreateManagementScope();
        }

        private void CreateManagementScope()
        {
            var wmiConnectionOptions = new ConnectionOptions
            {
                Impersonation = ImpersonationLevel.Impersonate,
                Authentication = AuthenticationLevel.Default,
                EnablePrivileges = true
            };

            string path = $@"\\.\root\cimv2";
            managementScope = new ManagementScope(path, wmiConnectionOptions);
            managementScope.Connect();
        }

        private bool CheckPrinterPort()
        {
            try
            {
                ObjectQuery query = new ObjectQuery($"SELECT * FROM Win32_TCPIPPrinterPort WHERE HostAddress = '{printerIP}' AND PortNumber = {listeningPort}");
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(managementScope, query);
                ManagementObjectCollection queryCollection = searcher.Get();
                return queryCollection.Count > 0;
            }
            catch (Exception ex)
            {
                LogHelper.Log("Error CheckPrinterPort: " + ex.Message);
                MessageBox.Show("Error CheckPrinterPort: " + ex.Message);
                return false;
            }
        }

        private bool CreatePrinter()
        {
            try
            {
                var printerClass = new ManagementClass(managementScope, new ManagementPath("Win32_Printer"), new ObjectGetOptions());
                printerClass.Get();
                var printer = printerClass.CreateInstance();

                if (printer != null)
                {
                    printer.SetPropertyValue("DriverName", driverName);
                    printer.SetPropertyValue("PortName", PrinterPortName);
                    printer.SetPropertyValue("Name", printerName);
                    printer.SetPropertyValue("DeviceID", printerName);
                    printer.SetPropertyValue("Location", printerName);
                    printer.SetPropertyValue("Network", true);
                    printer.SetPropertyValue("Shared", false);
                    printer.Put();
                    return true;
                }
                else
                {
                    LogHelper.Log("Error creating printer instance.");
                    MessageBox.Show("Error creating printer instance.");
                    return false;
                }
            }
            catch (Exception ex)
            {
                LogHelper.Log("Error CreatePrinter: " + ex.Message);
                MessageBox.Show("Error CreatePrinter: " + ex.Message);
                return false;
            }
        }

        internal bool InstallPrinterWMI()
        {
            try
            {
                bool printerPortExists = CheckPrinterPort();
                bool printerCreated = CreatePrinter();

                if (printerPortExists && printerCreated)
                {
                    // Set as the default printer (optional)
                    SetDefaultPrinter(printerName);

                    return true;
                }

                return false;
            }
            catch (Exception ex)
            {
                LogHelper.Log("Error while installing printer: " + ex.Message);
                MessageBox.Show("Error while installing printer: " + ex.Message);
                return false;
            }
        }

        internal bool UnInstallPrinter()
        {
            try
            {
                // Delete printer
                var printerClass = new ManagementClass(managementScope, new ManagementPath("Win32_Printer"), new ObjectGetOptions());
                ManagementObjectCollection printers = printerClass.GetInstances();

                foreach (ManagementObject printer in printers)
                {
                    if (printer["Name"].ToString() == printerName)
                        printer.Delete();
                }

                // Delete printer port
                ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_TCPIPPrinterPort WHERE HostAddress = '" + printerIP + "' AND PortNumber = " + listeningPort);
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(managementScope, query);

                ManagementObjectCollection queryCollection = searcher.Get();
                foreach (ManagementObject port in queryCollection)
                {
                    port.Delete();
                }

                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        //{other private functions....}//
    }
}

Thanks in advance.

0

There are 0 best solutions below