Archive for the 'Windows' Category

Powershell: creación y eliminación de snapshots Hyper-V

índice

En un entorno virtual, es una muy buena práctica tener controlados los snapshots de nuestras máquinas virtuales. A diferencia de VMWare, en Hyper-V són puntos de control que se crean muy rápidamente y se consolidan de la misma forma. Es per ello que es una muy buena opción a contemplar como complemento de los backups.

En un caso concreto yo lo uso como estrategia de prevención contra Cryptolockers y ransomware varios haciendo que cada día, antes de que las empresas entren a trabajar se cree un punto de control. Para ello uso una tasca programada con el siguiente script:

Get-VM  * | checkpoint-vm -SnapshotName "[Nombre que le queramos dar] $((Get-Date).toshortdatestring())" –AsJob

Con este script en powershell, cada día se nos ejecutará un punto de control de TODAS nuestras máquinas virtuales. Podemos acotar la búsqueda o filtrar con el comando:

Get-VM –Name [Nombre de la M]

y que podremos filtrar. Por ejemplo: si todas nuestras máquinas virtuales se llaman SRV-[nombre] pero algunas son OLDSRV y solo queremos snapshots de las primeras, podemos hacer:

Get-VM SRV-*

Hecho esto, el siguiente paso es controlar cuantos snapshots queremos guardar. En mi caso solamente guardo un día puesto que como he dicho antes, es una medida de control contra los ransomware, no una backup. Para ello, uso el script siguiente:

Get-VMSnapshot –VMName [nombre_MV]* | Where-Object {$_.CreationTime -lt (Get-Date).AddDays(-1) } | Remove-VMSnapshot

Donde:

  • (Get-Date).AddDays(-1) son los días que quiero almacenar. En mi caso 1. Este valor lo podéis cambiar por el que queráis.
  • [nombre_MV]* es una string del nombre, como si fuera un sufijo. Es para filtrar.

De esta forma, puedo controlar que si nos entra algo que nos engorrine el sistema y es crítico, podemos en tan solo dos clics de ratón, volver al inicio del día. Eso si, para clientes o sistemas más críticos, uso el script varias veces al día y los elimino todos al día siguiente. La secuencia de comandos de la tasca programada es la siguiente:

powershell.exe –ExecutionPolicy Bypass –file “[ruta_del_script]”

Cambiar Win32Time a NTP

El otro día un cliente me comentó que tenía muchos problemas con la hora del servidor de dominio, y eso les daba muchos problemas. Revisando la instalación y configuración que tenía, me fijé que el PDC (Primary Domain Controller) no era el que subministraba la hora a los equipos del dominio, sino que lo hacía otro equipo mediante un ficherito bat. Esto claramente daba problemas, puesto que si el servidor que subministra la hora la pierde, arrastra con ello el resto de equipos.

¿Qué solución le propuse? Pues configurar que el PDC sirva la hora y que además no la sirva con el propio servicio Win32Time sino que lo haga como servidor NTP (mucho más estable).

Para ello, debemos ir a la siguiente clave del registro:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\

NTP_1

Debemos cambiar los valores siguientes:

  • El valor NtpServer les ponemos cualquier servidor NTP (en mi caso puse es.pool.ntp.org)
  • El valor Type cambiamos NT5DS a NTP

En la misma clave, pero en Config, cambiamos el valor AnnounceFlags de 10 a 5

image

Hecho esto, cerramos el regedit y abrimos un cmd en modo administrador y ejecutamos:

net stop w32time 

net start w32time

w32tm /resync /rediscover

Y testeamos la conexión con el siguiente comando:

c:\> net time \\[nombre_del_PDC] /set /y

¡Y listos! Nuestro servidor ya usará el sistema NTP para sincronizar la hora.

Error C:\Windows\System32\<LANG_NAME>\mstsc.exe.MUI

Error_LANG_NAME

Pues eso, como solucionar este maldito error que me trajo de cabeza durante un día entero? Pues instalando una (o las dos) actualizaciones siguientes:

KB2574819

KB2592687

Simple y llanamente…

Como reparar el error: “Servicio de perfil de usuario al iniciar sesion” en Windows 7

Este es un error (por desgracia) bastante frecuente en sistemas Windows Vista y Windows 7. Aunque nos parezca un “problemón” en verdad no lo es y su solución es muy simple.

NOTA: lo publico aquí porqué recientemente he visto que estos últimos días se han incrementado (sin comprender porqué) y, si puedo ser de ayuda, mejor 🙂

¡Al trapo!

  • Reiniciamos el PC/portátil en modo a prueba de fallos (Modo Seguro)
  • Ejecutamos la herramienta de registro de sistema REGEDIT pulsando la tecla Windows+R y escribiendo “REGEDIT”
  • Navegamos hacia HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList
  • Dentro veremos unos registros con un nombre del estilo S-1-5-20-93829738927189372891 y deberíamos ver uno de estos registros con una extensión .bak al final. Si hay varios de ellos, deberemos fijarnos que la numeración coincida (tomad como referencia la extensión .bak)
  • Pulsamos sobre el registro que no termina con .bak y, en el panel de la derecha si detectamos que en una de las keys pone C:\Users\Temp entonces debemos cambiar el registro.
  • Verificamos que en la que sí que termina en .bak una de las keys contiene el parámetro C:\Users\[nombre de usuarios] Si existe, este es el registro bueno.
  • Pulsamos F2 sobre el registro SIN extensión .bak y lo renombramos como .bak2
  • Pulsamos F2 sobre el registro CON extensión .bak y eliminamos la extensión
  • Pulsamos F2 sobre el registro CON extensión .bak2 y le borramos el 2
  • Cerramos el editor
  • Reiniciamos

Hecho esto, nuestro sistema iniciará sin problemas. Si por lo que sea, haciendo esto no nos arranca con normalidad, el problema será otro y deberemos averiguar de dónde viene la incidencia.

Monitorizar y reportar Exchange Online

El otro dia necesitaba una herramienta que me proporcionara estadísticas curradas de las cuentas de usuario de Exchange Online para mi posterior gestión y encontré esta maravilla:

Mail Protection Reports for Office 365

Esta herramienta nos permite, entre otros:

  • Tráfico
  • Correo no deseado
  • Malware
  • Reglas
  • Prevención de pérdida de datos

Para aquellos “sysadmins” que requieran de unos informes curradetes 🙂

Powershell: ¿Cómo sé cuanto ocupan mis buzones en Office 365?

Pues eso: ¿cómo podemos saber cuanto ocupan nuestros buzones de Exchange Online en Office365?

De nuevo, usando Powershell y un script más que estupendo podemos obtener un fichero CSV donde  podemos ver el nombre de usuario, los elementos totales, el tamaño total del buzón en Gb, elementos en la bandeja de entrada y varios campos más 🙂 Importante! Debemos tener PowerShell actualizado a la versión 3.

Solamente copiad el script y guardarlo con la extensión *.ps1. Y recordad que antes de ejecutar el script tenéis que conectaros al Exchange:

  • Revisamos que la política sea “Unrestricted”
Get-ExecutionPolicy
Set-ExecutionPolicy Unrestricted
  • Nos conectamos y nos descargamos los cmdlet
$LiveCred=Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri &amp;lt;a href=&amp;quot;https://ps.outlook.com/powershell/&amp;quot;&amp;gt;https://ps.outlook.com/powershell/&amp;lt;/a&amp;gt; -Credential $LiveCred -Authentication Basic -AllowRedirection
Import-PSSession $Session

Y grabamos el script en un *.ps1.

#requires -version 3
[cmdletbinding()]
Param(
[Parameter(Position=0,
Mandatory=$false,
HelpMessage='Path of the CSV log file.')]
[String]$LogName = 'MailBoxes.csv'#,

#[Switch]$CountAllMailsItems

)

[System.Collections.ArrayList]$Mbx = @()
Write-Verbose -Message &quot;Searching for mailboxes...&quot;
$Mailboxes = Get-MailBox -ResultSize unlimited
[int]$i = 1
[int]$TotalMailboxes = $Mailboxes.count
Write-Verbose -Message &quot;$TotalMailboxes mailboxes found.&quot;

ForEach($MailBox in $Mailboxes){
Write-Progress -Activity &quot;$($MailBox.Alias)&quot; -Status &quot;Running&quot; -PercentComplete ([int]$($i/$TotalMailboxes*100))
Write-Verbose -Message &quot;$($MailBox.Alias)...&quot;
$i++

$MailBoxFolderStatistic = Get-MailboxFolderStatistics $MailBox.Identity -IncludeOldestAndNewestItems
$Calendar = $MailBoxFolderStatistic | ? {$_.FolderType -eq 'Calendar'}
$Contacts = $MailBoxFolderStatistic | ? {$_.FolderType -eq 'Contacts'}
$Inbox = $MailBoxFolderStatistic | ? {$_.FolderType -eq 'Inbox'}
$DeletedItems = $MailBoxFolderStatistic | ? {$_.FolderType -eq 'DeletedItems'}
$SentItems = $MailBoxFolderStatistic | ? {$_.FolderType -eq 'SentItems'}

&amp;lt;#
if($CountAllMailsItems){
$Mails = $MailBoxFolderStatistic | ? {($_.FolderType -eq 'User Created') -OR ($_.FolderType -eq 'Inbox') -OR ($_.FolderType -eq 'SentItems') -OR ($_.FolderType -eq 'Boite de récéption')}

[int]$ItemsInFolder = 0
ForEach($Folder in $Mails){
$ItemsInFolder += $Folder.ItemsInFolder
$FolderSize += $Folder.FolderSize
}
}
else{
$ItemsInFolder = &quot;N/A&quot;
$FolderSize = &quot;N/A&quot;
}
#&amp;gt;

$MailBoxStatistic = Get-MailboxStatistics $MailBox.Identity

$Mbx.Add([PSCustomObject][Ordered] @{
#Mailbox
Name = $MailBox.Name
TotalItems = $MailBoxStatistic.ItemCount
TotalSize = $MailBoxStatistic.TotalItemSize
#Mails
#TotalMail = $ItemsInFolder
#TotalMailSize = $FolderSize
SizeInMB = (($MailBoxStatistic.TotalItemSize.Value.ToString().split('(')[-1]).split(' ')[0]).Replace(',','') /1MB -as [int]
InboxItem = $Inbox.ItemsInFolder
InboxItemSize = $Inbox.FolderSize
LastReceive = $Inbox.NewestItemReceivedDate
FirstReceive = $Inbox.OldestItemReceivedDate
DeletedItems = $DeletedItems.ItemsInFolderAndSubfolders
DeletedItemsSize = $MailBoxStatistic.TotalDeletedItemSize
SentItems = $SentItems.ItemsInFolder
SentItemsSize = $SentItems.FolderSize
#Calendar
TotalCalendar = $Calendar.ItemsInFolder
TotalCalendarSize = $Calendar.FolderSize
#Contacts
Contacts = $Contacts.ItemsInFolder
#Divers
LastLogon = $MailBoxStatistic.LastLogonTime
Language = $MailBox.Languages
}) | Out-Null

$ItemsInFolder = $FolderSize = $MailBoxFolderStatistic = $Calendar = $Contacts = $Inbox = $DeletedItems = $SentItems = $MailBoxStatistic = $null
}
$Mbx | Export-Csv -NoTypeInformation -Delimiter ';' $LogName

Administrar Active Directory con Powershell: modificar la carpeta personal del perfil de usuario

El otro dia me encontré con un problema bastante “peasado” para resolver. En casa de un cliente, hicimos una migación de servidor de dominio de un Win2k3 hacia un Win2k8R2 con un Win2k12R2 como soporte secundario. La migración fue perfecta pero repasando los perfiles de usuario del ActiveDirectory, vi que muchos de ellos en su perfil tenian configurada una ruta hacia una carpeta personal que ya no servia de nada.

Problema: como hago para poder eliminar la ruta configurada en el perfil de usuario sin ir uno a uno, botón derecho, propieades, perfil … para unos 80 usuarios?

Solución: mi queridíssimo Powershell 🙂 Empezamos!

  • Primer paso (importante): Ejecutar powershell desde nuestro servidor controlador de dominio y tener instalado los modulos de gestión del ActiveDirectory (por defecto cuando promocionamos un servidor, se instalan).
AddWindowsFeature RSAT-AD-PowerShell
Import-Module ActiveDirectory
  • Segundo Paso: Una vez instalado e importado el módulo, deberemos sacar la información de los usuarios. Para ello usaremos el comando Get-ADUser. Pero atención, si lo usamos a “paloseco”, se nos pedirà que apliquemos un filtro de búsqueda. Para que hagáis la prueba, ejecutad el siguiente comando:
Get-ADUser -Filter *

El parámetro “-Filter *” nos va a mostrar todos los usuarios del AD.

  • Tercer paso: ahora que sabemos buscar los usuarios, deberemos saber la información contenida en dicho usuario. Para ello usaremos el parámetro “-properties *”. Esto nos sacará TODAS las propiedades del usuario. Con ello sabremos que campo modificar:
Get-ADUser [nombre de usuario con el que se loguea] -propierties *

Si nos fijamos en el resultado, ya vemos que campo queremos modificar en nuestro caso concreto: HomeDirectory. Sabiendo esto, podemos acotar aún más el filtro:

Get-ADUser [nombre de usuario con el que se loguea] -properties HomeDirectory
  • Quarto paso:Ahora teniendo ya toda la información, procedemos a la modificación del parámetro HomeDirectory para TODOS los usuarios del ActiveDirectory y lo dejaremos sin ninguna ruta:
Get-ADUser -Filter * -properties HomeDirectory | Set-ADUser -Clear HomeDirectory

Y listos! Nos hemos ahorrado ir usuario a usuario modificando el HomeDirectory y lo hemos podido hacer en solo una línea de código. Ahora bien, si somos un poco ordenados y tenemos inventariadas las rutas de las carpetas locales, podemos hacer filtros y modificar solamente aquellas rutas que nos interesen. Por ejemplo, si solo quiero modificar la ruta Z:\empresa\perfiles\usuarios\ usaría el siguiente comando:

Get-ADUser -Filter * -properties HomeDirectory | where {$_.homedirectory -like "Z:\empresa\perfiles\usuarios" | Set-ADUser -Clear HomeDirectory

O si quiero cambiar a otro directorio de red:

Get-ADUser -Filter * -properties HomeDirectory | where {$_.homedirectory -like "[Directorio Viejo" | Set-ADUser -HomeDirectory "[Directorio Nuevo]"

PowerShell si lo sabemos usar o si queremos administrar nuestro dominio de una forma sencilla y rápida, es una herramienta muy poderosa. Además, siempre podemos tener nuestro repositorio de comandos en un OneNote para tenerlos a mano. En mi caso, no siempre me acuerdo de todo 😛

Espero haberos ayudado!


Categorias

Enter your email address to follow this blog and receive notifications of new posts by email.

Únete a otros 386 seguidores

RSS Acceso Directo

  • Regresa La Familia Monster en nueva serie de TV 08/18/2017
    La cadena de televisión CBS, creadora de la original serie cómica The Munster (mejor conocida en habla hispana como La Familia Monster), cedió los derechos de dicha serie a la cadena de televisión NBC para su regreso a las pantallas chicas. La Familia Monster fue trasmitida de 1964 a 1966 …

RSS Microsiervos

RSS Bitelia

  • Cómo usar y aprovechar los escritorios virtuales de Windows 10 08/18/2017
    Más espacio para jugar, divertirte o trabajar en la misma pantalla. Cuando Windows implementó la multitarea, nadie pensó en que eso haría que tuviéramos varias ventanas abiertas, ocupando toda la pantalla aunque sin poder verlas todas. En las sucesivas actualizaciones, Windows ha intentado solucionar este problema. En Windows Vista y 7 pudimos mostrar las ve […]