فکر میکنم همه ما با خطای 18456 برخورد کردهایم، چه برنامهای باشد که نمیتواند به SQL Server دسترسی پیدا کند، یا چه credentialها در طول زمان تغییر میکنند یا چه کاربری که نمیتواند رمز عبور را درست تایپ کند.
ترفند عیب یابی این شماره خطا این است که پیغام خطای بازگشتی به کلاینت یا برنامه کاربردی در تلاش برای اتصال، عمدتا مبهم است – پیام خطا برای اکثر خطاها مشابه است و وضعیت همیشه 1 است. در چند مورد، برخی اطلاعات اضافی را شامل می شود، اما در بیشتر موارد اطلاعات مبهم و کمی برای کاربر نهایی وجود دارد. دلیل این امر این است که مراقب باشید اطلاعات زیادی را در اختیار یک نفوذگر احتمالی قرار ندهید.
اما این کار عیب یابی را سخت می کند.
برای اینکه بفهمید واقعاً چه مشکلی دارد، باید به SQL Server دسترسی جایگزین داشته باشید (از طریق لاگین متفاوت یا دسترسی فیزیکی مستقیم) و errorlog را برای وضعیت واقعی در پیام خطا بررسی کنید.
بنابراین در اینجا من فهرست کاملی از همه حالتهای مختلف برای مشکلات و خطاها هنگام لاگین شدن را در اختیار شما میگذارم. من یک instance از 18470 را در وضعیت 1 برای تکمیل قرار دادم.
1: Error: 18470,1 Severity: 14, State: 1.
Login failed for user x .
وضعیت 1 اکنون زمانی رخ می دهد که یک اکانت disable باشد – اما در واقع، خطا در گزارش 18470 است، نه 18456 – چون لاگین disable است، کارش به این خطا نمی رسد. به وضعیت 7 مراجعه کنید.
دلیل دیگر ممکن است این باشد که تنظیمات Authentication شما روی mixed authentication قرار نگرفته بلکه تنها windows authentiation مجاز است. دراینصورت به properties اینستنس خود رفته و در تب Connection نوع احراز هویت مجاز را mixed انتخاب کنید.
2: Error: 18456, Severity: 14, State: 2.
Login failed for user x.
دلیل: نتوانسته لاگینی مطابق با نام ارائه شده پیدا کند.
لاگین (چه با استفاده از SQL یا Windows Authentication) وجود ندارد. برای Windows Auth، احتمالاً به این معنی است که لاگین به طور واضح به SQL Server دسترسی نداشته است – که ممکن است به این معنی باشد که عضوی از یک گروه دامین مناسب نیست. همچنین میتواند به این معنا باشد که شما یک لاگین در سطح سرور ایجاد کردهاید، یک کاربر پایگاه داده را با نام دیگری با آن لاگین map کردهاید، و سعی میکنید با استفاده از نام یوزر متصل شوید و نه نام لاگین. این همان وضعیت 5 است، اما وضعیت 2 نشان می دهد که تلاش برای لاگین از یک ماشین راه دور انجام شده است.
5: Error: 18456, Severity: 14, State: 5.
Login failed for user x.
دلیل: نتوانسته لاگینی مطابق با نام ارائه شده پیدا کند.
مانند وضعیت 2، لاگین در SQL Server وجود ندارد، اما تلاش برای لاگین از طریق ماشین محلی انجام شده است. برای هر دو حالت 2 و 5، قبل از SQL Server 2008، دلیل در error log درج نشده بود – فقط پیام login ناموفق بود. برای هر دو وضعیت 2 و 5، این خطا می تواند اتفاق بیفتد اگر نام کاربری و رمز عبور صحیح را برای یک یوزر contained database، اما پایگاه داده اشتباه (یا خیر) مشخص کنید. توجه داشته باشید که اگر میخواهید با استفاده از پنجره اتصال در SSMS به یک contained database متصل شوید، و به جای تایپ صریح نام، سعی کنید به <Browse server…> برای پایگاه داده بپردازید، ابتدا یک اعلان دریافت خواهید کرد: « Browsing the available databases on the server requires connecting to the server. This may take a few moments. Would you like to continue? ” اگر auth credential SQL نیز با login در سطح سرور مطابقت نداشته باشد، یک پیام خطا دریافت خواهید کرد، زیرا کاربر موجود شما به پایگاه های داده master.sys.دسترسی ندارد. پیغام خطا در رابط کاربری این است: ” Failed to connect to server <server>. (Microsoft.SqlServer.ConnectionInfo)Login failed for user ‘<x>’. (Microsoft SQL Server, Error: 18456). “. نکته اصلی اینجاست: همیشه نام پایگاه داده را به صراحت در تب options کادر اتصال مشخص کنید. از قابلیت browse استفاده نکنید.
6 : Error: 18456, Severity: 14, State: 6.
Login failed for user x\y.
دلیل: تلاش برای استفاده از نام اکانت NT با احراز هویت SQL Server.
این بدان معناست که شما سعی کردید احراز هویت SQL را مشخص کنید اما یک login ویندوزی را در قالب Domain\Username وارد کرده اید. مطمئن شوید که Windows Authentication را انتخاب کرده اید (و نباید دامین / نام کاربری خود را هنگام استفاده از Win Auth وارد کنید مگر اینکه از runas /netonly برای راه اندازی Management Studio استفاده کنید). حداقل در SQL Server 2012 به بعد، شما فقط در صورتی وضعیت 6 را دریافت خواهید کرد که فرمت Domain\Username با دامین واقعی و نام کاربری که SQL Server می شناسد مطابقت داشته باشد. اگر domain نامعتبر باشد یا اگر نام کاربری یک حساب واقعی ویندوز در آن دامنه نباشد، به وضعیت 5 (برای تلاش های محلی) یا وضعیت 2 (برای تلاش های از راه دور) برمی گردد، زیرا لاگین وجود ندارد.
7 : Error: 18456, Severity: 14, State: 7.
Login failed for user x.
دلیل: هنگام ارزیابی رمز عبور خطایی رخ داد.
لاگین disable است *و* رمز عبور نادرست است. این نشان میدهد که ابتدا اعتبارسنجی رمزعبور اتفاق میافتد، زیرا اگر رمز عبور صحیح باشد و لاگین disable باشد، خطای 18470 را دریافت میکنید (به وضعیت 1 در بالا مراجعه کنید). این امکان وجود دارد که برنامه شما در حال ارسال کردنشیال های ذخیره شده در حافظه cache باشد و رمز عبور تغییر یا بازنشانی شده باشد – می توانید از سیستم خارج شوید و دوباره لاگین کنید تا این credential ها را به روز کنید.
8 : Error: 18456, Severity: 14, State: 8.
Login failed for user x.
دلیل: رمز عبور با رمز ورود ارائه شده مطابقت ندارد.
احتمالاً سادهتر از همه: رمز عبور نادرست است. توجه داشته باشید که حتی اگر سعی کردید به عنوان یک کاربر contained database متصل شوید، اما فراموش کرده اید یک پایگاه داده را مشخص کنید، پایگاه داده اشتباه را مشخص کرده اید، یا رمز عبور را اشتباه تایپ کرده اید، می گوید: ” the login provided ” – ، مگر اینکه مطابقت پیدا کند. SQL Server هیچ دانشی برای اینکه آیا می خواهید از یک کاربر contained database استفاده کنید، ندارد.
یک مورد جالب در اینجا کانتینرهای Docker است –docker run.به شما امکان میدهد یک کانتینر را اجراکنید و یک SA_PASSWORD با کاراکترهای خاصی مانند $ مشخص کنید. با این حال، هرگز نمی توانید با آن رمز عبور به کانتینر متصل شوید. اگر از حروف غیرالفبایی استفاده میکنید، از کارکترهای کمی خوشدست تر مانند # و * استفاده کنید.
9 : Error: 18456, Severity: 14, State: 9.
Login failed for user x\y.
مانند وضعیت 2، من این را بصورت طبیعی ندیده ام. ظاهراً به این معنی است که رمز عبور یک بررسی password policy را نقض کرده است، اما من سعی کردم یک لاگین مطابق با یک password policy ضعیف ایجاد کنم، این policy را تقویت کردم و هنوز هم می توانستم به خوبی login کنم. و بدیهی است که نمیتوانید با گذرواژهای که با این policy مطابقت ندارد، لاگین ایجاد کنید یا بعداً آن را تنظیم کنید. اگر دیدید به من خبر بدهید.
10: Error: 18456, Severity: 14, State: 10.
Login failed for user x.
این یک تغییر نسبتاً پیچیده در وضعیت 9 است. این بدان معنی است که بررسی رمز عبور نمی تواند انجام شود زیرا لاگین در domain cotroller غیرفعال (disable) یا قفل (lock) شده (توجه داشته باشید که اگر SQL Server راه اندازی نمی شود، ممکن است به این دلیل باشد که اکانتی که قفل یا غیرفعال شده است اکانت سرویس SQL Server باشد). هیچ دلیل یا اطلاعات اضافی در پیام “verbose” در error log ارائه نشده است.
11 : Error: 18456, Severity: 14, State: 11.
Login failed for user x.
دلیل: اعتبارسنجی دسترسی سرور مبتنی بر لاگین با یک خطای زیرساخت ناموفق بود. خطاهای قبلی را بررسی کنید.
12: Error: 18456, Severity: 14, State: 12.
Login failed for user x.
دلیل: اعتبار سنجی دسترسی سرور مبتنی بر توکن به دلیل یک خطای زیرساخت انجام نشد. خطاهای قبلی را بررسی کنید.
حالتهای 11 و 12 به این معنی است که SQL Server میتوانست شما را احراز هویت کند، اما قادر به تأیید اعتبار با permissionهای مربوطه ویندوزی نبود. ممکن است windows login هیچ پروفایلی نداشته باشد یا به دلیل UAC، permissionها بررسی نشوند. سعی کنید SSMS را با admn اجرا کنید و/یا UAC را غیرفعال کنید. دلیل دیگر می تواند دسترسی به domain controller باشد. ممکن است لازم باشد به ایجاد مجدد لاگین متوسل شوید. همچنین وضعیتهای 146-149 را برای تغییرات در SQL Server 2016 در زیر ببینید.
13: Error: 18456, Severity: 14, State: 13.
Login failed for user x.
دلیل: سرویس SQL Server متوقف شده است. در حال حاضر هیچ اتصال جدیدی قابل پذیرش نیست.
این حالت زمانی رخ می دهد که سرویس SQL Server متوقف شده باشد (که می توانید به راحتی و حتی تصادفی از منوی زمینه در Object Explorer انجام دهید).
16: Error: 18456, Severity: 14, State: 16.
Login failed for user x.
همچنین ممکن است ببینید:
A connection was successfully established with the server, but then an error occurred during the pre-login handshake.
وضعیت 16، که فقط قبل از SQL Server 2008 رخ می دهد، به این معنی است که پایگاه داده پیش فرض غیرقابل دسترسی بوده است. این ممکن است به این دلیل باشد که پایگاه داده حذف شده، تغییر نام داده شده یا آفلاین است (ممکن است روی autoclose تنظیم شده باشد). این حالت دلیلی را در error log نشان نمی دهد. در سال 2008 و پس از آن، این به عنوان وضعیت 40 گزارش شده است (به زیر مراجعه کنید)، با دلیل. اگر پیام pre-login handshake را دریافت کردید، ممکن است به این دلیل باشد که SSL را در سرور غیرفعال کرده اید.
18: Error: 18456, Severity: 14, State: 18.
Login failed for user x.
ظاهراً این نشان می دهد که کاربر باید رمز عبور خود را تغییر دهد. در SQL Server 2005، 2008 R2 و SQL Server 2012، متوجه شدم که این به عنوان خطای 18488 مطرح شده است، نه 18456. این به این دلیل است که برای لاگین به SQL، دیالوگ باکس تغییر رمز عبور فقط لاگین را به تاخیر می اندازد و در واقع یک شکست لاگین نیست. این وضعیت مانند وضعیت 16، این در نسخه های بعدی SQL Server ظاهر نمیشود.
23 : Error: 18456, Severity: 14, State: 23.
Login failed for user x.
دلیل: دسترسی به اعتبارسنجی سرور در حین تأیید مجدد ورود در اتصال ناموفق بود.
ممکن است چند دلیل برای وضعیت 23 وجود داشته باشد. رایج ترین دلیل این است که اتصالات در حالی که سرویس در حال متوقف شدن است (shut down) انجام می شود. با این حال، اگر این خطا رخ دهد و پیامهایی در مورد متوقف شدن SQL Server در لاگ پیدا نشده باشد، و هیچ دلیلی همراه با پیام وجود نداشته باشد، میتواند نتیجه یک پیام باشد. سرور بیش از حد بارگذاری شده است که به دلیل مشکلات ادغام اتصال (pooling connection) نمی تواند به هیچ لاگین اضافی دیگری سرویس دهد. در نهایت، اگر دلیل *همراهی* وجود داشته باشد، ممکن است پیامی باشد که در سمت راست نشان داده شده است، که نشان می دهد SQL Server به عنوان یک domain account معتبر در حال اجرا است و پس از راه اندازی مجدد، نمی تواند اکانت را تأیید کند زیرا DC آفلاین است. یا اکانت قفل (lock) شده یا دیگر معتبر نیست. سعی کنید service account را به LocalSystem تغییر دهید تا زمانی که بتوانید مشکلات domain را حل کنید.
27 : Error: 18456, Severity: 14, State: 27.
Login failed for user x.
وضعیت 27، مانند وضعیت 16، فقط قبل از SQL Server 2008 رخ می دهد. به این معنی است که پایگاه داده مشخص شده در connection string حذف شده، تغییر نام داده شده است یا آفلاین است (احتمالاً به دلیل autoclose) – اگرچه در هر موردی که من امتحان کردم، اینطور بود. به عنوان وضعیت 16 گزارش شده است. این حالت دلیلی را در error log نشان نمی دهد. در سال 2008 و به بعد این به عنوان وضعیت 38 گزارش شده است (به زیر مراجعه کنید)، با دلیل.
28: Error: 18456, Severity: 14, State: 28.
Login failed for user x.
من این مشکل را تجربه نکردهام، اما گمان میکنم که شامل تجمع بیش از حد اتصال و بازنشانی اتصال باشد. من فکر می کنم شما فقط حالت 28 را قبل از SQL Server 2008 خواهید دید.
38 : Error: 18456, Severity: 14, State: 38.
Login failed for user x.
دلیل: باز کردن پایگاه داده مشخص شده در login properties، ناموفق بود.
یا
دلیل: نمی توان پایگاه داده “<database>” درخواست شده توسط login را باز کرد. ورود ناموفق بود.
پایگاه داده مشخص شده در connection string، یا انتخاب شده در تب Options > Connection Properties در پنجره اتصال SSMS، دیگر معتبر یا آنلاین نیست (ممکن است روی autoclose تنظیم شده باشد یا کاربر ممکن است به سادگی مجوز نداشته باشد). من یک بار با این مواجه شدم که به جای انتخاب آن گزینه از لیست، <default> را اینجا تایپ کردم. این به عنوان وضعیت 27 یا وضعیت 16 قبل از SQL Server 2008 گزارش شده است.
توجه داشته باشید که این نیز می تواند نشانه ای از orphan login باشد. ممکن است پس از ایجاد Mirroring، Availability Groups، log shipping و غیره، یک لاگین جدید ایجاد کرده باشید یا یک کاربر را با یک login در پایگاه داده اولیه مرتبط کرده باشید. اطلاعات یوزر در سطح پایگاه داده روی سرورهای ثانویه (secondary) پخش می شود، اما اطلاعات لاگین اینطور نیست. همه چیز خوب کار خواهد کرد – تا زمانی که شما یک Failover داشته باشید. در این شرایط، شما باید اطلاعات لاگین و یوزر را همگام کنید .
Error: 18456, Severity: 14, State: 40.
Login failed for user x.
دلیل: باز کردن پایگاه داده مشخص شده انجام نشد.
معمولاً این بدان معنی است که پایگاه داده پیش فرض ورود به سیستم آفلاین است (شاید به دلیل autoclose) یا دیگر وجود ندارد. با اصلاح پایگاه داده از دست رفته. پایگاه داده پیش فرض لاگین را با استفاده از ALTER LOGIN تغییر دهید. این به عنوان وضعیت 16 قبل از SQL Server 2008 گزارش شده است.
46: Error: 18456, Severity: 14, State: 46.
Login failed for user x.
دلیل: باز کردن پایگاه داده پیکربندی شده در آبجکت لاگین در حین تأیید مجدد ورود در اتصال انجام نشد.
حالت 46 ممکن است زمانی رخ دهد که لاگین (یا لاگین مپ شه به سرویس اکانت) پایگاه داده معتبری را به عنوان پایگاه داده پیش فرض انتخاب نکرده باشد. (من در اینجا حدس می زنم اما فکر می کنم این ممکن است زمانی اتفاق بیفتد که لاگین مورد نظر در حال تلاش برای log shipping است.) همچنین ممکن است در صورت عملکرد طبقه بندی کننده (Resource Governor) رخ دهد. یا logon trigger به پایگاه داده ای اشاره دارد که آفلاین است، دیگر وجود ندارد یا روی autoclose تنظیم شده است.
50: Error: 18456, Severity: 14, State: 50.
Login failed for user x
دلیل: collation فعلی با collation پایگاه داده در هنگام تنظیم مجدد اتصال مطابقت نداشت.
همانطور که پیام نشان می دهد، اگر collation پیش فرض برای لاگین با collation پایگاه داده پیش فرض آنها (یا پایگاه داده به طور صریح در connection string مشخص شده است) ناسازگار باشد، این اتفاق می افتد. همچنین اگر از یک ابزار کلاینت مانند management studio استفاده میکنید، ممکن است این اتفاق بیفتد، که ممکن است در صورت قطع ارتباط، به جای پایگاه داده پیشفرض خود، پس از اتصال مجدد با دیتابیس Master متصل شوید.
51 : Error: 18456, Severity: 14, State: 51.
Login failed for user x.
دلیل: ارسال notification تغییر محیط به یک نود پارتنر log shipping هنگام تأیید مجدد لاگین ناموفق بود.
مانند وضعیتهای 11 و 12، این ممکن است مربوط به UAC باشد، یا دسترسی به DC قطع شده است. سعی کنید سرویس اکانت SQL Server را به یک دامین یا اکانت محلی شناخته شده تغییر دهید، (به جای built-in local service accounts)، و تأیید کنید که اینستنس patner در دسترس است و همچنین به پایگاه داده درخواست شده در connection string و پایگاه داده پیش فرض لاگین توجه داشته باشید که این می تواند توسط ویژگی connection string پارتنر که failover شده راه اندازی شود، و اینکه پایگاه داده ممکن است دیگر وجود نداشته باشد یا ممکن است آفلاین، تک کاربر و غیره باشد.
56: Error: 18456, Severity: 14, State: 56.
Login failed for user x.
دلیل: تلاش مجدد برای تأیید اعتبار توکن فرآیند ناموفق بود.
وضعیت 56 خیلی متداول نیست – دوباره، مانند حالت های 11 و 12، این ممکن است به UAC مربوط باشد، یا اینکه DC قابل دسترسی نیست. سعی کنید سرویس اکانت SQL Server را به یک دامین یا حساب محلی شناخته شده، به جای built-in local service accounts تغییر دهید.
58: Error: 18456, Severity: 14, State: 58.
Login failed for user x.
دلیل: تلاش برای لاگین با استفاده از احراز هویت SQL ناموفق بود. سرور فقط برای احراز هویت ویندوز پیکربندی شده است.
وضعیت 58 زمانی اتفاق میافتد که SQL Server فقط از Windows Authentication استفاده کند و یک کلاینت سعی میکند با استفاده از SQL Authentication وارد سیستم شود. همچنین ممکن است زمانی رخ دهد که SID ها مطابقت ندارند (در این صورت ممکن است متن خطا کمی متفاوت باشد).
62 : Error: 18456, Severity: 14, State: 62.
Login failed for user x’.
وضعیت 62 زمانی اتفاق میافتد که یک حساب احراز هویت ویندوز سعی میکند به یک contained database دسترسی پیدا کند، و پایگاه داده موجود وجود دارد، اما SIDها مطابقت ندارند.
65: Error: 18456, Severity: 14, State: 65.
Login failed for user x.
دلیل: رمز عبور با یوزر ارائه شده مطابقت ندارد. [پایگاه داده: ‘<x>’]
Contained User وجود دارد، پایگاه داده صحیح است، اما رمز عبور نامعتبر است. اگر از یک login SQL برای اتصال به یک contained database یک کاربر با نام مشابه اما رمز عبور متفاوت استفاده میکنید، باز این اتفاق میافتد (یکی از دلایل متعددی که توصیه نمیشود).
Error: 18456, Severity: 14, State: 102.
Error: 18456, Severity: 14, State: 103.
Error: 18456, Severity: 14, State: 104.
Error: 18456, Severity: 14, State: 105.
Error: 18456, Severity: 14, State: 106.
Error: 18456, Severity: 14, State: 107.
Error: 18456, Severity: 14, State: 108.
Error: 18456, Severity: 14, State: 109.
Error: 18456, Severity: 14, State: 110.
Error: 18456, Severity: 14, State: 111.
Documented by Microsoft as Azure Active Directory login failures.
Error: 18456, Severity: 14, State: 122.
Error: 18456, Severity: 14, State: 123.
Error: 18456, Severity: 14, State: 124.
به گفته مایکروسافت، این ها نشان دهنده یک نام کاربری و/یا رمز عبور خالی یا از دست رفته است.
126: Error: 18456, Severity: 14, State: 126.
اسناد می گویند “پایگاه داده درخواست شده توسط کاربر وجود ندارد.” اما معلوم نیست چرا به جای مثلاً 38 یا 40، وضعیت 126 را پدیدار می کند.
Error: 18456, Severity: 14, State: 132.
Error: 18456, Severity: 14, State: 133.
Azure Active Directory login failures.
Error: 18456, Severity: 14, State: 146.
Login failed for user <Windows auth> login.
دلیل: اعتبار سنجی دسترسی سرور مبتنی بر توکن با یک خطای زیرساخت انجام نشد. ورود به سیستم فاقد مجوز اتصال SQL است.
Error: 18456, Severity: 14, State: 147.
Login failed for user <SQL auth> login.
دلیل: اعتبارسنجی دسترسی سرور مبتنی بر لاگین با یک خطای زیرساخت ناموفق بود. ورود به سیستم فاقد مجوز اتصال SQL است.
Error: 18456, Severity: 14, State: 148.
Login failed for user <Windows auth> login.
دلیل: اعتبار سنجی دسترسی سرور مبتنی بر توکن با یک خطای زیرساخت انجام نشد. ورود به سیستم فاقد مجوز اتصال endpoint است.
Error: 18456, Severity: 14, State: 149.
Login failed for user <SQL auth> login.
دلیل: اعتبارسنجی دسترسی سرور مبتنی بر لاگین با یک خطای زیرساخت ناموفق بود. ورود به سیستم فاقد مجوز اتصال endpoint است.
این حالت ها جایگزین حالت های 11 و 12 در بالا می شوند، اما فقط در SQL Server 2016 یا بالاتر. هدف این بود که مشکل اصلی واقعی را برای sysadmin آسانتر کند تا لاگینهای SQL auth و Windows auth و بین پرمیژنهای اتصال و endpoint را از هم تشخیص دهد (همه بدون ارائه اطلاعات بیشتر به کاربری که سعی در لاگین دارد).
نظر بگذارید