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

本文关键字:安装 功能 角色 Powershell 使用 Windows Server 2012 | 更新日期: 2023-09-27 17:56:18

我编写了一个使用 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'"");

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

任何人都可以看到我在Windows Server 2012上的这个实现做错了什么吗?

谢谢。

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

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

但是,PowerShell 在终止错误(这将阻止执行并引发异常,这应使代码进入 catch 语句)和非终止错误(仅写入错误流,不会进入 catch 语句)之间有所不同。

如果您运行 Get-Help Write-ErrorGet-Help about_ThrowGet-Help about_Try_Catch_Finally,您可以阅读更多相关信息。

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

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