Windows 2003マシンからすべてのODBCシステムDSNをエクスポートする方法はありますか?
システムDSN情報は、HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI
レジストリキーの下に保存されます。そのキーを.regファイルにエクスポートして、別のマシンにインポートすることができます。
更新:
プログラムで行うこともできます。次にいくつかの例を示します。
http://www.codeproject.com/KB/database/DSNAdmin.aspx
32ビットの非常に単純なbatスクリプトを使用してこれを自分で行った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を指定できます。
システムDSNは、WindowsレジストリのHKLM\Software\ODBC\ODBC.INI
ノードの下に保存されます。したがって、このノードを* .regファイルにエクスポートし、このregファイルをターゲットマシンで実行すると、機能するはずです。
唯一のことは、このregファイルには、コンピュータ固有のファイルパスが含まれることです。たとえば、c:\WINNT\System32\bla-bla-bla.dll
には、ターゲットマシンではWINDOWS
のように呼び出されるWINNTフォルダが含まれます。したがって、*。regファイル内のすべてのパスが、最終的にインポートするターゲットマシンに対して正しいことを確認するために、少し時間を費やす必要があります。
ODBC接続をあるコンピューターから別のコンピューターにコピーするためのいくつかのPowershell関数を作成しました。それらは次の場所に投稿されます(そして更新され続けます)。
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" }
}
これらの関数を一緒に使用すると、1台のコンピューターすべてをコピーできますODBC接続を別のコンピューターに:
$ srcConfig = Get-OdbcConfig srcComputerName
インポート-OdbcConfigtrgComputerName $ 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できない場合にのみデータを返します。作成するものがない場合は、何も表示されません。
そこに登録が見つからない場合は、ユーザーDSN /システムDSNであるかどうかに応じて、次のようになります。
[HKEY_USERS\"ユーザーSID(これを探す必要はありません。長い数字になります)\ Software\ODBC\ODBC.INI]