从Windows 2003机器导出ODBC系统DSN?

10

有没有一种方法可以从Windows 2003机器中导出所有ODBC系统DSN?

5个回答

11

感谢Garett的回答! - Zaffiro
这取决于您要导出到的服务器版本吗?如果我要导出到Windows 2008服务器怎么办? - Kyle Johnson
1
@KyleJohnson 我相信这将适用于Windows 2008,但我目前没有2008版本来验证。如果有帮助的话,我已经在64位Windows 7下进行了验证。 - Garett

7
我刚刚用一个非常简单的批处理脚本,为32位ODBC源完成了这个任务。
regedit /e c:\backup\odbc.reg "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBC.INI"

如果你使用64位的源,或者你运行在32位的操作系统上:

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

这将备份所有的DSN,但您可以指定您想要的DNS。


在64位Windows服务器上,它是"HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI"。 - user755404

2
我编写了一些 Powershell 函数,用于将 ODBC 连接从一台计算机复制到另一台计算机,它们发布在以下网址上(并且会定期更新):

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

使用这些功能,可以将一个计算机的所有ODBC连接复制到另一个计算机: $srcConfig = Get-OdbcConfig srcComputerName Import-OdbcConfig trgComputerName $scrConfig
通过筛选路径,可以仅包括您喜欢的ODBC连接:
Import-OdbcConfig trgComputerName ( $scrKeys | where { $_.Path -eq "SOFTWARE\ODBC\ODBC.INI\GoodDatabase" } )

或者过滤掉你不喜欢的ODBC连接:
Import-OdbcConfig trgComputerName ( $scrKeys | where { $_.Path -ne "SOFTWARE\ODBC\ODBC.INI\DatabaseIHate" } )

Import-OdbcConfig 只有在设置值或无法 ping 目标时返回数据,如果没有要创建的内容,它将不会显示任何内容。

2

系统DSN存储在Windows注册表的HKLM\Software\ODBC\ODBC.INI节点下。因此,如果您将此节点导出为*.reg文件并在目标计算机上运行此reg文件,则应该可以正常工作。

唯一需要注意的是,此reg文件将包含某些可能是计算机特定的文件路径,例如c:\WINNT\System32\bla-bla-bla.dll,其中包含了WINNT文件夹,而在目标计算机上可能被称为WINDOWS。因此,您需要花费一些时间来确保*.reg文件中的所有路径对于最终导入的目标计算机是正确的。


1

如果您无法在那里找到注册信息,取决于它们是用户 DSN 还是系统 DSN,它们可能会出现在以下位置:

[HKEY_USERS\"User SID(不要查找此项,它将是一个长数字)\Software\ODBC\ODBC.INI]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接