Shell 从Visual Basic/C#/.NET应用程序运行Exchange命令行管理cmdlet

Shell 从Visual Basic/C#/.NET应用程序运行Exchange命令行管理cmdlet,shell,exchange-server,cmdlets,Shell,Exchange Server,Cmdlets,目标:使用Visual Basic或C#或.NET提供与Exchange命令行管理程序交互的web服务,向其发送命令以运行cmdlet,并以XML形式返回结果。(请注意,我们可以使用任何语言来编写服务,但由于它是一个Windows框,并且我们有Visual Studio 2008,似乎最简单的解决方案就是使用它创建一个VB/.NET web服务。实际上,这样做非常容易,只需点击即可。) 问题:如何从web服务运行Exchange命令行管理程序cmdlet,例如,获取DistributionGro

目标:使用Visual Basic或C#或.NET提供与Exchange命令行管理程序交互的web服务,向其发送命令以运行cmdlet,并以XML形式返回结果。(请注意,我们可以使用任何语言来编写服务,但由于它是一个Windows框,并且我们有Visual Studio 2008,似乎最简单的解决方案就是使用它创建一个VB/.NET web服务。实际上,这样做非常容易,只需点击即可。)

问题:如何从web服务运行Exchange命令行管理程序cmdlet,例如,获取DistributionGroupMember“Live Presidents”


似乎我们应该能够创建一个运行cmdlet的PowerShell脚本,并且能够从命令行调用它,因此只需从程序内部调用它。这听起来对吗?如果是这样的话,我该怎么做?谢谢答案可能与语言无关,但VisualBasic可能是最好的,因为这是我加载测试web服务的地方。

嗯,没有得到答案,但有点想通了。我在运行64位PowerShell时遇到问题,但最终升级到Exchange 2010并使用C#,然后就不再有问题了


简单的回答是,在Visual Studio中创建一个新的PowerShell应用程序,然后添加对System.Management.Automation dll的引用。这允许您为Powershell设置名称空间并对其进行调用。您可以使用可用的管道类创建管道,以便通过管道将命令传回。然后输入命令,必要时添加参数。运行该应用程序,它将返回您在PowerShell中调用的cmdlet的结果,您可以从此处开始

从MSDN改编的实际代码可能很棘手,因为您必须获得正确的权限,并在macine上与所有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;
    }
使用Microsoft.Win32;
使用System.Collections.ObjectModel;
使用System.IO;
使用System.Management.Automation.Runspaces;
运用系统反思;
公共静态运行空间GetExchangeRunspace()
{
返回GetExchangeRunspace(“”);
}
公共静态运行空间GetExchangeRunspace(字符串管理单元)
{
字符串consoleFilePath=(ScriptEngine.GetExchangeAssemblyPath()
+“bin\\exshell.psc1”)。替换(“Exchange服务器”、“EXCHAN~1”);
响应。写入(“
”+consoleFilePath); PSConsoleLoadeException warnings=null; 运行空间配置运行空间配置 =RunspaceConfiguration.Create(控制台路径,输出警告); 如果((管理单元+“”).Trim()长度>0) { PSSnapInException警告=null; 响应。写入(“
开始添加PSSNAPIN…”+管理单元); 响应。写入(“
” +AddPSSnapIn(管理单元,输出警告)); 响应。写入(“
”+警告); } 返回RunspaceFactory.CreateRunspace(runspaceConfiguration); } 私有静态字符串GetExchangeAssemblyPath() { 字符串路径=”; 尝试 { 注册表项key=Registry.LocalMachine.OpenSubKey( “软件\\Microsoft\\ExchangeServer\\v14\\Setup”);//或您的版本 if(key!=null) { path=path.GetFullPath(string.Concat(key.GetValue(“msinstallpath”)); Response.Write(路径); } } 捕获(例外情况除外){} 返回路径; }
如何显示Exchange命令行管理程序cmdlet?似乎您需要以某种方式添加对它们的引用,否则我会得到一个错误,即它们不存在。@Andrey您找到如何显示EMS cmdlet了吗?