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

京东云开发者
• 阅读 250

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 GetAllPrinterUsbList() { List list = new List();

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
Ubuntu下怎么安装联想LJ2205激光打印机的驱动
联想的激光打印机LJ2205在京东只卖599,确实比较便宜。但是联想的软件研发能力一向是比大厂要弱很多的。很遗憾的是LJ2205没有官方的Linux驱动。怎么办?经过一番调研,我发现LJ2205其实就是日本的BortherHL2140打印机。安装步骤就是,用USB连接开机状态的打印机到PC,打开控制面板中的打印机选项,添加打印机,选
Wesley13 Wesley13
3年前
java 根据图片文字动态生成图片
今天在做热敏打印机打印二维码,并有文字描述,想到的简单的方法就是根据热敏打印机的纸张宽度和高度,生成对应的图片,如下:packagecom.orisdom.utils;importlombok.extern.slf4j.Slf4j;importjavax.imageio.ImageIO;importjava.awt.;importja
不才 不才
2年前
前端实现在浏览器中打印网页
前端数据报表打印方案背景项目:vueelementui需求:web端连接打印机打印报表功能关键词:浏览器端连接打印机打印报表调研首先,前端调用打印只有两种方式,使用window.print()和调用网络打印机。window.print这个是浏览器开放的api一般快捷键ctrlp或右键都也能调用。可以通过媒体查询的方案进行局部打印,也就是隐
Stella981 Stella981
3年前
Manjaro安装与基本配置
0\.安装\启动时选择第二项boot(nonfree),Manjaro自带的驱动精灵会帮你安装好所需驱动,笔记本双显卡则会帮你安装bumblebeedriverboot(nonfree)如果是WIndowsManjaro双系统安装,步骤可以参考:https://my.oschina.net/langxSpiri
Stella981 Stella981
3年前
Python+Selenium自动化
PythonSelenium自动化安装模块和浏览器驱动操作方法1.安装模块文件pipinstallselenium2.安装浏览器驱动我们主要用的浏览器驱动有chrome浏览器、f
Stella981 Stella981
3年前
MongoDB学习【四】—pymongo操作mongodb数据库
一、pymongodb的安装Python要连接MongoDB需要MongoDB驱动,这里我们使用PyMongo驱动来连接。pip安装pip是一个通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能。安装pymongopython3m
Stella981 Stella981
3年前
Linux Nvidia显卡驱动安装
1概述因为某些需要需要在Linux上安装显卡驱动,这里记录一下安装过程。2环境ManjaroRTX20603下载驱动安装包到官网上搜索下载即可,可以戳这里(https://www.oschina.net/action/GoToLink?urlhttps%3
Stella981 Stella981
3年前
MAVEN不能导入Oracle驱动问题
  最近搭建项目的时候需要用到maven导入Oracle驱动,一般按照步骤导入之后便可以使用了,但是导入之后发现加载Oracle数据库驱动报错。  从网上找了一下原因是由于Oracle的授权问题,Maven3之后不提供Oracle驱动,网上一般是将Oracle的驱动添加到maven仓库,这边使用的是另外一种方式,将Oracle的驱动jar包放在项
Stella981 Stella981
3年前
Bartender五大优势
领跑业界,优势明显Seagull Scientific 在提供真正的Windows 标签打印方面堪称全球领先者。实际上,BarTender 是第一个同时支持激光及热敏打印机的Windows应用程序。如今,在为标签打印机提供真正的Windows 驱动程序这一领域,我们已成为世界上最大的软件开发商,产品可支持20 多种语言。因此,选择合适的Win
十月飞翔 十月飞翔
2年前
服务器更换网卡后到配置集群能ping通该做了bond的机器
拆掉物理机,安装网卡,安装驱动。Linux安装步骤2.1查找硬件查找网卡是否安装成功,同时查看设备号:3.修改/etc/sysconfig/networkscripts/下的ifcfg文件,对应新的网口,创建新的对应文件然后ifdown掉所有的网口,在ifup新网口,ifupbond0,ifupbond0.914.集群其他机器此时应该可以ping通该机器的ip