开发者社区 > 博文 > 桌面运维工具之打印机驱动安装
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

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

  • 13****
  • 2024-09-11
  • IP归属:北京
  • 100浏览

    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命令安装驱动的方法,这两个方法不仅限于打印机驱动安装的应用,其实际应用场景比较广泛,大家可以通过这些方法开发自动化工具,帮助提高运维工作效率。

    文章数
    1
    阅读量
    0

    作者其他文章