2017-05-09 14 views
1

を使用し続ける:関数を作成SQLCLR偽装は、私は次のコードを持っているサービスID

CREATE ASYMMETRIC KEY aKeyCLR FROM EXECUTABLE FILE = '$(BASE)CLR.dll' 
CREATE LOGIN CLRLogin FROM ASYMMETRIC KEY aKeyCLR 
GRANT UNSAFE ASSEMBLY TO CLRLogin 

CREATE FUNCTION dbo.Test() 
RETURNS NVARCHAR(4000) 
AS 
    EXTERNAL NAME myStuff.[CLR.FileFunctions].[MyTest] 
GO 
次のようにアセンブリのdeclationがあるSQLで

Public Shared Function MyTest() As SqlString 

    Dim rc As String = Nothing 
    Dim impersonatedUser As WindowsImpersonationContext = Nothing 
    If SqlContext.IsAvailable Then 
     If SqlContext.WindowsIdentity IsNot Nothing Then 
      impersonatedUser = SqlContext.WindowsIdentity.Impersonate 
     End If 
    End If 
    Try 
     rc = System.IO.File.Exists("C:\Data Files\Test\42.txt").ToString 
    Catch ex As Exception 
     Return ex.Message 
    Finally 
     If impersonatedUser IsNot Nothing Then 
      impersonatedUser.Undo() 
     End If 
    End Try 

    Return rc 
End Function 

SELECT Test()を実行すると、ファイルアクセスは引き続きアカウント "NT SERVICE \ MSSQLSERVER"によって行われます。私はWindows認証でSQLサーバーにログオンしており、そのユーザーがファイルへのアクセスを行うことを期待しています。

私はここで何が欠けていますか?

+0

正しく表示されます。 'If​​ SqlContext.WindowsIdentity IsNot Nothing Then'条件内でブレークポイントをデバッグして設定することができます。それ以外の場合は、分岐が入力されたことを明確に示す何らかの行を追加します。また、なぜセキュリティコンテキストがあなたのWindowsログインではなく、 'NT SERVICE \ MSSQLSERVER'であると思われますか? –

+0

私はそれが内側のIFに入ることを100%確信しています。固定戻り値を設定することでそれを証明しました。 System Internals ProcMonを使用して、どのユーザーがそのフォルダーにアクセスしているかを確認しました。 –

+0

Hmm。あなたは、あなたのWindowsログインにのみ読み込みアクセスを許可し、 'Exists()'を 'string _Test = ReadAllText()'かそのようなものに変更することでテストしたいかもしれません。 –

答えて

0

コードが正しいようです。あなたは、あなたのWindowsログインへの読み取りアクセスのみを許可し、をstring _Test = ReadAllText()またはそのようなものに変更することでテストできます。

あなたが最初に見ているのは、プロセスの主なアイデンティティです。別のアカウントを偽装することは元のセキュリティコンテキストを置き換えるものではなく、単にプロセスを実行するための新しいSID(セキュリティID)です。実際には、OSアカウントを偽装しても、レジストリ内の「アクティブ」ユーザー(つまりHKEY_CURRENT_USER)は変更されず、環境変数もリセットされません(つまり、PATHTEMPなど)。これらのアクションはフルログイン時に発生します。

EXECUTE ASで偽装すると、ORIGINAL_LOGIN()組み込み関数を使用してセッションのメインIDを確認できます。

0

ProcMonのCreateFileイベントをさらにクリックすると、イベントプロパティによって偽装されたユーザーが表示されます。

設計どおりに動作します!

関連する問題