martes, 16 de julio de 2019

Hyper-V: Conectar una maquina virtual a otro VMSwitch con PowerShell

Para conectar una máquina virtual a un VMSwitch distinto al que tiene asignada o asignarle uno por primera vez en caso de que no este conectada, se puede seguir el siguiente ejemplo. En primer lugar, verificar a que switch virtual está conectada la VM (si es que tiene alguno asignado):

PS C:\Users\Administrador> get-vm -Name vm1 | Get-VMNetworkAdapter

Name             IsManagementOs VMName SwitchName MacAddress   Status IPAddresses
----             -------------- ------ ---------- ----------   ------ -----------
Adaptador de red False          vm1               00155D581500 {Ok}   {}

En este caso se ve que el adaptador de esta VM no está conectado a ningún switch virtual. Como este servidor aún no tiene ningún VMSwitch, empiezo verificando las interfaces físicas disponibles en el equipo:

PS C:\Users\Administrador> Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Ethernet0                 Intel(R) 82574L Gigabit Network Conn...       4 Up           00-0C-29-F7-C4-22         1 Gbps
vEthernet (int_switch)    Hyper-V Virtual Ethernet Adapter             12 Up           00-15-5D-58-15-01        10 Gbps


En este servidor la interfaz física Ethernet0 está libre, con el siguiente comando creo un VMSwitch asociado a la misma:

PS C:\Users\Administrador> New-VMSwitch -Name vmswitch_prod -NetAdapterName "Ethernet0" -AllowManagementOS $true

Name          SwitchType NetAdapterInterfaceDescription
----          ---------- ------------------------------
vmswitch_prod External   Intel(R) 82574L Gigabit Network Connection


Finalmente, conectamos el adaptador de la máquina virtual al VMSwitch nuevo con el cmdlet Connect-VMNetworkAdapter y verificamos:


PS C:\Users\Administrador> get-vm -Name vm1 | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -SwitchName vmswitch_prod
PS C:\Users\Administrador> get-vm -Name vm1 | Get-VMNetworkAdapter

Name             IsManagementOs VMName SwitchName    MacAddress   Status IPAddresses
----             -------------- ------ ----------    ----------   ------ -----------
Adaptador de red False          vm1    vmswitch_prod 00155D581500 {Ok}   {}

miércoles, 10 de julio de 2019

PowerShell: Cambiar el tipo de perfil de red en Windows

En ocasiones, al tratar de configurar WinRM para conexiones remotas con PowerShell, recibimos un error debido a que PowerShell considera inseguro realizar conexiones sobre una red pública. Para resolver esto es necesario modificar el perfil de red que Windows asigna a los adaptadores de red, a continuación se muestra como hacer este cambio.

1-) Identificar el adaptador de red cuyo perfil necesitamos modificar:

PS C:\Windows\system32> Get-NetConnectionProfile

Name             : Unidentified network
InterfaceAlias   : vEthernet (Default Switch)
InterfaceIndex   : 10
NetworkCategory  : Public
IPv4Connectivity : NoTraffic
IPv6Connectivity : NoTraffic

Name             : Network 18
InterfaceAlias   : vEthernet (Ether-wifi)
InterfaceIndex   : 15
NetworkCategory  : Private
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic
2-) Utilizando el InterfaceIndex que obtuvimos en el paso anterior, modificamos al tipo de perfil deseado (Las opciones son Private, Public y Domain):

PS C:\Windows\system32> Set-NetConnectionProfile -InterfaceIndex 10 -NetworkCategory Private
PS C:\Windows\system32> Get-NetConnectionProfile



Name             : Unidentified network
InterfaceAlias   : vEthernet (Default Switch)
InterfaceIndex   : 10
NetworkCategory  : Private
IPv4Connectivity : NoTraffic
IPv6Connectivity : NoTraffic


Name             : Network 18
InterfaceAlias   : vEthernet (Ether-wifi)
InterfaceIndex   : 15
NetworkCategory  : Private
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic

Como alternativa, podría usarse el parametro SkipNetworkCheck al habilitar el PSRemoting para que se ignore el tipo de perfil establecido en el adaptador de red:

PS C:\Windows\system32> Enable-PSRemoting -Force -SkipNetworkCheck

sábado, 6 de julio de 2019

PowerShell: Determinar el historial de membresias de grupo en Active Directory

Hay ocasiones en donde es necesario conocer en que momento un usuario fué agregado a un grupo, en estos casos, esta información puede extraerse de Active Directory gracias a ciertos atributos existentes en los metadatos de replicación.

PS C:\Users\Administrador>
PS C:\Users\Administrador> $username = "juan"
PS C:\Users\Administrador> $userobj  = Get-ADUser $username
PS C:\Users\Administrador>
PS C:\Users\Administrador> Get-ADUser $userobj.DistinguishedName -Properties memberOf |
>>  Select-Object -ExpandProperty memberOf |
>>  ForEach-Object {
>>     Get-ADReplicationAttributeMetadata $_ -Server localhost -ShowAllLinkedValues |
>>       Where-Object {$_.AttributeName -eq 'member' -and
>>       $_.AttributeValue -eq $userobj.DistinguishedName} |
>>       Select-Object FirstOriginatingCreateTime, Object, AttributeValue
>>     } | Sort-Object FirstOriginatingCreateTime -Descending

FirstOriginatingCreateTime Object                                               AttributeValue
-------------------------- ------                                               --------------
6/7/2019 17:48:59          CN=Administradores clave,CN=Users,DC=seclab,DC=local CN=juan,CN=Users,DC=seclab,DC=local


PS C:\Users\Administrador> 

Como se ve en la salida del script anterior, con esto puede determinarse en que fecha un usuario fué agregado a uno o mas grupos. Podría ser que necesitamos esa información con fines forenses, o bien para determinar que membresias de grupo podrían ser reducidas en caso de que algún usuario experimente problemas de "token bloat". El script es una colaboración de Ashley McGlone, ex Premier Field Engineer de Microsoft, aquí puede verse el articulo original.

Por último vale mencionar que ademas de funcionar con cuentas de usuario, puede utilizarse con cuentas de equipos, sustituyendo Get-ADUser por Get-ADComputer