IIS AppPool kontra SQL Server Agent
Írtam már párszor, hogy nagy híve vagyok az IIS 7-ben bevezetett ApplicationPoolIdentity-nek, éppen ezért mindig elszomorít, amikor valahol kiderül, hogy nem lehet használni. Legutóbb az SQL Server Agentnél futottunk bele egy problémába.
Van egy webalkalmazásunk, ami AppPoolIdentity-vel kapcsolódik az SQL Serverhez. Mivel az alkalmazás SQL Server Agent jobokat kezel, ezért a fiók annak rendje és módja szerint megkapta az SQLAgentUserRole és az SQLAgentReaderRole szerepköröket az msdb adatbázisban. Ennek ellenére az sp_add_job tárolt eljárás az alábbi hibával elszáll:
Msg 14234, Level 16, State 1, Line 3
The specified ‘@owner_login_name’ is invalid (valid values are returned by sp_helplogins [excluding Windows NT groups]).
Ilyenkor az ember jóhiszeműen követi az utasításokat, lekérdezi a helyes értékeket az sp_helplogins meghívásával és szomorúan tapasztalja, hogy a kérdéses fiók szerepel a listában. WTF?
Semmi gond, hiszen az sp_add_job kódját könnyen meg lehet találni Management Studioval, amiből rövid bogarászás után kiderül, hogy ez a tárolt eljárás meghívja az sp_verify_job SP-t és valójában az dobja a hibát ennél a sornál:
IF (@owner_sid IS NULL) OR (EXISTS (SELECT * FROM master.dbo.syslogins WHERE (sid = @owner_sid) AND (isntgroup <> 0))) BEGIN SELECT @res_valid_range = FORMATMESSAGE(14203) RAISERROR(14234, -1, -1, '@owner_login_name', @res_valid_range) RETURN(1) -- Failure END
Innen már nem kell messzire menni: kérdezzük le a master.dbo.syslogins tartalmát és látni fogjuk, hogy a kérdéses sorban az isntgroup értéke bizony 1. Deadlock ![]()
Jobb ötlet híján feldobtam bugként a Connectre, ha ez szerinted is probléma, szavazz rá:
Microsoft Connect: IIS ApplicationPoolIdentity cannot be a SQL Agent job owner
MSDN Kompetencia Központ
Nem biztos, hogy az App Pool-nak adnék ilyen szintű jogokat. Inkább elgondolkodnék az EXECUTE AS használatán a sproc-ban.
Igen, ez jó ötlet, nálunk sajnos nem teljesültek a feltételei.