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

適用対象: ○SQL Server XAzure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure 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. 詳細については、次を参照してください。セキュリティ構成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. 以前のバージョンのMicrosoftMicrosoftSQL ServerSQL Serverバッチは実行を続行します。In earlier versions of MicrosoftMicrosoftSQL 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

汎用拡張ストアド プロシージャ(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)