web-dev-qa-db-ja.com

'xp_cmdshell' SQL Serverを有効にする

EXEC master..xp_cmdshell @bcpqueryを実行したい

しかし、私は次のようなエラーが出ています。

このサーバーのセキュリティ構成の一部としてこのコンポーネントが無効になっているため、SQL Serverはコンポーネント 'xp_cmdshell'のプロシージャ 'sys.xp_cmdshell'へのアクセスをブロックしました。システム管理者は、sp_configureを使用して「xp_cmdshell」の使用を有効にできます。 'xp_cmdshell'を有効にする方法の詳細については、SQL Server Books Onlineの「Surface Area Configuration」を参照してください。

これを有効にする方法、または機能を有効にする前に何かを実行する方法はありますか?

解決するには?

167
cMinor

有効にする必要があります。 xp_cmdshell MSDN docs の[権限]セクションを確認してください。

http://msdn.Microsoft.com/en-us/library/ms190693.aspx

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
353
Pero P.

また、再設定後に詳細オプションを非表示にすることもできます。

-- show advanced options
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
-- enable xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
-- hide advanced options
EXEC sp_configure 'show advanced options', 0
GO
RECONFIGURE
GO
37
hoggar

サーバーを右クリックして - >ファセット - > Surface Area Configuration - > XPCmshellEnbled - > true enter image description here

14
arnav

他の回答にリストされているように、(SQL 2005以降での)トリックは show advanced optionsxp_cmdshell のグローバル構成設定をこの順番で1に変更することです。

これに加えて、以前の値を保存したい場合は、最初に sys.configurations から読み、最後に逆の順序で適用することができます。不必要なreconfigureの呼び出しも避けることができます。

declare @prevAdvancedOptions int
declare @prevXpCmdshell int

select @prevAdvancedOptions = cast(value_in_use as int) from sys.configurations where name = 'show advanced options'
select @prevXpCmdshell = cast(value_in_use as int) from sys.configurations where name = 'xp_cmdshell'

if (@prevAdvancedOptions = 0)
begin
    exec sp_configure 'show advanced options', 1
    reconfigure
end

if (@prevXpCmdshell = 0)
begin
    exec sp_configure 'xp_cmdshell', 1
    reconfigure
end

/* do work */

if (@prevXpCmdshell = 0)
begin
    exec sp_configure 'xp_cmdshell', 0
    reconfigure
end

if (@prevAdvancedOptions = 0)
begin
    exec sp_configure 'show advanced options', 0
    reconfigure
end

これはSQL Serverバージョン2005以降に依存していることに注意してください(元の質問は2008年のものでした)。

9
Geoff

受け入れられた答えはほとんどの場合うまくいくでしょうが、私はそうではないいくつかのケースに遭遇しました(それでも理由がわからない)。 RECONFIGUREWITH OVERRIDEを使用してクエリを少し修正すると解決策が得られます。

Use Master
GO

EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO

EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO

期待される出力は

構成オプション 'show advanced options'が0から1に変更されました。インストールするにはRECONFIGUREステートメントを実行してください。
設定オプション 'xp_cmdshell'が0から1に変更されました。インストールするにはRECONFIGUREステートメントを実行してください。

4
Athafoud

この質問が解決したとしても、それについてのアドバイスを追加したいと思います。..開発者として無視したため。

メッセージ警告に示されているように、私たちが話しているMSSQL xp_cmdshellenabledはセキュリティにとって非常に重要です。

Blockquote SQL Serverは、コンポーネント「xp_cmdshell」のプロシージャ「sys.xp_cmdshell」へのアクセスをブロックしました。これは、このコンポーネントがsecurity configurationの一部としてオフになっているためですこのサーバー。 [...]

サービスを有効にしたままにすることは、一種の弱点です。これは、たとえばWebアプリで、攻撃者からのコマンドSQLを反映および実行できます。人気のある CWE-89SQL Injectionそれはソフトウェアの弱点である可能性があり、したがって、これらのタイプのシナリオは CAPEC-108などの可能性のある攻撃への道を開く可能性がありますCommand Line Execution through SQL Injection

楽しいことをしたいと思っています。開発者とエンジニアは気づいて物事を行い、より安全になります!

3
sawyer

私にとっては、SQL 2008 R2の唯一の方法はこれでした。

EXEC sp_configure 'Show Advanced Options', 1    
RECONFIGURE **WITH OVERRIDE**    
EXEC sp_configure 'xp_cmdshell', 1    
RECONFIGURE **WITH OVERRIDE**
0
David Bru