cmdlets del Shell de administración de Exchange de ejecución de Visual Basic / C # /. NET aplicación
-
27-09-2019 - |
Pregunta
Objetivo: Proporcionar un servicio web utilizando Visual Basic o C # .NET o que interactúa con el Shell de administración de Exchange, enviándolo comandos para ejecutar los cmdlets, y devolver los resultados como XML. (Nótese que se podría utilizar cualquier lanaguage para escribir el servicio, pero ya que es una caja de Windows y tenemos Visual Studio 2008, parecía que la solución más fácil sería sólo lo utilizan para crear un servicio web VB / .NET. De hecho, era bastante fácil de hacerlo, sólo apuntar y hacer clic.)
Problema: ¿Cómo ejecutar un cmdlet del Shell de administración de Exchange desde el servicio web, por ejemplo, Get-DistributionGroupMember "Presidentes en directo"
Parece que debemos ser capaces de crear un script de PowerShell que se ejecuta el cmdlet, y ser capaz de llamar a que a partir de la línea de comandos, por lo que acaba de llamar desde el programa. Hace este sonido correcto? Si es así ¿cómo iba a ir sobre esto? Gracias. Respuesta puede ser independiente del lenguaje, pero Visual Basic, probablemente sería mejor ya que es lo que he cargado el servicio web de prueba en.
Solución 2
Bueno, no recibió una respuesta, pero algo se lo imaginó. Tuve un problema para conseguir una de 64 bits PowerShell para ejecutar, pero con el tiempo de actualizar a Exchange 2010 y usado C # y entonces ya no era un problema.
La respuesta corta es que se crea una nueva aplicación PowerShell en Visual Studio, a continuación, se agrega una referencia a la DLL System.Management.Automation. Esto le permite configurar un espacio de nombres para Powershell y hacer llamadas a la misma. http://msdn.microsoft.com /en-us/library/system.management.automation(VS.85).aspx Se crea un oleoducto utilizando la clase disponible Pipeline http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces .pipeline (VS.85) .aspx con el fin de tubo de los comandos de la espalda. Luego, coloque sus órdenes en, add parámetros si es necesario. Ejecutar la aplicación y ha de devolver los resultados de los cmdlets que ha llamado en el PowerShell y se puede ir desde allí.
Otros consejos
El código real adaptado del de MSDN http://msdn.microsoft.com/en-us/library/exchange/bb332449(v=exchg.80).aspx puede ser complicado porque hay que conseguir los permisos derecha y ejecutarlo en un macine con todos los plug-ins de cambio:
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;
}