Вызов командлетов Exchange ActiveSync из приложения ASP.NET - PullRequest
0 голосов
/ 31 января 2012

Я работаю над решением, где пользователи могут стирать мобильные устройства, зарегистрированные в Exchange 2010, через веб-страницу, используя Outlook Web Access - это не вариант.Я установил средства управления Exchange на своем компьютере разработчика, и пул приложений использует удостоверение, обладающее необходимыми правами для выполнения команд (назначенная группа ролей «Управление получателями»).Я использую следующий код для выполнения вайпов

string deviceId = "deviceid";
    string username = "username";

    RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
    PSSnapInException snapInException = null;
    PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapInException);
    if(snapInException != null)
        throw snapInException;
    using(var runspace = RunspaceFactory.CreateRunspace(new MyPowershellHost(), rsConfig))
    {
        runspace.Open();

        using(var pipeline = runspace.CreatePipeline())
        {
            pipeline.Commands.AddScript(@". ""C:\Program files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1""");
            pipeline.Commands.AddScript("Connect-ExchangeServer -auto");
            pipeline.Invoke();
        }

        ActiveSyncDeviceConfiguration actualDevice;

        using(var pipeline = runspace.CreatePipeline())
        {
            pipeline.Commands.AddScript(string.Format("Get-ActiveSyncDeviceStatistics -Mailbox {0}", username));
            var result = pipeline.Invoke();
            actualDevice = result.Select(x => x.BaseObject as ActiveSyncDeviceConfiguration).Where(x => x.DeviceID.EndsWith(deviceId)).SingleOrDefault();
        }

        if(actualDevice != null)
        {
            var identity = actualDevice.Identity as ADObjectId;
            using(var pipeline = runspace.CreatePipeline())
            {
                var cmd = new Command("Clear-ActiveSyncDevice");
                cmd.Parameters.Add("Identity", identity.DistinguishedName);
                pipeline.Commands.Add(cmd);
                pipeline.Invoke();
            }
        }
    }

Я могу заставить это работать, когда учетная запись пользователя добавлена ​​в качестве локального администратора на машине, а также вошел в Windows.Я могу принять, если пользователь должен быть локальным администратором, но постоянный вход пользователя в систему нецелесообразен для серверного приложения.Класс MyPowershellHost - это просто базовая реализация хоста, позволяющая запускать скрипт RemoteExchange.ps1, так как он взаимодействует с пользовательским интерфейсом.

Я не могу понять, нужны ли пользователю дополнительные привилегии, или я просто делаю этонеправильно.

1 Ответ

1 голос
/ 09 марта 2012

Одна из ключевых проблем, с которой вы столкнетесь, - это способ подключения к Exchange. Вам не нужно загружать скрипт инструментов управления, как это делает консоль, вы просто используете удаленное взаимодействие PowerShell. Вам даже не нужны инструменты управления, установленные на веб-сервере.

Кроме того, Exchange 2010 не поддерживает загрузку оснастки напрямую.

Подробнее см. http://technet.microsoft.com/en-us/library/dd297932.aspx.

Пример кода:

using (var ps = PowerShell.Create()) {
    ps.AddScript("$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionURI 'http://[host]/PowerShell/' ; Import-PSSession -Session $session");
    ps.Invoke();
    // ... further powershell pipelines - now connected to Exchange and cmdlets are loaded
}

Вы также должны расследовать отправку пустого PSDataCollection на Invoke, для которого Complete() вызван. Это предотвратит блокировку конвейера Powershell для входного запроса, что приведет к зависанию процесса вашего веб-сервера.

var psInput = new PSDataCollection<PSObject>();
psInput.Complete();
...