2012-01-30 3 views
0

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

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

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

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

ответ

1

Одной из ключевых проблем, которые возникнут у вас, является способ подключения к 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(); 
Смежные вопросы