使用C#调用powershell服务器commandlets以启用WindowsOptionalFeature netfx3

使用C#调用powershell服务器commandlets以启用WindowsOptionalFeature netfx3,c#,.net,powershell,C#,.net,Powershell,我正在开发一个使用Burn的WiX安装程序,因此需要.Net。捆绑.Net的必备版本在服务器操作系统上不起作用,因为它们需要使用角色管理器。事实上,它是WiX安装的一部分并不是非常重要,它在那里,以防有其他方法帮助我完成任务。我正在作为一个独立的.Net控制台应用程序运行/测试下面的代码。在使用失败后,为了解决这个问题,我编写了以下使用powershell和“启用WindowsOptionalFeature” static void Main(字符串[]args) { PowerShell ps

我正在开发一个使用Burn的WiX安装程序,因此需要.Net。捆绑.Net的必备版本在服务器操作系统上不起作用,因为它们需要使用角色管理器。事实上,它是WiX安装的一部分并不是非常重要,它在那里,以防有其他方法帮助我完成任务。我正在作为一个独立的.Net控制台应用程序运行/测试下面的代码。在使用失败后,为了解决这个问题,我编写了以下使用powershell和“启用WindowsOptionalFeature”

static void Main(字符串[]args)
{
PowerShell ps=PowerShell.Create();
Runspace Runspace=RunspaceFactory.CreateRunspace();
Open();
Pipeline Pipeline=runspace.CreatePipeline();
Command addDotNet=新命令(“启用Windows OptionalFeature”);
addDotNet.Parameters.Add(“-FeatureName netfx3-Online-All”);
pipeline.Commands.Add(addDotNet);
收集日志=pipeline.Invoke();
}

当我运行它时,会弹出此窗口。
无法通过Windows功能控制面板自动安装或卸载Windows服务器角色和功能。

鉴于我认为我已经在使用与“服务器管理器cmdlet”等效的工具,我不确定它到底要求什么。所以问题分为两部分:1)解决这个问题的正确方法是什么。2) 如何在安装过程中保持安静


PS:如果这个问题真的属于服务器故障,请告诉我。

启用windows OptionalFeature是DISM的一部分,它将用于创建要部署到新系统的windows映像


添加WindowsFeature
是您正在查找的功能,它将向Windows Server的当前实例添加功能。它位于
ServerManager
powershell模块中,该模块仅在Windows Server上可用(不在Windows 7上)

启用Windows OptionalFeature
是DISM的一部分,用于创建Windows映像以部署到新系统


添加WindowsFeature
是您正在查找的功能,它将向Windows Server的当前实例添加功能。它位于
ServerManager
powershell模块中,该模块仅在Windows Server上可用(不在Windows 7上)

我要说的是基于常识,而不是以前的经验,如果这与此无关,请原谅

您似乎能够在Windows Server 2012上运行,因为只有此版本具有您正在使用的Windows ADK。Windows 8(客户端操作系统)和Windows Server 2012(服务器操作系统)有不同的启用功能的方法。这些在Windows 8中作为可选功能出现,但在服务器中作为服务器角色/功能出现

注意,与您所说的相反,bundle不起作用不是因为它是一个服务器操作系统,它不起作用是因为它包含在操作系统中,需要启用。这适用于服务器操作系统(Win 2012)和客户端操作系统(Windows 8)

只是在Windows 8和Win 2012中需要使用不同的方法


对于Windows 8,您的方法可以工作。对于Windows 2012,您看到的帮助建议您使用cmdlet。

我要说的是基于常识,而不是以前的经验,如果这与此无关,那么很抱歉

您似乎能够在Windows Server 2012上运行,因为只有此版本具有您正在使用的Windows ADK。Windows 8(客户端操作系统)和Windows Server 2012(服务器操作系统)有不同的启用功能的方法。这些在Windows 8中作为可选功能出现,但在服务器中作为服务器角色/功能出现

注意,与您所说的相反,bundle不起作用不是因为它是一个服务器操作系统,它不起作用是因为它包含在操作系统中,需要启用。这适用于服务器操作系统(Win 2012)和客户端操作系统(Windows 8)

只是在Windows 8和Win 2012中需要使用不同的方法


对于Windows 8,您的方法可以工作。对于Windows 2012,您看到的帮助建议您使用cmdlet。

基本上,该命令失败,因为您需要安装的组件不在组件存储中。管理员需要插入安装介质。也许您可以在安装程序中包含相应的文件以避免手动步骤,但我从未尝试过,这也可能会造成许可问题


对于Server 2012,Microsoft决定在默认情况下从组件存储中删除.NET framework 3.5。它仍然存在于安装介质上,只是在安装过程中没有后台打印到磁盘上。不久前我在我的博客中写了一篇关于此的文章。

基本上,该命令失败,因为您需要安装的组件不在组件存储中。管理员需要插入安装介质。也许您可以在安装程序中包含相应的文件以避免手动步骤,但我从未尝试过,这也可能会造成许可问题


对于Server 2012,Microsoft决定在默认情况下从组件存储中删除.NET framework 3.5。它仍然存在于安装介质上,只是在安装过程中没有后台打印到磁盘上。不久前,我在我的博客中写了一篇关于这一点的文章。

我添加了一些额外的日志记录/写线语句,同时试图找出server 2012实例中出现问题的地方。我意识到这些调试行根本没有输出到控制台

结果是我没有仔细阅读弹出窗口。投诉不是关于使用PS commandlets,而是关于试图安装.Net 3.5来运行我的应用程序的投诉。我的应用程序的目标是.Net 3.5,因此消息是关于尝试自动安装.Net 3.5

愿这个问题不仅仅是我一时的盲目和愚蠢的证明,也可以作为对关注德泰重要性的评论
    static void Main(string[] args)
    {

        PowerShell ps = PowerShell.Create();
        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();

        Pipeline pipeline = runspace.CreatePipeline();

        Command addDotNet = new Command("Enable-WindowsOptionalFeature");
        addDotNet.Parameters.Add("-FeatureName netfx3 -Online -All");
        pipeline.Commands.Add(addDotNet);
        Collection<PSObject> log = pipeline.Invoke();