Запуск PowerShell в C #, не повезло! - PullRequest
2 голосов
/ 28 февраля 2011

Я создал веб-приложение asp.net для внутреннего использования, которое позволяет определенным пользователям запускать и останавливать виртуальные машины, связанные с этими средами тестирования качества. Код на странице запускает скрипт powershell, который запускает выбранный сервер один раз кнопкойнажата на странице ASP.net.

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

каждый раз, когда я нажимаю кнопку наНа главной веб-странице ошибка, возвращаемая из сценария powershell, гласит: «Вы не можете вызвать метод для выражения с нулевым значением».единственная проблема в том, что если я запускаю его из командной строки powershell, например, ". \ script \ test.ps1 'W7EA9'", он работает нормально.

Это класс, который вызывает скрипт powershell.

    public String Startserver(String Servername)
    {

        String scriptText =". \\scripts\\test.ps1 " + Servername + "";


        // create Powershell runspace
        Runspace runspace = RunspaceFactory.CreateRunspace();
        // open it
        runspace.Open();

        // create a pipeline and feed it the script text
        Pipeline pipeline = runspace.CreatePipeline();
        pipeline.Commands.AddScript(scriptText);


        // execute the script
        Collection<PSObject> results = new Collection<PSObject>();

        try
        {
            results = pipeline.Invoke();
        }
        catch (Exception ex)
        {
            results.Add(new PSObject((object)ex.Message));
        }

        // close the runspace
        runspace.Close();

        // convert the script result into a single string
        StringBuilder stringBuilder = new StringBuilder();

        foreach (PSObject obj in results)
        {

            stringBuilder.AppendLine(obj.ToString());

        }

        return stringBuilder.ToString();
        //return scriptText;
    }

и вот сценарий powershell, который он пытается запустить

    Param ($server = $arg[0])

    $Core = get-wmiobject -namespace root\virtualization -class Msvm_Computersystem -filter "ElementName = '$server'"
    $status = $Core.RequestStateChange(2) `

Это может быть чем-то действительно очевидным, но я просто не вижу его, и любая помощь будет отличной.

спасибо

Крис

Ответы [ 5 ]

3 голосов
/ 28 февраля 2011

Вот лучшее пошаговое руководство по запуску PowerShell из ASP.NET.

http://devinfra -us.blogspot.com / 2011/02 / с использованием-20-PowerShell-из-Сеть САШ-часть-1.html

НТН

0 голосов
/ 28 июля 2014

В powershell коллекция аргументов по умолчанию называется $ args, с символом 's'; Я почти уверен, что именно поэтому $ server имеет значение null, когда вы запускаете его через код, и, таким образом, вызов Get-WmiObject возвращает значение null, вызывая ошибку при попытке вызвать для него метод RequestStateChange.

Полагаю, это нормально работает в обычном окне powershell, потому что у вас уже есть переменная $ server в сеансе.

0 голосов
/ 07 июля 2011

Вот как я это сделал.

Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();

Command myCommand = new Command("C:\\Scripts\\Test.ps1");
//I used full path name here, not sure if you have to or not 

CommandParameter myParam1 = new CommandParameter("-ServerName", "myServer");
myCommand.Parameters.Add(myParam1);
//You can add as many parameters as you need to here

pipeline.Commands.Add(myCommand);

Collection<PSObject> results = pipeline.Invoke();
runspace.Close();

StringBuilder stringBuilder = new StringBuilder()
foreach (PSObject obj in results) {
    stringBuilder.AppendLine(obj.ToString());
}
string thestring = stringBuilder.ToString();

Несколько заметок. Первая строка сценария, которая не является комментарием или пустой строкой, должна быть списком параметров, отформатированным следующим образом:

param([string]$ServerName,[string]$User)

У вас есть это, я просто хотел признать тот факт, что я не мог заставить это работать, когда мой файл скрипта был функцией с параметрами.

Для некоторых команд вам могут потребоваться дополнительные привилегии, в моем случае все мои сценарии работали таким образом, за исключением создания почтового ящика, для которого мне пришлось добавлять учетные данные в соединение.

Грег

0 голосов
/ 28 февраля 2011

Я передаю параметр от нажатия кнопки на странице asp.net, код которого выглядит следующим образом

        Hypervserver Start = new Hypervserver();

        String result = Start.Startserver("W7EA9");

        Label1.Visible = true;
        Label1.Text = result;
0 голосов
/ 28 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...