ストアドプロシージャ内からxp_cmdshellを実行しようとすると、エラーメッセージが表示されます。
xp_cmdshell 有効化インスタンスで。そして、実行許可が付与された私のユーザーに、しかし、私はまだ例外を見ています。
オブジェクト「xp_cmdshell」、データベース「mssqlsystemresource」、スキーマ「sys」に対するEXECUTE権限が拒否されました
問題の一部は、これが共有クラスターであり、インスタンス上に単一のデータベースがあるため、すべての管理者権限がないことです。だから、私は入って許可を与えることはできません。
SQL Serverインスタンスのsysadminロールのメンバーではないユーザーの場合、次のアクションを実行して、xp_cmdshell拡張ストアドプロシージャへのアクセスを許可する必要があります。さらに、手順のいずれかを忘れた場合は、スローされるエラーをリストしました。
xp_cmdshellプロシージャを有効にする
Msg 15281、レベル16、状態1、プロシージャxp_cmdshell、行1 SQL Serverは、コンポーネント「xp_cmdshell」のプロシージャ「sys.xp_cmdshell」へのアクセスをブロックしました。これは、このコンポーネントがこのサーバーのセキュリティ構成の一部としてオフになっているためです。システム管理者は、sp_configureを使用して「xp_cmdshell」の使用を有効にできます。 「xp_cmdshell」の有効化の詳細については、SQL Server Books Onlineの「表面領域の構成」を参照してください。*
masterデータベースへのパブリックアクセス権を持つ非sysadminユーザーのログインを作成します
メッセージ229、レベル14、状態5、プロシージャxp_cmdshell、1行目オブジェクト 'xp_cmdshell'、データベース 'mssqlsystemresource'、スキーマ 'sys'でEXECUTE権限が拒否されました。*
xp_cmdshellストアドプロシージャに対するEXEC権限の付与
メッセージ229、レベル14、状態5、プロシージャxp_cmdshell、1行目オブジェクト 'xp_cmdshell'、データベース 'mssqlsystemresource'、スキーマ 'sys'でEXECUTE権限が拒否されました。*
xp_cmdshellがsp_xp_cmdshell_proxy_accountを使用して実行されるプロキシアカウントを作成
メッセージ15153、レベル16、状態1、プロシージャxp_cmdshell、行1 xp_cmdshellプロキシアカウント情報を取得できないか、無効です。 「## xp_cmdshell_proxy_account ##」資格情報が存在し、有効な情報が含まれていることを確認してください。*
エラーから、ステップ2または3のいずれかが欠落しているように思われます。私は、そのセットアップに特有のものがあるかどうかを知るためにクラスターに精通していません。
Tchesterからの答えを完成させたい。
(1)xp_cmdshellプロシージャを有効にします。
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
-- Enable the xp_cmdshell procedure
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO
(2)masterデータベースへのパブリックアクセスを持つ非sysadminユーザーのログイン 'Domain\TestUser'(windowsユーザー)を作成します
(3)xp_cmdshellストアドプロシージャのEXEC権限を付与します。
GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]
(4)sp_xp_cmdshell_proxy_accountを使用してxp_cmdshellを実行するプロキシアカウントを作成します
EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'pwd'
-- Note: pwd means windows password for [Domain\TestUser] account id on the box.
-- Don't include square brackets around Domain\TestUser.
(5)ユーザーに制御サーバーのアクセス許可を付与する
USE master;
GRANT CONTROL SERVER TO [Domain\TestUser]
GO
tchester言った:
(2)masterデータベースへのパブリックアクセス権を持つ非sysadminユーザーのログインを作成します
ユーザーのデータベースリスト(サーバー/セキュリティ/接続/ユーザー名/プロパティ/ユーザーマッピング)に移動し、マスターデータベースのチェックボックスをオンにしました。ユーザーがマスターデータベースに既に存在することを示すエラーメッセージが表示されました。マスターデータベースに移動し、ユーザーを削除し、「ユーザーマッピング」に戻り、マスターのボックスをオンにし、下の「パブリック」ボックスをオンにします。
その後、xp_cmdshellで「my user name」に対する実行を許可する必要があります。
イブ
SQL Serverエージェント経由でデータをcsvとしてネットワーク共有に自動的にエクスポートするために提供されている機能を拡張します。
(1)xp_cmdshellプロシージャを有効にします。
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
-- Enable the xp_cmdshell procedure
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO
(2)masterデータベースへのパブリックアクセスを持つ非sysadminユーザーのログイン 'Domain\TestUser'(windowsユーザー)を作成します。ユーザーマッピングを完了
(3)バッチジョブとしてログオンします。[ローカルセキュリティポリシー]-> [ローカルポリシー]-> [ユーザー権利の割り当て]に移動します。 「バッチジョブとしてログオン」にユーザーを追加します
(4)domain\userのネットワークフォルダーに読み取り/書き込み権限を付与する
(5)xp_cmdshellストアドプロシージャのEXEC権限を付与します。
GRANT EXECUTE ON xp_cmdshell TO [Domain\TestUser]
(6)sp_xp_cmdshell_proxy_accountを使用してxp_cmdshellを実行するプロキシアカウントを作成します
EXEC sp_xp_cmdshell_proxy_account 'Domain\TestUser', 'password_for_domain_user'
(7)sp_xp_cmdshell_proxy_accountコマンドが機能しない場合は、手動で作成してください
create credential ##xp_cmdshell_proxy_account## with identity = 'Domain\DomainUser', secret = 'password'
(8)SQL Serverエージェントを有効にします。 SQL Server構成マネージャーを開き、SQL Serverサービスに移動して、SQL Serverエージェントを有効にします。
(9)自動ジョブを作成します。 SSMSを開き、SQL Serverエージェントを選択してから、ジョブを右クリックして[新しいジョブ]をクリックします。
(10)作成したユーザーとして「所有者」を選択します。 「ステップ」を選択し、「タイプ」をT-SQLにします。以下のようなコマンドフィールドに入力します。区切り文字を「、」に設定します
EXEC master..xp_cmdshell 'SQLCMD -q "select * from master" -o file.csv -s ","
(11)スケジュールを適宜記入してください。
今すぐ貢献しましょう。私はsysadminロールであり、2人のパブリックアクセスユーザーがxp_cmdshellを実行するように働きました。 xp_cmdshellは実行できますが、2人のユーザーは実行できません。
次の手順を実行しました。
新しい役割を作成します。
マスターを使用
CREATE ROLE [CmdShell_Executor]認証[dbo]
xp_cmdshellに対するEXECの付与[CmdShell_Executor]
masterデータベースにユーザーを追加します:セキュリティ->ユーザー。メンバーシップは、作成されたばかりの[CmdShell_Executor]のみをチェックします
プロキシアカウントを設定します。
EXEC sp_xp_cmdshell_proxy_account 'domain\user1'、 'users1 Windows password'
EXEC sp_xp_cmdshell_proxy_account 'domain\user2'、 'users2 Windows password'
その後、両方のユーザーは、Rスクリプトの実行を呼び出すxp_cmdshellを含むストアドプロシージャを実行できます。ユーザーが私のPCにアクセスしてパスワードを入力し、1行のコードを実行してから、パスワードを削除できるようにします。