2015-12-16 1 views
0

Мне нужно выполнить скрипт powershell из моего веб-приложения asp.net MVC. Мое требование - динамически создавать семейства сайтов. У меня есть сценарий для него, и он работает отлично. Нет аргументов, которые нужно передать скрипту. Код, который я использую был показан ниже:Выполнение сценария PowerShell с веб-приложения C# MVC

RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create(); 

Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration); 
runspace.Open(); 

RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace); 

Pipeline pipeline = runspace.CreatePipeline(); 

//Here's how you add a new script with arguments 
Command myCommand = new Command(scriptfiellocation); 

pipeline.Commands.Add(myCommand); 
pipeline.Commands.Add("Out-String"); 

// Execute PowerShell script 
var result = pipeline.Invoke(); 

На выполнении кода, когда я проверяю счетчик переменного результата дает отсчет как 1. Однако на проверку моего сайта, нет семейства сайтов который был создан. Я не могу определить, где я ошибаюсь, поскольку нет ошибки времени выполнения, и команда Invoke также работает нормально.

Может ли кто-нибудь сказать мне, где я, возможно, собираюсь сбежать? Учитывая, что сценарий PowerShell отлично работает при работе с оболочкой управления.

+0

Может быть проблемой с разрешениями. Имеет ли учетная запись, на которой работает сайт, необходимые разрешения? Проверьте состояние трубопровода после операции Invoke. – stuartd

+0

Состояние трубопровода отображается как «Завершено» после завершения операции. И да, учетная запись также имеет необходимые разрешения. Любая идея о том, что еще может вызвать проблему? – Granal

ответ

0

Мне пришлось отказаться от подхода к трубопроводу, поскольку я не мог понять, в чем проблема. Еще одна проблема с этим подходом заключается в том, что она породила ошибку: «Get-SPWbTemplate не распознается как командлет». Следующий код работает прекрасно для меня и создал необходимые семейства сайтов:

PowerShell powershell = PowerShell.Create(); 
        //RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create(); 
        //Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration) 
        using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
        { 
         runspace.Open(); 
         //RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace); 
         //scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted"); 
         powershell.Runspace = runspace; 
         //powershell.Commands.AddScript("Add-PsSnapin Microsoft.SharePoint.PowerShell"); 
         System.IO.StreamReader sr = new System.IO.StreamReader(scriptfilepath); 
         powershell.AddScript(sr.ReadToEnd()); 
         //powershell.AddCommand("Out-String"); 
         var results = powershell.Invoke(); 
         if (powershell.Streams.Error.Count > 0) 
         { 
          // error records were written to the error stream. 
          // do something with the items found. 
         } 
        } 

Также не было никаких требований, чтобы установить политику выполнения.

0

ну не знаю, если его помощь, но я никогда не использую конвейер для запуска командной оболочки, не уверен, как это работает.

Но вот быстрого пример

Runspace RS = RunspaceFactory.CreateRunspace(myConnection); 
    PowerShell PS = PowerShell.Create(); 

     PSCommand PScmd = new PSCommand(); 
     string cmdStr = "Enable-Mailbox -Identity " + username + " -Database DB01 -Alias " + aliasexample; 
     PScmd.AddScript(cmdStr); 

    try 
    { 
     RS.Open(); 
     PS.Runspace = RS; 
     PS.Commands = PScmd; 
     PS.Invoke(); 
    } 
    catch (Exception ex) 
    { 
     ex.ToString(); 
    } 
    finally 
    { 
     RS.Dispose(); 
     RS = null; 
     PS.Dispose(); 
     PS = null; 
    } 

с попыткой поймать вы можете поймать ошибку с отладкой, если что-то пойдет не так. Если я правильно помню, мне пришлось поставить ACL.exe для разрешения на файловую систему, чтобы я мог выполнить команду командной строки, вы можете выполнить быстрый поиск в Google для нее. Надеюсь, что эта помощь.

+0

Я использовал блок catch try. Однако он никогда не входит в блок catch. Таким образом, я не могу понять, где это происходит! – Granal

+0

как я говорю, не уверен, как использовать Pipeline, поэтому я не могу рассказать вам об этом, но, проверив класс, вы можете сделать это var error = конвейер.Error.Read() as Collection , чем проверить, если его нуль затем перебирает его чтобы проверить ошибку, если нет, возможно, что-то связано с разрешением или отсутствием какого-либо файла в вашей системе, например, я использую Acl на моем хосте для запуска разрешения командной команды powershell. Это может быть сложно сделать командной оболочкой в ​​веб-приложении. – DarkVision

Смежные вопросы