2012-07-13 200 views
0

我一直在尝试从asp.net运行一个PowerShell脚本,但几天都没有成功。从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身份设置为默认的App Pool身份,但我发现如果将身份更改为具有适当权限的自定义帐户,它可以工作。

我仍然试图寻找一个不同的解决方案..我想要一个场景,你可以改变脚本中的任何东西,它仍然会运行。只要不更改应用程序池标识,任何都可以。

我尝试这些以及:

但它仍然无法正常工作。我一直在拒绝访问。问题是,是否可以通过模拟PowerShell内的某个人来工作?

+0

“什么也没有发生”:尝试使用调试器或日志记录(甚至是进程监视器)来确定它到底有多远。也许'process.Start'无法执行任何操作? – Richard 2012-07-13 09:01:43

+0

它可以在本地运行。如果我将App Pool Identity设置为自定义帐户,它也可以工作。 – user1167132 2012-07-16 01:53:43

+0

什么是默认值(原来是:失败)AppPool的身份? – Richard 2012-07-16 06:43:17

回答

0

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

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

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

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