xp_cmdshell を呼び出す SQL ストアド プロシージャを使用しています。xp_cmdshell が有効になっており、プロキシ アカウントが「vpexporter」に設定されています。この sproc は、データ ファイルをディスクに書き出すように設計されています。
この sproc は、SQL 2005 サーバー上で動作していました。環境は SQL 2012 にアップグレードされ、sproc は実行されなくなりました。呼び出しを行う行は次のとおりです。
set @sql1 = 'bcp "SELECT * FROM dbo.udPayrollOutput" queryout "D:\Repository\Exports\' + @fileunique -Uvpexporter -Ppassword -c -t,'
exec master..xp_cmdshell @sql1
これを SSMS で実行すると、次のようになります。
SQLState = 28000. NativeError = 18456 エラー = [Microsoft][SQL Server Native Client 11.0][SQL Server] ユーザー 'vpexporter' のログインに失敗しました。
SQL ログインとドメイン アカウントの両方でこれを試しました。どちらも同じエラーを返します。「vpexporter」がログインとして追加され、xp_cmdshell の実行権限を持つマスター データベースのユーザーとして設定されました。
SQL バージョン 2012 で xp_cmdshell を呼び出す方法が変わったに違いないと思いますが、グーグルで検索しても何も見つかりませんでした。
SQL Serverが実行されているアカウントである「nt authority\network service」を返す「exec xp_cmdshell 'whoami.exe'」を実行してみました。
私の理解では、「sp_xp_cmdshell_proxy_account」でコマンド シェル プロキシ アカウントを指定すると、代わりにそれが使用されるということでした。ネットワーク サービスへの xp_cmdshell 実行アクセス権を付与したくありません。
私はいくつかの進歩を遂げましたが、まだ立ち往生しています。元のエラーは、クエリ行に「-S ServerName\InstanceName」を追加して SQL インスタンスを指定する必要がある新しい環境が原因でした。エラーが表示されます:
「cvADPTaxCreditExp」ストアド プロシージャを起動できません。オブジェクト 'xp_cmdshell'、データベース 'mssqlsystemresource'、スキーマ 'sys' に対する EXECUTE 権限が拒否されました。
マスターの xp_cmdshell への実行アクセス許可をプロキシ アカウントに付与しましたが、まだこのエラーが発生します。
exec sp_xp_cmdshell_proxy_account 'NEWMECHDOM\vpexporter', 'password';
GRANT EXECUTE ON xp_cmdshell TO [NEWMECHDOM\vpexporter];
私はこれでそれを確認しました:
select * from sys.credentials
他にセキュリティを設定する必要がある場所はありますか?