خطای (The file exists. (Exception from HRESULT: 0x80070050 و نحوه بازیابی سایت های شرپوینت ناشی از این خطا

چند ماه پیش در حین کار با شرپوینت سرور با خطای زیر مواجه شدم که با استفاده از یکسری راهکارها و ترفندها تونستم اون رو حل کنم و شرپوینت سرورم رو از نصب مجدد باز دارم! من راه حل های این خطا رو که در ادامه تشریح کردم، به صورت انگلیسی هم در این آدرس منتشر کردم که این مطلب کمک زیادی به خیلی از کارشناسان شیرپوینت کرده و این موضوع از نظراتی که برای اون پُست ارسال شده مشخص است.

اما تشریح جزئیات این پیغام خطا :

" مشکل از اونجا شروع شد که من به دلایلی و به خاطر نیازی که داشتم، تصمیم گرفتم تا بر روی ویندوز ۲۰۰۳ سرور که بر روی آن شرپوینت سرور نصب شده بود، Exchange Server (EXS) نصب کنم. برای اینکار ابتدا باید Active Directory (AD) رو روی ویندوز نصب می کردم تا بتونم EXS رو نصب کنم. (تا قبل از این، شرپوینت سرور ، اطلاعات مربوط به کاربران سیستم رو از بخش مدیریت کاربران ویندوز می خوند.)

پس از نصب اکتیو دایرکتوری و بعد از اون Exchange Server، زمانی که خواستم Central Administrator شرپوینت رو در مرورگر اینترنت باز کنم با پیغام خطای زیر مواجه شدم!!

The file exists. (Exception from HRESULT: 0x80070050)

بعد تلاش کردم تا سایر سایت های شرپوینتیم رو باز کنم و برای همه Web Application ها باز هم با همون پیغام مواجه شدم!! خیلی عجیب بود! چون نمی تونستم سایت هام رو با اون همه اطلاعات که داخلشون ایجاد و ثبت کرده بودم ببینم! احساس کردم همه چی تموم شده و باید مجدداً شرپوینت رو Reinstall کنم! تصمیم گرفتم حالا که قراره این کارو انجام بدم، قبلش یه تحقیقی در مورد این خطا در اینترنت انجام بدم، شاید کسی براش راه حلی داشته باشه. اکثر سایت ها و وبلاگها رو که به نوعی با این مشکل مواجه شده بودند خوندم. متاسفانه اکثراً یا پاسخی رو پیدا نکرده بودند یا تصمیم گرفته بودند شرپوینت سرور رو دوباره نصب کنن!!! اما این کار واسه شرکتها و سازمانهای بزرگ که کلی اطلاعات و دیتا روی سایتهای شرپوینتشون نصبه و چندین ساله که سایتشون فعاله خیلی ریسک بزرگیه و یعنی همه چی از اول!!! خیلی از Admin های سایت های بزرگ هم دنبال راه حلی واسه این مشکل در وبلاگها و سایتهای مختلف بودند، اما راه حل منطقی ای برای حلش پیدا نکرده بودند!

اینکار واقعاً اشتباه هست که شما بعد از نصب شرپوینت سرور بخواهید اکتیو دایرکتوری نصب کنید، ولی من اینکار رو انجام دادم،اما در عوض اشتباه خودم رو با روشی که در زیر توضیح می دم جبران کردم! 😉

تقریباً یک روزی دنبال راه حل واسه این مشکل بودم! تا اینکه علت اصلی رو پیدا کردم و از ترکیب چند تا ترفند جالب و البته عجیب! این مشکل رو حل کردم و تونستم مجدداً سایتهای شرپوینتم رو به حالت قبل برگردونم!!!!! 😉

بررسی علت خطا:

به طور کلی این خطا زمانی رخ میده که SID (System ID) مربوط به یک کاربر تعریف شده در ویندوز، تغییر کنه و شرپوینت نتونه اونرو تشخیص بده! سیستم عامل ویندوز پس از نصب بر روی یک ماشین، به ازای نام ماشین و کاربرانی که در آن تعریف می شوند یک SID تعریف می کنه. وقتی که روی این سیستم، شرپوینت سرور نصب میشه، شرپوینت اطلاعات مربوط به کاربرانی که به عنوان کاربران شرپوینت تعریف شده اند از جمله (Administrator, Users,..) را به همراه SID مربوط به هر کاربر و نام سایتی که کاربر مجوز دسترسی به آن را دارد در بانک اطلاعاتی(Database) خود ذخیره می کند. حال زمانیکه AD بر روی سیستم نصب می شه این SID های مربوط به هر کاربر نیز تغییر می کنن و اکتیو دایرکتوری برای هر کاربری که در سیستم تعریف شده، یک SID جدید تولید می کنه! این نکته اصلی خطای مورد بحث است!! چون زمانیکه پس از نصب AD تصمیم می گیریم وارد سایت شرپوینتی بشیم، سایت، اطلاعات کاربر رو از دیتابیس می خونه و مشاهده می کنه که SID کاربر معتبر نیست! و پیغام خطای بالا رو نمایش میده!!!! البته این خطا فقط از طریق نصب اکتیو دایرکتوری ایجاد نمیشه،بلکه ممکنه زمانیکه شما آدرس دامین ها در شبکه و یا Domain Controller ها رو تغییر می دید و یا تغییرات اینچنینی که باعث بشه SID کاربران تغییر کنه، این خطا تولید بشه!

روش های حل مشکل :

سه راه حل برای اینکار وجود داره :

روش اول : اینکه از طریق Central Administrator وارد بخش Web Application شده و در قسمت Site Collection Administrator ، کاربران مربوط به سایت رو که از طریق آنها به سایت Login می کردید حذف کنید و سپس مجدداً آنها را از طریق همین قسمت ایجاد کنید تا SID جدید آنها در دیتابیس جایگزین SID قبلی شود.

روش دوم : از Central Administrator وارد بخش Application Management شده و در قسمت Application Security وارد بخش Policy for Web Application شوید. Add User را کلیک کنید و Next را بزنید. نام یک کاربر را از اکتیو دایرکتوری انتخاب کنید و در این قسمت وارد کنید و قسمت Full Control را تیک بزنید و همچنین Account Operate as System را انتخاب نمایید. Finish را برای اتمام کار کلیک نمایید. (اگر به بخش Central Admin دسترسی دارید و اکتیو دایرکتوری هم بر روی سیستم شما نصب است،میتونید از این روش استفاده کنید.)

۲ روش بالا زمانیکه شما به سایت Central Administrator دسترسی داشته باشید مفیدن! ولی اگر مشکلتون مثل مشکل من باشه و نتونید حتی به این بخش هم Login کنید، باید از روش سوم استفاده کنید.

روش سوم : این روش یک روشی هست که نیاز به دقت زیاد داره و باید روی Database شرپوینت یکسری Query بزنید و تغییراتی بدید، من اینکار رو انجام دادم و مشکلم برای تمام سایتهام برطرف شد.

( این تذکر رو به شما می دم که این مراحل زیر رو با مسئولیت و ریسک خودتون باید انجام بدید.)

۱- ابتدا SQL Server رو از طریق Management Studio اجرا کنید. دیتابیس مربوط به سایت شرپوینتی که خطا داشت رو انتخاب کنید به عنوان مثال برای Central Admin باید دیتابیسی با نام Sharepoint_AdminContent_* (که ستاره نمایش دهنده یکسری شماره است) رو انتخاب کنید.

۲- New Query را از منو انتخاب و دستورات زیر رو وارد کنید :

SELECT s.Id, w.FullUrl 
FROM Sites s inner join Webs w on s.RootWebId = w.Id 

مانند شکل زیر :

1

پس از اجرای دستور فوق ID مربوط به سایت های دیتابیس مورد نظر در خروجی نمایش داده میشه.

۲- حال دستورات زیر رو وارد کنید. این دستورات اطلاعات مربوط به کاربر سایت مورد نظر رو از بانک استخراج می کنه :

SELECT * 
FROM UserInfo 
WHERE tp_Login='نام کاربر\نام ماشین' and tp_SiteID='8395827D-3815-470A-8537-409EDC54DA54'

در جلوی قسمت tp_siteID مقداری که از نتیجه Query قسمت اول بدست آوردید وارد کنید. در قسمت tp_Login هم به صورت نام کاربر/نام ماشین وارد کنید.

مانند شکل زیر :

2

۳- حال از خروجی بدست آمده، SID مربوط به این کاربر که Administrator است. برای سایت مورد نظر مشخص شده.حالا باید SID کاربر موجود در سیستم رو برای این کاربر پیدا کنیم و جایگزین این SID موجود در دیتابیس شرپوینت کنیم. برای اینکار از ابزار PSTools که توسط مایکروسافت ارائه شده استفاده می کنیم. این تولز رو از اینجا دانلود کنید. پس از Unzip کردن، از طریق Command Prompt وارد دایرکتوری اون شده و دستور زیر رو وارد کنید :

Psgetsid \\نام ماشین نام کاربر

مانند شکل زیر که SID مربوط به نام ماشین و نام کاربر رو به طور جدا استخراج کرده :

sid

۴- حال باید این SID به دست آمده با فرمت S-n-n-n را به فرم هگزا دسیمال تبدیل کنیم تا بتونیم اونرو در دیتابیس Update کنیم!

برای این کار ابزار خاصی وجود نداره و فقط توسط یکسری راه حلهای خاص که تشریح میکنم این تبدیل رو میشه انجام داد.

فرض کنید SID کاربر به این صورت باشه :

S-1-5-21-4064436893-45162017-310737895-500

تبدیل هگزادسیمال اون به صورت زیر میشه :

۰x0105000000000005150000009D6242F2211EB102E77B8512F4010000

اما اینکه چطور به صورت بالا تبدیل شد رو به طور خلاصه در زیر نشون میدم :

۰x نمایش به هگزادسیمال

۰۱ (S-1)
05 (هفت تا علامت دَش (-) منهای ۲ , ۷-۲ = ۵)
۰۰۰۰۰۰۰۰۰۰۰۵ (۵ = ۰×000000000005, big-endian)
15000000 (21 = 0×15000000, little-endian)
9D6242F2 (4064436893 = 0xF242629D, little-endian)
211EB102 (45162017 = 0x02B11E21, little-endian)
E77B8512 (310737895 = 0x12857BE7, little-endian)
F4010000 (500 = 0x01F4, little-endian)

تبدیل این فرمتها یک مقدار نیاز به دقت داره و کار سختی نیست.برای تبدیل اعداد دسیمال به هگزا هم از یک ماشین حساب مهندسی یا Power Calc مایکروسافت می تونید استفاده کنید.نحوه تبدیل بالا رو از یکی از وبلاگها پیدا کردم و خودم ازش استفاده کردم و براتون نوشتم.

خب! خسته نباشید. یک مقدار پیچیده بود ولی شما به عنوان یک Admin شرپوینت باید این کارهارو انجام بدید تا بتونید از نصب مجدد شرپوینت و برگردوندن اون همه اطلاعات رهایی پیدا کنید!

۵- در مرحله آخر هم شما باید این مقدار هگزادسیمال رو پس از تبدیل در دیتابیس قرار بدید و اونرو آپدیت کنید.برای اینکار دستورات زیر رو در بصورت Query وارد کنید :

UPDATE UserInfo 
SET tp_SystemID = 0x010500000000000515000000B83B756A5D4EEB75EA44AFC7F4010000
FROM UserInfo 
WHERE tp_ID = '1' and tp_guid='7AC7285B-ACEB-4942-AF7E-CD9191FDE5A4' and 
tp_Login= 'نام کاربر\نام ماشین' and tp_SiteID = '8395827D-3815-470A-8537-409EDC54DA54' 

مانند شکل زیر:

 3

برای اینکه بتونم در جدول مربوط به UserInfo فیلد مورد نظر رو دقیق تر مشخص کنم و سطر مربوط به سایت رو برای آپدیت درست انتخاب کرده باشم، به همین دلیل در قسمت Where به همراه پارامتر tp_SiteID که ID سایت مورد نظرم هست، از پارامترهای بیشتری استفاده کردم.شما می تونید با دیدن خروجی بند ۲ این مقاله پارامترهای مربوط به سایت رو(tp_ID,tp_guid) با مقادیرشون مشخص کنید تا سطر دیگری رو اشتباهاً آپدیت نکنید!!!

۶- خب همه چی تمومه! اگه مراحل بالا رو درست و دقیق انجام داده باشید، از این پس با ورود به سایت شرپوینتی دیگه پیغام خطایی نمی بینید و سایت با همه اطلاعاتش به درستی نمایش داده میشه!  "

امیدوارم این تجربه من براتون مفید بوده باشه…

UPDATED : یک راه حل چهارمی هم به این مطلب اضافه می کنم که تجربه دوست عزیزم جمال حسینی است و چند روز پیش به من اطلاع داد. جمال با تغییر UserName و Password موجود در Application Pool سایت در IIS تونسته بود سایت شیرپوینتیش رو برگردونه! البته جمال همون User , pass کاربر Admin رو مجدداً در Application Pool درج کرده بود که با ذخیره تغییرات، شیرپوینت مجدداً SID این کاربر رو در DataBase آپدیت کرده. اینکه آیا این SID در تمام جداول آپدیت شده و یا نه! رو باید بیشتر بررسی کرد.

شاد و موفق باشید.

پاسخ دهید