#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();