从C#MVC Web应用程序执行PowerShell脚本
本文关键字:PowerShell 脚本 执行 应用程序 C#MVC Web | 更新日期: 2023-09-27 18:26:58
我需要从我的asp.net MVC Web应用程序中执行一个powershell脚本。我的要求是动态创建网站集。我有它的剧本,而且效果很好。没有要传递给脚本的参数。我一直在使用的代码显示在下面:
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
Pipeline pipeline = runspace.CreatePipeline();
//Here's how you add a new script with arguments
Command myCommand = new Command(scriptfiellocation);
pipeline.Commands.Add(myCommand);
pipeline.Commands.Add("Out-String");
// Execute PowerShell script
var result = pipeline.Invoke();
在执行代码时,当我检查变量结果的计数时,它给出的计数为1。但是,在检查我的网站时,没有创建任何网站集。我无法确定哪里出了问题,因为没有运行时错误,Invoke命令似乎也运行正常。
有人能告诉我哪里可能会失控吗?考虑到PowerShell脚本在通过管理shell运行时可以完美工作。
我不得不放弃管道方法,因为我无法弄清楚问题是什么。该方法的另一个问题是,它引发了错误:"Get-SSPbTemplate未被识别为cmdlet"。以下代码对我来说非常好,并创建了所需的网站集:
PowerShell powershell = PowerShell.Create();
//RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
//Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration)
using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
runspace.Open();
//RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
//scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
powershell.Runspace = runspace;
//powershell.Commands.AddScript("Add-PsSnapin Microsoft.SharePoint.PowerShell");
System.IO.StreamReader sr = new System.IO.StreamReader(scriptfilepath);
powershell.AddScript(sr.ReadToEnd());
//powershell.AddCommand("Out-String");
var results = powershell.Invoke();
if (powershell.Streams.Error.Count > 0)
{
// error records were written to the error stream.
// do something with the items found.
}
}
此外,不需要设置执行策略。
我们不知道它是否有帮助,但我从不使用管道来运行命令shell,也不确定它是如何工作的。
但这里有一个快速的例子
Runspace RS = RunspaceFactory.CreateRunspace(myConnection);
PowerShell PS = PowerShell.Create();
PSCommand PScmd = new PSCommand();
string cmdStr = "Enable-Mailbox -Identity " + username + " -Database DB01 -Alias " + aliasexample;
PScmd.AddScript(cmdStr);
try
{
RS.Open();
PS.Runspace = RS;
PS.Commands = PScmd;
PS.Invoke();
}
catch (Exception ex)
{
ex.ToString();
}
finally
{
RS.Dispose();
RS = null;
PS.Dispose();
PS = null;
}
使用try-catch,如果出现问题,您可以通过调试来捕获错误。如果我没记错的话,我必须把ACL.exe放在文件系统的权限中,这样我就可以执行命令shell了——你可以在谷歌上快速搜索它。希望得到帮助。