mirror of
https://github.com/dockur/windows.git
synced 2025-10-27 19:35:49 +00:00
Automation of AD/Dc and the client auto connection
This commit is contained in:
parent
e1e1200ea2
commit
3c877b83d8
7 changed files with 265 additions and 38 deletions
0
.env
Normal file
0
.env
Normal file
6
.gitignore
vendored
6
.gitignore
vendored
|
|
@ -2,3 +2,9 @@ windows
|
||||||
windows_2025
|
windows_2025
|
||||||
win11x64.iso
|
win11x64.iso
|
||||||
win2025-eval.iso
|
win2025-eval.iso
|
||||||
|
windows_11_storage
|
||||||
|
windows_2025_storage
|
||||||
|
data_folder_win11/error.txt
|
||||||
|
data_folder_2025_server/errors.txt
|
||||||
|
windows_2025_storage_task1
|
||||||
|
windows_11_storage_task1
|
||||||
|
|
|
||||||
33
README.md
Normal file
33
README.md
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
Before doing the docker compose up always use the command
|
||||||
|
|
||||||
|
1) Create a macvlan network for the containers
|
||||||
|
|
||||||
|
Pick a tiny slice of your LAN that you won’t use for normal devices; we’ll use .200–.206.
|
||||||
|
|
||||||
|
# stop your current containers first
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
# create the macvlan network (parent is your NIC that’s on 192.168.10.0/24)
|
||||||
|
# \\ here remember that you have to set the subnet gateway ip-range and the parent with your network configuration
|
||||||
|
docker network create -d macvlan \
|
||||||
|
--subnet=192.168.10.0/24 \
|
||||||
|
--gateway=192.168.10.1 \
|
||||||
|
--ip-range=192.168.10.200/29 \
|
||||||
|
-o parent=enp6s0 \
|
||||||
|
ad_vlan
|
||||||
|
Why: macvlan lets each container appear as its own L2 host on your 192.168.10.0/24.
|
||||||
|
|
||||||
|
2) Allow the host to talk to macvlan endpoints (host-access workaround)
|
||||||
|
|
||||||
|
macvlan blocks host↔︎container by design. Create a macvlan sub-interface on the host so Arch can reach them:
|
||||||
|
|
||||||
|
# create a host-side macvlan interface that shares the same parent
|
||||||
|
sudo ip link add adhost link enp6s0 type macvlan mode bridge
|
||||||
|
sudo ip addr add 192.168.10.9/24 dev adhost
|
||||||
|
sudo ip link set adhost up
|
||||||
|
|
||||||
|
# route the small pool via this host-side macvlan interface
|
||||||
|
sudo ip route add 192.168.10.200/29 dev adhost
|
||||||
|
|
||||||
|
Now your Arch host (192.168.10.10) can reach the macvlan IPs through adhost (192.168.10.9).
|
||||||
|
|
||||||
56
backup.ps1
Normal file
56
backup.ps1
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
# scripts/dc_setup.ps1
|
||||||
|
|
||||||
|
# TODO: remove to avoid priv errors
|
||||||
|
# Start-Transcript -Path "$env:TEMP\transcript.log" -Force
|
||||||
|
|
||||||
|
# --- Script Parameters ---
|
||||||
|
$DomainName = "ttpl.local"
|
||||||
|
$DomainNetbiosName = "TTPL"
|
||||||
|
$AdminPassword = "P@raveeen123" # Use a secure method in production
|
||||||
|
|
||||||
|
# TODO: features may be already installed, but check if domain is other than WORKGROUP
|
||||||
|
# --- Idempotency Check: Exit if already a Domain Controller ---
|
||||||
|
# Write-Host "Checking if this server is already a Domain Controller..."
|
||||||
|
# if ((Get-WindowsFeature -Name AD-Domain-Services).Installed) {
|
||||||
|
# Write-Host "Active Directory Domain Services are already installed. Exiting script."
|
||||||
|
# exit
|
||||||
|
# }
|
||||||
|
Write-Host "Server is not a DC. Proceeding with configuration."
|
||||||
|
|
||||||
|
# --- 1. Network Configuration ---
|
||||||
|
Write-Host "Configuring static IP address..."
|
||||||
|
$ipAddress = "192.168.10.20"
|
||||||
|
$subnetMask = "255.255.255.0"
|
||||||
|
$gateway = "192.168.10.1"
|
||||||
|
$dnsServer = "127.0.0.1" # The DC is its own DNS server
|
||||||
|
|
||||||
|
# TODO: MSFT doc uses New-NetIPAddress, but it fails if IP already exists fixit
|
||||||
|
Get-NetAdapter | ForEach-Object {
|
||||||
|
$_ | New-NetIPAddress -AddressFamily IPv4 -IPAddress $ipAddress -PrefixLength 24 -DefaultGateway $gateway
|
||||||
|
$_ | Set-DnsClientServerAddress -ServerAddresses $dnsServer
|
||||||
|
}
|
||||||
|
Write-Host "Static IP configured."
|
||||||
|
|
||||||
|
# --- 2. Install Active Directory Domain Services ---
|
||||||
|
Write-Host "Installing AD-Domain-Services role..."
|
||||||
|
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
|
||||||
|
|
||||||
|
# --- 3. Promote to Domain Controller ---
|
||||||
|
Write-Host "Promoting server to a Domain Controller for '$DomainName'..."
|
||||||
|
$securePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force
|
||||||
|
|
||||||
|
Install-ADDSForest `
|
||||||
|
-CreateDnsDelegation:$false `
|
||||||
|
-DatabasePath "C:\WINDOWS\NTDS" `
|
||||||
|
-DomainMode "Win2025" ` # Using a more compatible default
|
||||||
|
-DomainName $DomainName `
|
||||||
|
-DomainNetbiosName $DomainNetbiosName `
|
||||||
|
-ForestMode "Win2025" `
|
||||||
|
-InstallDns:$true `
|
||||||
|
-LogPath "C:\WINDOWS\NTDS" `
|
||||||
|
-SysvolPath "C:\WINDOWS\SYSVOL" `
|
||||||
|
-Force:$true `
|
||||||
|
-SafeModeAdministratorPassword $securePassword
|
||||||
|
|
||||||
|
# The promotion process will automatically trigger a reboot.
|
||||||
|
Write-Host "Configuration complete. The server will restart automatically."
|
||||||
46
compose.yml
46
compose.yml
|
|
@ -1,32 +1,3 @@
|
||||||
# services:
|
|
||||||
# windows:
|
|
||||||
# image: dockurr/windows
|
|
||||||
# container_name: windows_11
|
|
||||||
# privileged: true
|
|
||||||
# environment:
|
|
||||||
# VERSION: "11"
|
|
||||||
# devices:
|
|
||||||
# - /dev/kvm
|
|
||||||
# - /dev/net/tun
|
|
||||||
# cap_add:
|
|
||||||
# - NET_ADMIN
|
|
||||||
# ports:
|
|
||||||
# - 192.168.10.10:8006:8006
|
|
||||||
# - 192.168.10.10:3389:3389/tcp
|
|
||||||
# - 192.168.10.10:3389:3389/udp
|
|
||||||
# volumes:
|
|
||||||
# - ./win11x64.iso:/boot.iso
|
|
||||||
# - ./windows:/storage
|
|
||||||
# # - ./src/entry.sh:/run/entry.sh
|
|
||||||
# restart: always
|
|
||||||
# stop_grace_period: 2m
|
|
||||||
# networks:
|
|
||||||
# - ad_network
|
|
||||||
|
|
||||||
# networks:
|
|
||||||
# ad_network:
|
|
||||||
# external: true
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
windows_2025:
|
windows_2025:
|
||||||
image: dockurr/windows
|
image: dockurr/windows
|
||||||
|
|
@ -35,6 +6,7 @@ services:
|
||||||
environment:
|
environment:
|
||||||
VERSION: "2025"
|
VERSION: "2025"
|
||||||
DHCP: "Y"
|
DHCP: "Y"
|
||||||
|
# IP: "192.168.10.20"
|
||||||
devices:
|
devices:
|
||||||
- /dev/kvm
|
- /dev/kvm
|
||||||
- /dev/net/tun
|
- /dev/net/tun
|
||||||
|
|
@ -45,13 +17,13 @@ services:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
volumes:
|
volumes:
|
||||||
- ./win2025-eval.iso:/boot.iso
|
- ./win2025-eval.iso:/boot.iso
|
||||||
- ./windows_2025:/storage
|
- ./windows_2025_storage_task1:/storage
|
||||||
- ./src/entry.sh:/run/entry.sh
|
- ./data_folder_2025_server:/data
|
||||||
restart: always
|
restart: always
|
||||||
stop_grace_period: 2m
|
stop_grace_period: 2m
|
||||||
networks:
|
networks:
|
||||||
ad_vlan:
|
ad_vlan:
|
||||||
ipv4_address: 192.168.10.201 # container IP (Linux side). Windows guest will DHCP a *different* IP.
|
ipv4_address: 192.168.10.201 # Fix AD(Server_2025) server IP for Docker network
|
||||||
|
|
||||||
windows_11:
|
windows_11:
|
||||||
image: dockurr/windows
|
image: dockurr/windows
|
||||||
|
|
@ -60,6 +32,7 @@ services:
|
||||||
environment:
|
environment:
|
||||||
VERSION: "11"
|
VERSION: "11"
|
||||||
DHCP: "Y"
|
DHCP: "Y"
|
||||||
|
# IP: "192.168.10.21"
|
||||||
devices:
|
devices:
|
||||||
- /dev/kvm
|
- /dev/kvm
|
||||||
- /dev/net/tun
|
- /dev/net/tun
|
||||||
|
|
@ -70,13 +43,14 @@ services:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
volumes:
|
volumes:
|
||||||
- ./win11x64.iso:/boot.iso
|
- ./win11x64.iso:/boot.iso
|
||||||
- ./windows:/storage
|
- ./windows_11_storage_task1:/storage
|
||||||
- ./src/entry.sh:/run/entry.sh
|
- ./data_folder_win11:/data
|
||||||
restart: always
|
|
||||||
stop_grace_period: 2m
|
stop_grace_period: 2m
|
||||||
networks:
|
networks:
|
||||||
ad_vlan:
|
ad_vlan:
|
||||||
ipv4_address: 192.168.10.202 # container IP (Linux side)
|
ipv4_address: 192.168.10.202 # Fix Windows 11 IP for Docker network
|
||||||
|
depends_on:
|
||||||
|
- windows_2025
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
ad_vlan:
|
ad_vlan:
|
||||||
|
|
|
||||||
85
data_folder_2025_server/dc_setup.ps1
Normal file
85
data_folder_2025_server/dc_setup.ps1
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
# This script is designed to be idempotent. It can be run multiple times without causing errors.
|
||||||
|
|
||||||
|
# --- Reliable Logging ---
|
||||||
|
# Start-Transcript now logs to the user's temporary folder, which is always writable.
|
||||||
|
Start-Transcript -Path "$env:TEMP\transcript.log" -Force
|
||||||
|
|
||||||
|
# --- Script Parameters ---
|
||||||
|
$DomainName = "ttpl.local"
|
||||||
|
$DomainNetbiosName = "TTPL"
|
||||||
|
$AdminPassword = "P@raveeen123" # Use a secure method in production
|
||||||
|
|
||||||
|
# --- Robust Idempotency Check ---
|
||||||
|
# This is a much better check. It tries to get the AD Domain information.
|
||||||
|
# If it succeeds AND the domain name matches our target, we know the script is already done.
|
||||||
|
try {
|
||||||
|
if ((Get-ADDomain).DNSRoot -eq $DomainName) {
|
||||||
|
Write-Host "This server is already a Domain Controller for the '$DomainName' domain. No action needed. Exiting."
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Host "This server is not yet a Domain Controller . Proceeding with configuration."
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- 1. Idempotent Network Configuration ---
|
||||||
|
Write-Host "Configuring static IP address..."
|
||||||
|
$ipAddress = "192.168.10.220"
|
||||||
|
$gateway = "192.168.10.1"
|
||||||
|
$dnsServer = "127.0.0.1" # The DC is its own DNS server
|
||||||
|
|
||||||
|
# This logic is now safe to re-run. It finds the primary network adapter.
|
||||||
|
$adapter = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | Select-Object -First 1
|
||||||
|
|
||||||
|
if ($adapter) {
|
||||||
|
Write-Host "Found active network adapter: $($adapter.Name)"
|
||||||
|
|
||||||
|
# First, set the DNS. This is always safe to do.
|
||||||
|
Set-DnsClientServerAddress -InterfaceIndex $adapter.InterfaceIndex -ServerAddresses $dnsServer
|
||||||
|
|
||||||
|
# Check if the correct IP is already set. If not, configure it.
|
||||||
|
$currentIP = Get-NetIPAddress -InterfaceIndex $adapter.InterfaceIndex -AddressFamily IPv4 | Where-Object { $_.IPAddress -eq $ipAddress }
|
||||||
|
|
||||||
|
# if (-not $currentIP) { //alwa
|
||||||
|
Write-Host "IP address not set correctly. Configuring static IP..."
|
||||||
|
# Remove any other IPv4 addresses to prevent conflicts
|
||||||
|
Get-NetIPAddress -InterfaceIndex $adapter.InterfaceIndex -AddressFamily IPv4 | Remove-NetIPAddress -Confirm:$false
|
||||||
|
|
||||||
|
# Set the new IP address
|
||||||
|
New-NetIPAddress -InterfaceIndex $adapter.InterfaceIndex -IPAddress $ipAddress -PrefixLength 24 -DefaultGateway $gateway
|
||||||
|
Write-Host "Static IP configured."
|
||||||
|
# } else {
|
||||||
|
# Write-Host "IP address is already correctly set to $ipAddress."
|
||||||
|
# }
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Error "Could not find an active network adapter."
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- 2. Install Active Directory Domain Services (if needed) ---
|
||||||
|
if (-not (Get-WindowsFeature -Name AD-Domain-Services).Installed) {
|
||||||
|
Write-Host "Installing AD-Domain-Services role..."
|
||||||
|
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
|
||||||
|
} else {
|
||||||
|
Write-Host "AD-Domain-Services role is already installed."
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- 3. Promote to Domain Controller ---
|
||||||
|
Write-Host "Promoting server to a Domain Controller for '$DomainName'..."
|
||||||
|
$securePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force
|
||||||
|
|
||||||
|
Install-ADDSForest `
|
||||||
|
-CreateDnsDelegation:$false `
|
||||||
|
-DatabasePath "C:\WINDOWS\NTDS" `
|
||||||
|
-DomainMode "Win2025" `
|
||||||
|
-DomainName $DomainName `
|
||||||
|
-DomainNetbiosName $DomainNetbiosName `
|
||||||
|
-ForestMode "Win2025" `
|
||||||
|
-InstallDns:$true `
|
||||||
|
-LogPath "C:\WINDOWS\NTDS" `
|
||||||
|
-SysvolPath "C:\WINDOWS\SYSVOL" `
|
||||||
|
-Force:$true `
|
||||||
|
-SafeModeAdministratorPassword $securePassword
|
||||||
|
|
||||||
|
Write-Host "Configuration complete. The server will restart automatically."
|
||||||
73
data_folder_win11/client_setup.ps1
Normal file
73
data_folder_win11/client_setup.ps1
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
# This script is designed to be idempotent and robust.
|
||||||
|
|
||||||
|
# --- Script Parameters ---
|
||||||
|
# CRITICAL: Make sure these values are correct!
|
||||||
|
$DomainName = "ttpl.local"
|
||||||
|
$DC_IP = "192.168.10.220" # IMPORTANT: Use the NEW IP address of your DC
|
||||||
|
$AdminUser = "administrator"
|
||||||
|
$AdminPassword = "admin" # CRITICAL: This MUST match the password used to create the domain
|
||||||
|
|
||||||
|
# --- Idempotency Check ---
|
||||||
|
Write-Host "Checking if this PC is already joined to the domain..."
|
||||||
|
if ((Get-ComputerInfo).Domain -eq $DomainName) {
|
||||||
|
Write-Host "This PC is already a member of the '$DomainName' domain. Exiting script."
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
Write-Host "PC is not domain-joined. Proceeding..."
|
||||||
|
|
||||||
|
# --- 1. Wait for Domain Controller ---
|
||||||
|
Write-Host "Waiting for the Domain Controller at $DC_IP to come online..."
|
||||||
|
while (-not (Test-NetConnection -ComputerName $DC_IP -Port 389 -InformationLevel "Quiet")) {
|
||||||
|
Write-Host "DC is not reachable yet. Retrying in 10 seconds..."
|
||||||
|
Start-Sleep -Seconds 10
|
||||||
|
}
|
||||||
|
Write-Host "Domain Controller is online!"
|
||||||
|
|
||||||
|
# --- 2. Robust Network Configuration ---
|
||||||
|
Write-Host "Configuring static IP and DNS..."
|
||||||
|
$ipAddress = "192.168.10.219" # A free IP for this client
|
||||||
|
$gateway = "192.168.10.1"
|
||||||
|
$dnsServer = $DC_IP # DNS MUST point to the Domain Controller
|
||||||
|
|
||||||
|
# Find the primary active network adapter
|
||||||
|
$adapter = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | Select-Object -First 1
|
||||||
|
|
||||||
|
if ($adapter) {
|
||||||
|
Write-Host "Found active network adapter: $($adapter.Name)"
|
||||||
|
|
||||||
|
# THE NEW FIX: This logic uses 'Set-' cmdlets to modify the existing configuration.
|
||||||
|
# It avoids the '...already exists' error by not trying to create a new configuration.
|
||||||
|
|
||||||
|
# First, get the existing IP configuration object.
|
||||||
|
$ipconfig = Get-NetIPConfiguration -InterfaceIndex $adapter.InterfaceIndex | Where-Object { $_.IPv4Address } | Select-Object -First 1
|
||||||
|
|
||||||
|
if ($ipconfig) {
|
||||||
|
Write-Host "Modifying existing IP configuration..."
|
||||||
|
# Use Set-NetIPAddress to change the IP and Gateway on the existing configuration
|
||||||
|
Set-NetIPAddress -InputObject $ipconfig -IPAddress $ipAddress -PrefixLength 24 -DefaultGateway $gateway
|
||||||
|
# Use Set-DnsClientServerAddress to set the DNS
|
||||||
|
Set-DnsClientServerAddress -InterfaceIndex $adapter.InterfaceIndex -ServerAddresses $dnsServer
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
# Fallback for a completely unconfigured adapter (unlikely in this case, but safe)
|
||||||
|
Write-Host "No existing IP configuration found. Creating a new one..."
|
||||||
|
New-NetIPAddress -InterfaceIndex $adapter.InterfaceIndex -IPAddress $ipAddress -PrefixLength 24 -DefaultGateway $gateway
|
||||||
|
Set-DnsClientServerAddress -InterfaceIndex $adapter.InterfaceIndex -ServerAddresses $dnsServer
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Static IP and DNS configured."
|
||||||
|
Start-Sleep -Seconds 15 # Give network settings a moment to apply
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Error "Could not find an active network adapter."
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- 3. Join the Domain ---
|
||||||
|
Write-Host "Joining the domain '$DomainName'..."
|
||||||
|
$username = "$DomainName\$AdminUser"
|
||||||
|
$credential = New-Object System.Management.Automation.PSCredential($username, (ConvertTo-SecureString $AdminPassword -AsPlainText -Force))
|
||||||
|
|
||||||
|
Add-Computer -DomainName $DomainName -Credential $credential -Restart -Force
|
||||||
|
Write-Host "Domain join complete. The computer will restart automatically."
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue