Проблемы с привязкой PowerShell в C#

#c# #powershell #powershell-2.0 #exchange-server #cmdlets

#c# #powershell #powershell-2.0 #exchange-сервер #powershell-командлет

Вопрос:

Я пытаюсь выполнить следующее:

 
StringBuilder errorList = new StringBuilder();
            RunspaceConfiguration runspaceConfig = RunspaceConfiguration.Create();
            PSSnapInException snapEx = null;
            PSSnapInInfo psinfo = runspaceConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapEx);
            Runspace runSpace = RunspaceFactory.CreateRunspace(runspaceConfig);
            runSpace.Open();
            Pipeline pipeLine = runSpace.CreatePipeline();
  

Я получаю следующую ошибку:
No snap-ins have been registered for Windows PowerShell version 2.

Я новичок в PoweShell и не совсем уверен, что означает эта ошибка. Это то, что мне нужно установить?

РЕДАКТИРОВАТЬ: полный код

 
        /// 
        /// Creates mailbox for the given user.
        /// 
        /// Email address of user.
        public void EnableMailbox(string userEmail)
        {
            StringBuilder errorList = new StringBuilder();
            RunspaceConfiguration runspaceConfig = RunspaceConfiguration.Create();
            PSSnapInException snapEx = null;
            PSSnapInInfo psinfo = runspaceConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapEx);
            Runspace runSpace = RunspaceFactory.CreateRunspace(runspaceConfig);
            runSpace.Open();
            Pipeline pipeLine = runSpace.CreatePipeline();
            if (!MailBoxAlreadyExist(userEmail, runSpace))
            {
                Command createMailbox = new Command("Enable-Mailbox");
                createMailbox.Parameters.Add("identity", userEmail);
                createMailbox.Parameters.Add("database", "Mailbox Database Name");
                pipeLine.Commands.Add(createMailbox);
                pipeLine.Invoke();
                if (pipeLine.Error != null amp;amp; pipeLine.Error.Count > 0)
                {
                    foreach (object item in pipeLine.Error.ReadToEnd())
                    {
                        errorList.Append(item.ToString());
                        errorList.Append(System.Environment.NewLine);
                    }
                    Console.WriteLine(errorList.ToString());
                }
            }
            else
            {
                Console.WriteLine("Mailbox of user "   userEmail   " already exists on exchange server.");
            }
            pipeLine.Dispose();
            runSpace.Close();
            runSpace.Dispose();
        }
  

Ответ №1:

Существует различие между 32-разрядными и 64-разрядными привязками. Возможно, Echange является только 32-разрядным, в этом случае установите для вашего проекта C # целевую платформу x86. Если Exchange 64-разрядный, установите для проекта C # только целевую платформу x64.

Ответ №2:

Как указывает Кит, вам понадобится правильная целевая платформа. Exchange работает только в 64-разрядной версии. Вам нужно настроить ваш проект C # на целевую платформу x64. В новых проектах по умолчанию установлено значение x86 (по крайней мере, в Visual Studio 2010).

Ответ №3:

Вы должны открыть удаленный сеанс powershell, чтобы запускать команды PS из c #. Локальное выполнение привязки Exchange из кода c # больше не поддерживается. Вот пример для перечисления существующих почтовых ящиков:

 var ExchangeCredential = new PSCredential(user, password.ToSecureString());
string serverName = string.Format("{0}.{1}", GetMachinename(), GetDomainName());
var serverUri = new Uri(String.Format("http://{0}/powershell?serializationLevel=Full", serverName));

var connectionInfo = new WSManConnectionInfo(serverUri,"http://schemas.microsoft.com/powershell/Microsoft.Exchange", ExchangeCredential);

runspace = RunspaceFactory.CreateRunspace(connectionInfo);
PowerShell psh = PowerShell.Create();
psh.Runspace = ru

Pipeline pipeline = runspace.CreatePipeline();
var command = new Command("Get-MailboxDatabase");
command.Parameters.Add(new CommandParameter("Status", true));

pipeline.Commands.Add(command);
commandResults = pipeline.Invoke();