次の方法で共有


xp_cmdshell (Transact-SQL)

Windows のコマンド シェルを起動し、実行用の文字列に渡します。出力は、テキストの行として返されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

xp_cmdshell { 'command_string' } [ , no_output ]

引数

  • 'command_string'
    オペレーティング システムに渡すコマンドを含む文字列を指定します。command_string のデータ型は varchar(8000) または nvarchar(4000) で、既定値はありません。command_string に、二重引用符を 2 組以上含めることはできません。command_string で参照するファイル パスまたはプログラム名にスペースがある場合は、引用符を 1 組指定する必要があります。ファイル パスやファイル名に埋め込まれたスペースに関する問題が発生する場合は、その問題への対処方法として FAT 8.3 ファイル名の使用を検討してください。
  • no_output
    クライアントに出力を返す必要がないことを指定します (省略可能)。

結果セット

次の xp_cmdshell ステートメントを実行すると、現在のディレクトリの一覧が返されます。

EXEC xp_cmdshell 'dir *.exe';
GO

行は nvarchar(255) の列に返されます。no_output オプションを使用した場合、次のメッセージだけが返されます。

The command(s) completed successfully.

解説

xp_cmdshell で起動した Windows のプロセスには、SQL Server サービス アカウントと同じセキュリティ権限が与えられます。

xp_cmdshell は、同期して動作します。制御は、コマンド シェルのコマンドが完了するまで呼び出し元に返されません。

セキュリティ構成ツールを使用して sp_configure を実行すると、xp_cmdshell を有効または無効にできます。詳細については、「セキュリティ構成」および「xp_cmdshell オプション」を参照してください。

ms175046.note(ja-jp,SQL.90).gif重要 :
xp_cmdshell をバッチ内で実行し、エラーが返された場合、バッチは失敗します。これは新しい動作です。以前のバージョンの Microsoft SQL Server では、バッチは続行されていました。

xp_cmdshell プロキシ アカウント

sysadmin 固定サーバー ロールのメンバ以外のユーザーが xp_cmdshell を呼び出した場合は、##xp_cmdshell_proxy_account## という資格情報に格納されているアカウント名とパスワードによって、Windows への接続が行われます。このプロキシ資格情報が存在しない場合、xp_cmdshell は失敗します。

プロキシ アカウントの資格情報は、sp_xp_cmdshell_proxy_account を実行して作成できます。このストアド プロシージャは、Windows のユーザー名とパスワードを引数にとります。たとえば次のコマンドでは、Windows ドメイン ユーザー SHIPPING\KobeR 用のプロキシ資格情報が、Windows パスワード sdfh%dkc93vcMt0 で作成されます。

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

詳細については、「sp_xp_cmdshell_proxy_account (Transact-SQL)」を参照してください。

権限

CONTROL SERVER 権限が必要です。

戻り値

0 (成功) または 1 (失敗)

A. 実行可能ファイルの一覧を返す

次の例では、ディレクトリ コマンドを実行する xp_cmdshell 拡張ストアド プロシージャを示します。

EXEC master..xp_cmdshell 'dir *.exe'

B. Windows の net コマンドを使用する

次の例では、ストアド プロシージャでの xp_cmdshell の使用を示します。この例では、net send を使用して、SQL Server インスタンスがこれからシャットダウンすることをユーザーに通知し、net pause を使用してサーバーを一時停止した後、net stop を使用してシャットダウンします。

CREATE PROC shutdown10
AS
    EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server 
        shutting down in 10 minutes. No more connections 
        allowed.', no_output
    EXEC xp_cmdshell 'net pause sqlserver'
    WAITFOR DELAY '00:05:00'
    EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server 
        shutting down in 5 minutes.', no_output
    WAITFOR DELAY '00:04:00'
    EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server 
        shutting down in 1 minute. Log off now.', no_output
    WAITFOR DELAY '00:01:00'
    EXEC xp_cmdshell 'net stop sqlserver', no_output

C. 出力を返さない

次の例では、xp_cmdshell を使用して、クライアントに出力を返さずにコマンド文字列を実行します。

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

D. 戻りステータスを使用する

次の例では、xp_cmdshell 拡張ストアド プロシージャでステータス番号も表示します。戻り値は、変数 @result に格納されます。

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

E. さまざまな内容をファイルに書き込む

次の例では、@var 変数の内容を、現在のサーバー ディレクトリにある var_out.txt というファイルに書き込みます。

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

F. コマンドの結果をファイルにキャプチャする

次の例では、現在のディレクトリの内容を、現在のサーバー ディレクトリにある dir_out.txt というファイルに書き込みます。

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

参照

関連項目

汎用拡張ストアド プロシージャ (Transact-SQL)
sp_xp_cmdshell_proxy_account (Transact-SQL)

その他の技術情報

xp_cmdshell オプション
セキュリティ構成

ヘルプおよび情報

SQL Server 2005 の参考資料の入手