viernes, 28 de junio de 2013

Conocer el lenguaje del sistema operativo en un equipo vía powershell

Hola.

Con el siguiente script, tendréis en la variable $code el resultado de la consulta del tipo de lenguaje del sistema operativo.

$solenguaje = Get-WmiObject Win32_OperatingSystem

$code= switch($solenguaje.oslanguage){

default {“Unknown”);

3082 {“Spanish”};

1033 {“English”}

}

Esta información se basa en estos códigos de lenguaje:

http://www.science.co.il/language/Locale-Codes.asp

Saludos.

miércoles, 26 de junio de 2013

Comportamiento y scripts de inicio de imagen con Sysprep

Hola.

Dos rutas para muchos desconocidas y para otros ultra mega super utilizadas, existentes en sistemas operativos Microsoft, han sido creadas con la intención de albergar los archivos con el script a acometer durante el primer arranque tras despertar de un sysprep.

La primera de las dos, es la ruta %WINDIR%\Panther\unattend\ donde albergaríamos el archivo unattend.xml creado con la herramienta Windows System Image Manager, disponible gratuitamente y que forma parte de las herramientas WAIK ( http://www.microsoft.com/en-us/download/details.aspx?id=5753).

Al albergar en esta ruta el archivo nombrado, el equipo al despertar, irá contestando cada una de las típicas preguntas de inicio de Windows sin que el usuario tenga que interactuar y pudiendo así, asegurarnos que todo nuestro parque obtiene la misma configuración.

La segunda de las dos rutas es %WINDIR%\Setup\Scripts\ donde alojando un archivo con nombre setupcomplete.cmd, provocamos que el sistema, durante el primer inicio que realice, ejecutará cada una de las acciones allí almacenadas, como por ejemplo el test de Aero para tener una experiencia gráfica completa o la llamada a un script .vbs donde suele ser habitual cambiar el nombre dele quipo para que nuestro parque cuente con un patrón de nombres similar y típico también es, encontrar un  “joindomain” para introducir el equipo en dominio en el primer arranque.

Ejemplo:

Setupcomplete.cmd

cscript %windir%\system32\oobe\prestage\RenameAndJoinDomain.vbs

REM Aero test
winsat.exe formal

REM aquí podríamos forzar también bitlocker.

manage-bde -on c: -skiphardwaretest –recoverypassword

REM es importante borrar el unattend.xml porque puede contener información importante como nuestra clave de Windows

del /f /q %WINDIR%\Panther\unattend\unattend.xml

shutdown /r /f /t 5

Para que nuestro despertar sea correcto, previamente, al finalizar la instalación del equipo modelo y tras instalar todos los componentes que queremos en nuestra maqueta corporativa y  por ejemplo también, drivers que no incluya el sistema por defecto y que van a ser dispositivos que podría encontrar nuestro equipo al despertar, tenemos que “dormir” el sistema. Para ello, podemos crear un script como por ejemplo el siguiente:

Sysprep.cmd

copy /y .\unattend.xml %WINDIR%\Panther\unattend\unattend.xml
copy /y  .\setupcomplete.cmd %WINDIR%\Setup\Scripts\SetupComplete.cmd

%WINDIR%\system32\sysprep\sysprep.exe /oobe /generalize /shutdown 

Sysprep : http://technet.microsoft.com/es-es/library/cc721940(v=ws.10).aspx

Tras la realización de estos pasos, podéis clonar el disco tal y como muchos me habéis dicho que soléis hacer pero con la imagen sin sysprep, lo cual no es nada aconsejable por cierto y diría que totalmente inviable si hablamos de equipos en dominio.

En una posterior entrada, hablaré de como convertir esta imagen en un archivo .wim y como desplegar manipular ese archivo posteriormente hasta el punto del despliegue.

Saludos.

Introducir a un usuario en grupo de administradores locales

Hola.

Puestos a publicar scripts, os publico uno rápido que tengo hecho y aunque es mejorable :). Es válido perfectamente en una empresa donde se pasa por un filtro el que un usuario sea administrador de su equipo o no:

$strDomain = "dominio"
$strComputer = Read-Host "Ordenador"
$strUser = Read-host "Usuario"

$computer = [ADSI]("WinNT://" + $strComputer + ",computer")
$group = $computer.psbase.children.find("Administradores")
$group.Name

function ListAdministrators

{$members = $group.psbase.invoke("Members") | %{$_.GetType().InvokeMember("Name",'GetProperty',$null,$_,$null)}
$members}

$group.Add("WinNT://" + $strDomain + "/" + $strUser)
ListAdministrators

 

La penúltima línea, la podéis modificar y crear un script con :

$group.Remove("WinNT://" + $strDomain + "/" + $strUser)

Para que el script pase a borrar el usuario del grupo.

Advierto que es muy mejorable, por ejemplo el hecho de que busque la cadena “Administradores”, ya que si el s.o. está en inglés ya la cadena es “Administrators”, pero bueno, siempre se puede hacer un if y esa clase de cosas.

martes, 25 de junio de 2013

Script completo para preparar equipo y lanzar Bitlocker.

Hola.

Hago público el script del que os he hablado estos días.

Este Script, está hecho para que encuentre los portátiles como los encuentre, vaya mandando el comando correspondiente e irá preparando el equipo hasta lanzar el comando que cifra la unidad C:. No hace falta decir que se puede llevar al logonscript del dominio o como es mi caso, lanzarlo de forma continuada en los próximos logon vía SCCM.

Cabe destacar, que para mi, es importante que se apliquen los cambios en la gpo del dominio para que se almacene la clave de bitlocker en directorio activo.

Por partes:

#Comprobamos que la partición de boot está creada por debajo del tamaño Default ya que también se suele crear de 100mb.

    if( $Partitionstatus.size -gt 314572800) { 
        VENTANAPARTREINICIO
        bdehdcfg -target default -restart -quiet
    } 

#comprobamos que hay conectividad con alguno de los DCs antes de lanzar el cifrado ya que las directivas nos obligan a guardar la clave de bitlocker (de todas formas, no habiendo conectividad no funcionaría porque la directiva así lo ordena).

Function CONEXIONREDCIFRADODISCO
{
    $Ping1DC = Test-Connection "!DC1" -Count 1 -Quiet
    $Ping2DC = Test-Connection "!DC2" -Count 1 -Quiet
    if (($Ping1DC -eq $true) -or ($Ping2DC -eq $true)) {
        VENTANANOREINICIO
        manage-bde -on c: -skiphardwaretest -recoverypassword
    }

}

#Comprobamos que el equipo forma parte del dominio, que bitlocker no cifra ya el disco, que la partición es menor y que el equipo es un portátil.

If (($compconfig.domain -eq "!dominio.local") -and ($bitlockstatus -ne "1") -and ($Partitionstatus.size -le 314572800) -and ($tipoequipo -eq "2")) {

 

#----------------------------------------------------------------------------------
#Script para preparar equipos portátiles y lanzar bitlocker en unidad c:
#
# Realizado por Miguel Hernández
#
#Para personalizar este script ha de buscar el signo ! .
#----------------------------------------------------------------------------------

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$tpm = Get-WmiObject -class Win32_Tpm -namespace "root\CIMV2\Security\MicrosoftTpm"
$BitLockDrive = get-wmiobject -namespace root\CIMv2\Security\MicrosoftVolumeEncryption -class Win32_EncryptableVolume -filter "driveletter='c:'"
$Partitionstatus= Get-WmiObject Win32_DiskPartition -filter "bootpartition='True'"
$CompConfig = Get-WmiObject -Class Win32_ComputerSystem

##obtenemos el tipo de equipo = 1 {"Desktop"},2 {"Laptop"},3 {"Workstation"},4 {"EntServer"},5 {"SmallOfficeOrHomeServer"},6 {"AppliancePC"},7 {"PerformanceServer"},8 {"Maximum"},default {"NoConocido"}
$tipoequipo = $CompConfig.PCSystemType

#Obtenemos la información de si bitlocker ya cifra la unidad
$bitlockstatus = $BitLockDrive.protectionstatus

#-------------------------------------------------------------------------------
#Funciones
#-------------------------------------------------------------------------------

function VENTANAPARTREINICIO
{

#Ventana Form donde se comunica el reinicio

$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "IT Department."
$objForm.Size = New-Object System.Drawing.Size(300,220)
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
    {$x=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")
    {$objForm.Close()}})

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(80,150)
$OKButton.Size = New-Object System.Drawing.Size(120,25)
$OKButton.Text = "Accept"
$OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)

$objLabel0 = New-Object System.Windows.Forms.Label
$objLabel0.Location = New-Object System.Drawing.Size(10,10)
$objLabel0.Size = New-Object System.Drawing.Size(280,30)
$objLabel0.Text = "Como parte del proceso de cifrado se va a preparar la unidad de disco de este equipo."
$objForm.Controls.Add($objLabel0)

$objLabel1 = New-Object System.Windows.Forms.Label
$objLabel1.Location = New-Object System.Drawing.Size(10,45)
$objLabel1.Size = New-Object System.Drawing.Size(280,30)
$objLabel1.Text = "Por favor, cierre todo los programas abiertos ya que al finalizar este proceso el ordenador se reiniciará."
$objForm.Controls.Add($objLabel1)

$objLabel0 = New-Object System.Windows.Forms.Label
$objLabel0.Location = New-Object System.Drawing.Size(10,85)
$objLabel0.Size = New-Object System.Drawing.Size(280,30)
$objLabel0.Text = "As part of Encrypting process it will be prepared the computer's hard drive."
$objForm.Controls.Add($objLabel0)

$objLabel1 = New-Object System.Windows.Forms.Label
$objLabel1.Location = New-Object System.Drawing.Size(10,115)
$objLabel1.Size = New-Object System.Drawing.Size(280,30)
$objLabel1.Text = "Please close all your opened programs because the computer will be restarted."
$objForm.Controls.Add($objLabel1)

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

}

function VENTANAREINICIO
{
#Ventana Form donde se comunica el reinicio

$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "IT Department."
$objForm.Size = New-Object System.Drawing.Size(300,220)
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
    {$x=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")
    {$objForm.Close()}})

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(80,150)
$OKButton.Size = New-Object System.Drawing.Size(120,25)
$OKButton.Text = "Accept"
$OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)

$objLabel0 = New-Object System.Windows.Forms.Label
$objLabel0.Location = New-Object System.Drawing.Size(10,10)
$objLabel0.Size = New-Object System.Drawing.Size(280,30)
$objLabel0.Text = "Se va a proceder a la activación del cifrado de su disco."
$objForm.Controls.Add($objLabel0)

$objLabel1 = New-Object System.Windows.Forms.Label
$objLabel1.Location = New-Object System.Drawing.Size(10,40)
$objLabel1.Size = New-Object System.Drawing.Size(280,30)
$objLabel1.Text = "Tras reiniciar, si su equipo es HP tendrá que pulsar la tecla F1 y si es TOSHIBA la tecla F10."
$objForm.Controls.Add($objLabel1)

$objLabel0 = New-Object System.Windows.Forms.Label
$objLabel0.Location = New-Object System.Drawing.Size(10,75)
$objLabel0.Size = New-Object System.Drawing.Size(280,20)
$objLabel0.Text = "It will proceed to activate the hard drive encryption."
$objForm.Controls.Add($objLabel0)

$objLabel1 = New-Object System.Windows.Forms.Label
$objLabel1.Location = New-Object System.Drawing.Size(10,95)
$objLabel1.Size = New-Object System.Drawing.Size(280,40)
$objLabel1.Text = "After restarting your computer if it an HP you will need to press the F1 Key however if it is a TOSHIBA press the F10 key."
$objForm.Controls.Add($objLabel1)

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

}

function VENTANANOREINICIO
{
#Ventana Form donde se comunica el proceso

$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "IT Department."
$objForm.Size = New-Object System.Drawing.Size(300,220)
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
    {$x=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")
    {$objForm.Close()}})

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(80,150)
$OKButton.Size = New-Object System.Drawing.Size(120,25)
$OKButton.Text = "Accept"
$OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)

$objLabel0 = New-Object System.Windows.Forms.Label
$objLabel0.Location = New-Object System.Drawing.Size(10,10)
$objLabel0.Size = New-Object System.Drawing.Size(280,20)
$objLabel0.Text = "Se va a lanzar el proceso de cifrado de su disco."
$objForm.Controls.Add($objLabel0)

$objLabel1 = New-Object System.Windows.Forms.Label
$objLabel1.Location = New-Object System.Drawing.Size(10,30)
$objLabel1.Size = New-Object System.Drawing.Size(280,40)
$objLabel1.Text = "Usted podrá trabajar con normalidad, aunque apreciará cambios en el espacio libre de su unidad de disco."
$objForm.Controls.Add($objLabel1)

$objLabel0 = New-Object System.Windows.Forms.Label
$objLabel0.Location = New-Object System.Drawing.Size(10,85)
$objLabel0.Size = New-Object System.Drawing.Size(280,20)
$objLabel0.Text = "It will proceed to activate the hard drive encryption."
$objForm.Controls.Add($objLabel0)

$objLabel1 = New-Object System.Windows.Forms.Label
$objLabel1.Location = New-Object System.Drawing.Size(10,105)
$objLabel1.Size = New-Object System.Drawing.Size(280,30)
$objLabel1.Text = "You can work normally although during this process the hard drive free space will changes."
$objForm.Controls.Add($objLabel1)

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

}

#Prepara el disco para bitlocker
function PREPDISCO 
{

    if( $Partitionstatus.size -gt 314572800) {
        VENTANAPARTREINICIO
        bdehdcfg -target default -restart -quiet
    } 
}

#Comprobamos que estamos en red.
Function CONEXIONREDCIFRADODISCO
{
    $Ping1DC = Test-Connection "!DC1" -Count 1 -Quiet
    $Ping2DC = Test-Connection "!DC2" -Count 1 -Quiet
    if (($Ping1DC -eq $true) -or ($Ping2DC -eq $true)) {
        VENTANANOREINICIO
        manage-bde -on c: -skiphardwaretest -recoverypassword
    }

}

#-------------------------------------------------------------------------------
#Ejecución script general
#-------------------------------------------------------------------------------

PREPDISCO

#Entrará en el if si el disco no está cifrado, la unidad de disco está preparada, es un portátil y está en dominio
If (($compconfig.domain -eq "!dominio.local") -and ($bitlockstatus -ne "1") -and ($Partitionstatus.size -le 314572800) -and ($tipoequipo -eq "2")) {
    if (($tpm.isEnabled_InitialValue -eq $true) -and ($tpm.isActivated_InitialValue -eq $true) -and ($tpm.IsOwned_InitialValue -eq $true)){
        #TPM está listo para habilitar bitlocker    
        CONEXIONREDCIFRADODISCO
    }
    elseif (($tpm.isEnabled_InitialValue -eq $true) -and ($tpm.isActivated_InitialValue -eq $true) -and ($tpm.IsOwned_InitialValue -eq $false)){
        #Se obtendrá propiedad de tpm"
        $valor=1
        manage-bde -tpm -takeownership %date%%random%%random%
        CONEXIONREDCIFRADODISCO
    }
    elseif (($tpm.isEnabled_InitialValue -eq $false) -and ($tpm.isActivated_InitialValue -eq $false) -and ($tpm.IsOwned_InitialValue -eq $false)){
        #TPM Se pondrá en ON y se forzará reinicio
        VENTANAREINICIO
        manage-bde -tpm -t
        shutdown -r -t 60 
    }
    elseif (($tpm.isEnabled_InitialValue -eq $false) -and ($tpm.isActivated_InitialValue -eq $false) -and ($tpm.IsOwned_InitialValue -eq $true)){
        #TPM Se pondrá en ON y se forzará reinicio
        VENTANAREINICIO
        manage-bde -tpm -t
        shutdown -r -t 60
    }
    elseif (($tpm.isEnabled_InitialValue -eq $true) -and ($tpm.isActivated_InitialValue -eq $false) -and ($tpm.IsOwned_InitialValue -eq $false)){
           #TPM está encendido peri no activado, se activará y forzará reinicio
        VENTANAREINICIO
        manage-bde -tpm -t
        shutdown -r -t 60
    }
}

lunes, 24 de junio de 2013

Aplicar script solo a un tipo de equipo / servidor

Hola.

Muchas veces, uno de los condicionantes a la hora de aplicar un script, es aplicarlo solo a equipos y no a servidores e incluso a portátiles y no a puestos de trabajo.

Si os encontráis en esta situación, incluso como medida de protección ante scripts que vayáis a aplicar a una directiva aplicada a, por ejemplo, la ou donde debería haber un tipo de equipos, incluso una directiva aplicada a una consulta wmi que aplique solo a ciertos equipos, mejor aseguraros en el propio script que este, solo se aplicará si encontramos el tipo de equipo deseado, por ejemplo así:

  • $CompConfig = Get-WmiObject -Class Win32_ComputerSystem
  • $tipoequipo = $CompConfig.PCSystemType

$tipoequipo puede ser:

  • 1 {"Desktop"},2 {"Laptop"},3 {"Workstation"},4 {"EntServer"},5 {"SmallOfficeOrHomeServer"},6 {"AppliancePC"},7 {"PerformanceServer"},8 {"Maximum"},default {"NoConocido"}

Si queréis el nombre, podéis añadir esto:

Switch ($tipoequipo) {
   1 {"Desktop"}
   2 {"Mobile / Laptop"}
   3 {"Workstation"}
   4 {"Enterprise Server"}
   5 {"Small Office and Home Office Server"}
   6 {"Appliance PC"}
   7 {"Performance Server"}
   8 {"Maximum"}
default {"Not a known Product Type"}
}

 

En cuanto a equipos de dominio podemos también extraer información:

$TipoOrdenador = Get-WmiObject Win32_ComputerSystem
$Rol = $TipoOrdenador.DomainRole

 

Switch ($Rol) {
   0 {"Standalone Workstation"}
   1 {"Member Workstation"}
   2 {"Standalone Server"}
   3 {"Member Server"}
   4 {"Backup Domain Controller"}
   5 {"Primary Domain Controller"}
   default {"Not a known Domain Role"}
}

 

Tras esto, el condicionante podría ser:

If (($tipoequipo -eq "Desktop") -and ($Roldeservidor -eq "Member Workstation")) then {

}

Saludos.

viernes, 21 de junio de 2013

Comprobación de requisitos y preparación de disco previo a la activación de bitlocker vía cmd y powershell

Hola.

Como requisito del proceso de cifrado del disco, es imprescindible que nuestro boot esté en una partición diferente a la partición que almacena nuestro o nuestros sistemas operativos.

Si disponéis de esta partición, podéis ver que en el administrador de discos, aparece sin letra y con un tamaño que ronda los 100 a 300mb.

Si no disponéis de esta partición y queréis activar bitlocker via scripting, por supuesto debéis crearla y el comando para que el sistema haga un shrink, traslade archivos de boot y modifique el bcdedit, es el siguiente:

  • bdehdcfg -target default -restart –quiet   #pongo default por hacerlo fácil, esto nos dará una partición de 314572800bytes que redondeando son  300mb.

A mi me aparece la necesidad de comprobar vía scripting que esta partición existe y he utilizado los siguientes comandos:

$Partitionstatus= Get-WmiObject Win32_DiskPartition -filter "bootpartition='True'"

if( $Partitionstatus.size -gt 314572800) {
    VENTANAPARTREINICIO  #función mía que lanza una ventan con aviso de reinicio
    bdehdcfg -target default -restart -quiet
}

saludos.

Posibles estados del chip TPM y gestión de bitlocker vía Cmd y Powershell

 

En este artículo, voy a intentar plasmar las posibles situaciones en las que podemos encontrar y posicionar el chip TPM, con el fin de activar Bitlocker en los equipos de nuestro parque.

Lo primero que debemos conocer es que el comando Manage-bde es el que nos permitirá ir cambiando el estado del chip, los comandos son:

  • manage-bde –tpm –t  #activa tpm
  • manage-bde –tpm –takeownership contraseña   #Para tomar propiedad del chip si no somos propietarios.
  • manage-bde –on c: –skiphardwaretest –recoverypassword  #Para lanzar bitlocker en la unidad c:

Lo segundo que debemos conocer es que como inevitablemente el scripting va a formar parte imprescindible del proceso, hay ciertos comandos y consultas wmi que nos harán conducir el proceso.

Primero y antes de nada, la consulta wmi y la clase que extraerá la información es:

$tpm = Get-WmiObject -class Win32_Tpm -namespace "root\CIMV2\Security\MicrosoftTpm"

De la información extraida en la variable $tpm, nos importa esto:

$tpm.isEnabled_InitialValue = True or False   #¿Está habilitado?.

$tpm.isActivated.InitialValue = True or False  #¿Está activado?.

$tpm.isOwned_InitialValued = True or False  #¿Somos el propietario?.

 

Y esto nos puede dar las siguientes condiciones y debemos entonces actuar como se describe:

(($tpm.isEnabled_InitialValue -eq $true) -and ($tpm.isActivated_InitialValue -eq $true) -and ($tpm.IsOwned_InitialValue -eq $true))  #entonces solo queda activar con “manage-bde –on c:….”

(($tpm.isEnabled_InitialValue -eq $true) -and ($tpm.isActivated_InitialValue -eq $true) -and ($tpm.IsOwned_InitialValue -eq $false))  #Debemos hacernos propietarios y activar 1. manage-bde –tpm –takeownership contraseña y 2. manage-bde –on c:…

 

#Requieren activación de tpm “ manage-bde –tpm –t” el resto de condiciones:

(($tpm.isEnabled_InitialValue -eq $false) -and ($tpm.isActivated_InitialValue -eq $false) -and ($tpm.IsOwned_InitialValue -eq $false))

(($tpm.isEnabled_InitialValue -eq $false) -and ($tpm.isActivated_InitialValue -eq $false) -and ($tpm.IsOwned_InitialValue -eq $false))

Y

(($tpm.isEnabled_InitialValue -eq $true) -and ($tpm.isActivated_InitialValue -eq $false) -and ($tpm.IsOwned_InitialValue -eq $false))

 

Saludos.

Interactuar con usuario en tarea programada

Hola.

Uno de los problemas comunes, al programar tareas programadas via gpo a todos o parte de los equipos del parque, es que queremos interactuar con el usuario y esto choca con el usuario que debemos poner en la tarea con privilegios para que la tarea sea lanzada.

Pues bien, para que las ventanas y/o scripts salten en la sesión del usuario, debemos hacer que la tarea se ejecute con el usuario localhost\usuarios

Para ello cuando estamos en el menú “General” – debemos elegir el usuario que os he comentado y podéis ver aquí:

image

 

Saludos.

Provocar ventana en tarea programada

Hola.

La forma de hacer que aparezca al usuario una ventana con una información concreta, disparada por una tarea programada es la siguiente:

 

1. Menú Acciones en tarea programada.

2. Crear una nueva acción con las opciones: Iniciar un programa – Powershell en “Programa o script” y en “Agregar argumentos (opcionar"), utilizar el siguiente argumento:

-WindowStyle hidden -Command "& {[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Your_Desired_Message',’texto a aparecer’)}"

 

image

Saludos.

jueves, 20 de junio de 2013

Encontrar cadena de texto en powershell

Hola.

Estoy metido de lleno en un script para lanzar bitocker y me surge la necesidad de saber si el disco está cifrado para crear un if en el script.

Pues bien, la forma más fiable de todas las posibles es encontrar la cadena 0% en la información que devuelve manage-bde, para ello he utilizando:

 

$status=manage-bde c: -status
$id = $status -match "0%" | Out-String

if ($id -like '* 0%*') {
    entonces…
}

 

Saludos.

Cambiar la propiedad de del chip TPM con contraseña aleatoria

Hola.

Pongámonos en situación. Tenemos un equipo con bitlocker activado, en el que para volver a instalar windows y activar Bitlocker, hemos roto la partición y vuelvo a crear otra nueva.

La instalación la haremos sin problema, pero la activación de bitlocker ya no es tan fácil ya que el chip está en modo ON y la contraseña de acceso no la tenemos.

Ante una situación como la descrita y otras muchas donde no somos propietarios o hemos borrado el contenido y password del chip a través de la bios, la solución es la misma. Tenemos que hacernos propietarios de ese chip y para ello, el comando es el siguiente:

  • manage-bde –tpm –takeownership PASSWORD

Para mí y para muchos, ya que he podido comprobar que los foros están repletos de dudas y pocas o ninguna solución, el problema que aprecio es que la password, en un script está en texto plano e incluso, si tienes un parque medianamente extenso, va a ser la misma en todos los equipos.

Es importante subrayar que esta password, no necesitamos conocerla, ya que podemos solucionar cualquier incidencia con la clave de bitlocker que habremos almacenado en archivos de texto o mejor aun, en directorio activo gracias a una gpo correctamente configurada.

Pues bien,  tras las pruebas realizadas :), el comando que os he mostrado anteriormente se puede sustituir por:

  • manage-bde –tpm –takeownership %random%

Esto tiene un problema y es que el random puede ir des 0 a una cantidad de 4 crifras y como manage-bde te obliga a que la contraseña sea de 8 cifras, tampoco nos valdría con un %random%%random%

Pues bien, tras las pruebas realizadas (2), he optado por:

  • manage-bde –tpm –takeownership %time%%random%%random%.

¿Ingenioso eh? :), así tenemos una contraseña fuerte a prueba de auditores quisquillosos.

jueves, 13 de junio de 2013

DNS block list en Windows Server

Hola.

Un olvidado a la hora de aumentar la seguridad de nuestra red es el servicio de blocklist de nuestro DNS, este servicio es administrable en su totalidad e incorpora una lista de direcciones, que para no ahondar mucho más en él, podemos decir que no se resolverán aunque tengamos una entrada host , alias, etc. creada.

El ejemplo más claro lo vemos cuando queremos publicar un servicio proxy pac vía dns y creamos la entrada, que debería resolver wpad.dominio.local por ejemplo.

Captura donde podéis ver que no podemos hacer ping a la dirección:

image

Gestión de la Blocklist

Comandos comunes en la gestión de este servicio son:

  • dnscmd servidor /info /globalqueryblocklist    - Nos enseña la lista de direcciones bloqueadas.
  • dnscmd Servidor /config /globalqueryblocklist nombre nombre nombre …   - Añade una o varias direcciones
  • dnscmd servidor /config /enableglobalqueryblocklist 0|1  - 0 Deshabilida  1 Habilita Blocklist
  • dnscmd /config /globalqueryblocklist  - Vacia la lista de direcciones.

Por defecto tenemos en la lista wpad y Isatap:

image

Y tras el reseteo de la lista:

image Saludos.

lunes, 3 de junio de 2013

Nuevas funcionalidades en Hyper-V dentro de Windows Server 2012 R2

 

Hola.

Hoy se han presentado bastantes novedades de lo que va a ser el nuevo rol de Hyper-V dentro de Windows Server 2012 R2 y que junto a System Center 2012 R2, también se ha dicho que en Junio será pública una Release Candidate.

Nuevas funcionalidades:

1. Replica extendida. El servidor que recibe la réplica, podrá ser a su vez un emisor hacia otro servidor de backup = Server A replica a server B y a su vez, replica a server C. También podremos controlar el intervarlo de envío de los logs al servidor de réplica.

2. Máquinas virtuales de nueva generación. Este es un concepto que a todos nos resulta nuevo, pero a falta de una exhaustiva investigación Sonrisa, son máquinas virtuales sin relación con el hardware, no dispositivos legados, no bios, todo virtual y sin dependencias.

3.Remote Desktop Services integrado en el VM Bus, lo que le va a hacer, independiente del adaptador de red.

4.Redimensionamiento Online de VHDX. Creo que la descripción lo explica todo.

5.USB como pass-trough Hoy mismo lo he echado en falta Sonrisa.

6.Compatibilidad total con Azure ya que, según Microsoft, en Azure contaremos con la misma versión de host de la que ofrece el sistema operativo que adquiriremos.

7.Online VM Export. Podremos exportar máquinas virtuales sin interrupción.

8.Live migration más rápido. Se comprimirá los datos antes de ser migrados lo que acelerará la migración en vivo. A esto se suma que se podrá combinar con las ventajas que aporta SMB direct y las nuevas versiones de SMB.

9.Activación automática de VMS. Veremos como funciona pero sabiendo que las VMS ya se puede decir que se licencian gracias a la compra del host, lo que he leido está relacionado con la activación única del host (esto es una teoría personal a falta de analizar al 100% esta funcionalidad).

10. Qos para el almacenamiento. Podremos controlar y gestionar los I/o y peso de una VM en relación a la ocupación del almacenamiento. Lo que se suma al ya antiguo Sonrisa control del peso en cuanto al uso del procesador y control de la memoria que ofrecía Dynamic Memory.

Saludos.

Limpiar Proxy pac cacheado en equipos

 

Hola.

Las últimas semanas he estado trabajando mucho en relación a la publicación de proxy pac que está detrás de la opción “Detectar automáticamente la configuración” a la hora de que el equipo, encuentre la salida correcta por internet.

En los próximos días colgaré bastante información bajo la etiqueta Proxypac, la cual espero que os sea útil si tenéis que realizar pruebas y su posterior puesta en producción.

Por el momento quería dejar publicados los pasos necesarios para limpiar todo rastro de la caché del archivo proxy pac. Esta información es útil ya que como el S.O. cachea este archivo, comprobar cada cambio se convierte en una verdadera pesadilla:

Limpiar caché manualmente:

1. Borrar  por completo el historial del navegador .

2. Abrir un CMD como Administrador.

3. Ejecutar el comando: Del \wpad*.dat /s  (cuidado, borrará cualquier archivo proxy pac que tengáis en el disco.

4. Ejecutar el archiconocido: ipconfig /flushdns

5. Ejecutar: nbtstat –r

6. Abrir navegador.

También deciros que por mi experiencia, Firefox parece que al menos a mí, no me cachea el proxy pac, por lo que en producción va a resultar un tanto pesado, pero para hacer troubleshooting es ideal.

Si quisierais desactivar el cacheado del proxy en todo o parte del parque, os dejo un KB de Microsoft donde podéis ver como se hace, pero, de todas formas, yo limpiaría manualmente la caché en los equipos donde aunque hayáis aplicado esta política o modificación de registro, queráis estar completamente seguros que está cogiendo el proxy pac publicado.

http://support.microsoft.com/kb/271361/es

 

Saludos.

Instalar características de ws2012 offline eligiendo fuente de datos

 

Hola.

Cuando instaláis una  característica (Feature) o Rol en Windows Server 2012 o Windows 8, os podéis encontrar que sin conexión a internet o contando con una conexión filtrada a través de un proxy, no la activación de estas, no pueda realizarse.

Para solucionar este problema, debéis indicar una fuente de datos correcta ya que Internet, como tal, no es una posibilidad.

Por tanto:

1. Debéis descomprimir el Iso de Ws2012 y/o W8 o copiar el contenido del dvd en una carpeta.

2. Utilizar este comando para la activación de:

dism.exe /online /enable-feature /featurename:Feature /Source:Unidad:\sources\sxs /LimitAccess /all

Ejemplo .Net Framework:

dism.exe /online /enable-feature /featurename:NetFX3 /Source:e:\isos\sources\sxs /LimitAccess /all

Esta es una consulta más o menos común en los foros, pero atentos, pocas instrucciones dadas en estos, añaden la variable /all la cual habilita la activación de dependencias y por tanto, el comando falla fácilmente.

Saludos