From fbd65e81b670be87c065c6616467c821ad9aecf0 Mon Sep 17 00:00:00 2001 From: Oliver Hahn Date: Fri, 18 Sep 2026 12:52:24 +0200 Subject: [PATCH] UpdatesSeptember01 --- .../labautomation/deploy-lab.ps1 | 6 + .../labautomation/infra/main-shared.bicep | 6 + .../labautomation/infra/main.bicep | 9 ++ .../infra/modules/sql2016-vm.bicep | 8 +- .../infra/modules/sql2022-vm-cse.bicep | 4 + .../infra/modules/sql2022-vm.bicep | 8 +- .../infra/modules/team-vm-cse.bicep | 10 +- .../scripts/Configure-SQLMI-Sysadmins.ps1 | 64 ++++++++ .../scripts/bootstrap-teamvm.ps1 | 12 +- .../labautomation/shared-deploy-lab.ps1 | 142 ++++++++++++++++++ .../walkthrough/challenge-01/solution-01.md | 9 +- 11 files changed, 264 insertions(+), 14 deletions(-) create mode 100644 03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/Configure-SQLMI-Sysadmins.ps1 diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/deploy-lab.ps1 b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/deploy-lab.ps1 index b82705648..80a91e397 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/deploy-lab.ps1 +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/deploy-lab.ps1 @@ -39,6 +39,8 @@ $environmentName = "sqlhack" $sharedResourceGroupName = "rg-sqlhack-shared" $adminUsername = "DemoUser" $adminPassword = New-MhhStablePassword -Purpose 'vm-admin' -SubscriptionId $SubscriptionId -ResourceGroupName "Default" +$sqlMiAdminUsername = "DemoUser" +$sqlMiAdminPassword = New-MhhStablePassword -Purpose 'sqlmi-admin' -SubscriptionId $SubscriptionId -ResourceGroupName "Default" # Template file path $templatePath = Join-Path $scriptPath "infra" @@ -88,6 +90,7 @@ $vmPostfix = $vmPostfix -replace "_", "-" $vmName = "VM-$vmPostfix" $TeamName = $me.ShortName $TeamName = $TeamName.ToUpper() +$SqlMiSysadminUser = $me.UserPrincipalName # feed the effective resource group back to the console #@{"HackboxCredential" = @{ name = "ResourceGroupName" ; value = $effectiveResourceGroup; note = "The name of the resource group where lab resources are deployed" }} @@ -120,6 +123,9 @@ $result = Invoke-MhhDeploymentWithRegionFallback ` vmName = $vmName TeamName = $TeamName legacySQLName = $legacySQLName + sqlMiAdminUsername = $sqlMiAdminUsername + sqlMiAdminPassword = $sqlMiAdminPassword + SqlMiSysadminUser = $SqlMiSysadminUser } Write-Host "[$SubscriptionId] Lab deployment completed successfully" diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main-shared.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main-shared.bicep index e670249bf..fff8c9312 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main-shared.bicep +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main-shared.bicep @@ -101,6 +101,8 @@ module legacySqlVm 'modules/sql2016-vm.bicep' = { vmSize: legacyVmSize adminUsername: adminUsername adminPassword: adminPassword + sqlMiAdminUsername: sqlMiAdminUsername + sqlMiAdminPassword: sqlMiAdminPassword tags: tags } } @@ -116,6 +118,8 @@ module sqlarcSqlVm 'modules/sql2022-vm.bicep' = { vmSize: sqlarcVmSize adminUsername: adminUsername adminPassword: adminPassword + sqlMiAdminUsername: sqlMiAdminUsername + sqlMiAdminPassword: sqlMiAdminPassword tags: tags } } @@ -193,6 +197,8 @@ module sqlarcSqlVm_cse 'modules/sql2022-vm-cse.bicep' = { vmName: 'arcSQL2022' adminUsername: adminUsername adminPassword: adminPassword + sqlMiAdminUsername: sqlMiAdminUsername + sqlMiAdminPassword: sqlMiAdminPassword repoBaseURL: repoBaseURL } } diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main.bicep index 14626fae2..7f0ca31e0 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main.bicep +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/main.bicep @@ -21,6 +21,12 @@ param adminUsername string @secure() param adminPassword string +param sqlMiAdminUsername string +@secure() +param sqlMiAdminPassword string + +param SqlMiSysadminUser string + param teamVmSize string = 'Standard_D2s_v5' param tags object = { @@ -67,6 +73,9 @@ module teamVms_cse 'modules/team-vm-cse.bicep' = { legacySQLName: legacySQLName adminUsername: adminUsername adminPassword: adminPassword + sqlMiAdminUsername: sqlMiAdminUsername + sqlMiAdminPassword: sqlMiAdminPassword + SqlMiSysadminUser: SqlMiSysadminUser } } diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2016-vm.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2016-vm.bicep index 9cd6379cc..7d5c514b8 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2016-vm.bicep +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2016-vm.bicep @@ -4,9 +4,11 @@ param subnetId string param privateIPAddress string param vmSize string param adminUsername string - @secure() param adminPassword string +param sqlMiAdminUsername string +@secure() +param sqlMiAdminPassword string param tags object @@ -119,8 +121,8 @@ resource sqlVirtualMachine 'Microsoft.SqlVirtualMachine/sqlVirtualMachines@2023- connectivityType: 'PRIVATE' port: 1433 - sqlAuthUpdateUserName: adminUsername - sqlAuthUpdatePassword: adminPassword + sqlAuthUpdateUserName: sqlMiAdminUsername + sqlAuthUpdatePassword: sqlMiAdminPassword } } } diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm-cse.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm-cse.bicep index 97fc162fe..2ac5b9e24 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm-cse.bicep +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm-cse.bicep @@ -6,6 +6,10 @@ param adminUsername string @secure() param adminPassword string +param sqlMiAdminUsername string +@secure() +param sqlMiAdminPassword string + var ConfigureSQLMachineCommand = 'powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "bootstrap-newsql.ps1" -BackupUri "https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak" -adminUsername ${adminUsername} -adminPassword ${adminPassword}' resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-11-01' existing = { diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm.bicep index af35d1ddf..fe1fbfee2 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm.bicep +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/sql2022-vm.bicep @@ -4,9 +4,11 @@ param subnetId string param privateIPAddress string param vmSize string param adminUsername string - @secure() param adminPassword string +param sqlMiAdminUsername string +@secure() +param sqlMiAdminPassword string param tags object @@ -115,8 +117,8 @@ resource sqlVirtualMachine 'Microsoft.SqlVirtualMachine/sqlVirtualMachines@2023- connectivityType: 'PRIVATE' port: 1433 - sqlAuthUpdateUserName: adminUsername - sqlAuthUpdatePassword: adminPassword + sqlAuthUpdateUserName: sqlMiAdminUsername + sqlAuthUpdatePassword: sqlMiAdminPassword } } } diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/team-vm-cse.bicep b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/team-vm-cse.bicep index 0f5b85714..565ef49d8 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/team-vm-cse.bicep +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/infra/modules/team-vm-cse.bicep @@ -9,8 +9,15 @@ param adminUsername string @secure() param adminPassword string +param sqlMiAdminUsername string +@secure() +param sqlMiAdminPassword string + +param SqlMiSysadminUser string + + //var ConfigureTeamVMCommand = 'powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "bootstrap-teamvm.ps1" -SamplesBaseUri "${repoBaseURL}/TSQL_Scripts" -WallpaperUri "${repoBaseURL}/assets/BaseWallpaper.jpg" -TeamNumber ##teamNumber##' -var ConfigureTeamVMCommand = 'powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "bootstrap-teamvm.ps1" -SamplesBaseUri "${repoBaseURL}/TSQL_Scripts" -WallpaperUri "${repoBaseURL}/assets/BaseWallpaper.jpg" -TeamName ${TeamName} -LabsBaseUri "${repoBaseURL}/LABS" -ManagedInstanceServer "${managedInstanceServer}" -StorageAccountName "${storageAccountName}" -BackupBaseUri "${repoBaseURL}/Databases" -ServerInstance "${legacySQLName}" -adminUsername "${adminUsername}" -adminPassword "${adminPassword}"' +var ConfigureTeamVMCommand = 'powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "bootstrap-teamvm.ps1" -SamplesBaseUri "${repoBaseURL}/TSQL_Scripts" -WallpaperUri "${repoBaseURL}/assets/BaseWallpaper.jpg" -TeamName ${TeamName} -LabsBaseUri "${repoBaseURL}/LABS" -ManagedInstanceServer "${managedInstanceServer}" -StorageAccountName "${storageAccountName}" -BackupBaseUri "${repoBaseURL}/Databases" -ServerInstance "${legacySQLName}" -adminUsername "${adminUsername}" -adminPassword "${adminPassword}" -sqlMiAdminUsername "${sqlMiAdminUsername}" -sqlMiAdminPassword "${sqlMiAdminPassword}" -SqlMiSysadminUser "${SqlMiSysadminUser}"' resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-11-01' existing = { name: vmName } @@ -34,6 +41,7 @@ resource ConfigureTeamMachine 'Microsoft.Compute/virtualMachines/extensions@2024 '${repoBaseURL}/scripts/Configure-Teams-Shortcuts.ps1' '${repoBaseURL}/scripts/Restore-TeamDatabases.ps1' '${repoBaseURL}/scripts/Configure-legacySQL-DB.ps1' + '${repoBaseURL}/scripts/Configure-SQLMI-Sysadmins.ps1' '${repoBaseURL}/scripts/Download-Labs.ps1' '${repoBaseURL}/scripts/Configure-TeamWallpaper.ps1' ] diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/Configure-SQLMI-Sysadmins.ps1 b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/Configure-SQLMI-Sysadmins.ps1 new file mode 100644 index 000000000..2f3fed987 --- /dev/null +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/Configure-SQLMI-Sysadmins.ps1 @@ -0,0 +1,64 @@ +param( + [Parameter(Mandatory)] + [string]$ManagedInstanceServer, + + [Parameter(Mandatory)] + [string] $sqlusername, + + [Parameter(Mandatory)] + [string] $sqlpassword, + + [Parameter(Mandatory)] + [string] $sqlMiSysadminUser +) + +$ErrorActionPreference = 'Stop' + +$logPath = 'C:\Windows\Temp\Configure-SQLMI-Sysadmins.log' +Start-Transcript -Path $logPath -Append + +Write-Host 'Configuring SQL Managed Instance Sysadmins...' + +$ConfigureSql = @" +IF NOT EXISTS (SELECT 1 FROM sys.server_principals WHERE name = N'$sqlMiSysadminUser') +BEGIN + CREATE LOGIN [$sqlMiSysadminUser] FROM EXTERNAL PROVIDER; +END +ALTER SERVER ROLE [sysadmin] ADD MEMBER [$sqlMiSysadminUser]; +"@ + +[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null +[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null + +$connectionString = "Data Source=$ManagedInstanceServer;Initial Catalog=master;TrustServerCertificate=True;" +$Connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) +[System.Security.SecureString]$SQLPwd = $sqlpassword | ConvertTo-SecureString -AsPlainText -Force +$SQLPwd.MakeReadOnly() +$cred = New-Object System.Data.SqlClient.SqlCredential($sqlusername,$SQLPwd) +$Connection.credential = $cred + +# 5. SMO-Serververbindung initialisieren +$serverConnection = New-Object Microsoft.SqlServer.Management.Common.ServerConnection($Connection) +$server = New-Object Microsoft.SqlServer.Management.Smo.Server($serverConnection) + +try { + # Ausführung des Skripts inkl. GO-Trenner + [void]$server.ConnectionContext.ExecuteNonQuery($ConfigureSql) + #Write-Host "Skript erfolgreich auf SQL MI ausgeführt." -ForegroundColor Green +} +catch { + $ErrorString = $_ | format-list -force | Out-String + Write-Error "ERR: $ErrorString" +} +finally { + if ($null -ne $serverConnection -and $serverConnection.IsOpen) { + $serverConnection.Disconnect() + } +} +try { + $Connection.Close() +} +catch { +} + +Stop-Transcript \ No newline at end of file diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/bootstrap-teamvm.ps1 b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/bootstrap-teamvm.ps1 index 8c1db7b83..7dbc860f6 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/bootstrap-teamvm.ps1 +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/scripts/bootstrap-teamvm.ps1 @@ -4,11 +4,14 @@ param( [string]$BackupBaseUri, [string]$adminUsername, [string]$adminPassword, + [string]$sqlMiAdminUsername, + [string]$sqlMiAdminPassword, [string]$WallpaperUri, [string]$TeamName, [string]$ManagedInstanceServer, [string]$StorageAccountName, - [string]$ServerInstance + [string]$ServerInstance, + [string]$SqlMiSysadminUser ) $ErrorActionPreference = 'Stop' @@ -23,10 +26,13 @@ Write-Host "Configure Team Wallpaper..." & .\Configure-TeamWallpaper.ps1 -WallpaperUri $WallpaperUri -TeamName $TeamName Write-Host "Restoring Team Databases..." -& .\Restore-TeamDatabases.ps1 -TeamName $TeamName -BackupBaseUri $BackupBaseUri -sqlusername $adminUsername -sqlpassword $adminPassword -ServerInstance $ServerInstance +& .\Restore-TeamDatabases.ps1 -TeamName $TeamName -BackupBaseUri $BackupBaseUri -sqlusername $sqlMiAdminUsername -sqlpassword $sqlMiAdminPassword -ServerInstance $ServerInstance Write-Host "Configuring Team Databases..." -& .\Configure-legacySQL-DB.ps1 -TeamName $TeamName -sqlusername $adminUsername -sqlpassword $adminPassword -ServerInstance $ServerInstance +& .\Configure-legacySQL-DB.ps1 -TeamName $TeamName -sqlusername $sqlMiAdminUsername -sqlpassword $sqlMiAdminPassword -ServerInstance $ServerInstance + +Write-Host "Configuring SQL MI Sysadmins..." +& .\Configure-SQLMI-Sysadmins.ps1 -ManagedInstanceServer $ManagedInstanceServer -sqlusername $sqlMiAdminUsername -sqlpassword $sqlMiAdminPassword -sqlMiSysadminUser $SqlMiSysadminUser Write-Host "Installing Team Tools..." & .\install-team-tools.ps1 diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/shared-deploy-lab.ps1 b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/shared-deploy-lab.ps1 index e5324b91c..ef2ee228e 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/shared-deploy-lab.ps1 +++ b/03-Azure/01-02 Data/02-SQL_Modernization/labautomation/shared-deploy-lab.ps1 @@ -240,6 +240,148 @@ if (-not $found) throw "Expected Entra ID Admin was not configured within 2 minutes." } +#Adding Sysadmin role to the Entra ID Admin on the SQLMI +# SQL MI connection details +$server = $managedInstanceFQDN +$database = "master" +$username = $sqlMiAdminUsername +$password = $sqlMiAdminPassword + +# Entra ID users/groups to add +$principals = Get-MhhLabUser -UserId @($AllowedEntraUserIds) | Where-Object { $_.ShortName.ToLower() -match "labuser-[0-9]{4}"} | Select-Object -ExpandProperty UserPrincipalName + +# Connection string +$connectionString = @" +Server=tcp:$server; +Initial Catalog=$database; +User ID=$username; +Password=$password; +Encrypt=True; +TrustServerCertificate=False; +Connection Timeout=30; +"@ + +# Load SqlClient +Add-Type -AssemblyName System.Data + +$conn = New-Object System.Data.SqlClient.SqlConnection($connectionString) + +try { + $conn.Open() + + foreach ($principal in $principals) { + + Write-Host "Processing $principal ..." + + # + # Check whether login exists + # + $cmd = $conn.CreateCommand() + $cmd.CommandText = @" + SELECT COUNT(*) + FROM sys.server_principals + WHERE name = @name; +"@ + + $null = $cmd.Parameters.Add( + "@name", + [System.Data.SqlDbType]::NVarChar, + 256 + ) + + $cmd.Parameters["@name"].Value = $principal + + $exists = [int]$cmd.ExecuteScalar() + + if ($exists -eq 0) { + + Write-Host " Creating Entra login" + + # Object names cannot be parameterised, therefore QUOTENAME() + $createCmd = $conn.CreateCommand() + $createCmd.CommandText = @" + DECLARE @sql nvarchar(max); + + SET @sql = + N'CREATE LOGIN ' + + QUOTENAME(@name) + + N' FROM EXTERNAL PROVIDER'; + + EXEC (@sql); +"@ + + $null = $createCmd.Parameters.Add( + "@name", + [System.Data.SqlDbType]::NVarChar, + 256 + ) + + $createCmd.Parameters["@name"].Value = $principal + + $createCmd.ExecuteNonQuery() | Out-Null + } + + # + # Add to sysadmin if not already a member + # + $roleCheck = $conn.CreateCommand() + $roleCheck.CommandText = @" + SELECT COUNT(*) + FROM sys.server_role_members rm + JOIN sys.server_principals r + ON rm.role_principal_id = r.principal_id + JOIN sys.server_principals p + ON rm.member_principal_id = p.principal_id + WHERE r.name = N'sysadmin' + AND p.name = @name; +"@ + + $null = $roleCheck.Parameters.Add( + "@name", + [System.Data.SqlDbType]::NVarChar, + 256 + ) + + $roleCheck.Parameters["@name"].Value = $principal + + $isSysAdmin = [int]$roleCheck.ExecuteScalar() + + if ($isSysAdmin -eq 0) { + + Write-Host " Adding to sysadmin" + + $roleCmd = $conn.CreateCommand() + $roleCmd.CommandText = @" + DECLARE @sql nvarchar(max); + + SET @sql = + N'ALTER SERVER ROLE [sysadmin] ADD MEMBER ' + + QUOTENAME(@name); + + EXEC (@sql); +"@ + + $null = $roleCmd.Parameters.Add( + "@name", + [System.Data.SqlDbType]::NVarChar, + 256 + ) + + $roleCmd.Parameters["@name"].Value = $principal + + $roleCmd.ExecuteNonQuery() | Out-Null + } + else { + Write-Host " Already sysadmin" + } + } +} +finally { + if ($conn.State -eq 'Open') { + $conn.Close() + } +} + $rg = Get-AzResourceGroup -Name $sharedResourceGroup -ErrorAction SilentlyContinue $tags = $rg.Tags $tags["microhack-shared-deployment"] = "Succeeded" diff --git a/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md index ad47070f4..29a03f56e 100644 --- a/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md +++ b/03-Azure/01-02 Data/02-SQL_Modernization/walkthrough/challenge-01/solution-01.md @@ -24,6 +24,7 @@ ![generated](../../Images/MigrationArchitecturev2.png) + # Generic Migration Content | **Narrative** | **Notes** | @@ -33,13 +34,13 @@ # Connect to your Win11 VM |**Narrative**| **Screenshot**| **Notes**| |:------------|:--------------|:---------| -|The instructors will share URLs to connect to your Win11 VM. Credentials will be provided during the Hack.|![Bastion Logon](<../../Images/Bastion-VM11.png>)| | +|Connect to the Azure Portal with and password . In the Azure Portal open your Win11 VM . Connect to the VM with Bastion with the following VM connection credentials Username and password . Please make sure to select the correct keyboard layout.|![Bastion Logon](../../Images/Bastion-VM11.png)| | |**Narrative**| **Screenshot**| **Notes**| |:------------|:--------------|:---------| -| On the Win11 VM you will find a shortcurt for SQL Server Management Studio (SSMS) and a readme.txt that comtains the information about the lab environment | ![Shortcuts](<../../Images/shortcuts.png>) +| On the Win11 VM you will find a shortcurt for SQL Server Management Studio (SSMS).| ![Shortcuts](../../Images/shortcuts.png) # Assess the application databases for Azure SQL suitability using the SQL Server Management Studio (SSMS) @@ -47,8 +48,8 @@ In this section we will use the SQL Server Management Studio to assess the SQL S |**Narrative**| **Screenshot**| **Notes**| |:------------|:--------------|:---------| -|We need to determine the suitability of the database(s) for migration to Azure. This includes checking for compatibility and feature support with Azure Database. You should already have a remote (Bastion) session open to your teams Win11 Management VM**,** if so run SSMS from the Start menus or Desktop icon.|![SQL Server Management Studio](<../../Images/SSMS start menu.png>)|SQL Server Management Studio (SSMS) is a free download from Microsoft. Since SSMS 22.5 it supports the assessment and migration of SQL Server databases to Azure SQL.| -|Connect to legacySQL2016 by using Wndows Authentivation. Please check the Trust Server Certifcate checkbox||| +|We need to determine the suitability of the database(s) for migration to Azure. This includes checking for compatibility and feature support with Azure Database. You should already have a remote (Bastion) session open to your teams Win11 Management VM**,** if so run SSMS from the Start menus or Desktop icon.|![SQL Server Management Studio](../../Images/SSMS%20start%20menu.png)|SQL Server Management Studio (SSMS) is a free download from Microsoft. Since SSMS 22.5 it supports the assessment and migration of SQL Server databases to Azure SQL.| +|Connect to legacySQL2016 by using Windows Authentication. Please check the Trust Server Certifcate checkbox||| |From the context menu of the SQL Server instance select Migrate SQL Server|![Migrate SQL Server](../../Images/Migrate%20SQL%20Server.png)|If the context menu is not visible the Hybrid and Migration workload was not installed with SSMS | |This opens the main screen for the migration experience|![Migrate SQL Server](../../Images/Migrate%20Screen.png)|| |Click **Run Readiness Assessment**|![](../../Images/Run%20Readiness%20Assessment.png)|The assessment will take some seconds to minutes depending on the number of databases and the amount of database objects.|