New-NAVEnvironment.ps1

function New-NAVEnvironment {
    [CmdletBinding()]
    param(
        [String]$ServerInstance,
        [String]$DatabaseServer='.',
        [String]$DatabaseInstance='',
        [String]$Databasename='',
        [String]$BackupFile,
        [switch]$EnablePortSharing,
        [Switch]$StartWindowsClient,
        [String]$LicenseFile,
        [int]$ManagementServicesPort=7045,
        [int]$ClientServicesPort=7046,
        [Switch]$CreateWebServerInstance
    )

    if ([String]::IsNullOrEmpty($Databasename)){
        $Databasename = $ServerInstance
    }
    
    $ServerInstanceExists = Get-NAVServerInstance -ServerInstance $ServerInstance
    if ($ServerInstanceExists) {
        Write-Error "Server Instance $ServerInstance already exists!"
        break
    }

    write-Host -ForegroundColor Green "Restoring Backup $BackupFile to $Databasename"
    Restore-SQLBackupFile -BackupFile $BackupFile -DatabaseServer $DatabaseServer -DatabaseInstance $DatabaseInstance -DatabaseName $Databasename -ErrorAction Stop -TimeOut 0

    write-Host -ForegroundColor Green "Creating ServerInstance $ServerInstance"
    $Object = New-NAVServerInstance `
            -ServerInstance $ServerInstance `
            -DatabaseServer $DatabaseServer `
            -DatabaseInstance $DatabaseInstance `
            -ManagementServicesPort $ManagementServicesPort `
            -ClientServicesPort $ClientServicesPort `
            -DatabaseName $Databasename          

    $ServerInstanceObject = Get-NAVServerInstance4 -ServerInstance $ServerInstance
    write-Host -ForegroundColor Green "Make ServiceAccount $($ServerInstanceObject.ServiceAccount) DBOwner"
    <#$SQLCommand =
        "IF NOT EXISTS(SELECT name FROM sys.server_principals WHERE name = '$($ServerInstanceObject.ServiceAccount)')
            BEGIN
                CREATE USER [$($ServerInstanceObject.ServiceAccount)] FOR LOGIN [$($ServerInstanceObject.ServiceAccount)]
            END"#>

    try{
        $SQLCommand = "CREATE USER [$($ServerInstanceObject.ServiceAccount)] FOR LOGIN [$($ServerInstanceObject.ServiceAccount)]"        
        Invoke-SQL `
            -DatabaseServer $ServerInstanceObject.DatabaseServer `
            -DatabaseInstance $ServerInstanceObject.DatabaseInstance `
            -DatabaseName $ServerInstanceObject.DatabaseName `
            -SQLCommand $SQLCommand `
            -ErrorAction SilentlyContinue
    }
    catch{
        Write-Warning "Error when creating user $($ServerInstanceObject.ServiceAccount): $($Error[0])"
    }
    try{
       Invoke-SQL `
            -DatabaseServer $ServerInstanceObject.DatabaseServer `
            -DatabaseInstance $ServerInstanceObject.DatabaseInstance `
            -DatabaseName $ServerInstanceObject.DatabaseName `
            -SQLCommand "ALTER ROLE [db_owner] ADD MEMBER [$($ServerInstanceObject.ServiceAccount)]" `
            -ErrorAction SilentlyContinue
    }
    catch{
        Write-Warning "Error when altering user $($ServerInstanceObject.ServiceAccount): $($Error[0])"
    }
         
    $null = Set-NAVServerInstance -Start -ServerInstance $ServerInstance
    if($CreateWebServerInstance){
        Write-Host -ForegroundColor Green -Object "Create WebServerInstance '$ServerInstance'"
        New-NAVWebServerInstance `
            -ClientServicesPort $ClientServicesPort `
            -Server localhost `
            -ServerInstance $ServerInstance `
            -WebServerInstance $ServerInstance `
            -Force
    }
    if($LicenseFile){  
        Write-Host -ForegroundColor Green -Object 'Importing license..'
        $null = $ServerInstanceObject | Import-NAVServerLicense -LicenseFile $LicenseFile -Database NavDatabase -Force -WarningAction SilentlyContinue
    }
            
    if ($EnablePortSharing) {
        Enable-NAVServerInstancePortSharing -ServerInstance $ServerInstance
    }
    
    if ($StartWindowsClient) {
        Start-NAVWindowsClient `
            -Port $ServerInstanceObject.ClientServicesPort `
            -ServerInstance $ServerInstanceObject.ServerInstance `
            -ServerName ([net.dns]::gethostname())
    }

    $Object 
}