sps与ad联系人同步解决办法

来源:互联网 发布:android 投射屏幕源码 编辑:程序博客网 时间:2024/06/14 10:15
通讯录:LCS+AD+SPS

最近弄了一个通迅录。利用了SPS的联系人列表,在LCS的标签页中显示出来。
设计思想:
首先,利用了SPS联系人列表进行数据存储。SPS联系人列表有几个好外:1、可以与OUTLOOK进行关联,在OUTLOOK的联系人那里可以查看该表内容。2、方便SPS其它页的调用。这其实也是SPS最大的好处,那里需要就把它拉到哪里去。3、这也是SPS列表本身的好处,你可以对其进行分组,排序,筛选等等搞作。
然后是数据来源的问题,SPS联系人列表中的数据从哪里来?从AD中自动获取用户的资料写到列表中。跟AD同步,这样,只需要维护一处地方。
最后是显示的问题,在哪里将最终结果显示出来。我们选用的是LCS的标签页。(LCS:微软企业级即时通讯)。
从AD中取数据及更新到SPS列表的作法:

/// <summary>
  
/// 从AD中取用户的信息
  
/// 策略:1,从AD中每取一条记录就与列表对比(参看对比法则A)。如果列表存在此记录则判断是否需要更新(参看更新法则B)。如果不存在此记录则增加。
  
/// 对比法则A:如果列表的strListAccount值不为NULL则拿AD的sAMAccountName与列表的"strListAccount"进行对比。否则则拿AD的displayName与列表的strListItemName对比。 
  
/// 更新法则B:从AD中每取出一条记录就遍历列表,列表中存在此记录且记录与AD中的一样则不更新。如果记录与AD中的不一样则更新列表的此记录。
  
/// </summary>

  private void GetCommunicationFromAD()
  
{
            strMSG 
= "开始时间:"+DateTime.Now.ToString();   
   
//账号
   string strListAccount = this.ListItemAccount.Trim();
   
//用户名
   string strListItemName = this.ListItemName.Trim();
   
//部门
   string strListItemDepartment = this.ListItemDept.Trim();
   
//邮箱 
   string strListItemMail = this.ListItemMail.Trim();
   
//
   string strYuanName = getYuanName(this.Domainname.Trim());
   
//打开一个列表
   SPSite mySite = new SPSite(this.SiteName.Trim());    
   SPWeb web 
= mySite.OpenWeb();
   web.AllowUnsafeUpdates 
= true;
   SPListCollection lists 
= web.Lists;
   SPList list 
= lists[this.ListName.Trim()];
   SPListItemCollection listItems 
= list.Items;   
   
//循环查找AD   
   try
   
{
    DirectoryEntry entry 
= new DirectoryEntry(this.getldappath(),this.Adminname.Trim(),this.Adminpwd.Trim(),AuthenticationTypes.Secure);
    System.DirectoryServices.DirectorySearcher mySearcher 
= new System.DirectoryServices.DirectorySearcher (entry);
    mySearcher.Filter 
= "(objectCategory=person)";
    System.DirectoryServices.SearchResultCollection resEnt 
= mySearcher.FindAll();//.FindOne();
    foreach (System.DirectoryServices.SearchResult res in resEnt)
    
{
     
//每获取一个AD账号就查找列表,有相同用户名(sAMAccountName)则进行更新
     string AccountInAD = ""+ res.GetDirectoryEntry().Properties["sAMAccountName"].Value;
     
     
string NameInAD = ""+res.GetDirectoryEntry().Properties["displayName"].Value; 
     
     
string DepartmentInAD = ""+ res.GetDirectoryEntry().Properties["department"].Value;
     
     
string MailInAD = ""+ res.GetDirectoryEntry().Properties["mail"].Value; 
     
     
if(AccountInAD!=""&&NameInAD!=""&&DepartmentInAD!=""&&MailInAD!="")
     
{      
      
bool ifexist = false;
      
string strlia = ""
      
string strlin = "";
      
string strlid = "";
      
string strlim = "";
      
string strliy = "";
      
foreach (SPListItem listItem in listItems)
      
{
       
//有相同账号的处理方法
       
//账号内容不为空。如果账号为空,获取listItem[this.ListItemAccount.Trim()]的值将会出错
       try
       
{
       
        
if (listItem[this.ListItemAccount.Trim()]!=null)
        
{
         strlia 
= listItem[ this.ListItemAccount.Trim()].ToString();
        }
    

        
if (listItem[strListItemDepartment]!=null)
        
{
         strlid 
= listItem[strListItemDepartment].ToString();
        }


        
if (listItem[strListItemName]!=null)
        
{
         strlin 
= listItem[strListItemName].ToString();
        }

 
        
if (listItem[strListItemMail]!=null)
        
{
         strlim 
= listItem[strListItemMail].ToString() ;
        }


        
if (listItem[this.ListItemYuan]!=null)
        
{
         strliy 
= listItem[this.ListItemYuan].ToString() ;
        }


        
//如果列表中的与AD中取得的账号相同
        if (strlia == AccountInAD)
        
{
         
//内容不为空内容不变则不作更新
         
//空则更新
        
         
if(strlin == NameInAD && strlid == DepartmentInAD && strlim == MailInAD && strliy == strYuanName)
         
{
          ifexist 
= true;
          
break;
         }

      
         listItem[strListItemName] 
= NameInAD;
      
         listItem[strListItemDepartment] 
= DepartmentInAD;
      
         listItem[strListItemMail] 
= MailInAD; 
         listItem[
this.ListItemYuan] = strYuanName;
      
         listItem.Update();
      
         ifexist 
= true;
                 
        
        }

        
else if(strlia==""&&strlin==NameInAD)//列表中的记录"账号"字段为空:则以AD中用户名相同的记录更新此记录 
        {
         listItem[strListItemName] 
= NameInAD;
      
         listItem[strListItemDepartment] 
= DepartmentInAD;
      
         listItem[strListItemMail] 
= MailInAD;

         listItem[
this.ListItemYuan] = strYuanName;

         listItem[
this.ListItemAccount] = AccountInAD;
      
         listItem.Update();
      
         ifexist 
= true;
        }


       }

       
catch(Exception exccc)
       
{
        
this.StrMSG += exccc.ToString();
       }

      }

      
//没有则增加
      if (!ifexist)
      
{       
       SPListItem listItem 
= listItems.Add ();
       listItem[strListAccount] 
= AccountInAD;
       listItem[strListItemName] 
= NameInAD;
       listItem[strListItemDepartment] 
= DepartmentInAD;
       listItem[strListItemMail] 
= MailInAD;
       listItem[ListItemYuan] 
= strYuanName; 
       listItem.Update();
      }

     }

    }

   }

   
catch(Exception ept)
   
{
    
this.StrMSG += ept.ToString();
   }

   
this.StrMSG += "   完成时:"+DateTime.Now.ToString();
            
  }


 
原创粉丝点击