在MOSS2010中实现OU下的用户的上下级组织关系
前言
大家都知道无论是AD还是MOSS,目前都没有实现用户的上下级组织结构关系。AD的用户都是平级的展示。前不久刚好接触一个项目,客户要求实现用户的上下级组织结构关系,如下图:
于是开始动手设计和开发,经过一番的努力思考和测试,发现在MOSS2010的UserProfile带有很多属性,也支持扩展属性。发现自带有【经理】的属性。亮点就在这里,把【经理】属性开放到每个人的个人配置信息中去,让用户自己编辑设置自己的上级经理(注:不一定用此类属性,也可以在扩展一个属性,如:用级别区别等)。如下图:
默认【经理】属性值为空的就是这个OU下的最高领导。以下的依次编辑的自己的经理
提示:这里有个小问题。就是如果每个人都没有编辑设置自己的经理。那么就没有组织关系的产生或有些设置了,有人没设置,那么关系就乱了。当然我们也知道技术只能减轻人的工作量但是代替不了人的工作,所以我们需要靠管理制度去约束。让每个人按照实际规定去设置信息(或采用代码去批量设置)
鉴于上面的思路,设计思路就有了,开发起来就简单多了。左边是AD的OU,右边点击OU展示对应的上下级关系。效果图如下:
实现
左边AD的OU树代码网上很多,我这里不罗嗦了。我重点说说右边的用户属性如何读取?
大家都知道MOSS2010的userProfile提供了接口的。接口方法如下:
方法1:
/// <summary>
/// 获取用户属性
/// </summary>
/// <param name="accountName">登录账号</param>
/// <returns></returns>
public static UserProfile GetUserInfo(string AccountName)
{
UserProfile profile = null;
string strUrl = "http://win-moss:8010";
SPSite site = new SPSite(strUrl);
try
{
SPServiceContext serviceContext = SPServiceContext.GetContext(site);
//SPServiceContext serviceContext = SPServiceContext.Current;
UserProfileManager profileManager = new UserProfileManager(serviceContext);
if (AccountName != string.Empty)
{
profile = profileManager.GetUserProfile(AccountName);
}
else
{
profile = profileManager.GetUserProfile(SPContext.Current.Web.CurrentUser.RawSid);
}
}
finally
{
site.Dispose();
}
return profile;
}
调用,如读取经理属性:
// PropertyConstants很多属性,自己可以看出
userfile[PropertyConstants.Manager].Value
方法2:
/// <summary>
/// 获取用户属性
/// </summary>
/// <param name="accountName">登录账号</param>
/// <param name="propertyDisplayName">属性显示名称</param>
/// <returns></returns>
public static object GetUserProperty(string accountName, string propertyDisplayName)
{
object userPropertyValue = null;
UserProfile userProfile = GetUserInfo(accountName);//调用的1方法中的
if (userProfile != null)
{
var profileSubtypeProperty = userProfile.Properties.First(propertyBase => propertyBase.DisplayName == propertyDisplayName);
if (profileSubtypeProperty != null)
{
userPropertyValue = userProfile.GetProfileValueCollection(profileSubtypeProperty.Name).Value;
}
}
return userPropertyValue;
}
调用,如读取经理属性:
GetUserProperty("contoso\\Liwang", "经理")
经过编码后最后效果图如下:
经过效果改进:
集成lync状态如下图:
查看详细信息如下图: