Konfigurieren Sie die uneingeschränkte Delegierung für BULK INSERT

12

Ich habe zwei Microsoft SQL Server 2016-Knoten in einer Always On Availability-Gruppe. Ich versuche, eine BULK INSERT(mithilfe einer SQL Server 2016 Management Studio-Abfrage) für eine Datei auszuführen, die sich in einem Windows Server 2016-Dateiserver-Failovercluster befindet. Es wird jedoch die folgende Fehlermeldung angezeigt:

Nachricht 4861, Ebene 16,
Status 1 Kann nicht massenweise geladen werden, da die Datei "\ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt" nicht geöffnet werden konnte. Betriebssystemfehlercode 5 (Zugriff verweigert.)

Dies geschieht unabhängig davon, ob ich den Namen des aktiven Knotens ( nas2.my.domain) oder den Listener des Failoverclusters ( nas.my.domain) verwende.

Nachdem ich mich umgesehen hatte, stellte ich fest, dass dies darauf zurückzuführen war, dass der SQL Server die Identität des Benutzerkontos, mit dem ich verbunden bin, aufgrund von Nuancen mit nicht annehmen konnte BULK INSERT.

Wenn Sie mithilfe der Windows-Authentifizierung eine Verbindung zum SQL Server herstellen, versucht das SQL Server-Dienstkonto, die Identität Ihres Benutzerkontos zu übernehmen, wenn Sie eine Verbindung zum Dateiserver herstellen. Wenn Sie eine Verbindung mithilfe der SQL Server-Authentifizierung herstellen, wird eine Verbindung zum Dateiserver als SQL Server-Dienstkonto hergestellt.

Wenn Delegierung und Identitätswechsel nicht ordnungsgemäß konfiguriert sind (Standardeinstellung), kann der SQL Server-Dienst die Identität Ihres Benutzerkontos nicht annehmen und versucht, als anonymer Benutzer eine Verbindung zum Dateiserver herzustellen.

Dies kann durch Durchsuchen des Sicherheitsereignisprotokolls auf dem Dateiserver bestätigt werden. Diese Fakten sowie eine Anleitung zum Konfigurieren der uneingeschränkten und eingeschränkten Delegierung sind in den folgenden Links dokumentiert:

Ich habe versucht, den Anweisungen im Handbuch zu folgen , aber es funktioniert immer noch nicht.

Die Datenbank, zu der ich versuche, BULK INSERTist nicht Teil der Verfügbarkeitsgruppe, daher sollte nur der MSSQL1-Knoten relevant sein. Der Dateiserver war auf dem NAS2-Knoten aktiv. Das Überprüfen des Ereignisprotokolls auf dem Dateiserver zeigt, dass dieses Problem weiterhin besteht und der SQL Server versucht, sich beim Dateiserver als anonymer Benutzer zu authentifizieren, anstatt sich als mein Benutzerkonto auszugeben.

Weiß jemand, was falsch läuft? Oder wenn sich in SQL Server 2016 etwas geändert hat, um diese Handbücher überflüssig zu machen?

Ich kann bestätigen, dass dieses Gruppenrichtlinienobjekt auf MSSQL1 über angewendet gpresult.exe /Rwurde und anschließend sowohl der SQL- als auch der Dateiserver-Knoten neu gestartet wurden, um sicherzustellen, dass alle Caches geleert wurden.

Muh Fugen
quelle
1
Zwei Fragen: 1) Haben Sie versucht, Ihr persönliches Windows-Domänenkonto für die Delegierung zu aktivieren? 2) Wenn Sie über SSMS eine Verbindung zu SQL Server herstellen, sind Sie auf dem Server (dh Remotedesktop) angemeldet, auf dem SQL Server ausgeführt wird, und stellen eine lokale Verbindung her. oder auf Ihrer Workstation angemeldet und eine Remoteverbindung zu SQL Server hergestellt? Wenn Sie nicht versucht haben, sich direkt am Server anzumelden und eine lokale Verbindung über SSMS herzustellen, versuchen Sie dies. Wenn Sie nicht versucht haben, Ihr Domänenkonto für die Delegierung zu aktivieren, versuchen Sie dies.
Solomon Rutzky

Antworten:

1

Ihre Konfiguration sieht solide aus. SPNs und Delegation sind so konfiguriert, wie ich es selbst gemacht hätte.

Das einzige, was Sie nicht erklärt haben, sind die Datei- / Freigabeberechtigungen. Hier setzt meine Lösung an.

Lösung 1 (persönliches Konto)

  1. Stellen Sie sicher, dass Ihr persönliches Konto auf die Datei auf der Freigabe des Dateiservers zugreifen darf
    • Ihr persönliches Konto benötigt mindestens READ-Berechtigungen auf der Freigabeberechtigungsebene. In den meisten Fällen wird möglicherweise angezeigt, dass JEDER über READ-Berechtigungen verfügt.
    • Ihr persönliches Konto benötigt mindestens READ-Berechtigungen auf der Berechtigungsstufe der Datei
    • Überprüfen Sie die Berechtigungsvererbung auf Dateiebene für diese eine Datei
      • Starten Sie den SQL Server neu, nachdem Sie die Dateiberechtigungen geändert haben, oder schalten Sie den SQL Server-Dienst aus und wieder ein.
    • Alternativ: Melden Sie sich mit Ihrem persönlichen Konto beim SQL Server an, stellen Sie eine Verbindung zur Freigabe her und öffnen Sie die Datei.
  2. Öffnen Sie SSMS mit Ihrem persönlichen Konto.
  3. Stellen Sie mithilfe der Windows-Authentifizierung eine Verbindung zu Ihrer SQL Server-Instanz her.
    • Stellen Sie sicher, dass Sie mit dem SQL Server-Dienstkonto mit dem zuvor verwendeten Skript mit Ihrer Instanz verbunden sind.
  4. Führen Sie den Import mit BULK INSERT durch

Lösung 2 (SQL Server-Dienstkonto)

  1. Stellen Sie sicher, dass das SQL Server-Dienstkonto auf die Datei auf der Dateiserverfreigabe zugreifen darf
    • Das SQL Server-Dienstkonto benötigt mindestens READ-Berechtigungen auf Freigabeberechtigungsebene. In den meisten Fällen wird möglicherweise angezeigt, dass JEDER über READ-Berechtigungen verfügt.
    • Das SQL Server-Dienstkonto benötigt mindestens READ-Berechtigungen auf der Berechtigungsstufe der Datei
    • Überprüfen Sie die Berechtigungsvererbung auf Dateiebene für diese eine Datei
      • Starten Sie den SQL Server neu, nachdem Sie die Dateiberechtigungen geändert haben, oder schalten Sie den SQL Server-Dienst aus und wieder ein.
    • Alternativ: Melden Sie sich mit dem SQL Server-Dienstkonto beim SQL Server an, stellen Sie eine Verbindung zur Freigabe her, und öffnen Sie die Datei.
  2. Öffnen Sie SSMS mit dem SQL Server-Dienstkonto .
    • Runas: Ihr_Domain \ SQL_Server_Service_Account
    • Geben Sie das Passwort ein
  3. Stellen Sie mithilfe der Windows-Authentifizierung eine Verbindung zu Ihrem SQL Server her.
    • Stellen Sie sicher, dass Sie mit dem SQL Server-Dienstkonto mit dem zuvor verwendeten Skript mit Ihrer Instanz verbunden sind.
  4. Führen Sie den Import mit BULK INSERT durch

BULK INSERT-Berechtigungen

Sicherheitskontodelegation (Identitätswechsel)

Wenn ein Benutzer eine SQL Server-Anmeldung verwendet, wird das Sicherheitsprofil des SQL Server-Prozesskontos verwendet. Eine Anmeldung mit SQL Server-Authentifizierung kann nicht außerhalb des Datenbankmoduls authentifiziert werden. Wenn ein BULK INSERT-Befehl durch eine Anmeldung mithilfe der SQL Server-Authentifizierung initiiert wird, wird die Verbindung zu den Daten unter Verwendung des Sicherheitskontexts des SQL Server-Prozesskontos (des Kontos, das vom SQL Server-Datenbankmodul-Dienst verwendet wird ) hergestellt. Um die Quelldaten erfolgreich zu lesen , müssen Sie dem vom SQL Server-Datenbankmodul verwendeten Konto Zugriff auf die Quelldaten gewähren. Wenn sich ein SQL Server-Benutzer hingegen mithilfe der Windows-Authentifizierung anmeldet , kann der Benutzer nur die Dateien lesen, auf die das Benutzerkonto zugreifen kann. unabhängig vom Sicherheitsprofil des SQL Server-Prozesses.

Referenz: BULK INSERT (Transact-SQL)

John aka hot2use
quelle
0

Nach meiner Erfahrung mit der Delegierung benötigt das SQL Server-Dienstkonto die entsprechenden Berechtigungen für die Freigabe, auf die es in Ihrem Namen zugreifen möchte. Haben Sie diese Berechtigungen angepasst? Ich würde denken, dass nur Lesen im Voraus ausreichen würde.

Chris Lumnah
quelle