我正在尝试将 Access 数据库转换为使用 SQLServer 后端。我已经扩大了数据库的大小,服务器上一切正常,但我无法远程访问它。
我在 Windows Server 2003 上运行 SQLServer Express 2005。该服务器未配置为域控制器,也未连接到域。我尝试从中访问服务器的计算机是域的一部分,但没有本地域控制器。我位于远程位置,计算机已配置并连接到总部的域,然后运送给我们。当我们需要访问域时,我们通常使用缓存凭据和 VPN 登录到总部。
我可以使用远程桌面连接访问运行 SQLServer 的 2k3 服务器。如果我使用我的用户名登录服务器,我可以调出数据库,通过受信任的连接访问它,并且数据库可以正常工作。但是,如果我尝试在本地运行数据库,我会得到服务器登录对话框。我无法使用受信任的连接,因为我的本地登录是家庭办公室域,并且不被 SQLServer 计算机识别。如果我尝试使用 SQLServer 本地的用户名/密码,我会收到登录失败错误。我尝试输入用户名为“用户名”、“工作组/用户名”(其中“工作组”是 SQLServer 上工作组的名称)、“sqlservername/用户名”和“[电子邮件保护]“其中“1.2.3.4”是 SQLServer 的 IP。在所有情况下,我都会收到登录失败错误。正如我所说,我可以使用相同的用户名和密码通过远程桌面连接登录到服务器并使用数据库,因此用户名的权限对于远程连接和数据库访问似乎都是正确的。不知道从这里去哪里,任何帮助都将不胜感激。
答案1
背景
Microsoft SQL Server 支持两种不同的身份验证方法:SQL Server 身份验证和 Windows 身份验证。了解两者的区别对于设置 SQL Server 非常重要。
SQL Server 身份验证要求 SQL Server 本身维护允许访问数据库的用户名和密码的数据库。SQL Server 进程负责通过将用户名和密码(哈希)与其自己的数据库进行比较来验证用户身份。这种登录方法不允许单点登录,因为它未与 Windows 集成,并且您提供的凭据与 Windows 帐户凭据(域或本地)完全无关。
Windows 身份验证使用标准 Windows 身份验证访问数据库。SQL Server 仍负责授权(“Bob 可以进入吗?”),但现在 Windows 负责验证(“那真的是鲍勃吗?”)。使用 Windows 身份验证时无法输入凭据;这就是为什么在选择 Windows 身份验证时,SQL Server Management Studio 中的用户名和密码输入框被禁用的原因。客户端程序以哪个用户身份运行,就是向 SQL Server 进行身份验证的用户(您可以使用runas /netonly
)。
当程序尝试通过 Windows 身份验证访问 SQL Server 时,SQL Server 会要求 Windows 对用户进行身份验证。如果是本地用户,Windows 将检查其本地用户数据库并返回是或否。如果帐户是域帐户,并且计算机已加入任何域,Windows 将转交给 Active Directory 进行身份验证。如果用户存在于受信任林中的某个位置(当前域或受信任域),Active Directory 将验证用户值得信赖)。
你的情况
您的 SQL Server 副本正在非域计算机上运行。当您通过远程桌面进入计算机时,您将以本地用户身份运行程序。当您“使用受信任的连接”(这实际上意味着“使用 Windows 身份验证”)时,Windows 知道您的本地帐户是谁并对其进行验证。然后 SQL Server 允许您访问。
当您在加入域的计算机上运行程序并尝试通过 Windows 身份验证进行身份验证时,您正在尝试使用域凭据向非域计算机进行身份验证。非域计算机不知道如何通过域进行身份验证(根据定义,它不信任域),因此身份验证失败。
可能的解决方案
使用 SQL Server 身份验证。使用 SQL Server Management Studio 等工具为每个需要访问的用户创建 SQL Server 登录名。您将无法使用“使用受信任连接”复选框,并且用户始终需要输入其 SQL Server 凭据。根据尝试访问 SQL Server 的程序,它可能提供某种方法来将凭据保存在注册表或用户安全本地存储中,这样用户就不必每次都输入它们。
在本地运行 SQL Server Management Studio 时,使用
runas
以下命令运行它:runas /user:username /netonly "C:\Path\to\SSMS.exe"
这将允许您使用 Windows 身份验证,因为您无需传递登录凭据,而是传递“用户名”帐户的凭据。此帐户应是目标计算机上存在的帐户。
将运行 SQL Server 的计算机加入域并使用。(您可能还需要以域帐户而不是本地帐户运行 SQL Server,但我不确定。)此时,SQL Server 将能够使用 Active Directory 对用户进行身份验证,并且“使用受信任的连接”将在不输入任何凭据的情况下工作。当然,您仍然需要决定哪些用户有权访问数据库;您可以使用 SQL Server Management Studio 来实现这一点。
将运行 SQL Server 的服务器提升为一个全新域的域控制器(它是该域的唯一成员)。然后您可以在两个域之间建立信任因此 SQL Server 计算机可以将凭据发送到其他域进行身份验证,并且 Windows 身份验证将起作用。无需输入任何凭据。您仍然需要在 SQL Server Management Studio 中授权用户。
答案2
您是否已启用 TCP/IP 连接并解除防火墙上所有相关端口(我认为是 1433,但我认为它会更改/自动增加)的阻塞?
最后,如果您想要工作组访问,请确保 SQL 服务器设置为混合模式访问,而不仅仅是集成安全性。此外,您可能需要在 SQL 服务器中为每个用户/组手动创建登录名。