Включить обмен 2010 почтовым ящиком - PullRequest
2 голосов
/ 02 декабря 2011

Я пытаюсь создать / включить почтовый ящик на сервере Exchange 2010 из кода C #.Куда бы я ни посмотрел, я вижу людей, использующих приведенный ниже код.

Однако я получаю следующую ошибку:

Термин «Enable-Mailbox» не распознается как имя командлета, функция, файл сценария или работоспособная программа.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

Что я делаю не так?

        SecureString password = new SecureString();

        string str_password = "myPassword";
        string username = "myUsername";

        //FQDN is ofcourse the (fully qualified) name of our exchange server..
        string liveIdconnectionUri = "http://FQDN/Powershell?serializationLevel=Full";

        foreach (char x in str_password)
        {
            password.AppendChar(x);
        }

        PSCredential credential = new PSCredential(username, password);

        WSManConnectionInfo connectionInfo = new WSManConnectionInfo((new Uri(liveIdconnectionUri)), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);
        connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default;

        Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo);
        PowerShell powershell = PowerShell.Create();
        PSCommand command = new PSCommand();

        command.AddCommand("Enable-Mailbox");
        command.AddParameter("Identity", "domainname.ltd/OUName/TestAcc Jap");
        command.AddParameter("Alias", "TestAccJap");
        command.AddParameter("Database", "DB-Name");

        powershell.Commands = command;

        try
        {
            runspace.Open();
            powershell.Runspace = runspace;
            powershell.Invoke();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            runspace.Dispose();
            runspace = null;
            powershell.Dispose();
            powershell = null;
        }

1 Ответ

1 голос
/ 03 декабря 2011

Вероятно, это ошибка, связанная с powershell.Если вы запускаете код с удаленного компьютера (не сервера обмена), вам необходимо разрешить удаленный доступ PowerShell для данного пользователя и убедиться, что брандмауэр (-ы) разрешает подключения к серверу обмена через порт 80. На сервере Exchangeсервер:

Set-User –identity username –RemotePowershellEnabled $True

Пользователь также должен быть членом роли управления обменом, позволяющей создавать почтовые ящики.

Если вы используете балансировщик нагрузки и / или у вас есть группа доступности базы данных, вам может потребоваться настроить альтернативную учетную запись службы для включения аутентификации Kerberos.Подробнее см. http://technet.microsoft.com/en-us/library/ff808313.aspx.Я должен был включить это, чтобы заставить код работать в моей среде.Я немного изменил код, чтобы просто проверить, могу ли я запускать команды exchange powershell.Следующий код отвечает полным именем пользователя USERIDENT в случае успеха.

static void Main(string[] args)
{
    SecureString password = new SecureString();
    string str_password = "PASS";
    string username = "domain\\user";

    //FQDN is ofcourse the (fully qualified) name of our exchange server.. 
    string liveIdconnectionUri = "http://SERVERFQDN/Powershell?serializationLevel=Full";
    foreach (char x in str_password)
    {
        password.AppendChar(x);
    }
    PSCredential credential = new PSCredential(username, password);
    WSManConnectionInfo connectionInfo = new WSManConnectionInfo((new Uri(liveIdconnectionUri)), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);
    Runspace runspace = null;
    PowerShell powershell = PowerShell.Create();
    PSCommand command = new PSCommand();
    command.AddCommand("Get-Mailbox");
    command.AddParameter("Identity", "USERIDENT");
    powershell.Commands = command;
    try
    {
        connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default;
        runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo);
        runspace.Open();
        powershell.Runspace = runspace;
        Collection<PSObject> commandResults = powershell.Invoke<PSObject>();
        foreach (PSObject result in commandResults)
        {
            Console.WriteLine(result.ToString());
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    finally
    {
        runspace.Dispose();
        runspace = null;
        powershell.Dispose();
        powershell = null;
    } 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...