设为首页 收藏本站
查看: 1287|回复: 0

[经验分享] 提升 SharePoint 代码执行权限

[复制链接]

尚未签到

发表于 2015-9-28 10:59:52 | 显示全部楼层 |阅读模式
  关于如何提升 SharePoint 代码执行权限及相关知识介绍的文章我们园子里有很多,
  这里给出其中两篇文章的链接,就不再啰嗦了。
  http://www.cnblogs.com/llbofchina/archive/2008/05/24/1206393.html
  http://www.cnblogs.com/nirvanalst/archive/2008/10/13/1310411.html
  
  由于项目中经常需要提升某些代码的执行权限,每次都需要写类似于下面的代码:




SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite Site = new SPSite(SiteId))
    {
        using (SPWeb Web = Site.OpenWeb(WebUrl))
        {
            ...
        }
    }
});
  
  久而久之,项目中充斥着“相同的”代码,而且看起来也不是很优雅,
  就连使用 “EventHandler Explorer”为表单库、列表绑定事件处理程序时,也多出了
  诸如于 <>c__DisplayClass1、<>c__DisplayClass2 等自动生成的类。
  考虑到其复用性,故对其作如下封装:


DSC0000.gif DSC0001.gif Macroresolute.SharePoint.Utility.Privileges



using System;
using Microsoft.SharePoint;
namespace Pturesoft.Utility.Handler
{
    /// <summary>
    /// 提供了在 SharePoint 站点和网站上提升方法执行权限所需的功能。无法继承此类。
    /// </summary>
    public static class Privileges
    {
        #region static Privileges --- 构造函数
        static Privileges()
        {
            //暂无任何实现。
        }
        #endregion
        #region public delegate [void] PrivilegeMethod --- 表示需要提升执行权限的方法
        /// <summary>
        /// 表示需要提升执行权限的方法。
        /// </summary>
        /// <param name="oSite">表示一个包括顶级网站和所有子网站的 SharePoint 站点的集合。</param>
        /// <param name="oWeb">表示一个 SharePoint 网站。</param>
        /// <param name="args">该方法执行时所需的参数。不需要该参数时,请指定为 null。</param>
        public delegate void PrivilegeMethod(SPSite oSite, SPWeb oWeb, Object args);
        #endregion
        #region public static [void] Elevated --- 在当前站点和当前网站上提升方法的执行权限
        /// <summary>
        /// 在当前站点和当前网站上提升方法的执行权限。
        /// </summary>
        /// <param name="privilegeMethod">需要提升执行权限的方法。</param>
        /// <param name="args">该方法执行时所需的参数。不需要该参数时,请指定为 null。当需要为 SharePoint 事件处理程序提升方法的执行权限时,该参数必须为 SharePoint 事件的 Microsoft.SharePoint.SPItemEventProperties 消息对象。</param>
        public static void Elevated(PrivilegeMethod privilegeMethod, Object args)
        {
            Guid SiteID;
            String WebUrl = null;
            if (args is SPItemEventProperties)    //事件处理程序
            {
                SPItemEventProperties Properties = args as SPItemEventProperties;
                SiteID = Properties.SiteId;
                WebUrl = Properties.RelativeWebUrl;
            }
            else    //页面请求
            {
                SiteID = SPContext.Current.Site.ID;
                WebUrl = SPContext.Current.Web.ServerRelativeUrl;
            }
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite oSite = new SPSite(SiteID))
                {
                    using (SPWeb oWeb = oSite.OpenWeb(WebUrl))
                    {
                        privilegeMethod(oSite, oWeb, args);
                    }
                }
            });
        }
        #endregion
        #region public static [void] Elevated --- 为 SharePoint 事件处理程序提升执行权限
        /// <summary>
        /// 为 SharePoint 事件处理程序提升执行权限。
        /// </summary>
        /// <param name="privilegeMethod">需要提升执行权限的方法。</param>
        /// <param name="properties">SharePoint 事件的 Microsoft.SharePoint.SPItemEventProperties 消息对象。</param>
        /// <param name="args">该方法执行时所需的参数。不需要该参数时,请指定为 null。</param>
        public static void Elevated(PrivilegeMethod privilegeMethod, SPItemEventProperties properties, Object args)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite oSite = new SPSite(properties.SiteId))
                {
                    using (SPWeb oWeb = oSite.OpenWeb(properties.RelativeWebUrl))
                    {
                        privilegeMethod(oSite, oWeb, args);
                    }
                }
            });
        }
        #endregion
        #region public static [void] Elevated --- 在当前站点和指定的网站上提升方法的执行权限
        /// <summary>
        /// 在当前站点和指定的网站上提升方法的执行权限。
        /// </summary>
        /// <param name="privilegeMethod">需要提升执行权限的方法。</param>
        /// <param name="webUrl">一个字符串,包含相对于服务器或相对于网站的的 URL。相对于服务器的 URL 以正斜杠 ("/"),开始,而相对于网站的 URL 不以正斜杠开头。</param>
        /// <param name="args">该方法执行时所需的参数。不需要该参数时,请指定为 null。</param>
        public static void Elevated(PrivilegeMethod privilegeMethod, String webUrl, Object args)
        {
            Guid SiteID = SPContext.Current.Site.ID;
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite oSite = new SPSite(SiteID))
                {
                    using (SPWeb oWeb = oSite.OpenWeb(webUrl))
                    {
                        privilegeMethod(oSite, oWeb, args);
                    }
                }
            });
        }
        #endregion
        #region public static [void] Elevated --- 在指定的站点和指定网站上提升方法的执行权限
        /// <summary>
        /// 在指定的站点和指定网站上提升方法的执行权限。
        /// </summary>
        /// <param name="privilegeMethod">需要提升权限的方法。</param>
        /// <param name="siteUrl">一个字符串,该字符串指定网站集的绝对 URL。</param>
        /// <param name="webUrl">一个字符串,包含相对于服务器或相对于网站的的 URL。相对于服务器的 URL 以正斜杠 ("/"),开始,而相对于网站的 URL 不以正斜杠开头。</param>
        /// <param name="args">该方法执行时所需的参数。不需要该参数时,请指定为 null。</param>
        public static void Elevated(PrivilegeMethod privilegeMethod, String siteUrl, String webUrl, Object args)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite oSite = new SPSite(siteUrl))
                {
                    using (SPWeb oWeb = oSite.OpenWeb(webUrl))
                    {
                        privilegeMethod(oSite, oWeb, args);
                    }
                }
            });
        }
        #endregion
    }
}

  注:均提升到系统权限级别!
  
  封装后,将需要提升执行权限的方法、方法所需参数传递给静态方法 Privileges.Elevated 即可。
  需要提升执行权限的方法签名如下:  




#region private [void] Testing --- 表示需要提升执行权限的方法
/// <summary>
/// 表示需要提升执行权限的方法。
/// </summary>
/// <param name="oSite">表示一个包括顶级网站和所有子网站的 SharePoint 站点的集合。</param>
/// <param name="oWeb">表示一个 SharePoint 网站。</param>
/// <param name="args">该方法执行时所需的参数。不需要该参数时,请指定为 null。</param>
private void Testing(SPSite oSite, SPWeb oWeb, object args)
{
    ...
}
#endregion
  
  提升方法的执行权限时,有以下四种可选重载:




//重载一:适用于 InfoPath 表单(浏览器模式)、WebPart、页面请求、SharePoint 事件处理程序(参数必须为事件的 SPItemEventProperties 消息对象)
Privileges.Elevated(this.Testing, null);
//重载二:仅适用于 SharePoint 事件处理程序
Privileges.Elevated(this.Testing, properties, null);
//重载三:适用于 InfoPath 表单(浏览器模式)、WebPart、页面请求
Privileges.Elevated(this.Testing, "webUrl", null);
//重载四:适用于任何情况
Privileges.Elevated(this.Testing, "siteUrl", "webUrl", null);
  
  源文件:http://files.cnblogs.com/zys529/Privileges.rar
  MD5:B288FF01FDFBF9E0F82F5B1DEF6E3800

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-119906-1-1.html 上篇帖子: SharePoint 2007图文开发教程(1)---简介,安装,配置及创建Web应用程序 下篇帖子: SharePoint 部件通过EditorPart自定义属性面板
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表