Можно ли получить имена компьютеров, подключенных к базе данных MS SQL?

С помощью следующего кода вы выводите список всех пользователей, которые подключены к определенной БД

[System.Reflection.Assembly]::LoadWithPartialName(‘Microsoft.SqlServer.SMO’) | out-null
$Sql = New-Object (‘Microsoft.SqlServer.Management.Smo.Server’) “DEVSQL”
$DB = $Sql.Databases.Item("TestDB")
$DB.Users

Есть ли способ получить имена компьютеров, к которым подключены пользователи? Что-то вроде запроса ниже.

select distinct hostname, loginame, db_name(dbid)
from master..sysprocesses 
where db_name(dbid) = 'TestDB'

2 ответа

Решение

Во-первых, опубликованный вами код PowerShell возвращает ВСЕХ пользователей базы данных, а не только тех, кто в данный момент подключен.

Чтобы получить информацию о хосте и логине для текущих процессов, используйте этот код:

[System.Reflection.Assembly]::LoadWithPartialName(‘Microsoft.SqlServer.SMO’) | out-null
$Sql = New-Object (‘Microsoft.SqlServer.Management.Smo.Server’) “DEVSQL”
$sql.EnumProcesses() | Where_Object {$_.Database -eq "TestDB"} | Select host,login

Обычно я бы предложил sp_who2 но его вывод не работает с PowerShell. Тем не мение, sp_who будут.

invoke-sqlcmd -server $SERVERNAME -query "exec sp_who"|format-table -autosize

Или если вы хотите только имена хостов

invoke-sqlcmd -server $SERVERNAME -query "exec sp_who"|select-object -property hostname -unique | format-table -autosize;

Если у вас нет SQLPS модуль доступен, подставьте в соответствующие методы ADO.NET.

Другие вопросы по тегам