目前,用户必须进入控制面板 > 程序 > 打开或关闭 Windows 功能,然后单击他们要激活的功能的复选框。我想让他们能够从我的应用程序中执行此操作。
关于如何通过 .NET(最好在 C# 中)自动化这个过程的任何想法?
目前,用户必须进入控制面板 > 程序 > 打开或关闭 Windows 功能,然后单击他们要激活的功能的复选框。我想让他们能够从我的应用程序中执行此操作。
关于如何通过 .NET(最好在 C# 中)自动化这个过程的任何想法?
如果您只针对较新的平台 (>= Windows Vista),那么 dism.exe 是最新的实用程序;它取代了 pkgmgr。
示例调用(针对所有必需功能运行):
dism.exe /online /enable-feature /featurename:IIS-WebServerRole
要查找功能,请使用此
dism.exe /online /get-features | find “Tablet”
有关更多信息,请参见:http ://adriank.org/microsoft-ocsetupdism-component-name-list/。
我使用 NSIS for IIS 执行此操作:
$Sysdir\pkgmgr.exe /n:$Temp\iis7Unattend.xml
您可以从您的 c# 程序调用 pkgmgr 程序,通常您会创建一个无人参与文件,其中包含 pkgmgr 用于该功能的说明。
你需要使用
System.Diagnostics.Process.Start().
您也可以使用Microsoft.Dism
Nuget 包。它是 的包装器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();
}
}