xp_cmdshell (Transact-SQL)
適用対象:SQL Server
Windows のコマンド シェルを起動し、実行用の文字列に渡します。 出力は、テキストの行として返されます。
構文
xp_cmdshell { 'command_string' } [ , NO_OUTPUT ]
引数
'command_string'
オペレーティング システムに渡されるコマンドを含む文字列。 command_stringは varchar(8000) または nvarchar(4000)で、既定値はありません。 command_string複数の二重引用符を含めることはできません。 command_stringで参照されるファイル パスまたはプログラム名にスペースが存在する場合は、単一の二重引用符が必要です。 埋め込みスペースに問題がある場合は、回避策として FAT 8.3 ファイル名を使用することを検討してください。
NO_ OUTPUT
クライアントに出力を返さないことを指定する省略可能なパラメーター。
リターン コードの値
0
(成功) または 1
(失敗)。
結果セット
次の xp_cmdshell
ステートメントを実行すると、現在のディレクトリの一覧が返されます。
EXEC xp_cmdshell 'dir *.exe';
GO
行は nvarchar(255) 列で返されます。 このオプションを NO_OUTPUT
使用すると、次の出力のみが返されます。
The command(s) completed successfully.
解説
生成された xp_cmdshell
Windows プロセスには、SQL Server サービス アカウントと同じセキュリティ権限があります。
注意
xp_cmdshell
は強力な機能であり、既定では無効になっています。 xp_cmdshell
は、ポリシー ベースの管理を使用するか、 を実行 sp_configure
して有効または無効にできます。 詳細については、「Surface Area の構成とxp_cmdshell (サーバー構成オプション)」を参照してください。 xp_cmdshell
を使うと、セキュリティ監査ツールをトリガーできます。
xp_cmdshell
は同期的に動作します。 command-shell コマンドが完了するまで、コントロールは呼び出し元に返されません。 バッチ内で実行され、エラーが返された場合 xp_cmdshell
、バッチは失敗します。
xp_cmdshell プロキシ アカウント
sysadmin 固定サーバー ロールのメンバーではないユーザーによって呼び出された場合は、xp_cmdshell
##xp_cmdshell_proxy_account## という名前の資格情報に格納されているアカウント名とパスワードを使用して Windows に接続します。 このプロキシ資格情報が存在しない場合、 xp_cmdshell
失敗します。
プロキシ アカウントの資格情報は、次のコマンドを sp_xp_cmdshell_proxy_account
実行して作成できます。 このストアド プロシージャは、Windows のユーザー名とパスワードを引数にとります。 たとえば、次のコマンドは、Windows パスワードsdfh%dkc93vcMt0
を持つ Windows doメイン ユーザーSHIPPING\KobeR
のプロキシ資格情報を作成します。
EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR', 'sdfh%dkc93vcMt0';
詳細については、「 sp_xp_cmdshell_proxy_account (Transact-SQL)」を参照してください。
アクセス許可
悪意のあるユーザーが使用 xp_cmdshell
して特権を昇格しようとする場合があるため、 xp_cmdshell
既定では無効になっています。 ポリシー ベースの管理を使用sp_configure
して有効にします。 詳細については、「 xp_cmdshell サーバー構成オプション」を参照してください。
最初に有効にすると、 xp_cmdshell
CONTROL Standard Edition RVER アクセス許可が実行される必要があり、作成された xp_cmdshell
Windows プロセスには SQL Server サービス アカウントと同じセキュリティ コンテキストがあります。 SQL Server サービス アカウントには、多くの場合、作成 xp_cmdshell
されたプロセスによって実行される作業に必要な以上のアクセス許可があります。 セキュリティを強化するには、アクセスを xp_cmdshell
高い特権を持つユーザーに制限する必要があります。
管理者以外のユーザーが使用 xp_cmdshell
できるようにし、SQL Server が特権の低いアカウントのセキュリティ トークンを使用して子プロセスを作成できるようにするには、次の手順に従います。
プロセスに必要な最小限の特権を持つ Windows ローカル ユーザー アカウントまたは doメイン アカウントを作成してカスタマイズします。
システム 手順を
sp_xp_cmdshell_proxy_account
使用して、その最小特権アカウントを使用するように構成xp_cmdshell
します。Note
SQL Server Management Studio を使用してこのプロキシ アカウントを構成することもできます。そのためには、オブジェクト エクスプローラーでサーバー名の [プロパティ] を右クリックし、[サーバー プロキシ アカウント] セクションの [セキュリティ] タブを確認します。
Management Studio では、データベースを
master
使用して、次の Transact-SQL ステートメントを実行して、特定の sysadmin 以外のユーザーが実行xp_cmdshell
できるようにします。 指定したユーザーがデータベースに存在しているmaster
必要があります。GRANT exec ON xp_cmdshell TO N'<some_user>';
管理者以外のユーザーがオペレーティング システム プロセスを xp_cmdshell
起動できるようになりました。これらのプロセスは、構成したプロキシ アカウントのアクセス許可を使用して実行されます。 CONTROL Standard Edition RVER アクセス許可 (sysadmin 固定サーバー ロールのメンバー) を持つユーザーは、起動されたxp_cmdshell
子プロセスに対する SQL Server サービス アカウントのアクセス許可を引き続き受け取ります。
オペレーティング システム プロセスを起動するときに使用 xp_cmdshell
されている Windows アカウントを確認するには、次のステートメントを実行します。
EXEC xp_cmdshell 'whoami.exe';
別のログインのセキュリティ コンテキストを確認するには、次の Transact-SQL コードを実行します。
EXEC AS LOGIN = '<other_login>';
GO
xp_cmdshell 'whoami.exe';
REVERT;
例
A. 実行可能ファイルの一覧を返す
次の例では、ディレクトリ コマンドを実行する xp_cmdshell
拡張ストアド プロシージャを示します。
EXEC master..xp_cmdshell 'dir *.exe'
B. 出力を返さない
次の例では xp_cmdshell
、クライアントに出力を返さずにコマンド文字列を実行します。
USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
\\server2\backups\SQLbcks', NO_OUTPUT;
GO
C: 戻り値の状態を使用する
次の例では、 xp_cmdshell
拡張ストアド プロシージャも戻り状態を示しています。 戻りコード値は変数 @result
に格納されます。
DECLARE @result INT;
EXEC @result = xp_cmdshell 'dir *.exe';
IF (@result = 0)
PRINT 'Success'
ELSE
PRINT 'Failure';
D. 変数の内容をファイルに書き込む
次の例では、@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;
E. コマンドの結果をファイルにキャプチャする
次の例では、現在のディレクトリの内容を、現在のサーバー ディレクトリで指定された dir_out.txt
ファイルに書き込みます。
DECLARE @cmd SYSNAME,
@var SYSNAME;
SET @var = 'dir /p';
SET @cmd = @var + ' > dir_out.txt';
EXEC master..xp_cmdshell @cmd;
関連するコンテンツ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示