• 用C#的Windows Service 来同步ActiveDirectory


    用C#的Windows Service 来同步Active Directory
      1 public partial class ADSyncService : ServiceBase
      2     {
      3         private System.Timers.Timer TimerSync;
      4         /// <summary>
      5         /// 文件写入流
      6         /// </summary>
      7         private StreamWriter LogFile;
      8 
      9         private int Counter = 0;
     10 
     11         private object SyncLocker = new object();
     12         /// <summary>
     13         /// 日志路径
     14         /// </summary>
     15         private static readonly string CurrentPath = Application.StartupPath + "//";
     16 
     17         public ADSyncService()
     18         {
     19             AutoLog = true;
     20             CanStop = true;
     21             CanPauseAndContinue = true;
     22             CanShutdown = true;
     23             ServiceName = "ADSyncService";// "Active Directory Synchronization Service";
     24             InitializeComponent();
     25         }
     26 
     27         #region 服务函数
     28         protected override void OnStart(string[] args)
     29         {
     30             LogFile = new StreamWriter(CurrentPath + "SyncLog" + System.DateTime.Today.ToString("yyyMMdd") + ".txt"false, Encoding.Unicode);
     31             LogFile.AutoFlush = true;
     32             WriteLog("ADSyncService Start...");
     33             this.TimerSync = new System.Timers.Timer();
     34             try
     35             {
     36                 GetTimerInterval();
     37                 this.TimerSync.Elapsed += new System.Timers.ElapsedEventHandler(tmrSync_Elapsed);
     38                 this.TimerSync.Enabled = true;
     39             }
     40             catch (System.Exception ex)
     41             {
     42                 WriteLog("Exception:" + ex.Message);
     43             }
     44         }
     45         /// <summary>
     46         /// 获取时间间隔
     47         /// </summary>
     48         private void GetTimerInterval()
     49         {
     50             BaseSysConfig baseSysConfig = new BaseSysConfig();
     51             double multiplier = 0;
     52             double syncFrequency = (double)StringUtils.GetDbDecimal(baseSysConfig.GetSysConfigValue("SyncFrequency"));
     53             WriteLog("syncFrequency:" + syncFrequency.ToString());
     54             int syncFrequencyUnit = StringUtils.GetDbInt(baseSysConfig.GetSysConfigValue("SyncFrequencyUnit"));
     55             WriteLog("syncFrequencyUnit:" + syncFrequencyUnit.ToString());
     56             switch (syncFrequencyUnit)
     57             {
     58                 case 1: multiplier = 60000break;//分钟
     59                 case 2: multiplier = 3600000break;//小时
     60                 case 3: multiplier = 86400000break;//
     61                 case 4: multiplier = 604800000break;//
     62                 case 5: multiplier = 2592000000break;//月 30天
     63                 case 6: multiplier = 31104000000break;//
     64                 default: multiplier = 3600000break;
     65             }
     66             if (syncFrequency < 0.5)
     67             {
     68                 throw new Exception(string.Format("设置的同步频率数值太小:{0}", syncFrequency));
     69             }
     70             double newFreq = (double)syncFrequency * multiplier;
     71             WriteLog("newFreq:" + newFreq.ToString());
     72             this.TimerSync.Interval = newFreq;  //设置计时器事件间隔执行时间 3600000(小时级)* 3600000
     73         }
     74 
     75         protected override void OnStop()
     76         {
     77             WriteLog("Service is stopped manually");
     78             LogFile.Close();
     79             this.TimerSync.Enabled = false;
     80         }
     81 
     82         protected override void OnShutdown()
     83         {
     84             WriteLog("Service is stopping...");
     85             Stop();
     86         }
     87         #endregion
     88         /// <summary>
     89         /// 同步用户
     90         /// </summary>
     91         /// <param name="obj">同步次数计算器</param>
     92         private void ProcessSync()
     93         {
     94             try
     95             {
     96                 Loger.MyLog.Write(Loger.MyLog.LogLevel.Info, "Timer Running");
     97                 WriteLog("Timer Running");
     98                 #region 执行同步
     99                 SyncClass syncClass = new SyncClass();
    100                 BaseSysConfig baseSysConfig = new BaseSysConfig();
    101                 SyncClass.SyncResult syncResult = new SyncClass.SyncResult(); ;
    102                 bool enableSync = StringUtils.SafeBool(baseSysConfig.GetSysConfigValue("EnableADSyncService").ToString(), false);
    103                 if (enableSync)
    104                 {
    105                     lock (SyncLocker)
    106                     {
    107                         syncResult = syncClass.SyncData();
    108                         Counter++;
    109                         if (syncResult.TotalSyncNumber > 0)
    110                         {
    111                             //调试
    112                             syncClass.SaveNewSyncTime(DateTime.Now);
    113                         }
    114                         if (syncResult.ErrorMessage != string.Empty)
    115                         {
    116                             WriteLog("同步时出现的错误信息:"+syncResult.ErrorMessage);
    117                         }
    118                         Loger.MyLog.Write(Loger.MyLog.LogLevel.Info, string.Format("Sync Time: {0};Sync Times:{1};Sync AddNumber:{2};Sync UpdateNumber:{3};Sync TotalNumber:{4}",
    119                             DateTime.Now, Counter, syncResult.AddCount, syncResult.UpdateCount, syncResult.TotalSyncNumber));
    120                         WriteLog(string.Format("Sync Result:Sync Time: {0};Sync Times:{1};Sync AddNumber:{2};Sync UpdateNumber:{3};Sync TotalNumber:{4};AdUserCount:{5}",
    121                             DateTime.Now, Counter, syncResult.AddCount, syncResult.UpdateCount, syncResult.TotalSyncNumber,syncResult.AdUserCount));
    122                         WriteLog(string.Format("DebugString:{0}", syncResult.DebugString));
    123                     }
    124                 }
    125                 #endregion
    126                 }
    127             catch (System.Exception ex)
    128             {
    129                 WriteLog("Exception:" + ex.Message+ex.Source+ex.Data);
    130                 Loger.MyLog.Write(Loger.MyLog.LogLevel.Error, string.Format("Sync Exception {0}...", ex.Message));
    131             }
    132         }
    133 
    134         private void tmrSync_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    135         {
    136             try
    137             {
    138                 BaseSysConfig bsc = new BaseSysConfig();
    139                 GetTimerInterval();
    140                 ProcessSync();
    141             }
    142             catch (System.Exception ex)
    143             {
    144                 WriteLog("Exception:"+ex.Message);
    145             }
    146         }
    147         /// <summary>
    148         /// 写日志
    149         /// </summary>
    150         /// <param name="szEvent">日志内容</param>
    151         public void WriteLog(string szEvent)
    152         {
    153             try
    154             {
    155                 if (LogFile != null)
    156                 {
    157                     LogFile.WriteLine("{0}: {1}", DateTime.Now, szEvent);
    158                 }
    159             }
    160             catch (Exception)
    161             {
    162             }
    163         }
    164     }
    View Code
      1 /// <summary>
      2         /// 获取所有域用户
      3         /// </summary>
      4         /// <returns></returns>
      5         public static DataTable GetADUsers()
      6         {
      7             DataTable dt = new DataTable();
      8             dt.TableName = "ADHelperTable";
      9             dt.Columns.Add("sAMAccountName");//帐号
     10             dt.Columns.Add("Name");//姓名
     11             dt.Columns.Add("mail"); //邮箱地址
     12             dt.Columns.Add("department");  //部门
     13             dt.Columns.Add("whenChanged");  //修改时间
     14             dt.Columns.Add("whenCreated");  //创建时间
     15             dt.Columns.Add("OU");  //用户组织
     16             dt.Columns.Add("memberOf");  //属于
     17             dt.Columns.Add("userAccountControl");  //用户账户控制
     18 
     19             DirectoryEntry adRoot = GetDirectoryObject();
     20             DirectoryEntry ou;
     21             if (!string.IsNullOrEmpty(ADOUName))
     22             {
     23                 ou = adRoot.Children.Find("OU=" + ADOUName);
     24             }
     25             else
     26             {
     27                 ou = adRoot;
     28             }
     29             DirectorySearcher mySearcher = new DirectorySearcher(ou);
     30             //mySearcher.Filter = "(&(objectClass=user))";
     31             //mySearcher.Filter = string.Format("(&(objectClass=user)(objectCategory=person)(CN={0}))", MemberOf);
     32             if (!string.IsNullOrEmpty(MemberOf))
     33             {
     34                 mySearcher.Filter = "(&(objectClass=user)(objectCategory=person)(memberOf=" + MemberOf + "))";
     35             }
     36             else
     37             {
     38                 mySearcher.Filter = "(&(objectCategory=person)(objectClass=user))";
     39             }
     40             mySearcher.SearchScope = SearchScope.Subtree;
     41             mySearcher.Sort = new SortOption("name", SortDirection.Ascending);
     42             mySearcher.PageSize = 500;
     43             mySearcher.PropertiesToLoad.AddRange(
     44                 new string[] { "sAMAccountName", "Name", "mail", "department", "whenChanged", "whenCreated", "OU", "memberOf", "userAccountControl" });
     45 
     46             //&(objectCategory=person)
     47             using (SearchResultCollection results = mySearcher.FindAll())
     48             {
     49                 foreach (System.DirectoryServices.SearchResult resEnt in results)
     50                 {
     51                     DataRow dr = dt.NewRow();
     52                     dr["sAMAccountName"] = string.Empty;
     53                     dr["Name"] = string.Empty;
     54                     dr["mail"] = string.Empty;
     55                     dr["department"] = string.Empty;
     56                     dr["whenChanged"] = DateTime.MinValue;
     57                     dr["whenCreated"] = DateTime.MinValue;
     58                     dr["OU"] = string.Empty;
     59                     dr["memberOf"] = string.Empty;
     60                     dr["userAccountControl"] = 0;
     61 
     62                     DirectoryEntry user = resEnt.GetDirectoryEntry();
     63 
     64                     if (user.Properties.Contains("userAccountControl"))
     65                     {
     66                         dr["userAccountControl"] = user.Properties["userAccountControl"][0].ToString();
     67                     }
     68                     if (user.Properties.Contains("memberOf"))
     69                     {
     70                         int memberOfCount = user.Properties["memberOf"].Count;
     71                         if (memberOfCount != 0)
     72                         {
     73                             for (int i = 0; i < memberOfCount; i++)
     74                             {
     75                                 dr["memberOf"] += user.Properties["memberOf"][i].ToString() + ";";
     76                             }
     77                         }
     78                     }
     79                     if (user.Properties.Contains("sAMAccountName"))
     80                     {
     81                         dr["sAMAccountName"] = user.Properties["sAMAccountName"][0].ToString();
     82                     }
     83                     if (user.Properties.Contains("Name"))
     84                     {
     85                         dr["Name"] = user.Properties["Name"][0].ToString();
     86                     }
     87                     if (user.Properties.Contains("mail"))
     88                     {
     89                         dr["mail"] = user.Properties["mail"][0].ToString();
     90                     }
     91                     if (user.Properties.Contains("department"))
     92                     {
     93                         dr["department"] = user.Properties["department"][0].ToString();
     94                     }
     95                     if (user.Properties.Contains("whenChanged"))
     96                     {
     97                         dr["whenChanged"] = StringUtils.GetDateTime(user.Properties["whenChanged"][0]);//.ToString("yyyy-MM-dd HH:mm:ss")
     98                     }
     99                     if (user.Properties.Contains("whenCreated"))
    100                     {
    101                         dr["whenCreated"] = StringUtils.GetDateTime(user.Properties["whenCreated"][0]);
    102                     }
    103                     if (user.Parent.Name != string.Empty && user.Parent.Name.IndexOf('=') > -1)
    104                     {
    105                         //获取用户所在的组织单位
    106                         dr["OU"] = user.Parent.Name.Split('=')[1];
    107                     }
    108 
    109                     dt.Rows.Add(dr);
    110                 }
    111             }
    112             return dt;
    113         }
    代码下载:https://files.cnblogs.com/plummoon/ActiveDirectorySync.rar

    生活因朋友而精彩

  • 相关阅读:
    6.Redis 哈希(Hash)的命令
    5.redis中String类型数据操作的命令
    4.redis中的key命令
    3.redis客户端连接服务器
    Bomblab
    leetcode multiply-strings
    datalab
    leetcode max-points-on-a-line
    os
    python 实现简单的端口扫描器
  • 原文地址:https://www.cnblogs.com/plummoon/p/2563115.html
Copyright © 2020-2023  润新知