2017-11-15 58 views
2

Visual Studio(VS)2015で2つのDLLが署名されています。非対称キーを作成してログインして、UNSAFEモードでアセンブリの1つを正しく実行しました。安全でないアセンブリのSQL Server 2014で非対称キーを作成する

は、私は2番目の1で、次のエラーが表示されます。

メッセージ10327、レベル14、状態1、行27
は、アセンブリのための「TableFile」をアセンブリを作成失敗しましたアセンブリ「TableFileが」の許可されていないので、 PERMISSION_SET = UNSAFE。データベース所有者(DBO)にUNSAFE ASSEMBLY権限があり、データベースにTRUSTWORTHYデータベースプロパティが設定されている場合、アセンブリは承認されます。またはアセンブリが、UNSAFE ASSEMBLY権限を持つ対応するログインを持つ証明書または非対称キーで署名されている。

元従業員にこれを実行する方法を知ることはできません。私もこれを試してみました:これは、次のエラーが与え

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 

:名前の9
非対称鍵をメッセージ15396、レベル16、状態1、行

'をAProjectKey' が既に存在するか、この非対称キーはすでにデータベースに追加されています。

メッセージレベル15151、レベル16、状態1、行10
非対称キー 'AProjectKey'が存在しないか、アクセス権がないため、このキーを見つけることができません。

メッセージレベル15151、レベル16、状態1、行11
'AProjectLogin'が存在しないか、アクセス権がないためログインできません。

これらのアセンブリを両方とも安全でないモードで実行するにはどうすればよいですか?前もって感謝します。

答えて

1

これら3つのエラーメッセージについて:

  1. 最初は非対称キーが既に存在するが、別の名前で原因である可能性があります。鍵と証明書は、名前だけでなく、公開鍵の点でユニークである必要があります(ただし、固有である必要があります)。各鍵と証明書には、「拇印」と呼ばれる公開鍵のハッシュがあります。既存の鍵/証明書の拇印は、新しい鍵/証明書の作成時にチェックされ、拇印が既に存在する場合は、異なる名前の鍵/証明書を作成することを防止します。これは、「またはこの非対称キーがすでにデータベースに追加されている」というエラーメッセージの意味です。

    OR:

    それは異なる非対称鍵(すなわち、異なる「拇印」)はmasterに存在するが、名前AProjectKey

  2. と違うの下で同じキーを作成できませんでしたのでことを意味しますその名前にはAsymmetric Keyは存在しません。そのため、ログイン名を作成することはできません(CREATE ASYMMETRIC KEYステートメントが失敗したため)。
  3. ログインを作成できなかったため、アクセス許可が付与されていません。

エラー2は、問題の絞り込みに役立ちます。エラー#1が、同じ名前で異なる「拇印」を持つ既存の非対称キーによって引き起こされた場合、ログインを作成できたか(存在していない場合)、そうでないとログイン(すなわち、「サーバプリンシパル」)が既に存在する。しかし、エラーは、という名前の非対称キーがという名前で見つからないということです。これは、非対称キー自体がすでに存在しているが、別の名前で存在することを意味するはずです。あなたは、非対称鍵は、次のコマンドを実行して作成されたものを見ることができます。

SELECT * FROM sys.asymmetric_keys; 

しかし、それはそのアセンブリ(またはアセンブリから来たが、この1に署名するために使用したのと同じ厳密名キーで署名された1あなたを教えてくれありません)。そのためには、「拇印」を知っている必要があります。そのためには、コマンドプロンプト(Visual Studioがインストールされたときに正しいパスが設定されているため、「開発者コマンドプロンプト」を開くことが望ましい)を開く必要があります。その後、次のコマンドを実行します。

CD /D E:\sqldlls\ 
sn -T TableFile.dll 

あなたが表示されるはずです。

Public key token is XXXXXXXXXXXXXXXX 

コピーして次のクエリにそのXXXXX "トークン"(すなわち拇印)を貼り付けます。

ことを想定し
SELECT ak.[name], ak.[sid] 
FROM sys.asymmetric_keys ak 
WHERE ak.[thumbprint] = 0x{XXXXXXXXXXXXXXXX}; -- remove the { and } 

行が返されると、ログインが存在するかどうかを確認する必要があります。非対称キーからログインを作成しようとしても、キー/証明書ごとに1つのログインしか作成できないため、ログイン名は取得できません。エラーメッセージは、作成しようとしている名前のみを返します同じキーの別の名前であっても、すでに存在するものです。だから、返された行からSIDを取得し、次のクエリでそれを貼り付けます。何の行が返されない

SELECT sp.* 
FROM sys.server_principals sp 
WHERE sp.[sid] = 0x{SID_from_sys_asymmetric_keys}; -- remove the { and } 

なら、あなたはその非対称キーからのログインを作成する必要があります。

この時点でログインする必要がありますので、UNSAFE ASSEMBLY権限を与えてください。

もう一度アセンブリを作成してみます。

+0

完全に問題を解決しました! – cdub

+0

@cdub恐ろしい!ログインが行方不明だったのですか、それともそこにいて、許可が必要でしたか? –

+0

ログインは許可されているだけでした。 – cdub

関連する問題