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

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 918992 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Einführung

In diesem Artikel wird die Vorgehensweise zum Übertragen von Benutzernamen und Kennwörtern zwischen Instanzen von Microsoft SQL Server 2005, Microsoft SQL Server 2008 und Microsoft SQL Server 2012 auf verschiedenen Servern beschrieben.

Weitere Informationen zum Übertragen von Benutzernamen und Kennwörtern zwischen Instanzen von anderen Versionen von SQL Server finden Sie in folgendem Artikel der Microsoft Knowledge Base:
246133 Übertragen von Benutzernamen und Kennwörtern zwischen Instanzen von SQL Server

Weitere Informationen

In diesem Artikel sind Server A und Server B verschiedene Server. Sowohl auf Server A als auch auf Server B wird SQL Server 2005 ausgeführt.

Hinweis Diese Informationen gelten auch für SQL Server 2008 und SQL Server 2012.

Nachdem Sie eine Datenbank von der Instanz von SQL Server auf Server A auf die Instanz von SQL Server auf Server B verschoben haben, können sich Benutzer unter Umständen nicht an der Datenbank auf Server B anmelden. Außerdem wird möglicherweise folgende Fehlermeldung angezeigt:
Fehler bei der Anmeldung für den Benutzer 'Benutzername'. (Microsoft SQL Server, Fehler: 18456)
Dieses Problem tritt auf, weil Sie die Benutzernamen und Kennwörter nicht von der Instanz von SQL Server auf Server A auf die Instanz von SQL Server auf Server B übertragen haben.

Gehen Sie je nach Ihrer speziellen Situation folgendermaßen vor, um die Benutzernamen zu übertragen.

Methode 1: Anmelden mit dem Kennwort der Version vor SQL Server 2000

Bitten Sie den Benutzer, sich an dem Server, auf dem SQL Server ausgeführt wird, mit dem Benutzernamen der Version vor SQL Server 2000 anzumelden, um dieses Problem zu beheben.

Hinweis Das Kennworthashing wird automatisch aktualisiert, wenn sich der Benutzer mit dem Kennwort der Version vor SQL Server 2000 anmeldet.

Methode 2: Zurücksetzen des Kennworts in SQL Server

Setzen Sie das Kennwort in SQL Server zurück, und geben Sie anschließend den Benutzernamen in ein Skript aus, um dieses Problem zu beheben.

Hinweis Wenn Sie das Kennwort zurücksetzen, wird der Algorithmus für das Kennworthashing verwendet.

Methode 3: Erstellen eines Skripts mit einem leeren Kennwort

Gehen Sie folgendermaßen vor, um ein Anmeldeskript mit einem leeren Kennwort zu erstellen:
  1. Starten Sie SQL Server Management Studio auf Server A, und stellen Sie eine Verbindung zu der Instanz von SQL Server her, von der Sie die Datenbank verschoben haben.
  2. Öffnen Sie ein neues Abfrage-Editor-Fenster, und führen Sie folgendes 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 Datenbank master. Die Prozeduren haben die Namen sp_hexadecimall und sp_help_revlogin.
  3. Führen Sie die folgende Anweisung aus: 
    EXEC sp_help_revlogin
    Das Ausgabeskript, das von der gespeicherten Prozedur sp_help_revlogin erzeugt wird, ist das Anmeldeskript. Das Anmeldeskript erstellt die Benutzernamen, die die ursprüngliche Sicherheitskennung (SID, Security Identifier) und das ursprüngliche Kennwort haben.
  4. Starten Sie SQL Server Management Studio auf Server B, und stellen Sie eine Verbindung zu der Instanz von SQL Server her, auf die Sie die Datenbank verschoben haben.

    Wichtig Lesen Sie die Informationen im Abschnitt "Anmerkungen", bevor Sie mit Schritt 5 fortfahren.
  5. Öffnen Sie ein neues Abfrage-Editor-Fenster, und führen Sie das Ausgabeskript aus, das in Schritt 3 erzeugt wurde.

Anmerkungen

Lesen Sie die folgenden Informationen, bevor Sie das Ausgabeskript auf der Instanz auf Server B ausführen:
  • Wenn Sie versuchen, einen neuen Benutzernamen für SQL Server 2012 anhand des Skripts für den Benutzernamen einer Version vor SQL Server 2000 zu erstellen, wird der folgende Fehler angezeigt:
    Meldung 15021, Ebene 16, Status 2, Zeile 1
    Ungültiger Wert für Parameter PASSWORD. Geben Sie einen gültigen Parameterwert an.
    Hinweis Dieser Fehler wird in SQL Server 2012 aufgrund des 16-Byte-Kennorthashwertes angezeigt, der für die Anweisungen CREATE LOGIN und ALTER LOGIN angegeben wurde.

    Erstellen Sie einen Benutzernamen mit einem leeren Kennwort, um dieses Problem auf einem Server mit SQL Server 2012 zu beheben. Führen Sie dazu das folgende Skript aus:
    CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC, 
    DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF

    Wenn Sie den Benutzernamen mit einem leeren Kennwort erstellt haben, kann der Benutzer das Kennwort beim nächsten Anmeldeversuch ändern.
  • Ein Kennwort kann auf drei Arten hashcodiert werden:
    • VERSION_LEGACY: Dieser Hash ist ein 16-Byte-Hash einer Version vor SQL Server 2000.
    • VERSION_SHA1: Dieser Hash wird mit dem SHA1-Algorithmus erzeugt und in SQL Server 2000 bis SQL Server 2008 R2 verwendet.
    • VERSION_SHA2: Dieser Hash wird mit dem SHA2-512-Algorithmus erzeugt und in SQL Server 2012 verwendet.
  • In SQL Server 2008 R1 und früheren Versionen wurden Kennworthashes aus Versionen vor SQL Server 2000 unterstützt. Wenn ein Benutzer sich mit einem Kennwort mit einem Hash einer Version vor SQL Server 2000 angemeldet hat, wurde der Hash auf das SHA1-Kennworthash-Verfahren aktualisiert.
  • Wenn ein Benutzer mit einem Kennwort mit einem Hash aus einer Version vor SQL Server 2000 auf einem Server vorhanden ist, auf dem SQL Server 2008 R2 ausgeführt wird, dann hat sich der Benutzer nicht an diesem Server angemeldet.
  • Überprüfen Sie das Ausgabeskript sorgfältig. Wenn sich Server A und Server B in verschiedenen Domänen befinden, müssen Sie das Ausgabeskript ändern. Anschließend müssen Sie den ursprünglichen Domänennamen in den CREATE LOGIN-Anweisungen durch den neuen Domänennamen ersetzen. Die integrierten Benutzernamen, denen in der neuen Domäne Zugriff gewährt wird, haben nicht dieselbe SID wie die Benutzernamen in der ursprünglichen Domäne. Deshalb verwaisen Benutzer in Bezug auf diese Benutzernamen. Weitere Informationen zur Problembehandlung bei verwaisten Benutzern finden Sie in folgendem Artikel der Microsoft Knowledge Base:
    240872 Lösen von Zugriffsproblemen, wenn eine Datenbank auf einen anderen SQL-Server verschoben wird
    Wenn sich Server A und Server B in derselben Domäne befinden, wird dieselbe SID verwendet. Daher können Benutzer kaum verwaisen.
  • Im Ausgabeskript werden die Benutzernamen mit dem verschlüsselten Kennwort erstellt. Und zwar aufgrund des Arguments HASHED in der Anweisung CREATE LOGIN. Dieses Argument gibt an, dass das Kennwort, das nach dem Argument PASSWORD angegeben wird, bereits hashcodiert ist.
  • Standardmäßig kann nur ein Mitglied der festen Serverrolle sysadmin eine SELECT-Anweisung aus der Sicht sys.server_principals ausführen. Die Benutzer können das Ausgabeskript nur erstellen oder ausführen, wenn ein Mitglied der festen Serverrolle sysadmin ihnen die erforderlichen Berechtigungen erteilt.
  • Durch die Vorgehensweise in diesem Artikel werden die Standarddatenbankinformationen für einen bestimmten Benutzernamen nicht übertragen. Das liegt daran, dass die Standarddatenbank auf Server B möglicherweise nicht immer vorhanden ist. Um die Standarddatenbank für einen Benutzernamen zu definieren, verwenden Sie die Anweisung ALTER LOGIN, und übergeben Sie den Benutzernamen und die Standarddatenbank als Argumente.
  • Server A ohne Unterscheidung der Groß-/Kleinschreibung und Server B mit Unterscheidung der Groß-/Kleinschreibung: Bei der Sortierreihenfolge von Server A wird unter Umständen nicht zwischen Groß- und Kleinschreibung unterschieden, während die Groß-/Kleinschreibung bei der Sortierreihenfolge von Server B möglicherweise relevant ist. In diesem Fall müssen Benutzer die Kennwörter in Großbuchstaben eingeben, nachdem Sie die Benutzernamen und Kennwörter auf die Instanz auf Server B übertragen haben.

    Server A mit Unterscheidung der Groß-/Kleinschreibung und Server B ohne Unterscheidung der Groß-/Kleinschreibung: Bei der Sortierreihenfolge von Server A wird unter Umständen zwischen Groß- und Kleinschreibung unterschieden, während die Groß-/Kleinschreibung bei der Sortierreihenfolge von Server B möglicherweise nicht relevant ist. In diesem Fall können sich Benutzer nicht mit den Benutzernamen und Kennwörtern anmelden, die Sie auf die Instanz auf Server B übertragen, es sei denn, eine der folgenden Bedingungen trifft zu:
    • Die ursprünglichen Kennwörter enthalten keine Buchstaben.
    • Alle Buchstaben in den ursprünglichen Kennwörtern sind Großbuchstaben.
    Groß- und Kleinschreibung auf beiden Servern: Bei der Sortierreihenfolge von Server A und Server B wird zwischen Groß- und Kleinschreibung unterschieden, oder bei beiden Servern ist das nicht der Fall. In diesen Fällen treten keine Probleme auf.
  • Ein Benutzername, der in der Instanz auf Server B bereits vorhanden ist, kann einen Namen haben, der mit einem Namen im Ausgabeskript identisch ist. In diesem Fall wird folgende Fehlermeldung angezeigt, wenn Sie das Ausgabeskript auf der Instanz auf Server B ausführen:
    Meldung 15025, Ebene 16, Status 1, Zeile 1
    Der Serverprinzipal 'Benutzername' ist bereits vorhanden.
    Entsprechend kann ein Benutzername, der in der Instanz auf Server B bereits vorhanden ist, eine SID haben, die mit einer SID im Ausgabeskript identisch ist. In diesem Fall wird folgende Fehlermeldung angezeigt, wenn Sie das Ausgabeskript auf der Instanz auf Server B ausführen:
    Meldung 15433, Ebene 16, Status 1, Zeile 1
    Der bereitgestellte sid-Parameter wird verwendet.
    Deshalb müssen Sie folgendermaßen vorgehen:
    1. Überprüfen Sie das Ausgabeskript sorgfältig.
    2. Überprüfen Sie den Inhalt der Sicht sys.server_principals in der Instanz auf Server B.
    3. Behandeln Sie diese Fehlermeldungen entsprechend.
  • In SQL Server 2005 wird mit der SID für einen Benutzernamen der Zugriff auf Datenbankebene implementiert. Ein Benutzername kann verschiedene SIDs in verschiedenen Datenbanken auf einem Server haben. In diesem Fall kann der Benutzername nur auf die Datenbank zugreifen, die die SID enthält, die der SID in der Sicht sys.server_principals entspricht. Dieses Problem kann auftreten, wenn die zwei Datenbanken von zwei verschiedenen Servern zusammengeführt werden. Entfernen Sie zur Behebung dieses Problems den Benutzernamen manuell mit der Anweisung DROP USER aus der Datenbank mit der nicht übereinstimmenden SID. Fügen Sie den Benutzernamen anschließend mit der Anweisung CREATE USER wieder hinzu.

Informationsquellen

Weitere Informationen zur Problembehandlung bei verwaisten Benutzern finden Sie auf folgender Website des Microsoft Developer Network (MSDN): Problembehandlung bei verwaisten Benutzern

Weitere Informationen zur Anweisung CREATE LOGIN finden Sie auf folgender MSDN-Website: CREATE LOGIN (Transact-SQL)

Weitere Informationen zur Anweisung ALTER LOGIN finden Sie auf folgender MSDN-Website: ALTER LOGIN (Transact-SQL)

Eigenschaften

Artikel-ID: 918992 - Geändert am: Freitag, 12. Juli 2013 - Version: 4.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2012 Standard
  • Microsoft SQL Server 2012 Developer
  • Microsoft SQL Server 2012 Enterprise
Keywords: 
kbsqlsetup kbexpertiseadvanced kbhowto kbinfo KB918992
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com