在系统管理员被锁定时连接到 SQL Server

适用范围:SQL Server

本文介绍如何以系统管理员身份重新获得对 SQL Server 数据库引擎的访问权限(如果已被锁定)。系统管理员可能会由于下列原因之一失去对 SQL Server 实例的访问权限:

  • 作为 sysadmin 固定服务器角色成员的所有登录名都已被误删除。

  • 作为 sysadmin 固定服务器角色成员的所有 Windows 组都已被误删除。

  • 作为 sysadmin 固定服务器角色成员的登录名用于已经离开公司或者无法找到的个人。

  • sa 帐户被禁用或者没有人知道密码。

解决方法

为了解决访问权限问题,我们建议在单用户模式下启动 SQL Server 实例。 此模式可防止在你尝试重新获得访问权限时发生其他连接。 在此,你可以连接到 SQL Server 实例,并将登录名添加到“sysadmin”服务器角色。 此解决方案的详细步骤在分步说明部分中提供。

可以从命令行使用 -m-f 选项以单用户模式启动 SQL Server 的实例。 计算机的本地管理员组的任何成员都可以随后作为“sysadmin”固定服务器角色的成员连接到 SQL Server 实例。

在单用户模式下启动实例时,请停止 SQL Server 代理服务。 否则,SQL Server 代理可能会首先进行连接,获取到服务器的唯一可用连接并阻止你登录。

在你能够登录之前,未知的客户端应用程序也可能获取唯一可用的连接。 为了防止发生这种情况,可以使用后跟应用程序名称的 -m 选项将连接限制为来自指定应用程序的单个连接。 例如,用 -mSQLCMD 启动 SQL Server 将连接限制为将自身标识为 sqlcmd 客户端程序的单个连接。 若要通过 Management Studio 中的查询编辑器进行连接,请使用 -m"Microsoft SQL Server Management Studio - Query"

重要

请勿将 -m 与应用程序名称一起用作安全功能。 客户端应用程序通过连接字符串设置指定应用程序名称,因此很容易受假名称欺骗。

下表总结了在命令行中以单用户模式启动实例的不同方法。

选项 说明 何时使用
-m 将连接限制为单个连接 没有其他用户尝试连接到实例,或者你不确定用于连接到实例的应用程序名称。
-mSQLCMD 将连接限制为必须将自身标识为 sqlcmd 客户端程序的单个连接 计划使用 sqlcmd 连接到实例,并且想要阻止其他应用程序使用唯一可用的连接。
-m"Microsoft SQL Server Management Studio - Query" 将连接限制为必须将自身标识为“Microsoft SQL Server Management Studio - 查询”应用程序的单个连接。 计划通过 Management Studio 中的查询编辑器连接到实例,并且想要阻止其他应用程序使用唯一可用的连接。
-f 将连接限制为单个连接,并以最小配置启动实例 某个其他配置阻止你启动。

分步说明

有关如何在单用户模式下启动 SQL Server 的分步说明,请参阅在单用户模式下启动 SQL Server

使用 PowerShell

选项 1:使用 Azure Data Studio 直接在可执行笔记本中运行这些步骤

注意

在尝试打开此笔记本之前,请检查本地计算机上是否安装了 Azure Data Studio。 要安装 Azure Data Studio,请参阅了解如何安装 Azure Data Studio

选项 2:手动执行步骤

  1. 以提升的权限打开 Windows PowerShell 命令提示符。

  2. 设置服务名称和 SQL Server 实例,并设置 Windows 登录变量。 将这些值替换为与环境匹配的值。

    如果你有默认实例,请使用不带实例名称的 MSSQLSERVER

    $service_name = "MSSQL`$instancename"
    $sql_server_instance = "machine_name\instance"
    $login_to_be_granted_access = "[CONTOSO\PatK]"
    
  3. 使用以下命令停止 SQL Server 服务,使它可通过单用户模式重启:

    如果你有默认实例,请使用不带实例名称的 MSSQLSERVER

    net stop $service_name
    
  4. 现在,在单用户模式下启动 SQL Server 实例,并且仅允许 SQLCMD.exe 进行连接 (/mSQLCMD):

    注意

    请务必将 SQLCMD 大写

    如果你有默认实例,请使用不带实例名称的 MSSQLSERVER

    net start $service_name /f /mSQLCMD
    
  5. 使用 sqlcmd,执行 CREATE LOGIN 命令,然后执行 ALTER SERVER ROLE 命令。 此步骤假定你已使用本地管理员组中的帐户登录到 Windows。 此步骤假定你已使用要授予 sysadmin 成员身份的凭据替换域和登录名。

    如果你有默认实例,请使用服务器名称。

    sqlcmd.exe -E -S $sql_server_instance -Q "CREATE LOGIN $login_to_be_granted_access FROM WINDOWS; ALTER SERVER ROLE sysadmin ADD MEMBER $login_to_be_granted_access; "
    

    如果收到以下错误,必须确保没有其他 sqlcmd 连接到 SQL Server:

    Sqlcmd: Error: Microsoft ODBC Driver X for SQL Server : Login failed for user 'CONTOSO\BobD'. Reason: Server is in single user mode. Only one administrator can connect at this time.

  6. 混合模式(可选): 如果 SQL Server 实例在混合身份验证模式下运行,则还可以:

    1. 向 SQL Server 登录授予 sysadmin 角色成员资格。 执行类似以下的代码,以创建作为 sysadmin 固定服务器角色成员的新 SQL Server 身份验证登录名。 将 <strong_password> 替换为所选的强密码。

      如果你有默认实例,请使用服务器名称。

      $strong_password = "<strong_password>"
      sqlcmd.exe -E -S $sql_server_instance -Q "CREATE LOGIN TempLogin WITH PASSWORD = '$strong_password'; ALTER SERVER ROLE sysadmin ADD MEMBER TempLogin; "
      
    2. 此外,如果 SQL Server 实例在混合身份验证模式下运行,并且你想要重置已启用的 sa 帐户的密码。 使用以下语法更改 sa 帐户的密码。 请务必将 <strong_password> 替换为所选的强密码:

      如果你有默认实例,请使用服务器名称。

      $strong_password = "<strong_password>"
      sqlcmd.exe -E -S $sql_server_instance -Q "ALTER LOGIN sa WITH PASSWORD = $strong_password; "
      
  7. 停止 SQL Server 实例,再在多用户模式下重启它

    如果你有默认实例,请使用不带实例名称的 MSSQLSERVER

    net stop $service_name
    net start $service_name
    

使用 SQL Server 配置管理器和 Management Studio (SSMS)

这些说明假定:

  • SQL Server 在 Windows 8 或更高版本上运行。 在适用的情况下,将对早期的 SQL Server 或 Windows 版本进行细微的调整。

  • SQL Server Management Studio 安装在计算机上。

在以本地管理员组的成员身份登录到 Windows 时,请执行以下指令。

  1. 在 Windows 的“开始”菜单中,右键单击 SQL ServerConfiguration Manager 的图标,然后选择“以管理员身份运行”将管理员凭据传递给 Configuration Manager。

  2. 在 SQL Server 配置管理器的左窗格中,选择“SQL Server 服务” 。 在右窗格中,查找 SQL Server 实例。 (SQL Server 的默认实例包括在计算机名称后的 (MSSQLSERVER) 。 命名实例显示为大写,名称与在“已注册的服务器”中的名称相同。) 右键单击 SQL Server 的实例,然后选择“属性”。

  3. 在“启动参数”选项卡上的“指定启动参数”框中,键入 -m,然后选择“添加”。 (这是短划线后跟小写字母 m。)

    对于某些早期版本的 SQL Server,没有“启动参数”选项卡。在这种情况下,在“高级”选项卡上,双击“启动参数”。 参数在较小的窗口中打开。 请注意不要更改任何现有参数。 最后,添加新参数 ;-m,然后选择“确定”。 (这是一个分号,后跟短划线和小写字母 m。)

  4. 选择“确定”,在显示重启的消息后右键单击你的服务器名称,然后选择“重启”。

  5. SQL Server 重启之后,服务器将处于单用户模式。 请确保 SQL Server 代理未在运行。 如果启动,它将占用唯一的连接。

  6. 在 Windows 的“开始”菜单中,右键单击 Management Studio 图标,然后选择“以管理员身份运行”。 这会将你的管理员凭据传递到 SSMS。

    对于 Windows 的早期版本,“以管理员身份运行”选项显示为子菜单。

    在某些配置中,SSMS 将尝试进行多个连接。 多个连接失败,因为 SQL Server 处于单用户模式。 视具体情况,执行以下操作之一。

    1. 使用 Windows 身份验证(包括管理员凭据)与对象资源管理器连接。 依次展开“安全性”和“登录名”,然后双击你自己的登录名 。 在“服务器角色”页上,选择 sysadmin,然后选择“确定”。

    2. 使用 Windows 身份验证(包括您的管理员凭据)与“查询窗口”连接,而非与对象资源管理器连接。 (如果未与对象资源管理器连接,则只能这样连接)。执行类似以下的代码,以添加作为 sysadmin 固定服务器角色成员的新 Windows 身份验证登录名。 以下示例添加名为 CONTOSO\PatK的域用户。

      CREATE LOGIN [CONTOSO\PatK] FROM WINDOWS;
      ALTER SERVER ROLE sysadmin ADD MEMBER [CONTOSO\PatK];
      
    3. 如果 SQL Server 正在混合身份验证模式下运行,请使用 Windows 身份验证(包括您的管理员凭据)与“查询窗口”连接。 执行类似以下的代码,以创建作为 sysadmin 固定服务器角色成员的新 SQL Server 身份验证登录名。

      CREATE LOGIN TempLogin WITH PASSWORD = '<strong_password>';
      ALTER SERVER ROLE sysadmin ADD MEMBER TempLogin;
      

      警告

      将 <strong_password> 替换为强密码。

    4. 如果 SQL Server 正在混合身份验证模式下运行且你要重置 sa 帐户的密码,则请使用 Windows 身份验证(包括你的管理员凭据)与“查询窗口”连接。 使用以下语法更改 sa 帐户的密码。

      ALTER LOGIN sa WITH PASSWORD = '<strong_password>';
      

      警告

      将 <strong_password> 替换为强密码。

  7. 关闭 Management Studio。

  8. 接下来的几个步骤将 SQL Server 改回多用户模式。 在 SQL Server 配置管理器的左窗格中,选择“SQL Server 服务” 。

  9. 在右侧窗格中,右键单击 SQL Server 的实例,然后选择“属性”。

  10. 在“启动参数”选项卡上的“现有参数”框中,选择 -m,然后选择“删除”。

    对于某些早期版本的 SQL Server,没有“启动参数”选项卡。在这种情况下,在“高级”选项卡上,双击“启动参数”。 参数在较小的窗口中打开。 删除以前添加的 ;-m,然后选择“确定”。

  11. 右键单击服务器名称,然后选择“重启”。 如果在单用户模式下启动 SQL Server 之前停止了 SQL Server 代理,请确保再次启动它。

现在,你应该能够正常连接到现属于 sysadmin 固定服务器角色的帐户之一。