数据库用户列表:可以在 SQL Server Management Studio 中运行 C# 代码吗?

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 中运行它?

Han*_*non 7

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 调用。