Проблемы с PowerShell SnapIn в C # - PullRequest
1 голос
/ 18 октября 2011

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


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 && 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();
        }

Ответы [ 3 ]

3 голосов
/ 19 октября 2011

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

2 голосов
/ 19 октября 2011

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

0 голосов
/ 05 ноября 2013

Вы должны открыть удаленный сеанс 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();
...