.NET + Powershell + Exchange 2007

21 04 2010

Hace poco hice un programa con Visual Studio 2008 en Visual Basic .Net. Este programa entre otras muchas cosas crea buzones a usuarios en Exchange 2007. Esto me trajo de cabeza durante varios días, ya que en la versión 2007  toda la gestión se realiza mediante PorwerShell, lo cual facilita mucho el trabajo, a no ser que, como en mi caso, estés programando en VB.

Busqué información en la web Microsoft y seguí los pasos que indicaban sobre como ejecutar cmdlets PowerShell en VB, pero aún así seguía sin funcionar.

Finalmente conseguí mi objetivo siguiendo los siguientes pasos:

  • Agregar Referencias

Agrega una referencia al assembly System.Management.Automation.dll. De forma predeterminada, este assembly se instala en C:\Archivos de programa\Reference Asambleas\Microsoft\WindowsPowerShell\v1.0\ . Después de hacer referencia al assembly, agrega las instrucciones siguientes al código:

        Imports System.Management.Automation
        Imports System.Management.Automation.Host
        Imports System.Management.Automation.Runspaces
        Imports System.Collections.ObjectModel
  • Procedimiento ejecución comandos powershell

En mi código, creé un procedimiento el cual recibe el comando a ejecutar mediante una variable. Dicho procedimiento es este:

Private Sub RunScript(ByVal scriptText As String)
   ' Crear runspace Powershell
   Dim MyRunSpace As Runspace = RunspaceFactory.CreateRunspace()
   ' Lo abrimos
   MyRunSpace.Open()
   ' Crear un pipeline (tuberia) y asignarle el script mediante la variable scriptText
   Dim MyPipeline As Pipeline = MyRunSpace.CreatePipeline()
   MyPipeline.Commands.AddScript(scriptText)
   ' Ejecutamos el script
   Dim results As Collection(Of PSObject) = MyPipeline.Invoke()
   ' Se cierra el runspace
   MyRunSpace.Close()
   ' Se convierte el resultado del script en una unica cadena
   Dim MyStringBuilder As New StringBuilder()
   For Each obj As PSObject In results
   MyStringBuilder.AppendLine(obj.ToString())
   Next
End Sub

Donde la variable scriptText tiene asignado como valor el comando en cuestión, en mi caso el de creación de buzones:

scripText = "New-Mailbox -Name " & NombreyApellidos & " -Database " & Server & "\" & StorageGroup & "\" & MDBName & " -Password (convertto-securestring " & passwd & " -asplaintext -force) -UserPrincipalName " & login & "@" & ServerMail & " -Alias " & email & " -OrganitationalUnit " & Vinalopo & strContainer & " -SamAccountName " & login & " -FirstName " & strUser & " -Initial '' -LastName " & strApellido

Espero haberme explicado bien….