Public/Create-TwoTierPKICFSSL.ps1
<#
.SYNOPSIS This function creates a new Enterprise Root Certificate Authority and new Enterprise Subordinate/Intermediate/Issuing Certification Authority on a Domain. If you do not want to create the Root and Subordinate CAs on an existing domain, this function is capable of creating a brand new domain and deploying the CAs to that new domain. .DESCRIPTION This function is an example of 'Service Deployment' function that can be found within the MiniLab Module. A 'Service Deployment' function is responsible for deploying as many servers as is necessary to get a particular service working on a domain/network. This may involve a myriad of feature/role installations and configuration setttings across multiple servers. .NOTES .PARAMETER CreateNewVMs This parameter is OPTIONAL. This parameter is a switch. If used, new Windows 2016 Standard Server Virtual Machines will be deployed to the localhost. If Hyper-V is not installed, it will be installed (and you will need to restart the localhost before proceeding). .PARAMETER VMStorageDirectory This parameter is OPTIONAL, but becomes MANDATORY if the -CreateNewVMs parameter is used. This parameter takes a string that represents the full path to a directory on a LOCAL drive that will contain all new VM files (configuration, vhd(x), etc.) .PARAMETER Windows2016VagrantBox This parameter is OPTIONAL, but becomes MANDATORY if the -CreateNewVMs parameter is used. This parameter takes a string that represents the name of a Vagrant Box that can be downloaded from https://app.vagrantup.com/boxes/search. Default value is "jborean93/WindowsServer2016". Another good Windows 2016 Server Vagrant Box is "StefanScherer/windows_2016". You can alternatively specify a Windows 2012 R2 Standard Server Vagrant Box if desired. .PARAMETER ExistingDomain This parameter is OPTIONAL, however, either this parameter or the -NewDomain parameter are MANDATORY. This parameter takes a string that represents the name of the domain that the Root and Subordinate CAs will join (if they aren't already). Example: alpha.lab .PARAMETER NewDomain This parameter is OPTIONAL, however, either this parameter or the -ExistingDomain parameter are MANDATORY. This parameter takes a string that represents the name of the domain that the Root and Subordinate CAs will join (if they aren't already). Example: alpha.lab .PARAMETER DomainAdminCredentials This parameter is MANDATORY. This parameter takes a PSCredential. The Domain Admin Credentials will be used to join the Subordinate CA Server to the domain as well as configre the new Subordinate CA. This means that the Domain Account provided to this parameter MUST be a member of the following Security Groups in Active Directory: - Domain Admins - Domain Users - Enterprise Admins - Group Policy Creator Owners - Schema Admins If you are creating a New Domain, these credentials will be used to create a new Domain Account that is a member of the aforementioned Security Groups. .PARAMETER PSRemotingCredentials This parameter is MANDATORY. This parameter takes a PSCredential. The credential provided to this parameter should correspond to a User Account that has permission to remote into ALL target Windows Servers. If your target servers are Vagrant Boxes (which is what will be deployed if you use the -CreateNewVMs switch), then the value for this parameter should be created via: $VagrantVMPassword = ConvertTo-SecureString 'vagrant' -AsPlainText -Force $VagrantVMAdminCreds = [pscredential]::new("vagrant",$VagrantVMPassword) .PARAMETER LocalAdministratorAccountCredentials This parameter is OPTIONAL, however, is you are creating a New Domain, then this parameter is MANDATORY. This parameter takes a PSCredential. The credential provided to this parameter will be applied to the Local Built-In Administrator Account on the target Windows Server. In other words, the pscredential provided to this parameter does NOT need to match the current UserName/Password of the Local Administrator Account on the target Windows Server, because the pscredential provided to this parameter will overwrite whatever the existing credentials are. .PARAMETER DCIsRootCA This parameter is OPTIONAL. This parameter is a switch. If used, the Root CA will be installed on the Primary Domain Controller. This is not best practice, but if you have limited hardware resources, this could come in handy. .PARAMETER IPofServerToBeDomainController This parameter is OPTIONAL. This parameter takes a string that represents an IPv4 Address referring to an EXISTING Windows Server on the network that will become the new Primary Domain Controller. .PARAMETER IPOfServerToBeRootCA This parameter is OPTIONAL. This parameter takes a string that represents an IPv4 Address referring to an EXISTING Windows Server on the network that will become the new Root CA. .PARAMETER IPOfServerToBeSubCA This parameter is OPTIONAL. This parameter takes a string that represents an IPv4 Address referring to an EXISTING Windows Server on the network that will become the new Subordinate CA. .PARAMETER SkipHyperVInstallCheck This parameter is OPTIONAL. This parameter is a switch. If used, this function will not check to make sure Hyper-V is installed on the localhost. .EXAMPLE # Create a New Domain With 3 Servers - Primary Domain Controller, Root CA, and Subordinate CA # Open an elevated PowerShell Session, import the module, and - PS C:\Users\zeroadmin> $VagrantVMPassword = ConvertTo-SecureString 'vagrant' -AsPlainText -Force PS C:\Users\zeroadmin> $VagrantVMAdminCreds = [pscredential]::new("vagrant",$VagrantVMPassword) PS C:\Users\zeroadmin> $DomainAdminCreds = [pscredential]::new("alpha\alphaadmin",$(Read-Host 'Enter Passsword' -AsSecureString)) Enter Passsword: ************ PS C:\Users\zeroadmin> $LocalAdminAccountCreds = [pscredential]::new("Administrator",$(Read-Host 'Enter Passsword' -AsSecureString)) Enter Passsword: ************** PS C:\Users\zeroadmin> $CreateTwoTierPKISplatParams = @{ >> CreateNewVMs = $True >> VMStorageDirectory = "H:\VirtualMachines" >> NewDomain = "alpha.lab" >> PSRemotingCredentials = $VagrantVMAdminCreds >> DomainAdminCredentials = $DomainAdminCreds >> LocalAdministratorAccountCredentials = $LocalAdminAccountCreds >> } PS C:\Users\zeroadmin> Create-TwoTierPKI @CreateTwoTierPKISplatParams .EXAMPLE # Create a New Domain With 2 Servers - Primary Domain Controller (which will also be the Root CA), and Subordinate CA # Open an elevated PowerShell Session, import the module, and - PS C:\Users\zeroadmin> $VagrantVMPassword = ConvertTo-SecureString 'vagrant' -AsPlainText -Force PS C:\Users\zeroadmin> $VagrantVMAdminCreds = [pscredential]::new("vagrant",$VagrantVMPassword) PS C:\Users\zeroadmin> $DomainAdminCreds = [pscredential]::new("alpha\alphaadmin",$(Read-Host 'Enter Passsword' -AsSecureString)) Enter Passsword: ************ PS C:\Users\zeroadmin> $LocalAdminAccountCreds = [pscredential]::new("Administrator",$(Read-Host 'Enter Passsword' -AsSecureString)) Enter Passsword: ************** PS C:\Users\zeroadmin> $CreateTwoTierPKISplatParams = @{ >> CreateNewVMs = $True >> VMStorageDirectory = "H:\VirtualMachines" >> NewDomain = "alpha.lab" >> PSRemotingCredentials = $VagrantVMAdminCreds >> DomainAdminCredentials = $DomainAdminCreds >> LocalAdministratorAccountCredentials = $LocalAdminAccountCreds >> SkipHyperVInstallCheck = $True >> DCIsRootCA = $True >> } PS C:\Users\zeroadmin> Create-TwoTierPKI @CreateTwoTierPKISplatParams .EXAMPLE # Add Two-Tier PKI to your Existing Domain # IMPORTANT NOTE: If you can't resolve the -ExistingDomain from the localhost, be sure to use the -IPOfServerToBeDomainController # parameter with the IP Address of an EXISTING Domain Controller on the domain specified by -ExistingDomain PS C:\Users\zeroadmin> $VagrantVMPassword = ConvertTo-SecureString 'vagrant' -AsPlainText -Force PS C:\Users\zeroadmin> $VagrantVMAdminCreds = [pscredential]::new("vagrant",$VagrantVMPassword) PS C:\Users\zeroadmin> $DomainAdminCreds = [pscredential]::new("alpha\alphaadmin",$(Read-Host 'Enter Passsword' -AsSecureString)) Enter Passsword: ************ PS C:\Users\zeroadmin> $LocalAdminAccountCreds = [pscredential]::new("Administrator",$(Read-Host 'Enter Passsword' -AsSecureString)) Enter Passsword: ************** PS C:\Users\zeroadmin> $CreateTwoTierPKISplatParams = @{ >> CreateNewVMs = $True >> VMStorageDirectory = "H:\VirtualMachines" >> ExistingDomain = "alpha.lab" >> PSRemotingCredentials = $VagrantVMAdminCreds >> DomainAdminCredentials = $DomainAdminCreds >> } PS C:\Users\zeroadmin> Create-TwoTierPKI @CreateTwoTierPKISplatParams #> function Create-TwoTierPKICFSSL { [CmdletBinding()] Param ( [Parameter(Mandatory=$False)] [switch]$CreateNewVMs, [Parameter(Mandatory=$False)] [string]$VMStorageDirectory, [Parameter(Mandatory=$False)] [string]$Windows2016VagrantBox = "jborean93/WindowsServer2016", # Alternate - StefanScherer/windows_2016 [Parameter(Mandatory=$False)] [ValidatePattern("^([a-z0-9]+(-[a-z0-9]+)*\.)+([a-z]){2,}$")] [string]$NewDomain, [Parameter(Mandatory=$True)] [pscredential]$DomainAdminCredentials, # If creating a New Domain, this will be a New Domain Account [Parameter(Mandatory=$False)] [pscredential]$LocalAdministratorAccountCredentials, [Parameter(Mandatory=$False)] [pscredential]$PSRemotingCredentials, # These credentials must grant access to ALL Servers [Parameter(Mandatory=$False)] [string]$ExistingDomain, [Parameter(Mandatory=$False)] [switch]$DCIsRootCA, [Parameter(Mandatory=$False)] [string]$IPofServerToBeDomainController, [Parameter(Mandatory=$False)] [string]$IPofServerToBeRootCA, [Parameter(Mandatory=$False)] [string]$IPofServerToBeSubCA, [Parameter(Mandatory=$False)] [switch]$SkipHyperVInstallCheck ) "placeholder" } |