170 lines
8.2 KiB
PowerShell
170 lines
8.2 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
This script configures the basic settings for an Active Directory Domain Services (ADDS) environment.
|
|
It enables the Recycle Bin feature, creates a basic Organizational Unit (OU) structure, and logs the configuration process.
|
|
The script also generates a summary file with the configuration details.
|
|
|
|
.DESCRIPTION
|
|
The script performs the following tasks:
|
|
|
|
1. Checks if the server is part of a domain and if the required PowerShell modules are available.
|
|
2. Enables the Recycle Bin feature if it's not already enabled.
|
|
3. Creates a basic OU structure with the following OUs: Users, Groups, Computers, Servers, Service Accounts, and Administrators.
|
|
4. Logs the configuration process to a log file.
|
|
5. Generates a summary file with the configuration details.
|
|
|
|
.PARAMETER None
|
|
This script does not require any parameters.
|
|
|
|
.EXAMPLE
|
|
Run the script in PowerShell to configure the ADDS environment.
|
|
|
|
.NOTES
|
|
This script is intended for use in a test or production environment. Make sure to test the script in a non-production environment before running it in production.
|
|
Author: D.de Kooker - info@dcomputers.nl
|
|
Version: 1.0
|
|
|
|
DISCLAIMER: Use scripts at your own risk, if there is anything I can help you with I will try but I do not take responsibility for the way that anyone else uses my scripts.
|
|
Sharing is caring. Share your knowledge with the world so that everybody can learn from it.
|
|
|
|
.LINK
|
|
The latest version can Always be found on my GIT page on the link below:
|
|
https://git.dcomputers.nl/Dcomputers/PowershellScripts
|
|
#>
|
|
|
|
#region Global script settings and variables
|
|
$Version = "v1.0"
|
|
$logfilelocation = "$($MyInvocation.MyCommand.Path | Split-Path -Parent)\Logs"
|
|
$logfilename = "$(Get-Date -Format yyyyMMddHHmmss)-ADDS_Configuration.log"
|
|
$summaryfilename = "$(Get-Date -Format yyyyMMddHHmmss)-ADDS_Configuration_Summary.txt"
|
|
#endregion
|
|
|
|
#region functions
|
|
function Initiate-Log {
|
|
# Get current user and session information
|
|
$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
|
|
$computerName = $env:COMPUTERNAME
|
|
$sessionID = $pid
|
|
$date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
|
|
|
# Write log header
|
|
$logHeader = "[$date] Log initiated by $username on $computerName (Session ID: $sessionID)"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value "**********************"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value "LogFile initiation"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value "Start time: $date"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value "Username: $username"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value "Machine: $computerName"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value "Process ID: $sessionID"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value "Script Version: $Version"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value "Script Source: https://git.dcomputers.nl/Dcomputers/PowershellScripts"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value "**********************"
|
|
}
|
|
|
|
function Write-Log {
|
|
[CmdletBinding()]
|
|
Param (
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Message,
|
|
[Parameter(Mandatory=$false)]
|
|
[ValidateSet("INFO", "WARNING", "ERROR")]
|
|
[string]$Level = "INFO"
|
|
)
|
|
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
|
$logmessage = "[$timestamp] [$Level] $Message"
|
|
Add-Content -Path $logfilelocation\$logfilename -Value $logmessage
|
|
}
|
|
|
|
function Write-Summary {
|
|
[CmdletBinding()]
|
|
Param (
|
|
[Parameter(Mandatory=$true)]
|
|
[string]$Message
|
|
)
|
|
Add-Content -Path $logfilelocation\$summaryfilename -Value $Message
|
|
}
|
|
#endregion
|
|
|
|
#region prerequisites check
|
|
#Create log directory if not present and initiate logfile
|
|
if (!(test-path $logfilelocation)) {mkdir $logfilelocation}
|
|
Initiate-Log
|
|
|
|
#Check if the required Powershell Modules are available
|
|
$modules = @("ActiveDirectory","DnsServer")
|
|
foreach ($module in $modules) {
|
|
if (!(Get-Module -Name $module -ListAvailable)) {
|
|
Write-Host "The $module module is not installed. Please install it and try again."
|
|
Write-Log -Message "The $module module is not installed. Please install it and try again." -Level ERROR
|
|
exit 1
|
|
}
|
|
else {
|
|
Import-Module $module
|
|
}
|
|
}
|
|
|
|
#Check if the server is part of a domain
|
|
$domainController = Get-ADDomainController -ErrorAction SilentlyContinue
|
|
if (-not $domainController) {
|
|
Write-Host "The local server is not part of a domain."
|
|
Write-Log -Message "The local server is not part of a domain." -Level ERROR
|
|
exit 1
|
|
} else {
|
|
Write-Host "The local server is part of the $($domainController.Site) site in the $($domainController.Domain) domain."
|
|
Write-Log -Message "The local server is part of the $($domainController.Site) site in the $($domainController.Domain) domain." -Level INFO
|
|
}
|
|
#endregion
|
|
|
|
#region configure ADDS
|
|
#Enable Recycle bin
|
|
$recycleBinFeature = Get-ADOptionalFeature -Filter {Name -eq "Recycle Bin Feature"} -ErrorAction SilentlyContinue
|
|
if (-not $recycleBinFeature.EnabledScopes) {
|
|
Write-Host "The Recycle Bin feature is not enabled. Enabling it..."
|
|
Write-Log -Message "The Recycle Bin feature is not enabled. Enabling it..." -Level INFO
|
|
Enable-ADOptionalFeature -Identity "Recycle Bin Feature" -Scope ForestOrConfigurationSet -Target $domainController.Domain -Confirm:$false
|
|
Write-Host "The Recycle Bin feature has been enabled."
|
|
Write-Log -Message "The Recycle Bin feature has been enabled." -Level INFO
|
|
} else {
|
|
Write-Host "The Recycle Bin feature is already enabled."
|
|
Write-Log -Message "The Recycle Bin feature is already enabled." -Level INFO
|
|
}
|
|
|
|
#Create a basic OU structure
|
|
$companyName = Read-Host "Please enter the company name"
|
|
$rootOU = Get-ADOrganizationalUnit -Filter {Name -eq $companyName} -ErrorAction SilentlyContinue
|
|
if (-not $rootOU) {
|
|
$rootOU = New-ADOrganizationalUnit -Name $companyName -Path $domainController.DefaultPartition -ProtectedFromAccidentalDeletion $true
|
|
Write-Host "The root OU '$companyName' has been created."
|
|
Write-Log -Message "The root OU '$companyName' has been created." -Level INFO
|
|
} else {
|
|
Write-Host "The root OU '$companyName' already exists."
|
|
Write-Log -Message "The root OU '$companyName' already exists." -Level INFO
|
|
}
|
|
|
|
$ouList = @("Users", "Groups", "Computers", "Servers", "Service Accounts", "Administrators")
|
|
$rootOU = Get-ADOrganizationalUnit -Filter {Name -eq $companyName} -ErrorAction SilentlyContinue
|
|
foreach ($ou in $ouList) {
|
|
$newOU = Get-ADOrganizationalUnit -Filter "Name -eq '$ou' -and DistinguishedName -like '*,$($companyName),$($domainController.DefaultPartition)'" -ErrorAction SilentlyContinue
|
|
if (-not $newOU) {
|
|
$newOU = New-ADOrganizationalUnit -Name $ou -Path $rootOU.DistinguishedName -ProtectedFromAccidentalDeletion $true
|
|
Write-Host "The OU '$ou' has been created under '$companyName'."
|
|
Write-Log -Message "The OU '$ou' has been created under '$companyName'."
|
|
} else {
|
|
Write-Host "The OU '$ou' already exists under '$companyName'."
|
|
Write-Log -Message "The OU '$ou' already exists under '$companyName'."
|
|
}
|
|
}
|
|
Write-Host "The basic OU structure has been created or already exists."
|
|
Write-Log -Message "The basic OU structure has been created or already exists."
|
|
#endregion
|
|
|
|
#region summary
|
|
Write-Summary "ADDS Structure configuration Summary:"
|
|
Write-Summary "---------------------------"
|
|
Write-Summary "Configuration date: $(Get-Date -Format "dd-MM-yyy HH:mm:ss")"
|
|
Write-Summary "Company Name: $companyName"
|
|
Write-Summary "Domain: $($domainController.Domain)"
|
|
Write-Summary "Site: $($domainController.Site)"
|
|
Write-Summary "Recycle Bin: Enabled"
|
|
Write-Summary "OU Structure: Created or already exists"
|
|
Write-Summary "---------------------------"
|
|
#endregion |