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

適用対象:○SQL Server (2008 以降)×Azure SQL Database×Azure SQL Data Warehouse ×Parallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse 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


xp_cmdshell { 'command_string' } [ , no_output ]  


' 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二重引用符の 1 つ以上のセットを含めることはできません。command_string cannot contain more than one set of double quotation marks. スペースをすべてのファイル パスに存在またはプログラムの名前で参照されている場合は、引用符の 1 つのペアが必要command_stringです。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.

クライアントに出力を返す必要がないことを指定します (省略可能)。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';  

行が返されます、 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.  


によって生成される Windows プロセスxp_cmdshellとして同じセキュリティ権限を持つ、 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. 詳細については、次を参照してください。 Surface Area Configurationxp_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 MicrosoftMicrosoft SQL ServerSQL Server the batch would continue to execute.

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

メンバーではないユーザーによって呼び出されたとき、 sysadmin固定サーバー ロール、 xp_cmdshellアカウント名と名前付き資格情報に格納されているパスワードを使用して Windows への接続##xp_cmdshell_proxy_account ##です。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 Windows パスワードを持つsdfh%dkc93vcMt0します。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).


悪意のあるユーザーが場合がありますを使用して、特権の昇格を試行するためxp_cmdshellxp_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 権限とによって作成される Windows プロセスが必要ですxp_cmdshellと同じセキュリティ コンテキストを持つ、 SQL ServerSQL Serverサービス アカウント。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 '<somelogin>'ステートメント以外の特定の提供をsysadminユーザーを実行できるxp_cmdshellです。In Management StudioManagement Studio, using the master database, execute the GRANT exec ON xp_cmdshell TO '<somelogin>' statement to give specific non-sysadmin users the ability to execute xp_cmdshell. 指定したログインが master データベース内のユーザーにマップされている必要があります。The specified login must be mapped to a user 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固定サーバー ロール) の権限が与えは引き続き、 SQL ServerSQL Serverによって起動された子プロセス用のサービス アカウントxp_cmdshell.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.

    によって使用されている Windows アカウントを特定するxp_cmdshellオペレーティング システム プロセスを起動するときに、次のステートメントを実行します。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>' ;  
xp_cmdshell 'whoami.exe' ;  


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';  

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'  
   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

汎用拡張ストアド プロシージャと #40 です。TRANSACT-SQL と #41 です。 General Extended Stored Procedures (Transact-SQL)
xp_cmdshell サーバー構成オプション xp_cmdshell Server Configuration Option
セキュリティ構成 Surface Area Configuration
sp_xp_cmdshell_proxy_account (です。TRANSACT-SQL と #41 です。sp_xp_cmdshell_proxy_account (Transact-SQL)