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.