如何測試使用者權限
我有兩個伺服器使用者,比如說admin和notadmin。我需要測試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
帳戶登錄時),您已經完成了這項工作。