调用 `Invoke-sqlcmd` 时无法加载 adalsql.dll 错误

Unable to load adalsql.dll error when calling `Invoke-sqlcmd`

我有带有 SSDT installed, along with SSMS and the SqlServer PowerShell 模块(包括 invoke-sqlcmd 命令)的 VS2015,但是如果我尝试对 Azure SQL 数据仓库执行查询,如下所示:

invoke-sqlcmd  -Query "Select top 5 * from customer"  -ConnectionString "Server=tcp:my.database.windows.net,1433;Database=Customer;  Authentication=Active Directory Integrated; Encrypt=True; "

我收到以下错误:

invoke-sqlcmd : Unable to load adalsql.dll (Authentication=ActiveDirectoryIntegrated). Error code: 0x2. For more information, see
http://go.microsoft.com/fwlink/?LinkID=513072
At line:1 char:1
+ invoke-sqlcmd  -Query "Select top 5 * from vwOffer"  -ConnectionStrin ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Invoke-Sqlcmd], SqlException
    + FullyQualifiedErrorId : SqlExectionError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

invoke-sqlcmd :
At line:1 char:1
+ invoke-sqlcmd  -Query "Select top 5 * from vwOffer"  -ConnectionStrin ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ParserError: (:) [Invoke-Sqlcmd], ParserException
    + FullyQualifiedErrorId : ExecutionFailureException,Microsoft.SqlServer.Management.PowerShell.GetScriptComman

如果我尝试直接安装 adalsql.dll,我会收到一条消息,指出 A higher version already exists 并且我可以看到两个版本的 dll 都可以在这里找到:

 C:\Windows\SysWOW64\adalsql.dll
 C:\Windows\System32\adalsql.dll

然而,invoke-sqlcmd 找不到它。知道如何 (A) 注册现有的 dll 以便 invoke-sqlcmd 可以找到它或 (B) 卸载它以便重新安装它吗?

顺便说一下,我能够在 32 位 SQLCMD.exe 上使用 Active Directory Authenticatoin,所以我知道 32 位 dll 工作正常。只是 64 位 dll 没有正确加载...

所以,这个问题也很困扰我。我不清楚它是如何发生的,但也许这只是我安装最新版本的 SSMS 时发生的巧合。我的修复是:

  1. 导航到添加或删除程序

  2. 在小搜索 window 中键入 sql,或者直接查找:“SQL 服务器的 Active Directory 身份验证库”。

Note: This will not be in Windows' installed programs list if you have installed Visual Studio 2019. You can run the same installer by invoking MsiExec.exe /I{6BF11ECE-3CE8-4FBA-991A-1F55AA6BE5BF} from a command prompt.

  1. 卸载那个小家伙

  2. 导航到这里并下载最新的 ADAL 库(选择 x64):
    https://www.microsoft.com/en-us/download/confirmation.aspx?id=48742

  3. 为了好玩,重启

  4. 您的内容现在应该可以正确加载 adalsql.dll!

Update #3, 2020-07-13: Installing the older version works, but is vulnerable to being clobbered by the SSMS and VS2019 installers. The reason the new version of ADAL doesn't work is because its installer fails to add a registry entry pointing to the 64-bit version of adal.dll. I added an answer below which includes the missing registry value, which you can add yourself. Once that's done, you should never need to do this dance again. - @Tullo_x86

或者如果您打算暂时升级 SSMS,只需卸载 "Active Directory Authentication Library for SQL Server",然后修复 SSMS。

下次升级 SSMS 时它不会破坏任何东西。 SSMS自带adalsql.dll,升级SSMS的时候知道怎么升级。但是,如果您安装了 adalsql 和其他东西(或使用 https://www.microsoft.com/en-us/download/confirmation.aspx?id=48742 ),SSMS 就会以某种方式损坏。

在我的案例中,罪魁祸首是 VS 2019。 它有更新版本的 ADALSQL 包。对我来说,它位于路径 "C:\ProgramData\Microsoft\VisualStudio\Packages\sql_adalsql,version=16.0.61903.25110,chip=x64,language=en-US",我卸载并安装了所需的版本来解决问题。

希望对您有所帮助!

就我而言,add/remove 程序没有显示 "Active Directory Authentication Library" 的任何已安装实例。然而,尝试安装 library 会失败,提示已安装更新版本。

我通过打开注册表编辑器 (regedt32) 并使用

中的“查找”功能解除了自我束缚
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer

正在寻找 adalsql.

因包含键而大获成功

DisplayName: Active Directory Authentication Library for SQL Server
DisplayVersion: 15.0.1300.359

以及重要的是相关安装程序的路径。对我来说,它就像 c:\windows\installerc334521.msi。我运行那个微星,终于可以"uninstall"了。之后,运行 上面 'library' link 的安装程序终于成功了。

解决这个恼人问题的简单得令人眼花缭乱

  1. 确保您确实安装了 ADAL(C:\Windows\system32\adal.dll 的存在就足够了)

  2. 将其粘贴到 .reg 文件中:

     Windows Registry Editor Version 5.00
    
     [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSADALSQL]
     "TargetDir"="C:\Windows\System32\adal.dll"
    
  3. 双击 .reg 文件以安装该值

大功告成。去庆祝吧!

解释 WTF 正在进行中。为什么这是必要的?

发生此错误是因为 SQL 服务器的 .NET 适配器找不到 adal.dll。但这是为什么呢?安装好了对吧?

嗯,最新版本的 ADAL(与 VS 2019 和最新版本的 SQL Server Management Studio 打包在一起)的安装程序为 32 位版本的 DLL 添加了一个注册表项(位于 C:\Windows\SysWOW64\adal.dll),但 添加 64 位版本的条目(安装到 C:\Windows\system32\adal.dll)。如果您在 32 位模式下构建和 运行 您的应用程序,您将永远不会看到此错误清单。

这只是 ADAL 安装程序中的一个错误。据推测它没有被 Microsoft 检测到,因为 Visual Studio 和 SSMS 都是 32 位应用程序,因此不要去寻找 64 位版本。