我希望能够以不同的用户身份从ASP.NET应用程序运行powershell脚本。我可以成功运行powershell命令并查看输出,但我无法弄清楚如何以不同的用户身份执行它。 我遵循了这个指南:
http://jeffmurr.com/blog/?p=142
这只是一个文本框,我输入我的powershell-command,输出将显示在另一个文本框中。
我创建了一个新的IIS站点和一个以域用户身份运行的应用程序池,将新站点与池关联起来。我可以看到存在的唯一w3wp.exe进程作为我在池中指定的域用户运行。如果我运行命令仍然是:
write-output $Env:USERNAME
它返回系统帐户用户名," SERVERNAME $"。 谁知道为什么?我错过了什么?还有另一种方法可以实现同样的目标吗?
代码......
HTML:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="PowerShellExecution.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr><td> </td><td><h1 align="left">PowerShell Command Harness</h1></td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> </td><td>PowerShell Command</td></tr>
<tr><td>
<br />
</td><td>
<asp:TextBox ID="Input" runat="server" TextMode="MultiLine" Width="433px" Height="73px" ></asp:TextBox>
</td></tr>
<tr><td>
</td><td>
<asp:Button ID="ExecuteCode" runat="server" Text="Execute" Width="200" onclick="ExecuteCode_Click" />
</td></tr>
<tr><td> </td><td><h3>Result</h3></td></tr>
<tr><td>
</td><td>
<asp:TextBox ID="ResultBox" TextMode="MultiLine" Width="700" Height="200" runat="server"></asp:TextBox>
</td></tr>
</table>
</div>
</form>
</body>
</html>
C#
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
{
public TextBox ResultBox;
public TextBox Input;
protected void Page_Load(object sender, EventArgs e)
{
ResultBox = (TextBox)this.FindControl("ResultBox");
Input = (TextBox)this.FindControl("Input");
}
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);
// shell.Commands.AddScript("C:\\TestSite\\test.ps1");
// 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());
}
}
}
}
答案 0 :(得分:1)
因为您已在主机服务器上发布了您的网站。当您访问网站时,您正在访问在Azure上运行的应用程序(或服务器所在的任何位置),因此发送在该服务器计算机上运行的命令。
很抱歉,您不能将这些命令作为网站用户在您的计算机上运行,因为脚本调用方法是以确保用户环境安全的方式开发的,否则只需按下按钮即可在其末端执行未知的危险代码。
如果您使用Azure,请注意其作为服务的平台&#39;您的角色是在预配置的系统上部署网站和构建应用程序,并由Azure管理。不允许进行任何系统级更改,包括用户名更改。试试https://yourwebsitename.scm.azurewebsites.net/DebugConsole/?shell=powershell
我曾经在某个时候尝试改变它但是学得很难。