从ASP.NET运行PowerShell脚本

时间:2012-07-13 08:41:44

标签: asp.net powershell iis-7 impersonation

我一直在尝试从asp.net运行PowerShell脚本,但几天都没有成功。

C#是:

using (var process = new Process())
{
  ProcessStartInfo startInfo = new ProcessStartInfo();

  startInfo.FileName = @"powershell.exe";
  startInfo.Arguments = "arguments that call the script here";
  startInfo.RedirectStandardOutput = false;
  startInfo.RedirectStandardError = false;
  startInfo.UseShellExecute = true;
  startInfo.CreateNoWindow = true;

  process.StartInfo = startInfo;
  process.Start();
}

它调用的PowerShell脚本包含ff:

robocopy "\\network-server\location" "C:\localfolder" "testmovefile.txt"

显然,这里的问题是正确的凭据。但我尝试过各种模仿的东西,无论是来自C#还是来自脚本级别。我尝试对PowerShell脚本执行此操作:

 $username = "domain\user"
  $password = ConvertTo-SecureString –String "password" –AsPlainText -Force
  $pp = new-object -typename System.Management.Automation.PSCredential -argumentlist $username,$password
  start-process powershell -argument "C:\localfolder\CopyFile.ps1" -Credential $pp

当我在PowerShell控制台中本地运行脚本时,即使使用对网络没有权限的帐户,但是从Web应用程序调用时,它仍然有效。没有任何反应。

App Pool Identity仅设置为默认的App Pool Identity ..我发现如果我将身份更改为具有适当权限的自定义帐户,则可以。

我仍然在尝试搜索不同的解决方案..我想要一个场景,您可以在脚本中更改任何内容,它仍然可以运行。任何都可以,只要它不会改变应用程序池标识。

我也试过这些:

但它仍然无效。我继续拒绝访问。问题是,是否可以通过冒充PowerShell中的人来使其工作?

1 个答案:

答案 0 :(得分:0)

应用程序池标识对本地文件系统的访问权限非常有限(并且在本地计算机之外没有访问权限)。您需要修改文件系统上的ACL,以便为身份提供所需的访问权限。

在Server 2008(或Vista)中,这必须使用命令行(例如icacls.exe)完成,因为权限GUI不支持应用程序池标识;对于更高版本,可以使用GUI完成。

Process Monitor是了解阻止访问权限的好工具。

然而 如果您需要访问网络资源,则无法使用。应用程序池标识纯粹是本地的,它们在网络上没有任何意义。您需要使用具有适用访问权限的域帐户(或具有相同名称和密码的多个本地帐户)。