Запуск файла PowerShell в C #, как это сделать в форме ASP.NET? - PullRequest
3 голосов
/ 16 апреля 2009

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

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

Ответы [ 4 ]

5 голосов
/ 16 апреля 2009

Чтобы запустить powershell с помощью программы на C #, вы можете использовать Process.Start () с "C: \ WINDOWS \ system32 \ windowspowershell \ v1.0 \ powershell.exe" и предоставить соответствующий аргумент файла powershell ,

Для получения дополнительной информации, пожалуйста, запустите

C: \ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe -

Что касается проблемы с разрешениями, прочитайте Запуск сценариев из Windows PowerShell и убедитесь, что в PowerShell установлена ​​правильная ExecutionPolicy.

Дополнительная информация: http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept06/hey0926.mspx

4 голосов
/ 16 апреля 2009

В зависимости от того, как вы запускаете сценарий ASP.NET (сервер разработки VS или IIS), вам нужно будет учитывать тот факт, что «пользователь», выполняющий сценарий, вероятно, не вы, может не иметь такого же доступа к тем же вещам, что и вы.

Возможно, вам придется углубиться в это, чем "некоторая ошибка в разрешении и т. Д.", Потому что эта ошибка, вероятно, является самой сущностью вашей проблемы.

Вы можете обнаружить, что ProcMon (с www.sysinternals.com) является полезным инструментом для определения проблем с разрешениями.

1 голос
/ 17 апреля 2009

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

http://msdn.microsoft.com/en-us/library/ms714661(VS.85).aspx

http://devcentral.f5.com/weblogs/Joe/archive/2009/01/16/powershell-abcs---r-is-for-runspace.aspx

http://bartdesmet.net/blogs/bart/archive/2007/02/05/a-first-introduction-to-windows-powershell-runspaces.aspx (см. «Размещение пространства выполнения» в конце)

0 голосов
/ 26 августа 2014

Я бы использовал пространство имен System.Management.Automation и создал бы консольный объект PowerShell. Вы можете передать ему команды или файлы .ps1 - оба с аргументами - для выполнения. Гораздо чище, чем отдельная оболочка, которая затем должна вызывать powershell.exe.

Другие вещи, которые необходимо обеспечить, - это идентификация пула приложений. Убедитесь, что он обладает уровнем прав, необходимым для выполнения команд и / или сценариев PowerShell. Затем убедитесь, что вы правильно настроили Set-ExecutionPolicy, если собираетесь выполнять файлы сценариев.

Вот код, выполняющий команды, представленные веб-формой TextBox, как если бы это была консоль PowerShell, использующая эти объекты - должен иллюстрировать подход:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Management.Automation;
using System.Text;

namespace PowerShellExecution
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void ExecuteCode_Click(object sender, EventArgs e)
        {
            // Clean the Result TextBox
            ResultBox.Text = string.Empty;

            // Initialize PowerShell engine
            var shell = PowerShell.Create();

            // Add the script to the PowerShell object
            shell.Commands.AddScript(Input.Text);

            // Execute the script
            var results = shell.Invoke();

            // display results, with BaseObject converted to string
            // Note : use |out-string for console-like output
            if (results.Count > 0)
            {
                // We use a string builder ton create our result text
                var builder = new StringBuilder();

                foreach (var psObject in results)
                {
                    // Convert the Base Object to a string and append it to the string builder.
                    // Add \r\n for line breaks
                    builder.Append(psObject.BaseObject.ToString() + "\r\n");
                }

                // Encode the string in HTML (prevent security issue with 'dangerous' caracters like < >
                ResultBox.Text = Server.HtmlEncode(builder.ToString());
            }
        }
    }
}

Чтобы сделать это при загрузке страницы, вам нужно создать функцию, которая соответствует вашим потребностям, и вызвать ее из функции «Page_Load».

Вот описание, которое описывает, как создать страницу от начала до конца с помощью Visual Studio и как это сделать, http://grokgarble.com/blog/?p=142.

Пожалуйста, проголосуйте и отметьте соответственно, если полезно.

Спасибо, Джефф

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