嗨,Scripting Guy!

Hey,Scripting Guy!

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

今天的問題:我是否能使用指令碼來建立和刪除 DSN?


我是否能使用指令碼來建立和刪除 DSN?

嗨,Scripting Guy!是否可以即時建立 ODBC 資料來源名稱 (DSN,Data Sources Name),然後在完成時移除?

-- KC

KC,您好。是否可以建立 ODBC DSN,接著刪除它?老實告訴您,我們不是十分確定。其實答案是這樣的:只要您願意撰寫修改登錄的指令碼,那就肯定可以使用程式建立並刪除 DSN。

注意:如果不確定什麼是 DSN,可以簡單告訴您,這是一種只需參考 DSN 名稱 (不需要指定資料庫的完整路徑) 就能連接至資料庫的方法。如果您有一堆存取這個資料庫的指令碼,那樣就會特別方便。如果在指令碼中寫入固定路徑,然後將資料庫從一個伺服器移至另一個時,就得在每個指令碼中逐一編輯路徑。如果使用的是 DSN,就根本不用編輯指令碼,只要修改 DSN 就可以了。那可是以一當百的變更 (視您有多少指令碼而定)。

我們即將為您示範的指令碼,會建立使用 SQL Server 的 DSN。這很重要嗎?是的。您可以依樣建立使用其他 ODBC 資料庫 (Access、Oracle、FoxPro 等) 的 DSN。但是,建立存取 Oracle 資料庫的 DSN 時,所使用的登錄機碼及值,不必然和那些用來存取 SQL Server 資料庫的相同。如果使用的是 SQL Server,只需複製我們的指令碼,再變更資料庫、伺服器等名稱即可。如果使用的是其他的資料庫,則建議您手動建立 DSN。這麼做之後,請啟動您最愛的登錄編輯器,並在這裡尋找 DSN:

HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources

以及這裡:

HKLM\SOFTWARE\ODBC\ODBC.INI\Name You Gave the DSN

請查看這個資料庫類型所需要的登錄機碼及值,然後將該資訊插入指令碼中。如果仍不確定如何完成這項工作,請給我們一兩週的時間,我們會設法在「指令碼中心」公佈一些針對其他 ODBC 資料庫的範例指令碼。

無論如何,以下是使用 SQL Server 建立 DSN 的一段指令碼:

Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
 
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\default:StdRegProv")
 
strKeyPath = "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources"
strValueName = "Script Repository"
strValue = "SQL Server"
objReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
 
strKeyPath = "SOFTWARE\ODBC\ODBC.INI\Script Repository"
objReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath
strKeyPath = "SOFTWARE\ODBC\ODBC.INI\Script Repository"
strValueName = "Database"
strValue = "Script Center"
objReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
 
strValueName = "Driver"
strValue = "C:\WINDOWS\System32\SQLSRV32.dll"
objReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
strValueName = "Server"
strValue = "atl-sql-01"
objReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
strValueName = "Trusted_Connection"
strValue = "Yes"
objReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

我們承認內容有點長,但那是因為其中有一些必須建立的登錄機碼及值。不過,大部份的指令碼還是簡單易懂。我們一開始將常數 HKEY_LOCAL_MACHINE 設定為 &H80000002;這個值是連接至登錄 HKLM 部份所必需的。然後我們連結到 WMI 服務,以及 StdRegProv 類別 (如我們常提醒您的,此類別位於 root\default 名稱空間中)。

從那裡,我們會使用指定給新 DSN 的名稱 Script Repository 來建立新的登錄值 (HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources\Script Repository)。我們將這個登錄值的值設為 SQL Server,因為那是我們要連接到的資料庫類型。

您看懂了嗎?在那之後,我們建立新的登錄「機碼」:HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources\Script Repository (注意機碼名稱和 DSN 名稱相同)。接著就必須設定下列登錄值:

Database -- 要連接到的實際資料庫的名稱。在這個範例中,資料庫命名為 ScriptCenter

Driver -- SQL Server ODBC 驅動程式的路徑。在這個範例中,這個路徑為 C:\WINDOWS\System32\SQLSRV32.dll。

Server -- 資料庫所在伺服器的名稱。在這個案例中,伺服器名稱為 atl-sql-01

Trusted_Connection -- 告訴 SQL Server 要使用我們存取資料庫時所用的登入憑證。這樣可以讓我們連接到資料庫,而不用提供使用者名稱及密碼。

就是這麼回事;執行指令碼後,您就會有全功能的 DSN。

一旦完成 DSN 之後,要如何移除它呢?那也同樣的簡單:畢竟,只是要刪除第一段指令碼建立的登錄機碼和值罷了。以下就是刪除 DSN Script Repository 的指令碼:

Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
 
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\default:StdRegProv")
 
strKeyPath = "SOFTWARE\ODBC\ODBC.INI\Script Repository"
objReg.DeleteKey HKEY_LOCAL_MACHINE, strKeyPath
strKeyPath = "SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources"
strValueName = "Script Repository"
objReg.DeleteValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName

請注意,這段指令碼中所做的就是刪除已建立的第一個登錄值 (Script Repository),再刪除建立的登錄機碼。我們不一定要在該機碼內刪除個別登錄值,因為刪除 HKLM\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources\Script Repository 也會刪除所有的值。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首