Beim Aufrufen aus einem SQL Server-Agentauftragsschritt wird ein SSIS-Paket nicht ausgeführt

Gilt für: SQL Server 2008 DeveloperSQL Server 2008 EnterpriseSQL Server 2008 Standard

Problembeschreibung


Wenn Sie ein SSIS-Paket (Microsoft SQL Server 2005 Integration Services) aus einem SQL Server-Agentauftragsschritt aufrufen, wird das SSIS-Paket nicht ausgeführt. Wenn Sie das SSIS-Paket jedoch nicht ändern, wird es erfolgreich außerhalb des SQL Server-Agents ausgeführt.

Lösung


Verwenden Sie eine der folgenden Methoden, um das Problem zu beheben. Welche Methode am besten geeignet ist, hängt von der Umgebung und vom Grund für den aufgetretenen Fehler ab. Das Paket kann aus den folgenden Gründen Fehler verursachen: 
  • Das Benutzerkonto, mit dem das Paket unter dem SQL Server-Agent ausgeführt wird, ist nicht dasselbe wie das des ursprünglichen Paketerstellers.
  • Das Benutzerkonto verfügt nicht über die erforderlichen Berechtigungen zum Herstellen von Verbindungen oder für den Zugriff auf Ressourcen außerhalb des SSIS-Pakets.
In den folgenden Szenarien wird das Paket möglicherweise nicht ausgeführt:
  • Der aktuelle Benutzer kann keine Geheimnisse aus dem Paket entschlüsseln. Dieses Szenario kann eintreten, wenn das aktuelle Konto oder das Ausführungskonto nicht mit dem ursprünglichen Paketersteller übereinstimmen und die Einstellung der ProtectionLevel-Eigenschaft für das Paket nicht zulässt, dass der aktuelle Benutzer Geheimnisse im Paket entschlüsselt.
  • Eine SQL Server-Verbindung, die integrierte Sicherheit verwendet, kann nicht hergestellt werden, weil der aktuelle Benutzer nicht über die erforderlichen Berechtigungen verfügt.
  • Beim Dateizugriff treten Fehler auf, weil der aktuelle Benutzer nicht über die erforderlichen Berechtigungen zum Schreiben in die Dateifreigabe verfügt, auf die der Verbindungs-Manager zugreift. Dieses Szenario kann beispielsweise bei Textprotokollanbietern eintreten, die keinen Benutzernamen und kein Kennwort verwenden. Es kann auch bei Tasks eintreten, die vom Dateiverbindungs-Manager abhängig sind, beispielsweise bei einem SSIS-Dateisystemtask.
  • Eine registrierungsbasierte SSIS-Paketkonfiguration verwendet die HKEY_CURRENT_USER-Registrierungsschlüssel. Die HKEY_CURRENT_USER-Registrierungsschlüssel sind benutzerspezifisch.
  • Ein Task oder ein Verbindungs-Manager setzt voraus, dass das aktuelle Benutzerkonto über die richtigen Berechtigungen verfügt.
Methode 1: Verwenden eines Proxykontos für den SQL Server-Agent
Erstellen Sie ein Proxykonto für den SQL Server-Agent. Dieses Proxykonto muss Anmeldeinformationen verwenden, mit denen der SQL Server-Agent den Auftrag als das Konto, mit dem das Paket erstellt wurde, oder als Konto mit den erforderlichen Berechtigungen ausführen kann.

Diese Methode ist zum Entschlüsseln von Geheimnissen geeignet und wird den wichtigsten Benutzeranforderungen gerecht. Die Methode ist möglicherweise jedoch nur bedingt erfolgreich, da die Benutzerschlüssel für das SSIS-Paket den aktuellen Benutzer und den aktuellen Computer enthalten. Wenn Sie das Paket auf einen anderen Computer verschieben, kann der Fehler bei dieser Methode dennoch auftreten, obwohl der Auftragsschritt das richtige Proxykonto verwendet.


Methode 2: Festlegen der „ProtectionLevel“-Eigenschaft des SSIS-Pakets auf „ServerStorage“
Ändern Sie die ProtectionLevel-Eigenschaft des SSIS-Pakets in „ServerStorage“. Mit dieser Einstellung wird das Paket in einer SQL Server-Datenbank gespeichert und die Zugriffssteuerung über SQL Server-Datenbankrollen ermöglicht.

Methode 3: Festlegen der „ProtectionLevel“-Eigenschaft des SSIS-Pakets auf „EncryptSensitiveWithPassword“
Ändern Sie die ProtectionLevel-Eigenschaft des SSIS-Pakets in „EncryptSensitiveWithPassword“. Bei dieser Einstellung wird für die Verschlüsselung ein Kennwort verwendet. Anschließend können Sie die Befehlszeile für den SQL Server-Agentauftragsschritt ändern und dieses Kennwort hinzufügen.


Methode 4: Verwenden von SSIS-Paketkonfigurationsdateien
Verwenden Sie SSIS-Paketkonfigurationsdateien, um vertrauliche Informationen zu speichern, und speichern Sie dann die Konfigurationsdateien in einem gesicherten Ordner. Anschließend können Sie die ProtectionLevel-Eigenschaft in „DontSaveSensitive“ ändern, sodass das Paket nicht verschlüsselt wird und nicht versucht, Geheimnisse im Paket zu speichern. Beim Ausführen des SSIS-Pakets werden die erforderlichen Informationen aus der Konfigurationsdatei geladen. Stellen Sie sicher, dass die Konfigurationsdateien angemessen geschützt sind, falls sie vertrauliche Informationen enthalten.


Methode 5: Erstellen einer Paketvorlage
Erstellen Sie als langfristige Lösung eine Paketvorlage mit einer Schutzebene, die von der Standardeinstellung abweicht. In zukünftigen Paketen tritt das Problem nicht mehr auf.

Status


Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen


Schritte zum Reproduzieren des Problems

  1. Melden Sie sich als Benutzer an, der nicht Mitglied der Gruppe „SQLServer2005SQLAgentUser“ ist. Sie können beispielsweise einen lokalen Benutzer erstellen.
  2. Erstellen Sie ein SSIS-Paket, und fügen Sie einen „ExecuteSQL“-Task hinzu. Verwenden Sie mit der folgenden Zeichenfolge einen OLE DB-Verbindungs-Manager für die lokale MSDB-Datei: "Windows Authentication" -SQLSourceType: "Direct Input" -SQLStatement: "sp_who"
  3. Führen Sie das Paket aus, um sicherzustellen, dass es erfolgreich ausgeführt wird.
  4. Beachten Sie, dass die ProtectionLevel-Eigenschaft auf „EncryptSensitiveWithPassword“ festgelegt ist.
  5. Erstellen Sie einen SQL Server-Agentauftrag und einen Auftragsschritt. Klicken Sie in der Liste Ausführen als auf SQL Server-Agent-Dienst, um den Auftragsschritt auszuführen.
Der Auftragsverlauf des SQL Server-Agents enthält Informationen etwa folgender Art:

Entschlüsseln von Geheimnissen im Paket

Die Standardeinstellung für die ProtectionLevel-Eigenschaft des SSIS-Pakets lautet „EncryptSensitiveWithUserKey“. Beim Speichern des Pakets verschlüsselt SSIS nur die Teile des Pakets, die als „vertraulich“ gekennzeichnete Eigenschaften enthalten, z. B. Kennwörter, Benutzernamen und Verbindungszeichenfolgen. Beim erneuten Laden des Pakets muss der aktuelle Benutzer daher die Verschlüsselungsanforderungen erfüllen, damit die vertraulichen Eigenschaften entschlüsselt werden. Zum Laden des Pakets muss der aktuelle Benutzer die Verschlüsselungsanforderungen jedoch nicht erfüllen. Wenn Sie das Paket aus einem SQL Server-Agentauftragsschritt ausführen, ist das Konto „SQL Server-Agent-Dienst“ das Standardkonto. Bei diesem Standardkonto handelt es sich mit großer Wahrscheinlichkeit um einen anderen Benutzer als den Paketersteller. Daher kann der SQL Server-Agentauftragsschritt zwar geladen und gestartet werden, aber das Paket verursacht einen Fehler, da keine Verbindung hergestellt werden kann. Beispielsweise kann das Paket keine OLE DB- oder FTP-Verbindung herstellen. Das Paket verursacht einen Fehler, weil die für die Verbindung benötigten Anmeldeinformationen nicht entschlüsselt werden können.


Wichtig Berücksichtigen Sie bei der Ermittlung der auf jedem Computer benötigten und verwendeten Konten den Entwicklungsprozess und die Umgebung. Die Einstellung „EncryptSensitiveWithUserKey“ der ProtectionLevel-Eigenschaft ist leistungsstark. Sie sollte nicht als negativ eingeschätzt werden, nur weil sie zunächst Komplikationen bei der Bereitstellung verursacht. Sie können die Pakete verschlüsseln, wenn Sie mit einem entsprechenden Konto angemeldet sind. Sie können auch „Dtutil.exe“, ein SSIS-Hilfsprogramm für die Eingabeaufforderung, verwenden, um die Schutzebenen mithilfe einer CMD-Datei und des SQL Server-Agentbefehlssubsystems zu ändern. Gehen Sie beispielsweise wie folgt vor. Da Sie das Hilfsprogramm „Dtutil.exe“ in Batchdateien und Schleifen verwenden können, können Sie diese Schritte für mehrere Pakete gleichzeitig ausführen.
  1. Ändern Sie das Paket, das Sie mit einem Kennwort verschlüsseln möchten.
  2. Verwenden Sie das Hilfsprogramm „Dtutil.exe“ über einen Schritt eines SQL Server-Agentauftrags vom Typ Betriebssystem (CmdExec), um die ProtectionLevel-Eigenschaft in „EncryptSensitiveWithUserKey“ zu ändern. Bei diesem Prozess wird das Paket unter Verwendung des Kennworts entschlüsselt und anschließend erneut verschlüsselt. Zur Verschlüsselung des Pakets wird der Benutzerschlüssel gemäß der Einstellung aus dem SQL Server-Agentauftragsschritt in der Liste Ausführen als verwendet.

    Hinweis Da der Schlüssel den Benutzer- und den Computernamen enthält, ist diese Methode beim Verschieben des Pakets auf einen anderen Computer möglicherweise wenig wirkungsvoll.

Sicherstellen, dass detaillierte Fehlerinformationen zu dem SSIS-Paketfehler vorliegen

Anstatt mit dem Auftragsverlauf des SQL Server-Agents mit seinen begrenzten Details können Sie mithilfe der SSIS-Protokollierung sicherstellen, dass Sie über Informationen zu dem SSIS-Paketfehler verfügen. Sie können das Paket auch mit dem „exec“-Subsystembefehl anstatt mit dem SSIS-Subsystembefehl ausführen.

Informationen zur SSIS-Protokollierung

Mit der SSIS-Protokollierung und mit Protokollanbietern können Sie Details zur Paketausführung und zu Fehlern erfassen. Standardmäßig protokolliert das Paket keine Informationen. Sie müssen das Paket für die Protokollierung konfigurieren. Wenn Sie das Paket für die Protokollierung von Informationen konfigurieren, werden detaillierte Informationen wie die folgenden angezeigt. In diesem Fall sehen Sie, dass es sich um ein Problem mit unzureichenden Berechtigungen handelt:

OnError,DOMAINNAME,DOMAINNAME\USERNAME,FTP Task,{C73DE41C-D0A6-450A-BB94-DF6D913797A1},{2F0AF5AF-2FFD-4928-88EE-1B58EB431D74},4/28/2006 1:51:59 PM,4/28/2006 1:51:59 PM,-1073573489,0x,Mithilfe von „FTP-Verbindungs-Manager“ kann keine Verbindung mit dem FTP-Server hergestellt werden.

OnError,DOMAINNAME,DOMAINNAME\USERNAME,Execute SQL Task,{C6C7286D-57D4-4490-B12D-AC9867AE5762},{F5761A49-F2F9-4575-9E2B-B3D381D6E1F3},4/28/2006 4:07:00 PM,4/28/2006 4:07:00 PM,-1073573396,0x,Fehler beim Abrufen der „user01.msdb“-Verbindung. Die Verbindung ist möglicherweise nicht ordnungsgemäß konfiguriert, oder Sie verfügen nicht über die erforderlichen Berechtigungen für die Verbindung.

Informationen zum „exec“-Subsystembefehl und zur Ausgabe

Mithilfe des „exec“-Subsystembefehls können Sie der SSIS-Befehlszeile Befehlszeilenoptionen für eine ausführliche Konsolenprotokollierung hinzufügen, um die ausführbare SSIS-Befehlszeilendatei „Dtexec.exe“ aufzurufen. Außerdem können Sie das Auftragsfeature „Erweitert“ der Ausgabedatei verwenden. Mithilfe der Option Schrittausgabe in Verlauf einschließen können Sie die Protokollinformationen in eine Datei oder in den Auftragsverlauf des SQL Server-Agents umleiten.

Beispiel für eine gültige Befehlszeile:
 
dtexec.exe /FILE "C:\_work\SSISPackages\ProtectionLevelTest\ProtectionLevelTest\AgentTesting.dtsx" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF  /REPORTING V  /CONSOLELOG NCOSGXMT 


Die Protokollierung mit „/console“ gibt Details etwa folgender Art zurück:
 
Error: 2006-04-27 18:13:34.76   Code: 0xC0202009   Source: AgentTesting Connection manager "(local).msdb"   Description: An OLE DB error has occurred. Error code: 0x80040E4D.An OLE DB record is available.  Source: "Microsoft SQL Native Client"  Hresult: 0x80040E4D  Description: "Login failed for user 'DOMAINNAME\username'.".End Error 
 
Error: 2006-04-28 13:51:59.19   Code: 0xC0016016   Source:     Description: Failed to decrypt protected XML node "DTS:Property" with error 0x80070002 "The system cannot find the file specified.". You may not be authorized to access this information. This error occurs when there is a cryptographic error. Verify that the correct key is available.End Error 
 
Log:     Name: OnError     Computer: COMPUTERNAME     Operator: DOMAINNAME\username     Source Name: Execute SQL Task     Source GUID: {C6C7286D-57D4-4490-B12D-AC9867AE5762}     Execution GUID: {7AFE3D9E-5F73-42F0-86FE-5EFE264119C8}     Message: Failed to acquire connection "(local).msdb". Connection may not be configured correctly or you may not have the right permissions on this connection.     Start Time: 2006-04-27 18:13:34     End Time: 2006-04-27 18:13:34End Log 

Informationsquellen


Weitere Informationen zu einem ähnlichen Problem finden Sie im folgenden Artikel der Microsoft Knowledge Base:

904800 Wenn Sie versuchen, ein SQL Server 2005 Integration Services-Paket in SQL Server 2005 auszuführen, wird die Fehlermeldung „Fehler beim Laden“ angezeigt

Weitere Informationen zur Verwendung des Hilfsprogramms „Dtutil.exe“ bei Bachvorgängen finden Sie im folgenden Artikel der Microsoft Knowledge Base:

906562 Verwenden des Hilfsprogramms „dtutil“ („Dtutil.exe“) zum Festlegen der Schutzebene eines Batches von SSIS-Paketen (SQL Server Integration Services) in SQL Server 2005

Weitere Informationen zum Erstellen von Paketvorlagen finden Sie im folgenden Artikel der Microsoft Knowledge Base:

908018 Erstellen einer Paketvorlage in SQL Server Business Intelligence Development Studio



Weitere Informationen zur Sicherheit von SSIS-Paketen und zur ProtectionLevel-Eigenschaft finden Sie im Thema „Sicherheitsüberlegungen zu Integration Services“ in SQL Server 2005 Books Online.

Unglücklicherweise sind sich die Benutzer nicht dessen bewusst, dass die Standardeinstellungen für Agentauftragsschritte diesen Zustand verursachen. Weitere Informationen zu SQL Server-Agentproxys und SSIS finden Sie in den folgenden Themen in SQL Server 2005 Books Online:
  • Planen der Paketausführung im SQL Server-Agent
  • Erstellen von SQL Server-Agent-Proxys