כיצד להעביר כניסות וסיסמאות בין מופעים של שרת SQL

תרגומי מאמרים תרגומי מאמרים
Article ID: 918992 - View products that this article applies to.
הרחב הכל | כווץ הכל

On This Page

מבוא

מאמר זה מתאר כיצד להעביר את כניסות וסיסמאות בין מופעים של Microsoft SQL Server 2005 של Microsoft SQL Server 2008, וכן של Microsoft SQL Server 2012 בשרתים שונים.

לקבלת מידע נוסף אודות כיצד להעביר את כניסות וסיסמאות בין מופעים של גירסאות אחרות של SQL Server, לחץ על מספר המאמר הבא כדי להציג את המאמר הרלוונטי מתוך Microsoft Knowledge Base:
246133 כיצד להעביר כניסות וסיסמאות בין מופעים של שרת SQL

מידע נוסף

במאמר זה, A ושרת B הם שרתים שונים. בנוסף, שרת A ו- B של השרת פועל SQL Server 2005.

הערה מידע זה חל גם על SQL Server 2008 ועל 2012 שרת SQL.

לאחר העברת מסד נתונים מתוך המופע של SQL Server בשרת A למופע של SQL Server בשרת B, ייתכן שמשתמשים אין אפשרות להיכנס למסד הנתונים בשרת B. בנוסף, משתמשים עלולה להופיע הודעת השגיאה הבאה:
הכניסה נכשלה עבור המשתמש 'MyUser'. (שרת SQL של Microsoft, שגיאה: 18456)
בעיה זו מתרחשת מאחר לא תעביר את כניסות וסיסמאות מתוך המופע של SQL Server בשרת A למופע של SQL Server בשרת ב'.

כדי להעביר את כניסות, השתמש באחת מהשיטות הבאות, בהתאם לנסיבות.

שיטה 1: להיכנס באמצעות הסיסמה 2000 טרום-SQL Server

כדי לפתור בעיה זו, בקש מהמשתמש להיכנס לשרת שבו פועל SQL Server באמצעות טרום-SQL Server 2000 הכניסה.

הערה הסיסמה hashing מתעדכן באופן אוטומטי כאשר המשתמש נכנס באמצעות הסיסמה 2000 טרום-SQL Server.

שיטה 2: איפוס הסיסמה ב- SQL Server

כדי לפתור בעיה זו, לאפס את הסיסמה ב- SQL Server ולאחר מכן ליצור script החוצה הכניסה.

הערה נעשה שימוש באלגוריתם hashing של סיסמה בעת איפוס הסיסמה.

שיטה 3: צור יומן בקובץ script בעל סיסמה ריקה

כדי ליצור יומן רישום בקובץ script בעל סיסמה ריקה, בצע את הפעולות הבאות:
  1. שרת A, התחל Studio ניהול שרת SQL ולאחר מכן חבר למופע של SQL Server שממנו שהעברת את מסד הנתונים.
  2. פתח חלון שאילתה עורך חדש ולאחר מכן הפעל את קובץ ה-script הבא.
    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
    


    הערהקובץ script זה יוצר שתי שגרות מאוחסנות במסד הנתונים הראשי. ההליכים מכוניםsp_hexadecimal ו- sp_help_revlogin.
  3. הפעל את המשפט הבא:
    EXEC sp_help_revlogin
    ה-script פלט היוצר השגרה המאוחסנת sp_help_revlogin נמצא קובץ ה-script של כניסה. קובץ script של כניסה זה יוצר כניסות בעלי מזהה האבטחה המקורי (SID) ואת הסיסמה המקורית.
  4. בשרת B, התחל Studio ניהול שרת SQL ולאחר מכן חבר למופע של SQL Server שאליו עברת את מסד הנתונים.

    חשוב לפני שתעבור לשלב 5, סקור את המידע הכלול בסעיף "הערות".
  5. פתח חלון שאילתה עורך חדש ולאחר מכן הפעל את קובץ script של פלט שנוצר בשלב 3.

הערות

סקור את המידע שלהלן לפני הפעלת קובץ ה-script של פלט במופע בשרת b:
  • אם אתה מנסה ליצור כניסה SQL Server 2012 חדש באמצעות כניסה 2000 של שרת SQL טרום אשר הוא מבוססי script, מתקבלת השגיאה הבאה:
    הודעת 15021, רמת 16, מצב 2, שורה 1
    ערך לא חוקי עבור פרמטר הסיסמה. ציין ערך פרמטר חוקי.
    הערה תקבל שגיאה זו ב- SQL Server 2012 עקב ה-hash סיסמה 16 בייטים שסופק עבור משפטי כניסה צור והכניסה לשנות.

    כדי לפתור בעיה זו בשרת שבו פועל SQL Server 2012, ליצור כניסה עם סיסמה ריקה. כדי לעשות זאת, הפעל את קובץ ה-script הבא:
    CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC, 
    DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF

    לאחר שתיצור את הכניסה בעל סיסמה ריקה, המשתמש יכול לשנות את הסיסמה בכל ניסיון כניסה הבא.
  • אפשרות לבצע hash של סיסמה בשלוש דרכים:
    • VERSION_LEGACY: קוד hash זה הוא קוד hash של 16 בייטים טרום-SQL Server 2000.
    • VERSION_SHA1: נוצר על-ידי שימוש באלגוריתם SHA1 hash זה ונעשה שימוש ב- SQL Server 2000 באמצעות SQL Server 2008 R2.
    • VERSION_SHA2: hash זה נוצר באמצעות אלגוריתם SHA2 512 והוא משמש ב- SQL Server 2012.
  • ב- SQL Server 2008 R1 ו בגירסאות קודמות, נתמכו טרום-SQL Server 2000 סיסמה קודי hash. כאשר המשתמש מחובר באמצעות סיסמה בשימוש hash טרום-SQL Server 2000, קוד ה-hash שודרג לשימוש ה-hash של סיסמת SHA1.
  • אם משתמש בעל סיסמה המשתמשת טרום-SQL Server 2000 hash קיים בשרת שבו פועל SQL Server 2008 R2, משמעות הדבר היא כי למשתמש יש לא כניסה לשרת זה.
  • סקור את קובץ ה-script של פלט בקפידה. אם A ושרת B נמצאים בתחומים שונים, עליך לשנות את קובץ ה-script של פלט. לאחר מכן, עליך להחליף את שם התחום המקורי באמצעות שם התחום החדש במשפטי כניסה צור. כניסות משולב המוענקות גישה בתחום החדש אין את ה-SID אותו כ כניסות בתחום המקורי. לכן, משתמשים מיותמים מתוך כניסות אלה. לקבלת מידע נוסף אודות אופן פתרון משתמשים יתומים אלה, לחץ על מספר המאמר הבא כדי להציג את המאמר הרלוונטי מתוך Microsoft Knowledge Base:
    240872 כיצד לפתור בעיות הרשאה בעת העברת מסד נתונים בין שרתים בהם פועל SQL Server
    אם A ושרת B נמצאים באותו תחום, משמש ה-SID זהה. לכן, משתמשים סביר להיות מיותמים.
  • בקובץ ה-script פלט, כניסות נוצרים באמצעות סיסמה מוצפנת. זו נגרמת כתוצאה הארגומנט HASHED במשפט יצירת כניסה. ארגומנט זה מציין את פעולת כי הסיסמה שהוזנה לאחר הארגומנט סיסמה הוא כבר hash.
  • כברירת מחדל, רק חבר בתפקיד מנהל מערכת של שרת קבוע באפשרותך להפעיל משפט SELECT בתצוגה sys.server_principals . אלא אם כן חבר sysadmin קבוע תפקיד השרת מעניק ההרשאות הדרושות למשתמשים, למשתמשים אין אפשרות ליצור או להפעיל את קובץ ה-script של פלט.
  • השלבים במאמר זה לא להעביר את פרטי מסד הנתונים המוגדר כברירת מחדל עבור כניסה מסוים. הדבר נובע מסד הנתונים המוגדר כברירת מחדל ייתכן לא קיים תמיד בשרת ב'. כדי להגדיר את מסד הנתונים המוגדר כברירת מחדל עבור כניסה, השתמש במשפט כניסה לשנות על-ידי העברת שם הכניסה לבין מסד הנתונים המוגדר כברירת מחדל כארגומנטים.
  • ללא תלות ברישיות A ושרת תלויי רישיות B: סדר המיון של שרת A עשוי להיות תלויי רישיות, ואת סדר המיון של שרת B עשוי להיות תלויי רישיות. במקרה זה, על המשתמשים להקליד את הסיסמאות באותיות רישיות לאחר שאתה מעביר את כניסות וסיסמאות למופע בשרת ב'.

    תלוי רישיות A ושרת מילונאי B: סדר המיון של שרת A עשוי להיות תלוי רישיות, ואת סדר המיון של שרת B עשוי להיות תלויי רישיות. במקרה זה, המשתמשים לא יוכלו להיכנס באמצעות את כניסות וסיסמאות להעביר מופע בשרת B אלא אם אחד מהתנאים הבאים מתקיים:
    • הסיסמאות המקורי להכיל ללא אותיות.
    • כל האותיות בסיסמאות המקורי הן אותיות רישיות.
    תלוי רישיות או בשרתים שני: סדר המיון של שרת A ו- B של השרת עשוי להיות תלוי רישיות, או סדר המיון של שרת A ו- B של השרת עשוי להיות תלויי רישיות. במקרים אלה, המשתמשים אינם נתקלים בבעיה.
  • כניסה הנמצא כבר המופע בשרת B ייתכן שם זהה לשם בקובץ ה-script פלט. במקרה זה, מתקבלת הודעת השגיאה הבאה בעת הפעלת קובץ ה-script של פלט במופע בשרת b:
    הודעת 15025, רמת 16, מצב 1, שורה 1
    מנהל שרת 'MyLogin' כבר קיים.
    באופן דומה, כניסה הנמצא כבר המופע בשרת B ייתכן SID זהה SID בקובץ ה-script פלט. במקרה זה, מתקבלת הודעת השגיאה הבאה בעת הפעלת קובץ ה-script של פלט במופע בשרת b:
    הודעת 15433, רמת 16, מצב 1, שורה 1
    הפרמטר המסופק sid נמצא בשימוש.
    לכן, עליך לבצע את הפעולות הבאות:
    1. סקור את קובץ ה-script של פלט בקפידה.
    2. לבחון את התוכן של התצוגה sys.server_principals במופע בשרת ב'.
    3. כתובת הודעות שגיאה אלה בהתאם לצורך.
  • ב- SQL Server 2005, ה-SID עבור כניסה משמש כדי ליישם גישה ברמת מסד הנתונים. כניסה ייתכן מזהי אבטחה שונים במסדי נתונים שונים בשרת. במקרה זה, הכניסה יכולים לגשת רק את מסד הנתונים המכיל את ה-SID התואם את ה-SID בתצוגת sys.server_principals . בעיה זו עלולה להתרחש אם שני מסדי הנתונים משולבים משרתים שונים. כדי לפתור בעיה זו, עליך להסיר באופן ידני הכניסה מתוך מסד הנתונים בעל אי-התאמה SID באמצעות המשפט DROP USER. לאחר מכן, הוסף שוב את הכניסה באמצעות משפט יצירת משתמש.

מידע נוסף

לקבלת מידע נוסף אודות פתרון בעיות של משתמשים יתומים, עבור אל ה פתרון בעיות של משתמשים יתומים אתר האינטרנט של רשת מפתחים של Microsoft (MSDN).

לקבלת מידע נוסף אודות המשפט כניסה צור, עבור אל ה יצירת כניסה (Transact-SQL) אתר האינטרנט של MSDN.

לקבלת מידע נוסף אודות המשפט לשנות כניסה, עבור אל ה לשנות כניסה (Transact-SQL) אתר האינטרנט של MSDN.

מאפיינים

Article ID: 918992 - Last Review: יום חמישי 10 אוקטובר 2013 - Revision: 2.0
המידע במאמר זה חל על:
  • 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
מילות מפתח 
kbsqlsetup kbexpertiseadvanced kbhowto kbinfo kbmt KB918992 KbMthe
תרגום מכונה
חשוב: מאמר זה תורגם באמצעות תוכנת תרגום מכונה של Microsoft וייתכן שנערך לאחר מכן על-ידי קהילת Microsoftבאמצעות טכנולוגייתCommunity Translation Framework (CTF) או באמצעות תרגום אנושי. Microsoft מציעה לך גם מאמרים בתרגום אנושי, מאמרים בתרגום מכונה ומאמרים שנערכו על ידי הקהילה כדי לאפשר גישה למאמרים הקיימים במאגר הידע (Knowledge Base) שלMicrosoft בשפות שונות. מאמרים מתורגמים יכולים להכיל שגיאות באוצר המילים, בתחביר או בדקדוק. Microsoft אינה אחראית לחוסר דיוק, שגיאות או נזקים שייגרמו כתוצאה מטעויות בתכנים או משימוש בתכנים על ידי לקוחותיה.
כותרת מאמר זה באנגלית: 918992

ספק משוב

 

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