如何判断我在通过 Windows 身份验证登录时使用了哪个 Windows 组登录名

Cir*_*iao 6 security sql-server t-sql sql-server-2012 logins

我创建了两个对应于两个 Windows 组的 SQL Server 登录名:

MachineName\MyAppAmdin
MachineName\MyAppUser
Run Code Online (Sandbox Code Playgroud)

然后在数据库中,我创建了两个具有相同名称的用户并将它们映射到登录名。

在 Windows 服务器中,我将我的域帐户添加MyDomain\MyAccountMachineName\MyAppAmdin组中。

现在我可以通过 Windows 身份验证通过MyDomain\MyAccount.

问题是,我想确切地知道我正在使用哪个 Windows 组登录,但我不知道如何。

我试过:

ORIGINAL_LOGIN()
SYSTEM_USER
SUSER_SNAME
SELECT * FROM dm_exec_sessions
Run Code Online (Sandbox Code Playgroud)

以上所有内容都会返回MyDomain\MyAccount,但我需要知道的是我是否通过MachineName\MyAppAmdin.

总结一下,我的问题是:

有没有办法准确判断当前连接使用的是哪个 Windows 组登录(或用户)?

或者有什么方法可以检查是否MyDomain\MyAccount与特定用户或登录名相关联?

我知道我可以使用 C# 或命令来解析域帐户是否属于特定的 Windows 组,但是我们有一些新的 IT 策略,所以我正在考虑使用 TSQL 实现类似结果的方法。

sep*_*pic 3

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
Run Code Online (Sandbox Code Playgroud)

如果您想探索login token其他登录名,您应该首先模拟它:

execute as login = 'some_login';

select *
from sys.login_token
where principal_id > 0;

revert;
Run Code Online (Sandbox Code Playgroud)

当然,您应该获得IMPERSONATE许可some_login才能执行impersonate此操作。

因此,您对服务器的权限是根据构成令牌的所有主体的权限“总和”来定义的。DENY与往常一样,GRANT如果您是某个对象上两个成员之一Win groups(其中一个拥有grant另一个)的成员deny,您将被拒绝访问它。