lunes, 27 de julio de 2009

¿Cómo hacer un Servicio Windows en C#? (Con timer)

3 comentarios:
Tenimos el servicio. Escribiendo al log. Unicamente:
public partial class MyNewService: ServiceBase
{
  public MyNewService()
   {
     InitializeComponent();
      if (!System.Diagnostics.EventLog.SourceExists("MySource"))
      {
      System.Diagnostics.EventLog.CreateEventSource(
      "MySource","MyNewLog");
     }
     eventLog1.Source = "MySource";
     eventLog1.Log = "MyNewLog";
    }


   protected override void OnStart(string[] args)
   {
      eventLog1.WriteEntry("In OnStart");
   }

   protected override void OnStop()
   {
      eventLog1.WriteEntry("In onStop.");
   }
 }

Bueno ahora hay que agregar un timer:
Pueden agregar un timer grafico o por codigo.
como agregarlo por código
Abran el archivo
MyNewService.Designer.cs
agreguen el código en la parte de abajo de su documento para definir el timer:

private System.Timers.Timer mytimer;

ahora busquen el evento
private void InitializeComponent()

agreguen esta definicion alli:
this.mytimer = new System.Timers.Timer();
((System.ComponentModel.ISupportInitialize)(this.mytimer)).BeginInit();

this.mytimer.Enabled = true;
this.mytimer.Interval = 2000D;
this.mytimer.Elapsed += new System.Timers.ElapsedEventHandler(this.mytimer_Elapsed);
((System.ComponentModel.ISupportInitialize)(this.mytimer)).EndInit();

ahora cambiemonos al servicio MyNewService
y busquemos el evento OnStart y agreguen la configuracion tal y como aparece abajo:

protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
this.mytimer.Elapsed += new System.Timers.ElapsedEventHandler(mytimer_Elapsed);
mytimer.Interval = 2000;
mytimer.Enabled = true;
}

agregue el siguiente evento:
en medio de este evento puede conectarse a la db o hacer lo que ustedes quieran.

private void mytimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
}
Ver

miércoles, 15 de julio de 2009

¿Cómo hacer un Servicio Windows en C#?

6 comentarios:
Los servicios Windows son programas que corren en background independiente del usuario que tenga sesiones activas en un server. Son usamos para múltiples tareas administrativas, no es una aplicación normal de Windows, ya que no tiene interfaz gráfica.



Crear el proyecto.
1. En el menu File, click en New Project
---- La venta de New Project se abrira

2. Seleccione el projecto Windows Service de la lista de C#, coloque el nombre de MyNewService. y luego OK.

--- ser creara Service1.cs

3. Sobre el diseñador de service1 precione clic derecho y propiedades sobre Service1, el la ventana de propiedades busque la propiedad Service Name y cambielo por MyService
y asegurese que la opcion autolog este en true.

3.1 Que alla cambiado el nombre del servicio en la ventan de propiedades no sigmifica que el nombre de la clase tambien cambiara, tendra que renombrar la clase desde el Solucion explorer precionando click derecho sobre el servicio y luego rename y colocando el nombre MyNewService.

4. Sobre el diseñador de MyNewService precione clic derecho view Code.

Tendra 3 void
MyNewService() ---------------es el constructor
OnStart(string[] args)--------es el evento que se disparar cuando inicie el componente
OnStop()-----------------------es el evento que se disparar cuando pare el componente




Agregando Caracteristicas al Componente
En los siguientes pasos vamos agregar codigo para escribir en el log de windows nuestras actidades


Pero primero necesitamos agregar un evenLog del toolbox

5. En el costructor crearemos en el una entrada en el log de windows para poder ingresar entradas en log.

public MyNewService()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MySource","MyNewLog");
}

eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}

6. Ahora vamos a definir que ocurre cuando el servicio inicia, en el editor de codigo buscar el evento OnStart y pondremos la entrada al log.

protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
}

7. Ahora vamos a definir que ocurre cuando el servicio es detenido, en el editor de codigo buscar el evento OnStop y pondremos la entrada al log.

protected override void OnStop()
{
eventLog1.WriteEntry("In onStop.");
}

hay otro evento pero ese no lo capturaremos se llama Oncontinue y se dispara cuando el servicio es detenido y luego puesto en marcha de nuevo.
Ver mas info aquí

Ahora es momento de Instalarlo.
8. Sobre el modo diseño del servicio precione click en add Instaler
esto llevara unos minutos.

Compile y ctl + shif + b o en el menu build
este generara MyNewService.exe

Intalarlo en el server.
se puede hacer de 2 maneras la facil y la dificil
1.) hacer un instalador.
2.) la facil que es la que voy a mostrarles

a.)Copie su proyecto compilado al servidor.
b.)En el servidor donde van a poner su servicio ingrese a una consola de Microsoft Windows SDK - CMD Shell
c.)por medio de commando de dos(cd .. , c:\algo) dijijase a la carpeta bin y debug o release hasta que encuente su exe

d.)installutil MyNewService.exe
Esto instalara en windows service, ahora ya esta instalado su servicio.
para quitarlo

installutil /u MyNewService.exe

En la face 2 pondremos un timer para que se ejecute cada cierto tiempo un evento.
Ver

viernes, 10 de julio de 2009

Crear un Inbox en Microsfot Exchange desde Aspnet

1 comentario:
Para crear un inbox en Exchange primero necesitamos tener un usuario de AD, luego van a necesitar una libreria llamada
Windows SDK for Windows Server 2008 and .NET Framework 3.5

Y luego aqui esta el codigo para habilidar su cuenta de exchange, tiene que tener creado su usuario de windows(ver articulo anterior)


using System.Management.Automation;
using System.Management.Automation.Host;
using System.Management.Automation.Runspaces;


public void HabilitarCuenta(string usuario)
{
ICollection results;
RunspaceConfiguration runspaceConf = RunspaceConfiguration.Create();
PSSnapInException PSException = null;
PSSnapInInfo info = runspaceConf.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out PSException);
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConf);
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();

Command createMailbox = new Command("Enable-Mailbox");
createMailbox.Parameters.Add("identity", @"test.corp/usuarios/" + txtusuario.Text);
createMailbox.Parameters.Add("alias",usuario);
createMailbox.Parameters.Add("database", @"TEST2\First Storage Group\Mailbox Database");
pipeline.Commands.Add(createMailbox);
results = pipeline.Invoke();
}
Ver

martes, 7 de julio de 2009

Crear un usuario en el Active Directory desde aspnet

No hay comentarios.:
Antes de Crear la cuenta necesito hacer una enum que nos servira mas adelante, esto si lo ponen en la pagina hay que ponerlo despues del

public partial class Nuevo : System.Web.UI.Page
{
(la linea de arriba solo es ejemplo donde debe poner el enum)

aquí esta el codigo del enum:
[Flags]
public enum AdsUserFlags
{
Script = 1, // 0x1
AccountDisabled = 2, // 0x2
HomeDirectoryRequired = 8, // 0x8
AccountLockedOut = 16, // 0x10
PasswordNotRequired = 32, // 0x20
PasswordCannotChange = 64, // 0x40
EncryptedTextPasswordAllowed = 128, // 0x80
TempDuplicateAccount = 256, // 0x100
NormalAccount = 512, // 0x200
InterDomainTrustAccount = 2048, // 0x800
WorkstationTrustAccount = 4096, // 0x1000
ServerTrustAccount = 8192, // 0x2000
PasswordDoesNotExpire = 65536, // 0x10000
MnsLogonAccount = 131072, // 0x20000
SmartCardRequired = 262144, // 0x40000
TrustedForDelegation = 524288, // 0x80000
AccountNotDelegated = 1048576, // 0x100000
UseDesKeyOnly = 2097152, // 0x200000
DontRequirePreauth = 4194304, // 0x400000
PasswordExpired = 8388608, // 0x800000
TrustedToAuthenticateForDelegation = 16777216, // 0x1000000
NoAuthDataRequired = 33554432, // 0x2000000
Habilitarcuenta = 512 // 0x2000000
}

Otra cosa hay que crear una OU(unidad organizacional) llamada usuarios, ya que aquí estaran nuestros usuarios.

Aquí esta el código de ingreso de usuario:

DirectoryEntry parent = new DirectoryEntry(
"LDAP://OU=usuarios,DC=test,DC=corp",
null,
null,
AuthenticationTypes.Secure
);

DirectoryEntry user =
parent.Children.Add("CN=test.user", "user");

using (user)
{
user.Properties["sAMAccountName"].Value = "test.user";
user.Properties["userPrincipalName"].Value = "test.user";
user.Properties["displayName"].Value = "nombre completo";
user.Properties["givenName"].Value = "Nombre";
user.Properties["sn"].Value = "apellidos";
user.Properties["description"].Value = "usuario creado automaticamente";
user.CommitChanges();
}

Esta cuenta no esta lista para usarla ya que hay que colocarle un password:

DirectoryEntry ent = new DirectoryEntry("LDAP://CN=test.user,OU=usuarios,DC=test,DC=corp");

ent.Properties["pwdLastSet"].Value = 0;
ent.Invoke("SetPassword", new object[] { "3l!teP@$$w0RDz" });

y aun no esta lista para usarla ya que falta habilitar la cuenta.

DirectoryEntry entry = new DirectoryEntry("LDAP://CN=test.user,OU=usuarios,DC=test,DC=corp");

AdsUserFlags newValue = AdsUserFlags.NormalAccount
| AdsUserFlags.PasswordDoesNotExpire
| AdsUserFlags.Habilitarcuenta;


entry.Properties["userAccountControl"].Value = newValue;
entry.CommitChanges();

Con esto ya tendran listo su Usuario de Active directory.

Recomendaciones & Tips.

Corran esto en el servidor no es su pc ya que si no estan pegados al dominio pueden tener problemas.

Colocar el identity si van usar anonimos:


Por ultimo si da un error que el objeto no es existe es por que estan buscando el usuario en la OU equivocada.

Espero les sirva.
Ver