2016-10-24 4 views
0
public void getCountUsers() 
    { 
     number = 0; 
     //UserList = new ObservableCollection<Users>(); 
     UserList = new List<Users>(); 
     EventLog myNewLog = new EventLog(); 
     myNewLog.Log = "Security"; 
     foreach (EventLogEntry entry in myNewLog.Entries) 
     { 
      if (entry.InstanceId == 4624 && entry.TimeWritten.Date == DateTime.Today) 
      { 
       Regex ip = new Regex(@"192"); 
       Match IP = ip.Match(entry.ReplacementStrings[18]); 
       Regex tester = new Regex(@"127"); 
       Match Tester = tester.Match(entry.ReplacementStrings[18]); 
       if (Tester.Success || IP.Success) 
       { 
        if (UserList.Count > 0) 
        { 
         bool check = false; 
         foreach (var user in UserList) 
         { 
          if (user.User == entry.ReplacementStrings[5]) 
          { 
           user.countUsers += 1; 
           check = true; 
          } 
         } 
         if (!check) 
         { 
          Users u = new Users(1, entry.ReplacementStrings[5]); 
          UserList.Add(u); 
         } 
        } 
        else 
        { 
         Users u = new Users(1, entry.ReplacementStrings[5]); 
         //UserList = new ObservableCollection<Users>(); 
         UserList = new List<Users>(); 
         UserList.Add(u); 
        } 
       } 
      } 
     } 
    } 

이것은 내가 얼마나 많은 사용자가 하루 동안에 있는지를 세는 데 사용하는 것입니다. 검색해야 할 것은 피크 시간대를 필터링하는 방법과 피크 시간대에 온라인에 있었던 사람 수와 그 안에 있던 사람 수를 필터링하는 것입니다. 당신이 더 이상 정보가 필요하면날짜 사이의 발생 횟수 계산

, 내가 것 기꺼이 편집

는 (15:00 총 15 사용자와 피크 시간입니다, 그래서 예를 12시 1 사용자가 15:00 15있다).

편집 :

foreach (EventLogEntry entry in myNewLog.Entries) 
     { 

      if (entry.InstanceId == 4624 && entry.TimeWritten.Date == DateTime.Today) 
      { 
       Regex ip = new Regex(@"192"); 
       Match IP = ip.Match(entry.ReplacementStrings[18]); 
       string userName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(entry.ReplacementStrings[5]); 

       Regex tester = new Regex(@"127"); 
       Match Tester = tester.Match(entry.ReplacementStrings[18]); 

       if (IP.Success || Tester.Success) 
       { 
        Console.WriteLine(number + 
        ". \t[Time of logon]\t\t" + entry.TimeWritten.ToLongTimeString() + "\t" + entry.TimeWritten.ToShortDateString() + 
        "\n \t[Username-logon]\t" + userName + 
        "\n \t[IP-Adress]\t\t" + entry.ReplacementStrings[18] + 
        "\n----------------------------------------------------------------------- "); 
        number++; 
        //Console.WriteLine(entry.TimeWritten.ToLongTimeString() + " ; " + entry.TimeWritten.ToShortDateString() + " ; " + entry.ReplacementStrings[5] + " ; " + entry.ReplacementStrings[18]); 
       } 
      } 
     } 

위의 두 번째 부분을 출력 하에서 첫 부분을 출력한다. 이것은 당신이 후있어 물건의 종류

public void showAmount() 
    { 
     int indexUsername = 0; 
     ++indexUsername; 
     Console.WriteLine("\nGebruikers:"); 
     foreach (var user in UserList.Where(u => u.User != "SYSTEM")) 
     { 
      string userName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(user.User); 
      //Console.WriteLine(indexUsername + ". " +" \t " + userName +"" + user.countUsers); 
      Console.WriteLine("#" +indexUsername + ".\t {0} has been online {1}x times ", userName, user.countUsers); 
      indexUsername++; 
     } 
    } 

Output

+0

... –

+0

나의 사과 :


는 여기에 귀하의 출력 문자열을 생성하는 방법입니다. 아무 것도 입력하지 않습니다. 로그 북에서 Windows 이벤트 로그를 검색하는데, 해당 날짜 이름 변수가 있습니다. – 308075

+0

예를 들어 출력을 –

답변

0

인가?

public void getCountUsers() 
{ 
    EventLog myNewLog = new EventLog(); 
    myNewLog.Log = "Security"; 

    var query = 
     from EventLogEntry entry in myNewLog.Entries 
     where entry.InstanceId == 4624 
     where entry.TimeWritten.Date == DateTime.Today 
     where new[] { "192", "127" }.Any(x => entry.ReplacementStrings[18].Contains(x)) 
     select new { entry.TimeWritten.Hour, User = entry.ReplacementStrings[5] }; 

    var result = 
     query 
      .GroupBy(x => x.Hour, x => x.User) 
      .OrderByDescending(x => x.Count()) 
      .Take(1) 
      .Select(x => new 
      { 
       Hour = x.Key, 
       Users = 
        x 
         .GroupBy(y => y) 
         .Select(y => new Users(y.Count(), y.Key)) 
         .ToList() 
      }) 
      .First(); 

    Hour = result.Hour; 
    UserList = result.Users; 

} 

query는 코드를 효과적으로 대체합니다. myNewLog.Entries 이상의 루프를 수행하고 Users 개체를 만드는 데 사용 된 entry.ReplacementStrings[5] 값을 추출합니다. 이 데이터에 entry.TimeWritten.Hour 값을 추가했습니다.

이제 result 변수에서 나는 query을 가져오고 User 속성을 Hour으로 그룹화합니다. 그런 다음 각 시간대의 사용자 수가 내림차순으로 정렬되고 내가 .Take(1) 일 때 대부분의 사용자 만 시간을받습니다. 그런 다음 시간을 선택하고 Users 개체를 만들기 위해 다른 그룹의 사용자를 지정합니다 (코드에서했던 것처럼). 그리고 마지막으로 .First()을 사용하여 인구가 가장 많은 시간을 가져옵니다.

마지막 두 과제는 코드를 모방 한 것입니다. 나는 당신의 질문을 이해 할 수없는 것 때문에 입력 및 예상 결과를 보여줄 수 있다면 의미

string output = 
    String.Format(
     "Most active users were online on {0},{1} The users online at the peak was: {2}", 
     TimeSpan.FromHours(result.Hour), 
     result.Users.Count(), 
     String.Join(", ", result.Users.Select(x => x.User))); 
+0

@ 308075 - 글쎄,이 코드가하는 것입니다. 'System.Linq'에 대한 참조가 있습니까? – Enigmativity

+0

@ 308075 - 'Hour'에 대한 최종 과제는 무엇입니까? – Enigmativity

+0

네, Hour = result.Hour는 컨텍스트에 존재하지 않는다는 것을 알려줍니다. – 308075