2011-02-04 85 views

Respuesta

10

La información del sistema DSN se almacena bajo la clave de registro HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI. Puede exportar esa clave a un archivo .reg e importarla en otra máquina.

ACTUALIZACIÓN:

También puede hacerlo mediante programación. Aquí están algunos ejemplos:

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

Gracias Garett por su respuesta! – Zaffiro

+0

¿Esto depende de la versión del servidor que está exportando? ¿Qué sucede si estoy exportando a un servidor de Windows 2008? –

+1

@KyleJohnson Creo que esto funcionará con Windows 2008, pero no tengo una versión de 2008 para verificar esto en este momento. He verificado esto en Windows 7 de 64 bits si eso ayuda en absoluto. – Garett

2

Los DSN del sistema se almacenan en el registro de Windows en HKLM\Software\ODBC\ODBC.INI nodo Así que si exporta este nodo a un archivo * .reg y ejecuta este archivo reg en una máquina de destino, debería funcionar.

La única cosa, este archivo de registro contendrá algunas rutas de archivos, que quizá equipo específico, por ejemplo c:\WINNT\System32\bla-bla-bla.dll incluye carpeta WINNT el que el equipo de destino puede ser llamado como WINDOWS. Por lo tanto, deberá dedicar un poco de tiempo para asegurarse de que todas las rutas del archivo * .reg sean correctas para la máquina de destino donde finalmente importaría.

1

Si no puede encontrar los registros no, dependiendo de si son DSN de usuario/DSN de sistema, que puede muy voluntad estar en:

[HKEY_USERS \ "usuario SID ('No busque esto, será un largo número ) \ Software \ ODBC \ ODBC.INI]

6

que acabo de hacer esto mismo con un guión muy simple bate para las fuentes ODBC de 32 bits

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

y de las fuentes de 64 bits o si usted está en un sistema operativo de 32 bits :

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

Esto hace una copia de seguridad de todos los DSN, pero puede especificar el DNS que desee.

+0

En Windows Server 64 bit es "HKEY_LOCAL_MACHINE \ SOFTWARE \ ODBC \ ODBC.INI" – Darren

2

escribí algunas funciones de PowerShell para copiar las conexiones ODBC desde un ordenador a otro, que se publican (y mantenerse actualizados) en:

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" } 
} 

El uso de estas funciones, juntos, pueden copiar todos uno ordenadores conexiones ODBC a otro:

$ srcConfig = Get-ODBCConfig srcComputerName
importación-ODBCConfig trgComputerName $ scrConfig

Es posible incluir únicamente la conexión preferida ODBC mediante el filtrado en el camino:

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

o filtrado a cabo las conexiones ODBC que no le gusta:

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

Importación-ODBCConfig sólo devuelve los datos al establecer valores o no puede hacer ping al objetivo, si no hay nada que crear, no dirá nada.

Cuestiones relacionadas