在C#中运行PowerShell文件,如何在ASP.NET表单中实现这一点?
我制作了一个脚本,它运行得非常好,当我独立运行它时会生成一个文本文件。我想在每次加载页面时自动调用C#中的一个进程,该进程调用我的PowerShell脚本并执行该脚本,从而生成一个文本文件 问题是脚本正在被调用,但没有被执行。给出有关权限等的一些错误。要使用C程序运行powershell,可以与“C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe”一起使用,并提供相应的powershell文件参数 有关更多信息,请运行 C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -? 关于权限问题,请阅读,并确保powershell具有正确的执行策略在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
进一步信息:根据您运行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从头到尾创建页面,并完成此操作
如果有帮助,请进行投票并适当标记
谢谢,
JeffProcess.Start()类的更好链接:有没有关于它的完整源代码的解决方案?你能在这里重新发布这些代码吗?我们希望所有答案都是“自包含的”,即使它们链接到或使用非现场资源。谢谢!