$vmname = "dc"
$iso = "C:\SBC Geek LAB\DISTR\en-us_windows_server_2022_updated_march_2026_x64_dvd_3f772967.iso"
$path = "C:\SBC Geek LAB\"
$NewVHDPath = ($path + $vmname + "\Virtual Hard Disks\" + $vmname + ".vhdx")
$lan = "LAN"

New-VM `
-Generation 2 `
-Name $vmname `
-Path $path `
-MemoryStartupBytes 4GB `
-NewVHDPath $NewVHDPath `
-NewVHDSizeBytes 127GB `
-SwitchName $lan

Add-VMDvdDrive -VMName $vmname -Path $iso
Set-VMProcessor -VMname $vmname -count 2 -Reserve 0
$DVD = Get-VMDvdDrive -VMName $vmname
Set-VMFirmware -VMName $vmname -SecureBootTemplateId ([guid]'1734c6e8-3154-4dda-ba5f-a874cc483422') -FirstBootDevice $dvd
Откройте PowerShell ISE (под Administrator), на VM dc, вставьте текст скрипта и сохраните на рабочем столе VM файл setup-dc.ps1 (обязательно), и запустите его - Этап 1 - Авт. перезагрузка (1)
# --- БЛОК НАСТРОЕК ---
$NewHostName   = "DC"
$DomainName    = "sbcgeek.com"
$NetBIOSName   = "SBCGEEK"
$StaticIP      = "192.168.1.100"
$MaskPrefix    = 24
$Gateway       = "192.168.1.1"
$DNSPrimary    = "192.168.1.1"
$DSRMPassword  = ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force
$ScriptPath    = "C:\Users\Administrator\Desktop\setup-dc.ps1"
# ---------------------

Set-TimeZone -Id "Russian Standard Time"

# Функция для добавления скрипта в автозапуск после перезагрузки
function Set-RunOnce {
    $Command = "powershell.exe -ExecutionPolicy Bypass -File $ScriptPath"
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" -Name "DC_Setup" -Value $Command
}

# ЭТАП 1: Настройка сети и имени
if ($env:COMPUTERNAME -ne $NewHostName) {
    Write-Host "ЭТАП 1: Настройка сети и имени..." -ForegroundColor Cyan
    
    # Настройка IP
    $Interface = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | Select-Object -First 1
    New-NetIPAddress -InterfaceIndex $Interface.InterfaceIndex -IPAddress $StaticIP -PrefixLength $MaskPrefix -DefaultGateway $Gateway -Confirm:$false
    Set-DnsClientServerAddress -InterfaceIndex $Interface.InterfaceIndex -ServerAddresses $DNSPrimary
    
    # Добавляем скрипт в RunOnce и переименовываем
    Set-RunOnce
    Rename-Computer -NewName $NewHostName -Force
    Restart-Computer -Force
    exit
}

# ЭТАП 2: Установка роли AD DS
if (!(Get-WindowsFeature -Name AD-Domain-Services).Installed) {
    Write-Host "ЭТАП 2: Установка роли AD DS..." -ForegroundColor Cyan
    Set-RunOnce
    Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
    Restart-Computer -Force
    exit
}

# ЭТАП 3: Развертывание леса AD
# Проверяем роль сервера через WMI. 4 и 5 — это Domain Controller.
$DomainRole = (Get-CimInstance Win32_ComputerSystem).DomainRole

if ($DomainRole -lt 4) {
    Write-Host "ЭТАП 3: Развертывание леса Active Directory..." -ForegroundColor Cyan
    
    Import-Module ADDSDeployment
    Install-ADDSForest `
        -CreateDnsDelegation:$false `
        -DatabasePath "C:\Windows\NTDS" `
        -DomainMode "WinThreshold" `
        -DomainName $DomainName `
        -DomainNetbiosName $NetBIOSName `
        -ForestMode "WinThreshold" `
        -InstallDns:$true `
        -LogPath "C:\Windows\NTDS" `
        -NoRebootOnCompletion:$false `
        -SysvolPath "C:\Windows\SYSVOL" `
        -SafeModeAdministratorPassword $DSRMPassword `
        -Force:$true
} else {
    Write-Host "Сервер уже является контроллером домена (DomainRole: $DomainRole)." -ForegroundColor Green
    # Удаляем файл скрипта, если нужно
    Remove-Item $ScriptPath -Force
}
# --- БЛОК НАСТРОЕК ---
$NewHostName   = "DC"
$DomainName    = "sbcgeek.com"
$NetBIOSName   = "SBCGEEK"
$StaticIP      = "192.168.1.100"
$MaskPrefix    = 24
$Gateway       = "192.168.1.1"
$DNSPrimary    = "192.168.1.1"
$AdminPassword = "P@ssw0rd"
$DSRMPassword  = ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force
$ScriptPath    = "C:\Users\Administrator\Desktop\setup-dc.ps1"
# ---------------------

Set-TimeZone -Id "Russian Standard Time"

# Функция для добавления скрипта в автозапуск после перезагрузки
function Set-RunOnce {
    $Command = "powershell.exe -ExecutionPolicy Bypass -File `"$ScriptPath`""
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" -Name "DC_Setup" -Value $Command
}

# Включить автологон
function Set-AutoLogon {
    param(
        [string]$UserName,
        [string]$Password,
        [string]$Domain
    )

    $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

    Set-ItemProperty -Path $RegPath -Name "AutoAdminLogon" -Value "1"
    Set-ItemProperty -Path $RegPath -Name "DefaultUserName" -Value $UserName
    Set-ItemProperty -Path $RegPath -Name "DefaultPassword" -Value $Password
    Set-ItemProperty -Path $RegPath -Name "DefaultDomainName" -Value $Domain
}

# Удалить автологон после завершения установки
function Remove-AutoLogon {
    $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

    Set-ItemProperty -Path $RegPath -Name "AutoAdminLogon" -Value "0" -ErrorAction SilentlyContinue
    Remove-ItemProperty -Path $RegPath -Name "DefaultUserName" -ErrorAction SilentlyContinue
    Remove-ItemProperty -Path $RegPath -Name "DefaultPassword" -ErrorAction SilentlyContinue
    Remove-ItemProperty -Path $RegPath -Name "DefaultDomainName" -ErrorAction SilentlyContinue
}

# Аккуратная настройка IP и DNS без падения на повторном запуске
function Set-NetworkConfig {
    $Interface = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | Select-Object -First 1

    if (-not $Interface) {
        throw "Не найден активный сетевой интерфейс."
    }

    $CurrentIP = Get-NetIPAddress -InterfaceIndex $Interface.InterfaceIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue |
        Where-Object { $_.IPAddress -eq $StaticIP }

    if (-not $CurrentIP) {
        $ExistingIPv4 = Get-NetIPAddress -InterfaceIndex $Interface.InterfaceIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue |
            Where-Object { $_.PrefixOrigin -ne "WellKnown" }

        foreach ($ip in $ExistingIPv4) {
            try {
                Remove-NetIPAddress -InterfaceIndex $Interface.InterfaceIndex -IPAddress $ip.IPAddress -Confirm:$false -ErrorAction SilentlyContinue
            } catch {
            }
        }

        $ExistingRoutes = Get-NetRoute -InterfaceIndex $Interface.InterfaceIndex -AddressFamily IPv4 -DestinationPrefix "0.0.0.0/0" -ErrorAction SilentlyContinue
        foreach ($route in $ExistingRoutes) {
            try {
                Remove-NetRoute -InterfaceIndex $Interface.InterfaceIndex -DestinationPrefix "0.0.0.0/0" -Confirm:$false -ErrorAction SilentlyContinue
            } catch {
            }
        }

        New-NetIPAddress -InterfaceIndex $Interface.InterfaceIndex `
                         -IPAddress $StaticIP `
                         -PrefixLength $MaskPrefix `
                         -DefaultGateway $Gateway `
                         -AddressFamily IPv4 `
                         -Confirm:$false | Out-Null
    }

    Set-DnsClientServerAddress -InterfaceIndex $Interface.InterfaceIndex -ServerAddresses $DNSPrimary
}

# ЭТАП 1: Настройка сети и имени
if ($env:COMPUTERNAME -ne $NewHostName) {
    Write-Host "ЭТАП 1: Настройка сети и имени..." -ForegroundColor Cyan
    
    Set-NetworkConfig
    
    # Автологон локальным Administrator до создания домена
    Set-AutoLogon -UserName "Administrator" -Password $AdminPassword -Domain "."
    
    # Добавляем скрипт в RunOnce и переименовываем
    Set-RunOnce
    Rename-Computer -NewName $NewHostName -Force
    Restart-Computer -Force
    exit
}

# ЭТАП 2: Установка роли AD DS
if (!(Get-WindowsFeature -Name AD-Domain-Services).Installed) {
    Write-Host "ЭТАП 2: Установка роли AD DS..." -ForegroundColor Cyan

    Set-NetworkConfig

    # После ребута всё ещё логинимся локальным Administrator
    Set-AutoLogon -UserName "Administrator" -Password $AdminPassword -Domain "."

    Set-RunOnce
    Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
    Restart-Computer -Force
    exit
}

# ЭТАП 3: Развертывание леса AD
$DomainRole = (Get-CimInstance Win32_ComputerSystem).DomainRole

if ($DomainRole -lt 4) {
    Write-Host "ЭТАП 3: Развертывание леса Active Directory..." -ForegroundColor Cyan

    Set-NetworkConfig

    # После установки DC вход уже должен быть доменным Administrator
    Set-AutoLogon -UserName "Administrator" -Password $AdminPassword -Domain $DomainName
    
    Import-Module ADDSDeployment
    Install-ADDSForest `
        -CreateDnsDelegation:$false `
        -DatabasePath "C:\Windows\NTDS" `
        -DomainMode "WinThreshold" `
        -DomainName $DomainName `
        -DomainNetbiosName $NetBIOSName `
        -ForestMode "WinThreshold" `
        -InstallDns:$true `
        -LogPath "C:\Windows\NTDS" `
        -NoRebootOnCompletion:$false `
        -SysvolPath "C:\Windows\SYSVOL" `
        -SafeModeAdministratorPassword $DSRMPassword `
        -Force:$true
} else {
    Write-Host "Сервер уже является контроллером домена (DomainRole: $DomainRole)." -ForegroundColor Green

    # На DC лучше переключить DNS на самого себя
    try {
        $Interface = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | Select-Object -First 1
        Set-DnsClientServerAddress -InterfaceIndex $Interface.InterfaceIndex -ServerAddresses "127.0.0.1"
    } catch {
    }

    # Удаляем параметры автологина после завершения установки
    Remove-AutoLogon

    # Удаляем файл скрипта, если нужно
    Remove-Item $ScriptPath -Force -ErrorAction SilentlyContinue
}
Made on
Tilda