システム管理者がロックアウトされた場合の SQL Server への接続

適用対象: SQL Server

この記事では、システム管理者がロックアウトされた場合に、システム管理者として SQL Server データベース エンジンへのアクセスを回復する方法について説明します。システム管理者は、次のいずれかの理由で SQL Server のインスタンスにアクセスできなくなることがあります。

  • sysadmin 固定サーバー ロールのメンバーであるログインがすべて誤って削除された。

  • sysadmin 固定サーバー ロールのメンバーである Windows グループがすべて誤って削除された。

  • sysadmin 固定サーバー ロールのメンバーであるログインの使用者が、退社したか不在である。

  • sa アカウントが無効になっているか、パスワードが不明である。

解決方法

アクセスの問題を解決するには、SQL Server のインスタンスをシングル ユーザー モードで起動することをお勧めします。 このモードでは、アクセスを回復しようとしている間に、他の接続が行われないようにします。 ここでは、SQL Server のインスタンスに接続し、sysadmin サーバー ロールにログインを追加できます。 この解決策に関する詳細な手順については、「ステップ バイ ステップの手順」セクションを参照してください。

コマンド ラインから -m または -f オプションを使用して、SQL Server のインスタンスをシングル ユーザー モードで起動できます。 これにより、コンピューターのローカル Administrators グループのメンバーがすべて、固定サーバー ロール 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 を使用して、実行可能なノートブックで直接ステップを実行する

Note

このノートブックを開く前に、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)。

    Note

    必ず大文字の SQLCMD を使用してください

    既定のインスタンスがある場合は、インスタンス名なしで MSSQLSERVER を使用します。

    net start $service_name /f /mSQLCMD
    
  5. sqlcmd を使用して CREATE LOGIN コマンドを実行し、続いて ALTER SERVER ROLE コマンドを実行します。 この手順では、ローカルの Administrators グループのメンバーであるアカウントを使用して、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 構成マネージャーと SQL Server Management Studio (SSMS) の使用

以下の手順では、次のことを想定しています。

  • SQL Server は Windows 8 以上で実行されている。 それ以前のバージョンの SQL Server または Windows の場合、必要に応じて調整する必要があります。

  • SQL Server Management Studio がコンピューターにインストールされている。

ローカル Administrators グループのメンバーとして Windows にログインしているときに、以下の手順を実行します。

  1. Windows の [スタート] メニューから SQL Server Configuration Manager のアイコンを右クリックし、 [管理者として実行] を選択して、管理者の資格情報を Configuration Manager に渡します。

  2. SQL Server 構成マネージャーの左ペインで、 [SQL Server のサービス] を選択します。 右ペインで、 SQL Serverインスタンスを探します (SQL Server の既定のインスタンスには、コンピューター名の後に (MSSQLSERVER) が付いています。 名前付きインスタンスは、[登録済みサーバー] に表示されているものと同じ名前が大文字表記で表示されます)。 SQL Server のインスタンスを右クリックし、[プロパティ] を選択します。

  3. [起動時のパラメーター] タブの [起動時のパラメーターの指定] ボックスに、「-m」と入力し、[追加] を選択します (入力文字はダッシュの後に小文字の m です)。

    以前のバージョンの SQL Server では、[起動時のパラメーター] タブがない場合があります。その場合は、 [詳細設定] タブで、[起動時のパラメーター] をダブルクリックします。 パラメーターが小さいウィンドウに表示されます。 既存のパラメーターは、いずれも変更しないように注意してください。 最後に、新しいパラメーター ;-m を追加し、[OK]を選択します (入力文字はセミコロンの後に小文字の m です)。

  4. [OK] を選択し、再起動するためのメッセージが表示されたら、サーバー名を右クリックし、[再起動] を選択します。

  5. SQL Server を再起動すると、サーバーはシングル ユーザー モードになります。 SQL Server エージェントが実行されていないことを確認します。 起動した場合、それが唯一の接続になります。

  6. Windows の [スタート] メニューから、Management Studio を右クリックして、 [管理者として実行] を選択します。 こうすると、管理資格情報が SSMS に渡されます。

    以前のバージョンの Windows では、[管理者として実行] オプションはサブメニューとして表示されます。

    構成によっては、SSMS が複数の接続の確立を試みます。 SQL Server はシングル ユーザー モードのため、複数の接続は失敗します。 実際のシナリオに基づいて、次のいずれかのアクションを実行します。

    1. Windows 認証 (管理者の資格情報を含む) を使用してオブジェクト エクスプローラーと接続します。 [セキュリティ][ログイン] の順に展開し、自身のログインをダブルクリックします。 [サーバー ロール] ページで、[sysadmin] を選択し、[OK] を選択します。

    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 を削除し、[OK]を選択します。

  11. サーバー名を右クリックし、[再起動] を選択します。 シングル ユーザー モードで SQL Server を開始する前に、エージェントを停止している場合は、SQL Server エージェントを再起動してください。

これで、sysadmin 固定サーバー ロールのメンバーであるアカウントの 1 つを使用して正常に接続できます。