web-dev-qa-db-ja.com

監査のためにSQL Serverのすべてのユーザーを一覧表示する

私はSQL Server Management Studio 17を使用しており、監査するすべてのユーザーを、データベース名を挙げて整理された方法で一覧表示しようとしています。

以下のクエリを試してみましたが、別のスケジュールでユーザーが表示され、一部のユーザーが重複しています。

exec sp_MSforeachdb 'select * from ?.sys.sysusers'

代わりに何を使用/試行できますか?

1
haithm

各データベースに独自のユーザーがあるため、ユーザーは「複製された」と表示されます。

クエリを少し拡張すると役立つ場合があります。これにより、各ユーザーセットがどのデータベースから来ているかを確認できます。

exec sp_MSforeachdb 'select ''?'' as DBNAME, * from ?.sys.sysusers'

Loginserの重要な違いに注意してください。

LoginAuthentication用です。
ログインは、サーバーにアクセスできることを確認します。
SQLログインとWindowsログインの2つのタイプがあります。
ログインはSQL Serverインスタンスレベルで作成されます(マスターに保存されます)。

A UserAuthorization
承認は、データベースで実行できることを決定します。
ユーザーはログインにリンクする必要があります。
ユーザーにはパスワードがありません-ログインにより、パスワードの保存場所が決定されます。
サーバー上の1つのログインにリンクされているさまざまなデータベースのユーザーがいるのはごく普通のことです。
ユーザー(およびそのロール)は、マスターではなく各データベースに保存されます(Security > Users各データベースでSSMSを使用する場合)。

3
Peter B

組み込み関数sp_helploginsを試してみてください。

各データベースでのログインとそれらに関連付けられたユーザーに関する情報を提供します。

参照:sp_helplogins(Transact-SQL) (Microsoft | Docs | SQL Server)

単純な場合:

 exec sp_helplogins

... 2つのウィンドウが表示されます。

最初のウィンドウ

最初のレポートには、次の表に示すように、指定された各ログインに関する情報が含まれています。

Column name   Data type       Description

LoginName     sysname         Login name.

SID           varbinary(85)   Login security identifier (SID).

DefDBName     sysname         Default database that LoginName uses when connecting to an 
                              instance of SQL Server.

DefLangName   sysname         Default language used by LoginName.

Auser         char(5)         Yes = LoginName has an associated user name in a database.
                              No = LoginName does not have an associated user name.

ARemote       char(7)         Yes = LoginName has an associated remote login.
                              No = LoginName does not have an associated login.

出力例

ログイン名| SID | DefDBName | DefLangName | AUser | ARemote 
 ---------------------------------------- + --- -------------------------------------------------- --------------- + ----------- + ------------- + ------- + --------- 
 ## MS_AgentSigningCertificate ## | 0x010600000000000901000000AB808B5B1F45E02462E89246B35D879D459D7BCB |マスター| us_english |はい|いいえ
 ## MS_PolicyEventProcessingLogin ## | 0x99533C1F5E0B584889BB3FA05C33ADC1 |マスター| us_english |はい|いいえ
 ## MS_PolicySigningCertificate ## | 0x0106000000000009010000006DFF93DB1C345982E5FF1D9148CA1CC1A605C5EC |マスター| NULL |いいえ|いいえ
 ## MS_PolicyTsqlExecutionLogin ## | 0xA9EEB439F4762546BD90D163703F6DA1 |マスター| us_english |はい|いいえ
 ## MS_SmoExtendedSigningCertificate ## | 0x010600000000000901000000044EFFBABE4DF3793E8DA9D60353CD089AC2C183 |マスター| NULL |いいえ|いいえ
 ## MS_SQLAuthenticatorCertificate ## | 0x0106000000000009010000001D9B4659FEDA4633E7989520152C8AFCCAF6430C |マスター| NULL |いいえ|いいえ
 ## MS_SQLReplicationSigningCertificate ## | 0x010600000000000901000000195A781158BF37965401996C9645207BFF20F765 |マスター| NULL |いいえ| 
 ## MS_SQLResourceSigningCertificate ## | 0x010600000000000901000000922D2F20EB6613B78484357D75AFFAB066EAC58A |マスター| NULL |いいえ|いいえ
 NT Service\MSSQLSERVER | 0x010600000000000550000000E20F4FE7B15874E48E19026478C2DC9AC307B83E |マスター| us_english |いいえ|いいえ
 NT SERVICE\ReportServer | 0x010600000000000550000000214401ACF066EA342187301080455260EB684BA2 |マスター| us_english |はい| 
 NT SERVICE\SQLSERVERAGENT | 0x010600000000000550000000DCA88F14B79FD47A992A3D8943F829A726066357 |マスター| us_english |いいえ|いいえ
 NT SERVICE\SQLWriter | 0x010600000000000550000000732B9753646EF90356745CB675C3AA6CD6B4D28B |マスター| us_english |いいえ|いいえ
 NT SERVICE\Winmgmt | 0x0106000000000005500000005A048DDFF9C7430AB450D4E7477A2172AB4170F4 |マスター| us_english |いいえ|いいえ
NT-AUTORITÄT\ Netzwerkdienst | 0x010100000000000514000000 |マスター| us_english |いいえ|いいえ
NT-AUTORITÄT\ SYSTEM | 0x010100000000000512000000 |マスター| us_english |はい|いいえ
 sa | 0x01 |マスター| us_english |はい| 
テストなし| 0x70F0AA94953CE7479682442D59C74CF5 |マスター| us_english |はい|番号  

2番目のウィンドウ

2番目のレポートには、次の表に示すように、各ログインにマップされたユーザーに関する情報と、ログインのロールメンバーシップが含まれています。

Column name   Data type   Description

LoginName     sysname     Login name.

DBName        sysname     Default database that LoginName uses when connecting to an instance of SQL Server.

UserName      sysname     User account that LoginName is mapped to in DBName, and the roles that LoginName is a member of in DBName.

UserOrAlias   char(8)     MemberOf = UserName is a role.
                          User = UserName is a user account.  

出力例

 
ログイン名| DBName |ユーザー名| UserOrAlias 
 ----------------------------------- + -------- --------------- + ---------------------------------- + ----------- 
 ## MS_AgentSigningCertificate ## |マスター| ## MS_AgentSigningCertificate ## |ユーザー
 ## MS_PolicyEventProcessingLogin ## |マスター| ## MS_PolicyEventProcessingLogin ## |ユーザー
 ## MS_PolicyEventProcessingLogin ## | msdb | ## MS_PolicyEventProcessingLogin ## |ユーザー
 ## MS_PolicyEventProcessingLogin ## | msdb | PolicyAdministratorRole | MemberOf 
 ## MS_PolicyTsqlExecutionLogin ## | msdb | ## MS_PolicyTsqlExecutionLogin ## |ユーザー
 ## MS_PolicyTsqlExecutionLogin ## | msdb | PolicyAdministratorRole | MemberOf 
 NT SERVICE\ReportServer |マスター| NT SERVICE\ReportServer |ユーザー
 NT SERVICE\ReportServer |マスター| RSExecRole | MemberOf 
 NT SERVICE\ReportServer | msdb | NT SERVICE\ReportServer |ユーザー
 NT SERVICE\ReportServer | msdb | RSExecRole | MemberOf 
 NT SERVICE\ReportServer | ReportServer | NT SERVICE\ReportServer |ユーザー
 NT SERVICE\ReportServer | ReportServer | RSExecRole | MemberOf 
 NT SERVICE\ReportServer | ReportServerTempDB | NT SERVICE\ReportServer |ユーザー
 NT SERVICE\ReportServer | ReportServerTempDB | RSExecRole | MemberOf 
NT-AUTORITÄT\ SYSTEM | AdventureWorksDW2012 | db_owner | MemberOf 
NT-AUTORITÄT\ SYSTEM | AdventureWorksDW2012 | dbo |ユーザー
 sa |マスター| db_owner | MemberOf 
 sa |マスター| dbo |ユーザー
 sa |モデル| db_owner | MemberOf 
 sa |モデル| dbo |ユーザー
 sa | msdb | db_owner | MemberOf 
 sa | msdb | dbo |ユーザー
 sa | tempdb | db_owner | MemberOf 
 sa | tempdb | dbo |ユーザー
 test | StackExchange |テスト|ユーザー
 

これはあなたが探しているものかもしれません。

0

カーソルを使用してデータベースをループし、ユーザーを取得することもできます。

DECLARE @dbname NVARCHAR(255), @sql NVARCHAR(max)

DECLARE c CURSOR FORWARD_ONLY READ_ONLY FOR
SELECT name FROM sys.databases 
WHERE database_id > 4;

OPEN c
FETCH NEXT FROM c INTO @dbname ;

WHILE @@fetch_status = 0
BEGIN
    set @sql =
    'use '+@dbname+' 
    select '''+@dbname+''',* 
    from sys.sysusers 
    where name not in 
    (''public''
    ,''dbo''
    ,''guest''
    ,''INFORMATION_SCHEMA''
    ,''sys''
    ,''db_owner''
    ,''db_accessadmin''
    ,''db_securityadmin''
    ,''db_ddladmin''
    ,''db_backupoperator''
    ,''db_datareader''
    ,''db_datawriter''
    ,''db_denydatareader''
    ,''db_denydatawriter'')';

    EXEC (@sql);
    FETCH NEXT FROM c INTO @dbname;
END
CLOSE C
DEALLOCATE c
0
Randi Vertongen