0

I am trying to remove/ drop a users permissions but i keep getting the following error:

The server principal “DevMe” is not able to access the database “CallManager” under the current security context.

My Stored proc to do this looks as follows:

USE [AuditIT]
GO
/****** Object:  StoredProcedure [dbo].[AdminDevUserDelete]    Script Date: 06/29/2012 08:54:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--alter table AdminLog add HostName varchar(128) NULL DEFAULT HOST_NAME()

ALTER PROCEDURE [dbo].[AdminDevUserDelete]
    @SQLLoginName varchar(50) 
AS   

DECLARE @DatabaseName varchar(1000)

PRINT 'USE [master] DROP LOGIN [' + @SQLLoginName + ']'
EXEC ('USE [master] DROP LOGIN [' + @SQLLoginName + ']')

DECLARE CSDatabase CURSOR FOR 
    SELECT
        [Name]
    FROM
        [Master]..SysDatabases
    --WHERE
    --  --[sid] = 0x01
    --  [Name] NOT IN ('ReportSRV.Support','HelpDeskFacilities','QuestSoftware')
    ORDER BY
        dbid DESC
OPEN CSDatabase
FETCH NEXT FROM CSDatabase INTO @DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC ('SELECT [Name] FROM [' + @DatabaseName + ']..SysUsers WHERE [Name] = ''' + @SQLLoginName + '''')
    IF @@RowCount > 0
    BEGIN
        PRINT 'USE [' + @DatabaseName + '] DROP USER [' + @SQLLoginName +']'
        EXEC ('USE [' + @DatabaseName + '] DROP USER [' + @SQLLoginName +']')
    END
    FETCH NEXT FROM CSDatabase INTO @DatabaseName
END
CLOSE CSDatabase
DEALLOCATE CSDatabase

Could someone please explain how i could fix this problem?

4

1 回答 1

1
  • 不要手动引用名称,使用内置的QUOTENAME函数。您的代码无法正确处理包含嵌入]字符的数据库和用户名。'引号也是如此,再次使用 QUOTENAME (它可以同时引用[and ',请参阅链接的规范)。您的代码将中断包含 embeded 的名称'
  • 如果您使用 SQL 2005 及更高版本的动词,DROP USER则使用适当的目录视图:sys.database_principalssys.databases.
  • 始终在区分大小写的排序服务器上测试您的代码。您的代码将中断,因为您对目录名称使用混合大小写。SQL 服务器名称都是小写的。

最后,导致您看到的错误的问题是什么?在您未发布的代码中,即您如何调用此存储过程。该错误表明您处于 EXECUTE AS 沙盒模式,请参阅了解执行上下文了解上下文切换。您需要正确地对您的过程进行代码签名,以便它可以将上下文扩展到服务器级别(因为您正在接触任意数据库,所以跨数据库代码签名是不够的)。

顺便说一句,如果您不在 eXECUTE AS 上下文中,那么很简单,您无权访问相关数据库,因此这是一个无声的问题,因为您无权您想做的事情。其他点仍然存在,并且考虑到正在尝试做的事情,正确等待获得此过程所需的权利仍然是使用代码签名......

更新:

您的 C# 代码也容易发生 SQL 注入……这真是一场火鸡射击。不要通过procedure = dataBase + ".." + procedure!!建立您的程序名称

于 2012-06-29T07:39:47.577 回答