C++ Windows Server 2016用CMD命令行安装IIS角色和功能组件

      Windows Server 2016数据中心纯净版上安装IIS1.0版本的组件 ,Windows Server 2016和Windows Server 2012版本,他们的组件是没有多大区别的,但是安装的方式有所差异,也就是安装的顺序比较怪异。由于在08和12版本上面安装都没有问题,理所当然我就以12版本的IIS安装方式去安装16版本的,既然是安装IIS,那么最重要的当然是安装【服务器角色】-->【Web服务器(IIS)】下的部分组件。
但是问题来了,因为16版本的IIS10.0的组件,如果安装常规先安装:
【功能】-->【.NET Framework 3.5功能】
【服务器角色】-->【Web服务器(IIS)】-->【Web服务器】-->【应用程序开发】-->[.Net Extensibility 3.5]/[ASP.NET 3.5]
那么[.Net Extensibility 3.5]/[ASP.NET 3.5]是无法安装的,为什么?我也不知道!o_X ,但是后来经过我一个上午的安装卸载安装卸载(当然这一切都是在cmd命令行下进行的)最后发现了问题,那就是[.Net Extensibility 3.5]/[ASP.NET 3.5]和[.Net Extensibility 4.6]/[ASP.NET 4.6]的安装都需要依赖【功能】-->【.NET Framework 4.6功能】-->[ASP.NET 4.6]组件。假设这四个都已经安装了,如果卸载掉【功能】-->【.NET Framework 4.6功能】-->[ASP.NET 4.6]组件,那么这四个组件也将被卸载掉,由此可知他们是依赖[ASP.NET 4.6]组件的。
所以,我整理的安装顺序是这样的:
(1)【功能】-->【.NET Framework 3.5功能】
     【.NET Framework 3.5功能】-->[.NET Frameword 3.5];
(2)【功能】-->【.NET Framework 4.5功能】
     【.NET Framework 3.5功能】-->[.NET Frameword 4.6]
     【.NET Framework 3.5功能】-->[ASP.NET 4.6];
(3)【服务器角色】-->【Web服务器(IIS)】-->【Web服务器】-->【应用程序开发】-->[.Net Extensibility 3.5]/[ASP.NET 3.5];

(4)【服务器角色】-->【Web服务器(IIS)】-->【Web服务器】-->【应用程序开发】-->[.Net Extensibility 4.6]/[ASP.NET 4.6];

.NET重要组件图:




代码如下:

#include "stdafx.h"  
#include <windows.h>  
#include <tchar.h>  
#include <string>  
#include <iostream>  
#include <Shlwapi.h>  
#include "process.h"  
#pragma comment(lib, "Shlwapi.lib")  
using namespace std;  
  
bool RunSysCmd(const wstring& strcmd);  
wstring getSystemDirectory();  
BOOL IsWow64();  
bool WinServ2016_IISInstall();  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    bool bRet = false;  
  
    bRet = WinServ2016_IISInstall();  
  
    system("pause");  
    return 0;  
}  
  
bool RunSysCmd(const wstring& strcmd)  
{  
    bool suc;  
    wstring stdDirectory = getSystemDirectory() + _T("Windows\\System32\\");  
    if (IsWow64())  
    {  
        PVOID OldValue = NULL;  
        Wow64DisableWow64FsRedirection(&OldValue);  
        SHELLEXECUTEINFO ShExecInfo = { 0 };  
        ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);  
        ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;  
        ShExecInfo.hwnd = NULL;  
        ShExecInfo.lpVerb = _T("runas");  
        ShExecInfo.lpFile = _T("cmd.exe");  
        ShExecInfo.lpParameters = strcmd.c_str();  
        ShExecInfo.lpDirectory = stdDirectory.c_str();  
        ShExecInfo.nShow = SW_HIDE;  
        ShExecInfo.hInstApp = NULL;  
        suc = ShellExecuteEx(&ShExecInfo);  
        WaitForSingleObject(ShExecInfo.hProcess, INFINITE);  
        Wow64RevertWow64FsRedirection(OldValue);  
    }  
    else  
    {  
        SHELLEXECUTEINFO ShExecInfo = { 0 };  
        ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);  
        ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;  
        ShExecInfo.hwnd = NULL;  
        ShExecInfo.lpVerb = _T("open");  
        ShExecInfo.lpFile = _T("cmd.exe");  
        ShExecInfo.lpParameters = strcmd.c_str();  
        ShExecInfo.lpDirectory = stdDirectory.c_str();  
        ShExecInfo.nShow = SW_HIDE;  
        ShExecInfo.hInstApp = NULL;  
        suc = ShellExecuteEx(&ShExecInfo);  
        WaitForSingleObject(ShExecInfo.hProcess, INFINITE);  
    }  
    return suc;  
}  
  
wstring getSystemDirectory()  
{  
    wstring wstr = _T("");  
    int size = ::GetSystemDirectory(NULL, 0);  
    wchar_t *path = new wchar_t[size];  
    if (::GetSystemDirectory(path, size) != 0)  
    {  
        wstr = path;  
    }  
    delete[] path;  
    return wstr;  
}  
  
BOOL IsWow64()  
{  
    typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);  
    LPFN_ISWOW64PROCESS fnIsWow64Process;  
    BOOL bIsWow64 = FALSE;  
    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle(_T("kernel32")), "IsWow64Process");  
    if (NULL != fnIsWow64Process){  
        fnIsWow64Process(GetCurrentProcess(), &bIsWow64);  
    }  
    return bIsWow64;  
}  
 
bool WinServ2016_IISInstall()
{
	std::cout << "start install IIS comm";
	bool bRet = false;

	std::wstring strRunCmd = _T("/c start /w pkgmgr /iu:IIS-WebServerRole;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-WebServer;");
	bRet = RunSysCmd(strRunCmd);
	//常见HTTP功能
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-CommonHttpFeatures;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-StaticContent;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-DefaultDocument;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-DirectoryBrowsing;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-HttpErrors;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-HttpRedirect;");
	bRet = RunSysCmd(strRunCmd);
	//应用程序开发
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ApplicationDevelopment;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:NetFx3ServerFeatures;");//这个安装特别慢!!!最好冲杯咖啡核一下等待
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:NetFx3;");//注意:只有父功能开启了,子功能才能安装,否则,无法安装
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:NetFx4ServerFeatures;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:NetFx4;");//注意:只有父功能开启了,子功能才能安装,否则,无法安装
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:NetFx4Extended-ASPNET45;");//注意:必须先安装此组件,下面的3、4组件才能安装
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-NetFxExtensibility;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ASPNET;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-NetFxExtensibility45;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ASPNET45;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-CGI;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ASP;IIS-ISAPIExtensions;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ISAPIFilter;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ServerSideIncludes;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-WebSockets;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ApplicationInit;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ASPNET;");//再次安装,保障一点
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ASPNET45;");//再次安装,保障一点
	bRet = RunSysCmd(strRunCmd);
	//运行状态(健康)和诊断
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-HealthAndDiagnostics;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-HttpLogging;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-LoggingLibraries;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-RequestMonitor;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-HttpTracing;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-CustomLogging;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ODBCLogging;");
	bRet = RunSysCmd(strRunCmd);
	//安全性
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-Security;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-BasicAuthentication;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-CertProvider;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-WindowsAuthentication;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-DigestAuthentication;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ClientCertificateMappingAuthentication;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-IISCertificateMappingAuthentication;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-URLAuthorization;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-RequestFiltering;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-IPSecurity;");
	bRet = RunSysCmd(strRunCmd);
	//性能
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-Performance;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-HttpCompressionStatic;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-HttpCompressionDynamic;");
	bRet = RunSysCmd(strRunCmd);
	//管理工具
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-WebServerManagementTools;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ManagementConsole;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ManagementScriptingTools;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-ManagementService;");
	bRet = RunSysCmd(strRunCmd);
	//FTP服务器
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-FTPServer;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-FTPSvc;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:IIS-FTPExtensibility;");
	bRet = RunSysCmd(strRunCmd);
	//Windows process Activation Service
	strRunCmd = _T("/c start /w pkgmgr /iu:WAS-WindowsActivationService;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:WAS-ProcessModel;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:WAS-NetFxEnvironment;");
	bRet = RunSysCmd(strRunCmd);
	strRunCmd = _T("/c start /w pkgmgr /iu:WAS-ConfigurationAPI;");
	bRet = RunSysCmd(strRunCmd);

	return bRet;
}

//IIS的组件结构代码:  
WebServerRole                   web服务角色                   
    IIS-WebServer                   web服务器  
        IIS-CommonHttpFeatures              常见HTTP功能  
            IIS-StaticContent               静态内容  
            IIS-DefaultDocument             默认文档  
            IIS-DirectoryBrowsing               目录浏览  
            IIS-HttpErrors                  HTTP错误  
            IIS-HttpRedirect                HTTP重定向  
        IIS-ApplicationDevelopment          应用程序  
            IIS-ASP                     ASP  
            IIS-CGI                     CGI  
            IIS-ASPNET                  ASP.NET3.5  
            IIS-NetFxExtensibility              .NET Extensibility3.5  
            IIS-ASPNET45                    ASP.NET4.5  
            IIS-NetFxExtensibility45            .NET Extensibility4.5  
            NetFx4Extended-ASPNET45  
            IIS-ISAPIFilter                 ISAPI筛选器  
            IIS-ISAPIExtensions             ISAPI扩展  
        IIS-HealthAndDiagnostics            运行状态和诊断  
            IIS-HttpLogging                 HTTP日志记录  
            IIS-LoggingLibraries                日志记录工具  
            IIS-RequestMonitor              请求监控器  
            IIS-HttpTracing                 跟踪  
            IIS-CustomLogging               自定义日志  
            IIS-ODBCLogging                 ODBC日志记录  
        IIS-Security                    安全性  
            IIS-BasicAuthentication             基本身份验证  
            IIS-WindowsAuthentication           Windows身份验证  
            IIS-DigestAuthentication            摘要式身份验证  
            IIS-ClientCertificateMappingAuthentication  客户端证书映射身份验证  
            IIS-IISCertificateMappingAuthentication     IIS证书映射身份验证  
            IIS-URLAuthorization                URL授权  
            IIS-RequestFiltering                请求筛选  
            IIS-IPSecurity                  IP和域限制  
        IIS-Performance                 性能  
            IIS-HttpCompressionStatic           静态内容压缩  
            IIS-HttpCompressionDynamic          动态内容压缩  
    IIS-WebServerManagementTools            管理工具      
        IIS-ManagementConsole               IIS管理控制台  
        IIS-ManagementScriptingTools            IIS 管理脚本和工具  
        IIS-ManagementService               管理服务  
    IIS-FTPServer                   FTP服务器  
        IIS-FTPSvc              FTP服务  
        IIS-FTPExtensibility            FTP扩展  
  
NetFx3ServerFeatures                .NET Framework 3.5功能  
    NetFx3                      .NET Frameword 3.5  
  
NetFx4ServerFeatures                .NET Frameword 4.6功能  
    NetFx4                      .NET Frameword 4.6  
    NetFx4Extended-ASPNET45             ASP.NET 4.6  
  
WAS-WindowsActivationService            Windows Process Activation Service    
    WAS-ProcessMode                 进程模型  
    WAS-NetFxEnvironment                .NET Environment 3.5  
    WAS-ConfigurationAPI                配置 API

使用的是 pkgmgr的安装方式,其实用dism也行。在此提供一个方法获取这些角色和功能的命令代码, 在cmd.exe下或者Windows PowerShell.exe下,查看组件是否安装及组件角色和功能代码:

(1)进入 Windows PowerShell.exe 输入:Import-Module ServerManager 回车执行;Get-WindowsFeature 回车执行;

(2)进入 Windows PowerShell.exe 输入:dism /Online /Get-Features 回车执行;

(3)进入 cmd.exe 输入:dism /Online /Get-Features 回车执行。

这些安装都是在cmd下进行的,完整的安装就如代码上的,有图的部分知识要求注意的安装顺序,请注意最终以代码为主。好了Windows Server 2016的IIS10.0组件安装就是这些了(我个人需要就这个么多 o_X)。我有个疑问就是总觉得有点不合理,在此供大家学习,不足之处还望大家提出。



  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值