2011-02-04 24 views

Trả lời

10

Thông tin DSN hệ thống được lưu trữ dưới khóa đăng ký HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI. Bạn có thể xuất khóa đó thành tệp .reg và nhập trên máy khác.

CẬP NHẬT:

Bạn cũng có thể làm điều đó theo chương trình. Dưới đây là một vài ví dụ:

http://www.codeproject.com/KB/database/DSNAdmin.aspx

http://support.microsoft.com/kb/110507

http://blogs.technet.com/b/heyscriptingguy/archive/2004/11/10/can-i-create-and-delete-a-dsn-using-a-script.aspx

+0

Cảm ơn Garett vì câu trả lời của bạn! – Zaffiro

+0

Điều này có phụ thuộc vào phiên bản máy chủ bạn đang xuất sang không? Điều gì sẽ xảy ra nếu tôi xuất sang máy chủ Windows 2008? –

+1

@KyleJohnson Tôi tin rằng điều này sẽ làm việc với Windows 2008, nhưng tôi không có một phiên bản năm 2008 để xác minh điều này vào lúc này. Tôi đã xác minh điều này dưới 64-bit Windows 7 nếu điều đó giúp ở tất cả. – Garett

2

Hệ thống DSN được lưu trữ trong cửa sổ đăng ký dưới HKLM\Software\ODBC\ODBC.INI nút Vì vậy, nếu bạn xuất nút này sang tệp * .reg và chạy tệp reg này trên máy đích, nó sẽ hoạt động.

Điều duy nhất, tệp reg này sẽ chứa một số đường dẫn tệp cụ thể, ví dụ: c:\WINNT\System32\bla-bla-bla.dll bao gồm thư mục WINNT trên máy đích có thể được gọi là WINDOWS. Vì vậy, bạn sẽ cần phải dành một chút thời gian để đảm bảo tất cả các đường dẫn trong tệp * .reg là chính xác cho máy đích mà cuối cùng bạn sẽ nhập.

1

Nếu bạn không thể tìm thấy đăng ký ở đó, tùy thuộc vào nếu họ User DSN/System DSN, họ có thể rất sẽ ở trong:

[HKEY_USERS \ "User SID (không tìm kiếm thông tin này, số này sẽ dài ) \ Software \ ODBC \ ODBC.INI]

6

Tôi vừa làm điều này bản thân mình với một kịch bản dơi rất đơn giản đối với các nguồn 32bit ODBC

regedit /e c:\backup\odbc.reg "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBC.INI" 

và đối với nguồn 64bit hoặc nếu bạn đang ở trên một hệ điều hành 32bit :

regedit /e c:\backup\odbc.reg "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI" 

Điều này sao lưu tất cả DSN, sau đó bạn có thể chỉ định DNS bạn muốn.

+0

Trên máy chủ Windows 64 bit, nó là "HKEY_LOCAL_MACHINE \ SOFTWARE \ ODBC \ ODBC.INI" – Darren

2

tôi đã viết một số chức năng Powershell để sao chép các kết nối ODBC từ máy này sang máy khác, chúng được đăng (và giữ cập nhật) tại địa chỉ:

http://powershell.com/cs/media/p/32510.aspx

# Usage: 
# $srcConfig = Get-OdbcConfig srcComputerName 
# Import-OdbcConfig trgComputerName $scrConfig 
# Only returns data when setting values 

function Get-OdbcConfig { 
param($srcName) 
    if (Test-Connection $srcName -Count 1 -Quiet) { 
     # cycle through the odbc and odbc32 keys 
     $keys = "SOFTWARE\ODBC\ODBC.INI", "SOFTWARE\Wow6432Node\ODBC\ODBC.INI" 
     foreach ($key in $keys){ 
      # open remote registry 
      $type = [Microsoft.Win32.RegistryHive]::LocalMachine 
      $srcReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($type, $srcName) 
      $OdbcKey = $srcReg.OpenSubKey($key) 
      # red through each key 
      foreach ($oDrvr in $OdbcKey.GetSubKeyNames()){ 
       # form the key path 
       $sKey = $key + "\" + $oDrvr 
       $oDrvrKey = $srcReg.OpenSubKey($sKey) 
       # cycle through each value, capture the key path, name, value and type 
       foreach ($oDrvrVal in $oDrvrKey.GetValueNames()) { 
         $regObj = New-Object psobject -Property @{ 
         Path = $sKey 
         Name = $oDrvrVal 
         Value = $oDrvrKey.GetValue($oDrvrVal) 
         Type = $oDrvrKey.GetValueKind($oDrvrVal) 
        } 
       # dump each to the console 
       $regObj 
       } 
      } 
     } 
    } 
    # can't ping 
    else { Write-Host "$srcName offline" } 
} 

function Import-OdbcConfig { 
param($trgName, $srcConfig) 
    if (Test-Connection $trgName -Count 1 -Quiet) { 
     # open remote registry 
     $type = [Microsoft.Win32.RegistryHive]::LocalMachine 
     $trgReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($type, $trgName) 
     # sort out the key paths and cycle through each 
     $paths = $srcConfig | select -Unique Path 
     foreach ($key in $paths){ 
      # check for the key and create it if it's not there 
      if (! $trgReg.OpenSubKey($key.Path)) { $writeKey = $trgReg.CreateSubKey($key.Path) } 
      # open the path for writing ($true) 
      $trgKey = $trgReg.OpenSubKey($key.Path, $true) 
      # cycle through each value, check to see if it exists, create it if it doesn't 
      foreach ($oDrvr in $srcConfig | where { $_.Path -eq $key.Path }) { 
       if (! $trgKey.GetValue($oDrvr.Name)) { 
        $oType = $oDrvr.Type 
        $writeValue = $trgKey.SetValue($oDrvr.Name, $oDrvr.Value, [Microsoft.Win32.RegistryValueKind]::$oType ) 
        $objObj = new-object psobject -Property @{ 
         Path = $oDrvr.Path 
         Name = $oDrvr.Name 
         Value = $trgKey.GetValue($oDrvr.Name) 
         Type = $trgKey.GetValueKind($oDrvr.Name) 
        } 
       } 
      $objObj 
      } 
     } 
    } 
    # can't ping 
    else { Write-Host "$srcName offline" } 
} 

Sử dụng các chức năng này lại với nhau, bạn có thể sao chép tất cả một máy tính kết nối ODBC khác:

$ srcConfig = Get-OdbcConfig srcComputerName
nhập OdbcConfig trgComputerName $ scrConfig

Có thể chỉ bao gồm kết nối ODBC yêu thích của bạn bằng cách lọc trên con đường:

Import-OdbcConfig trgComputerName ($scrKeys | where { $_.Path -eq "SOFTWARE\ODBC\ODBC.INI\GoodDatabase" }) 

Hoặc lọc ra các kết nối ODBC bạn không thích:

Import-OdbcConfig trgComputerName ($scrKeys | where { $_.Path -ne "SOFTWARE\ODBC\ODBC.INI\DatabaseIHate" }) 

nhập OdbcConfig chỉ trả về dữ liệu khi đặt giá trị hoặc không thể ping mục tiêu, nếu không có gì để tạo, nó sẽ không nói gì cả.