Übertragen von Anmeldenamen und Kennwörtern zwischen Instanzen von SQL Server

In diesem Artikel wird beschrieben, wie Sie die Anmeldungen und Kennwörter zwischen verschiedenen Instanzen von SQL Server übertragen, die unter Windows installiert werden.

Original Version des Produkts:   SQL Server
Ursprüngliche KB-Nummer:   918992

Einführung

In diesem Artikel wird beschrieben, wie Sie die Anmeldungen und Kennwörter zwischen verschiedenen Instanzen von Microsoft SQL Server übertragen.

Hinweis

Die Instanzen befinden sich möglicherweise auf demselben Server oder auf unterschiedlichen Servern, und ihre Versionen können unterschiedlich sein.

Weitere Informationen

In diesem Artikel sind Server a und Server B unterschiedliche Server.

Nachdem Sie eine Datenbank von der Instanz von SQL Server auf Server a auf die Instanz von SQL Server auf Server b umgestellt haben, können sich Benutzer möglicherweise nicht bei der Datenbank auf Server b anmelden. Darüber hinaus erhalten Benutzer möglicherweise die folgende Fehlermeldung:

Fehler bei der Anmeldung für Benutzer 'myuser'. (Microsoft SQL Server, Fehler: 18456)

Dieses Problem tritt auf, weil Sie die Anmeldenamen und Kennwörter nicht von der Instanz von SQL Server auf Server a auf die Instanz von SQL Server auf Server B übertragen haben.

Hinweis

Die 18456-Fehlermeldung tritt auch aus anderen Gründen auf. Weitere Informationen zu diesen Ursachen und potenziellen Lösungen finden Sie unter MSSQLSERVER_18456.

Verwenden Sie eine der folgenden Methoden, um die Anmeldungen zu übertragen, je nach ihrer Situation.

  • Methode 1: Zurücksetzen des Kennworts auf dem Ziel SQL Server Computers (Server B)

    Um dieses Problem zu beheben, setzen Sie das Kennwort in SQL Server Computer zurück, und führen Sie dann eine Skripterstellung für die Anmeldung aus.

    Hinweis

    Der Kennwort-Hashalgorithmus wird verwendet, wenn Sie das Kennwort zurücksetzen.

  • Methode 2: übertragen von Anmeldungen und Kennwörtern auf den Zielserver (Server B) mithilfe von auf dem Quellserver generierten Skripts (Server A)

    1. Erstellen Sie gespeicherte Prozeduren, die zum Generieren erforderlicher Skripts zum Übertragen von Anmeldeinformationen und ihren Kennwörtern beitragen. Stellen Sie hierzu mit SQL Server Management Studio (SSMS) oder einem beliebigen anderen Client Tool eine Verbindung mit dem Server A her, und führen Sie das folgende Skript aus:

      USE master
      GO
      IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
      DROP PROCEDURE sp_hexadecimal
      GO
      CREATE PROCEDURE sp_hexadecimal
      @binvalue varbinary(256),
      @hexvalue varchar (514) OUTPUT
      AS
      DECLARE @charvalue varchar (514)
      DECLARE @i int
      DECLARE @length int
      DECLARE @hexstring char(16)
      SELECT @charvalue = '0x'
      SELECT @i = 1
      SELECT @length = DATALENGTH (@binvalue)
      SELECT @hexstring = '0123456789ABCDEF'
      WHILE (@i <= @length)
      BEGIN
      DECLARE @tempint int
      DECLARE @firstint int
      DECLARE @secondint int
      SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
      SELECT @firstint = FLOOR(@tempint/16)
      SELECT @secondint = @tempint - (@firstint*16)
      SELECT @charvalue = @charvalue +
      SUBSTRING(@hexstring, @firstint+1, 1) +
      SUBSTRING(@hexstring, @secondint+1, 1)
      SELECT @i = @i + 1
      END
      
      SELECT @hexvalue = @charvalue
      GO
      
      IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
      DROP PROCEDURE sp_help_revlogin
      GO
      CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
      DECLARE @name sysname
      DECLARE @type varchar (1)
      DECLARE @hasaccess int
      DECLARE @denylogin int
      DECLARE @is_disabled int
      DECLARE @PWD_varbinary varbinary (256)
      DECLARE @PWD_string varchar (514)
      DECLARE @SID_varbinary varbinary (85)
      DECLARE @SID_string varchar (514)
      DECLARE @tmpstr varchar (1024)
      DECLARE @is_policy_checked varchar (3)
      DECLARE @is_expiration_checked varchar (3)
      
      DECLARE @defaultdb sysname
      
      IF (@login_name IS NULL)
      DECLARE login_curs CURSOR FOR
      
      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
      sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
      ELSE
      DECLARE login_curs CURSOR FOR
      
      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
      sys.server_principals p LEFT JOIN sys.syslogins l
      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
      OPEN login_curs
      
      FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
      IF (@@fetch_status = -1)
      BEGIN
      PRINT 'No login(s) found.'
      CLOSE login_curs
      DEALLOCATE login_curs
      RETURN -1
      END
      SET @tmpstr = '/* sp_help_revlogin script '
      PRINT @tmpstr
      SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + '*/'
      PRINT @tmpstr
      PRINT ''
      WHILE (@@fetch_status <> -1)
      BEGIN
      IF (@@fetch_status <> -2)
      BEGIN
      PRINT ''
      SET @tmpstr = '-- Login: ' + @name
      PRINT @tmpstr
      IF (@type IN ( 'G', 'U'))
      BEGIN -- NT authenticated account/group
      
      SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
      END
      ELSE BEGIN -- SQL Server authentication
      -- obtain password and sid
      SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256))
      EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
      EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
      
      -- obtain password policy state
      SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
      SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
      
      SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
      
      IF ( @is_policy_checked IS NOT NULL )
      BEGIN
      SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
      END
      IF ( @is_expiration_checked IS NOT NULL )
      BEGIN
      SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
      END
      END
      IF (@denylogin = 1)
      BEGIN -- login is denied access
      SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
      END
      ELSE IF (@hasaccess = 0)
      BEGIN -- login exists but does not have access
      SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
      END
      IF (@is_disabled = 1)
      BEGIN -- login is disabled
      SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
      END
      PRINT @tmpstr
      END
      
      FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
      END
      CLOSE login_curs
      DEALLOCATE login_curs
      RETURN 0
      GO
      

      Hinweis

      Dieses Skript erstellt zwei gespeicherte Prozeduren in der Master Datenbank. Die Prozeduren werden sp_hexadecimal und sp_help_revlogin benannt.

    2. Wählen Sie im SSMS-Abfrage-Editor die Option Ergebnisse in Text aus.

    3. Führen Sie die folgende Anweisung im gleichen oder einem neuen Abfragefenster aus:

      EXEC sp_help_revlogin
      
    4. Das Ausgabeskript, das von der sp_help_revlogin gespeicherten Prozedur generiert wird, ist das Anmeldeskript. Dieses Anmeldeskript erstellt die Anmeldungen mit der ursprünglichen Sicherheits-ID (SID) und dem Originalkennwort.

Wichtig

Lesen Sie die Informationen im Abschnitt " Hinweise " weiter unten, bevor Sie mit der Implementierung der Schritte auf dem Zielserver fortfahren.

Schritte auf dem Zielserver (Server B)

Stellen Sie mit einem beliebigen Client Tool (wie SSMS) eine Verbindung mit Server B her, und führen Sie dann das in Schritt 4 (Output of) generierte Skript sp_helprevlogin von Server A aus.

Bemerkungen

Lesen Sie die folgenden Informationen, bevor Sie das Ausgabeskript für die Instanz auf Server B ausführen:

  • Ein Kennwort kann wie folgt gehasht werden:

    • VERSION_SHA1: Dieser Hash wird mithilfe des SHA1-Algorithmus generiert und wird in SQL Server 2000 bis SQL Server 2008 R2 verwendet.
    • VERSION_SHA2: Dieser Hash wird mithilfe des SHA2 512-Algorithmus generiert und wird in SQL Server 2012 und höheren Versionen verwendet.
  • Überprüfen Sie das Ausgabeskript sorgfältig. Wenn sich Server a und Server B in unterschiedlichen Domänen befinden, müssen Sie das Ausgabeskript ändern. Anschließend müssen Sie den ursprünglichen Domänennamen mithilfe des neuen Domänennamens in den Create Login-Anweisungen ersetzen. Die integrierten Anmeldungen, denen der Zugriff in der neuen Domäne gewährt wird, weisen nicht die gleiche SID wie die Anmeldungen in der ursprünglichen Domäne auf. Daher werden Benutzer aus diesen Anmeldungen verwaist. Weitere Informationen zum Auflösen dieser verwaisten Benutzer finden Sie unter Beheben von Berechtigungsproblemen beim Migrieren einer Datenbank zwischen Servern mit SQL Server.

    Wenn sich Server a und Server B in derselben Domäne befinden, wird dieselbe SID verwendet. Daher ist es unwahrscheinlich, dass Benutzer verwaist werden.

  • Im Ausgabeskript werden die Anmeldungen mithilfe des verschlüsselten Kennworts erstellt. Dies liegt an dem gehashten Argument in der CREATE LOGIN Anweisung. Dieses Argument gibt an, dass das Kennwort, das nach dem Kennwort-Argument eingegeben wird, bereits gehasht ist.

  • Standardmäßig kann nur ein Mitglied der festen Serverrolle sysadmin eine SELECT Anweisung aus der Ansicht ausführen sys.server_principals . Wenn ein Mitglied der festen Serverrolle sysadmin den Benutzern nicht die erforderlichen Berechtigungen erteilt, können die Benutzer das Ausgabeskript nicht erstellen oder ausführen.

  • In den Schritten in diesem Artikel werden die Standarddaten Bankinformationen für eine bestimmte Anmeldung nicht übertragen. Dies liegt daran, dass die Standarddatenbank auf Server B möglicherweise nicht immer vorhanden ist. Verwenden Sie zum Definieren der Standarddatenbank für eine Anmeldung die ALTER LOGIN Anweisung, indem Sie den Anmeldenamen und die Standarddatenbank als Argumente übergeben.

  • Sortieren von Bestellungen auf Quell-und Zielservern:

    • Server a ohne Berücksichtigung der groß -/Kleinschreibung und Unterscheidung nach Groß-/Kleinschreibung Server b: bei der Sortierreihenfolge von Server a kann die Groß-/Kleinschreibung nicht beachtet werden, und bei der Sortierreihenfolge von Server b kann die Groß-/Kleinschreibung beachtet werden. In diesem Fall müssen Benutzer die Kennwörter in Großbuchstaben eingeben, nachdem Sie die Anmeldeinformationen und die Kennwörter an die Instanz auf Server B übergeben haben.

    • Server B mit Unterscheidung nach Groß-/Kleinschreibung und Groß-/Kleinschreibung: Bei der Sortierreihenfolge von Server A kann die Groß-/Kleinschreibung beachtet werden, und bei der Sortierreihenfolge von Server B kann die Groß-/Kleinschreibung nicht beachtet werden. In diesem Fall können sich Benutzer nicht mithilfe der Anmeldenamen und der Kennwörter anmelden, die Sie an die Instanz auf Server B übertragen, es sei denn, eine der folgenden Bedingungen ist erfüllt:

      • Die ursprünglichen Kennwörter enthalten keine Buchstaben.
      • Alle Buchstaben in den ursprünglichen Kennwörtern sind groß geschriebene Buchstaben.
    • Unterscheidung nach Groß-/Kleinschreibung oder Groß-/Kleinschreibung auf beiden Servern: bei der Sortierreihenfolge von Server a und Server b kann die Groß-/Kleinschreibung beachtet werden, oder bei der Sortierreihenfolge von Server a und Server b kann die Groß-/Kleinschreibung nicht beachtet werden. In diesen Fällen treten für die Benutzer kein Problem auf.

  • Ein Anmeldename, der sich bereits in der Instanz auf Server B befindet, kann einen Namen aufweisen, der mit dem Namen im Ausgabeskript identisch ist. In diesem Fall wird die folgende Fehlermeldung angezeigt, wenn Sie das Ausgabeskript für die Instanz auf Server B ausführen:

    Msg 15025, Ebene 16, Status 1, Reihe 1
    Der Serverprinzipal "MyLogin" ist bereits vorhanden.

    Ähnlich kann eine Anmeldung, die sich bereits in der Instanz auf Server B befindet, eine SID aufweisen, die mit einer SID im Ausgabeskript identisch ist. In diesem Fall wird die folgende Fehlermeldung angezeigt, wenn Sie das Ausgabeskript für die Instanz auf Server B ausführen:

    Msg 15433, Ebene 16, Status 1, die angegebene SID des angegebenen Parameters wird verwendet.

    Daher müssen Sie folgende Schritte ausführen:

    1. Überprüfen Sie das Ausgabeskript sorgfältig.

    2. Untersuchen Sie den Inhalt der sys.server_principals Ansicht in der Instanz auf Server B.

    3. Beheben Sie diese Fehlermeldungen entsprechend.

      In SQL Server 2005 wird die sid für eine Anmeldung verwendet, um den Zugriff auf Datenbankebene zu implementieren. Eine Anmeldung kann unterschiedliche SIDs in unterschiedlichen Datenbanken auf einem Server aufweisen. In diesem Fall kann die Anmeldung nur auf die Datenbank zugreifen, die über die SID verfügt, die mit der SID in der Ansicht übereinstimmt sys.server_principals . Dieses Problem kann auftreten, wenn die beiden Datenbanken von verschiedenen Servern kombiniert werden. Um dieses Problem zu beheben, entfernen Sie die Anmeldung manuell aus der Datenbank, die eine SID-Übereinstimmung mit der DROP USER-Anweisung aufweist. Fügen Sie dann die Anmeldung mit der-Anweisung erneut hinzu CREATE USER .

Informationsquellen