BranchCache Distributed 2/3

Miércoles, 14 de agosto de 2013 Sin comentarios

 

La descripción de funcionamiento de BranchCache en modo distribuido sería la siguiente.

Escenario:

1. Servidor Windows Server 2008 R2 con rol de servidor de ficheros, carpeta compartida y en esta última, tenemos marcada la opción de BranchCache o si se trata de http, debemos tener publicado la carpeta donde se almacena la web.

2. Equipo cliente A con Branchacache activado vía gpo o en gpedit local y reglas de firewall en modo permitido.

3. Equipo cliente A, tiene configurado mediante gpo o gpedit local, el tiempo de corte por el cual, si el servidor funciona más lento del tiempo establecido, el archivo se cacheará y será ofrecido a otros pcs de la Lan.

3. Equipo cliente B igual a equipo cliente A.

Funcionamiento:

1. El equipo cliente A, solicita a servidor los identificadores del archivo que necesita. Esta solicitud puede ser Http, bits o smb, mediante también https o ipsec.

2. El cliente A, busca en local y en su LAN mediante WS-Discovery, en este primer uso, el archivo nunca ha sido descargado.

3. El cliente A, descarga el archivo desde el servidor.

4. El cliente B, solicita a servidor los identificadores del archivo que necesita. Esta solicitud puede ser Http, bits o smb mediante también https o ipsec.

5. El cliente B, busca en local y en su LAN mediante WS-Discovery. En este segundo uso, el archivo previamente ha sido descargado por el Cliente A.

6. El cliente B, comprueba que la comunicación con el servidor es mayor y por tanto más lenta en milisegundos que lo establecido en la gpo o gpedit local.

6. El cliente A, ofrece a cliente B el archivo.

Hasta aquí, la descripción de como funciona el servicio.

Configuraciones

Servidor:

1. Instalar característica File server y  Branchcache.

2. Directiva de equipo local o gpo – Equipo – Plantillas administrativas – Red – Servidor lanman –Publicación de hash para BranchCache – Habilitado y elegir una de las opciones, yo prefiero – Permitir publicación de hash para shares con branchcache habilitado.

SMB

1. Activar rol de servidor de ficheros.

2.Compartir una carpeta

3. Propiedades – compartido – avanzado – cacheado – marcar “Enable BranchCache”.

SMB en clúster

Si vais a utilizar smb en clúster, tenéis que lanzar en todos los nodos el siguiente comando: netsh branchcache set key passphrase=“frase secreta”, debéis repetir la misma frase en todos los nodos.

HTTP

1. Lanzar CMD como adminsitrador

2. publish-bcwebcontent (ruta de la web: ej.c:\inetpub\wwwroot )

Equipos cliente:

1. La gpo o gpedit local en los equipos cliente deben tener configurado:

  1. Ir a Computer\Plantillas administrativas\network\BranchCache
  2. Activar BranchCache – Enable
  3. Establecer el modo Caché distribuida de BranchCache – Enable
  4. Configurar BranchCaché para archivos de red – 0ms. si queremos cachear siempre o más milisegundos si queremos un tiempo de corte.
  5. Establecer el porcentaje de espacio en disco usado por la memoria caché del equipo cliente – Cifra en porcentaje

2. Configuración de Firewall:

  1. Firewall de windows con seguridad avanzada
  2. Reglas de entrada-botón derecho-nueva regla-predefinida- BranchCache: detección del mismo nivel (usa WSD) y BranchCache: recuperación de contenido (usa HTTP).
    Si se trata de un pequeño número de equipos, también podéis lanzar el comando : netsh branchcache set service mode=Distributed, el cual os lo configurará todo, aunque siempre, la configuración llegada mediante gpo, tendrá prioridad.

Tras esta configuración, podemos lanzar en un cmd como administrador y consultar si todo está ok, gracias la comando netsh branchcache show status all, donde también podéis ver la cantidad de información cacheada en el equipo.

Probar Branchcache

Para probar la configuración y funcionamiento de BranchCache, solo tendrías que:

1. Instalar un emulador de linea, por ejemplo:

NetworkEmulatorToolkit_x32
NetworkEmulatorToolkit_x64

2. Instalar este emulador en el servidor , configurar y en los filtros configurar una latencia mayor que la configurada en la gpo de los equipos cliente (Equipos cliente punto 1.4).

3. Copiar a local en Equipo A o descargar de una web un archivo y observar el tiempo que tarda en finalizar el proceso.

4. Realizar el mismo proceso en Equipo B. El tiempo ha e ser considerablemente menor porque Equipo A ha de ser quien entrega los datos, contando con una latencia mínima en Lan.

BranchCaché en todo proyecto de centralización de datos en Cloud 1/3

Miércoles, 14 de agosto de 2013 Sin comentarios

Hola.

Este es el primero de varios artículos donde pretendo hablar de BranchCaché en un claro ejemplo de uso, una migración de datos actualmente descentralizados a una cloud privada centralizada. Este primer artículo nos pondrá en situación y describirá las partes importantes ante la toma de decisiones en la fase de diseño.

BranchCaché en todo proyecto de centralización de datos en Cloud 1/3

Dos proyectos combinados en los que estoy metido, tienen como fin el diseño y ejecución de una migración de file servers localizados en más de mil “sites” a una cloud privada. Se pretende consolidar y explotar al máximo las ventajas propias de la centralización de datos. Esto conlleva la combinación de un proyecto de migración y otro en paralelo, donde diseñamos y creamos un clúster contando con las mejoras ofrecidas por los roles de File Server y Storage de WS2012. Además de otros que no vienen tan a cuento pero que también son imprescindibles, como la creación de una CA Corporate.

Pues bien, centrándonos en el primero de ellos y contrariamente a lo que se puede pensar, el éxito de ese proyecto, no se basa tanto en los extremadamente importantes procedimientos de migración o en el estudio y mejora de anchos de banda, sino que la parte imprescindible en este proyecto se llama aceleración y en nuestro caso, la encontraemos gracias a BranchCache. Podemos resumirlo en que cualquier ancho de banda posible actualmente, no sustituirá nunca al antiguo servidor situado en la lan y dado esto, se asume cierta lentitud en algunos momentos versus ahorro y seguridad de datos, pero, para minimizar, incluso evitar esta lentitud, pongamos un servidor que haga funciones de hosted ya que además, este puede caer, ser formateado o reemplazado rápidamente sin correr grandes riesgos.

Dicho esto, es importante conocer el rol (http://technet.microsoft.com/en-us/network/dd425028.aspx) y su encaje en el escenario.

Bases:

1. Podremos utilizar Windows Server 2008 r2 o Ws2012 en los servidores pero Windows 7 en equipos cliente.

2. Podríamos utilizar sites con Caché distribuida o Hosted Caché (recordamos que el fin del proyecto es consolidar y por tanto, apagar la mayor cantidad de servidores de site posibles).

3. Anchos de banda limitados y no mejorables en multitud de sites.

4. Diferentes subredes en ciertas redes (Branchcaché distributed, solo cachea información entre equipos en la misma subred).

5. Hosted Caché en Ws2008R2 ya nos permite pre cachear información en el servidor previo a su puesta en producción.

6. Windows 7, al contrario de Windows 8, no detecta automáticamente al servidor hosted de la sede, por lo que se prone ligar una gpo con el servidor por cada site.

7. Hosted Caché se basa en la seguridad ofrecida por certificados de servidor, por lo que tenemos que contar con una CA Corporate.

8. Los servidores hosted ws2012 y Ws2008R2 pueden ser detectados automáticamente por futuros w8, por lo que se podría habilitar esta opción aun no siendo explotada actualmente.

9. Ante oscilaciones en las velocidades de conexión, se pretende cachear la mayor cantidad de información, independientemente al retardo con el servidor central.

Tras conocer todo esto, iremos desgranando como funciona y la puesta en marcha de BranchCaché distribuido y sobre todo Hosted, que es el que nos costará un poco más de montar.

Saludos.

Categories: branchcache, Windows 7, WS2008 R2, ws2012 Tags:

Configuración de BranchCaché web y smb, hosted en WS2008 R2 en adelante

Martes, 6 de agosto de 2013 Sin comentarios

Hola.

El siguiente paso a paso, configura Branchcaché en nuestra red, aprovechando incluso las nuevas funcionalidades de ws2012 y Windows 8, gracias las cuales, el equipo cliente utiliza el servidor hosted más próximo a él.

 

Entorno:

Servidor DC, web y smb

Server1, en dominio, será hosted server y cliente

Server2, en dominio, será, hosted server y cliente

 

Configuración:

1. Crear una gpo con nombre BranchCache clientes, por ejemplo.

  • Ir a computer configuration\policies\administrative templates\network\branchcache
  • Habilitar las siguientes opciones: “ turn on BranchCache”, “Set BranchCache Distributed Cache Mode” y “Enable Automatic Hosted Cache Discovery by Service Connection Point”.
  • Ir a Computer Configuration\Policies\windows Settings\Security settings\windows Firewall with Advanced Security\windows firewall with advanced security\…inbound rules
  • Nueva regla – Predefinida – Branchcache- content retrieval (uses http).
    Filtrar la gpo para que solo se aplique a ordenadores cliente donde queremos que utilicen BranchCache
    2.Instalar la caraterística de BranchCache en los servidores hosted, para ello:
  • Comando powershell: get-windowsfeature BranchCache | install-WindowsFeature
  • Si tenéis varios servidores podéis: invoke-command –computername server1,server2,dc –scriptblock{y el comando que he puesto antes}

3. Configurar por ejemplo la carpeta de web server para las primeras pruebas:

  • publish-bcwebcontent c:\inetpub\wwwroot (o la ruta donde tengáis la web en cuestión).

4. Configurar el/los hosted cache server, en mi caso lo haré en server1 y server2:

  • enable-bchostedserver –registerscp
  • gpupdate /force
  • get-service peerdistsvc | restart-service

A partir de este momento ya se puede realizar una prueba, por ejemplo, bajando un archivo de http://dc/archivo.iso (por ejemplo). Para que las pruebas confirmen el funcionamiento, lo mejor sería utilizar un limitador de ancho de banda en el dc y comprobar que la primera descarga desde server1 es muy lenta y luego, desde server2, la misma descarga se realizar prácticamente de inmediato.

Una vez configurado todo esto, si queréis que una carpeta se cachee, solo tenéis que marcar la opción al respecto en las propiedades de esta.

Ruta alternativa para la instalación de componentes en W8, WS2012 y WS2012 R2

Martes, 6 de agosto de 2013 Sin comentarios

Hola.

En su día ya traté por aquí, el hecho de que no todas los componentes vengan almacenados en el propio sistema operativo a la espera de ser activados; eso ocurre en W8, WS2012 y WS2012R2.

El ejemplo es claro, prácticamente lo primero que encontramos cuando queremos instalar algún rol es la necesidad de contar con .net framework y este, se descarga online, algo que normalmente, nuestros servidores no pueden realizar.

Para remediar esto de forma profesional en un entorno al menos mediano, lo suyo es crear una directiva que nos ayude, para ello, basta con seguir los siguientes:

1.Crear una directiva e ir a la ruta:

image

Computer configuration\administrative Templates\system\Specify settings fo optional component installation and component repair

2.Activar la opción y en “Alternate source file path” podemos:

2.1 Simplemente utilizar la ruta de un share, donde habremos guardado los archivos del iso; ejemplo: \\nas\share

2.2 Utilizar un share donde hemos guardado el archivo wim e indicarlo todo, ejemplo: wim:\\nas\share\install.wim:3.

En mi caso he usado la opción 1 ya que la 2 viene perfectamente detallada en la ayuda:

image

Además, también podéis personalizar la opción contando con las opciones “never attempt to download payload from windows update” o “contact Windows Update directly to download repair content…”, las cuales están perfectamente explicadas en la parte de la ayuda de la propia opción.

Saludos.

Categories: Windows 8, ws2012, Ws2012 R2 Tags:

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

Viernes, 28 de junio de 2013 Sin comentarios

 

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.

Categories: Sin categoría Tags:

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

Viernes, 28 de junio de 2013 Sin comentarios

 

$solenguaje = Get-WmiObject Win32_OperatingSystem

$code= switch($solenguaje.oslanguage){

default {“Unknown”);

3082 {“Spanish”};

1033 {“English”}

}

Categories: powershell Tags:

Comportamiento y scripts de inicio de imagen con Sysprep

Miércoles, 26 de junio de 2013 Sin comentarios

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.

Categories: deployment, Windows 7, Windows 8 Tags:

Introducir a un usuario en grupo de administradores locales

Miércoles, 26 de junio de 2013 Sin comentarios

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.

Categories: powershell Tags:

Script completo para preparar equipo y lanzar Bitlocker.

Martes, 25 de junio de 2013 Sin comentarios

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
    }
}

Categories: Sin categoría Tags:

Aplicar script solo a un tipo de equipo / servidor

Lunes, 24 de junio de 2013 Sin comentarios

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.

Categories: powershell Tags: