在C#中运行PowerShell文件,如何在ASP.NET表单中实现这一点?

在C#中运行PowerShell文件,如何在ASP.NET表单中实现这一点?,c#,asp.net,powershell,C#,Asp.net,Powershell,我制作了一个脚本,它运行得非常好,当我独立运行它时会生成一个文本文件。我想在每次加载页面时自动调用C#中的一个进程,该进程调用我的PowerShell脚本并执行该脚本,从而生成一个文本文件 问题是脚本正在被调用,但没有被执行。给出有关权限等的一些错误。要使用C程序运行powershell,可以与“C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe”一起使用,并提供相应的powershell文件参数 有关更多信息,请运行 C:\WIN

我制作了一个脚本,它运行得非常好,当我独立运行它时会生成一个文本文件。我想在每次加载页面时自动调用C#中的一个进程,该进程调用我的PowerShell脚本并执行该脚本,从而生成一个文本文件

问题是脚本正在被调用,但没有被执行。给出有关权限等的一些错误。

要使用C程序运行powershell,可以与“C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe”一起使用,并提供相应的powershell文件参数

有关更多信息,请运行

C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -?

关于权限问题,请阅读,并确保powershell具有正确的执行策略


进一步信息:

根据您运行ASP.NET脚本(VS development server或IIS)的方式,您需要考虑这样一个事实,即运行脚本的“用户”可能不是您,并且可能没有与您相同的访问权限

除了“关于权限等的一些错误”之外,您可能还需要进一步研究,因为这个错误可能是您问题的本质所在


您可能会发现,ProcMon(来自www.sysinternals.com)是查找权限问题的有用工具。

您应该研究的另一个选项是直接在代码中运行脚本,这将消除对文本文件的需求

(请参见结尾的“托管运行空间”)

我将利用名称空间并创建一个PowerShell控制台对象。您可以将命令或.ps1文件(两者都带有参数)传递给它以供执行。比单独调用powershell.exe的shell干净得多

要确保适当的其他事项是应用程序池的标识。确保其具有执行PowerShell命令和/或脚本所需的权限级别。接下来,如果要执行脚本文件,请确保已正确设置ExecutionPolicy

下面是执行TextBox web表单提交的命令的代码,就好像它是一个使用这些对象的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());
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用系统、管理、自动化;
使用系统文本;
命名空间PowerShellExecution
{
公共部分类默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
}
受保护的void ExecuteCode\u单击(对象发送方,事件参数e)
{
//清除结果文本框
ResultBox.Text=string.Empty;
//初始化PowerShell引擎
var shell=PowerShell.Create();
//将脚本添加到PowerShell对象
shell.Commands.AddScript(Input.Text);
//执行脚本
var results=shell.Invoke();
//显示结果,将BaseObject转换为字符串
//注意:对于类似控制台的输出,使用| out字符串
如果(results.Count>0)
{
//我们使用字符串生成器来创建结果文本
var builder=新的StringBuilder();
foreach(结果中的var psObject)
{
//将基础对象转换为字符串并将其附加到字符串生成器。
//为换行符添加\r\n
Append(psObject.BaseObject.ToString()+“\r\n”);
}
//用HTML编码字符串(防止出现“危险”字符的安全问题,如<>
ResultBox.Text=Server.HtmlEncode(builder.ToString());
}
}
}
}
要在加载页面时执行此操作,您需要创建一个满足需要的函数,并从“page_Load”函数调用它

下面是一篇文章,介绍如何使用Visual Studio从头到尾创建页面,并完成此操作

如果有帮助,请进行投票并适当标记

谢谢,
Jeff

Process.Start()类的更好链接:有没有关于它的完整源代码的解决方案?你能在这里重新发布这些代码吗?我们希望所有答案都是“自包含的”,即使它们链接到或使用非现场资源。谢谢!