Запуск командлетов командной консоли Exchange из приложения Visual Basic / C # /. NET - PullRequest
0 голосов
/ 15 апреля 2010

Цель: предоставить веб-службу с использованием Visual Basic или C # или .NET, которая взаимодействует с командной консолью Exchange, отправляя ей команды для запуска командлетов и возвращая результаты в виде XML. (Обратите внимание, что мы могли бы использовать любой язык для написания сервиса, но поскольку это Windows Box и у нас Visual Studio 2008, казалось, что самым простым решением было бы просто использовать его для создания веб-сервиса VB / .NET. Действительно, это это было довольно легко сделать, просто наведите и нажмите.)

Проблема: как выполнить командлет командной консоли Exchange из веб-службы, например Get-DistributionGroupMember "Live Presidents"

Кажется, что мы должны быть в состоянии создать сценарий PowerShell, который запускает командлет, и иметь возможность вызывать его из командной строки и, таким образом, просто вызывать его из программы. Это звучит правильно? Если так, как бы я пошел по этому поводу? Благодарю. Ответ может быть независимым от языка, но Visual Basic, вероятно, будет лучшим, поскольку именно в него я загрузил тестовый веб-сервис.

Ответы [ 2 ]

1 голос
/ 04 сентября 2013

Фактический код, адаптированный из MSDN http://msdn.microsoft.com/en-us/library/exchange/bb332449(v=exchg.80).aspx, может быть сложным, потому что вы должны получить правильные права доступа и запустить его на компьютере 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;
    }
0 голосов
/ 02 мая 2010

Ну, не получил ответа, но вроде понял. У меня была проблема с запуском 64-битной PowerShell, но в итоге я обновил ее до Exchange 2010 и использовал C #, и проблема больше не возникала.

Краткий ответ: вы создаете новое приложение PowerShell в Visual Studio, а затем добавляете ссылку на dll System.Management.Automation. Это позволяет вам настроить пространство имен для 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, и вы можете перейти оттуда.

...