9

目前,用户必须进入控制面板 > 程序 > 打开或关闭 Windows 功能,然后单击他们要激活的功能的复选框。我想让他们能够从我的应用程序中执行此操作。

关于如何通过 .NET(最好在 C# 中)自动化这个过程的任何想法?

4

3 回答 3

11

如果您只针对较新的平台 (>= Windows Vista),那么 dism.exe 是最新的实用程序;它取代了 pkgmgr。

  1. http://technet.microsoft.com/en-us/library/dd799309(WS.10).aspx
  2. http://msdn.microsoft.com/en-us/library/dd371719(v=vs.85).aspx

示例调用(针对所有必需功能运行):

dism.exe /online /enable-feature /featurename:IIS-WebServerRole

要查找功能,请使用此

dism.exe /online /get-features | find “Tablet”

有关更多信息,请参见:http ://adriank.org/microsoft-ocsetupdism-component-name-list/。

于 2011-12-31T11:33:20.903 回答
1

我使用 NSIS for IIS 执行此操作:

$Sysdir\pkgmgr.exe /n:$Temp\iis7Unattend.xml

您可以从您的 c# 程序调用 pkgmgr 程序,通常您会创建一个无人参与文件,其中包含 pkgmgr 用于该功能的说明。

你需要使用

 System.Diagnostics.Process.Start().
于 2011-11-08T18:06:21.070 回答
0

使用 Microsoft.Dism

您也可以使用Microsoft.DismNuget 包。它是 的包装器dismapi.dll,powershell cmdlet 也使用它。

安装

要通过包管理器控制台安装,请使用。

Install-Package Microsoft.Dism

通过 dotnet 命令行界面安装。

dotnet add package Newtonsoft.Json

文档

NuGet pacakge 具有出色的 xml 文档。另请参阅他们的Wiki了解更多信息。以及来自 microsoft的DISM API 参考文档。

例子

要获取所有已安装功能的列表:

IEnumerable<string> GetInstalledFeatures()
{
    var installedFeatures = new List<string>();
    DismApi.Initialize(DismLogLevel.LogErrorsWarningsInfo);

    try
    {
        using var session = DismApi.OpenOnlineSessionEx(new DismSessionOptions() { });
        var features = DismApi.GetFeatures(session);

        foreach (var feature in features)
        {
            if (feature.State == DismPackageFeatureState.Installed)
                installedFeatures.Add(feature.FeatureName);
        }
    }
    finally
    {
        DismApi.Shutdown();
    }

    return installedFeatures;
}

要启用某个功能:

void EnableFeature(string featureName)
{
    DismApi.Initialize(DismLogLevel.LogErrorsWarningsInfo);
    try
    {
        using var session = DismApi.OpenOnlineSession();
        var (left, top) = Console.GetCursorPosition();
        DismApi.EnableFeature(session, featureName, false, true, null, progress =>
        {
            Console.SetCursorPosition(left, top);
            Console.Write($"{progress.Total} / {progress.Current}");
        });
        Console.WriteLine();
    }
    finally
    {
        DismApi.Shutdown();
    }
}
于 2021-11-18T09:43:08.823 回答