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」を参照してください。
これを有効にする方法、または機能を有効にする前に何かを実行する方法はありますか?
解決するには?
有効にする必要があります。 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
また、再設定後に詳細オプションを非表示にすることもできます。
-- 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
他の回答にリストされているように、(SQL 2005以降での)トリックは show advanced options
と xp_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年のものでした)。
受け入れられた答えはほとんどの場合うまくいくでしょうが、私はそうではないいくつかのケースに遭遇しました(それでも理由がわからない)。 RECONFIGURE
でWITH 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ステートメントを実行してください。
この質問が解決したとしても、それについてのアドバイスを追加したいと思います。..開発者として無視したため。
メッセージ警告に示されているように、私たちが話しているMSSQL xp_cmdshellenabledはセキュリティにとって非常に重要です。
Blockquote SQL Serverは、コンポーネント「xp_cmdshell」のプロシージャ「sys.xp_cmdshell」へのアクセスをブロックしました。これは、このコンポーネントがsecurity configurationの一部としてオフになっているためですこのサーバー。 [...]
サービスを有効にしたままにすることは、一種の弱点です。これは、たとえばWebアプリで、攻撃者からのコマンドSQLを反映および実行できます。人気のある CWE-89 :SQL Injection
それはソフトウェアの弱点である可能性があり、したがって、これらのタイプのシナリオは CAPEC-108などの可能性のある攻撃への道を開く可能性があります :Command Line Execution through SQL Injection
楽しいことをしたいと思っています。開発者とエンジニアは気づいて物事を行い、より安全になります!
私にとっては、SQL 2008 R2の唯一の方法はこれでした。
EXEC sp_configure 'Show Advanced Options', 1
RECONFIGURE **WITH OVERRIDE**
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE **WITH OVERRIDE**