Взятие под контроль разрастания виртуальных машин (часть 9)

Опубликовано: 18 Апреля, 2023

  • Взятие под контроль разрастания виртуальных машин (часть 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.

Изображение 14806
Рисунок 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 домена учетной записи и значения.

Изображение 14807
Рисунок B: UserID содержит несколько фрагментов информации.

Если этот код должен быть нам полезен, нам нужно изолировать значение. Для этого все, что нам нужно сделать, это добавить.Value в конец второй строки кода. Строка должна выглядеть так:

$ObjSID = $CreateEvents.UserID.Value

Теперь, если я запускаю код, отображается только SID, как показано на рисунке C.

Изображение 14808
Рисунок 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.

Изображение 14809
Рисунок D. Это SID и имена пользователей, создавших виртуальные машины.

В этом случае выходные данные не сильно помогают нам с разрастанием виртуальных машин, поскольку все виртуальные машины были созданы NT AuthoritySYSTEM. Только представьте, однако, если бы это была среда, в которой виртуальные машины создавались бы отдельными администраторами.

Вывод

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

  • Взятие под контроль разрастания виртуальных машин (часть 2)
  • Взятие под контроль разрастания виртуальных машин (часть 3)
  • Взятие под контроль разрастания виртуальных машин (часть 4)
  • Взятие под контроль разрастания виртуальных машин (часть 5)
  • Взятие под контроль разрастания виртуальных машин (часть 6)
  • Взятие под контроль разрастания виртуальных машин (часть 7)
  • Взятие под контроль разрастания виртуальных машин (часть 8)
  • Взятие под контроль разрастания виртуальных машин (часть 10)
  • Взятие под контроль разрастания виртуальных машин (часть 11)
  • Взятие под контроль разрастания виртуальных машин (часть 12)
  • Взятие под контроль разрастания виртуальных машин (часть 18)