Trasferimento di accessi e password tra istanze di SQL Server

Traduzione articoli Traduzione articoli
Identificativo articolo: 918992 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

INTRODUZIONE

In questo articolo viene descritto come trasferire gli account di accesso e le password tra istanze di Microsoft SQL Server 2005 Microsoft SQL Server 2008 e di Microsoft SQL Server 2012 su server diversi.

Per ulteriori informazioni sul trasferimento di accessi e password tra istanze di altre versioni di SQL Server, fare clic sul numero dell'articolo riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base:
246133Trasferimento di accessi e password tra istanze di SQL Server

Informazioni

In questo articolo, il server a e b sono diversi server. Inoltre sia il server a server b sono in esecuzione SQL Server 2005.

Nota Queste informazioni si applicano anche per il 2008 SQL Server e SQL Server 2012.

Dopo aver spostato un database dall'istanza di SQL Server su un server per l'istanza di SQL Server nel server B, gli utenti potrebbero essere in grado di accedere al database sul server B. inoltre, gli utenti potrebbero ricevere il seguente messaggio di errore:
Accesso non riuscito per l'utente 'MyUser'. (Microsoft SQL Server, errore: 18456)
Questo problema si verifica perchÚ Ŕ non Ŕ stato trasferire gli account di accesso e le password dall'istanza di SQL Server sul server all'istanza di SQL Server sul server B.

Per trasferire gli account di accesso, utilizzare uno dei metodi seguenti, a seconda della situazione.

Metodo 1: L'accesso utilizzando la password di pre-SQL Server 2000

Per risolvere il problema, chiedere all'utente di accedere al server che esegue SQL Server utilizzando l'account di accesso di pre-SQL Server 2000.

Nota L'hashing della password viene aggiornato automaticamente quando l'utente accede utilizzando la password di pre-SQL Server 2000.

Metodo 2: Reimpostare la password in SQL Server

Per risolvere questo problema, reimpostare la password in SQL Server e quindi uno script di accesso.

Nota Quando si reimposta la password, viene utilizzato l'algoritmo di hash di password.

Metodo 3: Creare un registro in uno script che dispone di una password vuota

Per creare un registro in uno script che ha una password vuota, attenersi alla seguente procedura:
  1. Su un server, avviare SQL Server Management Studio e quindi connettersi all'istanza di SQL Server da cui Ŕ stato spostato il database.
  2. Aprire una nuova finestra dell'Editor di Query e quindi eseguire lo script seguente.
    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
    


    NotaQuesto script crea due stored procedure nel database master . Le procedure sono denominate sp_hexadecimal e sp_help_revlogin.
  3. Eseguire la seguente istruzione:
    EXEC sp_help_revlogin
    Lo script di output che genera la routine sp_help_revlogin archiviato Ŕ lo script di accesso. Questo script di accesso consente di creare gli account di accesso con l'identificatore di protezione (SID) originale e la password originale.
  4. Nel server B, avviare SQL Server Management Studio e connettersi all'istanza di SQL Server in cui Ŕ spostato il database.

    Importante Prima di passare al passaggio 5, esaminare le informazioni nella sezione "Osservazioni".
  5. Aprire una nuova finestra dell'Editor di Query e quindi eseguire lo script di output generato nel passaggio 3.

Note

Esaminare le informazioni seguenti prima di eseguire lo script di output nell'istanza del server b:
  • Se si tenta di creare un nuovo account di accesso SQL Server 2012 utilizzando un account di accesso 2000 di pre-SQL Server inserita nello script, Ŕ possibile che venga visualizzato il seguente errore:
    MSG 15021, livello 16, stato 2, riga 1
    Valore specificato per il parametro PASSWORD non valido. Specificare un valore di parametro valido.
    Nota Questo errore pu˛ essere visualizzato nel 2012 SQL Server a causa l'hash della password a 16 byte che vengono fornita le istruzioni CREATE LOGIN e ALTER LOGIN.

    Per risolvere il problema su un server che esegue SQL Server 2012, creare un account di accesso con una password vuota. Per effettuare questa operazione, eseguire lo script seguente:
    CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC, 
    DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF

    Dopo aver creato l'account di accesso con una password vuota, l'utente pu˛ modificare la password al successivo tentativo di accesso.
  • Una password pu˛ essere generato un hash in tre modi:
    • VERSION_LEGACY: questo hash Ŕ un hash di 2000 pre-SQL Server a 16 byte.
    • VERSION_SHA1: questo hash viene generato utilizzando l'algoritmo SHA1 e utilizzato in SQL Server 2000 attraverso SQL Server 2008 R2.
    • VERSION_SHA2: questo hash viene generato utilizzando l'algoritmo SHA1 512 e viene utilizzato in SQL Server 2012.
  • In SQL Server 2008 R1 e nelle versioni precedenti, gli hash delle password di pre-SQL Server 2000 erano supportati. Quando un utente Ŕ connesso utilizzando una password che viene utilizzato un hash di pre-SQL Server 2000, l'hash Ŕ stato aggiornato per utilizzare l'hash SHA1 della password.
  • Se un utente che dispone di una password che utilizza l'hash di pre-SQL Server 2000 presente su un server che esegue SQL Server 2008 R2, ci˛ significa che l'utente ha non connesso al server.
  • Esaminare attentamente lo script di output. Se il server a e b si trovano in domini diversi, Ŕ necessario modificare lo script di output. Quindi, Ŕ necessario sostituire il nome di dominio originale utilizzando il nuovo nome di dominio nelle istruzioni CREATE LOGIN. Gli account di accesso integrato che Ŕ consentito l'accesso nel nuovo dominio non Ŕ necessario lo stesso SID degli account di accesso del dominio originale. Pertanto, gli utenti vengono isolati da questi account di accesso. Per ulteriori informazioni su come risolvere questi utenti isolati, fare clic sul numero dell'articolo riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base:
    240872Come risolvere i problemi di autorizzazione quando si sposta un database tra server che eseguono SQL Server
    Se il server a e b sono nello stesso dominio, viene utilizzato lo stesso SID. Gli utenti sono pertanto improbabili isolate.
  • Nello script di output vengono creati gli account di accesso utilizzando la password crittografata. Ci˛ Ŕ dovuto l'argomento HASHED nell'istruzione CREATE LOGIN. Questo argomento specifica che la password inserita dopo l'argomento PASSWORD giÓ viene eseguito l'hashing.
  • Per impostazione predefinita, solo un membro del ruolo predefinito del server sysadmin pu˛ eseguire un'istruzione SELECT dalla vista sys.server_principals . A meno che non fissa di membri di sysadmin il ruolo server concede le autorizzazioni necessarie per gli utenti, gli utenti non possono creare o eseguire lo script di output.
  • La procedura descritta in questo articolo non trasferisce le informazioni del database predefinito per un account di accesso. Infatti, il database predefinito potrebbe non essere presente sul server B. Per definire il database predefinito per un account di accesso, utilizzare l'istruzione ALTER LOGIN passando il nome di accesso e il database predefinito come argomenti.
  • Distinzione server a e distinzione B: l'ordine dei server a potrebbe essere distinzione e l'ordinamento del server b pu˛ essere maiuscole e minuscole. In questo caso, gli utenti devono digitare la password in lettere maiuscole dopo il trasferimento degli account di accesso e le password per l'istanza nel server B.

    A di server tra maiuscole e minuscole e distinzione B: l'ordine dei server a potrebbe essere maiuscole e minuscole e l'ordinamento del server b pu˛ essere maiuscole e minuscole. In questo caso, gli utenti non possono accedere utilizzando l'account di accesso e le password da trasferire all'istanza nel server B, a meno che non Ŕ vera una delle seguenti condizioni:
    • La password originale non contenere alcuna lettera.
    • Tutte le lettere nelle password originali sono lettere maiuscole.
    Maiuscole o su entrambi i server: l'ordine dei server a e b del server pu˛ essere maiuscole e minuscole o l'ordine dei server a e b del server pu˛ essere maiuscole e minuscole. In questi casi, gli utenti non si verificano un problema.
  • Un account di accesso Ŕ giÓ nell'istanza del server b pu˛ avere un nome che Ŕ lo stesso nome nello script di output. In questo caso, viene visualizzato il seguente messaggio di errore quando si esegue lo script di output nell'istanza del server b:
    MSG 15025, livello 16, stato 1, riga 1
    L'entitÓ server 'MyLogin' esiste giÓ.
    Analogamente, un account di accesso Ŕ giÓ nell'istanza del server b potrebbe essere un SID che corrisponde al SID nello script di output. In questo caso, viene visualizzato il seguente messaggio di errore quando si esegue lo script di output nell'istanza del server b:
    MSG 15433, livello 16, stato 1, riga 1
    Parametro fornito sid Ŕ in uso.
    Pertanto, Ŕ necessario effettuare le seguenti operazioni:
    1. Esaminare attentamente lo script di output.
    2. Esaminare il contenuto della vista sys.server_principals nell'istanza del server B.
    3. Risolvere questi messaggi di errore come appropriato.
  • In SQL Server 2005, il SID per un account di accesso viene utilizzato per implementare l'accesso a livello di database. Un account di accesso potrebbe essere SID differenti in diversi database su un server. In questo caso, l'account di accesso solo il database che contiene il SID che corrisponde al SID nella vista sys.server_principals . Questo problema pu˛ verificarsi se i due database vengono combinati da server diversi. Per risolvere questo problema, rimuovere manualmente l'account di accesso dal database che dispone di una mancata corrispondenza di SID utilizzando l'istruzione DROP USER. Quindi aggiungere nuovamente l'accesso utilizzando l'istruzione CREATE USER.

Riferimenti

Per ulteriori informazioni sulla risoluzione dei problemi degli utenti isolati, visitare il Risolvere utenti isolati Sito Web Microsoft Developer Network (MSDN).

Per ulteriori informazioni sull'istruzione CREATE LOGIN, visitare il CREARE account di accesso (Transact-SQL) Sito Web MSDN.

Per ulteriori informazioni sull'istruzione ALTER LOGIN, visitare il ALTER LOGIN (Transact-SQL) Sito Web MSDN.

ProprietÓ

Identificativo articolo: 918992 - Ultima modifica: martedý 16 luglio 2013 - Revisione: 1.1
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi:á
kbsqlsetup kbexpertiseadvanced kbhowto kbinfo kbmt KB918992 KbMtit
Traduzione automatica articoli
IMPORTANTE: il presente articolo Ŕ stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l?obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre Ŕ perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilitÓ per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualitÓ della traduzione.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 918992
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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