Sql Server 代理是系統管理員角色的一部分,即使強硬 Sql Server 說它不是
我創建了一個除域使用者外沒有其他權限的 Windows 帳戶,並使用 SQL Server 配置管理器將其設置為 SQL Server 代理服務帳戶。
BoL/MSDN 說這個使用者應該是系統管理員角色的一部分才能工作,但此時我還沒有採取任何行動來實現這一點。
我希望該帳戶無能為力,但它似乎是……一個系統管理員!如果您將以下語句放在作業步驟中,它將確認這一點:
IF IS_SRVROLEMEMBER ('sysadmin') = 1 print 'sysadmin'
作業步驟是以 sa 作為所有者的 t-sql 步驟,因此使用 SQL Server 代理服務帳戶。
**現在來回答這個問題。**似乎 SQL Server 配置管理器做了一些事情,使它成為系統管理員,或者至少在它執行步驟時。但同時它沒有出現在 GUI 的系統管理員列表中。
我提出的所有報告或查詢(包括 SSMS)都沒有將此 Windows 帳戶列為系統管理員角色的一部分。
我有一種我忽略了某些東西的感覺。
經過一番閱讀,我想我明白了。
“NT SERVICE\SQLSERVERAGENT”是本地組“SQLServerSQLAgentUser”的成員 $ RINUS $ MSSQLSERVER"。該組擁有 sql server 代理帳戶所需的所有權限
“NT SERVICE\SQLSERVERAGENT”是 sql server 固定 sysadmin 角色的一部分
無法在可用的內置帳戶、本地帳戶或域帳戶列表中選擇“NT SERVICE\SQLSERVERAGENT”。這是因為它們是服務,而不是帳戶。他們在 Windows 中有一個安全標識符 (SID),但 Windows 知道他們不是真正的使用者。Windows 可以對它們進行身份驗證,但它們沒有任何人都可以使用的密碼。如果你執行 lusrmgr.msc 並查看組,你會看到像 SQLServerMSSQLUser 這樣的組 $ computername $ MSSQLSERVER 和 NT SERVICE\MSSQLSERVER 是該組的成員。
我為代理創建的專用帳戶是為 windows 服務設置的
如果你把這些點連接起來,你會得到一個解釋這個的鏈條。對我來說新的部分是 NT SERVICE\SQLSERVERAGENT 可以代表專用代理帳戶。
資料來源:
- http://blogs.msdn.com/b/varun_sharma/archive/2007/08/30/how-to-run-sql-server-agent-and-sql-server-jobs-with-least-privilege-in-sql-server-2005.aspx
- https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9e6bb2de-8fd0-45de-ab02-d59bbe05f72e/servicedatabase-accounts-nt-servicemssqlserver-nt-servicesqlserveragent-what-are-they-for?forum=sqlsecurity
我沒有足夠的聲譽來發表評論,但我在研究為什麼我的代理不會開始並認為這可能對某人有所幫助時發現了這篇文章。我的一個實例上的代理在重新啟動後無法啟動,我們所有的實例都使用代理的域帳戶,並且在使用時它們都沒有顯示 sysadmin
EXEC sp_helpsrvrolemember 'sysadmin'
錯誤日誌按順序給出了這些錯誤,作為測試,我為代理帳戶提供了越來越多的權限。只有在我授予每個人權限後,系統管理員錯誤才出現
EXECUTE permission was denied on the object 'sp_sqlagent_update_agent_xps' EXECUTE permission was denied on the object 'sp_sqlagent_has_server_access' EXECUTE permission was denied on the object 'sp_sqlagent_get_startup_info' UPDATE permission was denied on the object 'sysalerts' INSERT permission was denied on the object 'syssessions' SQLServerAgent must be able to connect to SQLServer as SysAdmin, but '(Unknown)' is not a member of the SysAdmin role
找到這篇文章後,我發現 sysadmin 必須在某個時候從 NT SERVICE\SQLAgent$ 帳戶中刪除,因為我的所有其他實例都在安裝過程中擁有它。將其添加回來(並刪除我在故障排除時給予域代理帳戶的額外權限)後,SQL Server 代理正常啟動。