Windows NT virtualizado con Hyper-V

Si anteriormente vimos la posibilidad de virtualizar un entorno antiguo con VMware, tambien es posible realizarlo con tecnología Hyper-v de Microsoft. Debemos tener en cuenta que no hay soporte para ratón desde la consola de Hyper-v, deberemos instalar acceso remoto adicional (UltraVNC por ejemplo).

Para la configuración de la conectividad de red, deberemos añadir un "Adaptador de red heredado" e instalar los drivers de red para la tarjeta "Intel 21140 based 10/100 mbps Ethernet Controller" indicando la ruta del driver (habitualmente "D:\i386\WNT40\NDIS40"). Si no disponemos en la máquina virtual de los archivos necesarios, podemos crear un fichero ISO con lo que necesitemos para insertarlo como unidad de CD desde Hyper-v

Una vez tengamos conectividad de red y acceso remoto, podemos facilitar la utilización instalando un driver de pantalla Universal VESA Windows NT para ampliar número de colores y resolución


Virtualización de THEOS Corona

Si lo más habitual es encontrar entornos Windows, Unix/Minix/BSD/Linux/Mac OS X... de vez en cuando te encuentras son sorpresas, como THEOS: The Operating System a camino entre MS-DOS y UNIX.

 

Un SO asociado a un dongle de seguridad con número de serie, los más antiguos con llave en puerto paralelo LPT, nació como base de programas para entornos empresariales en los que la prioridad era la fiabilidad y robustez... actualmente dada las pocas actualizaciones, funciones, desarrolladores... sería un opción poco recomendable...

Nos encontramos con un equipo antiguo, más de 15 años... muy antiguo que con sus achaques sigue funcionando, los requisitos no son nada de otro mundo, se contenta con 512 MB de RAM, disco IDE de 40 GB, procesador AMD Sempron... poco más que decir...

En caso de acabar necesitando instalar desde cero, cada uno de los dongles lleva asociado un código de autorizacion único, si necesitas reinstalar debes tenerlo o solicitarlo al distribuidor.

Casi cualquier equipo de hoy en día será capaz de virtualizar un equipo con estos requisitos, en nuestro caso la versión de THEOS es la más antigua de todas y con puerto paralelo para la mochila de seguridad, necesitaremos virtualizarlo con VMWARE (Hyper-V no permite LPT). Cualquier fallo en el hardware implica un soporte limitado debido a la escasa lista de compatibilidades.

Dado que tenemos nuestro equipo en funcionamiento vamos a ir por pasos:

  1. Apagamos correctamente THEOS Corona mediante el comando shutdown
  2. Conectamos el disco (IDE en nuestro caso) a otro equipo, con un adaptador a USB por ejemplo, es importante no dar formato al disco ni intentar montar las unidades, aunque THEOS tiene soporte para otros formatos, seguramente utilice el suyo propio en la instalación (THEOS/LFS).
  3. Realizamos una clonación/imagen completa del disco, por ejemplo con Macrium, y generamos un fichero con todo el contenido.
  4. Configuramos una máquina virtual con 1 procesador y los mismos 512 MB de RAM en este caso, repasamos el archivos de configuración para asegurarnos la compatibilidad de la tarjeta de red, algunas aplicaciones podrían tener relacionada la dirección física de red, por lo que se recomienda utilizar la misma MAC que el sistema original
    ethernet0.virtualDev = "e1000"
    ethernet0.generatedAddress = "00:0A:BC:CD:EF:GH"
    ...
    parallel0.bidirectional = "FALSE"
    parallel0.fileName = "LPT1"
    parallel0.present = "TRUE"
  5. Con el disco virtual en blanco configurado, añadimos una imagen ISO de Hirens y arrancamos desde el CD la utilidad de Macrium para restaurar el disco tal como estaba en la máquina. Es posible que debas configurar más RAM para el arranque completo de Hirens (2 GB) y luego volver a 512 MB una vez restaurado
  6. Conectamos el dongle LPT y arrancamos, si todo ha ido bien tendremos virtualizado el equipo. No es necesario instalar drivers del dongle LPT en la máquina host.

Otros comandos que serán de utilidad en el proceso:

  • sh ospl: muestra la versión de THEOS, aunque aparece durante el arranque
  • setup net: configuración de la tarjeta de red, será necesario eliminar la antigua y añadir la nueva virtualizada, requiere usuario SYSTEM con permisos
  • show, muestra información básica del sistema
  • show serial, muestra el número de serie del dongle de seguridad conectado
  • disk x (boot, donde "X" es la unidad de disco a reparar el arranque
  • disk s, muestra información de los discos del sistema

Algunos ponen en valor que aplicaciones de hace 20 años sigan funcionando sin incidentes, las funciones y opciones son también de hace 20 años, THEOS no ha evolucionado con la industria, "pero funciona".

 

Enlaces de interés:

LINQ: could not find an implementation of the query pattern

En modelos de datos generados con LINQ de forma automática, el acceso separado en diferentes clases puede ocasionar errores del tipo:

CS1936	Could not find an implementation of the query pattern for source type 'DbSet<nombreTabla>'.  'Where' not found.

A priori puede parecer un error en la implementación, alguna modificación de clases incorrecta, siempre esta la posibilidad de volver a generar el modelo de datos, si el error persiste debemos comprar que tenemos referenciada el espacio de nombres de LINQ

using System.Linq;

 

Una error tan sencillo y obvio que puede resultar confuso de resolver.

Directorio activo hybrido en Azure: ImmutableID / sourceAnchor

Ambos nombres son equivalentes, describen un atributo que no cambia durante la vida de un objecto. Se trata de identificar de forma única en un entorno local y en Azure AD.

Por defecto se calcula codificando en Base 64 la propiedad objectGUID del servidor local, por ejemplo:

$Usuario = Get-ADuser nombreDeUsuario -Properties * -server localhost
$ImmutableID = [system.convert]::ToBase64String(([GUID]($Usuario.ObjectGUID)).tobytearray())

Realmente no debería cambiarse, pero en ocasiones nos encontramos en la necesidad de hacerlo, bien por una migración de directorio, eliminación de usuarios, replicación con errores... Si en lugar de utilizar el objectGUID utilizariamos un atributo personalizado no tendríamos este problema pero conllevaría la gestión y administración del mismo, si dentro de la empresa cada uno tiene un identificador único personal podría utilizarse para calcular el sourceAnchor.

Esta propiedad se establece durante la instalación inicial, solo si se desinstala correctamente se puede volver a establecer con un valor personalizado, desde la versión 1.1.524.0 se facilita el atributo ms-DS-ConsistencyGuidcomo atributo de los usuarios a utilizar como sourceAnchor.

Podemos visualizar la propiedad actual desde PowerShell:

Import-Module AzureAD
$O365Cred = Get-Credential
$O365Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $O365Cred -Authentication Basic -AllowRedirection
Import-PSSession $O365Session
Connect-AzureAD -Credential $O365Cred
Get-AzureADUser -ObjectId nombreUsuario@midominio.com | Select objectID, UserPrincipalName, ImmutableID

Si bien, en la documentación aparece, la posibilidad de establecer el valor en nulo para desvincular las cuentas creadas localmente de la nube mediante powershell:

Set-AzureADUser -ObjectId nombreUsuario@midominio.com -ImmutableID $null

No genera ningún resultado ni modificación del objeto, por lo menos a fecha de hoy.

Como alternativa, podemos crear un usuario temporal en nuestro directorio, sincronizar e intercambiar sourceAnchor, asignando otro incorrecto al usuario a eliminar posteriormente.

 

 

Activar escritorio remoto mediante Powershell

Por defecto la conexión por escritorio remoto aparece deshabilitada en los equipos con Windows Pro, en una red de dominio es posible establecer mediante políticas de grupo los permisos necesarios:

- Configuración de Equipo \ Directivas \ Plantillas Administrativas
--- Componentes de Windows \ Servicios de escritorio remoto \ Host de sesión de Escritorio remoto \ Conexiones \ Permitir que los usuarios se conecten de forma remota mediante Servicios de Escritorio Remoto

--- Red \ Conexiones de red \ Firewall de Windows \ Perfil de dominio \ Firewall de Windows: permitir excepciones de Escritorio remoto entrantes

Igualmente podemos echar mano de un Script para powershell escrito por Sitaram Pamarthi en 2013, que mediante WMI nos facilita acciones puntuales:

[cmdletbinding()]
param(
	[parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
	[string[]]$ComputerName = $env:computername,
	[ValidateScript({Test-Path $_})]
	[string]$OutFolder = "c:\"
)

begin {
$SuccessComps = Join-Path $OutFolder "Successcomps.txt"
$FailedComps = Join-Path $OutFolder "FailedComps.txt"
}

process {
	foreach($Computer in $ComputerName) {

		try {
			$RDP = Get-WmiObject -Class Win32_TerminalServiceSetting `
								-Namespace root\CIMV2\TerminalServices `
								-Computer $Computer `
								-Authentication 6 `
								-ErrorAction Stop
								
		} catch {
			Write-Host "$Computer : WMIQueryFailed"
			"$Computer : WMIQueryFailed" | Out-File -FilePath $FailedComps -Append
			continue
		}
		
		if($RDP.AllowTSConnections -eq 1) {
			Write-Host "$Computer : RDP Already Enabled"
			"$Computer : RDP Already Enabled" | Out-File -FilePath $SuccessComps -Append
			continue
		} else {
			try {
				$result = $RDP.SetAllowTsConnections(1,1)
				if($result.ReturnValue -eq 0) {
					Write-Host "$Computer : Enabled RDP Successfully"
					"$Computer : RDP Enabled Successfully" | Out-File -FilePath $SuccessComps -Append
				} else {
					Write-Host "$Computer : Failed to enabled RDP"
					"$Computer : Failed to enable RDP" | Out-File -FilePath $FailedComps -Append

				}
			
			} catch {
				Write-Host "$computer : Failed to enabled RDP"
				"$Computer : Failed to enable RDP" | Out-File -FilePath $FailedComps -Append
			}
		}
	}

}

end {}

Su utilización para un equipo concreto:

.\Enable-RDPAccess.ps1 -ComputerName <computer name>

 Si obtenemos errores al ejectuarlo, debemos comprobar que tenemos acceso mediante WMI o activarlo mediante GPO:

- Configuración del equipo \ Directivas \ Configuración de Windows \ Configuración de seguridad \ Firewall de Windows con seguridad avanzada \ Reglas de Entrada