Executar cmdlets de shell de gerenciamento de troca do Visual Basic/C#/. App Net
-
27-09-2019 - |
Pergunta
Objetivo: Forneça um serviço da Web usando o Visual Basic ou C# ou .NET que interage com o Shell de gerenciamento do Exchange, enviando comandos para executar cmdlets e retornar os resultados como XML. (Observe que poderíamos usar qualquer Lanaguage para escrever o serviço, mas como é uma caixa do Windows e temos o Visual Studio 2008, parecia que a solução mais fácil seria usá -la apenas para criar um serviço da web VB/.NET. De fato, ela Foi muito fácil de fazer isso, apenas aponte e clique.)
Problema: Como executar um shell cmdlet do Exchange Management do Serviço da Web, por exemplo, Get-DistributionGroupMember "Live Presidents"
Parece que devemos ser capazes de criar um script do PowerShell que executa o cmdlet e capaz de chamar isso da linha de comando e, assim, apenas chamá -lo de dentro do programa. Isso soa correto? Se sim, como eu iria fazer isso? Obrigado. A resposta pode ser agnóstica de idioma, mas o Visual Basic provavelmente seria o melhor, pois é isso que eu carreguei o serviço da Web de teste.
Solução 2
Bem, não obtive uma resposta, mas meio que descobri. Eu tive um problema em obter um PowerShell de 64 bits para correr, mas eventualmente atualizei para o Exchange 2010 e usei C# e não havia mais um problema.
A resposta curta é que você cria um novo aplicativo PowerShell no Visual Studio e adiciona uma referência à DLL System.Management.Automation. Isso permite que você configure um espaço para nome para o PowerShell e faça chamadas para ele. http://msdn.microsoft.com/en-us/library/system.management.automation(vs.85).aspx Você cria um pipeline usando a aula de pipeline disponível http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.pipline(vs.85).aspx Para colocar seus comandos de volta. Em seguida, você coloca seus comandos, adicione parâmetros, se necessário. Execute o aplicativo e ele retornará os resultados dos cmdlets que você chamou no PowerShell e você pode ir a partir daí.
Outras dicas
O código real adaptado do msdn http://msdn.microsoft.com/en-us/library/exchange/bb332449(v=exchg.80).aspx Pode ser complicado, porque você precisa acertar as permissões e executá-lo em um Macine com todos os plug-ins do Exchange:
using Microsoft.Win32;
using System.Collections.ObjectModel;
using System.IO;
using System.Management.Automation.Runspaces;
using System.Reflection;
public static Runspace GetExchangeRunspace()
{
return GetExchangeRunspace("");
}
public static Runspace GetExchangeRunspace(string snapIn)
{
string consoleFilePath = (ScriptEngine.GetExchangeAssemblyPath()
+ "bin\\exshell.psc1").Replace("Exchange Server", "EXCHAN~1");
Response.Write("<br/>" + consoleFilePath);
PSConsoleLoadException warnings = null;
RunspaceConfiguration runspaceConfiguration
= RunspaceConfiguration.Create(consoleFilePath, out warnings);
if ((snapIn + "").Trim().Length > 0)
{
PSSnapInException warning = null;
Response.Write("<br/>Start AddPSSnapIn..." + snapIn);
Response.Write("<br/>"
+ runspaceConfiguration.AddPSSnapIn(snapIn, out warning));
Response.Write("<br/>" + warning);
}
return RunspaceFactory.CreateRunspace(runspaceConfiguration);
}
private static string GetExchangeAssemblyPath()
{
string path = "";
try
{
RegistryKey key = Registry.LocalMachine.OpenSubKey(
"SOFTWARE\\Microsoft\\ExchangeServer\\v14\\Setup"); // or your version
if (key != null)
{
path = Path.GetFullPath(string.Concat(key.GetValue("MsiInstallPath")));
Response.Write(path);
}
}
catch (Exception ex) { }
return path;
}