Обработка Powershell Format-Hex для идентификатора пользователя в mssql - PullRequest
0 голосов
/ 09 апреля 2019

Мой код захватывает вывод из таблицы SQL, выполнив sp_change_users_login 'report'

Он возвращает две вещи - а) имя пользователя и б) usersid

UserSId идет в двоичном виде с запятыми, поэтому я использую Format-Hex, чтобы получить исходный SID пользователя. Но с этим обращением оно возвращает и другие вещи. Я хочу справиться с этим. Ниже картинка с выводом.

PS ВЫХОД:

Output Coming in PS

Вывод SQL

SQL Output

Как мне справиться с этим и получить только тот же вывод, что и в mssql?

Мой кусок кода:

   if($DBs -is [System.Array])
        {
            foreach($DB in $DBs)
            {
            $DB
            $connection.ChangeDatabase($DB)
            $connection.ChangeDatabase('DBName') ## Currently hardcoded.In actual, it will iterate.
              $orphan_users_query = @"
                sp_change_users_login 'report'

"@
        $command = $connection.CreateCommand()
        $command.CommandText = $orphan_users_query
        $result = $command.ExecuteReader()
        $object_orphan= New-Object System.Data.DataTable
        $object_orphan.Load($result)
        $object_orphan.UserSID | Format-Hex -Raw #| Out-File C:\temp\outfile_property1.txt -Append -Force
            }
        }

1 Ответ

0 голосов
/ 24 апреля 2019

Вот как я обработал запутывание, полученное как выход с приличным форматированием.

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.Таким образом, автоматическое двоичное преобразование стало причиной проблемы в действительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...