Взятие под контроль разрастания виртуальных машин (часть 9)
- Взятие под контроль разрастания виртуальных машин (часть 2)
- Взятие под контроль разрастания виртуальных машин (часть 3)
- Взятие под контроль разрастания виртуальных машин (часть 4)
- Взятие под контроль разрастания виртуальных машин (часть 5)
- Взятие под контроль разрастания виртуальных машин (часть 6)
- Взятие под контроль разрастания виртуальных машин (часть 7)
- Взятие под контроль разрастания виртуальных машин (часть 8)
- Взятие под контроль разрастания виртуальных машин (часть 10)
- Взятие под контроль разрастания виртуальных машин (часть 11)
- Взятие под контроль разрастания виртуальных машин (часть 12)
- Взятие под контроль разрастания виртуальных машин (часть 18)
В предыдущей части этой статьи я показал вам, как подсчитать общее количество виртуальных машин, которые были созданы или удалены на сервере. Это хороший первый шаг к тому, чтобы справиться с разрастанием виртуальных машин, поскольку он позволяет выявлять тенденции, но мы можем сделать гораздо больше. Я имею в виду, разве вы не хотели бы знать, кто создает все эти виртуальные машины? В этой статье я покажу вам, как именно это сделать.
В моей последней статье я показал вам основы использования командлета Get-WinEvent. Я также объяснил, что этот командлет можно использовать для возврата определенных идентификаторов событий, например, связанных с созданием виртуальной машины. Конечно, командлет Get-WinEvent — это командлет общего назначения, используемый для разбора журналов событий. Мы просто используем его для отслеживания создания виртуальной машины. Причина, по которой этот небольшой кусочек информации важен, заключается в том, что журналы событий содержат гораздо больше информации, чем просто идентификаторы событий. С каждым событием связано много информации. Все, что нам нужно сделать, это указать PowerShell, чтобы показать нам события и сведения о событиях, которые наиболее полезны для нас.
Мы начали делать это в предыдущей статье. Возможно, вы помните этот блок кода:
$CreateEvents = Get-WinEvent –LogName Microsoft-Windows-Hyper-V-VMMS-Admin | Где {$_.ID –eq «13002»}
$DeleteEvents = Get-WinEvent –LogName Microsoft-Windows-Hyper-V-VMMS-Admin | Где {$_.ID –eq «13003»}
$CreateEvents.count
$DeleteEvents.count
В этом блоке кода переменная $CreateEvents фактически извлекает все журналы событий, связанные с созданием виртуальной машины. Причина, по которой вы не видели эти события, заключается в том, что мы сказали PowerShell подсчитывать события, а не отображать их. Точно так же $DeleteEvents показывает все события, связанные с удалением виртуальной машины. Имея это в виду, давайте повторно используем переменную $CreateEvents и отобразим имя виртуальной машины и имя создавшего ее пользователя.
Теперь, поскольку Get-WinEvent является инструментом общего назначения для запроса журналов событий и не предназначен специально для виртуализации серверов, нет атрибута, содержащего только имя виртуальной машины. Однако мы можем посмотреть атрибут Message, который указывает, что была создана новая виртуальная машина, а затем сообщает нам имя этой виртуальной машины. Имя пользователя, выполнившего действие, хранится в атрибуте UserID. Следовательно, мы можем отображать сообщения о создании виртуальных машин и пользователя, создавшего эти виртуальные машины, с помощью следующих команд:
$CreateEvents = Get-WinEvent –LogName Microsoft-Windows-Hyper-V-VMMS-Admin | Где {$_.ID –eq «13002»}
$Создать События | Сообщение Select-Object, UserID
Вы можете увидеть вывод этой команды, показанный на рисунке A.
Рисунок A: Это события создания виртуальной машины, показанные вместе с сообщением о событии и пользователем, выполнившим событие.
Взглянув на рисунок выше, вы сразу заметите проблему. Идентификатор пользователя отображается как SID, а не как имя пользователя. Это может не очень помочь, если нам нужно выяснить, кто создал конкретную виртуальную машину. К счастью, PowerShell может помочь и в этом. Нам просто нужно прыгнуть через несколько обручей, чтобы добраться туда.
Одна из проблем, с которой мы сталкиваемся, заключается в том, что когда мы отображали UserID на предыдущем рисунке, Windows показала нам SID, связанный с пользователем. Однако UserID состоит не только из SID. Чтобы показать вам, что я имею в виду, посмотрите на эти три строки кода:
$CreateEvents = Get-WinEvent -LogName Microsoft-Windows-Hyper-V-VMMS-Admin | Где {$_.ID -EQ «13002»}
$ObjSID = $CreateEvents.UserID
$ОбжСИД
Строка $CreateEvents точно такая же, как и та, которую мы уже использовали. $ObjSID = CreateEvents.UserID фиксирует идентификатор пользователя, связанный с событием, и помещает его в переменную с именем $ObjSID, которую отображает последняя строка кода. Если вы посмотрите на рисунок B, вы увидите, что UserID на самом деле состоит из двоичной длины, SID домена учетной записи и значения.
Рисунок B: UserID содержит несколько фрагментов информации.
Если этот код должен быть нам полезен, нам нужно изолировать значение. Для этого все, что нам нужно сделать, это добавить.Value в конец второй строки кода. Строка должна выглядеть так:
$ObjSID = $CreateEvents.UserID.Value
Теперь, если я запускаю код, отображается только SID, как показано на рисунке C.
Рисунок C. Теперь отображается только SID.
Итак, теперь, когда мы изолировали SID, мы можем преобразовать SID в имя пользователя. Для этого нам понадобится еще немного кода. Вот как выглядит полный блок кода:
Get-WinEvent -LogName Microsoft-Windows-Hyper-V-VMMS-Admin | Где {$_.ID -EQ «13002»} | ForEach-Object -Process {
$ObjSID = $_.UserID.Value;
$ОбжСИД
$Object = Новый объект System.Security.Principal.SecurityIdentifier ($ObjSID)
$ObjUser = $Object.Translate([System.Security.Principal.NTAccount])
$ObjUser.value
}
Первая строка кода — это наша строка Get-WinEvent. Обратите внимание, что мы не присваиваем это переменной. Вместо этого мы передаем вывод команды в команду ForEach-Object. Идея состоит в том, что у нас есть несколько задач, которые нам нужно обработать для каждой возвращаемой записи журнала событий.
Вторая строка кода создает переменную с именем $ObjSID. Эта строка несколько отличается от предыдущего блока кода. Все, что я здесь делаю, — это извлечение SID пользователя из UserID, связанного с записью в журнале событий.
Третья строка кода просто отображает содержимое переменной $ObjSID. Нам не нужна эта команда. Я просто включил его как способ проверки того, что переменная действительно содержит SID пользователя.
В четвертой строке кода все становится немного сложнее. Я создаю новую переменную с именем $Object. Причина, по которой я это делаю, заключается в том, что недостаточно просто отобразить SID пользователя. На самом деле нам нужно сообщить PowerShell, что значение является SID. В противном случае мы не сможем преобразовать этот SID в имя пользователя. Таким образом, эта строка кода создает переменную с именем $Object и использует команду New-Object для преобразования текстового значения, возвращенного $_.UserID.Value; в распознаваемый машиной SID.
Теперь, когда PowerShell понимает, что это значение является SID, мы можем преобразовать SID в имя пользователя. Пятая строка кода делает это, создавая переменную с именем $ObjUser и затем переводя переменную $Object в имя пользователя.
Наконец, в строке $ObjUser.value отображается результирующее имя пользователя.
Поэтому, когда я запускаю код, Windows будет отображать SID для каждого возвращаемого результата, за которым следует соответствующий идентификатор пользователя. Я еще не добавил имя виртуальной машины в вывод, потому что хотел сначала сосредоточиться на выводе имени пользователя. Результат вы можете увидеть на рисунке D.
Рисунок D. Это SID и имена пользователей, создавших виртуальные машины.
В этом случае выходные данные не сильно помогают нам с разрастанием виртуальных машин, поскольку все виртуальные машины были созданы NT AuthoritySYSTEM. Только представьте, однако, если бы это была среда, в которой виртуальные машины создавались бы отдельными администраторами.
Вывод
В следующей статье этой серии я буду использовать эту технику и покажу вам, как сделать этот отчет более содержательным.
- Взятие под контроль разрастания виртуальных машин (часть 2)
- Взятие под контроль разрастания виртуальных машин (часть 3)
- Взятие под контроль разрастания виртуальных машин (часть 4)
- Взятие под контроль разрастания виртуальных машин (часть 5)
- Взятие под контроль разрастания виртуальных машин (часть 6)
- Взятие под контроль разрастания виртуальных машин (часть 7)
- Взятие под контроль разрастания виртуальных машин (часть 8)
- Взятие под контроль разрастания виртуальных машин (часть 10)
- Взятие под контроль разрастания виртуальных машин (часть 11)
- Взятие под контроль разрастания виртуальных машин (часть 12)
- Взятие под контроль разрастания виртуальных машин (часть 18)