Spiga

Blackpearl 的 Impersonate

2009-11-16 13:23 by geff zhang, 374 visits, 网摘, 收藏, 编辑

Blackpearl的Connection方法 Impersonate(string name)。这个就是传说中的后门方法,它可以帮你模拟任何一个帐号(域用户或者数据库用户),来做他可以做得事情。当然,你必须在WorkSpace中设置操作这个命令的权限。

以下代码将给用户设置Impersonate权限,包装成一个Job来定时运行就可以了:

               WorkflowManagementServer managementServer = new WorkflowManagementServer();
                managementServer.CreateConnection();
                managementServer.Connection.Open(GetConnectionString(dataMap));
                AdminPermissions adminPerms = managementServer.GetAdminPermissions();
                AdminPermissions newAdminPerms = new AdminPermissions();
                StaffCollection staffs = Staff.GetAllStaff();
                foreach (AdminPermission item in adminPerms)
                {
                    var staffName = item.UserName.Replace("K2SQL:","").Trim();
                    Staff staff = staffs.Find(t => t.EnglishName == staffName );
                    if (staff != null)
                    {
                        newAdminPerms.Add(item);
                        staffs.Remove(staff);
                    }
                    else
                    {
                        if (item.UserName.ToUpper().Contains("K2:TENCENT"))
                        {
                            newAdminPerms.Add(item);
                        }
                    }
                }
                foreach (var item in staffs)
                {
                    AdminPermission adminPermission = new AdminPermission();
                    adminPermission.CanImpersonate = true;
                    adminPermission.UserName = string.Format("K2SQL:{0}", item.EnglishName);
                    newAdminPerms.Add(adminPermission);
                }
                managementServer.UpdateAdminUsers(newAdminPerms);

Impersonate方法的调用可以参照K2 blackpearl Client Impersonation - Suggested Design Pattern包装后使用,下面是我的包装代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SourceCode.Workflow.Client;
using Tencent.OA.Framework.Workflow.Interfaces;

namespace Tencent.OA.Framework.Workflow
{
    /// <summary>
    /// <example>
    ///IK2Connection k2Conn = K2Factory.NewK2Connection("oa-flowdb");;
    ///using(Impersonation.Impersonate(userName, k2Conn)
    ///{
    ///    //Do whatever work you need to do as the impersonated user
    ///}
    /// </example>
    /// </summary>
    public class Impersonation : IDisposable
    {
        private IK2Connection _conn = null;

        private Impersonation(IK2Connection conn)
        {
            _conn = conn;
        }

        #region Impersonate Methods

        /// <summary>
        /// 模拟用户
        /// </summary>
        /// <param name="userName">用户英文名</param>
        /// <param name="conn">代表K2服务器链接</param>
        /// <returns></returns>
        public static Impersonation Impersonate(string userName, IK2Connection conn)
        {
            if (!userName.ToUpper().Contains("K2SQL"))
            {
                userName = string.Format("K2SQL:{0}", userName);
            }
            conn.Connection.ImpersonateUser(userName);
            return new Impersonation(conn);
        }

        #endregion Impersonate Methods

        #region IDisposable Members
        /// <summary>
        /// 取消用户的模拟
        /// </summary>
        public void Dispose()
        {
            _conn.Connection.RevertUser();
        }

        #endregion
    }
}

作者: 自由、创新、研究、探索……
出处:http://shanyou.cnblogs.com/
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://www.openbeta.cn/
0
0
(请您对文章做出评价)
« 上一篇:反向代理(Reverse Proxy)及 IIS 7 应用请求路由模块
» 下一篇:BlackPearl 的 ServiceObject 开发部署