2015-09-01 26 views
0

我是一個非常新手的程序員。根據是否存在某些打印機名稱動態注入註冊表項

背景:

在我的公司,我們使用我們的用戶在VMware環境。他們啓動虛擬桌面,ThinPrint將爲該用戶的會話提供全新的打印機安裝。該打印機安裝由用戶登錄的VLAN決定。打印機安裝有任何默認設置都是驅動程序的一部分。

問題:

我們有一個給我們一個問題一個特定的Zebra熱敏標籤打印機。打印機使用需要在驅動程序中定義的特定尺寸的標籤。與使用內置Windows打印機表單的傳統打印機不同,此Zebra打印機使用這些稱爲「庫存」的專有形式。這些股票是內置於Zebra驅動程序中的。我可以輕鬆地創建具有適當維度的庫存並將其保存,但問題在於它存在於VM環境中。我需要讓我的自定義庫存成爲用戶登錄的會話的打印機安裝的一部分。 ThinPrint每次只能將打印機安裝爲全新安裝,並且不會包含自定義庫存。

爲什麼我需要你的幫助:

我發現,使用自定義的股票,我創建對應的註冊表項。即使沒有重新啓動,我也可以注入這個註冊表項,並且股票可以很好​​地顯示出來。所以我可以輕鬆地創建一個批處理文件,在登錄時注入密鑰。但是,註冊表項是特定打印機名稱的子項。這意味着我創建的REG文件必須在該用戶會話期間根據打印機名稱進行定製,當然這對我們公司所有不同的斑馬打印機來說當然會有所不同。

這裏是REG文件的例子:

[HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows NT \ CURRENTVERSION \打印\打印機\ CC_ZEBRA \ PrinterDriverData \期刊論文] 「StockNum」= DWORD:00000001

[HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\視窗 NT \ CURRENTVERSION \打印\打印機\ CC_ZEBRA \ PrinterDriverData \論文\ 0] 「數據」=己烷:4F,6E,2D,44,65,6d,61, 6e,64,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00, 00,00,00,00,00,00 ,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00 ,00,00,00,01,01,00,00,1e,00,03,00,\ 00,00,00,00,fe,00,fa,02,00,00,00,00,00 ,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00 ,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00 ,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00 ,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00 ,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00 ,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00 ,00,00,00,ec,00,00,00

此REG文件中的所有內容都將與CC_ZEBRA密鑰的例外保持一致。我需要一種解析已安裝打印機列表的方法,並用安裝的打印機名稱替換該鍵。或者我已經考慮給我們所有的斑馬打印機增量名稱(斑馬1,斑馬2,斑馬3等...)並循環直到找到匹配,然後運行我爲該打印機定製的REG文件。

任何幫助或建議,將不勝感激大家!先進的謝謝!

回答

0

下面是一個簡單的C#示例應用程序(根據您的規格),獲取已安裝的打印機並在打印機名稱與過濾器匹配時注入新的註冊表項。這是用.Net 4.5編寫的。

using System; 
using System.Drawing.Printing; 
using System.Linq; 
using Microsoft.Win32; 

namespace GetPrintersAndUpdateRegistryExample 
{ 
    class Program 
    { 
     // Needs to run as admin in order to create subkey in registry 
     static void Main(string[] args) 
     { 
      LaunchServiceUpdate(); 
     } 

     public static void LaunchServiceUpdate() 
     { 
      for (var i = 0; i < PrinterSettings.InstalledPrinters.Count; i++) 
      { 
       var printerPath = PrinterSettings.InstalledPrinters[i]; 

       // Replace \sea_ with a search filter that makes sense for you. All our printers start with 'sea'. 
       if (!printerPath.Contains(@"\sea_")) 
       { 
        continue; 
       } 

       var printerName = printerPath.Split('\\').Last(); 
       CreateRegistryEntry(printerName); 
      } 
     } 

     private static void CreateRegistryEntry(string printerName) 
     { 
      try 
      { 
       var regPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\" + printerName + @"\PrinterDriverData\Papers"; 
       var key = Registry.LocalMachine.CreateSubKey(regPath); 
       key.SetValue("StockNum", 1, RegistryValueKind.DWord); 
       key.Close(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
       Console.Read(); 
      } 
     } 
    } 
}