pageman262
Goto Top

Powershell: Ersten DC im Forest hochstufen

Hallo an alle,

nachdem ich einiges an Arbeit investiert habe um das Skript zu bauen dachte ich mir das vielleicht einer von eich das auch brauchen könnte. Da ich nicht der Powershell Guru bin bin ich natürlich über Vorschläge zur Verbesserung und Erweiterung gerne offen und dankbar.

Was macht das Skript?

1) Anpassen des Computernamens
2) Anpassen der Netzwerkkarteneinstellungen -> IP,Subnet, DNS
3) Installieren der benötigten Features
4) Erstellen des Forest und hochstufen des Servers zum 1 DC im Forest
5) Erstellen einer DNS Reverse Lookup Zone und setzen des Pointers

Ausführung des Skripts:
Ich habe es unter Server 2012 und R2 getestet. Immer mit dem lokalen Admin und es hat problemlos funktioniert.Beide Skriptdatein müssen im gleichen Verzeichnis sein!

Als erstes eine Powershell Sitzung öffnen und
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
ausführen. Dann können die Skripts problemlos ausgeführt werden.

Das Skript holt sich automatisch die erhöhten Rechte der Powershell. Ausserdem führt es auch alle benötigten Neustarts von selber aus. Daher benötigt man auch die Eingabe des Adminpasswortes damit der AutoLogin danch funkt. Nach dem Ende des Skripts werden alle Einträge aus der Registry gelöscht die zuvor erstellt wurden.

Datei1: CreateCD.ps1
param($Step="A")  
# -------------------------------------
# Imports
# -------------------------------------
$script = $myInvocation.MyCommand.Definition
$scriptPath = Split-Path -parent $script
. (Join-Path $scriptpath functions.ps1)
$Comuptername="DC1"  
$Domainname="contoso"  
$DomainTLD="loc"  
$IPAdresse = "192.168.1.1"  
$IPSubnetmask = 24
$IPGareway="192.168.1.1"  
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))  
{
    Write-Host "Administrationsrehte werden angefordert!"  
    $arguments = "& '" + $myinvocation.mycommand.definition + "'"  
    Start-Process powershell -Verb runAs -ArgumentList $arguments
    Break
}

Clear-Any-Restart

if (Should-Run-Step "A")   
{
	Write-Host "Schritt 1 von 3 ... Ausführung beginnt" -ForegroundColor Yellow  
	
    Write-Host "Mit diesem Skript können Sie einen neuen Server 2012 hochstufen und konfigurieren"  
    Write-Host "Das Skript wird nach einen etwaigen Neustart fortgesetzt!"  
    Write-Host "Unterbrechungen des Skriptes bewirken das Sie die konfigurationen selber durchführen müssen"  
    Write-Host "Umfang:  
                       Zuweisen einer statischen IP auf der primären Netzwerkkarte
                       Umbenennen des PC
                       Neustart des PC
                       Hochstufen zu DC
                       Neustart des PC
                       Korrigieren der Netzwerkkarteneinstellungen
                       Erstellen der DNS Reverse Lookupzone
                       Erstellen des Pointers in der Reverse Lookupzone" -ForegroundColor Yellow  

    $StartScript = Read-Host "Wollen Sie diese Aufgaben durchführen? J/N (default=N)"  
    
    #Wenn die Eingabe J ist wird das Skript gestartet
    if($StartScript -eq "J")  
    {
        Write-Host "Ausführung gestartet" -ForegroundColor Yellow  
        #Benötigte Werte abfragen

        #Wird für den Autologin benötigt
        $AdminPW = Read-Host "Bitte geben Sie das Kennwort des lokalen Kontos Administrator an:"  
        #Der zukünftige Computername (Hostname) 
        $Comuptername=Read-Host "Bitte geben Sie den neuen Namen des Computers ein:"  
        #Der Netbiosname des Forest
        $Domainname=Read-Host "Bitte geben Sie den Netbiosnamen der Domain ein:"  
        #Die TLD des Forest
        $DomainTLD=Read-Host "Bitte geben Sie die TLD für Ihre Domain ein:"  
        #Die IP-Adresse die er erste Netzwerkadapter bekommen soll
        $IPAdresse = Read-Host "Welche IP Adresse soll Ihr DC haben?"  
        #Die Subnetmaske die für den Adapter gültig ist
        $IPSubnetmask = Read-Host "Geben Sie die Subnetmask in CIDR ein:"  
        #Der Gateway
        $IPGareway = Read-Host "Geben Sie den Standardgateway ein:"  
        #Wird benötigt für AD Recovery
        $SafePassword = Read-Host "Geben Sie bitte das Passwort für AD Recovery ein:"  
        
        #Sicherheitsabfrage ob die Eingaben korrekt sind
        $CanStart = "N"  
        $CanStart= Read-Host "Sind Ihre Eingaben korrekt? (J/N)"  
        
        #Wenn korrekt dann beginnt die Ausführung
        if($CanStart -eq "J")  
        {
        
        
        #Netzwerkkarte korrigieren
        
        Write-Host "Netzwerkeinstellungen werde vorgenommen"  
        Write-Host "Primärer Netzwerkadapter wird ermittlet"  
        $PrimaryNetworkAdapter = Get-NetAdapter
        
        Write-Host "Netzwerkeinstellungen werde Netzwerkadapter übergeben"  
        New-NetIPAddress -IPAddress $IPAdresse -InterfaceAlias $PrimaryNetworkAdapter.Name -PrefixLength $IPSubnetmask -DefaultGateway $IPGareway

        Write-Host "DNSeinstellungen werde vorgenommen"  
        Set-DnsClientServerAddress -InterfaceAlias $PrimaryNetworkAdapter.Name -ServerAddresses $IPAdresse
        
        #Computer umbennen
        Write-Host "Computer wird umbenannt"  
        Rename-Computer -ComputerName localhost -NewName $Comuptername
        #Wichtige Werte für den Neustart in der Reg speichern
        Write-Host "Registrierungswerte werden geschrieben"  

        Set-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "Domainname" $Domainname  
        Set-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "TLD" $DomainTLD  
        Set-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "PWD" $SafePassword  
        Set-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "AdminPW" $AdminPW  
        Set-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "IPAdresse" $IPAdresse  
        Set-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "Subnet" $IPSubnetmask  
        Set-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "Gateway" $IPGareway  

        
        #Autologon vorbereiten
        Write-Host "Autologon wird vorbereitet"  
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value "Administrator"  
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value $AdminPW  
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value "1"  
        Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name ForceAutoLogon -Value "1"  
        
        #Logdaten schreiben
        $featureLogPath = "c:\Fameix\featurelog.txt"  
        New-Item $featureLogPath -ItemType file -Force
        
        Write-Host "Benötigte Features werden installiert"  
        $addsTools = "RSAT-AD-Tools"  
        Add-WindowsFeature $addsTools
        Get-WindowsFeature | Where installed >>$featureLogPath
       
       #Computer neu starten
       Write-Host "Computer wird neu gestartet"  
       
       Restart-And-Resume $script "B"  
       }
       else
       {
       Exit
       }
    }
    else
    {
        Write-Host "Ausführung unterbrochen"  
        Exit
    }
	    Restart-And-Resume $script "B"  
}

if (Should-Run-Step "B")   
{


	Write-Host "Daten werden ausgelesen und Features installiert!!! Bitte warten !!! Das Script schreitet automatisch fort!!!!" -ForegroundColor Yellow  
    
    #Benötigte Werte auslesen aus der Reg
    Write-Host "Lese aus: Domainname" -ForegroundColor Yellow  
    $Domainname = Get-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "Domainname"  
    Write-Host "Lese aus: TLD" -ForegroundColor Yellow  
    $DomainTLD = Get-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "TLD"   
    Write-Host "Lese aus: Safepasswort" -ForegroundColor Yellow  
    $SafePassword = Get-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "PWD"   
    Write-Host "Lese aus: AdminPW" -ForegroundColor Yellow  
    $pwd = ConvertTo-SecureString $SafePassword -AsPlaintext -Force
    $AdminPW = Get-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "AdminPW"  
   
    $DomainFQDN = $Domainname + "." + $DomainTLD  
    
    #Benötugte Features installieren
    $featureLogPath = "c:\Fameix\featurelog.txt"  
    Write-Host "Installiere Features" -ForegroundColor Yellow  
    start-job -Name addFeature -ScriptBlock {
    Add-WindowsFeature -Name "ad-domain-services" -IncludeAllSubFeature -IncludeManagementTools  
    Add-WindowsFeature -Name "dns" -IncludeAllSubFeature -IncludeManagementTools  
    Add-WindowsFeature -Name "gpmc" -IncludeAllSubFeature -IncludeManagementTools }  
    Wait-Job -Name addFeature
    Get-WindowsFeature | Where installed >>$featureLogPath
    
    #Benötigte Module laden
    Write-Host "Lade Module ADDSDeployment" -ForegroundColor Yellow  
    Import-Module ADDSDeployment 
    
    #Forst erstellen
    Write-Host "Forest wird erstellt! Bitte warten ..." -ForegroundColor Yellow  
    Install-ADDSForest -CreateDnsDelegation: $false `
        -DatabasePath "C:\Windows\NTDS" `  
        -DomainMode "Win2012" `  
        -DomainName $DomainFQDN `
        -DomainNetbiosName $Domainname `
        -ForestMode "Win2012" `  
        -InstallDns:$true `
        -LogPath "C:\Windows\NTDS" `  
        -NoRebootOnCompletion:$true `
        -SysvolPath "C:\Windows\SYSVOL" `  
        -SafeModeAdministratorPassword $pwd `
        -Force: $true
    #Neustart
   
    #Ausführung beendet
    
    Write-Host "Neustart wird durchgeführt" -ForegroundColor Yellow      
    Restart-And-Resume $script "C"  
}

if (Should-Run-Step "C")   
{
	Write-Host "C"  

    Write-Host "Netzwerkeinstellungen werde vorgenommen"  
        #Primäre Netzwerkkarte ermitteln
        Write-Host "Ermittle Netzwerkadapter" -ForegroundColor Yellow  
        $PrimaryNetworkAdapter = Get-NetAdapter
        
        #Daten aus der Reg auslesen
        Write-Host "Lese aus: IPAdresse" -ForegroundColor Yellow  
        $IPAdresse = Get-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "IPAdresse"  
        Write-Host "Lese aus: Subnetmaske" -ForegroundColor Yellow  
        $IPSubnetmask= Get-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "Subnet"  
        Write-Host "Lese aus: Gateway" -ForegroundColor Yellow  
        $IPGareway = Get-Key "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "Gateway"   
        Write-Host "Lese aus: Domainname" -ForegroundColor Yellow  
        
        
        #DNS EInstellungen berichtigen
        Write-Host "Setze DNS Server neu auf Netzwerkadapter" -ForegroundColor Yellow  
        Set-DnsClientServerAddress -InterfaceAlias $PrimaryNetworkAdapter.Name -ServerAddresses $IPAdresse

        #IPAdresse splitten
        $SplitIP = $IPAdresse.Split(".")  
        $ReverseIP = $SplitIP[2] + "." + $SplitIP[1] + "." + $SplitIP + ".in-addr.arpa"  

        #DNSServer festlegen
        $DNSServer = "localhost"   
        
        #Reversezone festlegen
        Write-Host "Erstelle Reverse Lookup Zone" -ForegroundColor Yellow  
        dnscmd $DNSServer /zoneadd $ReverseIP /DSprimary
        dnscmd /config $ReverseIP /allowupdate 1

        
        #Eintrag setzen
        $DomainRoot = Get-ADDomain
        Write-Host "Erstelle Pointer für DC" -ForegroundColor Yellow  
        dnscmd localhost /RecordAdd $ReverseIP $SplitIP[3] PTR ($env:computername + "." + $DomainRoot.DNSRoot)  
               
               
        #Registry aufräumen
        Write-Host "Lösche aus Registry: Domainname" -ForegroundColor Yellow  
        Remove-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "Domainname"  
        Write-Host "Lösche aus Registry: TLD" -ForegroundColor Yellow  
        Remove-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "TLD"  
        Write-Host "Lösche aus Registry: Passwort" -ForegroundColor Yellow   
        Remove-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "PWD"  
        Write-Host "Lösche aus Registry: Admin Passwort" -ForegroundColor Yellow   
        Remove-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "AdminPW"  
        Write-Host "Lösche aus Registry: IPAdresse" -ForegroundColor Yellow   
        Remove-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "IPAdresse"  
        Write-Host "Lösche aus Registry: Subnetmaske" -ForegroundColor Yellow   
        Remove-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "Subnet"  
        Write-Host "Lösche aus Registry: Gateway" -ForegroundColor Yellow   
        Remove-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion" "Gateway"   
    
    #Autologon beenden
    Write-Host "Beende Auto Login" -ForegroundColor Yellow  
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultUserName -Value "Administrator"  
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name DefaultPassword -Value ""  
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name AutoAdminLogon -Value "0"  
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name ForceAutoLogon -Value "0"  
    
    #Ausführung beendet
    Read-Host "Script erfolgreich ausgeführt.   
               Bitte testen Sie die Einstellungen.
               
               Beliebige Taste zum Beenden"  
    
}

Datei2: functions.ps1 -> Habe ich selber aus dem Internet. Hoffe das macht jetzt keine Probleme oder ist ein Verstoß gegen Regeln. Schreibe heute zum ersten Mal sowas.
Autor: Lasse W und hier findet Ihr den Artikel http://www.codeproject.com/Articles/223002/Reboot-and-Resume-PowerShell ...
# -------------------------------------
# Function Globals
# -------------------------------------
$global:started = $FALSE
$global:startingStep = $Step
$global:restartKey = "Restart-And-Resume"  
$global:RegRunKey ="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"  
$global:powershell = (Join-Path $env:windir "system32\WindowsPowerShell\v1.0\powershell.exe")  


# -------------------------------------
# Collection of Utility functions.
# -------------------------------------
function Should-Run-Step([string] $prospectStep) 
{
	if ($global:startingStep -eq $prospectStep -or $global:started) {
		$global:started = $TRUE
	}
	return $global:started
}

function Wait-For-Keypress([string] $message, [bool] $shouldExit=$FALSE) 
{
	Write-Host "$message" -foregroundcolor yellow  
	$key = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")  
	if ($shouldExit) {
		exit
	}
}

function Test-Key([string] $path, [string] $key)
{
    return ((Test-Path $path) -and ((Get-Key $path $key) -ne $null))   
}

function Remove-Key([string] $path, [string] $key)
{
	Remove-ItemProperty -path $path -name $key
}

function Set-Key([string] $path, [string] $key, [string] $value) 
{
	Set-ItemProperty -path $path -name $key -value $value
}

function Get-Key([string] $path, [string] $key) 
{
	return (Get-ItemProperty $path).$key
}

function Restart-And-Run([string] $key, [string] $run) 
{
	Set-Key $global:RegRunKey $key $run
	Restart-Computer
	exit
} 

function Clear-Any-Restart([string] $key=$global:restartKey) 
{
	if (Test-Key $global:RegRunKey $key) {
		Remove-Key $global:RegRunKey $key
	}
}

function Restart-And-Resume([string] $script, [string] $step) 
{
	Restart-And-Run $global:restartKey "$global:powershell $script -Step $step"  
}

Ich hoffe das ich wem damit helfen kann.

lg

Content-Key: 272323

Url: https://administrator.de/contentid/272323

Ausgedruckt am: 19.03.2024 um 05:03 Uhr

Mitglied: colinardo
colinardo 19.05.2015 aktualisiert um 17:17:21 Uhr
Goto Top
Hallo @Pageman262,
erst einmal vielen Dank für deinen Beitrag.

Folgende Anmerkung:
Datei2: functions.ps1 -> Habe ich selber aus dem Internet. Hoffe das macht jetzt keine Probleme oder ist ein Verstoß gegen Regeln. Schreibe heute zum ersten Mal sowas.
Bei solchen Sachen wenn's geht bitte immer den Urheber bzw. die Quelle(URL) des Quellcodes nennen. Der Functions-Code ist jetzt zwar nicht weltbewegendes, trotzdem solltest du es beherzigen.

Grüße @colinardo
Mitglied: Pageman262
Pageman262 19.05.2015 um 18:36:20 Uhr
Goto Top
Erledigt. Autor und Link hinzugefügt. Danke für den Hinweis.
Mitglied: micmac
micmac 20.05.2015 um 11:30:38 Uhr
Goto Top
Hallo, tolle Sache. Ich denke, dass es in Datei1 Zeile 13 $IPGareway="192.168.1.1" $IPGateway ................ stehen sollte.

Grüsse

mic
Mitglied: micmac
micmac 20.05.2015 um 11:34:58 Uhr
Goto Top
Ähm, sorry, war zu bald dran, ich sehe gerade, Du hast Gareway eh konsequent durchgezogen. face-smile
Mitglied: Pageman262
Pageman262 23.05.2015 um 17:40:49 Uhr
Goto Top
Nachdem jetzt etliche Anfragen gekommen sind. Wenn Ihr wollt das das Skript automatisch den Admin nach dem Reboot anmeldet müsst Ihr auch das Kennwort angeben. Ohne Kennwort kann sich keiner Anmelden auch der PC selber nicht.

Es werden am Ende des Skripts alle Einträge aus der Reg gelöscht somit gibt es auch kein Sicherheitsproblem.

Bitte das zu Beachten.

Danke