حل مشکل The terminal server has exceeded the maximum number of allowed connection
خطای The terminal server has exceeded the maximum number of allowed connections یعنی ظرفیت نشستهای ریموت دسکتاپ سرور پر شده است؛ ویندوز سرور بدون نصب نقش Remote Desktop Services فقط دو نشست مدیریتی همزمان میپذیرد و معمولاً نشستهای قدیمی که کاربر پنجره را بسته اما log off نکرده، این دو جا را اشغال کردهاند. راه حل فوری، تلاش برای اتصال با سوییچ /admin و سپس بستن نشستهای بلااستفاده با دستور logoff است.
چرا این خطا رخ میدهد؟
ویندوز سرور بهصورت پیشفرض در حالتی به نام Remote Desktop for Administration کار میکند: حداکثر دو نشست ریموت همزمان، بهعلاوهٔ نشست کنسول. این عدد باگ یا اشکال شبکه نیست؛ یک مرز لایسنسی است و تا وقتی نقش Remote Desktop Session Host را نصب و لایسنس تهیه نکنید تغییر نمیکند. پس دیدن این خطا به معنی خرابی سرور یا بستهبودن پورت نیست و روی هر ویندوز سروری، چه ماشین مجازی و چه سرور اختصاصی فیزیکی، یکسان اعمال میشود.
تفاوت مهم Disconnect و Log off
ریشهٔ تقریباً همهٔ موارد این خطا یک عادت ساده است: بستن پنجرهٔ Remote Desktop با کلیک روی ضربدر. این کار شما را از سرور خارج نمیکند، فقط نشست را Disconnect میکند. نشست قطعشده همچنان در حافظهٔ سرور زنده است، برنامههایتان اجرا میشوند و مهمتر از همه، یکی از آن دو ظرفیت را در اختیار دارند.
اگر دو کاربر (یا حتی یک کاربر در دو نوبت با دو اکانت) این کار را انجام دهند، نفر بعدی دقیقاً همین پیغام خطا را میگیرد. راه درست خروج، منوی Start و گزینهٔ Sign out یا Log off است؛ چه روی سرور اختصاصی و چه روی سرور ابری که سیستمعامل دلخواه شما (ویندوز یا لینوکس) روی آن نصب میشود و دسترسی کامل ادمین دارید.
راه حل فوری: اتصال با سوییچ /admin
اولین چیزی که باید امتحان کنید، اتصال در حالت مدیریتی است. در پنجرهٔ Run یا Command Prompt سیستم خودتان بنویسید (بهجای xxx.xxx.xxx.xxx آیپی سرور خودتان را بگذارید):
mstsc /v:xxx.xxx.xxx.xxx /admin
اگر پورت RDP سرور را تغییر دادهاید، پورت را هم اضافه کنید:
mstsc /v:xxx.xxx.xxx.xxx:3390 /admin
در ویندوز سرور ۲۰۰۳ نام این سوییچ /console بود و از ویندوز سرور ۲۰۰۸ به بعد جای خود را به /admin داده است. اتصال در این حالت CAL مصرف نمیکند و اغلب وقتی نشستهای عادی پر است باز هم شما را وارد سرور میکند؛ اما تضمینی نیست و اگر هر دو نشست مدیریتی واقعاً اشغال باشد باید یکی را ببندید.
دیدن و بستن نشستهای باز از راه دور
برای بستن یک نشست لازم نیست اول وارد سرور شوید. اگر به ویندوز دیگری دسترسی دارید، از Command Prompt همان سیستم فهرست نشستها را بگیرید:
query session /server:xxx.xxx.xxx.xxx
خروجی، ستونهای SESSIONNAME و USERNAME و ID و STATE را نشان میدهد. هر ردیفی که STATE آن Disc باشد یک نشست قطعشده اما زنده است. دستور quser /server:xxx.xxx.xxx.xxx همین فهرست را همراه با نام کاربر و مدت بیکاری (idle time) خواناتر نشان میدهد. qwinsta هم معادل query session است.
سپس نشست موردنظر را با شمارهٔ ID آن ببندید:
logoff 2 /server:xxx.xxx.xxx.xxx
هشدار: دستور logoff بدون هیچ تأییدیهای نشست را میبندد و هر چیز ذخیرهنشدهای از بین میرود. پیش از اجرا با quser مطمئن شوید کدام ID متعلق به کیست و آن نشست وسط کار حساسی مثل بکاپگیری یا آپدیت ویندوز نباشد. روی سرورهایی که کارشان اجرای دائمی نرمافزار است این نکته مهمتر هم میشود؛ مثلاً روی یک سرور مجازی ترید کاربر عمداً Disconnect میکند تا نرمافزار معاملاتی بدون وقفه اجرا شود و log off کردن آن نشست یعنی متوقفشدن همان نرمافزار.
اگر نشستی گیر کرده و به logoff پاسخ نمیدهد، میتوانید آن را بهزور پایان دهید:
reset session 2 /server:xxx.xxx.xxx.xxx
دو نکتهٔ عملی: این دستورها باید با یک حساب ادمین روی سرور مقصد اجرا شوند. اگر سیستم شما عضو دامنه نیست، ابتدا اعتبارنامه را بسازید:
net use \xxx.xxx.xxx.xxxIPC$ /user:Administrator
و اگر فایروال بین شما و سرور فقط پورت RDP را باز گذاشته باشد، این ابزارها کار نمیکنند؛ چون به سرویسهای RPC و SMB نیاز دارند، نه به پورت ریموت دسکتاپ.
مدیریت گرافیکی نشستها
در ویندوز سرور ۲۰۰۸ و ۲۰۰۸ R2 کنسول Remote Desktop Services Manager با دستور tsadmin.msc فهرست نشستها را نشان میداد و با راستکلیک میشد Disconnect یا Log off کرد. از ویندوز سرور ۲۰۱۲ به بعد این کنسول حذف شده است. جایگزینهای امروزی:
- تب Users در Task Manager سرور: فهرست کاربران متصل را نشان میدهد و با راستکلیک میتوانید Sign off بزنید.
- اگر نقش RDS نصب باشد، از Server Manager و بخش Remote Desktop Services میتوانید نشستهای هر Collection را ببینید و ببندید.
- در غیر این صورت، همان دستورهای
query sessionوlogoffسریعترین و مطمئنترین راه هستند.
چطور کاری کنیم دیگر تکرار نشود
بهجای اینکه هر بار دستی نشستها را ببندید، به ویندوز بگویید نشستهای قطعشده را پس از مدتی خودش پایان دهد. در gpedit.msc به این مسیر بروید:
Computer ConfigurationAdministrative TemplatesWindows ComponentsRemote Desktop ServicesRemote Desktop Session HostSession Time Limits
(در ویندوز سرور ۲۰۰۸ بهجای Remote Desktop Services عبارت Terminal Services نوشته شده است.) دو سیاست مهماند: Set time limit for disconnected sessions که تعیین میکند نشست قطعشده چقدر زنده بماند، و End session when time limits are reached که باعث میشود پس از آن زمان نشست واقعاً پایان یابد. بعد از تنظیم gpupdate /force را اجرا کنید. در انتخاب مقدار زمان دقت کنید؛ عدد خیلی کوچک، کارهای طولانی را که عمداً در نشست قطعشده رها شدهاند نیمهکاره میکشد. اگر ترجیح میدهید این تغییرها روی یک سرور تولیدی دستکاری نشود، میتوانید کار را به تیم پشتیبانی و مدیریت سرور بسپارید؛ این تیم پیکربندی و امنسازی سرورهای ویندوزی و لینوکسی را بر عهده میگیرد.
اگر واقعاً به بیش از دو کاربر همزمان نیاز دارید
اینجا باید صادق بود: هیچ ترفند رجیستری، این محدودیت را بهشکل قانونی و پایدار برنمیدارد. برای چند کاربر همزمان واقعی باید نقشهای Remote Desktop Session Host و Remote Desktop Licensing را نصب و سرور لایسنس را فعال کنید و از مایکروسافت لایسنس RDS CAL بخرید؛ ترتیب این کار و تفاوتش با محدودیت پیشفرض دو نشست مدیریتی در راهنمای اتصال همزمان چند کاربر به سرور ویندوزی باز شده است. اگر در همین مسیر به پیغام خطای لایسنس برخوردید، حل ارور لایسنس ریموت دسکتاپ در ویندوز سرور را ببینید. طبق مستندات مایکروسافت این لایسنسها دو مدل Per User و Per Device دارند و یک دورهٔ مهلت ۱۲۰ روزه وجود دارد که در آن سرور بدون سرور لایسنس کار میکند؛ پس از پایان آن، اتصالها رد میشوند.
پچهای غیررسمی که ادعا میکنند محدودیت را دور میزنند، هم نقض شرایط لایسنساند و هم معمولاً با اولین آپدیت امنیتی ویندوز از کار میافتند و سرویس RDP را روی سرور تولیدی از دسترس خارج میکنند.
منابع سختافزاری را هم فراموش نکنید. هر نشست RDP سهم خودش را از رم و پردازنده میگیرد؛ سروری که برای دو ادمین کافی بود، با ده کاربر همزمان میتواند بهوضوح کند شود. اگر برنامهتان میزبانی چند کاربر همزمان است، از ابتدا سراغ منابع بزرگتر یا یک سرور فیزیکی اختصاصی بروید.
وقتی هیچ راهی برای ورود نمانده
اگر ویندوز دیگری در دسترس ندارید و /admin هم جواب نداد، از کنسول یا KVM ارائهدهندهٔ سرور استفاده کنید؛ دسترسی کنسول مستقل از سرویس RDP کار میکند؛ در سرورهای مجازی هم همین دسترسی از طریق پنل مدیریت سرور مجازی در ناحیه کاربری فراهم است و از همانجا میتوانید نشستها را ببندید. ریاستارت سرور آخرین گزینه است، نه اولین؛ چون همهٔ سرویسها و کارهای در جریان را قطع میکند و اگر عادت log off نکردن اصلاح نشود، چند روز بعد دوباره به همینجا میرسید.
جمعبندی: این پیغام یک محدودیت لایسنسی ویندوز سرور است، نه نشانهٔ خرابی. با /admin وارد شوید، با query session نشستهایی را که در وضعیت Disc ماندهاند پیدا کنید و با logoff ببندید؛ سپس با یک سیاست زمانی برای نشستهای قطعشده، جلوی تکرار آن را بگیرید.