Sql-Server

如何辨識其 host_process_id 指向 sqlserver.exe 的客戶端應用程序

  • September 7, 2018

我正在嘗試辨識使用我支持的 SQL Server 之一的客戶端應用程序(2008 R2)。針對sys.dm_exec_sessions的定期查詢會定期返回其login_name是託管 SQL Server 實例的電腦上的兩個非系統 SQL 身份驗證帳戶之一或單個特定的非系統本地 Windows 帳戶的會話。program_name中的值為“Microsoft SQL Server”;host_name中的值是相關伺服器的名稱;host_process_id中的值指向同一伺服器上的sqlserver.exe程序(通過任務管理器交叉引用)。

我的問題是,什麼機制可以使用與引擎執行檔本身關聯的 host_process_id 來啟動這些會話?我意識到任何應用程序都可以配置 program_name,但我認為 host_process_id 並非如此。SQL 代理作業將從單獨的執行檔連接,sqlcmd 或數據收集實用程序也是如此。據我所知,我們不會將 Service Broker 用於任何使用者應用程序。它可能來自另一個引擎實例作為連結伺服器連接嗎?我覺得我錯過了一些應該很明顯的東西。我怎樣才能找到這個?

有多個 session_id,都大於 50,並且都具有使用者創建的登錄名,而不是“sa”或內部程序通常使用的任何帳戶。會話還針對使用者數據庫中的應用程序表執行查詢。

由於會話使用使用者創建的登錄並訪問使用者數據庫中的應用程序表,並且由於host_process_id與 sqlserver.exe 程序對齊,因此聽起來好像有一個 SQLCLR 程序集執行程式碼。

使用以下查詢在所有數據庫中查找 SQLCLR 程序集:

DECLARE @cmd nvarchar(max);
SET @cmd = '';
SELECT @cmd = @cmd + CASE WHEN @cmd = '' THEN '' ELSE '
UNION ALL
' END + 'SELECT DatabaseName = ''' + QUOTENAME(d.name) + ''', a.*
FROM sys.assemblies a
WHERE a.name <> ''Microsoft.SqlServer.Types''
'
FROM sys.databases d
ORDER BY d.name;
SET @cmd = @cmd + ';'
EXEC sys.sp_executesql @cmd;

當 program_name 值為“Microsoft SQL Server”時,它通常是連結伺服器。

如果您配置了連結回本地伺服器的連結伺服器,它將顯示為“Microsoft SQL Server”,sqlservr.exe 程序 ID 為 host_process_id。

該查詢基本上可以來自連接到 SQL Server 的任何應用程序,然後查詢連結伺服器,該連結伺服器反過來與 sqlservr.exe 的 host_process_id 和“Microsoft SQL Server”的程序名建立新連接。

檢查您的連結伺服器以查看它們是否已配置安全性以使用這些登錄名。如果沒有,那麼您可以使用 SQL 跟踪來跟踪這些登錄的活動,以獲取原始連接詳細資訊以追踪來源。

此外,如果您使用複制並且本地電腦是分發者和發布者或訂閱者,那麼這可能是源(至少是連結伺服器的源),因為複制在設置期間會創建連結伺服器。

引用自:https://dba.stackexchange.com/questions/100676