





1.前言
桌面運維朋友經常會處理打印機驅動安裝這類工單,手動安裝打印機驅動一般包括以下過程:
1.按照打印機型號網上查詢對應打印機驅動
2.運用cmd命令進入管理員界面
3.將打印機驅動添加到window系統(tǒng)中
人工安裝需要經過三個過程,操作繁瑣,效率較低。基于此,咱們想研發(fā)一個自動化安裝打印機驅動的程序,讓用戶能夠自動安裝打印機驅動,以此減少打印機驅動安裝工單,加強運維效率。
2.技術實現(xiàn)
咱們能夠運用代碼的方式實現(xiàn)人工操作的三個過程。這兒,咱們程序上實現(xiàn)亦和這三個過程類似。
1.后臺管理系統(tǒng)統(tǒng)一守護打印機驅動
2.運用程序提權,自動進入管理員環(huán)境
3.運用Devcon程序執(zhí)行打印機驅動安裝命令
后續(xù)的所有示例代碼以C#為例。
2.1.后臺管理系統(tǒng)
咱們研發(fā)一個后臺管理系統(tǒng),統(tǒng)一守護打印機驅動,這般能夠減少重復查詢打印機驅動的工作,提高效率。
系統(tǒng)界面如下:
經過這個頁面守護打印機型號、硬件ID和驅動等關聯(lián)信息。
任何設備的硬件ID都是獨一的,咱們能夠經過程序識別打印機的硬件ID,而后按照硬件ID查找到驅動下載。
這兒咱們運用window的Win32_PnPEntity來獲取硬件的關聯(lián)信息,其結構如下:
[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 = newList<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"]); stringdeviceId = 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(newUSBDeviceInfo(curHardwareId, name)); } } } collection.Dispose();return list; } } }以上代碼能夠獲取到計算機的所有硬件名叫作、設備ID以及硬件ID,經過此辦法,咱們能夠快速獲取打印機的硬件ID,而后按照硬件ID從后臺系統(tǒng)中查詢驅動并下載到用戶本地。
2.2.程序提權
安裝打印機驅動,程序需要擁有管理員權限,這兒咱們需要經過cmd命令給程序提權,保準程序擁有管理員權限。
其原理是運用管理員賬號和秘碼執(zhí)行cmd運行程序,這般程序就擁有管理員權限。
部分核心代碼如下:
namespace JwPrinterManage.Helper { internal class AdminUtilsTest { // 運用特定賬號和秘碼運行程序 private static void run(string userName, string pass, string exePath) { Process process = new Process(); stringstr = pass; SecureString secureString =new SecureString(); foreach (char c instr) 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。
當顯現(xiàn)如下圖所示的結果時,暗示打印機驅動安裝成功。
3.總結
本文重點介紹打印機驅動自動化安裝的一個基本實現(xiàn)思路,經過運維工具,咱們能夠實現(xiàn)部分桌面工單自動化,幫忙運維同事加強工作效率。同期,本文亦介紹了經過Win32_PnPEntity獲取window硬件信息以及經過Devcon命令安裝驅動的辦法,這兩個辦法不僅限于打印機驅動安裝的應用,其實質應用場景比較廣泛,大眾能夠經過這些辦法研發(fā)自動化工具,幫忙加強運維工作效率。