Skip to content

Commit eddfeee

Browse files
Find-DbaInstance - Fix TcpConnected false for default instances (#10327)
1 parent b09063a commit eddfeee

1 file changed

Lines changed: 31 additions & 8 deletions

File tree

public/Find-DbaInstance.ps1

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ function Find-DbaInstance {
293293
$null = $computersScanned.Add($computer.ComputerName)
294294
}
295295
Write-ProgressHelper -Activity "Processing: $($computer)" -StepNumber ($stepCounter++) -Message "Starting"
296-
Write-Message -Level Verbose -Message "Processing: $($computer)" -Target $computer -FunctionName Find-DbaInstance
296+
Write-Message -Level Verbose -Message "Processing: $($computer)"
297297

298298
#region Null variables to prevent scope lookup on conditional existence
299299
$resolution = $null
@@ -350,11 +350,23 @@ function Find-DbaInstance {
350350
try {
351351
Write-ProgressHelper -Activity "Processing: $($computer)" -StepNumber ($stepCounter++) -Message "Probing Browser service"
352352
$browseResult = Get-SQLInstanceBrowserUDP -ComputerName $computer -EnableException
353-
$ports = $browseResult.TCPPort | Test-TcpPort -ComputerName $computer
353+
Write-Message -Level Verbose -Message "Browser returned $($browseResult.Count) instance(s): $(($browseResult | ForEach-Object { "$($_.InstanceName):$($_.TCPPort)" }) -join ', ')"
354+
# Filter port 0 - Browser returns 0 for instances that don't report a TCP port (default instances)
355+
$ports = $browseResult.TCPPort | Where-Object { $_ -gt 0 } | Test-TcpPort -ComputerName $computer
356+
Write-Message -Level Verbose -Message "Port test results from Browser: $(($ports | ForEach-Object { "Port $($_.Port)=$($_.IsOpen)" }) -join ', ')"
354357
} catch {
358+
Write-Message -Level Verbose -Message "Browser scan failed: $_"
355359
# here to avoid an empty catch
356360
$null = 1
357361
}
362+
# Fall back to default port testing if Browser returned no port info
363+
# (e.g. SQL Server 2022+ where Browser is deprecated, or default instances
364+
# which don't report a TCP port via Browser UDP)
365+
if (-not $ports) {
366+
Write-Message -Level Verbose -Message "No port info from Browser, falling back to default ports: $($TCPPort -join ', ')"
367+
$ports = $TCPPort | Test-TcpPort -ComputerName $computer
368+
Write-Message -Level Verbose -Message "Fallback port test results: $(($ports | ForEach-Object { "Port $($_.Port)=$($_.IsOpen)" }) -join ', ')"
369+
}
358370
} else {
359371
$ports = $TCPPort | Test-TcpPort -ComputerName $computer
360372
}
@@ -413,10 +425,10 @@ function Find-DbaInstance {
413425
Ping = $pingReply.Status -like 'Success'
414426
}
415427
} else {
416-
Write-Message -Level Verbose -Message "Computer $computer could be contacted, but no trace of an SQL Instance was found. Skipping..." -Target $computer -FunctionName Find-DbaInstance
428+
Write-Message -Level Verbose -Message "Computer $computer could be contacted, but no trace of an SQL Instance was found. Skipping..."
417429
}
418430
} else {
419-
Write-Message -Level Verbose -Message "Computer $computer could not be contacted, skipping." -Target $computer -FunctionName Find-DbaInstance
431+
Write-Message -Level Verbose -Message "Computer $computer could not be contacted, skipping."
420432
}
421433

422434
continue
@@ -427,6 +439,7 @@ function Find-DbaInstance {
427439

428440
#region Case: Named instance found
429441
foreach ($instance in $instanceNames) {
442+
Write-Message -Level Verbose -Message "Processing named instance: $instance"
430443
$object = New-Object Dataplat.Dbatools.Discovery.DbaInstanceReport
431444
$object.MachineName = $computer.ComputerName
432445
$object.ComputerName = $computer.ComputerName
@@ -449,9 +462,20 @@ function Find-DbaInstance {
449462
$object.Confidence = 'Medium'
450463
if ($object.BrowseReply.TCPPort) {
451464
$object.Port = $object.BrowseReply.TCPPort
465+
Write-Message -Level Verbose -Message "Browser reported TCPPort $($object.Port), checking PortsScanned: $(($object.PortsScanned | ForEach-Object { "Port $($_.Port)=$($_.IsOpen)" }) -join ', ')"
452466

453467
$object.PortsScanned | Where-Object Port -EQ $object.Port | ForEach-Object {
454468
$object.TcpConnected = $_.IsOpen
469+
Write-Message -Level Verbose -Message "Port $($_.Port) IsOpen=$($_.IsOpen), TcpConnected set to $($object.TcpConnected)"
470+
}
471+
} else {
472+
# Default instance - Browser doesn't report a specific TCP port,
473+
# check if any of the fallback ports we tested is open
474+
Write-Message -Level Verbose -Message "Browser has no TCPPort (default instance), checking PortsScanned for any open port: $(($object.PortsScanned | ForEach-Object { "Port $($_.Port)=$($_.IsOpen)" }) -join ', ')"
475+
$object.PortsScanned | Where-Object IsOpen | Select-Object -First 1 | ForEach-Object {
476+
$object.Port = $_.Port
477+
$object.TcpConnected = $true
478+
Write-Message -Level Verbose -Message "Found open port $($_.Port), TcpConnected set to True"
455479
}
456480
}
457481
}
@@ -801,21 +825,20 @@ function Find-DbaInstance {
801825
[Parameter(ValueFromPipeline)][int[]]$Port
802826
)
803827

804-
begin {
805-
$client = New-Object Net.Sockets.TcpClient
806-
}
807828
process {
808829
foreach ($item in $Port) {
830+
$client = New-Object Net.Sockets.TcpClient
809831
try {
810832
$client.Connect($ComputerName.ComputerName, $item)
811833
if ($client.Connected) {
812-
$client.Close()
813834
New-Object -TypeName Dataplat.Dbatools.Discovery.DbaPortReport -ArgumentList $ComputerName.ComputerName, $item, $true
814835
} else {
815836
New-Object -TypeName Dataplat.Dbatools.Discovery.DbaPortReport -ArgumentList $ComputerName.ComputerName, $item, $false
816837
}
817838
} catch {
818839
New-Object -TypeName Dataplat.Dbatools.Discovery.DbaPortReport -ArgumentList $ComputerName.ComputerName, $item, $false
840+
} finally {
841+
$client.Dispose()
819842
}
820843
}
821844
}

0 commit comments

Comments
 (0)