我一直在尝试从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中的人来使其工作?
答案 0 :(得分:0)
应用程序池标识对本地文件系统的访问权限非常有限(并且在本地计算机之外没有访问权限)。您需要修改文件系统上的ACL,以便为身份提供所需的访问权限。
在Server 2008(或Vista)中,这必须使用命令行(例如icacls.exe
)完成,因为权限GUI不支持应用程序池标识;对于更高版本,可以使用GUI完成。
Process Monitor是了解阻止访问权限的好工具。
然而 如果您需要访问网络资源,则无法使用。应用程序池标识纯粹是本地的,它们在网络上没有任何意义。您需要使用具有适用访问权限的域帐户(或具有相同名称和密码的多个本地帐户)。