miércoles, 14 de septiembre de 2016

User profile cannot be loaded

Hoy, uno de los administradores quiso autenticarse en un servidor y recibió un error (Figura 1).
Figura 1

El error me resultaba conocido, y está relacionado con la corrupción del perfil del usuario. Varios artículos indican que se debe entrar en el registro del equipo y borrar una clave que contiene el SID del usuario, la cual finaliza con ".BAK". Pero éste no era el caso, ya que para poder aplicar esa resolución, era necesario que el usuario se hubiera validado al menos una vez en el equipo, para que el perfil pudiera crearse y luego corromperse.

Buscando otra solución, revisé el Event Viewer y encontré un evento relacionado (Figura 2).

Figura 2


Al parecer un KB aplicado al equipo cambió los permisos en el archivo que se indica en el Event 1509. La resolución fue modificar los permisos en el archivo para que herede los mismos permisos que el directorio que lo contenía, para que la copia del perfil del nuevo usuario se complete con éxito.




martes, 19 de abril de 2016

Buscar permisos en AD

Buscar en Active Directory los permisos que se han asignado a diferentes objetos, es una tarea complicada. En AD existen varios tipos de objeto: OU, usuarios, grupos, cuentas de equipo, etc, y a veces necesitamos saber dónde fue delegada una cuenta.
Para facilitar la búsqueda, podemos utilizar PowerShell!
Como vamos a trabajar con Active Directory, lo primero es importar el modulo de AD (Figura 1) y cambiar la ubicación de trabajo desde el C:\ a AD (Figura 1)
Figura 1
Luego le asignamos a una variable, el valor de todos los objetos de AD (Figura 2).
Figura 2

Por último, para cada valor de la variable donde tenemos todos los objetos de AD, hacemos una búsqueda de los permisos en su Access Control List (ACL) y mostramos los resultados (Figura 3).

Figura 3

cmdlets:
Import-Module ActiveDirectory

 
Set-Location AD:

 
$allO=(Get-ADObject -Filter * -Properties DistinguishedName).distinguishedname

 
foreach ($one in $allO) {(get-acl $one).access |? {$_.IdentityReference -like "*deleo*" }| ft @{Expression={$one};label="Nombre"},IdentityReference,AccessControlType,@{Expression={(Get-ADObject $one).objectClass};label="Type"}}

lunes, 21 de marzo de 2016

Evento en el MUG - Introducción a PowerShell para IT Pros

Para los que estén por Buenos Aires, el Miércoles 6 de Abril de 2016, de 18:30 a 20:30 hs, en el Auditorio del MUG, Rivadavia 1479  Primer Piso "A".

Será un encuentro introductorio para IT Pros que quieran iniciarse en el mundo de PowerShell. Orientado a administradores de red y técnicos de soporte. No es un evento para desarrolladores, aunque también son bienvenidos.

El evento es gratuito y puede registrarse en este link.

viernes, 18 de marzo de 2016

FlushDNS con problemas

Muchas veces usamos el comando "Ipconfig /FlushDNS" para borrar la lista de nombres almacenada en un equipo, algo tan simple que no parece probable que nos encontremos con un error.
Sin embargo, hace poco, al intentar borrar la lista de nombres utilizando ese comando me encontré con un error que parecía bastante complicado (Figura 1).
Figura 1
Could not flush the DNS Resolver Cache: Function failed during execution.
Por suerte, resolverlo resulta mucho más fácil de lo que parece. El problema es que el servicio "DNS Client" no estaba en ejecución, como pudimos ver por la consola de servicios (Figura 2) o por la línea de comandos (Figura 3).
Figura 2

Figura 3

Al iniciar el servicio (En la consola de Servicios, con el comando "Net Start DNSCache" o el comando "SC Start DNSCache") pudimos limpiar exitosamente la lista de nombres almacenados en memoria (Figura 4).
Figura 4

lunes, 21 de diciembre de 2015

Exchange Quota Notification

En versiones de Exchange Server anteriores a 2010 SP1, los usuarios recibían avisos por email cuando se superaba un límite de cuota. Después de Exchange 2010 SP1, el comportamiento del aviso por email cambió y desde Exchange Server 2013 el estado de la cuota no es calculado (Figura 1).

Figura 1

Muchos administradores se encuentran con la necesidad de avisar por email a los usuarios acerca del tamaño de sus buzones.

A continuación les comparto un script que realicé para que se envíe un mail a los usuarios cuando uno de los limites se sobrepasa:

#Coneccion a Server Exchange Cambiar el nombre del server Exchange en -ConnectionUri
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://FQDNServerName/PowerShell/ -Authentication Kerberos
Import-PSSession $Session

#Parametros a usar
$smtpServer="ExchangeServer.com"
$from = "Administrador "
$adminmail ="Admin@dominio.com"
#Buscar todos los usuarios con Mailbox - Aqui se puede definir un subset de usuarios para hacer pruebas
$Users=Get-Mailbox * | Select Alias

#Revisa cada usuario y toma acciones
foreach ($User in $Users) {

$UserData= get-Mailbox $User.alias | Select Name,PrimarySmtpAddress,Identity,Database,UseDatabaseQuotaDefaults,ProhibitSendQuota,ProhibitSendReceiveQuota,IssueWarningQuota
$Size= get-mailbox $UserData.Identity | Get-MailboxStatistics |Select TotalItemSize
$BaseData= get-mailboxdatabase $UserData.Database | Select Name,ProhibitSendQuota,ProhibitSendReceiveQuota,IssueWarningQuota
        If( $UserData.UseDatabaseQuotaDefaults -like $false) {
            $Lim1= $UserData.ProhibitSendReceiveQuota
            $Lim2= $UserData.ProhibitSendQuota
            $Lim3= $UserData.IssueWarningQuota
        }
        Else {
            $Lim1= $BaseData.ProhibitSendReceiveQuota
            $Lim2= $BaseData.ProhibitSendQuota
            $Lim3= $BaseData.IssueWarningQuota
        }
       
 If( $Lim1.IsUnlimited -and $Lim2.IsUnlimited -and $Lim3.IsUnlimited) {
            $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::NoChecking
        }
        Else {
            $res= $null
            If( -not $Lim1.IsUnlimited -and $Size.totalItemSize.Value -gt $Lim1) {
                $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::MailboxDisabled
            }
            Else {
                If( -not $Lim2.IsUnlimited -and $Size.totalItemSize.Value -gt $Lim2) {
                    $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::ProhibitSend
      $Porce=100*($Size.totalItemSize.Value.toMB()/$Lim2.Value.toMB())
      $limite="no poder enviar mas correos."
                }
                Else {
                    If( -not $Lim3.IsUnlimited -and $Size.totalItemSize.Value -gt $Lim3) {
                        $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::IssueWarning
   $Porce=100*($Size.totalItemSize.Value.toMB()/$Lim2.Value.toMB())
   $limite="advertencia."
                    }
                    Else {
                        $res= [Microsoft.Exchange.Data.Mapi.StorageLimitStatus]::BelowLimit
   $Porce=100*($Size.totalItemSize.Value.toMB()/$Lim1.Value.toMB())
   $limite="OK"
                    }
                }
            }
        }

$Usuario=$UserData.Name
$email=$UserData.PrimarySmtpAddress
$Porce=[math]::Round($Porce,2)
#Envio de Email Email
    # Email Subject
    $subject="Advertencia de espacio de buzon"
    
    # Email body, con formato HTML
    $body ="
    Estimado $Usuario,
    <.p> Su buzon de correo llego al limite de $limite<.br>
    El porcentaje actual de ocupacion es de $Porce %, por favor elimine correos innecesarios<.br>
    Puede consultar la documentacion en LinkADocumento <.br>
   <.p>Gracias, <.br>
    <./P>"
# Envia Email
if ($limite -ne "OK"){
Send-Mailmessage -smtpServer $smtpServer -from $from -to $email -subject $subject -body $body -bodyasHTML -priority High 
# Envia Email al administrador para control/test
#Send-Mailmessage -smtpServer $smtpServer -from $from -to $adminmail -subject $subject -body $body -bodyasHTML -priority High 
}
}

Nota: En el script, los Tags HTML que se utilizan dentro de la variable $body, fueron modificados agregándoles un "." para que no se apliquen al formato del articulo y puedan ser vistos por el lector. Todos los "." de los Tags deben ser removidos antes de utilizar el script.

miércoles, 25 de noviembre de 2015

Evento de VLans & Network en el MUG

El Miércoles 16 de diciembre de 2015, de 18:30 a 21:00 hs, en el Auditorio del MUG, Rivadavia 1479  Primer Piso "A", Buenos Aires. Vamos a estar con Rodrigo De Los Santos para ver administración de redes separadas dentro de VLANs, especialmente como configurar un switch para poder utilizar múltiples segmentos en conjunto con Windows Server sin que entren en conflicto.

El evento es gratuito y puede registrarse en este link.

miércoles, 11 de noviembre de 2015

Copiar Quotas de FSRM a otro server

En un Windows Server podemos definir límites de capacidad de almacenamiento por directorio con Quota Management. Los límites pueden ser informativos o estrictos. Cuando un límite es alcanzado se puede registrar un evento, enviar un mail al usuario, al administrador, o prohibir la ejecución de la operación.  

Todas las configuraciones son locales del servidor. Pero en algunos casos necesitaremos pasar las configuraciones a un nuevo equipo, como en el caso de una migración, o a otro servidor que está replicado, como es el caso de un ambiente con DFS-R. No hay posibilidad nativa de exportar/importar las Quotas, pero podemos realizar una operación similar con PowerShell.

Primero guardamos la información de qué directorio o directorios queremos controlar (Figura 1), el limite, y si la cuota definida es informativa (Soft Quota) o restrictiva (Hard Quota).

Figura 1
 
 Get-FSRMQouta | Select Path, Size, SoftLimit | Export-Csv "Directorio\Archivo" -NoTypeInformation  
 
Luego, en el servidor de destino creamos un Template (Figura 2), en el cual configuramos las notificaciones que queremos recibir. No importa el límite que especifiquemos (en este caso 1000 TB), porque los limites que se aplicarán serán los que importemos del equipo original.

Figura 2

 
Una vez  creado el Template, en el servidor de destino importamos el archivo que exportamos desde el servidor de origen y lo guardamos en una variable ($a en este caso). Por último, para cada entrada guardada en la variable creamos una entrada de Quota según lo definido en el archivo en donde indicamos el directorio, el limite y en qué Template está basado (Figura 3)
 
Figura 3