Аудит Active Directory средствами Powershell с оповещением об изменениях. Часть 1


Начну серию публикаций по мониторингу Active Directory.
В данных статьях я приведу самые основные проблемы и пути их решения. На основе этих данных функционал легко расширяется до тех требований, которые Вам необходимы.
Учитывая, что сейчас для всех ОС, начиная с Windows Server 2003 R2 и Windows XP SP3 доступен Powershell. Думаю, что данная статья окажется полезным подспорьем, т.к. не требует от администратора введения никаких дополнительных средств, т.е. по сути – мониторинг штатными средствами.



Итак начнем.

Мониторинг Active Directory



На всех блог-комьюнити посвященных IT можно встретить множество статей по мониторингу AD, но… но больше 90% из них посвящены использованию сторонних приложений, в большинстве своем стоящих определенную сумму денег, которую не каждое предприятие готово отдать, пусть даже не большую. Наверное рекордсмен по количеству статей – это продукт от компании NetWrix Corporation. Тут и там IT-специалисты расписывают замечательные возможности данной программы. Да чего греха таить, и сам пользовался данной программой в демо-режиме. Честно скажу – понравилась, все просто и доступно, но денег на нее не дают, а значит к концу демо-периода AD снова останется без “зоркого” глаза. Что меня в корне не устраивало.

Немного тоерии


Как известно в политиках безопасности в ОС Windows всех мастей есть возможность вести аудит событий. Данный аудит позволяет автоматически генерировать записи в Event Log в журнале “Безопасность”. Аудит можно вести за несколькими типами событий, например: вход в систему, доступа к объектам, управлениями учетными записями, изменения политик и прочее. Всего 9 типов событий. Это базовый аудит. Начиная с Windows 7 и Windows Server 2008R2 количество событий аудита возросло до 53. С помощью которых можно более детально вести аудит только нужных событий. Более подробную информацию по расширенным политикам аудита можно прочитать тут.
Но как известно тем, кто хоть раз заглядывал в EventLog в раздел безопасности – найти там что либо – если и не невозможно, то по крайней мере очень сложно.

Идея...

И тут родилась идея… раз Windows умеет создавать запись в EventLog о произошедшем событии, значит теоретически данную информацию можно получить. Одно “но”… уж больно большой этот лог, чтобы в нем искать нужное событие вручную, да и со временем если не ограничить размер лога, он может разрастись в десятки гигабайт, что само по себе уже не хорошо. Значит необходимо решить проблему по поиску нужной информации в EventLog’е автоматически. Благо, что каждый тип события (например создание учетной записи пользователя) имеет свой ID, по которому его можно найти.
Значит для решения задачи поиска нам нужно всего лишь отыскать данное событие в журнале.
Для Powershell 2.0 есть специальный командлет для работы с EventLog’ом – Get-WinEvent.
Используя данный командлет можно получить определенную запись в EventLog’е.

Реализация

Допустим мы указали в групповых политиках, которые применяются на контролеры домена, вести аудит событий связанных с учетными записями.
Тогда любое действие с учетной записью, заведенной в AD, будет генерировать событие, которое будет будет создавать запись в EventLog с определенным идентификатором. Например при добавлении в домен компьютера на контролере домена, где производилась эта операция, в EventLog’е в журнале “Безопасность” появится запись с идентификатором ID=4741, в которой будет указано в какое время, кто и какой компьютер добавил в домен.
Для получения последнего события с данных идентификатором воспользуемся запросом Powershell:

Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4741}

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

TimeCreated  : 12.07.2012 14:02:19
ProviderName : Microsoft-Windows-Security-Auditing
Id           : 4741
Message      : Создана учетная запись компьютера.

               Субъект:
                   Идентификатор безопасности:        S-1-5-21-451469775-2953165952-2320738315-500
                   Имя учетной записи:        administrator
                   Домен учетной записи:        DOMAIN
                   Идентификатор входа:        0xb3acf

               Новая учетная запись компьютера:
                   Идентификатор безопасности:        S-1-5-21-451469775-2953165952-2320738315-2979
                   Имя учетной записи:        TEST$
                   Домен учетной записи:        DOMAIN

               Атрибуты:
                   Имя учетной записи SAM:    TEST$
                   Отображаемое имя:        -
                   Основное имя пользователя:    -
                   Домашний каталог:        -
                   Домашний диск:        -
                   Путь к сценарию:        -
                   Путь к профилю:        -
                   Рабочие станции пользователя:    -
                   Последний пароль задан:    <никогда>
                   Срок действия учетной записи истекает:        <никогда>
                   Идентификатор основной группы:    515
                   Разрешено делегировать:    -
                   Старое значение UAC:        0x0
                   Новое значение UAC:        0x85
                   Управление учетной записью пользователя:
                       Учетная запись отключена
                       "Пароль не требуется" - включено
                       "Учетная запись доверия рабочей станции" - включено
                   Параметры пользователя:    -
                   Журнал SID:        -
                   Часы входа:        <значение не задано>
                   DNS-имя узла:        -
                   Основные имена служб:    -

               Дополнительные сведения:
                   Privileges        -


Нас же интересует самая основная информация: Время, кто создал, имя компьютера. Для этого “немного” подправим наш запрос:
Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4741} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}}

В итоге результатом данного запроса станет уже удобная для глаза информация:

TimeCreated : 12.07.2012 14:02:19
 Оператор : administrator
 Имя компьютера : TEST$

Данный запрос рассматривает событие в EventLog’у как XML объект. И выбирает нужные нам значения, т.е. время (TimeCreated), Оператора и Имя компьютера.

Как видите код не совсем удобочитаем. Для возможности работы с событиями в Windows Eventlog предусмотрен специальный класс .Net, который может разбирать каждое событие на подстроки, а так как Powershell, по сути — тот .NET, то и в нем доступны данные возможности.

Вот к примеру данный код разбирает событие по подстрокам:

Get-Eventlog Security -InstanceId 4768|
   Select TimeGenerated,ReplacementStrings |
   % {
     New-Object PSObject -Property @{
     UserName = $_.ReplacementStrings[0]
     IPAddress = $_.ReplacementStrings[9]
     Date = $_.TimeGenerated
    }
   }


В итоге получим что-то вроде такого:

 Date : 12.07.2012 14:02:19
 Username : administrator
 IPAddress : 10.10.10.1


Данный код намного проще читать.

Рассмотрим поподробнее запросы.


1 вариант (запрос рассматривает событие как XLM):

Если открыть любою запись в EventLog’е, то Вы увидите 2 закладки: Общие и подробности.
Если перейти на вкладку “подробности” и выбрать режим просмотра: “Режим XML”, то увидим как раз таки структуру события в виде XML.
Распарсив данное событие как XML и выбрав оттуда необходимые нам значения: В разделе Event.EventData.Data в параметре под именем SubjectUserName скрывается имя пользователя который создал компьютер, а в параметре под именем SamAccountName – имя созданного компьютера.

2 вариант (разбор под подстрокам):

Тем же самым образом открываем событие как XML, находим раздел Event.EventData.Data, и считаем строки (начиная с 0) — это и есть индексы наших подстрок. Находим строку с нужным нам значением, и считаем какая она по счету.

Теперь нужно куда то вывести эту информацию, не хранить же ее в консоли.
А еще лучше если она будет отправляться администратору, скажем, на почту.
В Powershell 2.0 есть возможность консольно устанавливать SMTP сессии и отправлять письма.
Send-MailMessage– командлет который выполняет данную функцию.
Для отправки сообщения нем необходимо указать SMTP-сервер, адрес отправителя, адрес получателя, тело письма, тему письма, имя пользователя и пароль.
В итоге получим следующий запрос, который будет искать последнее событие под идентификатором ID=4741 и отправлять на почту администратору информацию.


#Определяем все переменные для отправки
 $Theme = “Добавлен новый компьютер в домен” # Первая строчка в теле письма, чтобы понимать о чем речь.
 $Subject = “Создание компьютера” # Тема сообщения

$Server = “mail.domain.ru” # SMTP Сервер
 $From = “audit@domain.ru” # Адрес отправителя
 $To = “admin@domain.ru” # Получатель
 $pass = ConvertTo-SecureString “PASSWORD” -AsPlainText -Force #Пароль от учетной записи
 $cred = New-Object System.Management.Automation.PSCredential(“AUDIT” , $pass) #Имя пользователя и пароль
 $encoding = [System.Text.Encoding]::UTF8 #Устанавливаем кодировку UTF8 для корректного отображения информации в теле письма

#Собственно сам запрос поиска события. Выбирается последнее произошедшее событие с таким ID. Данные записываются в переменную Body.

$Body=Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4741} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SubjectUserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data | ? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}} | select-object -first 1

#Отправка письма.
 Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme `n$BodyM” -Subject $Subject -Credential $cred -Encoding $encoding


Итог


Сохраняем данный скрипт в файл с расширением ps1, например сюда: D:\Scripts\ADCompAdd.ps1
Открываем консоль Powershell.
Набираем команду: Set-ExecutionPolicy Unrestricted

Жмем “Y” и Enter. Тем самым мы разрешаем выполнение Powershell-скриптов на сервере.
Перетаскиваем скрипт в консоль (Drag and Drop) и жмем Enter. Проверяем, что скрипт выполнился без ошибок (т.е. в консоли никаких надписей красного цвета не появилось). Проверяем почту на наличие нового сообщения, которое содержит в себе необходимые нам данные.

Осталось только как то заставить запускаться данный скрипт в момент когда событие произошло.
Тут нам на помощь придет “Планировщик заданий”.
В планировщике есть возможность реакции на определенное событие в EventLog.
Создаем задание, где в тригере указываем реагировать на событие под номером 4741 которые появляется в журнале Security.
Так же указываем что необходимо запустить данный скрипт. Для этого указываем в “действиях”, что хотим запустить программу, в поле “Программа или сценарий” пишем “powershell”. В поле “Добавить аргументы (необязательно)” пишем ” -nologo -noprofile -File “D:\Scripts\ADCompAdd.ps1″

Теперь тестируем как работает созданная структура. Создаем тестовый компьютер в любом подразделении в AD. И проверяем почту на наличие сообщения.

Скрипт не совсем безопасен т.к. содержит в себе имя пользователя и пароль в открытом виде, поэтому настоятельно рекомендую, если решите воспользоваться данным скриптом, то используйте учетные записи для отправки сообщений с минимальным набором прав.

По моим замерам время реакции на событие 1 секунда. Т.е. со времени создания до получения письма проходит 1 секунда. Конечно при условии, что вы используете свой локальный почтовый сервер, а не где нибудь в Интернете. Там задержка может быть больше. Но в целом тоже не высокая.

В итоге взяв за основу данный скрипт и изменив в нем номер события и данные которые необходимо доставать из события, можно осуществлять мониторинг за всеми операциями с учетными записями в AD: создание-удаление, отключение-включение, блокировки-разблокировки., добавления в группы и исключения и прочее. В общем любой мониторинг событий, который позволяет вести аудит Windows. Просто необходимо изменить фильтр XML в запросе, для этого посмотреть необходимое событие в XML-режиме, выбрать необходимые значения и вписать их в фильтр запроса.

PS:


Вот некоторые полезные идентификаторы событий для Windows Server 2008R2:

ID=4741 Создание компьютера в домене

ID=4743 Удаление компьютера из домена

ID=4728 Добавление в группу безопасности

ID=4729 Удаление из группы безопасности

ID=4720 Создание пользователя

ID=4726 Удаление пользователя

ID=4740 Блокировка учетной записи

ID=4767 Разблокировка учетной записи

ID= 4722 Включение учетной записи

ID=4725 Отключение учетной записи
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 36

    0
    Очень Классно!
    И интересно!
    завтра будет день для фантазий и воплощения!
      +3
      Я хотел бы посоветовать использовать строки с одинарными кавычками ('string') вместо двойных, особенно для таких строк как пароли. Причина — строки в двойных кавычках («string») «расширяются» Powershell: если в строке есть символ $ (а в пароле этот символ — обычное явление), то powershell будет интерпретировать дальнейшие цифро-буквенные символы как название переменной, и подставит ее значение (а если такой переменной нет, то подставит пустую строку).

      Вообще, в Powershell всегда используйте одинарные кавычки, кроме случаев когда вы действительно хотите «расширить» строку. Это сэкономит время на чтении вашего скрипта: нет необходимости внимательно вчитываться в каждую констнантную строку чтобы понять возможно ли там расширение.

      Пример:
      $a= 5
      $ab= 10
      
      Write-Host '$a$ab'
      Write-Host "$a$ab"
      Write-Host "$a$abc"
      

      Вывод на консоль:
      $a$ab // no string expansion, taken literally
      510 // both expressions expanded to existing variables
      5    // second one expanded to $null 
      

        +1
        Ой, только что заметил, что случайно комментировал по-английски. Привычка, однако. Вот перевод:
        $a$ab // строка не «расширяется», используется буквально
        510 // оба выражения ($a и $ab) «расширяются» переменными, определенными раннее
        5 // второе выражение ($abc) «расширяется»/заменяется на $null (так как переменная $abc) не определена
        +1
        Я не совсем понял, зачем держать пароль в открытом виде, если вы его все равно потом конвертируете в защищенную строку? Я в таких случаях заранее сохраняю защищенный пароль в текстовый файл (который потом еще и шифрую, что бы не утащили) и использую его когда надо. Вот здесь описано как это сделать.
          0
          Кстати, относительно недавно я писал статейку практически с таким же методом отслеживания создания новых учеток пользователей (вместе Get-WinEvent я юзал Get-EventLog). У меня вся информация уходила в текстовый файл, который я периодически просматривал. С почтой, конечно, по красивее.
            0
            Да, Вашу статью читал давненько, собственно это и сподвигло меня на, так сказать, продолжение…
            В Get-EventLog на сколько я помню нет возможности доставать определенную информацию из поля Message:(
              0
              $Message = (get-eventlog -Logname Security -Newest 1).Message
              Все вытаскивается, это же PowerShell :)
                0
                хм… поле Message содержит много служебной информации же:
                Message : Создана учетная запись компьютера. Субъект: Идентификатор безопасности: S-1-5-21-451469775-2953165952-2320738315-500 Имя учетной записи: administrator Домен учетной записи: DOMAIN Идентификатор входа: 0xb3acf Новая учетная запись компьютера: Идентификатор безопасности: S-1-5-21-451469775-2953165952-2320738315-2979 Имя учетной записи: TEST$ Домен учетной записи: DOMAIN Атрибуты: Имя учетной записи SAM: TEST$ Отображаемое имя: - Основное имя пользователя: - Домашний каталог: - Домашний диск: - Путь к сценарию: - Путь к профилю: - Рабочие станции пользователя: - Последний пароль задан: <никогда> Срок действия учетной записи истекает: <никогда> Идентификатор основной группы: 515 Разрешено делегировать: - Старое значение UAC: 0x0 Новое значение UAC: 0x85 Управление учетной записью пользователя: Учетная запись отключена "Пароль не требуется" - включено "Учетная запись доверия рабочей станции" - включено Параметры пользователя: - Журнал SID: - Часы входа: <значение не задано> DNS-имя узла: - Основные имена служб: - Дополнительные сведения: Privileges -

                А хочется чтоб красиво и удобочитаемо:)
                  0
                  Ну Вы свой вывод получаете тоже не сразу в красивом виде :)
                  Так что парсить все равно придется :)
                  Между прочим, скопировал весь ваш Message в переменную $b

                  PS [69] > $b -match "(Субъект: .* (?<Name>(Имя учетной записи: (\w+))) .* Новая учетная)"
                  True
                  PS [70] > $Matches.Name
                  Имя учетной записи: administrator
                  PS [71] > $b -match "(Новая учетная запись .* (?<Comp>(Имя учетной записи: (\S+))))"
                  True
                  PS [72] > $Matches.Comp
                  Имя учетной записи: TEST$
                  
                    0
                    Сам себя исправлю:
                    Ну Вы свой вывод получаете тоже не сразу в красивом виде :)
                    Так что парсить все равно придется :)
                    Между прочим, скопировал весь ваш Message в переменную $b

                    PS [69] > $b -match "(Субъект: .* Имя учетной записи: (?<Name>(\w+)) .* Новая учетная)"
                    True
                    PS [70] > $Matches.Name
                    administrator
                    PS [71] > $b -match "(Новая учетная запись .* Имя учетной записи: (?<Comp>(\S+))"
                    True
                    PS [72] > $Matches.Comp
                    TEST$
                    PS [73] > "Оператор: {0}" -f $Matches.Name
                    Оператор: administrator
                    PS [74] > "Имя компьютера: {0}" -f $Matches.Comp
                    Имя компьютера: TEST$
                    

                    Так красивее :)
                      0
                      Ну вобщем то говорим об одном и том же) Разными путями приходим)
            +3
            Set-ExecutionPolicy Unrestricted

            Nooooo! Whyyyyyy? (падая на колени и потрясая кулаками в сторону небес)
            Использование политики Unrestricted есть бутылочное горлышко в безопасности, я запрещаю это всем и вся. Куда лучше на корпоративном УЦ выдать ключ и сертификат для подписи скриптов, и свои скрипты этим хозяйством подписывать.
            А по теме — можно гонять подписки в eventvwr.msc на своей машине: это кошерно, православно и можно пользоваться в Рамадан:
              +1
              Или хотя бы RemoteSigned. И да, тут в статье я бы еще добавил о необходимости для начала собирать всё в кучу со всех контроллеров, если их несколько.
              0
              в общем у меня только приходит письмо

              «Добавлен новый компьютер в домен „

              и дальше пусто =(
              что Я делаю не так =(
              p.s пока я в PS чайник =)
                0
                Проверьте, у вас точно событие есть с кодом 4741? Возможно компьютер в домен добавлялся давно и логи уже успели затереться…
                Вполните команду в PS:
                Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4741}
                Каков будет результат?
                  0
                  Данные по эвенту отображаются

                  Проверил уже весь код (сразу)

                  все отрабатывает ровно как в статье

                  но на почту приходит только о добавлении без самого важного =(
                    0
                    в последней строке Send-MailMessage

                    -Body “$Theme `n$BodyM”
                    поменял на
                    -Body $Body

                    в итоге содержание письма стало таким

                    @{TimeCreated=08/23/2012 11:29:17; Оператор=Admin; Имя компьютера=89$}

                    так и должно быть (по правильному ?!)
                    или как все таки ?!
                      0
                      Прошу прощения за мою невнимательность…
                      Добавьте этот код перед сегмнетом по отправке письма.
                      И оставьте как есть в письме переменную $BodyM
                      $body = $body -replace "@{" -replace "}" -replace "=", ": " -replace ";","`n" -replace "TimeCreated","Время" -replace "^","`n" $body = $body -replace "Италмас.+$" -replace "CN:" -replace "OU:" $BodyM = $Body
                        0
                        <code>$body = $body -replace "@{" -replace "}" -replace "=", ": " -replace ";","`n" -replace "TimeCreated","Время" -replace "^","`n"
                        $BodyM = $Body
                        </code>
                        
                          0
                          $body = $body -replace "@{" -replace "}" -replace "=", ": " -replace ";","`n" -replace «TimeCreated»,«Время» -replace "^","`n"
                          $BodyM = $Body

                          Извиняюсь за флуд( Вот правильный код, который нужно добавить…
                            0
                            Исправил код скрипта в теле поста.
                              0
                              ой =) опоздал с комментом
                                0
                                Так и не получается =( скопировал все из поста
                                изменений нет =(
                                Кароч PShell'ник из меня… даже с копированием никакой =)
                                  0
                                  вот только если вот так
                                  #Отправка письма.
                                  Send-MailMessage -From $From -To $To -SmtpServer $server -Body “$Theme $Body” -Subject $Subject -Credential $cred -Encoding $encoding

                                  то на почте получаю
                                  Добавлен новый компьютер в домен @{TimeCreated=08/23/2012 14:19:00; Оператор=Admin; Имя компьютера=333222111$}

                                  по другому никак
                                  0
                                  Что то ничего не получилось (ну точнее не понял куда-чего)
                                  мне как школьнику в этом деле
                                  тяжело =)

                                  p.s а в самой статье изменения будут ?! Я бы из статьи и скопирастил бы ;-)
                                    0
                                    Да, я в статью внес изменения… в тело скрипта… Скопипистите оттуда полностью
                                      0
                                      Отлично!!! Теперь все супер!

                                      Добавлен новый компьютер в домен

                                      Время: 23.08.2012 17:58:41
                                      Оператор: Admin
                                      Имя компьютера: PROVERO4KA$

                                      Спасибо БОЛЬШОЕ!!!
                        0
                        Спасибо за критику. Принял к сведению.
                        Вообще статью написал давно, не прошла модерацию, вчера вспомнил, перепостил.
                        Честно говоря поленился дописывать…
                        По факту сейчас у мменя отрабатывает следующим образом скрипт (немного добавлен функционал):
                        1. Отправка инфорацмии на почту
                        2. Отправка информации о критчных событиях в Jabber-сервис (для тех у кого в сети поднят XMPP-сервис) — дает оперативность получения информации.
                        3. Пишет в текстовый файл инормацию. В частности сделан скрипт который отслеживает критически важные папки общего пользования, и пишет логи о доступе пользователей к файлам, а так же об удалении файлов.

                        Если интересно могу выложить код…
                        Вообще в павершеле я новичек… поэтому на многие камни придется понаступать не раз:) Интересно было замечание по поводу ковычек и про скрытие пароля.
                        Вообще скрипт позиционирует себя как «скопировал-вставил и все работает» :)

                        По поводу сборки логов со всех контроллеров… возможно, но кидать целый лог со всех контроллеров на один сервер затратнее, чем кидать с каждого контроллера уже отформатированные данные.
                        А для сбора логов существуют другие продукты, о них раскажу позже… как раз недавно развернул…
                          0
                          Ну не обязательно целыми логами разбрасываться. Можно просто добавить список КД и последовательно просматривать их логи с одного сервера. Собирать информацию со всех КД нужно обязательно (я думаю все понимают, зачем).
                            0
                            Все равно считаю, что лучше когда каждый такой скрипт будет работать на каждом КД. На случай если связь к КД пропадет, скрипт будет работать и писать в удаленной сети лог в отдельный файл, потом его можно просмотреть,…
                          0
                          Спасибо, интересная идея — запишу себе в фичи мониторинга, который хочу на шарпе написать :)
                            0
                            а в оффлайн режиме покопаться в событиях можно с помощью LogParser, у него есть соответсвующий тип источника
                              0
                              PS D:\PowerShell> D:\PowerShell\ADD_pc_to_AD-2.ps1
                              Get-WinEvent: Could not retrieve information about the Security log. Error: Attempted to perform an unauthorized operation…
                              At D:\PowerShell\ADD_pc_to_AD-2.ps1:13 char:19
                              + $Body=Get-WinEvent <<<< -FilterHashtable @{LogName=”Security”;ID=4743} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “Subject
                              UserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}} | select-object -first 1
                              + CategoryInfo: NotSpecified: (:) [Get-WinEvent], Exception
                              + FullyQualifiedErrorId: LogInfoUnavailable,Microsoft.PowerShell.Commands.GetWinEventCommand

                              Get-WinEvent: There is not an event log on the localhost computer that matches «Security».
                              At D:\PowerShell\ADD_pc_to_AD-2.ps1:13 char:19
                              + $Body=Get-WinEvent <<<< -FilterHashtable @{LogName=”Security”;ID=4743} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “Subject
                              UserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}} | select-object -first 1
                              + CategoryInfo: ObjectNotFound: (Security:String) [Get-WinEvent], Exception
                              + FullyQualifiedErrorId: NoMatchingLogsFound,Microsoft.PowerShell.Commands.GetWinEventCommand

                              Get-WinEvent: The parameter is incorrect
                              At D:\PowerShell\ADD_pc_to_AD-2.ps1:13 char:19
                              + $Body=Get-WinEvent <<<< -FilterHashtable @{LogName=”Security”;ID=4743} | Select TimeCreated,@{n=”Оператор”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “Subject
                              UserName”} |%{$_.’#text’}}},@{n=”Имя компьютера”;e={([xml]$_.ToXml()).Event.EventData.Data |? {$_.Name -eq “SamAccountName”}| %{$_.’#text’}}} | select-object -first 1
                              + CategoryInfo: NotSpecified: (:) [Get-WinEvent], EventLogException
                              + FullyQualifiedErrorId: System.Diagnostics.Eventing.Reader.EventLogException,Microsoft.PowerShell.Commands.GetWinEventCommand

                              ЧЯДНТ?
                                0
                                Смотрите комментарий ниже) Не туда нажал :)
                                0
                                Attempted to perform an unauthorized operation на мой взгляд намекает на проблему с правами.
                                There is not an event log on the localhost computer that matches «Security» намекает, что лога Security нет на машине
                                  0
                                  Как-то очень мудрено Вы вытаскиваете информацию из события. В объекте события есть свойство Properties которое является массивом, содержащим все ключевые сведения события.
                                  Чтобы не было в e-mail сообщении строк вида @{TimeCreated=08/23/2012 14:19:00; Оператор=Admin; Имя компьютера=333222111$} необходимо в тексте сообщения указывать не объект, а перечислять отдельно его свойства, либо попробовать использовать ft или fl через конвеер.

                                  Only users with full accounts can post comments. Log in, please.