Mostrando las entradas con la etiqueta Scripts. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Scripts. Mostrar todas las entradas

miércoles, mayo 17, 2017

La Guerra de los Clones (Clones vs WSUS)

Un tema que se ha tornado recurrente en las empresas que usan WSUS es que no aparecen todos los equipos, en una oportunidad deberían aparecer al menos 800 equipos y a lo mas lográbamos 16.

Revisando el tema la razón fue el SID, habían solo 16 SIDs diferentes y los demás eran repetidos, y esto fue por que eran CLONES.

La instalación de los equipos de trabajo en empresas usualmente lo automatizan a través de imágenes, pero esa imagen muchas veces no esta generalizada, por lo que son clones idénticos y generan estos problemas.

Para la clonación de equipos se debe hacer desde una imagen generalizada, una vez que el equipo base tiene todo listo hay que ejecutar sysprep /generalize /shutdown y entonces sacar la imagen de este sistema.

Para obtener el SID de un equipo podemos usar de las sysinternals la herramienta psgetsid, esta herramienta puede ejecutarse en forma remota y ademas podemos pasarle como parámetro un archivo con la lista de equipos.

https://technet.microsoft.com/en-us/sysinternals/bb897417.aspx

Para cambiar el SID de un clon hasta xp podemos usar el NEWSid, pero OJO, en un win7 o superior hara desastres en el equipo.

Desde windows 7 hacia arriba, incluidos servidores deben usar sysprep /generalize, pero tendra varios efectos adicionales:

- Se ha cambiado el nombre del equipo.
- Se eliminan los puntos de restauración.
- Se elimina el contenido del visor de eventos (eventvwr.msc).
- Se elimina la activación de Windows.
- Se elimina la configuración TCP/IP de la NIC.
- Puede afectar algunas aplicaciones.

Antes de hacerlo en equipos de los usuarios tomen todas las medidas necesarias.

Saludos!

Isha


jueves, mayo 11, 2017

Cambio de Zona horaria via GPO

Este año en chile tenemos una nueva zona horaria para el sur, la zona de magallanes, varios me han preguntado como automatizar via GPO el cambio a esta nueva zona, asi que aca esta la receta:

Crear un archivos .bat con el siguiente comando:

tzutil /s "Magallanes Standard Time"

Crear una GPO y configurar un script de startup con ese archivo, no todos los usuarios tienen privilegios en la maquina para cambiar la zona horaria, por eso se usa de startup y no de login.

Aplicar la GPO a la OU donde estan los equipos de Magallanes.

Solicitar reiniciar 2 veces (para apurar el tema).

Recuerden que antes de eso debe estar instalado el parche que agrega esta zona (KB4015193)

Isha

lunes, septiembre 24, 2012

Cambiando a DHCP usando Politicas de Dominio

Una de las actividades que me ha tocado realizar al migrar una red que usa IP fija a DHCP es el como realizar masivamente el cambio en las estaciones de trabajo. Cuando son pocas no hay problemas, un chico de soporte puede manualmente cambiarlas y listo, pero cuando son 100, 200 o mas estaciones esto podria consumir bastantes horas de soporte para realizarlo

Una de las formas mas simples es a traves de una politica de dominio, el cambio de configuracion de la tarjeta de red requiere provilegios de administración sobre el equipo y probablemente no todos los usuarios son administradores de su equipo.

La forma mas simple es a traves de un ejecutable (un bat por ejemplo) que colocamos en la carpeta NETLOGON y lo agregamos en la politica en el startup del equipo y acostumbro tambien agregarlo en el login del usuario. Luego linkeamos la politica en la OU correspondiente donde estan los equipos donde deseamos se desean cambiar, mucho cuidado de no incluir en esta OU a los servidores, asi que no se les ocurra linkearlo a la raiz del dominio o usar la politica default del dominio.

El bat que usaremos sera algo parecido a lo siguiente:

netsh interface ip set address "Conexi¢n de  rea local" dhcp
netsh interface ip set address "Conexión de área Local" dhcp
netsh interface ip set address "Conexion de area Local" dhcp
netsh interface ip set address "Local Area Connection" dhcp

netsh interface ip set dns "Conexi¢n de  rea local" dhcp
netsh interface ip set dns "Conexión de área Local" dhcp
netsh interface ip set dns "Conexion de area Local" dhcp
netsh interface ip set dns "Local Area Connection" dhcp


Wow!! que onda! por que tantas lineas??

Pues no todos los equipos tienen el mismo nombre en la interfaz de red, por lo que inclui TODOS los posibles nombres que habian entre las estaciones de trabajo. Para aquellas lineas en que trata de cambiar uno que no existe aparecera el siguiente mensaje.
El nombre de archivo, el nombre de directorio o la sintaxis de la etiqueta del volumen no son correctos.

Una de las cosas que me hizo perder algo de tiempo fue el tema de los acentos, en las version español de Windows el nombre de la interfaz tiene acento y aunque en el archivo bat los veia bien al ejecutar el comando se veia mal como lo muestra la siguiente imagen.


La solucion usada?? bueno, ya lo vieron en la imagen anterior, editar en aquellas estaciones que se ve mal el archivo usando el comando edit y corregir el nombre de la interfaz.


No es una solución elegante pero si practica :)

Ahora a poner mas bonito en script.

Saludos!

Isha

lunes, noviembre 28, 2011

Cambio Masivo en AD con PowerShell

Holas!!

Hace tiempo que no escribia un articulo, andaba poco creativa, pero aprovechando que ando en unas mini vacaciones en Concepcion aprovechare de compartir un poco de Scripts.

Hace unos dias me pidieron crear un script para modificar la informacion de los usuarios en forma masiva, eran cerca de 800 usuarios a modificar y la informacion estaba en un excel.

Estuve buscando en el Script Center de Microsoft pero los que alli estan no me dejaban satisfechas, algunos campos podian ser modificados pero otros multivalor no podian hacerlo, ademas que se queria agregar la fotografia del usuario en el campo jpegPhoto.

En la consola PowerShell de Active Directory puedes encontrar el cmdlet Set-ADUser con el cual puedes modificar el usuario, identificas al usuario en forma unica con la cuenta, este es el atributo sAMAccountName, asi que colocamos -identity "usuario" a nuestro comando.

A continuacion identificamos que atributos necesitamos modificar, para el caso en que sea multiatributo y deseamos agregar, reemplazar o eliminar algun valor tambien lo podemos hacer usando add, replace, o remove indicando el atributo a modificar, por ejemplo -add @{Description = "Descripcion Agregada"}

Tambien, necesitamos cambiar el nombre del objeto en si (atributo cn) para lo cual usamos el cmdlet Rename-ADObject indicandole el usuario que deseamos renombrar.

Como queremos hacerlo para muchos usuarios, necesitamos generar un  archivo csv, separados por comas, en que los nombres de las columnas indiquen los campos que queremos modificar, como ya vimos anteriormente, para parsear el archivo usamos en cmdlet import-csv y lo colocamos en una variable.

Otro problema que se nos presento es la fecha de expiracion de la cuenta, la cual al mirar el objeto nos percatamos que era el dia anterior, para eso hicimos el sucio truco de sumarle un dia (New-TimeSpan -Days 1) a la fecha entregada en el archivo.

Como ultimo desafio, nos quedo el cargar la foto, como el archivo es jpg, no hay un upload foto, asi que hubo que realizar una conversion del archivo a un formato binario ([Byte[]]$(Get-Content -Path "E:\usuario.jpg" -Encoding Byte -ReadCount 0) )

Con todos los ingredientes listos, nuestro script quedo asi:

$data = import-csv $args[0]
$fecha2 = New-TimeSpan -Days 1

foreach ($i in $data)
{

# Se le suma 1 dia a la fecha de expiracion para que lo cargue bien
$fecha = Get-Date $i.accountExpires
$fechaExpira = $fecha + $fecha2

# Renombra la cuenta al nuevo nombre
Get-ADUser -Identity $i.sAMAccountName | Rename-ADObject -NewName $i.DisplayName

# Actualiza los datos de la cuenta
Set-ADUser -identity $i.sAMAccountName -AccountExpirationDate $fechaExpira -Description "Descripcion" -Manager $i.manager -GivenName $i.givenName -Surname $i.sn -DisplayName $i.DisplayName -Company $i.Company -MobilePhone $i.mobile -Department $i.department  -HomePhone $i.HomePhone -Title $i.title

#Agrega la Foto del Usuario

Set-ADUser  -Identity $i.sAMAccountName  -replace @{jpegPhoto = ([Byte[]]$(Get-Content -Path "E:\$i.sAMAccountName.jpg" -Encoding Byte -ReadCount 0) ) }

}

Saludos!!

lunes, agosto 15, 2011

Borrando una configuracion IMAP del perfil de Outlook

El desafio era, agregamos el perfil de exchange, pero como sacamos el perfil anterior??

Aca les dejo el script que contruimos, falta depurarlo, seguro se puede hacer en menos lineas, jejjee.

Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_CURRENT_USER = &H80000001


Set Ws = WScript.CreateObject("WScript.Shell")


Dim ww


set ww=wscript.createobject("wscript.network")


nombreusu=ww.UserName
avalor = Array(1,1,1,1,1,1)
strComputer = "."
KeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\"
DefaultProfile="vacio"


On Error Resume Next
DefaultProfile = ws.RegRead("HKCU\" & KeyPath & "DefaultProfile")
If DefaultProfile = "vacio" Then
WScript.quit


End if


Call BuscaKey()


WScript.Quit


Sub BuscaKey()
'----------------------


Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676"


oReg.EnumKey HKEY_CURRENT_USER,strKeyPath, arrSubKeys


For Each subkey In arrSubKeys
WScript.Echo subkey


If eslakey(subkey) Then
aborrar = strKeyPath & "\" & subkey
oReg.DeleteKey HKEY_CURRENT_USER, aborrar


End if
Next


End sub






Private Function eslakey(subkey)
'-------------------------------


Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\" & subkey


oReg.EnumValues HKEY_CURRENT_USER,strKeyPath, arrValueNames


For Each Valor In arrValueNames


If Valor = "IMAP Server" Then
imapserver = 1
End If


Next


eslakey = 0


if imapserver = 1 Then


strValueName = "IMAP Server"
oReg.GetBinaryValue HKEY_CURRENT_USER, strKeyPath, strValueName,strValue
imapsrv=strValue


email= ""


For i = lBound(strValue) to uBound(strValue)
If strvalue(i) <> 0 Then
email=email + Chr(strValue(i))
End If


Next


If LCase(email) = "mailserver.dominio.cl" or LCase(email) = "10.10.10.11" Then
eslakey = 1
End if


End If
End function


WScript.Quit

Saludos!

Isa

viernes, diciembre 03, 2010

Ultima Conexion ..........

No piensen que esta es la ultima conexion que hago, esta bien que hace tiempo no escriba en el blog y lo tenga un poco (bastante) abandonado, pero no habia encontrado algo interesante para publicar.

Ante una auditoria, necesitamos obtener para cada una de las cuentas del dominio, cuando fue la ultima conexion y validar tambien el estatus de la cuenta, si es que esta desabilitada, etc.

Este proceso tiene varios pasos, el primero de ellos es obtener la lista de los usuarios, esto lo podemos realizar de varias formas, usando algun programa ya hecho, usando scripts visual basic o power shell o usando algun comando que obtiene informacion de Active Directory. En esta ocasion, seleccione uno bien interesante y multiproposito: CSVDE

Este comando permite principalmente importar y exportar objetos en active directory, si quieres aprender mas sobre el puedes hacerlo en el siguiente link

Una vez seleccionado el comando esta la seleccion de los atributos que necesito, obtener una lista completa nos podria generar un archivo demasiado grande y engorroso de manipular, asi que mi lista reducida fue la siguiente: objectClass, userAccountControl, sAMAccountName, lastLogonTimestamp

objectClass me muestra el tipo de cuenta, me dice si la cuenta es user o computer.
userAccountControl me da el status de la cuenta mas adelante me explayo mas sobre este atributo.
sAMAccountName es el nombre de la cuenta.
lastLogonTimestamp es cuando fue la ultima conexion de la cuenta.

Este ultimo atributo, lastLogonTimestamp fue introducido en Windows Server 2003 para ayudar a identificar de forma mas certera los usuarios y equipos que se encuentran activos, cabe hacer notar que este datos tampoco es en tiempo real ya que la informacion debe ser actualizada por los demas domain controlers de la red pues a diferencia del atributo lastLogon, este es replicado.

El numero entregado por este atributo representa la intervalos de 100 nanosegundos transcurridos desde el 1ro de Enero de 1601, el codigo en vbs para transformar este numero a fecha es el siguiente:

set objLogon = objUser.Get("lastLogonTimestamp")
intLogonTime = objLogon.HighPart * (2^32) + objLogon.LowPart
intLogonTime = intLogonTime / (60 * 10000000)
intLogonTime = intLogonTime / 1440
WScript.Echo strADsPath & ";" & intLogonTime + #1/1/1601#

Si esa misma formula queremos usarla en excel usemos la siguiente:
Ingles: =IF(C2>0,C2/(8.64*10^11) - 109205,"")
Español: =SI(E2>0;E2/(8.64*10^11) - 109205;"")

ok! ya tenemos la lista de usuarios y tenemos el ultimo logon en formato de fecha :) nos esta faltando ahora saber si las cuentas estan desabilitadas o no o si ha expirado la password.

A traves del atributo userAccountControl podemos saber alguna informacion del estado de la cuenta, este atributo es una serie de bits que visualizamos como un numero en donde cada posicion representa una caracteristica que puede estar seteada en 1 o 0 el bit que en nuestro caso nos interesa es el segundo, ACCOUNTDISABLE, o sea, un usuario normal tendra el número 512 y si ese usuario esta desabilitado sera 514, si quieren saber mas detalle de este atributo pueden revisarlo en la siguiente link

Otro atributo que tambien nos puede ayudar y que nos indica si la cuenta esta con la password expirada o no es msDS-User-Account-Control-Computed pues el anterior aunque tiene la opcion de mostrar si tiene la password expirada no lo indica, para este caso, la columna representada por este atributo me mostrara un 8388608 que representa 0x800000 en hexadecimal y corresponde al status PASSWORD_EXPIRED

Bien, ya tengo identificados aquellos usuarios que no estan cumpliendo :)

Saludos!!

Isa

jueves, marzo 26, 2009

Enviando mail usando un script

Muchas veces me ha tocado configurar script que necesitan enviar mails e incluso atachar archivos al mismo, no es algo complicado y es facil de encontrar a traves de google, pero seguramente muchos no lo conocen y de seguro mas de alguien lo encontrara super practico :D

Como administradores es super util automatizar algunas tareas, los invito a visitar el Script Center de Microsoft donde encontraran este y muchos otros scripts muy utilies.

Este script usa CDO (Collaboration Data Objects), el codigo lo escribimos en un archivo de extension .vbs y lo ejecutamos usando el comando cscript.

cscript C:\Alertas\alerta.vbs

Veamos ahora como armar este mail y enviarlo.

Primero que nada creamos el objeto que usaremos para enviar el mail, para ello crearemos una instancia que llamaremos objEmail que sera un objeto CDO.Message.

Set objEmail = CreateObject("CDO.Message")

Cuando se envia un mail lo primero es indicar quien lo envia y a quien, esto se hace en los atributos From y To del objeto creado.

objEmail.From = "helpdesk@fabrikam.com"
objEmail.To = "administrator@fabrikam.com"


Por supuesto esto no basta, necesitamos agregarle el tema y por supuesto el contenido del mensaje.

objEmail.Subject = "Server down"
objEmail.Textbody = "Server1 is no longer accessible over the network."


Seguramente queremos tambien agregar algun archivo atachado a este mensaje.

objEmail.AddAttachment "C:\Scripts\Output.txt"

Ya tenemos nuestro mail, ahora hay que enviarlo, una de las formas es usando un smtp local (IIS), con lo cual no necesitamos agregar nada mas a nuestro script, aunque si debemos configurar el smtp para que reciba los mails y lo reenvie a donde corresponda, pero si deseamos usar nuestro servidor de correo que ya tenemos funcionando debemos agregar unas lineas mas.

objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "serversmtp"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update


Algunos servidores por seguridad piden autenticacion, si este es el caso otro par de lineas nos ayuda con esto.

objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = "fabrikam\kenmyer"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "&gr54#wgha"


Y por ultimo, enviamos el mail

objEmail.Send

Y ya estamos listos para ejecutar nuestro script.

Saludos!

Isa