Если ПО VMware Virtual Infrastructure использует сразу несколько человек с правами администратора посредством VirtualCenter, может возникнуть ситуация, когда требуется узнать кто удалил виртуальную машину. Потребность может возникнуть, например, через несколько недель после удаления виртуальной машины - в этом случае список событий VirtualCenter нам не поможет. Как найти виновного?
Устанавливаем этот продукт на сервере VirtualCenter и открываем консоль Management Studio, логинимся и нажимаем New->Query.
Далее выполняем SQL-запрос для поиска событий, свидетельствующих об удалении виртуальной машины.
Поиск всех удалений:
SELECT CREATE_TIME, USERNAME, VM_NAME, HOST_NAME, EVENT_TYPE FROM dbo.VPX_EVENT WHERE EVENT_TYPE = 'vim.event.VmRemovedEvent'
Поиск удаления виртуальной машины с именем DC1:
SELECT CREATE_TIME, USERNAME, VM_NAME, HOST_NAME, EVENT_TYPE FROM dbo.VPX_EVENT WHERE (VM_NAME = 'DC1') AND (EVENT_TYPE = 'vim.event.VmRemovedEvent')
В результате первого запроса мы увидим такую картинку и узнаем, кто снес контроллер домена:
Как вы уже поняли, так можно искать события любого типа.
Такую же операцию можно сделать и посредством PowerShell + VI Toolkit. Для этого, сначала читаем, как нужно использовать PowerShell, далее делаем сценарий следующего содержания:
# Fill in the following information:
$SqlServer = "MYDBSERVER";
$SqlDB = "VMwareDataBase";
$MYVM = "TESTSERVER1"
$TypeofEvent = "vim.event.VmRemovedEvent"
# The vim.event.VmRemovedEvent is a Removed action from VC you can also use :
# vim.event.VmGuestShutdownEvent
# vim.event.VmPoweredOffEvent
# vim.event.VmConnectedEvent
Function Read-VIDB ($SqlQuery)
{
# Setup SQL Connection
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SqlServer; Database = $SqlDB; Integrated Security = True"
# Setup SQL Command
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
# Setup .NET SQLAdapter to execute and fill .NET Dataset
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
#Execute and Get Row Count
$nRecs = $SqlAdapter.Fill($DataSet)
if ($nRecs -gt 0)
{
# Do Stuff
$dataSet.Tables | Select-Object -Expand Rows
}
}
$SqlQuery = "SELECT CREATE_TIME, USERNAME, VM_NAME, HOST_NAME, EVENT_TYPE FROM VMWareDS.VPX_EVENT WHERE (VM_NAME = N'$MYVM') AND (EVENT_TYPE = '$TypeofEvent')"
$MyResults = Read-VIDB $SqlQuery
$MyResults