none
Вывод в SQL таблицу и вопрос по евентам RRS feed

  • Вопрос

  • Набросал/нашел скриптец для вывода в хэш-табличку информации по печати, получилось вот такое

     
    Get-WinEvent -FilterHashtable @{LogName = "Microsoft-Windows-PrintService/Operational"; ID = "307"} | foreach{
    New-Object PSobject -Property @{
    Time_Created = $_.TimeCreated
    Document_Number = $_.Properties[0].value
    Document_Name = $_.Properties[1].value
    UserID = $_.Properties[2].value
    Printer = $_.Properties[4].value
    PagesCount = $_.Properties[7].value
    }
    }

    Вопроса два

    1) Откуда берется Properties и как кто-то догодался что так можно? :)

    Я просто вижу только Message, в котором значения разделены запятыми.

    2) Хочется это в базу данных заносить, посоветуйте ссылку какую хорошую, как правильно это делать :)

    Спасибо.


    15 октября 2014 г. 5:57

Ответы

Все ответы

  • С первым вопросом судя по всему разобрался. Это свойство

    Properties Property System.Collections.Generic.IList[System.Diagnostics.Eventing.Reader.EventProperty] Properties {get;}

    Хотя почему к нему можно обращаться через индексы, для меня загадка.

    15 октября 2014 г. 6:05
  • Задача уже на раз решалась на данном форуме и оформлена в виде статьи в блоге:

    http://exonix.ru/?#!Статьи/Windows_Server/PowerShell/Аудит_сервера_печати/

    Тема на форуме: https://social.technet.microsoft.com/Forums/ru-RU/131ec732-c076-4db1-a6c2-a0e29fe6f23b/powershell-mysql-?forum=scrlangru



    15 октября 2014 г. 6:23
    Отвечающий
  • Углубился в чтение =)
    15 октября 2014 г. 6:33
  • Сдаюсь, подскажите как сделать чтобы в скобочках после VALUES передавалось значение, а не 'System.Diagnostics.Eventing.Reader.EventLogRecord.Properties
    [i].value)'?

        $connection = New-Object System.Data.SqlClient.SqlConnection("Data Source=srv-sql; Initial Catalog=Print_base; Integrated Security=SSPI")
        $connection.Open()
        Get-WinEvent -FilterHashtable @{LogName = "Microsoft-Windows-PrintService/Operational"; ID = "307"} | foreach{
        
        
        $insert = "INSERT INTO PrintTest(Time_Created,Document_Name,UserID,Printer,PagesCount) VALUES( '$_.TimeCreated', '$_.Properties[1].value', '$_.Properties[2].value', '$_.Properties[4].value', '$_.Properties[7].value')"
           $cmd = $connection.CreateCommand()
           $cmd.CommandText = $insert
           $cmd.ExecuteNonQuery()
                } 
           $connection.Close()

    Единственное как получается это если до Insert присвоить ссылку другой переменной

    например $time = $_.TimeCreated  и уже использовать $time в Insert.

    15 октября 2014 г. 8:02
  • Ну вроде везде разобрался, остался один момент. В базу записываются данные по времени и почему-то не отсортированы на входе получаются.

    15.10.2014 13:08
    15.10.2014 11:02
    15.10.2014 15:20
    15.10.2014 15:20
    15.10.2014 15:19
    15.10.2014 15:18
    15.10.2014 15:17
    15.10.2014 15:15
    15.10.2014 15:14
    15.10.2014 15:12
     Как будто кусками в foreach попадает. Возможно это исправить?

    15 октября 2014 г. 11:23
  • За два дня так вообще вот так получается

    Time_Created
    15.10.2014 13:14
    15.10.2014 11:09
    14.10.2014 18:32
    14.10.2014 16:39
    14.10.2014 14:35
    14.10.2014 12:43
    14.10.2014 10:28
    15.10.2014 11:09
    15.10.2014 11:04
    15.10.2014 11:04

    15 октября 2014 г. 11:25
  • Get-WinEvent -FilterHashtable ... | Sort TimeCreated | Foreach
    15 октября 2014 г. 11:31
    Отвечающий
  • Так пробовал, оно отсортировано вроде, но как-то странно, как будто кусками

    http://rusfolder.com/41996263, вот сюда txt положил, иначе не влезет.

    15 октября 2014 г. 11:37
  • Проблема в столбце Date я ему дал формат DateTime если изменить на ntext все нормально работает.

    Спасибо.

    15 октября 2014 г. 11:44
  • Я не знаю, как у Вас получается такой результат, т.к. Get-WinEvent уже дает сортированные события по дате, сначала старшие потом младшие, если надо наоборот, то оставить Sort TimeCreated.

    Попробуйте заменить строку в скрипте на:

     $insert = "INSERT INTO PrintTest(Time_Created,Document_Name,UserID,Printer,PagesCount) VALUES( '$($_.TimeCreated)', '$($_.Properties[1].value)', '$($_.Properties[2].value)', '$($_.Properties[4].value)', '$($_.Properties[7].value)')"

    Ps. И данные из sql в файле?

    15 октября 2014 г. 11:45
    Отвечающий
  • Строку заменил, теперь передает значение. Отлично :)

    Данные из sql и я не знаю почему, но после того как я дал типа ntext столбцу в котором хранится время сортировка стала нормальной, до этого был datetime.

    15 октября 2014 г. 12:00
  • Я бы еще проверил, вернуть формат на datetime  и привести формат даты в $insert:

    '$($_.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss"))'

    15 октября 2014 г. 12:10
    Отвечающий
  • Дело все-таки не в столбце... По прежнему складывает по странному.

    Попробовал добавить формат '$($_.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss"))'.

    Добавил Write-host в цикл, вижу что данные идут по порядку так как надо. А вот в таблицу SQL попадают уже как в текстовом файлике.

    Может я косанул где?

        $connection = New-Object System.Data.SqlClient.SqlConnection("Data Source=srv-sql; Initial Catalog=Print_base; Integrated Security=SSPI")
        $connection.Open()
        $cmd = $connection.CreateCommand()
        Get-WinEvent -FilterHashtable @{LogName = "Microsoft-Windows-PrintService/Operational"; ID = "307"} |  ForEach{
        
        write-host $_.TimeCreated
        write-host $_.Properties[1].value
       write-host $_.Properties[2].value
       write-host $_.Properties[4].value
       write-host $_.Properties[7].value
        
        $insert = "INSERT INTO PrintAudit(Time_Created,Document_Name,UserID,Printer,PagesCount) VALUES ('$($_.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss"))', '$($_.Properties[1].value)', '$($_.Properties[2].value)', '$($_.Properties[4].value)', '$($_.Properties[7].value)')"
         
           $cmd.CommandText = $insert
           $cmd.ExecuteNonQuery()
                } 
           $connection.Close()

    15 октября 2014 г. 12:48
  • Я плохо  знаком с sql, но для того чтобы говорить, что данные плохо отсортированны в sql надо явно использовать ORDER BY.

    SELECT * FROM PrintAudit ORDER BY Time_Created DESC

    15 октября 2014 г. 14:59
    Отвечающий
  • Совсем другое дело, спасибо вам большое :)
    16 октября 2014 г. 5:33