Bit*_*ter 3 sql-server permissions sql-server-2014
我正在尝试获取与由我的数据库中的登录名表示的 AD 组关联的用户列表。我从我的研究中了解到,最好的方法是使用以下代码:
{
Server srv = new Server();
//Iterate through each database and display.
foreach ( Database db in srv.Databases) {
Console.WriteLine("========");
Console.WriteLine("Login Mappings for the database: " + db.Name);
Console.WriteLine(" ");
//Run the EnumLoginMappings method and return details of database user-login mappings to a DataTable object variable.
DataTable d;
d = db.EnumLoginMappings();
//Display the mapping information.
foreach (DataRow r in d.Rows) {
foreach (DataColumn c in r.Table.Columns) {
Console.WriteLine(c.ColumnName + " = " + r[c]);
}
Console.WriteLine(" ");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?另外,这段代码是用 C# 编写的,我如何才能在我的 SSMS 中运行它?
SQL Server 中唯一支持的语言1是 T-SQL。话虽如此,使用 T-SQL 获取所需的详细信息非常简单。
/*
Description: Display the Active Directory group
membership permission path for all users
*/
SET NOCOUNT ON;
DECLARE @t TABLE (
[account name] varchar(255)
, [type] varchar(255)
, [privilege] varchar(255)
, [mapped login name] varchar(255)
, [permission path] varchar(255)
);
INSERT INTO @t
EXEC xp_logininfo;
DELETE
FROM @t
WHERE type = 'group';
DECLARE @cmd nvarchar(max);
DECLARE cur CURSOR LOCAL FORWARD_ONLY READ_ONLY STATIC FOR
SELECT 'EXEC xp_logininfo @acctname = ''' + name + ''', @option = ''members'';'
FROM master.sys.server_principals
WHERE type = 'G';
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @t
EXEC sp_executesql @cmd;
FETCH NEXT FROM cur INTO @cmd;
END
SELECT *
FROM @t t
ORDER BY t.[account name];
CLOSE cur;
DEALLOCATE cur;
Run Code Online (Sandbox Code Playgroud)
返回的结果显示用户有权访问 SQL Server,并显示他们是提供该访问权限的成员的组。
您需要具有 sysadmin 固定服务器角色的成员身份或 master 数据库中公共固定数据库角色的成员身份,并被授予 EXECUTE 权限以执行xp_logininfo。您将需要 Active Directory 中的标准用户权限才能枚举目录中的项目。
1 - R 在某些配置中受支持,并且Python 在 SQL Server 2017及更高版本中受支持。一般来说,您会想要使用 T-SQL。根据您可接受的安全状况,您可以使用 C# 或 Visual Basic 创建SQLCLR存储过程,该过程可以从 SQL Server 2005 及更高版本中的 T-SQL 调用。