If you're on PowerShell 3 or higher, add -Raw to the end of Get-Content. By default, Get-Content returns an array of strings, with one element corresponding to one line. But you want to match against a single string:
$IniRegex = New-Object System.Text.RegularExpressions.Regex("\[[^\]\r\n]+](?:\r?\n(?:[^\[\r\n].*)?)*")
$TestIni = Get-Content "C:\Test.ini" -Raw
$SectionsMatches = $IniRegex.Matches($TestIni)
$SectionsMatches.Count
$SectionsMatches[0].Captures[0].ToString()
$SectionsMatches[1].Captures[0].ToString()
If you're on v2, you can do this instead:
$TestIni = (Get-Content "C:\Test.ini") -join ''
Also, you can shorten the line where you create the regex quite a bit, by using the [regex] type accelerator:
$IniRegex = [regex]"\[[^\]\r\n]+](?:\r?\n(?:[^\[\r\n].*)?)*"