2017-05-09 7 views
1

mit Ich habe den folgenden Code:SQLCLR Identitätswechsel hält die Dienstidentität

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 

In SQL die declation der Baugruppe wie folgt:

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

Die Funktion erstellen:

CREATE FUNCTION dbo.Test() 
RETURNS NVARCHAR(4000) 
AS 
    EXTERNAL NAME myStuff.[CLR.FileFunctions].[MyTest] 
GO 

Wenn ich SELECT Test() ausführen, wird der Dateizugriff immer noch vom Konto "NT SERVICE \ MSSQLSERVER" ausgeführt. Ich bin am SQL-Server mit Windows-Authentifizierung angemeldet und würde erwarten, dass dieser Benutzer den Dateizugriff durchführt.

Was fehlt mir hier?

+0

Das sieht richtig aus. Können Sie entweder debuggen und einen Break-Point innerhalb der Bedingung 'If SqlContext.WindowsIdentity IsNot Nothing Then' setzen, sonst fügen Sie eine Zeile hinzu, die dort etwas ausführt, das deutlich anzeigt, dass die Verzweigung eingegeben wurde. Warum denken Sie, dass der Sicherheitskontext immer noch "NT SERVICE \ MSSQLSERVER" und nicht Ihr Windows-Login ist? –

+0

Ich bin 100% sicher, dass es im inneren IF ankommt, ich habe es bewiesen, indem ich dort einen festen Rückgabewert gesetzt habe. Ich habe System Internals ProcMon verwendet, um zu sehen, welcher Benutzer auf den Ordner zugreift. –

+0

Hmm. Vielleicht möchten Sie testen, indem Sie nur Lesezugriff auf Ihre Windows-Anmeldung erlauben und dann die 'Exists()' in 'string _Test = ReadAllText()' oder etwas Ähnliches ändern. –

Antwort

0

Ihr Code scheint korrekt zu sein. Sie können testen, indem Sie den Lesezugriff nur auf Ihre Windows-Anmeldung zulassen und dann die Exists() in string _Test = ReadAllText() oder etwas Ähnliches ändern.

Was Sie zuerst sehen, ist die Hauptidentität des Prozesses. Die Identitätsübernahme eines anderen Kontos ersetzt nicht den ursprünglichen Sicherheitskontext. Es ist lediglich eine neue SID (Sicherheits-ID), mit der der Prozess ausgeführt werden kann. Tatsächlich ändert die Identität eines Betriebssystemkontos den "aktiven" Benutzer in der Registrierung (d. H. HKEY_CURRENT_USER) nicht, noch setzt es die Umgebungsvariablen zurück (d. H. PATH, TEMP, usw.); Diese Aktionen passieren bei einer vollständigen Anmeldung.

Innerhalb von SQL Server, wenn Sie sich über EXECUTE AS imitieren, können Sie die Hauptidentität der Sitzung über die eingebaute Funktion ORIGINAL_LOGIN() sehen.

0

Durch Klicken auf einen Schritt weiter in ProcMon auf dem CreateFile-Ereignis zeigen die Ereigniseigenschaften den Identität annehmenden Benutzer.

Arbeiten wie geplant!