Sql-Server

通過 windows 身份驗證登錄時如何判斷我使用了哪個 windows 組登錄

  • December 20, 2018

我創建了兩個對應於兩個 Windows 組的 SQL Server 登錄名:

MachineName\MyAppAmdin
MachineName\MyAppUser

然後在數據庫中,我創建了兩個具有相同名稱的使用者並將它們映射到登錄名。

在 windows 伺服器中,我將我的域帳戶添加MyDomain\MyAccountMachineName\MyAppAmdin組中。

現在我可以通過MyDomain\MyAccount.

問題是,我想確切地知道我正在使用哪個 Windows 組登錄,但我不知道如何。

我試過:

ORIGINAL_LOGIN()
SYSTEM_USER
SUSER_SNAME
SELECT * FROM dm_exec_sessions

以上所有返回MyDomain\MyAccount,但我需要知道的是我是否通過組成員身份登錄MachineName\MyAppAmdin

總結一下,我的問題是:

有沒有辦法準確判斷目前連接正在使用哪個 Windows 組登錄(或使用者)?

或者有什麼方法可以檢查是否MyDomain\MyAccount與特定使用者或登錄相關聯?

我知道如果域帳戶屬於特定的 Windows 組,我可以使用 C# 或命令來解析,但是我們有一些新的 IT 策略,所以我正在考慮使用 TSQL 實現類似結果的方法。

Windows Authenticationtoken-based身份驗證,您可以在tokens此處閱讀訪問令牌和此處基於令牌的身份驗證

基於令牌的身份驗證系統背後的一般概念很簡單。允許使用者輸入他們的使用者名和密碼以獲得允許他們獲取特定資源的令牌 - 無需使用他們的使用者名和密碼。


當使用者登錄系統並且使用者提供的憑據通過身份驗證數據庫進行身份驗證時,登錄服務會生成訪問令牌。身份驗證數據庫包含構造登錄會話的初始令牌所需的憑據資訊,包括其使用者 ID、主要組 ID、它所屬的所有其他組以及其他資訊。令牌附加到使用者會話中創建的初始程序,並由初始程序創建的後續程序繼承。

因此,當您用於Windows Authentication登錄時,您將向伺服器展示您的Windows token.

login token您可以使用以下程式碼查看屬於您的所有伺服器主體:

select *
from sys.login_token
--where principal_id > 0; -- uncomment here to see only mapped principals

如果你想探索login token另一個登錄,你應該首先模擬它:

execute as login = 'some_login';

select *
from sys.login_token
where principal_id > 0;

revert;

當然,您應該獲得IMPERSONATE許可some_login才能使用impersonate它。

因此,您對伺服器的權限是根據構成您的令牌的所有主體的權限的“總和”定義的。DENY一如既往地具有優先權,GRANT因此,如果您是某個對像上的兩個Win groupswichgrant和另一個的成員deny,您將被拒絕訪問它。

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