我在Visual Studio(VS)2015中签署了2个DLL。前雇员创建了非对称密钥和登录,我正确地以UNSAFE
模式运行了其中一个程序集。
我在第二个错误中收到以下错误:
Msg 10327,Level 14,State 1,Line 27
程序集“TableFile”的CREATE ASSEMBLY失败,因为程序“TableFile”未获得PERMISSION_SET = UNSAFE的授权。如果满足以下任一条件,则授权程序集:数据库所有者(DBO)具有UNSAFE ASSEMBLY权限,并且数据库具有TRUSTWORTHY数据库属性;或者使用具有相应登录权限的证书或非对称密钥对程序集进行签名。
我不能问这位前雇员,所以如何找到如何让它运行?我也尝试了这个:
USE master;
GO
CREATE ASYMMETRIC KEY AProjectKey FROM EXECUTABLE FILE = 'E:\sqldlls\TableFile.dll'
CREATE LOGIN AProjectLogin FROM ASYMMETRIC KEY AProjectKey ;
GRANT UNSAFE ASSEMBLY TO AProjectLogin ;
GO
这会出现以下错误:
Msg 15396,Level 16,State 1,Line 9
名称为“AProjectKey”的非对称密钥已存在,或者此非对称密钥已添加到数据库中。Msg 15151,Level 16,State 1,Line 10
找不到非对称密钥'AProjectKey',因为它不存在或您没有权限。Msg 15151,Level 16,State 1,Line 11
无法找到登录'AProjectLogin',因为它不存在或您没有权限。
如何让这两个程序集在不安全模式下运行?提前谢谢。
答案 0 :(得分:1)
关于这3条错误消息:
第一个原因可能是由于Asymmetric Key已经存在,但名称不同。密钥和证书在公钥方面需要是唯一的,而不仅仅是名称(尽管显然也需要是唯一的)。每个密钥和证书都有一个公钥的哈希值,称为" thumbprint"。创建新密钥/证书时,将检查现有密钥/证书的指纹,如果指纹已存在,则会阻止创建,即使是名称不同的密钥/证书也是如此。这就是错误消息的含义"或者这个非对称密钥已经添加到数据库"。
OR:
这可能意味着master
中存在不同的非对称密钥(即不同的"指纹"),但名称为AProjectKey
错误#2有助于缩小问题范围。如果错误#1是由现有的具有相同名称但不同的" thumbprint"的非对称密钥引起的,那么您可以创建登录(如果它尚不存在),或者您将拥有得到一个错误,指出Login(即"服务器主体")已经存在。但错误是无法找到 name 的非对称密钥。这应该意味着Asymmetric Key本身已经存在,但名称不同。您可以通过执行以下操作来查看已创建的非对称密钥:
CREATE ASYMMETRIC KEY
但是,这并没有告诉你哪一个来自大会(或者一个大会签署了同一个强名称密钥用于签署这个大会)。为此你需要知道" thumbprint",为此你需要打开一个命令提示符(最好是"开发人员命令提示符" Visual Studio在安装时设置,因为它有打开它时设置的正确路径)。然后,运行以下命令:
SELECT * FROM sys.asymmetric_keys;
您应该看到:
CD /D E:\sqldlls\
sn -T TableFile.dll
复制并粘贴XXXXX"令牌" (即指纹)进入以下查询:
Public key token is XXXXXXXXXXXXXXXX
假设您返回了一行,我们需要查看Login是否存在。只是尝试从非对称密钥创建登录,如果它确实存在,则不会获取登录名称,因为每个密钥/证书只能创建一个登录名,并且错误消息仅报告名称您尝试创建已存在的那个,即使它可能是同一个Key的不同名称。因此,从返回的行中获取SID并将其粘贴到以下查询中:
SELECT ak.[name], ak.[sid]
FROM sys.asymmetric_keys ak
WHERE ak.[thumbprint] = 0x{XXXXXXXXXXXXXXXX}; -- remove the { and }
如果没有返回任何行,那么您应该从该非对称密钥创建一个登录。
此时登录应该存在,因此授予它SELECT sp.*
FROM sys.server_principals sp
WHERE sp.[sid] = 0x{SID_from_sys_asymmetric_keys}; -- remove the { and }
权限。
现在再次尝试创建程序集。