写点什么

桌面运维工具之打印机驱动安装

  • 2024-09-12
    北京
  • 本文字数:2597 字

    阅读完需:约 9 分钟

1.前言

桌面运维同学经常会处理打印机驱动安装这类工单,手动安装打印机驱动通常包含以下步骤:


1.根据打印机型号网上查找对应打印机驱动


2.使用 cmd 命令进入管理员界面


3.将打印机驱动添加到 window 系统中


人工安装需要经过三个步骤,操作繁琐,效率较低。基于此,我们想开发一个自动化安装打印机驱动的程序,让用户可以自行安装打印机驱动,以此减少打印机驱动安装工单,提高运维效率。

2.技术实现

我们可以使用代码的方式实现人工操作的三个步骤。这里,我们程序上实现也和这三个步骤类似。


1.后台管理系统统一维护打印机驱动


2.使用程序提权,自动进入管理员环境


3.使用 Devcon 程序执行打印机驱动安装命令


后续的所有示例代码以 C#为例。

2.1.后台管理系统

我们开发一个后台管理系统,统一维护打印机驱动,这样可以减少重复查找打印机驱动的工作,提升效率。


系统界面如下:



通过这个页面维护打印机型号、硬件 ID 和驱动等相关信息。


任何设备的硬件 ID 都是唯一的,我们可以通过程序识别打印机的硬件 ID,然后根据硬件 ID 查询到驱动下载。


这里我们使用 window 的 Win32_PnPEntity 来获取硬件的相关信息,其结构如下:


[Dynamic, Provider("CIMWin32"), UUID("{FE28FD98-C875-11d2-B352-00104BC97924}"), AMENDMENT]class Win32_PnPEntity : CIM_LogicalDevice{  uint16   Availability;  string   Caption;  string   ClassGuid;  string   CompatibleID[];  uint32   ConfigManagerErrorCode;  boolean  ConfigManagerUserConfig;  string   CreationClassName;  string   Description;  string   DeviceID;  boolean  ErrorCleared;  string   ErrorDescription;  string   HardwareID[];  datetime InstallDate;  uint32   LastErrorCode;  string   Manufacturer;  string   Name;  string   PNPClass;  string   PNPDeviceID;  uint16   PowerManagementCapabilities[];  boolean  PowerManagementSupported;  boolean  Present;  string   Service;  string   Status;  uint16   StatusInfo;  string   SystemCreationClassName;  string   SystemName;};
复制代码


其中 Name 表示硬件名称,HardwareID 表示硬件 id。


打印机硬件 ID 识别部分代码如下:


namespace JwPrinterManage.Helper{    internal class USBUtilTest    {        public static List<USBDeviceInfo> GetAllPrinterUsbList()        {            List<USBDeviceInfo> list = new List<USBDeviceInfo>();
ManagementObjectCollection collection; using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnPEntity")) collection = searcher.Get();
foreach (ManagementObject device in collection) {
string name = Convert.ToString(device["Name"]); string deviceId = Convert.ToString(device["DeviceID"]); string[] HardwareIDArr = (string[])device["HardwareID"]; if (HardwareIDArr == null || HardwareIDArr.Length == 0) { continue; } foreach (var curHardwareId in HardwareIDArr) { if (curHardwareId.Contains("USBPRINT")) { list.Add(new USBDeviceInfo(curHardwareId, name)); } } }
collection.Dispose(); return list; } }}
复制代码


以上代码可以获取到计算机的所有硬件名称、设备 ID 以及硬件 ID,通过此方法,我们可以快速获取打印机的硬件 ID,然后根据硬件 ID 从后台系统中查找驱动并下载到用户本地。

2.2.程序提权

安装打印机驱动,程序需要具有管理员权限,这里我们需要通过 cmd 命令给程序提权,保证程序具有管理员权限。


其原理是使用管理员账号和密码执行 cmd 运行程序,这样程序就具有管理员权限。


部分核心代码如下:


namespace JwPrinterManage.Helper{    internal class AdminUtilsTest    {
// 使用特定账号和密码运行程序 private static void run(string userName, string pass, string exePath) { Process process = new Process(); string str = pass; SecureString secureString = new SecureString(); foreach (char c in str) secureString.AppendChar(c); process.StartInfo.UserName = userName; process.StartInfo.Password = secureString; process.StartInfo.FileName = exePath; process.StartInfo.UseShellExecute = false; process.Start(); } }}
复制代码

2.3.使用 Devcon 安装驱动

2.3.1.Devcon.exe 简介

DevCon (Devcon.exe)(即设备控制台)是一种命令行工具,用于显示有关运行 Windows 的计算机上的设备的详细信息。 可以使用 DevCon 启用、禁用、安装、配置以及删除设备。


其主要语法如下:


devcon [/r] command [arguments]
复制代码


其主要命令如下:


•DevCon Enable


•DevCon Disable


•DevCon Update


•DevCon UpdateNI


•DevCon Install


•DevCon Remove


•DevCon Rescan


•DevCon Restart


•DevCon Reboot


•DevCon SetHwID


•DevCon ClassFilter


•DevCon Dp_add


•DevCon Dp_delete


这里我们不详细介绍这些命令,感兴趣的同学可以查看官方文档: Devcon命令文档

2.3.2.Devcon 命令安装驱动

我们可以使用 update 命令来安装打印机驱动程序,devcon update 命令可以安装任意驱动程序包,具体如下:


devcon update INFfile HardwareID
复制代码


其中 INFfile 表示打印机驱动的 INF 文件,HardwareID 表示打印机的硬件 ID。


当出现如下图所示的结果时,表示打印机驱动安装成功。



3.总结

本文主要介绍打印机驱动自动化安装的一个基本实现思路,通过运维工具,我们可以实现部分桌面工单自动化,帮助运维同事提高工作效率。同时,本文也介绍了通过 Win32_PnPEntity 获取 window 硬件信息以及通过 Devcon 命令安装驱动的方法,这两个方法不仅限于打印机驱动安装的应用,其实际应用场景比较广泛,大家可以通过这些方法开发自动化工具,帮助提高运维工作效率。

用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
桌面运维工具之打印机驱动安装_京东科技开发者_InfoQ写作社区