C# - 使用Powershell安装功能和角色的Windows Server 2012

时间:2014-04-02 16:37:17

标签: c# powershell windows-server-2012

我编写了一个使用Powershell API安装Windows角色和功能的应用程序。它在Windows 2008 R2中运行良好,但在Windows 2012中没有任何反应;程序只是继续运行,好像一切都很好,但没有安装。

我已尝试制作.NET v4.5程序(它是.NET v2.0),但这并没有帮助。我一直都在谷歌这个,我找不到一个有效的解决方案。实际上,大多数人都说要使用适用于Windows 2008 R2的实现。这是我的代码:

        public bool runPowerShell(string command, string args)
    {
        mLogger myLogger = mLogger.instance;  //How I log stuff in my application.
        bool done = false; //default Return value.
        const string path = @"C:\\XMPLogs\\Roles and Features"; //Where Powershell output will go.

        //Make sure Powershell log directory is there.
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);

        //Start a new Powershell instance.
        PowerShell powershell = PowerShell.Create();
        System.Collections.ObjectModel.Collection<PSObject> output = new System.Collections.ObjectModel.Collection<PSObject>();
        StringBuilder strBuilder = new StringBuilder(); //Used to examine results (for testing)
        powershell.AddScript(@"Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted");
        powershell.AddScript(@"Import-Module ServerManager");
        //powershell.Invoke();

        powershell.AddScript(command + " " + args);
        try
        {

            output = powershell.Invoke();

            // Construct a StringBuilder to examine the output of Invoke()
            foreach (PSObject obj in output)
                strBuilder.AppendLine(obj.ToString());

            // Show the StringBuilder to see results (always empty!)
            MessageBox.Show(strBuilder.ToString());
            done = true;
        }
        catch (Exception ex)
        {
            string test = ex.ToString();
            MessageBox.Show(test);
            myLogger.output("ERRO", "PowerShell command " + command
                + "failed to run with arguments \"" + args + "\".  Message:  " + ex.ToString());
            done = false;
        }

        powershell.Dispose();
        return done;
    }

我会这样称呼这个方法:

runPowerShell("add-windowsfeature", "-name FS-FileServer -logpath \"c:\\XMPLogs\\Roles and Features\\File Services.log\"");

&#34;输出&#34; object永远不会有任何数据,日志文件也没有。所以,我不知道发生了什么。我知道如果我在方法调用中取两个参数并手动将它们输入到Powershell提示符中,安装运行完美。

任何人都可以看到我在Windows Server 2012上执行此操作时出错吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果没有更多信息,很难知道这里的真正问题是什么。也许您没有以管理员身份运行应用程序,因此不允许添加Windows功能?

但是,PowerShell在终止错误(阻止执行和抛出异常,这应该使您的代码进入catch语句)和非终止错误(仅写入错误流并且不会输入您的错误)之间存在差异抓住声明)。

如果您运行Get-Help Write-ErrorGet-Help about_ThrowGet-Help about_Try_Catch_Finally,则可以详细了解这一点。

我猜你的powershell命令会导致非终止错误。要确定是否发生了非终止错误,您可以检查powershell.HadErrors属性并获取可以读取powershell.Streams.Error属性的错误消息。

这应该可以帮助您找出发生的错误,并希望帮助您解决问题。