Examples/Config-SetupActiveDirectory.ps1
#region Param param ( [String]$DomainName, [String]$DomainNetbiosName, [PSCredential]$Credential, [PSCredential]$DomainCredential, [PSCredential]$SafeModeAdministratorPassword, [String]$EncryptionCertificateThumbprint ) #endregion #region Decrypt function Decrypt { param ( [Parameter(Mandatory)] [String]$Thumbprint, [Parameter(Mandatory)] [String]$Base64EncryptedValue ) # Decode Base64 string $encryptedBytes = [System.Convert]::FromBase64String($Base64EncryptedValue) # Get certificate from store $store = new-object System.Security.Cryptography.X509Certificates.X509Store([System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine) $store.open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadOnly) $certificate = $store.Certificates | %{if($_.thumbprint -eq $Thumbprint){$_}} # Decrypt $decryptedBytes = $certificate.PrivateKey.Decrypt($encryptedBytes, $false) $decryptedValue = [System.Text.Encoding]::UTF8.GetString($decryptedBytes) return $decryptedValue } if ($EncryptionCertificateThumbprint) { Write-Verbose -Message "Decrypting parameters with certificate $EncryptionCertificateThumbprint..." $Password = Decrypt -Thumbprint $EncryptionCertificateThumbprint -Base64EncryptedValue $Password $SafeModeAdministratorPassword = Decrypt -Thumbprint $EncryptionCertificateThumbprint -Base64EncryptedValue $SafeModeAdministratorPassword Write-Verbose -Message "Successfully decrypted parameters." } else { Write-Verbose -Message "No encryption certificate specified. Assuming cleartext parameters." } #endregion #region Config Data if ($env:COMPUTERNAME -match 'DC-Server\d\d') { $ConfigData = @{ AllNodes = @( @{ Nodename = $env:COMPUTERNAME ServerRole = 'Active Directory Domain Controller' DomainName = $DomainName DomainNetbiosName = $DomainNetbiosName Disk = 1 Drive = 'F' PSDscAllowPlainTextPassword = $true Credential = $Credential DomainCredential = $DomainCredential SMCredential = $SafeModeAdministratorPassword } ) } } if ($EncryptionCertificateThumbprint) { $certificate = dir Cert:\LocalMachine\My\$EncryptionCertificateThumbprint $certificatePath = Join-Path -path $PSScriptRoot -childPath "EncryptionCertificate.cer" Export-Certificate -Cert $certificate -FilePath $certificatePath | Out-Null $configData = @{ AllNodes = @( @{ Nodename = "*" CertificateFile = $certificatePath Thumbprint = $EncryptionCertificateThumbprint PSDscAllowPlainTextPassword = $false } ) } } #endregion #region First DC Configuration Script if ((test-path C:\Windows\temp\FirstDC.txt) -eq $True) { configuration FirstDomainController { Import-DscResource -ModuleName xComputerManagement, xActiveDirectory, xStorage, xAdcsDeployment node $AllNodes.Where{$_.ServerRole -eq 'Active Directory Domain Controller'}.Nodename { xWaitforDisk SMA { DiskNumber = $Node.Disk RetryCount = 720 } xDisk DataDisk { DiskNumber = $Node.Disk DriveLetter = $Node.Drive DependsOn = '[xWaitforDisk]SMA' } WindowsFeature AD-Domain-Services { Ensure = 'Present' Name = 'AD-Domain-Services' } WindowsFeature ADCS-Cert-Authority { Ensure = 'Present' Name = 'ADCS-Cert-Authority' } WindowsFeature ADCS-Web-Enrollment { Ensure = 'Present' Name = 'ADCS-Web-Enrollment' } xADDomain PrimaryDC { DomainAdministratorCredential = $Node.Credential DomainName = $Node.DomainName SafemodeAdministratorPassword = $Node.SMCredential DatabasePath = $Node.Drive + ":\NTDS" LogPath = $Node.Drive + ":\NTDS" SysvolPath = $Node.Drive + ":\SYSVOL" DependsOn = "[xDisk]DataDisk", "[WindowsFeature]AD-Domain-Services" } xADCSCertificationAuthority ADCS { Ensure = 'Present' Credential = $Node.Credential CAType = 'EnterpriseRootCA' DependsOn = '[WindowsFeature]ADCS-Cert-Authority' } xADCSWebEnrollment CertSrv { IsSingleInstance = 'Yes' Ensure = 'Absent' Credential = $Node.Credential DependsOn = '[xADCSCertificationAuthority]ADCS' } LocalConfigurationManager { CertificateId = $node.Thumbprint ConfigurationMode = 'ApplyandAutoCorrect' RebootNodeIfNeeded = 'True' } } } FirstDomainController -ConfigurationData $configData -OutputPath $PSScriptRoot } #endregion #region DC Configuration Script if ((test-path C:\Windows\temp\FirstDC.txt) -eq $False) { configuration DomainController { Import-DscResource -ModuleName xComputerManagement, xActiveDirectory, xStorage node $AllNodes.Where{$_.ServerRole -eq 'Active Directory Domain Controller'}.Nodename { xWaitforDisk DataDisk { DiskNumber = $Node.Disk RetryCount = 720 } xDisk DataDisk { DiskNumber = $Node.Disk DriveLetter = $Node.Drive DependsOn = '[xWaitforDisk]DataDisk' } WindowsFeature AD-Domain-Services { Ensure = 'Present' Name = 'AD-Domain-Services' } xWaitForADDomain WaitforDomain { DomainName = $Node.DomainName DomainUserCredential = $Node.DomainCredential RetryCount = 720 RetryIntervalSec = 10 DependsOn = "[WindowsFeature]AD-Domain-Services" } xADDomainController BackupDC { DomainAdministratorCredential = $Node.DomainCredential DomainName = $Node.DomainName SafemodeAdministratorPassword = $Node.SMCredential DatabasePath = $Node.Drive + ":\NTDS" LogPath = $Node.Drive + ":\NTDS" SysvolPath = $Node.Drive + ":\SYSVOL" DependsOn = '[xDisk]DataDisk', '[WindowsFeature]AD-Domain-Services', '[xWaitforADDomain]WaitforDomain' } LocalConfigurationManager { CertificateId = $node.Thumbprint ConfigurationMode = 'ApplyandAutoCorrect' RebootNodeIfNeeded = 'True' } } } DomainController -ConfigurationData $configData -OutputPath $PSScriptRoot } #endregion #region Apply MOF Set-WSManQuickConfig -Force > $null Set-DscLocalConfigurationManager -ComputerName $env:COMPUTERNAME -Path $PSScriptRoot -Verbose Start-DscConfiguration -ComputerName $env:COMPUTERNAME -Path $PSScriptRoot -Force -Verbose -Wait #endregion |