martes, 8 de abril de 2014

RDWEB + RDGateway acceso a pc interno mediante a través de RDWeb

Hola.

Como muchos sabéis, para acceder a equipos internos desde el exterior, lo suyo es publicar el puerto 443 apuntando al nuestro RDGateway y que este, actue como proxy inverso hacia los puertos 3389 del resto de servidores y/o pcs que  pertenecen al grupo XXX en nuestro ad.

Esto es algo bien montando y no el abrir 3389, 3390, etc., pero bueno esa guerra creo que está perdida :(.

Me centro ahora en ofrecer conexión a esos equipos vía gateway, facilitando esta desde la rdweb.

Por defecto, si montamos rdweb y rdgateway no funciona. Nos quedaría ir a configurar RDWeb para que utilizase nuestro gateway.

Esto se hace así.

1. Ir a IIS - Default Web site - RDWeb - Pages.

2. En el panel central elegir CONFIGURACIÓN DE APLICACIONES.

3. Doble click sobre defaultTSGateway e introducir la dirección publicada de nuestro RDGateway.


A partir de ese momento, desde la web podréis conectar a equipos internos:





RDWEB - Añadir dominio por defecto en validación.



Hola.

Hoy me ha tocado buscar la forma de que se incorpore automáticamente el dominio en la casilla de validación del usuario en un Windows Server 2012 r2 con rol RDWeb.

La solución es rebuscada como pocas y los pasos son:

1. Ir a la ruta: C:\Windows\Web\RDWeb\Pages
2. Hacer una copia del script: webscripts-domain.js
3. Abrir Notepad como administrador y editar el script: webscripts-domain.js
4. Localizar la líneas:
  • strDomainUserName = objForm.elements["DomainUserName"].value;
  • strPassword = objForm.elements["UserPass"].value;
5. Entre las dos líneas añadir:

        if ( strDomainUserName.indexOf("\\") == -1 )
         {
           strDomainUserName = "DOMINIO\\" + strDomainUserName;
           objForm.elements("DomainUserName").value = strDomainUserName;
         }

*Sustituir la palabra DOMINIO por vuestro dominio.

De tal forma que quedará:

strDomainUserName = objForm.elements["DomainUserName"].value;
     
 if ( strDomainUserName.indexOf("\\") == -1 )
         {
           strDomainUserName = "DOMINIO\\" + strDomainUserName;
           objForm.elements("DomainUserName").value = strDomainUserName;
         }

strPassword = objForm.elements["UserPass"].value;


Por supuesto, si tenéis más de un dominio, o bien declaráis uno por defecto y los usuarios pertenecientes al otro deben ponerlo explícitamente o bien no podéis hacerlo.

En Windows Server 2008 R2 el script a modificar es renderscripts.js.

Saludos.

martes, 18 de marzo de 2014

Comandos powershell utilizados durante la gira

 

Hola.

Algunos de vosotros me habéis pedido durante los diferentes eventos realizados, los comandos de powershell que he ido utilizando para cada una de las explicaciones.

Aquí los tenéis:

#conocer el tipo de conexión establecida
get-smbconnection

#conocer las posibilidades de la nic física (observerse si soporta rss)
Get-SmbMultichannelConnection

#conocer las posibilidades de la nic de la vm (observerse que esta si soporta rss al estar sobre 2012r2)
invoke-command -computername nodo1 -ScriptBlock{Get-SmbMultichannelConnection}

 

#limitar anchos de banda de forma directa
Add-WindowsFeature FS-SMBBW
Remove-SmbBandwidthLimit –Category default

Set-SmbBandwidthLimit -Category Default -BytesPerSecond 8mb

Set-SmbBandwidthLimit -Category Default -BytesPerSecond 1gb

#2 nics sin teaming - asignar persos y prioridades a tarjetas de red virtuales (nuevo en 2012r2)

add-VMNetworkAdapter –ManagementOS –Name “SMB” –SwitchName “vnet”
Add-VMNetworkAdapter –ManagementOS –Name “LM” –SwitchName “switch1”
Add-VMNetworkAdapter –ManagementOS –Name “Cluster” –SwitchName “switch1”
Add-VMNetworkAdapter –ManagementOS –Name “Management” –SwitchName “switch1”
New-NetQosPolicy “Live Migration” –LiveMigration –MinBandwidthWeight 30 –Priority 5
New-NetQosPolicy “SMB” –SMB –MinBandwidthWeight 50 –Priority 3
New-NetQosPolicy “Cluster”-IPDstPort 3343 –MinBandwidthWeight 10 –Priority 6
New-NetQosPolicy “Management” –Default –MinBandwidthWeight 10

#2nics con teaming

New-NetLbfoTeam “Team1” –TeamMembers “NIC1”,”NIC2” –TeamNicName “team”

New-VMSwitch “switch1” –NetAdapterName “team” –MinimumBandwidthMode Weight –AllowManagementOS $false

add-VMNetworkAdapter –ManagementOS –Name “SMB” –SwitchName “vnet”
Add-VMNetworkAdapter –ManagementOS –Name “LM” –SwitchName “switch1”
Add-VMNetworkAdapter –ManagementOS –Name “Cluster” –SwitchName “switch1”
Add-VMNetworkAdapter –ManagementOS –Name “Management” –SwitchName “switch1”

#Asignar pesos
Set-VMNetworkAdapter –ManagementOS –Name “SMB” –MinimumBandwidthWeight 40
Set-VMNetworkAdapter –ManagementOS –Name “LM” –MinimumBandwidthWeight 20
Set-VMNetworkAdapter –ManagementOS –Name “Cluster” –MinimumBandwidthWeight 5
Set-VMNetworkAdapter –ManagementOS –Name “Management” –MinimumBandwidthWeight 5

Set-VMNetworkAdapter –VMName * -MinimumBandwidthWeight 1

#asignar vlans si las hay.
Set-VMNetworkAdapterVlan –ManagementOS –VMNetworkAdapterName SMB –Access –VlanId 100
Set-VMNetworkAdapterVlan –ManagementOS –VMNetworkAdapterName LM –Access –VlanId 200
Set-VMNetworkAdapterVlan –ManagementOS –VMNetworkAdapterName Cluster –Access –VlanId 300
Set-VMNetworkAdapterVlan –ManagementOS –VMNetworkAdapterName Management –Access –VlanId 400

 

#Añade discos compartidos y almacenados en alta disponibilidad
Add-VMHardDiskDrive -VMName nodo2 -Path \\sohyperv\vhd\shareddisk.vhdx -ShareVirtualDisk
Add-VMHardDiskDrive -VMName nodo2 -Path \\sohyperv\vhd\shareddisk2.vhdx -ShareVirtualDisk
Add-VMHardDiskDrive -VMName nodo2 -Path \\sohyperv\vhd\shareddisk3.vhdx -ShareVirtualDisk
Add-ClusterNode -Cluster guestcluster –Name nodo2

#borra discos compartidos y almacenados en alta disponibilidad
remove-VMHardDiskDrive -VMName nodo2 -Path \\sohyperv\vhd\shareddisk.vhdx -ShareVirtualDisk
remove-VMHardDiskDrive -VMName nodo2 -Path \\sohyperv\vhd\shareddisk2.vhdx -ShareVirtualDisk
remove-VMHardDiskDrive -VMName nodo2 -Path \\sohyperv\vhd\shareddisk3.vhdx -ShareVirtualDisk 
Add-VMHardDiskDrive -VMName nodo2 -Path \\sohyperv\vhd\quorumguest.vhdx -ShareVirtualDisk

Slides Eventos Zerkana & Microsoft - Cloud OS

 

Hola.

Antes de nada, dar las gracias a los asistentes que nos acompañaron en los diferentes eventos que hemos realizado junto con Microsoft y en el caso de Valladolid, también junto con Plain Concepts y Samuel López (Microsoft MVP).

Os dejo el link de donde os podéis descargar las slides que utilizamos y que nos habéis pedido.

https://onedrive.live.com/redir?resid=D0190B360D3CB440!23877&authkey=!ANv90wyvrpaU538&ithint=folder%2c

Saludos.

viernes, 17 de enero de 2014

Exportar e importar configuración de nics

 

Hola.

Hoy se me ha planteado la necesidad de salvar y luego volver a importar la configuración de unas cuantas tarjetas de red y en vez de hacerlo a mano, he buscado el comando y aquí está. Como siempre, pararse a afilar el hacha es un tiempo bien dedicado.

El comando para exportar la configuración es:

netsh -c interface dump > archivo.txt

El comando para importar la configuración exportada es:

netsh -f archivo.txt

Saludos.

miércoles, 4 de diciembre de 2013

Modo compatibilidad o cambio de resolución en aplicación vía command line

 

Hola.

Se me ha presentado una necesidad y la solución es simple aunque un tanto rebuscada.

Ante la necesidad de marca el modo compatibilidad en un archivo .exe una vez instalada la aplicación, solo tenéis que usar el comando siguiente con sus variables:

set __COMPAT_LAYER= MODEXX  RESOLXXX   “c:\program files\aplicacion\aplicacion.exe”

En mi caso:

set __COMPAT_LAYER= WINSRV03SP1  640X480   “c:\program files\aplicacion\aplicacion.exe”

Las posibilidades son:

Windows 95 = WIN95

Windows 98 / Windows Me = WIN98

Windows NT 4.0 (Service Pack 5) = NT4SP5

Windows 2000 = WIN2000

Windows XP (Service Pack 2) = WINXPSP2

Windows XP (Service Pack 3) = WINXPSP3

Windows Server 2003 (Service Pack 1) = WINSRV03SP1

Windows Server 2008 (Service Pack 1) = WINSRV08SP1

Windows Vista = VISTARTM

Windows Vista (Service Pack 1) = VISTASP1

Windows Vista (Service Pack 2) = VISTASP2

Windows 7 = WIN7RTM

256 colors = 256Color

640 x 480 screen resolution = 640x480

Disable visual themes = DISABLETHEMES

Disable desktop composition = DISABLEDWM

Disable display scaling on high DPI settings = HIGHDPIAWARE

Saludos.

miércoles, 6 de noviembre de 2013

Crear .adm “templates” personalizados

 

Hola.

Pocas son las veces que utilizamos la posibilidad no de importar y exportar archivos .adm para añadir contenido a nuestras gpos en AD, sino que además creamos esos adm para modificar parámetros que en muchas ocasiones preferimos modificar vía script en log on, etc.

Sin embargo, todo administrador de AD elegiría la posibilidad de llegar vía gpo ya que por ejemplo, nos olvidamos de equipos que conectan por vpn y otras circunstancias a las que vía log on no llegamos y tenemos que ir creando tareas programadas y demás.

En este artículo, pretendo daros una nociones básicas de como crear vuestros propios archivos .adm para que pudieseis incluso crear una gpo general con modificaciones de diversos programas, donde, por ejemplo, podamos tener tanto la directiva de contraseñas como la personalización de los adobe reader que hay en todo equipo de la empresa.

CONCEPTOS

Antes de nada comentar que prácticamente todo se basa en la modificación del registro y para ello tenemos que tener bien claro la existencia  de los arboles “Hkey_local_machine” y Hkey_current_user” los cuales tiene prácticamente un reflejo directo en las directivas de equipo y usuario que sabéis, existen en cada gpo.

En relación a lo que tenemos entre manos, vamos a trabajar con estos conceptos básicos:

1. Class

2. Category

3.Policy

4.Keyname

5.Valuename

Los archivos que se importan en la consola de administración de directivas de grupo, tienen la extensión .adm y estos archivos los podéis generar simplemente con notepad, guardando no como texto si no como archivo sin formato y escribiendo tras el nombre, la extensión .adm.

 

EJEMPLO 1

En las capturas siguientes, podéis ver ejemplos y entender donde se ubica cada uno de estos “items”

image

image

 

Por tanto una estructura básica podría ser:

Class “clase”

    Category “Policy”

        Keyname “keyname”

        Valuename “Valuename”
        Valueon numeric 0
        Valueon numeric 1

    End Policy

End Category

 

Si además quisiéramos incluir texto en la solapa “Explain” tendríamos que poner al final del texto:

[strings]
policy = “texto”

Esto lo guardaríamos como archivo template.adm y luego lo importaríamos como se ve la siguiente captura:

(Consola de administración de directivas de grupo)

image

EJEMPLO 2

Un ejemplo más claro pero más complejo se muestra a continuación, en él, crearemos una directiva para adobe que nos modifica una clave del registro:

image

image

 

CLASS USER
    CATEGORY !!Adobe10Header
        CATEGORY "Adobe Reader 10"
            CATEGORY "Preferences"
                    CATEGORY "General"
                        CATEGORY "Application Startup"
                                POLICY "Show splash screen"
                                    KEYNAME "Software\Adobe\adobe acrobat\10.0\Originals"
                                    EXPLAIN !!ExplainNosplash
                                    VALUENAME "bDisplayedSplash"
                                    VALUEON NUMERIC 0
                                    VALUEOFF NUMERIC 1
                                END POLICY

                        END CATEGORY
                    END CATEGORY
            END CATEGORY
        END CATEGORY
    END CATEGORY

[strings]
Adobe10Header=Adobe 10
ExplainNosplash="When disabled, the program will not display a splashscreen on startup.\n\nWhen enabled, the splashscreen will be displayed."

El resultado es:

image

image

 

En vez de:

VALUENAME "bDisplayedSplash"

VALUEON NUMERIC 0

VALUEOFF NUMERIC 1

 

Podemos tener claves del tipo:

VALUENAME “path”

VALUE “c:\temp\imagen.bmp”

 

También podríamos poner un texto con el comando “PART” que iría en la tabla de texto, esto sería así:

PART “texto”

VALUENAME "bDisplayedSplash"

VALUEON NUMERIC 0

VALUEOFF NUMERIC 1

También podemos necesitar un DROPDOWNLIST tras el texto para lo que tendríamos que poner:


PART “Default Dictionary” DROPDOWNLIST

ITEMLIST
    NAME "English (United Kingdom)" VALUE "English (United Kingdom)"
    ACTIONLIST
        KEYNAME "Software\Adobe\Acrobat Reader\10.0\Spelling"
        VALUENAME "iDictionaryDefaultID" VALUE NUMERIC 7
    END ACTIONLIST
    NAME "English (United States)" VALUE "English (United States)"
    ACTIONLIST
        KEYNAME "Software\Adobe\Acrobat Reader\10.0\Spelling"
        VALUENAME "iDictionaryDefaultID" VALUE NUMERIC 2
    END ACTIONLIST
END ITEMLIST

image

 

O por ejemplo un simple CHECKBOX que sería:

PART “Texto” CHECKBOX

VALUENAME “Valuename”

VALUEON NUMERIC 0

VALUEOFF NUMERIC 1

 

Bueno y si buscáis más por internet vais a encontrar mucho. Yo os invito a que analicéis archivos .adm muy útiles como son:

Adobe

http://www.adobe.com/devnet-docs/acrobatetk/tools/AdminGuide/gpo.html#x-gpo-deployments.

Google Chrome

https://support.google.com/chrome/a/answer/187202?hl=es

 

Saludos.

miércoles, 14 de agosto de 2013

BranchCache Distributed 2/3

 

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

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.

miércoles, 7 de agosto de 2013

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

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.

martes, 6 de agosto de 2013

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

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.

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