Мое решение: я создал словарь со всеми именами функций, которые включены в. Net Framework 3.5 и 4.x. Я взял их, чтобы сравнить возвращаемое значение при включении и выключении функций. Затем отметьте все включено и удалите его из словаря. Затем включите все функции в правильном порядке. Порядок важен.
Этот список работает для net framework 4.8
static void Main(string[] args)
{
AddFeature();
CreateFileFeature();
RemoveEnable();
TurnOnFeatures();
}
private static void TurnOnFeatures()
{
try
{
Process p = CreateProcess();
p.StartInfo.FileName = "cmd.exe";
foreach (var item in featureToEnable)
{
p.StartInfo.Arguments = "/C DISM /online /enable-feature /featurename:" + item.Value + " /NoRestart";
p.Start();
var a = p.StandardOutput.ReadToEnd();
var b = p.StandardError.ReadToEnd();
Console.WriteLine(item.Key);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
private static void RemoveEnable()
{
for (int i = 0; i < 17; i++)
{
if (featureToEnable.ContainsKey(i))
if (featureAllEnable.Any(x => x == featureToEnable[i]) == true)
featureToEnable.Remove(i);
}
}
private static void AddFeature()
{
featureToEnable.Add(0, "NetFx3");
featureToEnable.Add(1, "NetFx4-AdvSrvs");
featureToEnable.Add(2, "NetFx4Extended-ASPNET45");
featureToEnable.Add(3, "WCF-Services45");
featureToEnable.Add(4, "WCF-TCP-PortSharing45");
featureToEnable.Add(5, "WCF-Pipe-Activation45");
featureToEnable.Add(6, "WCF-TCP-Activation45");
featureToEnable.Add(7, "WCF-MSMQ-Activation45");
featureToEnable.Add(8, "IIS-NetFxExtensibility");
featureToEnable.Add(9, "IIS-NetFxExtensibility45");
featureToEnable.Add(10, "WAS-NetFxEnvironment");
featureToEnable.Add(11, "IIS-ASPNET45");
featureToEnable.Add(12, "IIS-ManagementService");
featureToEnable.Add(13, "IIS-ASPNET");
featureToEnable.Add(14, "WCF-HTTP-Activation45");
featureToEnable.Add(15, "WCF-HTTP-Activation");
featureToEnable.Add(16, "WCF-NonHTTP-Activation");
}
private static void CreateFileFeature()
{
Process p = CreateProcess();
try
{
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/C DISM /online /get-features /format:table";
p.Start();
var a = p.StandardOutput.ReadToEnd();
var b = p.StandardError.ReadToEnd();
List<string> s = new List<string>();
int endLine = output.IndexOf("\r\n");
while (output.Length > 0)
{
if (endLine == 0)
{
output = output.Substring(2, output.Length - 2);
}
else
{
s.Add(output.Substring(0, endLine));
output = output.Substring(endLine, output.Length - endLine);
}
endLine = output.IndexOf("\r\n");
}
foreach (var item in s)
{
if (item.ToLower().Contains("enable"))
{
int ind = item.IndexOf(" ");
featureAllEnable.Add(item.Substring(0, ind));
}
}
}
catch (Exception)
{
}
}
Edit:
Список для net framework 4.7.2. Проверяю фреймворк на p c и использую соответствующий список
featureToEnable.Add(0, "NetFx3");
featureToEnable.Add(1, "NetFx3ServerFeatures");
featureToEnable.Add(2, "NetFx4");
featureToEnable.Add(3, "NetFx4ServerFeatures");
featureToEnable.Add(4, "NetFx4Extended-ASPNET45");
featureToEnable.Add(5, "WAS-NetFxEnvironment");
featureToEnable.Add(6, "IIS-NetFxExtensibility");
featureToEnable.Add(7, "IIS-NetFxExtensibility45");
featureToEnable.Add(8, "IIS-ASPNET45");
featureToEnable.Add(9, "IIS-ManagementService");
featureToEnable.Add(10, "WCF-HTTP-Activation45");
featureToEnable.Add(11, "WCF-TCP-Activation45");
featureToEnable.Add(12, "WCF-Pipe-Activation45");
featureToEnable.Add(13, "WCF-MSMQ-Activation45");
featureToEnable.Add(14, "WCF-HTTP-Activation");
featureToEnable.Add(15, "WCF-NonHTTP-Activation");
featureToEnable.Add(16, "WCF-TCP-PortSharing45");