1
votes

I currently have an ASP.NET programming creating a Powershell CmdLet to create a mailbox in exchange.

The issue I'm having is sometimes is fails to create the mailbox because "it can't find" the exchange database I am specifying.

So what I'm trying to do is run a Get-Mailbox and then pipe the results to an Enable-Mailbox command.

Below is the code I am using to do it:

Public Sub CreateMailbox()

    Dim getMailbox As Command
    getMailbox = GetMailboxCommand()

    Dim createCommand As Command
    createCommand = GetCreateCommand()

    Dim results As String

    results = RunCommand(createCommand, getMailbox)

    Dim setCommand As Command
    setCommand = GetSetCommand()

    results = RunCommand(setCommand)

End Sub

This is the command to get the mailbox:

Private Function GetMailboxCommand() As Command
    Dim cmd As New Command("Get-Mailbox")

    cmd.Parameters.Add("Database", UserDatabase)

    Return cmd
End Function

Command to create the mailbox:

Private Function GetCreateCommand() As Command
    Dim cmd As New Command("Enable-Mailbox")

    cmd.Parameters.Add("Identity", DistinguishedName)
    cmd.Parameters.Add("Database")
    cmd.Parameters.Add("Alias", UserAlias)
    cmd.Parameters.Add("PrimarySmtpAddress", PrimarySMTP)

    Return cmd

End Function

Code to execute all the powershell commands:

Private Function RunCommand(ByVal createCommand As Command, ByVal getMailbox As Command) As String
    'Create Runspace configuration
    Dim rsConfig As RunspaceConfiguration
    rsConfig = RunspaceConfiguration.Create()

    Dim snapInException As PSSnapInException = Nothing
    Dim info As PSSnapInInfo
    info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", snapInException)

    Dim myRunSpace As Runspace
    myRunSpace = RunspaceFactory.CreateRunspace(rsConfig)
    myRunSpace.Open()

    Dim pipeLine As Pipeline
    pipeLine = myRunSpace.CreatePipeline()

    pipeLine.Commands.Add(getMailbox)
    pipeLine.Commands.Add(createCommand)

    pipeLine.Commands.Add("Out-String")

    Dim commandResults As Collection(Of PSObject)
    commandResults = pipeLine.Invoke()

    myRunSpace.Close()

    Dim sb As String = "Results: "
    For Each result As PSObject In commandResults
        sb &= result.ToString
    Next

    Return sb
End Function
1
Is there any patterns at all to the failures? - Marco Shaw

1 Answers

0
votes

It turns out the issue was to do with the user being used to run the application pool did not have permissions to access the Exchange databases.