xp_cmdshell (Transact-SQL)xp_cmdshell (Transact-SQL)

適用対象: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Windows のコマンド シェルを起動し、実行用の文字列に渡します。Spawns a Windows command shell and passes in a string for execution. 出力は、テキストの行として返されます。Any output is returned as rows of text.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

  
xp_cmdshell { 'command_string' } [ , no_output ]  

引数Arguments

' command_string '' command_string '
オペレーティングシステムに渡すコマンドを含む文字列を指定します。Is the string that contains a command to be passed to the operating system. command_stringvarchar (8000) またはnvarchar (4000),、既定値はありません。command_string is varchar(8000) or nvarchar(4000), with no default. command_stringには、2つ以上の二重引用符を含めることはできません。command_string cannot contain more than one set of double quotation marks. Command_stringで参照されているファイルパスまたはプログラム名にスペースがある場合は、1組の引用符が必要です。A single pair of quotation marks is required if any spaces are present in the file paths or program names referenced in command_string. 埋め込みスペースで問題が発生した場合は、回避策として FAT 8.3 ファイル名を使用することを検討してください。If you have trouble with embedded spaces, consider using FAT 8.3 file names as a workaround.

no_outputno_output
は省略可能なパラメーターであり、クライアントに出力を返さないことを指定します。Is an optional parameter, specifying that no output should be returned to the client.

リターン コードの値Return Code Values

0 (成功) または 1 (失敗)0 (success) or 1 (failure)

結果セットResult Sets

次の xp_cmdshell ステートメントを実行すると、現在のディレクトリの一覧が返されます。Executing the following xp_cmdshell statement returns a directory listing of the current directory.

EXEC xp_cmdshell 'dir *.exe';  
GO  

行は、 nvarchar (255) 列で返されます。The rows are returned in an nvarchar(255) column. No_outputオプションを使用すると、次のものだけが返されます。If the no_output option is used, only the following will be returned:

The command(s) completed successfully.  

解説Remarks

Xp_cmdshellによって生成される Windows プロセスには、 SQL ServerSQL Serverサービスアカウントと同じセキュリティ権限が与えられます。The Windows process spawned by xp_cmdshell has the same security rights as the SQL ServerSQL Server service account.

xp_cmdshellは同期的に動作します。xp_cmdshell operates synchronously. コマンドシェルのコマンドが完了するまで、コントロールは呼び出し元に返されません。Control is not returned to the caller until the command-shell command is completed.

xp_cmdshellを有効または無効にするには、ポリシーベースの管理を使用するか、 sp_configureを実行します。xp_cmdshell can be enabled and disabled by using the Policy-Based Management or by executing sp_configure. 詳細については、「セキュリティ構成」および「 Xp_cmdshell サーバー構成オプション」を参照してください。For more information, see Surface Area Configuration and xp_cmdshell Server Configuration Option.

重要

バッチ内でxp_cmdshellが実行され、エラーが返された場合、バッチは失敗します。If xp_cmdshell is executed within a batch and returns an error, the batch will fail. これは動作の変更です。This is a change of behavior. 以前のバージョンのMicrosoftMicrosoft SQL ServerSQL Serverでは、バッチは引き続き実行されます。In earlier versions of MicrosoftMicrosoftSQL ServerSQL Server the batch would continue to execute.

xp_cmdshell プロキシアカウントxp_cmdshell Proxy Account

Sysadmin固定サーバーロールのメンバーではないユーザーによって呼び出された場合、 xp_cmdshellは、" # #xp_cmdshell_proxy_account # #" という名前の資格情報に格納されているアカウント名とパスワードを使用して Windows に接続します。When it is called by a user that is not a member of the sysadmin fixed server role, xp_cmdshell connects to Windows by using the account name and password stored in the credential named ##xp_cmdshell_proxy_account##. このプロキシ資格情報が存在しない場合、 xp_cmdshellは失敗します。If this proxy credential does not exist, xp_cmdshell will fail.

プロキシアカウントの資格情報を作成するにはsp_xp_cmdshell_proxy_accountを実行します。The proxy account credential can be created by executing sp_xp_cmdshell_proxy_account. このストアド プロシージャは、Windows のユーザー名とパスワードを引数にとります。As arguments, this stored procedure takes a Windows user name and password. たとえば、次のコマンドは、windows パスワードSHIPPING\KobeR sdfh%dkc93vcMt0を持つ windows ドメインユーザー用のプロキシ資格情報を作成します。For example, the following command creates a proxy credential for Windows domain user SHIPPING\KobeR that has the Windows password sdfh%dkc93vcMt0.

EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR','sdfh%dkc93vcMt0';  

詳細については、「 sp_xp_cmdshell_proxy_account (transact-sql)」を参照してください。For more information, see sp_xp_cmdshell_proxy_account (Transact-SQL).

アクセス許可Permissions

悪意のあるユーザーがxp_cmdshellを使用して特権を昇格しようとすることがあるため、 xp_cmdshellは既定で無効になっています。Because malicious users sometimes attempt to elevate their privileges by using xp_cmdshell, xp_cmdshell is disabled by default. Sp_configureまたはポリシーベースの管理を使用して有効にします。Use sp_configure or Policy Based Management to enable it. 詳細については、「 xp_cmdshell サーバー構成オプション」を参照してください。For more information, see xp_cmdshell Server Configuration Option.

最初に有効にした場合、 xp_cmdshellは CONTROL SERVER 権限を実行する必要があり、 xp_cmdshellによって作成SQL ServerSQL Serverされた Windows プロセスは、サービスアカウントと同じセキュリティコンテキストを持ちます。When first enabled, xp_cmdshell requires CONTROL SERVER permission to execute and the Windows process created by xp_cmdshell has the same security context as the SQL ServerSQL Server service account. 多くSQL ServerSQL Serverの場合、サービスアカウントには、 xp_cmdshellによって作成されたプロセスによって実行される作業に必要な権限よりも多くのアクセス許可があります。The SQL ServerSQL Server service account often has more permissions than are necessary for the work performed by the process created by xp_cmdshell. セキュリティを強化するには、 xp_cmdshellへのアクセスを高い特権を持つユーザーに制限する必要があります。To enhance security, access to xp_cmdshell should be restricted to highly privileged users.

非管理者がxp_cmdshellを使用できるようにしSQL ServerSQL Server 、が低い特権のアカウントのセキュリティトークンを使用して子プロセスを作成できるようにするには、次の手順を実行します。To allow non-administrators to use xp_cmdshell, and allow SQL ServerSQL Server to create child processes with the security token of a less-privileged account, follow these steps:

  1. プロセスに必要な最小限の特権で、Windows ローカルユーザーアカウントまたはドメインアカウントを作成およびカスタマイズします。Create and customize a Windows local user account or a domain account with the least privileges that your processes require.

  2. Sp_xp_cmdshell_proxy_accountシステムプロシージャを使用して、その最小特権のアカウントを使用するようにxp_cmdshellを構成します。Use the sp_xp_cmdshell_proxy_account system procedure to configure xp_cmdshell to use that least-privileged account.

    注意

    また、 SQL Server Management StudioSQL Server Management Studioオブジェクトエクスプローラーでサーバー名のプロパティを右クリックし、[サーバープロキシアカウント] セクションの [セキュリティ] タブを使用して、このプロキシアカウントを構成することもできます。You can also configure this proxy account using SQL Server Management StudioSQL Server Management Studio by right-clicking Properties on your server name in Object Explorer, and looking on the Security tab for the Server proxy account section.

  3. Management StudioManagement Studioは、master データベースを使用してGRANT exec ON xp_cmdshell TO N'<some_user>'; 、ステートメントを実行し、特定の非sysadminユーザーにxp_cmdshellを実行する権限を与えます。In Management StudioManagement Studio, using the master database, execute the GRANT exec ON xp_cmdshell TO N'<some_user>'; statement to give specific non-sysadmin users the ability to execute xp_cmdshell. 指定されたユーザーは、master データベースに存在している必要があります。The specified user must exist in the master database.

管理者以外のユーザーはxp_cmdshellでオペレーティングシステムプロセスを起動できるようになりました。これらのプロセスは、構成したプロキシアカウントのアクセス許可で実行されます。Now non-administrators can launch operating system processes with xp_cmdshell and those processes run with the permissions of the proxy account that you have configured. CONTROL SERVER 権限を持つユーザー ( sysadmin固定サーバーロールのメンバー) は、 xp_cmdshellによって起動さSQL ServerSQL Serverれる子プロセスのサービスアカウントのアクセス許可を引き続き受け取ります。Users with CONTROL SERVER permission (members of the sysadmin fixed server role) will continue to receive the permissions of the SQL ServerSQL Server service account for child processes that are launched by xp_cmdshell.

オペレーティングシステムプロセスを起動するときにxp_cmdshellによって使用されている Windows アカウントを特定するには、次のステートメントを実行します。To determine the Windows account being used by xp_cmdshell when launching operating system processes, execute the following statement:

xp_cmdshell 'whoami.exe'  
  

別のログインのセキュリティ コンテキストを確認するには、次のコマンドを実行します。To determine the security context for another login, execute the following:

EXECUTE AS LOGIN = '<other_login>' ;  
GO  
xp_cmdshell 'whoami.exe' ;  
REVERT ;  
  

Examples

A.A. 実行可能ファイルの一覧を返すReturning a list of executable files

次の例では、ディレクトリ コマンドを実行する xp_cmdshell 拡張ストアド プロシージャを示します。The following example shows the xp_cmdshell extended stored procedure executing a directory command.

EXEC master..xp_cmdshell 'dir *.exe'  

B.B. 出力を返さないReturning no output

次の例でxp_cmdshellは、を使用して、クライアントに出力を返さずにコマンド文字列を実行します。The following example uses xp_cmdshell to execute a command string without returning the output to the client.

USE master;  
  
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck  
    \\server2\backups\SQLbcks, NO_OUTPUT';  
GO  

C.C. リターンステータスの使用Using return status

次の例では、 xp_cmdshell拡張ストアドプロシージャによって戻り値の状態も提案されます。In the following example, the xp_cmdshell extended stored procedure also suggests return status. リターンコード値は変数@resultに格納されます。The return code value is stored in the variable @result.

DECLARE @result int;  
EXEC @result = xp_cmdshell 'dir *.exe';  
IF (@result = 0)  
   PRINT 'Success'  
ELSE  
   PRINT 'Failure';  

D.D. 変数の内容をファイルに書き込むWriting variable contents to a file

次の例では、@var 変数の内容を、現在のサーバー ディレクトリにある var_out.txt というファイルに書き込みます。The following example writes the contents of the @var variable to a file named var_out.txt in the current server directory.

DECLARE @cmd sysname, @var sysname;  
SET @var = 'Hello world';  
SET @cmd = 'echo ' + @var + ' > var_out.txt';  
EXEC master..xp_cmdshell @cmd;  

E.E. コマンドの結果をファイルにキャプチャするCapturing the result of a command to a file

次の例では、現在のディレクトリの内容を、現在dir_out.txtのサーバーディレクトリ内のという名前のファイルに書き込みます。The following example writes the contents of the current directory to a file named dir_out.txt in the current server directory.

DECLARE @cmd sysname, @var sysname;  
SET @var = 'dir/p';  
SET @cmd = @var + ' > dir_out.txt';  
EXEC master..xp_cmdshell @cmd;  

参照See Also

Transact-sql)(の一般的な拡張ストアドプロシージャ General Extended Stored Procedures (Transact-SQL)
xp_cmdshell サーバー構成オプション xp_cmdshell Server Configuration Option
セキュリティ構成 Surface Area Configuration
sp_xp_cmdshell_proxy_account (Transact-sql)sp_xp_cmdshell_proxy_account (Transact-SQL)