Hola a Todos, como ya conté el la parte UNO, DOS y TRES del post
“Seguridad en Hyper-V : Administrador de autorización para su correcta delegación”
La administración de Hyper-v se puede delegar a usuarios que incluso no son Administradores del dominio, ni de la maquina local
Ahora automatizaremos todo con Powershell y asignaremos permisos de administrador a usuarios que tiene una cuanta común y corriente del Dominio y necesiten administrar Hyper-v desde Windows 7
El siguiente script esta basado en uno que realizo el Program Manager de Hyper-v, pero le realice algunos cambios para hacerlo mas amigable al Usuario y que se puedan conectar de forma remota
Cuales son los pasos entonces:
- Ver si mi HOST esta manejado por Hyper-v manager o por SCVMM
- Agregar al usuario al grupo administradores de hyper-v dentro del archivo del autorization Manager
- Agregar al usuario al Grupo “Usuarios COM distribuidos”
- Conceder los permisos de Seguridad WMI sobre CIMV2 y Virtualization
#Traemos el Nombre del Computador
$computerName=$env:Computername
#Traemos el Nombre del Dominio
$domainName=[Environment]::UserDomainName
#Caputamos el Nombre del Usuario
$UserName= Read-Host «Ingrese el Nombre de Usuario «
$myWindowsID = ([Security.Principal.WindowsIdentity]$UserName)
$COM=«Usuarios COM distribuidos»
#Lo agregamos al Grupo COM distribuidos
([ADSI]«WinNT://$computerName/$COM,group»).Add(«WinNT://$domainName/$UserName»)
#Buscamos el XML que tiene al almacen de autorizacion
$AzManStoreLocation = (Get-ItemProperty –path «HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionVirtualization»).StoreLocation
#Abrimos y lo almacenamos en una variable
$AzManStore = new-object -ComObject «AzRoles.AzAuthorizationStore»
$AzManStore.Initialize(2, $AzManStoreLocation)
#Vemos si el servidor es manejado por Hyper-v Service o por SCVMM
if (@($AzManStore.Applications | ? {$_.Name -contains «Hyper-V services»}).count -eq 1)
{
$HyperVAzManStore = $AzManStore.OpenApplication(«Hyper-V services»)
}
elseif (@($AzManStore.Applications | ? {$_.Name -contains «Virtual Machine Manager»}).count -eq 1)
{
$HyperVAzManStore = $AzManStore.OpenApplication(«Virtual Machine Manager»)
}
else
{
Write-Host «NO encontre Azman»
Write-Host -NoNewLine «Presione Cualquier tecla para continuar…»
$null = $Host.UI.RawUI.ReadKey(«NoEcho,IncludeKeyDown»)
exit
}
# Traemos el rol de administrador desde el Azman
$HyperVAdministratorsRole = $HyperVAzManStore.OpenRoleAssignment(«Administrator»)
# vemos si el usuario ya esta en ese rol
if (@($HyperVAdministratorsRole.Members | ? {$_ -contains $myWindowsID.User.Value}).count -eq 0)
{
# Si no esta lo agregamos
$HyperVAdministratorsRole.AddMember($myWindowsID.User.Value)
$HyperVAdministratorsRole.Submit()
}
Else
{
# Si está, le avisamos al usuario quer ya existe
Write-host $myWindowsID.Name «El usuario ya es miembro de administradores de HV»
Write-Host -NoNewLine «Presione Cualquier tecla para continuar….»
$null = $Host.UI.RawUI.ReadKey(«NoEcho,IncludeKeyDown»)
}
Guardamos Este Script como AdminHV.ps1 y lo ejecutamos
Cuando nos pregunte por el usuario, agregamos al usuario común y corriente ej: Hypervtest
Con este Script cubrimos los puntos 1,2,3
Cubrir el punto 4 es bastante complejo, pero la gente de WMI de MSFT realizo un script que puede hacer justo lo que necesitamos
http://blogs.msdn.com/b/wmi/archive/2009/07/27/scripting-wmi-namespace-security-part-3-of-3.aspx
Imaginamos que el nombre del dominio se llama CAPACITA y el usuario se llama Hypervtest
Entonces ahora ejecuto el Script que descargamos desde la pagina anterior
Set-WmiNamespaceSecurity root/cimv2 add CAPACITAHypervtest Enable,RemoteAccess
Set-WmiNamespaceSecurity root/virtualization add CAPACITAHypervtest Enable,RemoteAccess
Como se pueden dar cuenta agrego al usuario CAPACITAHypervtest al espacio de nombre Cimv2 con el derecho de acceso remoto, del mismo modo sobre virtualization
Con un Video todo queda mas claro
Les dejo los 2 Script