MW211 EXIT

devlog
MSSQL/プログラムを実行する
2019年05月30日
┬──────────────────────────────────────┬
│「xp_cmdshell」を実行できるようにする                                       │
┴──────────────────────────────────────┴
  ┌────────────────────────────────────┐
  │EXEC xp_cmdshell …                                                     │
  └────────────────────────────────────┘
  上記のような「EXEC xp_cmdshell」文を実行した場合に以下のエラーが出る
  ┌────────────────────────────────────┐
  │メッセージ 15281、レベル 16、状態 1、プロシージャ xp_cmdshell、行 1     │
  │SQL Server によって、コンポーネント 'xp_cmdshell' の                    │
  │プロシージャ 'sys.xp_cmdshell' に対するアクセスがブロックされました。   │
  │このサーバーのセキュリティ構成で、                                      │
  │このコンポーネントが OFF に設定されているためです。                     │
  │システム管理者は sp_configure を使用して、                              │
  │'xp_cmdshell' の使用を有効にできます。                                  │
  │'xp_cmdshell' を有効にする手順の詳細については、                        │
  │SQL Server オンライン ブックで、'xp_cmdshell' を検索してください。      │
  └────────────────────────────────────┘
  これは既定では実行制限がかかっているからである
┌[注意]───────────────────────────────────┐
│既定で実行制限がかかっているというのは                                      │
│これから先の設定変更を行うとMSSQLからプログラム実行ができるため             │
│ある意味、如何様な悪さでもし放題ということになる                            │
│よって、SQLインジェクション対策には十分注意された上で臨んでいただきたい     │
└──────────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  そこでその設定変更(緩和)方法
  以下二組のコマンドを続けて実行する
  ┌────────────────────────────────────┐
  │EXEC sp_configure 'show advanced options', 1;                           │
  │RECONFIGURE;                                                            │
  │┌────────────────────────────────────┐
  ││構成オプション 'show advanced options' が 0 から 1 に変更されました。   │
  ││RECONFIGURE ステートメントを実行してインストールしてください。          │
  │└────────────────────────────────────┘
  ├────────────────────────────────────┤
  │EXEC sp_configure 'xp_cmdshell', 1;                                     │
  │RECONFIGURE;                                                            │
  │┌────────────────────────────────────┐
  ││構成オプション 'xp_cmdshell' が 0 から 1 に変更されました。             │
  ││RECONFIGURE ステートメントを実行してインストールしてください。          │
  │└────────────────────────────────────┘
  └────────────────────────────────────┘
  なお、二つ目だけをいきなり実行すると以下のエラーとなるので注意
  ┌────────────────────────────────────┐
  │メッセージ 15123、レベル 16、状態 1、プロシージャ sp_configure、行 62   │
  │構成オプション 'xp_cmdshell' が存在しないか、                           │
  │詳細構成オプションの可能性があります。                                  │
  └────────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  なお、別案として、以下でも同等なことができる
  ┌────────────────────────────────────┐
  │「Microsoft SQL Server Management Studio」におけるツリー上のサーバの    │
  │右クリックメニュー「ファセット」を選択                                  │
  │┌─────────────────────┐                          │
  ││ファセットの表示                          │                          │
  │├──┬──────────────────┤                          │
  ││全般│          ┌───────────┐│                          │
  ││    │ファセット│サーバーセキュリティー││                          │
  ││    │          └───────────┘│                          │
  ││    │┌───────────┬────┐│                          │
  ││    ││XPCmdShellEnabled     │False   ││→「True」にする          │
  ││    │└───────────┴────┘│                          │
  └────────────────────────────────────┘
  GUIで「XPCmdShellEnabled」を「True」に設定すればよい
┬──────────────────────────────────────┬
│「xp_cmdshell」の実行                                                       │
┴──────────────────────────────────────┴
  通常のコマンドを「EXEC xp_cmdshell」の後に文字列と記述すれば実行すればよい
  例えば以下のような感じ
  ┌────────────────────────────────────┐
  │EXEC xp_cmdshell 'dir'                                                  │
  └────────────────────────────────────┘
  処理結果として、結果が行ごとのレコードとして返却される
  また、以下のように標準出力を変えてあげることもできる(通常のコマンドと同様)
  ┌────────────────────────────────────┐
  │EXEC xp_cmdshell 'dir > D:\work\test.txt'                               │
  └────────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  なお、正常終了(0)か否かの戻り値が返るので、これを捕捉することもできる
  ┌────────────────────────────────────┐
  │DECLARE @ret int;                                                       │
  │EXEC @ret = xp_cmdshell 'dir'                                           │
  │SELECT @ret;                                                            │
  └────────────────────────────────────┘
────────────────────────────────────────
分類:MSSQL