C # Удалить порт принтера в Windows Printer Management

В настоящее время я пишу вспомогательный класс (оболочку) для управления принтером Windows.

На данный момент я могу создавать и удалять объекты принтера.

На одном из следующих шагов я хочу сделать то же самое для портов принтера.

В настоящий момент я использую следующий код для создания нового порта принтера в принтере Windows управление.

1.) DLL-Import

  [DllImport ("winspool.drv")] частный статический extern bool OpenPrinter (строка имя_принтера,  out IntPtr phPrinter, ref PrinterDefaults printerDefaults); [DllImport ("winspool.drv")] частный статический extern bool ClosePrinter (IntPtr phPrinter); [DllImport ("winspool.drv", CharSet = CharSet.Unicode)] частный статический externataWol Xc  (IntPtr hXcv, строка pszDataName, IntPtr pInputData, UInt32 cbInputData, out IntPtr pOutputData, UInt32 cbOutputData, out UInt32 pcbOutputNeeded, out UInt32 pdwStatus);  

.

 //////Определяет настройки принтера по умолчанию, такие как доступ  права/// [StructLayout (LayoutKind.Sequential)] внутренняя структура PrinterDefaults {public IntPtr pDataType;  общедоступный IntPtr pDevMode;  public PrinterAccess DesiredAccess;}//////Сохраняет данные порта для добавления нового порта принтера/// [StructLayout (LayoutKind.Sequential, CharSet = CharSet.Unicode)] внутренняя структура CreatePortData {[  MarshalAs (UnmanagedType.ByValTStr, SizeConst = 64)] общедоступная строка sztPortName;  public UInt32 dwVersion;  общедоступный UInt32 dwProtocol;  public UInt32 cbSize;  public UInt32 dwReserved;  [MarshalAs (UnmanagedType.ByValTStr, SizeConst = 49)] общедоступная строка sztHostAddress;  [MarshalAs (UnmanagedType.ByValTStr, SizeConst = 33)] общедоступная строка sztSNMPCommunity;  public UInt32 dwDoubleSpool;  [MarshalAs (UnmanagedType.ByValTStr, SizeConst = 33)] общедоступная строка sztQueue;  [MarshalAs (UnmanagedType.ByValTStr, SizeConst = 16)] общедоступная строка sztIPAddress;  [MarshalAs (UnmanagedType.ByValArray, SizeConst = 540)] публичный байт [] Зарезервирован;  public UInt32 dwPortNumber;  общедоступный UInt32 dwSNMPEnabled;  public UInt32 dwSNMPDevIndex;}//////Задает идентификаторы для обозначения доступа к принтеру/// внутреннее перечисление PrinterAccess {ServerAdmin = 0x01, ServerEnum = 0x02, PrinterAdmin = 0x04, PrinterUse = 0x08, JobAdmin =  0x10, JobRead = 0x20, StandardRightsRequired = 0x000f0000, PrinterAllAccess = (StandardRightsRequired | PrinterAdmin | PrinterUse)}  

3.) Метод

 //////Добавляет новый порт принтера в систему управления печатью Windows////// Тип конфигурации порта.  Например Стандартный порт TCP/IP. /// /// /// /// Происходит, когда параметр равен нулю или пустому /// Происходит, когда не удалось добавить новый порт TCP-принтера в управление принтером   public static void CreatePrinterPort (string configurationType, string portName, PrinterPortType portType, string endpoint) {//Проверка if (String.IsNullOrEmpty (configurationType)) throw new ArgumentNullException (nameof (configurationType));  if (String.IsNullOrEmpty (portName)) выбросить новое исключение ArgumentNullException (nameof (portName));  if (String.IsNullOrEmpty (endpoint)) выбросить новое исключение ArgumentNullException (nameof (конечная точка)); //Открывает управление принтером PrinterDefaults defaults = new PrinterDefaults {DesiredAccess = PrinterAccess.ServerAdmin};  if (! OpenPrinter (", XcvMonitor" + configurationType, out IntPtr printerHandle, ref по умолчанию)) {string message = String.Format (Resources.FailedToOpenPrinterManagement, configurationType);  выбросить новое исключение PrinterManagementHelperException (сообщение);  } try {//Определяет свойства порта CreatePortData portData = new CreatePortData {dwVersion = 1, dwProtocol = (uint) portType, dwPortNumber = portType == PrinterPortType.Raw?  9100u: 515u, dwReserved = 0, sztPortName = имя порта, sztIPAddress = конечная точка, sztHostAddress = конечная точка, sztSNMPCommunity = "общедоступный", dwSNMPEnabled = 1, dwSNMPDevIndex = 1}; //Устанавливает свойства порта в указатель uint size = (uint) Marshal.SizeOf (portData);  portData.cbSize = размер;  Указатель IntPtr = Marshal.AllocHGlobal ((int) size);  Marshal.StructureToPtr (portData, указатель, истина);  try {//Добавляет порт в управление принтером if (! XcvDataW (printerHandle, "AddPort", указатель, размер, out IntPtr outputData, 0, out uint outputNeeded, out uint status)) throw new PrinterManagementHelperException (Resources.FailedToAddTcpPrinterPortToPrinterManagement);  } catch (исключение) {бросить;  } наконец {Marshal.FreeHGlobal (указатель);  }} catch (исключение исключения) {string message = String.Format (Resources.FailedToAddTcpPrinterPort, configurationType, portName, portType, endpoint);  выбросить новое исключение PrinterManagementHelperException (сообщение, исключение);  } наконец {ClosePrinter (printerHandle);  }}  

Я нашел следующую тему в MSDN. В зависимости от темы я должен изменить параметр «AddPort» на «DeletePort». Изменение значения параметра не удаляет порт принтера из управления принтером. Статус, который возвращает метод, — 13 (HEX: 0x0000000d). Что касается кодов ошибок Win32, данные кажутся недействительными. Кто-нибудь знал, как установить данные, когда я хочу удалить порт принтера?

Обновление 1

Я понял, что структура данных порта, которую я использовал в приведенном выше примере кода, предназначена только для добавления портов принтера. Я нашел для этого тему на MSDN. Также есть еще одна тема о структуре для удаления порта принтера. Я попытался перестроить модель на основе образца структуры CreatePortData . Я создал следующую структуру

 //////Хранит данные порта для удаления существующего порта принтера/// [StructLayout (  LayoutKind.Sequential, CharSet = CharSet.Unicode)] внутренняя структура DeletePortData {[MarshalAs (UnmanagedType.ByValTStr, SizeConst = 64)] общедоступная строка sztPortName;  [MarshalAs (UnmanagedType.ByValTStr, SizeConst = 49)] общедоступная строка sztName;  public UInt32 dwVersion;  public UInt32 dwReserved;  [MarshalAs (UnmanagedType.ByValArray, SizeConst = 540)] public byte [] Reserved;}  

Теперь весь исходный код для удаления порта принтера выглядит следующим образом:

 //////Удаляет существующий порт принтера из управления принтером////// Тип конфигурации  порт.  Например, стандартный порт TCP/IP. ///  public static void DeletePrinterPort (string configurationType, string portName) {//Validation if (String.IsNullOrEmpty (configurationType)  ) выбросить новое исключение ArgumentNullException (nameof (configurationType));  if (String.IsNullOrEmpty (portName)) выбросить новое исключение ArgumentNullException (nameof (portName)); //Открывает управление принтером PrinterDefaults defaults = new PrinterDefaults {DesiredAccess = PrinterAccess.ServerAdmin};  if (! OpenPrinter (", XcvMonitor" + configurationType, out IntPtr printerHandle, ref по умолчанию)) {string message = String.Format (Resources.FailedToOpenPrinterManagement, configurationType);  выбросить новое исключение PrinterManagementHelperException (сообщение);  } try {//Определяет свойства порта DeletePortData portData = new DeletePortData {dwVersion = 1, dwReserved = 0, sztPortName = portName}; //Устанавливает свойства порта в указатель uint size = (uint) Marshal.SizeOf (portData);  Указатель IntPtr = Marshal.AllocHGlobal ((int) size);  Marshal.StructureToPtr (portData, указатель, истина);  try {//Удаляет порт из управления принтером if (! XcvDataW (printerHandle, "DeletePort", указатель, размер, out IntPtr outputData, 0, out uint outputNeeded, out uint status)) throw new PrinterManagementHelperException (Resources.FailedToDeletePrinterPortFromPrinterManagement);  } catch (исключение) {бросить;  } наконец {Marshal.FreeHGlobal (указатель);  }} catch (исключение исключения) {string message = string.Format (Resources. FailedToDeletePrinterPort, configurationType, portName);  выбросить новое исключение PrinterManagementHelperException (сообщение, исключение);  } наконец {ClosePrinter (printerHandle);  }}  

Метод по-прежнему возвращает статус 13. Данные по-прежнему недействительны. Кто-нибудь знает, что я сделал не так?

Буду признателен, если кто-нибудь сможет мне помочь.

Заранее спасибо!


Я нашел решение своей проблемы. Мне пришлось удалить свойство Reserved из структуры DeletePortData .

Резюме:

Чтобы удалить существующий порт принтера из управления принтером, вам необходимо выполнить следующие шаги:

1.) DLL-Import

  [DllImport ("winspool.drv")] частный статический extern bool OpenPrinter (строка printerName, out IntPtr phPrinter, ссылка PrinterDefaults printerDefaults); [DllImport ("winspool.drv")] частный статический внешний bool ClosePrinter (  IntPtr phPrinter); [DllImport ("winspool.drv", CharSet = CharSet.Unicode)] частный статический extern bool XcvDataW (IntPtr hXcv, строка pszDataName, IntPtr pInputData, UInt32 cbInputData, выход IntPatabData, UInt32 cbInputData, исходящий IntPatatOnt32, выход  UInt32 pdwStatus);  

2.) Определите необходимые структуры:

 //////Определяет  настройки принтера по умолчанию, такие как права доступа/// [StructLayout (LayoutKind.Sequential)] внутренняя структура Печать  erDefaults {общедоступный IntPtr pDataType;  общедоступный IntPtr pDevMode;  public PrinterAccess DesiredAccess;}//////Сохраняет данные порта для удаления существующего порта принтера/// [StructLayout (LayoutKind.Sequential, CharSet = CharSet.Unicode)] внутренняя структура DeletePortData {[  MarshalAs (UnmanagedType.ByValTStr, SizeConst = 64)] общедоступная строка sztPortName;  [MarshalAs (UnmanagedType.ByValTStr, SizeConst = 49)] общедоступная строка sztName;  public UInt32 dwVersion;  public UInt32 dwReserved;}//////Определяет идентификаторы для указания доступа к принтеру/// внутреннее перечисление PrinterAccess {ServerAdmin = 0x01, ServerEnum = 0x02, PrinterAdmin = 0x04, PrinterUse = 0x08, JobAdmin =  0x10, JobRead = 0x20, StandardRightsRequired = 0x000f0000, PrinterAllAccess = (StandardRightsRequired | PrinterAdmin | PrinterUse)}  

2.) Реализуйте следующий метод

 //////Удаляет существующий порт принтера из управления принтером////// Тип конфигурации порта.  Например, стандартный порт TCP/IP. ///  public static void DeletePrinterPort (string configurationType, string portName) {//Validation if (String.IsNullOrEmpty (configurationType)  ) выбросить новое исключение ArgumentNullException (nameof (configurationType));  if (String. IsNullOrEmpty (portName)) выбросить новое исключение ArgumentNullException (nameof (portName)); //Открывает управление принтером PrinterDefaults defaults = new PrinterDefaults {DesiredAccess = PrinterAccess.ServerAdmin};  if (! OpenPrinter (", XcvMonitor" + configurationType, out IntPtr printerHandle, ref по умолчанию)) {string message = String.Format (Resources.FailedToOpenPrinterManagement, configurationType);  выбросить новое исключение PrinterManagementHelperException (сообщение);  } try {//Определяет свойства порта DeletePortData portData = new DeletePortData {dwVersion = 1, dwReserved = 0, sztPortName = portName}; //Устанавливает свойства порта в указатель uint size = (uint) Marshal.SizeOf (portData);  Указатель IntPtr = Marshal.AllocHGlobal ((int) size);  Marshal.StructureToPtr (portData, указатель, истина);  try {//Удаляет порт из управления принтером if (! XcvDataW (printerHandle, "DeletePort", указатель, размер, out IntPtr outputData, 0, out uint outputNeeded, out uint status)) throw new PrinterManagementHelperException (Resources.FailedToDeletePrinterPortFromPrinterManagement);  } catch (исключение) {бросить;  } наконец {Marshal.FreeHGlobal (указатель);  }} catch (Exception exception) {string message = string.Format (Resources.FailedToDeletePrinterPort, configurationType, portName);  выбросить новое исключение PrinterManagementHelperException (сообщение, исключение);  } наконец {ClosePrinter (printerHandle);  }}  


Невозможно удалить порт локального принтера

Я добавил порт локального принтера с адресом на сетевой адрес. С портом начались проблемы. Итак, я попытался удалить его, зайдя в управление принтером, но он говорит, что требуемый ресурс используется. Не удалось отключить службу диспетчера очереди печати принтера. В реестре нет следов порта принтера. Что делать?


Я нашел ответ на проблему. Я быстро перезапустил службу диспетчера очереди печати и удалил порт. Если потребуется больше времени, порт снова выдаст ошибку при удалении.

Оцените статью
clickpad.ru
Добавить комментарий