xp_cmdshell (Transact-SQL)
Windows のコマンド シェルを起動し、実行用の文字列に渡します。出力は、テキストの行として返されます。
構文
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 オプション」を参照してください。
重要 : |
---|
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)