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

时间:2010-04-14 22:38:43

标签: shell exchange-server cmdlets

目标:使用Visual Basic或C#或.NET提供与Exchange命令行管理程序交互的Web服务,发送命令以运行cmdlet,并将结果作为XML返回。 (请注意,我们可以使用任何语言来编写服务,但由于它是Windows Box并且我们有Visual Studio 2008,因此最简单的解决方案似乎只是使用它来创建VB / .NET Web服务。实际上,它这很简单,只需点击即可。)

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

似乎我们应该能够创建运行cmdlet的PowerShell脚本,并且能够从命令行调用它,因此只需从程序中调用它。这听起来不错吗?如果是这样我将如何解决这个问题?谢谢。答案可能与语言无关,但Visual Basic可能是最好的,因为这是我加载测试Web服务的。

2 个答案:

答案 0 :(得分:1)

从MSDN http://msdn.microsoft.com/en-us/library/exchange/bb332449(v=exchg.80).aspx改编的实际代码可能很棘手,因为您必须获得权限并在包含所有Exchange插件的macine上运行它:

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;
    }

答案 1 :(得分:0)

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

简短的回答是,您在Visual Studio中创建一个新的PowerShell应用程序,然后添加对System.Management.Automation dll的引用。这允许您为Powershell设置命名空间并对其进行调用。 http://msdn.microsoft.com/en-us/library/system.management.automation(VS.85).aspx您可以使用可用的管道类http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.pipeline(VS.85).aspx创建管道,以便管理您的命令。然后将命令放入,根据需要添加参数。运行该应用程序,它将返回您在PowerShell中调用的cmdlet的结果,您可以从那里开始。