2011-10-18 4 views
1

Я пытаюсь выполнить следующие действия:PowerShell SnapIn вопросы в C#

 

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 и не уверен, что именно то, что означает, что ошибка. Это что-то, что мне нужно установить?

EDIT: Полный код

 

     /// 
     /// 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

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

2

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

0

Вы должны открыть сеанс удаленной PowerShell для запуска команд PS из C#. Выполнение Exchange snapin локально из кода 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();