1.前言
桌面運維同學經常會處理打印機驅動安裝這類工單,手動安裝打印機驅動通常包含以下步驟:
1.根據打印機型號網上查找對應打印機驅動
2.使用cmd命令進入管理員界面
3.將打印機驅動添加到window系統中
人工安裝需要經過三個步驟,操作繁瑣,效率較低。基于此,我們想開發一個自動化安裝打印機驅動的程序,讓用戶可以自行安裝打印機驅動,以此減少打印機驅動安裝工單,提高運維效率。
2.技術實現
我們可以使用代碼的方式實現人工操作的三個步驟。這里,我們程序上實現也和這三個步驟類似。
1.后臺管理系統統一維護打印機驅動
2.使用程序提權,自動進入管理員環境
3.使用Devcon程序執行打印機驅動安裝命令
后續的所有示例代碼以C#為例。
2.1.后臺管理系統
我們開發一個后臺管理系統,統一維護打印機驅動,這樣可以減少重復查找打印機驅動的工作,提升效率。
系統界面如下:
任何設備的硬件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命令安裝驅動的方法,這兩個方法不僅限于打印機驅動安裝的應用,其實際應用場景比較廣泛,大家可以通過這些方法開發自動化工具,幫助提高運維工作效率。
審核編輯 黃宇
-
打印機
+關注
關注
10文章
768瀏覽量
45657 -
驅動安裝
+關注
關注
0文章
10瀏覽量
8406 -
運維
+關注
關注
1文章
256瀏覽量
7564
發布評論請先 登錄
相關推薦
評論