jueves, 14 de noviembre de 2013

Cambiar zona horaria de Windows en varios ordenadores



En Windows Server 2008 R2 y 2012 al igual que Windows 7 u 8 existe un comando que permite el comprobar y modificar la zona horaria configurada en nuestro ordenador, este comando es el tzutil.exe y las opciones son las siguientes:

    /? Muestra información de uso.
    /g Muestra el Id. de la zona horaria actual.
    /s IdDeZonaHoraria[_dstoff]
       Establece la zona horaria actual con el Id. de la zona especificada.
       El sufijo _dstoff deshabilita los ajustes del horario de verano
       para la zona horaria (donde proceda).
    /l Enumera los Id. de todas las zonas horarias válidas y muestra los
       nombres. La salida es:
           <nombre para mostrar> <Id. de zona horaria>

El problema es que no permite la ejecución remota de este comando en otros servidores / ordenadores con lo que tendremos que basarnos en un comando muy útil del powershell 2.0 y superior que es el Invoke-Command (http://technet.microsoft.com/en-us/library/hh849719%28v=wps.620%29.aspx)

El script que muestro nos permite modificar la zona horaria a GMT+1 Paris, Madrid, la que usamos aquí en una serie de ordenadores listados en un fichero CSV. 

En el caso de la zona horaria que cito, su nombre es Romance Standard Time, si queremos poner otra lo primero que necesitamos saber es su nombre lo que podemos averiguar ejecutando el comando:
        
            Tzutil /l

Y muestra una salida como esta:
(UTC+01:00) Amsterdam, Berlín, Berna, Roma, Estocolmo, Viena
W. Europe Standard Time
(UTC+01:00) Belgrado, Bratislava, Budapest, Liubliana, Praga
Central Europe Standard Time
(UTC+01:00) Bruselas, Copenhague, Madrid, París
Romance Standard Time

Es recomendable el arrancar el PowerShell en modo Administrador y con un usuario que sea administrador local de todos los servidores a modificar. En mi ejemplo se supone que la ejecución remota está permitida y, o bien no existe o en los firewall se han habilitado las ejecuciones remotas. 
Además se ha de permitir la ejecución de scripts para ello se debe haber ejecutado el comando Set-ExecutionPolicy adecuado.

Lo primero que debemos generar es el fichero CSV que contendrá todos los ordenadores o servidores a modificar. El formato que tendrá es similar a este:

Hostname
Server1
Server2
Server3

Hay que tener en cuenta que la primera línea es la cabecera y no se ha de modificar, el resto de líneas son cada uno de los servidores a modificar. Lo grabaremos como Servidores.CSV

El script que hay que ejecutar es el siguiente:

# -- Cambiar la zona horaria indicada en la variable $ZonaHoraria a 
# -- todos los servidores pasados en el fichero Servidores.CSV
# -- Nov. 2013                                                      
# -- Variables de entorno
$ZonaHoraria="Romance Standard Time"
$Servidores=Import-CSV servidores.csv -Delimiter ","
foreach($Servidor in $Servidores)
{
 # -- Comprueba si ya es la correcta
 $Zona=invoke-command -cn $Servidor.HostName {tzutil /g}
 if ($Zona -eq $ZonaHoraria)
    {
    Write-Host "El servidor " $Servidor.HostName "ya estaba en la zona" $ZonaHoraria
    }
else {
    invoke-command -cn $Servidor.HostName {tzutil /s "Romance Standard Time"}
    Write-Host "El servidor " $Servidor.HostName "se ha cambiado a la zona" $ZonaHoraria
    }
}

Como se ve el script comprueba si el servidor ya tiene esa zona configurada o no y muestra el resultado.
Espero haber ayudado.

Crear objetos Computer en AD



El script de Powershell que voy a mostrar permite el poder crear de forma masiva objetos Computer en el directorio activo y poderle indicar varios parámetros como la descripción o la OU donde queremos crear el objeto.

Hay que tener en cuenta que para poder ejecutar este comando es necesario importar el módulo ActiveDirectory que solo se encuentra disponible si es un servidor de dominio o hemos instalado en un ordenador miembro del dominio las herramientas administrativas del directorio activo. También hay que tener en cuenta que deberemos ejecutar el Powershell con privilegios elevados y que debe estar permitido la ejecución de scripts.


El fichero CSV en el cual deberemos indicar los datos de los objetos a crear debe tener el formato siguiente:

Nombre;NombrePre;Descripcion;Grupo;Path
Ordenador1; Ordenador1;Descripcción Ordenador1;Equipos almacen;OU=Almacen


Teniendo en cuenta de que la primera línea es la cabecera  que no deberemos modificar que tendrá el formato:

Nombre: El nombre a crear del objeto que será el nombre del ordenador

NombrePre:El nombre a crear del objeto para las versiones anteriores a Windows 2000, normalmente es el mismo de Nombre

Descripccion:Es la descripción que queremos darle al objeto

Grupo:Grupo al queremos añadir este objeto

Path:OU final donde queremos que se cree el objeto. En mi ejemplo todos se crean en la misma OU cuya raíz es OU=Ordenadores,OU=Valencia,DC=lab,DC=local con lo que aquí únicamente indicaremos la OU final. Cada uno que lo modifique como crea necesario.


El script es el siguiente, he añadido comentarios para saber lo que se está haciendo.

# -- Importar el modulo de directorio activo

Import-Module ActiveDirectory

# -- Leer los datos del fichero CSV

$Computers = Import-CSV Computers.csv -delimiter ";"


# -- Parte común del path donde ubicar el objeto

$CommonPath = ",OU=Ordenadores,OU=Valencia,DC=Lab,DC=local"


# -- Comienza a leer los objetos

foreach($Computer in $Computers)

{

  # -- Prepara todas las variables

  $Name = $Computer.Nombre

  $SamAccountName = $Computer.NombrePRE

  $Description = $Computer.Descripcion

  $Path = $Computer.Path + $CommonPath

  $Group = $Computer.Grupo

  $CN = "CN="+$Name+","+$Path

  $CN = "`"$CN`""

  
  # -- Comprueba si el objeto ya existe

  $Message="Ya existe="+$CN

  $Exist = dsquery computer -name $Name

  if ($Exist -eq $CN) {echo $Message}

  else 
  {

  # -- No existe, crea el objeto

  Write-Host "-- Creando objeto " $Name

  New-ADComputer -Name $Name -SamAccountName $SamAccountName -Description $Description -Path $Path


  # -- Añade el objeto al grupo solicitado

  Write-Host "Añade el objeto " $Name " al grupo " $Group

  $Comp=Get-ADComputer $Name

  Add-ADGroupMember -identity $Group -Member $Comp

  }

 }

Espero haber ayudado con esto.

Añadir objetos de AD a un grupo

En el caso de necesitar añadir una gran cantidad de objetos Computer del AD a un determinado grupo podemos hacerlo usando el cmdlet de Powershell Add-ADGroupMember.

Hay que tener en cuenta que para poder ejecutar este comando es necesario importar el módulo ActiveDirectory que solo se encuentra disponible si es un servidor de dominio o hemos instalado en un ordenador miembro del dominio las herramientas administrativas del directorio activo.

En el ejemplo que indico ya se importa este módulo pero, hay que tener en cuenta que deberemos ejecutar el Powershell con privilegios elevados.

El script utiliza un fichero CSV llamado Miembros.CSV cuyo formato es el siguiente:

   Equipo
   Equipo1
   Equipo2
   Equipo3

Siendo Equipo la cabecera del fichero y Equipo1, ..2 y ..3 los nombres de los objetos Computer del AD a incluir en el grupo.

El script que indico a continuación como ejemplo asume que todos los equipos se añaden al grupo Servidores_Uno.

Import-Module ActiveDirectory 
$Miembros=Import-CSV miembros.csv -Delimiter "," 
$Grupo="Servidores_Uno" 
foreach($Miembro in $Miembros) 

 # -- Añade el objeto al grupo solicitado 
 Write-Host "Añade el objeto " $Miembro.Equipo " al grupo " $Grupo 
 $Comp=Get-ADComputer $Miembro.Equipo 
 Add-ADGroupMember -identity $Grupo -Member $Comp 



Espero haber ayudado con esto.