Ich denke, dies ist ein Berechtigungsproblem, aber ich habe Probleme, es zu finden.
Ich habe eine Gruppe von CLRs auf einem Server (SQL Server 2016) und sie funktionieren wie sie sollten. Alle sind als UNSICHER gekennzeichnet und führen verschiedene Arten von Datei-E / A aus (Lesen, Schreiben, Kopieren, Verschieben, Umbenennen usw.). Ich kann sie über SSMS oder von einem Job aus genauso einfach ausführen.
Ich muss sie auf einem anderen Server installieren (auch SQL Server 2016). Mit dem ursprünglichen Visual Studio-Projekt habe ich sie auf dem neuen Server bereitgestellt. Sie werden in SSMS angezeigt. Dieser Teil sieht gut aus.
Wenn ich über SSMS versuche, einen auszuführen, wird die folgende Fehlermeldung angezeigt: "Der Zugriff auf den Pfad" Der Pfad, den ich übergeben habe "wird verweigert."
Ich bin unter meinem Windows-Login bei SSMS angemeldet. Ich habe Berechtigungen für die Datenbank, ich bin dbo. Ich bin ein Administrator auf dem Server. Ich habe Berechtigungen im Dateisystem.
Was könnte ich sonst noch vermissen?
Antworten:
Nichts davon ist normalerweise von Bedeutung. Sofern Sie (oder wer auch immer die SQLCLR-Methoden codiert hat) Identitätswechsel nicht implementiert haben, ist der für externe Vorgänge verwendete Sicherheitskontext der des Dienstkontos, auf dem SQL Server ausgeführt wird (ähnlich dem
xp_cmdshell
Verhalten). Dieses Konto benötigt die Berechtigung für die Pfade, auf die Sie zugreifen möchten.Der Vollständigkeit halber in Bezug auf Dateizugriffsberechtigungen:
Beachten Sie, dass "DENY" Vorrang vor "GRANT" hat (genau wie bei SQL Server-Berechtigungen).
Um festzustellen, ob das für den externen Zugriff verwendete Konto tatsächlich über die erforderliche Berechtigung für die Ordner und / oder Dateien verfügt:
NT Service\MSSQLSERVER
)Gibt es irgendwo auf dem Pfad, auf den Sie zugreifen möchten, DENY-Berechtigungen?
AUCH Wenn der gesamte Code Dateisystemmaterial ist, muss die Assembly höchstwahrscheinlich nicht als markiert sein
UNSAFE
und sollte es stattdessen seinEXTERNAL_ACCESS
. Es sollten nicht zu viele Dateisystemvorgänge erforderlich seinUNSAFE
. Eine davon ist das Abrufen einer Liste fester Festplatten, aber nicht sicher, was noch.quelle
G:
Laufwerk lokal oder remote? Der Titel der Frage gibt dasC:
Laufwerk an. Unterscheidet sich das zwischen dem funktionierenden und dem nicht funktionierenden System? Wenn es sich um eine Remote-Dateifreigabe handelt, muss dem Computerkonto möglicherweise Zugriff gewährt werden, da dies meines ErachtensNT Service\name
nur lokal bekannt ist. Daher erfolgt der Remotezugriff alsComputerName$
.Stellen Sie sicher, dass das Dienstkonto, auf dem SQL Server ausgeführt wird, Zugriff auf diese Pfade hat.
Das wird das Konto sein, das tatsächlich mit den Dateien auf der Festplatte interagiert.
quelle
Für den Fall, dass Sie alle oben genannten Wege gegangen sind, aber es hat nicht funktioniert. Nach meiner bisherigen Erfahrung können Sie versuchen, SSMS als Administrator zu öffnen .
quelle