Pengembang kami harus dapat memulai pekerjaan SQL Server Agent dari kode .Net mereka. Saya tahu saya dapat memanggil msdb..sp_start_job untuk melakukan hal itu, tetapi saya tidak ingin memberikan akses langsung ke akun pengguna umum untuk menjalankan pekerjaan.
Yang ingin saya lakukan adalah membuat prosedur tersimpan dalam database aplikasi menggunakan klausa WITH EXECUTE AS untuk menyamar sebagai akun proxy. Prosedur yang kita miliki adalah:
CREATE PROCEDURE dbo.StartAgentJob
WITH EXECUTE AS 'agentProxy'
AS
BEGIN
EXEC msdb.dbo.sp_start_job N'RunThisJob';
END
Ketika kami menjalankan ini, kami mendapat pesan berikut:
The EXECUTE permission was denied on the object 'sp_start_job', database 'msdb', schema 'dbo'.
Ada ide? Apakah ini bahkan cara terbaik untuk melakukan ini di SQL2005?
sql-server-2005
sql
sql-server
Ed Leighton-Dick
sumber
sumber
Jawaban:
Sudahkah Anda memasukkan login agentProxy ke dalam database msdb dan memberikannya hak untuk menjalankan sp_start_job? Jika tidak, Anda harus mengaktifkan perijinan izin basis data untuk basis data msdb dan basis data pengguna Anda.
Anda mungkin lebih baik memasukkan login ke dalam database msdb dan memberikannya hak yang benar.
sumber
Saya senang Anda menyelesaikan ini, tetapi kepemilikan rantai bukan solusi yang disarankan. Karena Anda tampaknya benar-benar khawatir tentang keamanan dan rincian hak yang terlibat, saya menambahkan balasan ini, meskipun terlambat, sebagai referensi untuk apa yang terjadi dan bagaimana menyelesaikan masalah ini.
EXECUTE AS lingkup peniruan
Klausa EXECUTE AS datang dalam dua rasa: EXECUTE AS LOGIN dan EXECUTE AS USER. EXECUTE AS LOGIN diautentikasi oleh server dan merupakan konteks peniruan yang dipercaya oleh seluruh instance SQL (lingkup server):
EXECUTE AS USER diautentikasi oleh database dan merupakan konteks peniruan yang hanya dipercaya oleh database tersebut (lingkup-database):
Prosedur tersimpan yang memiliki klausa EXECUTE AS akan membuat konteks peniruan cakupan yang dilingkupi oleh basis data, dan dengan demikian tidak akan dapat merujuk objek di luar basis data, jika Anda tidak dapat merujuk
msdb.dbo.sp_start_job
karena ada dimsdb
. Ada banyak contoh lain yang tersedia, seperti mencoba mengakses ruang lingkup DMV server, mencoba menggunakan server tertaut atau mencoba untuk mengirimkan pesan Broker Layanan ke dalam basis data lain.Memungkinkan peniruan cakupan database untuk mengakses sumber daya yang biasanya tidak diizinkan autentikator dari konteks peniruan harus dipercaya. Untuk peniruan cakupan dengan basis data, authenticator adalah basis data dbo. Ini dapat dicapai dengan dua cara yang mungkin:
Rincian ini dijelaskan dalam MSDN: Memperluas Peniruan Database dengan Menggunakan EXECUTE AS .
Ketika Anda menyelesaikan masalah melalui rantai kepemilikan silang basis data, Anda telah mengaktifkan rantai silang-db di seluruh tingkat server, yang dianggap sebagai risiko keamanan. Cara paling terkontrol, berbutir halus untuk mencapai hasil yang diinginkan adalah dengan menggunakan penandatanganan kode:
dbo.StartAgentJob
dengan sertifikat inimsdb
msdb
msdb
Langkah-langkah ini memastikan bahwa konteks
dbo.StartAgentJob
prosedur EXECUTE AS sekarang dipercayamsdb
, karena konteksnya ditandatangani oleh kepala sekolah yang memiliki izin ASLI dimsdb
. Ini memecahkan setengah dari teka-teki. Setengah lainnya adalah untuk benar-benar memberikan izin EXECUTEmsdb.dbo.sp_start_job
ke konteks peniruan yang sekarang tepercaya. Ada beberapa cara bagaimana ini bisa dilakukan:agentProxy
pengguna yang ditirumsdb
dan memberinya izin untuk mengeksekusimsdb.dbo.sp_start_job
msdb
asli sertifikat yang diturunkanmsdb
dan berikan izin eksekusi kepada pengguna turunan iniOpsi 1. sederhana, tetapi memiliki kelemahan besar:
agentProxy
pengguna sekarang dapat melakukan atasmsdb.dbo.sp_start_job
kehendaknya sendiri, ia benar-benar diberikan akses kemsdb
dan memiliki izin eksekusi.Opsi 3 benar secara positif, tetapi saya merasa tidak perlu berlebihan.
Jadi pilihan saya adalah Opsi 2: berikan izin EXECUTE
msdb.dbo.sp_start_job
ke pengguna yang berasal dari sertifikat yang dibuat dimsdb
.Berikut ini adalah SQL yang sesuai:
Blog saya memiliki beberapa artikel yang membahas topik ini, ditulis dalam konteks prosedur yang diaktifkan oleh Broker Layanan (karena memerlukan klausa EXECUTE AS):
BTW, jika Anda mencoba menguji skrip saya dan Anda tinggal di belahan bumi timur, atau di musim panas Inggris, pasti baca artikel terakhir yang saya tautkan sebelum pengujian.
sumber
Karena Anda mencoba memulai SQL Server Agent dari kode .NET, ini mungkin pertanyaan yang lebih baik untuk StackOverflow?
http://www.stackoverflow.com
sumber
Memeriksa Instance SQL acak pada jaringan SQLAgentOperatorRole tidak memberi Anda hak istimewa sp_start_job secara langsung, ia mewarisi mereka dari SQLAgentUserRole.
Periksa ulang menggunakan:
Jalankan ini di MSDB dan periksa apakah Anda tidak mewarisi akses penolakan eksplisit.
hth.
sumber
Salah satu cara untuk mencapai ini tanpa memberikan izin tambahan: jangan biarkan proc yang disimpan memulai pekerjaan secara langsung, tetapi biarkan saja proc yang disimpan untuk membalik sedikit dalam sebuah tabel (dalam database aplikasi); kemudian, biarkan pekerjaan berjalan sekitar satu menit atau lebih, periksa apakah bitnya terbalik dan jika demikian, lakukan pekerjaan dan balikkan bit itu lagi. Jika pekerjaan melihat bit tidak terbalik, pekerjaan hanya akan keluar.
Bekerja seperti mantra, jika Anda tidak keberatan dengan penundaan (dan pekerjaan berjalan sangat sering).
sumber