调用SPFarm.Update更新Farm的属性包时,出现Access denied
时间:2011-06-09 来源:shukun
最近在写一个SharePoint 2010 的Application page时,想把一些数据存在放到SPFarm.Properties[“key”],但是再调用SPFarm.Update时,总是出现Access denied的错误:
System.Security.SecurityException: Access denied.
at Microsoft.SharePoint.Administration.SPPersistedObject.BaseUpdate()
at Microsoft.SharePoint.Administration.SPFarm.Update()
at MyCompany.MyProduct.Business.Config.SetPropertyValue(IPropertyBag propertyBag, String propertyName, String value)
即使提升的杼也一样。
经过调查发现,如果这个页面通过管理中心的URL来访问时,一切正常。但如果是通过其它的web app的URL来访问,就会出现这个问题。初步判断SPFarm.Update仅仅能在CA上运行。google后发现这篇文章:http://stackoverflow.com/questions/3958548/securityexception-when-accessing-spfarm-propertybag-from-wcf-service-hosted-in-sh,印证了我的判断。
我个人最后的解决方案:开发了一个自定义的web service部署到CA,然后通过调用http://CA site URL:port/_vti_bin/updateFarm.asmx来解决这个问题。获取CA 的URL可以使用如下代码:
/// <summary>
/// get CA site url
/// </summary>
/// <returns></returns>
public static string GetCASiteURL()
{
var caapp = SPAdministrationWebApplication.Local;
return caapp.Sites[0].Url;
}