رفع خطای The target principal name is incorrectدر sql server
یکی از خطاهای رایج در محیطهای Domain و مخصوصاً در SQL Server، خطای زیر است:
Cannot generate SSPI context
The target principal name is incorrect
این خطا معمولاً نشاندهنده مشکل در احراز هویت Kerberos و تنظیمات SPN (Service Principal Name) است.
🧠 SSPI Context چیست؟
در Windows Authentication، ارتباط بین کلاینت و SQL Server از طریق Kerberos انجام میشود:
- کلاینت به Domain Controller درخواست Ticket میدهد
- DC بر اساس SPN بررسی میکند
- اگر SPN صحیح باشد، Ticket صادر میشود
- SQL Server احراز هویت را قبول میکند
👉 اگر SPN مشکل داشته باشد، فرآیند شکست میخورد و خطای SSPI Context ظاهر میشود.
🚨 علت اصلی مشکل (سناریوی رایج)
در بسیاری از سازمانها:
- SQL Server با Domain Account اجرا میشود (مثلاً:
DOMAIN\sqlsvc) - اما SPN به اشتباه روی Computer Account ثبت شده است
این اختلاف باعث میشود Kerberos نتواند سرویس را شناسایی کند.
🧨 مثال اشتباه
❌ SPN روی Computer Account:
- SQLSERVER01 (Computer Object)
❌ در حالی که سرویس روی:
- DOMAIN\sqlsvc
🛠️ روش کامل رفع مشکل (دو بخش)
🟢 بخش اول: رفع مشکل از طریق Active Directory (روش گرافیکی)
این روش در محیطهای Enterprise بسیار مهم و رایج است.
📌 مرحله 1: ورود به Active Directory
روی Domain Controller ابزار زیر را اجرا کنید:
Active Directory Users and Computers (ADUC)
📌 مرحله 2: فعال کردن نمایش پیشرفته
از منوی بالا:
View → Advanced Features
✔ این گزینه را فعال کنید
📌 مرحله 3: پیدا کردن سرور SQL
در لیست سرورها:
- Computer Object مربوط به SQL Server را پیدا کنید
روی آن راست کلیک کنید و وارد:
Properties
📌 مرحله 4: رفتن به Attribute Editor
در پنجره Properties:
✔ تب Attribute Editor را باز کنید
📌 مرحله 5: پیدا کردن SPN
در لیست Attribute ها، مقدار زیر را پیدا کنید:
servicePrincipalName
📌 مرحله 6: حذف SPN اشتباه
اگر مواردی مشابه زیر دیدید:
MSSQLSvc/ServerName:1433
MSSQLSvc/ServerName.domain.local:1433
👉 اگر سرویس روی Domain Account اجرا میشود، این SPNها نباید روی Computer Object باشند
✔ آنها را انتخاب کرده و حذف کنید
⏳ مرحله 7: صبر برای Replication
چند دقیقه صبر کنید تا تغییرات بین Domain Controllerها اعمال شود.
🔄 مرحله 8: پاک کردن Cache در کلاینت
روی کلاینت اجرا کنید:
klist purge
🟢 بخش دوم: ثبت صحیح SPN روی Service Account
بعد از حذف SPN اشتباه، باید SPN را درست ثبت کنید:
setspn -A MSSQLSvc/ServerName:1433 DOMAIN\sqlsvc
setspn -A MSSQLSvc/ServerName.domain.local:1433 DOMAIN\sqlsvc
🚨 بررسی مشکلات دیگر (خیلی مهم)
🔴 Duplicate SPN
اگر SPN در دو جا ثبت شده باشد:
Computer Account
Service Account
❌ Kerberos کاملاً Fail میشود
بررسی:
setspn -X
🌐 مشکل DNS
اگر نام سرور درست resolve نشود:
nslookup servername
ping servername
📡 استفاده از IP (اشتباه رایج)
❌ اشتباه:
10.10.10.5
✔ درست:
SQLSERVER01.domain.local
⏱️ مشکل Time Sync
اگر اختلاف زمان بین Client و Server زیاد باشد:
w32tm /query /status
🔀 مشکل Alias
اگر از SQL Alias استفاده میکنید:
👉 باید SPN برای alias هم تعریف شود
🧪 تست نهایی
روی کلاینت:
klist
اگر MSSQLSvc را دیدید یعنی OK ✔
در SQL Server:
SELECT auth_scheme
FROM sys.dm_exec_connections WHERE session_id = @@SPID
✔ باید خروجی:
KERBEROS
🏢 نکات حرفهای (Production Best Practices)
✔ SQL Server همیشه با Domain Service Account اجرا شود
✔ SPN فقط روی Service Account باشد
✔ اتصال با IP ممنوع شود
✔ DNS همیشه سالم باشد
✔ Time Sync با Domain Controller ضروری است
✔ تغییر Service Account = بررسی SPN
🎯 جمعبندی
این خطا معمولاً به یکی از موارد زیر مربوط است:
- SPN اشتباه در Active Directory
- Duplicate SPN
- DNS مشکل
- Time mismatch
- استفاده از IP یا Alias
- تغییر Service Account
🚀 نتیجه نهایی
با اصلاح SPN از طریق Active Directory (Advanced Features + Attribute Editor) و ثبت صحیح روی Service Account،
بیش از ۹۰٪ این خطا بهطور کامل رفع میشود.
💬 نظرات (0)
هنوز نظری ثبت نشده است. اولین نفری باشید که نظر میدهید!
📝 ثبت نظر جدید