您可以在 Powershell 中更改 ODBC DSN 驱动程序吗?

Can you change an ODBC DSN driver in Powershell?

我们正在将我们的网络锁定到 TLS 1.2 协议。这需要更新的 Sql 服务器驱动程序。我们已经安装了更新的驱动程序,但是,现在我必须更新分析团队使用的 DSN。

我已经看到在哪里可以使用 Wdac 模块及其功能来获取、添加、删除等 DSN 及其属性。我没有发现也无法通过测试做的是简单地更改现有 DSN 的驱动程序。

这可能吗?

TIA 理查德

this answer 中所述,ODBC DSN 条目存储在 Windows 注册表中。更新 DSN 以使用新的 driver 涉及:

  1. 更新各个 DSN,使其 Driver= 值指向新 driver 的 DLL 的位置,并且
  2. 正在更新“ODBC 数据源”项下的条目以列出新的 driver 名称。

我当然不是 PowerShell 专家,但以下内容似乎可以将 64 位系统 DSN 转换为使用“ODBC Driver 17 for SQL Server”而不是古老的“SQL 服务器" driver:

$old_driver_name = "SQL Server"
$old_driver_path = "C:\WINDOWS\system32\SQLSRV32.dll"
$new_driver_name = "ODBC Driver 17 for SQL Server"
$new_driver_path = "C:\WINDOWS\system32\msodbcsql17.dll"

foreach ($key in Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI)
{
    if ($key.Name -eq "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources")
    {
        Write-Output "[ODBC Data Sources]"
        Push-Location
        $key | Set-Location
        Get-Item . | Select-Object -ExpandProperty property | ForEach-Object -Process {
            $dsn = New-Object psobject -Property @{
                “property”=$_;
                “value” = (Get-ItemProperty -Path . -Name $_).$_
            }
            $driver_name = $dsn.value
            if ($driver_name -eq $old_driver_name)
            {
                Write-Output "    $_"
                Set-ItemProperty -Path . -Name $_ -Value $new_driver_name
            }
        }
        Pop-Location
    }
    else
    {
        $driver = $key | Get-ItemProperty -Name Driver
        if ($driver.Driver -eq $old_driver_path)
        {
            Write-Output "DSN: $key"
            $key | Set-ItemProperty -Name Driver -Value $new_driver_path
        }
    }
}

备注:

  • 以上脚本必须 运行 以管理员身份更新系统 DSN。
  • 32 位系统 DSN 在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBC.INI
  • 用户 DSN 在 HKEY_CURRENT_USER\Software\ODBC\ODBC.INI