Fork me on GitHub

Blackpearl 的 Impersonate

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
    }
}

posted @ 2009-11-16 13:23  张善友  阅读(1405)  评论(0编辑  收藏  举报