Sql-Server

如何測試使用者權限

  • April 16, 2021

我有兩個伺服器使用者,比如說adminnotadmin。我需要測試notadmin的權限。我需要在notadmin上設置和測試 VIEW SERVER STATE 權限,但通常我只能以admin身份訪問數據庫。我的管理員不是系統管理員,因為預設架構有問題(系統管理員總是有預設架構 dbo,但我需要別的東西),但我幾乎可以設置我需要的任何權限。

我從這個出發

對於測試權限HAS_PERMS_BY_NAME,它執行良好。所以我試圖冒充notadmin。我將IMPERSONATE ANY LOGIN權限設置為admin,效果很好。我以這種方式測試它(在主數據庫上):

SELECT HAS_PERMS_BY_NAME('notadmin', 'LOGIN', 'IMPERSONATE')  -- return 1
EXECUTE AS login = 'notadmin'
   SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE')  -- return 1
REVERT

因為我不喜歡任何(這樣我可以冒充具有系統管理員角色的人),所以我嘗試設置這個

GRANT IMPERSONATE ON LOGIN::admin to notadmin

然後執行相同的查詢。但它失敗了 - 返回 0 和錯誤: 無法作為伺服器主體執行,因為主體“notadmin”不存在,無法模擬這種類型的主體,或者您沒有權限。

主體必須存在並且可以通過模擬來模擬任何登錄,它可以工作。那麼我需要哪個權限來模擬notadmin

還是有其他方法可以測試其他數據庫使用者權限並且不允許模擬任何其他使用者?


編輯(16.04.2021 12:13): 我發現它HAS_PERMS_BY_NAME返回與主數據庫中的系統視圖相同的值。所以SELECT * FROM sys.server_permissions沒用

GRANT IMPERSONATE ON LOGIN::admin to notadmin是告訴 SQL Server 您要授予IMPERSONATE該帳戶的權限,notadmin以便它可以IMPERSONATE其他使用者。聽起來您的目標是相反的,您想notadmin從帳戶中模擬該admin帳戶。EXECUTE AS LOGIN = 'notadmin'當您執行 SQL 程式碼時(當您以您的admin帳戶登錄時),您已經完成了這項工作。

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