2015-05-22 5 views
0

У меня есть сценарий powershell, который отлично работает при запуске в powershell, но при попытке запустить из C#. Скрипт powershell пытается подключиться к lync онлайн (скайп для бизнеса) и перечислить онлайн-пользователей lync.Ошибка при попытке запустить скрипт powershell с C#

Вот код, который вызывает Powershell скрипт из C#

 public static void ImportLyncUsers() 
    { 

     RunspaceConfiguration config = RunspaceConfiguration.Create(); 
     using (Runspace myRs = RunspaceFactory.CreateRunspace(config)) 
     { 
      myRs.Open(); 

      RunspaceInvoke scriptInvoker = new RunspaceInvoke(myRs); 
      scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted"); 

      using (PowerShell powerShellInstance = PowerShell.Create()) 
      { 
       powerShellInstance.Runspace = myRs; 

       // Import module. 
       powerShellInstance.Commands.AddCommand("Import-Module") 
        .AddArgument(
         @"C:\Program Files\Common Files\Microsoft Lync Server 2013\Modules\LyncOnlineConnector\LyncOnlineConnector.psd1"); 
       powerShellInstance.Invoke(); 
       powerShellInstance.Commands.Clear(); 
       var filePath = @"F:\PresensoftNewTrunk\Trunk\Lync Archiver\Exchange\Scripts\ImportUsers.ps1"; 
       powerShellInstance.Commands.AddScript(System.IO.File.ReadAllText(filePath)); 


       Collection<PSObject> psOutput = powerShellInstance.Invoke(); //Getting exception here. 

       // check the other output streams (for example, the error stream) 
       if (powerShellInstance.Streams.Error.Count > 0) 
       { 
        // error records were written to the error stream. 
        // do something with the items found. 
       } 
      } 
     } 

    } 

Вот ошибка, которую я получаю при попытке запустить пс скрипт из C#.

Message  : Object reference not set to an instance of an object. 
Data   : {} 
InnerException : 
TargetSite  : Void .ctor(IDCRLMode) 
StackTrace  : at Microsoft.Rtc.Admin.Authentication.ManagedIdcrl..ctor(IDC 
       RLMode mode) 
        at Microsoft.Rtc.Admin.Authentication.ManagedIdcrl..ctor() 
        at Microsoft.Rtc.Management.LyncOnlineConnector.GetWebTicket 
       Cmdlet.CreateAndInitializeManagedIdcrl() 
        at Microsoft.Rtc.Management.LyncOnlineConnector.GetWebTicket 
       Cmdlet.get_ManagedIdcrl() 
        at Microsoft.Rtc.Management.LyncOnlineConnector.GetWebTicket 
       Cmdlet.GetLiveIdToken(String remoteFqdn, Int32 port, 
       PSCredential creds) 
        at Microsoft.Rtc.Management.LyncOnlineConnector.GetWebTicket 
       Cmdlet.ConnectToWebTicketService(String fqdn, Int32 port, 
       PSCredential creds) 
        at Microsoft.Rtc.Management.LyncOnlineConnector.GetWebTicket 
       Cmdlet.BeginProcessing() 
        at System.Management.Automation.Cmdlet.DoBeginProcessing() 
        at 
       System.Management.Automation.CommandProcessorBase.DoBegin() 
HelpLink  : 
Source   : Microsoft.Rtc.Admin.AuthenticationHelper 
HResult  : -2147467261 

А вот часть пс сценария

$secpasswd = New-Object -TypeName System.Security.SecureString 
    $password = [LyncFoundation.Helpers.StringHelper]::Decrypt($exchangeServer.Password); 
    $password.ToCharArray() | ForEach-Object { $secpasswd.AppendChar($_) } 
    $cred = New-Object System.Management.Automation.PSCredential ($exchangeServer.UserName,$secpasswd) 

    #Get Lync Users 
    Import-Module LyncOnlineConnector 
    try{ 
    $CSSession = New-CsOnlineSession -Credential $cred 
    } 
    catch [System.Net.WebException]{ 

     if ($_.Exception.Message.Contains("Unable to query AutoDiscover")){ 
      $CSSession = New-CsOnlineSession -Credential $cred -OverridePowershellUri https://admin0a.online.lync.com/OcsPowershellLiveId 
     } 
     else{ 
      throw $_.Exception 
     } 
    } 

Я задаюсь вопросом, почему скрипт работает плавно, когда непосредственно выполняется из PowerShell, но дает мне ошибку при попытке вызова из C#. Какую среду мне нужно настроить для прохождения этой ошибки?

+0

Я бы заглянул (используя dotPeek) в 'CreateAndInitializeManagedIdcrl', похоже, что отсутствует IDCRLMode'. – nohwnd

+0

Я уже пробовал дизассемблировать dll, который поставляется с LyncModule с IlSpy, он говорит, что dll не управляется. – Sameer

ответ

3

Код выглядит нормально. Я столкнулся с аналогичной проблемой и , так как Lync Online из PowerShell - это 64-разрядный номер должен скомпилировать для этой платформы вместо стандартного процессора.

+0

Спасибо !!! .. никогда не осознавал этого. Ты спас меня от большой головной боли. – Sameer

+0

есть ли другое решение без изменения 64-битного режима компиляции? @Alberto Gurrion – Rengasamy

+0

Я не думаю, что @Rengasamy, поскольку это предпосылка для использования этого конкретного модуля –