Вот как я обработал запутывание, полученное как выход с приличным форматированием.
foreach($DB in $DBs)
{
$Orphan_query = @"
select p.name,p.sid
from $DB.sys.database_principals p
where p.type in ('G','S','U')
and p.sid not in (select sid from sys.server_principals)
and p.name not in (
'dbo',
'guest',
'INFORMATION_SCHEMA',
'sys',
'MS_DataCollectorInternalUser'
) ;
"@
$command = $connection.CreateCommand()
$command.CommandText = $Orphan_query
$result = $command.ExecuteReader()
$object= New-Object System.Data.DataTable
$object.Load($result)
If($object)
{
"Database Name : $DB"
"USER :: SID"
[System.Array]$Actual_sid = ($object.sid | Format-Hex -ErrorAction Ignore | Select-String '00000')
[System.Array]$names = $object.name
If($Actual_sid.Length -match $names.Length)
{
For($i=0;$i -lt $Actual_sid.Length; $i++)
{
"$($names[$i]) :: $("0x"+$Actual_sid[$i].ToString().Substring(11,47).replace(' ','') )"
}
}
}
}
Вывод теперь выглядит так
Database Name : soxmon
USER :: SID
test :: 0x9F8857FB265BB64BA962D468C3D0A450
L1test :: 0xD95D5C3B201FE846B4C61A175F4ACC32
L1Login :: 0x0488468E6AEE14428B6BF7528CA01EA3
, что в точности соответствует выводу sql.Таким образом, автоматическое двоичное преобразование стало причиной проблемы в действительности.