Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Аудит AD (http://forum.oszone.net/showthread.php?t=282558)

pogo 22-05-2014 16:28 2354420

Аудит AD
 
Спасибо за отзывы в теме, но что-то готовые решения аудита оказались очень дорогими.
В итоге решил попробовать сделать подобное скриптом.
Как включить аудит для стандартных телодвижений в AD написано тут
В инете был найден скрипт и слегка модифицирован:

Код:

$objExcel = New-Object -comobject Excel.Application
$objExcel.visible = $True
$objWorkbook = $objExcel.Workbooks.Add()
$objSheet = $objWorkbook.Worksheets.Item(1)
$objSheet.Cells.Item(1,1) = "Server"
$objSheet.Cells.Item(1,2) = "LogName"
$objSheet.Cells.Item(1,3) = "Time"
$objSheet.Cells.Item(1,4) = "Source"
$objSheet.Cells.Item(1,5) = "EventID"
$objSheet.Cells.Item(1,6) = "Message"
$objSheet.Cells.Item(1,7) = "UserName"
$objSheetFormat = $objSheet.UsedRange
$objSheetFormat.Interior.ColorIndex = 19
$objSheetFormat.Font.ColorIndex = 11
$objSheetFormat.Font.Bold = $True

$row = 1

$servers = Get-Content D:\scripts\ps\servers.txt

foreach ($server in $servers)
{
  $row = $row + 1
  #$AppLog = Get-EventLog -LogName Application -computer $server -Newest 5
  $SecLog = Get-EventLog -LogName Security -ComputerName $server -Newest 10 -ea SilentlyContinue | where {$_.EventID -eq 4624}
  #$SysLog = Get-EventLog -LogName System -computer $server -Newest 5
  #foreach ($cat in $AppLog,$Syslog,$Seclog)
  foreach ($cat in $SecLog)
  {
    #if ($cat -is [array])
    #{
      #if ($AppLog -contains $cat[0]) {$Catname = "Application"}
      if ($SecLog -contains $cat[0]) {$Catname = "Security"}
      #if ($SysLog -contains $cat[0]) {$Catname = "System"}
      Foreach ($event in $cat)
      {
        $objSheet.Cells.Item($row,1).Font.Bold = $True
        $objSheet.Cells.Item($row,1) = $server
        $objSheet.Cells.Item($row,2) = $Catname
        $objSheet.Cells.Item($row,3) = $Event.TimeGenerated
        $objSheet.Cells.Item($row,4) = $Event.Source
        $objSheet.Cells.Item($row,5) = $Event.EventID
        $objSheet.Cells.Item($row,6) = $Event.Message
        #$objSheet.Cells.Item($row,7) = $Event.Message | where {$_ -match "(\s|^)Account\sName"} #Select-String "Account"
        $row = $row + 1
      }
    #}
  }
}

$objSheetFormat = $objSheet.UsedRange
$objSheetFormat.EntireColumn.AutoFit()
$objSheetFormat.RowHeight = 15

Закомментированые строки нужны для того, что бы получать логи не только из журнала "Безопасность\Security", но для аудита они не нужны.
В процессе написания возникла проблема, которую пока не удалось решить.
Надо что бы в таблице было ещё одно поле, userName, что бы можно было сразу посмотреть, когда последний раз осуществляла логин какая-то учётка.
Для примера вот кусок сообщения $Event.Message от EventID=4624

Цитата:

New Logon:
Security ID: DOMAIL\user10
Account Name: user10
Account Domain: Domain
Logon ID: 0x533df4e2a0
Logon GUID: {c1fcf540-9843-1112-b2a8-8fds3c3dcfd}
И надо что бы в это последнее поле userName записывалось значение Account Name, т.е. user10.
Подскажите пожалуйста, как это можно реализовать?

Kazun 22-05-2014 17:05 2354435

$objSheet.Cells.Item($row,7) = $Event.ReplacementStrings[5]

pogo 23-05-2014 09:31 2354712

Большое спасибо!! То что нужно.

dinovasya@vk 14-07-2014 18:42 2376430

Как целиком теперь выглядит решение и куда его вставить чтоб заработало? новичек ))

Yspex 15-07-2014 14:45 2376793

Вложений: 1
Выкладываю данный скрипт аудита, я пользуюсь им постоянно, при желании можно под себя заточить.

rudimko 16-07-2014 09:20 2377132

Интересный, годный скрипт.
Я немного не в тему, но информация, может быть, будет полезной для аудита, которую можно использовать в дальнейшем.

У себя в домене я реализовал такую фичу:

Через GPO (нацеленную только на клиентские ОС по WMI фильтру) прописал в логон скрипт код на vb:
Код:

On Error Resume Next
Dim adsinfo, ThisComp, oUser
Set adsinfo = CreateObject("adsysteminfo")
Set ThisComp = GetObject("LDAP://" & adsinfo.ComputerName)
Set oUser = GetObject("LDAP://" & adsinfo.UserName)
Thiscomp.put "description", "Выход: " + oUser.cn + " " + CStr(Now)
ThisComp.Setinfo

В логофф скрипт:
Код:

On Error Resume Next
Dim adsinfo, ThisComp, oUser
Set adsinfo = CreateObject("adsysteminfo")
Set ThisComp = GetObject("LDAP://" & adsinfo.ComputerName)
Set oUser = GetObject("LDAP://" & adsinfo.UserName)
Thiscomp.put "description", "Вход: " + oUser.cn + " " + CStr(Now)
ThisComp.Setinfo

На выходе получаем:
В поле Description (которое потом можно использовать для каких-нибудь отчетов) компьютера в AD имеем что-то типа "Вход: Иван Иванович Иванов 16.07.2014 9:03:32" или "Выход:... Бла бла бла"

Куски скрипта где-то стащил, переделал под себя. А так, достаточно наглядно и эффективно.

Iska 16-07-2014 10:23 2377144

Главное в ентом деле, чтоб связь не терялась, машины не зависали и свет не выключался :lol:.


Время: 23:57.

Время: 23:57.
© OSzone.net 2001-