Открыть сервис

RpcAddPrinterDriverEx

RpcAddPrinterDriverEx — это функция программного интерфейса (API) операционной системы Microsoft Windows, предназначенная для удалённой установки драйвера принтера на сервер печати. Относится к группе функций удалённого вызова процедур (RPC), используемых службой диспетчера печати (Spooler). Позволяет администратору добавить драйвер для конкретной архитектуры процессора (например, x86, x64, ARM64) и версии операционной системы на целевой компьютер, работающий под управлением Windows.

История и контекст

Функция RpcAddPrinterDriverEx была введена в Windows 2000 как часть механизма управления печатью через RPC. Она пришла на смену более ранним методам, таким как AddPrinterDriver, и расширила их за счёт дополнительных параметров конфигурации. Основной целью разработки было обеспечение централизованного администрирования драйверов в корпоративных сетях, где сервер печати обслуживает десятки и сотни клиентских машин. В последующих версиях Windows (XP, Vista, 7, 8, 10, 11) функция претерпевала незначительные изменения, связанные с поддержкой новых архитектур и улучшением безопасности.

Синтаксис и параметры

Функция объявляется в заголовочном файле Winspool.h и доступна через библиотеку Winspool.drv. Её прототип на языке C выглядит следующим образом:

``c BOOL RpcAddPrinterDriverEx( [in] LPWSTR pName, [in] DWORD Level, [in] LPBYTE pDriverInfo, [in] DWORD dwControlFlags ); ``

Параметры

  • pNameуказатель на строку, содержащую имя сервера печати. Для локального компьютера может быть NULL или пустой строкой.
  • Level — уровень структуры данных, передаваемой в pDriverInfo. Допустимые значения: 1, 2, 3, 4, 6, 8. Каждый уровень соответствует определённой структуре (например, DRIVER_INFO_2, DRIVER_INFO_3).
  • pDriverInfo — указатель на структуру, содержащую информацию о драйвере: имя, путь к файлам, архитектуру, версию, зависимости и т. д.
  • dwControlFlags — флаги, управляющие поведением функции. Возможные значения:
  • 0 — стандартное добавление.
  • APD_COPY_ALL_FILES (0x04) — копировать все файлы драйвера на сервер.
  • APD_COPY_NEW_FILES (0x08) — копировать только новые файлы.
  • APD_DELETE_ALL_FILES (0x10) — удалить все файлы драйвера (используется при удалении).
  • APD_DELETE_NEW_FILES (0x20) — удалить только новые файлы.
  • APD_INSTALL_WARNED_DRIVER (0x8000) — установить драйвер, даже если он не прошёл проверку подписи (требует прав администратора).

Возвращаемое значение

При успешном выполнении возвращает ненулевое значение (TRUE). В случае ошибки — ноль (FALSE). Для получения кода ошибки используется функция GetLastError(), которая может вернуть, например, ERROR_ACCESS_DENIED, ERROR_INVALID_PARAMETER, ERROR_FILE_NOT_FOUND или ERROR_PRINTER_DRIVER_ALREADY_INSTALLED.

Структуры данных

В зависимости от значения параметра Level используются различные структуры, содержащие сведения о драйвере. Наиболее распространённые:

DRIVER_INFO_2 (Level = 2)

``c typedef struct _DRIVER_INFO_2 { DWORD cVersion; LPWSTR pName; LPWSTR pEnvironment; LPWSTR pDriverPath; LPWSTR pDataFile; LPWSTR pConfigFile; } DRIVER_INFO_2; ``

  • cVersion — версия драйвера (например, 3 для Windows 2000/XP, 4 для Windows Vista и новее).
  • pName — имя драйвера (отображается в списке).
  • pEnvironment — архитектура (строка вида "Windows x64", "Windows NT x86").
  • pDriverPath — путь к файлу драйвера (.dll).
  • pDataFile — путь к файлу данных (.ppd, .gpd).
  • pConfigFile — путь к файлу конфигурации (.dll).

DRIVER_INFO_6 (Level = 6)

``c typedef struct _DRIVER_INFO_6 { DWORD cVersion; LPWSTR pName; LPWSTR pEnvironment; LPWSTR pDriverPath; LPWSTR pDataFile; LPWSTR pConfigFile; LPWSTR pHelpFile; LPWSTR pDependentFiles; LPWSTR pMonitorName; LPWSTR pDefaultDataType; LPWSTR pszzzDependentFiles; } DRIVER_INFO_6; ``

Добавляет поля для файла справки, монитора порта, типа данных по умолчанию и списка зависимых файлов.

Применение

Функция RpcAddPrinterDriverEx используется в следующих сценариях:

  • Централизованное администрирование печати: системные администраторы развёртывают драйверы на серверах печати через скрипты (PowerShell, VBScript) или программы управления конфигурациями (SCCM, Group Policy).
  • Установка драйверов вручную: через оснастку «Управление печатью» (Print Management Console) или командную строку (команда rundll32 printui.dll,PrintUIEntry).
  • Разработка программного обеспечения: приложения, автоматизирующие настройку принтеров (например, в POS-системах или корпоративных ERP), вызывают эту функцию для добавления драйверов на удалённые машины.
  • Миграция и восстановление: при переносе сервера печати или восстановлении после сбоя.

Пример вызова (C++)

```cpp

include <windows.h>

include <winspool.h>

include <stdio.h>

BOOL AddDriver(LPCWSTR serverName) { DRIVER_INFO_2 di2 = {0}; di2.cVersion = 3; di2.pName = L"Generic / Text Only"; di2.pEnvironment = L"Windows x64"; di2.pDriverPath = L"C:\\Windows\\System32\\spool\\drivers\\x64\\3\\generic.dll"; di2.pDataFile = L"C:\\Windows\\System32\\spool\\drivers\\x64\\3\\generic.ppd"; di2.pConfigFile = L"C:\\Windows\\System32\\spool\\drivers\\x64\\3\\genericui.dll";

BOOL result = RpcAddPrinterDriverEx( serverName, 2, (LPBYTE)&di2, APD_COPY_ALL_FILES );

if (!result) { wprintf(L"Error: %d\n", GetLastError()); } return result; } ```

Ограничения и требования

  • Права доступа: для вызова функции требуются права администратора на целевом сервере. В противном случае возвращается ERROR_ACCESS_DENIED.
  • Подпись драйвера: начиная с Windows Vista, система требует, чтобы драйверы принтеров были подписаны цифровой подписью. Неподписанные драйверы могут быть установлены только с флагом APD_INSTALL_WARNED_DRIVER и при наличии соответствующих прав.
  • Совместимость архитектур: драйвер должен соответствовать архитектуре процессора сервера. Попытка установки 32-разрядного драйвера на 64-разрядную систему может привести к ошибке ERROR_BAD_ENVIRONMENT.
  • Версия ОС: структура DRIVER_INFO_2 и выше поддерживается в Windows 2000 и новее. В более старых версиях (Windows NT 4.0) использовались другие функции.

Безопасность

Функция RpcAddPrinterDriverEx является частью службы диспетчера печати, которая исторически была уязвима для атак. В 2021 году была обнаружена уязвимость PrintNightmare (CVE-2021-34527), позволяющая злоумышленнику с минимальными правами удалённо выполнить код через вызов этой функции. Уязвимость затрагивала все версии Windows, начиная с Windows 7. Microsoft выпустила обновления безопасности, ограничивающие вызов функции только для пользователей с правами администратора. В Windows 10 и 11 по умолчанию установлены дополнительные проверки: драйвер должен быть подписан, а вызов возможен только с локального компьютера или из доверенной сети.

Альтернативы

В современных версиях Windows рекомендуется использовать более безопасные методы установки драйверов:

  • AddPrinterDriver — устаревшая функция без флагов управления.
  • InstallPrinterDriverFromInf — функция, использующая INF-файлы для установки.
  • PowerShell cmdlet Add-PrinterDriver (модуль PrintManagement) — обёртка над API, требующая прав администратора.
  • Group Policy Preferences — развёртывание драйверов через политики.

Источники

  1. Microsoft Docs: RpcAddPrinterDriverEx function (Winspool.h) — описание синтаксиса, параметров и структур.
  2. Microsoft Security Response Center: CVE-2021-34527 PrintNightmare vulnerability details.
  3. Windows Driver Kit (WDK) documentation: Printer Driver Installation.
  4. MSDN Magazine: "Managing Print Drivers with Windows API" (2005).
  5. Microsoft Support: "How to add printer drivers remotely in Windows Server".

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →