从C#MVC Web应用程序执行PowerShell脚本

时间:2015-12-16 13:57:52

标签: c# asp.net-mvc powershell scripting

我需要从我的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脚本在通过Management shell运行时运行良好。

2 个答案:

答案 0 :(得分:2)

我不得不放弃管道方法,因为我无法弄清楚问题是什么。此方法的另一个问题是它抛出了错误:“Get-SPWbTemplate未被识别为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.
                        }
                    }

此外,无需设置执行政策。

答案 1 :(得分:0)

好吧不知道它的帮助,但我从不使用管道来运行Command 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置于文件系统的权限,以便我可以执行命令,你可以在google上快速搜索它。 希望这有帮助。