giovedì 29 ottobre 2009

Cancellazione Virtual Machine "Fantasma" in Hyper-V

Mi e' capitato di ritrovare una VM fantasma nella console di Hyper-V e di non riuscire ad elimarla in maniera ortodssa (Menu' contestuale/elimina) cosi', intestardito ho deciso di percorrere altre vie.

Grazie ad un tool molto utile denominato WMI Code Creator, ho generato il codice seguente:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\virtualization")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Msvm_ComputerSystem Where EnabledState >= 2",,48)
For Each objItem in colItems
Wscript.Echo "-----------------------------------"
Wscript.Echo "Msvm_ComputerSystem instance"
Wscript.Echo "-----------------------------------"
If isNull(objItem.AssignedNumaNodeList) Then
Wscript.Echo "AssignedNumaNodeList: "
Else
Wscript.Echo "AssignedNumaNodeList: " & Join(objItem.AssignedNumaNodeList, ",")
End If
Wscript.Echo "Caption: " & objItem.Caption
Wscript.Echo "CreationClassName: " & objItem.CreationClassName
If isNull(objItem.Dedicated) Then
Wscript.Echo "Dedicated: "
Else
Wscript.Echo "Dedicated: " & Join(objItem.Dedicated, ",")
End If
Wscript.Echo "Description: " & objItem.Description
Wscript.Echo "ElementName: " & objItem.ElementName
Wscript.Echo "EnabledDefault: " & objItem.EnabledDefault
Wscript.Echo "EnabledState: " & objItem.EnabledState
Wscript.Echo "HealthState: " & objItem.HealthState
If isNull(objItem.IdentifyingDescriptions) Then
Wscript.Echo "IdentifyingDescriptions: "
Else
Wscript.Echo "IdentifyingDescriptions: " & Join(objItem.IdentifyingDescriptions, ",")
End If
Wscript.Echo "InstallDate: " & objItem.InstallDate
Wscript.Echo "Name: " & objItem.Name
Wscript.Echo "NameFormat: " & objItem.NameFormat
Wscript.Echo "OnTimeInMilliseconds: " & objItem.OnTimeInMilliseconds
If isNull(objItem.OperationalStatus) Then
Wscript.Echo "OperationalStatus: "
Else
Wscript.Echo "OperationalStatus: " & Join(objItem.OperationalStatus, ",")
End If
If isNull(objItem.OtherDedicatedDescriptions) Then
Wscript.Echo "OtherDedicatedDescriptions: "
Else
Wscript.Echo "OtherDedicatedDescriptions: " & Join(objItem.OtherDedicatedDescriptions, ",")
End If
Wscript.Echo "OtherEnabledState: " & objItem.OtherEnabledState
If isNull(objItem.OtherIdentifyingInfo) Then
Wscript.Echo "OtherIdentifyingInfo: "
Else
Wscript.Echo "OtherIdentifyingInfo: " & Join(objItem.OtherIdentifyingInfo, ",")
End If
If isNull(objItem.PowerManagementCapabilities) Then
Wscript.Echo "PowerManagementCapabilities: "
Else
Wscript.Echo "PowerManagementCapabilities: " & Join(objItem.PowerManagementCapabilities, ",")
End If
Wscript.Echo "PrimaryOwnerContact: " & objItem.PrimaryOwnerContact
Wscript.Echo "PrimaryOwnerName: " & objItem.PrimaryOwnerName
Wscript.Echo "ProcessID: " & objItem.ProcessID
Wscript.Echo "RequestedState: " & objItem.RequestedState
Wscript.Echo "ResetCapability: " & objItem.ResetCapability
If isNull(objItem.Roles) Then
Wscript.Echo "Roles: "
Else
Wscript.Echo "Roles: " & Join(objItem.Roles, ",")
End If
Wscript.Echo "Status: " & objItem.Status
If isNull(objItem.StatusDescriptions) Then
Wscript.Echo "StatusDescriptions: "
Else
Wscript.Echo "StatusDescriptions: " & Join(objItem.StatusDescriptions, ",")
End If
Wscript.Echo "TimeOfLastConfigurationChange: " & objItem.TimeOfLastConfigurationChange
Wscript.Echo "TimeOfLastStateChange: " & objItem.TimeOfLastStateChange
Next

Lo script genera una lista con tutte le proprieta' delle macchine virtuali che si trovano sull'Hyper-V server in un determinato momento, producendo un Output come questo:

Msvm_ComputerSystem instance
-----------------------------------
AssignedNumaNodeList:
Caption: Virtual Machine
CreationClassName: Msvm_ComputerSystem
Dedicated:
Description: Microsoft Virtual Machine
ElementName: EN_BPB_BPBEXCH
EnabledDefault: 2
EnabledState: 3
HealthState: 5
IdentifyingDescriptions:
InstallDate: 20091007075603.000000-000
Name: 5975D3F3-EE3D-412A-AC92-DFBAB45F58D0
NameFormat:
OnTimeInMilliseconds: 0
OperationalStatus: 10
OtherDedicatedDescriptions:
OtherEnabledState:
OtherIdentifyingInfo:
PowerManagementCapabilities:
PrimaryOwnerContact:
PrimaryOwnerName:
ProcessID: 0
RequestedState: 12
ResetCapability: 1
Roles:
Status:
StatusDescriptions:
TimeOfLastConfigurationChange: 20091007085737.000000-000
TimeOfLastStateChange: 20091007091948.000000-000

Supponendo che la macchina fantasma si chiamasse PHANTOM_VM, ricaviamo il nome file di configurazione della macchina dalla proprieta' name: 5975D3F3-EE3D-412A-AC92-DFBAB45F58D0.
A questo punto sara' sufficiente trovare il file lnk collegato al file di configurazione della macchina fantasma e procedere alla sua cancellazione. Nel mio caso il file si trovava in C:\Users\All Users\Microsoft\Windows\Hyper-V\Virtual Machines\

martedì 13 ottobre 2009

Esecuzione locale script disattivata

Oggi mi e' capitato, a seguito dello spostamento di una Virtual Machine da un Server con Hyper-V 2008 R2 ad un altro praticamente identico, di dover riattivare la VM.
Come da prassi ho cliccato sulla notify icon in basso a destra sulla taskbar di Windows ma, invece di comparire la solita finestra di dialogo con la scelta del tipo di attivazione, mi compare questo simpatico messaggio:
"Impossibile eseguire l'Attivazione di Windows. L'esecuzione locale di script e' stata disattivata su questo computer. Cio' puo' essere stato fatto a scopo preventivo contro i virus o come misura di sicurezza. Una volta attivata l'esecuzione locale dello script, riavvare l'attivazione"

Dopo qualche ora di ricerche (vane) sulla KB di Microsoft, mi imbatto nella seguente soluzione:

1. Avviare Regedit
2. Impostare "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0\1400" a 0
3. Impostare "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0\1400" a 0
4. Chiudere il Registry Editor
5. Rilanciare il processo di attivazione di Microsoft Windows

Il valore 1400 corrisponde alla policy di Attivazione Scripting Locale