Me pidieron que validara las cuentas que utilizamos para instalar SharePoint en un ambiente de producción y pues la gente de la mesa de soporte al ver que mi petición no tiene tanta urgencia “según ellos” y conforme a sus acuerdos de niveles de servicio me informaron que en una semana me tendrían la respuesta a mi solicitud. El problema a solucionar es que no se sabía si la contraseña X era la misma que se usó en todas las cuentas de SharePoint, en total fueron 9 cuentas y dado que en una semana ni siquiera estaré aquí físicamente me vi en la necesidad de encontrar una solución alterna rápidamente.
Las cuentas a validar fueron:
POLLOLOCOSP_farm
POLLOLOCOSP_services
POLLOLOCOSP_web
POLLOLOCOSP_search
POLLOLOCOSP_sync
POLLOLOCOSP_superuser
POLLOLOCOSP_superreader
POLLOLOCOSP_crawl
POLLOLOCOSP_unattended
Estimado lector, para solucionar tu problema, ¿qué harías si en algún momento de tu vida fuiste un apasionado programador .NET y sabes que puedes hacer al respecto?, ¿Te esperarías a que la gente de mesa de soporte de acuerdo a sus prioridades te responda?, ¿serias un radical y con el poder que el conocimiento te da resolverías tú mismo tus problemas, claro sin que muera nadie?
En mi caso decidí bajar Visual Studio 2012 Express for Windows Desktop y escribir una aplicación de consola que utilizando el namespace de System.DirectoryServices pudiese consultar el active directory en cuestión y validar las credenciales que necesito validar. En tan solo 12 minutos ya tenía mi instancia de Visual Studio 2012 Express for Windows Desktop instalada, durante la descarga busqué en internet y encontré que desde la versión 3.5 del .NET Framework se incluyó una nueva funcionalidad para gestión de active directory la cual se encuentra en System.DirectoryServices.AccountManagement y pues utilizando la clase PrincipalContext pude invocar el método ValidateCredentials con el cual sabría si la cuenta X o Y era válida.
El código lo comparto aquí:
using System;
using System.Text;
using System.DirectoryServices.AccountManagement;
namespace TestAccount
{
class Program
{
static void Main(string[] args)
{
bool isValidAccount = false;
Console.WriteLine("Domain Name (NetBios):");
string domainName = Console.ReadLine();
Console.WriteLine("User account:");
string accountName = Console.ReadLine();
Console.WriteLine("Password:");
string accountPassword = Console.ReadLine();
try
{
if (string.IsNullOrEmpty(domainName) || string.IsNullOrEmpty(accountName) || string.IsNullOrEmpty(accountPassword))
throw new ArgumentNullException();
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domainName))
{
isValidAccount = context.ValidateCredentials(accountName, accountPassword);
}
Console.WriteLine("{0}\{1} - {2}",domainName, accountName, isValidAccount.ValidNotValidString());
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}",ex.Message);
}
finally
{
Console.ReadKey();
}
}
}
public static class BooleanExtensions
{
public static string ValidNotValidString(this bool value)
{
return value ? "Valid account" : "Not Valid account, check username or password!";
}
}
}
Y la solución aquí también la puedes encontrar en el attachment, dentro esta el ejecutable compilado.
PD. Cuando el equipo de la mesa de ayuda me contacte de 5 días, que le debería de decir en respuesta?
Saludos
Originalmente publicado en msmvps.com