Cara Mengatasi Login gagal untuk pengguna 'MyUser'. (Microsoft SQL Server, Error: 18456)

4:03 PM yuan 0 Comments


Masalah ini terjadi karena Anda lakukan tidak mentransfer login dan sandi dari contoh SQL Server di server A ke contoh SQL Server di server B.

Untuk mentransfer login, gunakan salah satu metode berikut, yang sesuai untuk situasi Anda.

Metode 1: Log in dengan menggunakan pra-SQL Server 2000 sandi

Untuk mengatasi masalah ini, minta pengguna untuk masuk ke server yang menjalankan SQL Server dengan menggunakan pra-SQL Server 2000 login.

Catatan Menerapkan algoritma sandi akan diperbarui secara otomatis ketika pengguna log in dengan menggunakan pra-SQL Server 2000 sandi.

Metode 2: Reset sandi di SQL Server

Untuk mengatasi masalah ini, reset sandi di SQL Server, dan kemudian script keluar login.

Catatan Sandi hashing algoritma digunakan ketika Anda me-reset sandi.

Metode 3: Membuat log pada skrip yang memiliki sandi kosong

Untuk membuat log pada skrip yang memiliki sandi kosong, ikuti langkah-langkah berikut:
1.       Server A, mulai SQL Server Management Studio, dan kemudian Sambungkan ke SQL Server dari mana Anda memindahkan pangkalan data.
2.       Buka jendela Editor kueri baru, dan kemudian jalankan skrip berikut ini.
3.  USE master
4.  GO
5.  IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
6.    DROP PROCEDURE sp_hexadecimal
7.  GO
8.  CREATE PROCEDURE sp_hexadecimal
9.      @binvalue varbinary(256),
10.     @hexvalue varchar (514) OUTPUT
11. AS
12. DECLARE @charvalue varchar (514)
13. DECLARE @i int
14. DECLARE @length int
15. DECLARE @hexstring char(16)
16. SELECT @charvalue = '0x'
17. SELECT @i = 1
18. SELECT @length = DATALENGTH (@binvalue)
19. SELECT @hexstring = '0123456789ABCDEF'
20. WHILE (@i <= @length)
21. BEGIN
22.   DECLARE @tempint int
23.   DECLARE @firstint int
24.   DECLARE @secondint int
25.   SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
26.   SELECT @firstint = FLOOR(@tempint/16)
27.   SELECT @secondint = @tempint - (@firstint*16)
28.   SELECT @charvalue = @charvalue +
29.     SUBSTRING(@hexstring, @firstint+1, 1) +
30.     SUBSTRING(@hexstring, @secondint+1, 1)
31.   SELECT @i = @i + 1
32. END
33.  
34. SELECT @hexvalue = @charvalue
35. GO
36.  
37. IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
38.   DROP PROCEDURE sp_help_revlogin
39. GO
40. CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
41. DECLARE @name sysname
42. DECLARE @type varchar (1)
43. DECLARE @hasaccess int
44. DECLARE @denylogin int
45. DECLARE @is_disabled int
46. DECLARE @PWD_varbinary  varbinary (256)
47. DECLARE @PWD_string  varchar (514)
48. DECLARE @SID_varbinary varbinary (85)
49. DECLARE @SID_string varchar (514)
50. DECLARE @tmpstr  varchar (1024)
51. DECLARE @is_policy_checked varchar (3)
52. DECLARE @is_expiration_checked varchar (3)
53.  
54. DECLARE @defaultdb sysname
55.  
56. IF (@login_name IS NULL)
57.   DECLARE login_curs CURSOR FOR
58.  
59.       SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
60. sys.server_principals p LEFT JOIN sys.syslogins l
61.       ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
62. ELSE
63.   DECLARE login_curs CURSOR FOR
64.  
65.  
66.       SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
67. sys.server_principals p LEFT JOIN sys.syslogins l
68.       ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
69. OPEN login_curs
70.  
71. FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
72. IF (@@fetch_status = -1)
73. BEGIN
74.   PRINT 'No login(s) found.'
75.   CLOSE login_curs
76.   DEALLOCATE login_curs
77.   RETURN -1
78. END
79. SET @tmpstr = '/* sp_help_revlogin script '
80. PRINT @tmpstr
81. SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
82. PRINT @tmpstr
83. PRINT ''
84. WHILE (@@fetch_status <> -1)
85. BEGIN
86.   IF (@@fetch_status <> -2)
87.   BEGIN
88.     PRINT ''
89.     SET @tmpstr = '-- Login: ' + @name
90.     PRINT @tmpstr
91.     IF (@type IN ( 'G', 'U'))
92.     BEGIN -- NT authenticated account/group
93.  
94.       SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
95.     END
96.     ELSE BEGIN -- SQL Server authentication
97.         -- obtain password and sid
98.             SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
99.         EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
100.            EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
101.     
102.            -- obtain password policy state
103.            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
104.            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
105.     
106.                SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
107.     
108.            IF ( @is_policy_checked IS NOT NULL )
109.            BEGIN
110.              SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
111.            END
112.            IF ( @is_expiration_checked IS NOT NULL )
113.            BEGIN
114.              SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
115.            END
116.        END
117.        IF (@denylogin = 1)
118.        BEGIN -- login is denied access
119.          SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
120.        END
121.        ELSE IF (@hasaccess = 0)
122.        BEGIN -- login exists but does not have access
123.          SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
124.        END
125.        IF (@is_disabled = 1)
126.        BEGIN -- login is disabled
127.          SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
128.        END
129.        PRINT @tmpstr
130.      END
131.     
132.      FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
133.       END
134.    CLOSE login_curs
135.    DEALLOCATE login_curs
136.    RETURN 0
137.    GO


CatatanSkrip ini membuat dua prosedur yang tersimpan dalam master database. Prosedur yang bernamasp_hexadecimal dan sp_help_revlogin.
138.Jalankan pernyataan berikut ini:
EXEC sp_help_revlogin
Skrip output yang menghasilkan sp_help_revlogin disimpan prosedur adalah skrip login. Skrip login ini membuat login yang asli pengidentifikasi kemanan (SID) dan sandi asli.
139.Di server B, mulai SQL Server Management Studio, dan kemudian Sambungkan ke SQL Server di mana Anda memindahkan pangkalan data.

Penting
140.Buka jendela Editor kueri baru, dan kemudian menjalankan skrip output yang dibuat di langkah 3.
Komentar
Tinjau informasi berikut sebelum Anda menjalankan skrip output pada contoh di server B:
·         Jika Anda mencoba untuk membuat login SQL Server 2012 baru menggunakan pra-SQL Server 2000 login yang telah diatur, Anda menerima galat berikut ini:
MSG 15021, tingkat 16, negara bagian 2, baris 1
Invalid nilai yang diberikan untuk parameter sandi.
Catatan 

Untuk mengatasi masalah ini di server yang menjalankan SQL Server 2012, buat login yang memiliki sandi kosong. 
CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC,
DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF

Setelah Anda membuat login yang memiliki sandi kosong, pengguna dapat mengubah sandi pada upaya masuk berikutnya.
·         Sandi dapat hashed dalam tiga cara:
·         VERSION_LEGACY: hash ini adalah hash 16-byte pra-SQL Server 2000.
·         VERSION_SHA1: hash ini dibuat dengan menggunakan algoritma SHA1 dan digunakan di SQL Server 2000 melalui SQL Server 2008 R2.
·         VERSION_SHA2: hash ini dibuat dengan menggunakan algoritma SHA2 512 dan digunakan dalam SQL Server 2012.
·         Pada SQL Server 2008 R1 dan versi yang lebih lawas, pra-SQL Server 2000 sandi hash yang didukung.
·         Jika pengguna yang memiliki sandi yang menggunakan pra-SQL Server 2000 hash ada di server yang menjalankan SQL Server 2008 R2, ini berarti bahwa pengguna telah tidak masuk ke server.
·         Meninjau skrip output dengan seksama. Jika server A dan server B berada di domain yang berbeda, Anda harus mengubah skrip output. Kemudian, Anda harus mengganti nama domain asli dengan menggunakan nama domain baru pada LOGIN membuat laporan. Login terpadu yang diberikan akses di domain baru tidak memiliki SID sama sebagai login di domain yang asli. Oleh karena itu, pengguna yang ditinggalkan dari login ini. Untuk informasi selengkapnya tentang cara menyelesaikan pengguna ditinggalkan ini, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
240872 Cara menyelesaikan masalah izin saat Anda memindahkan pangkalan data antara server yang menjalankan SQL Server
Jika server A dan server B di domain yang sama, SID sama digunakan. Oleh karena itu, pengguna tidak mungkin dapat ditinggalkan.
·         Dalam output skrip login dibuat dengan menggunakan sandi yang dienkripsi. Hal ini karena argumen HASHED dalam LOGIN membuat pernyataan. Argumen ini menentukan bahwa sandi yang dimasukkan setelah argumen sandi telah hashed.
·         Secara default, hanya merupakan anggota dari peran sysadmin tetap server dapat menjalankan pernyataan SELECT dari tampilan sys.server_principals . Kecuali anggota sysadmin tetap peran server memberikan izin yang diperlukan untuk pengguna, pengguna tidak dapat membuat atau menjalankan skrip output.
·         Langkah-langkah dalam artikel ini tidak mentransfer informasi database default untuk masuk tertentu. Hal ini karena pangkalan data asali mungkin tidak selalu ada di server B. Untuk menentukan pangkalan data asali untuk login, gunakan pernyataan mengubah LOGIN oleh lewat di nama login dan pangkalan data asali sebagai argumen.
·         Case-sensitive A sensitif server dan B: urutan server A mungkin case-sensitive, dan urutan server B mungkin sensitif.Dalam hal ini, pengguna harus mengetik sandi di semua huruf setelah Anda mentransfer login dan sandi untuk contoh di server B.

Sensitif A case-sensitive server dan B: urutan server A mungkin sensitif, dan urutan server B mungkin case-sensitive.Dalam hal ini, pengguna tidak dapat masuk menggunakan login dan sandi yang Anda mentransfer ke contoh di server B kecuali jika salah satu dari kondisi berikut ini benar:
·         Sandi asli berisi surat tidak ada.
·         Semua huruf dalam sandi asli adalah huruf.
Sensitif atau case-sensitive pada kedua server: urutan server A dan server B mungkin sensitif, atau urutan server A dan server B mungkin case-sensitive. Dalam kasus ini, pengguna tidak mengalami masalah.
·         Login yang sudah ada di contoh di server B mungkin memiliki nama yang sama dengan nama dalam skrip output. Dalam hal ini, Anda menerima pesan galat ketika Anda menjalankan skrip output pada contoh di server B:
MSG 15025, tingkat 16, negara bagian 1, baris 1
Server pimpinan 'MyLogin' sudah ada.
Demikian pula, login yang sudah ada di contoh di server B bisa SID yang sama dengan SID dalam skrip output. Dalam hal ini, Anda menerima pesan galat ketika Anda menjalankan skrip output pada contoh di server B:
MSG 15433, tingkat 16, negara bagian 1, baris 1
Parameter disediakan sid yang digunakan.
Oleh karena itu, Anda harus melakukan hal berikut ini:
1.       Meninjau skrip output dengan seksama.
2.       Periksa konten tampilan sys.server_principals dalam contoh di server B.
3.       Alamat pesan galat ini yang sesuai.
    SQL Server 2005, SID for login digunakan untuk menerapkan database tingkat akses. Login mungkin memiliki SID berbeda dalam database yang berbeda di server. Dalam hal ini, login hanya dapat mengakses pangkalan data yang telah SID yang cocok dengan SID dalam tampilan sys.server_principals . Masalah ini dapat terjadi jika dua database gabungan dari server yang berbeda. Untuk mengatasi masalah ini, secara manual menghapus login dari pangkalan data yang telah ketidakcocokan SID menggunakan pernyataan DROP pengguna. Kemudian, tambahkan login lagi menggunakan pernyataan membuat pengguna.

0 comments: