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 — развёртывание драйверов через политики.
Источники
- Microsoft Docs:
RpcAddPrinterDriverExfunction (Winspool.h) — описание синтаксиса, параметров и структур. - Microsoft Security Response Center: CVE-2021-34527 PrintNightmare vulnerability details.
- Windows Driver Kit (WDK) documentation: Printer Driver Installation.
- MSDN Magazine: "Managing Print Drivers with Windows API" (2005).
- Microsoft Support: "How to add printer drivers remotely in Windows Server".
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →