嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何取得安裝在電腦上之 ODBC 驅動程式的清單?


如何取得安裝在電腦上之 ODBC 驅動程式的清單?

嗨,Scripting Guy! 我要如何取得安裝在電腦上之 ODBC 驅動程式的清單呢?

-- VV

VV,您好。這個問題實在傷腦筋耶。怎麼說呢?a) 它看起來很簡單, b) 取得這項資訊的方法好像也不少。舉個例說,在 Windows XP 電腦上,至少有八個 WMI 類別的名稱中含有首字母縮寫 ODBC。我們理所當然認為其中一個類別一定會傳回安裝驅動程式的清單,對吧?

錯!我們想取得的資訊,是位於 [ODBC 資料來源管理員] 對話方塊的 [驅動程式] 索引標籤上,

 

ODBC 驅動程式


但是好像沒有一個 WMI 類別會傳回這項資訊 (至少不會直接傳回)。(也許我們可以採用迂迴的方式取得這項資訊,不過身為 Scripting Guy 的我們儘可能不這麼做)。這麼看來好像沒什麼希望了。不過這時候,其中一個 Scripting Guy 決定試試「樓上衣櫥」的理論。也就是說,在這個「Scripting Guy 大家庭」裡面,無論您什麼時候遺失什麼東西,幾乎都可以在樓上的衣櫥找到它,即使您從未將它扔進裡面,或者屋裡每人都信誓旦旦,表示自己根本沒有把它放進那裡。

附註:這位身為父親的 Scripting Guy 曾經半開玩笑的說:「難道它會自己長腳走進去不成?」但是 11 年後的今天,他開始認為也許這些遺失的東西,真的是自己走進去的。


其實登錄就像是作業系統的樓上衣櫃:如果您願意查看的話,應該會發現幾乎所有的東西都在登錄裡面。當然,我們也是在那裡找到安裝 ODBC 驅動程式的清單,就在 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers 中。(怪怪,我們還找到一雙鞋、一件曾愛不釋手的外套,以及那把遺失五六年的鋼鋸)。

只要知道登錄裡面可以找到這項資訊,那麼撰寫指令碼來擷取所有安裝的 ODBC 驅動程式清單,就變得輕而易舉了:

Const HKEY_LOCAL_MACHINE = &H80000002
 
strComputer = "."
 
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
 
strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
 
For i = 0 to UBound(arrValueNames)
    strValueName = arrValueNames(i)
    objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue    
    Wscript.Echo arrValueNames(i) & " -- " & strValue
Next

一開始我們先定義一個名叫 HKEY_LOCAL_MACHINE 的常數,將該值設為 &H80000002。然後利用這個常數,指出我們要使用 HKEY_LOCAL_MACHINE 登錄 Hive。接著連接到 WMI 服務和標準登錄提供者 (root\default:StdRegProv),再利用這行程式碼,將 HKEY_LOCAL_MACHINE 內的登錄路徑指派給變數 strKeyPath:

strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"

最後,安裝的 ODBC 驅動程式會在這個登錄機碼中儲存為個別登錄值,如下所示:

 

ODBC 驅動程式


因此,若要擷取所有這些登錄值的集合,必須呼叫 EnumValues 方法,這個方法會自動抓取指定機碼中所有的值:

objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes

當我們呼叫 EnumValues 時,必須提供兩個 In 參數以及兩個 Out 參數。「In 參數」是指我們提供給方法的值;我們在這個指令碼中,代入常數 HKEY_LOCAL_MACHINE 和變數 strKeyPath。這兩個參數共同告訴指令碼,我們目前所用的是哪個登錄機碼。

「Out 參數」則是指方法提供給我們的資訊。您只要提供一對變數名稱,即可取得這項資訊。在我們的指令碼中,變數 arrValueNames 會儲存 SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers 中所有登錄值名稱的陣列。變數 arrValueTypes 則儲存所有這些登錄值的資料類型陣列。(我們之所以加入這個參數,只是因為必須加入。因為我們所有登錄值的資料類型都一樣 (REG_SZ),既然不必擔心資料類型,就不必使用 arrValueTypes)。

在呼叫 EnumValues 之後,所有的個別登錄值名稱都會在變數 arrValueNames 中儲存為陣列。若要存取那些值,必須設定一個 For-Next 迴圈,從陣列中的 0 執行到最後一個項目 (上限或 UBound)。(如您所知,在 VBScript 中,陣列的第一個項目一定是項目 0)。這就是下面這行程式碼所做的動作:

For i = 0 to UBound(arrValueNames)

在迴圈中,我們把第一個登錄值的名稱,指派給一個名叫 strValueName 的變數:

strValueName = arrValueNames(i)

這是因為當時我們只有個別登錄值的名稱。若要實際取得已被指派給那些登錄項目的值,必須呼叫 GetStringValue 方法,如下所示:

objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

正如您所看到,我們在 GetStringValue 代入四個參數:

  • HKEY_LOCAL_MACHINE,代表登錄 Hive。
  • strKeyPath,代表 HKEY_LOCAL_MACHINE 中的登錄路徑。
  • strValueName,代表個別登錄值。
  • strValue,代表儲存登錄項目值的 Out 參數。

之後只要使用下面這行程式碼來回應登錄值的名稱,以及指派給它的值就可以了:

Wscript.Echo arrValueNames(i) & " -- " & strValue

當我們執行指令碼時,便會取回如下所示的輸出:

SQL Server -- Installed
Microsoft Access Driver (*.mdb) -- Installed
Microsoft Text Driver (*.txt; *.csv) -- Installed
Microsoft Excel Driver (*.xls) -- Installed
Microsoft dBase Driver (*.dbf) -- Installed
Microsoft Paradox Driver (*.db ) – Installed

下面這句話也許還不夠直接,不過您應該明白為何要提出來了:所謂安裝的 ODBC 驅動程式清單,就是安裝的 ODBC 驅動程式清單。(雖然我們不知道他們為什麼這麼說,不過至少用在這裡還蠻有道理的)。


如需詳細資訊

請參閱嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首