无法使用 SQL 身份验证用户查询索引服务

Unable to query Indexing Services with a SQL Authentication User

随着下个月 Windows 2003 生命周期结束数据的临近,我正在将遗留应用程序迁移到 Windows 2008。除了我们连接到索引服务。

我们有两台服务器,一台数据库服务器运行 SQL 2008 和一台Web 服务器。我们的 Web 应用程序允许用户搜索文档存储。过程如下:

  1. 用户类型查询网络应用程序
  2. Web 应用程序向数据库服务器发送查询
  3. 查询将 Web 应用程序引用为链接数据库服务器,并将检索到的路径加载到临时 table
  4. 数据库服务器将这些路径加入到 SQL 服务器中的另一个 table
  5. 数据库服务器将结果发送回 Web 应用程序
  6. Web 应用程序向用户显示结果。

Web 应用程序通过 SQL 身份验证登录到数据库服务器以执行查询,但失败并出现此错误:

An error occurred while preparing the query "SELECT PATH FROM "10.0.1.89".MyCatalog..SCOPE('DEEP TRAVERSAL OF "C:\Documents"') WHERE (FREETEXT(Contents, 'introduction')) OR (FREETEXT(FileName, 'introduction'))" for execution against OLE DB provider "MSIDXS" for linked server "Filesystem".

当我通过 SSMS 以该用户身份登录数据库服务器并尝试执行查询时,显示相同的错误,但有一些额外信息:

OLE DB provider "MSIDXS" for linked server "Filesystem" returned message "Invalid catalog name 'MYCATALOG'. SQLSTATE=42000 ".

Msg 7399, Level 16, State 1, Line 1

The OLE DB provider "MSIDXS" for linked server "Filesystem" reported an error.

Access denied.

Msg 7321, Level 16, State 2, Line 1

An error occurred while preparing the query "SELECT PATH FROM "10.0.1.89".MyCatalog..SCOPE('DEEP TRAVERSAL OF "C:\Documents"') WHERE (FREETEXT(Contents, 'introduction')) OR (FREETEXT(FileName, 'introduction'))" for execution against OLE DB provider "MSIDXS" for linked server "Filesystem".

但是,当我使用我的 Windows 身份验证帐户登录 SSMS 时,我能够执行相同的查询并得到 returns 结果。我的用户名和密码必须与 Web 服务器上的帐户相同 - 如果我在 Web 服务器上更改密码,则会抛出错误,但不是同一个:

OLE DB provider "MSIDXS" for linked server "Filesystem" returned message "Unspecified error".

OLE DB provider "MSIDXS" for linked server "Filesystem" returned message "Invalid catalog name 'MYCATALOG'. SQLSTATE=42000 ".

Msg 7321, Level 16, State 2, Line 1 An error occurred while preparing the query "SELECT PATH FROM "10.0.1.89".MyCatalog..SCOPE('DEEP TRAVERSAL OF "C:\Documents"') WHERE (FREETEXT(Contents, 'introduction')) OR (FREETEXT(FileName, 'introduction'))" for execution against OLE DB provider "MSIDXS" for linked server "Filesystem".

我用这个查询创建了链接服务器,它似乎与遗留系统的配置相匹配:

EXEC sp_addlinkedserver FileSystem, 'Index Server', 'MSIDXS', 'Web';
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'FileSystem', @locallogin = NULL, @useself = N'False', @rmtuser = N'CatalogUser', @rmtpassword = N'xxx';

我在 Web 服务器上创建了一个名为 CatalogUser 的用户,并将其密码设置为与上述查询相同。

然而,当我使用 Windows 身份验证连接时,此信息似乎被忽略,而是使用我的 Windows 身份验证数据。如果我将密码更改为任何内容,查询仍然会成功。

我试过启用 CatalogUser 以服务帐户登录,但没有效果。

两台机器不在一个域中,但两台 Windows 2003 机器也不在域中,而且完全可以正常工作。

我一定错过了两者之间的设置。不幸的是,这些机器早在人们开始为此类内容保留文档之前就已经设置好了,所以我不确定缺少的步骤是什么。

网上关于这个问题的资料不多,估计是软件年代久远的缘故,至少我们可以在这里开始建立一个知识库。我想知道现在是否有更多人对这个软件有疑问,因为它的生命即将终结。

我现在已经解决了这个问题。我不知道这一点,但是当你 运行 一个程序在 NT AUTHORITY\LOCAL SYSTEM 下时,它将作为匿名用户通过网络进行身份验证。

为了解决这个问题,我在网络服务器和数据库服务器上创建了一个新的 SqlServer 用户,并使用相同的密码。然后我在这个新用户下将我的 SQL 服务器实例配置为 运行,它开始正确地进行身份验证。

似乎为 MSIDXS 后端输入的任何安全信息都被忽略了,但如果您加入域,则可能不会。我阅读的所有其他文档都建议这是执行此操作的唯一方法,但在原始设置中并非如此,此处也并非如此。