0

我已经尝试从 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 应用程序调用时.. 没有任何反应。

应用程序池标识只是设置为默认的应用程序池标识。我发现如果我将标识更改为具有适当权限的自定义帐户......它可以工作。

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

我也试过这些:

但它仍然不起作用。我继续被拒绝访问。问题是,是否可以通过在 PowerShell 中模拟某人来使其工作?

4

1 回答 1

0

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

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

Process Monitor是一个很好的工具,用于确定访问被阻止的位置。

但是,如果您需要访问网络资源,这将不起作用。应用程序池身份纯粹是本地的,它们在网络上没有任何意义。您需要使用具有相应访问权限的域帐户(或具有相同名称和密码的多个本地帐户)。

于 2012-07-17T08:04:04.593 回答