How-To: Стартиране на Explorer.exe като отделен процес

[ UPDATED – 2009.03.09 ]

Explorer.exe е важен компонент на операционната система Windows. Приложението е многонишково(multithreaded application) и изпълнява две основни роли:

  • (GUI) Shell – съдържа графичните (и неграфичните)инструменти,чрез които потребителят взаимодейства с операционната система: Desktop, Context Menus, Start Menu, TaskBar, System Tray и т.н.
  • File Manager – познатият на всички ни файлов мениджър

Особеното е, че Explorer.exe се стартира еднократно за всяка потребителска конзолна или терминална сесия. При зареждането си той проверява дали вече е стартиран:

  1. АКО НЕ Е- explorer.exe се зарежда като шел (shell) и потребителят вижда десктопа, иконите по него, стартовото меню, лентата със задачите и системния трей.
  2. АКО Е- зарежда се файловия мениджър, който всички познаваме като Windows Explorer / My Computer

Причината за това поведение е пестене на памет. Има един основен процес, който създава нишки за останалите си видими инстанции. При мен Explorer.exe консумира около 15 MB памет (реална + виртуална). Представете си колко ресурси бихме “изяли” ако стартираме5 пъти My Computer като отделен процес 🙂

Жертва на този подход е стабилността. Ако една от инстанциите на Windows Explorer / My Computer забие – увисват всички останали инстанции, барабар със стартовото меню и лентата със задачите. Всички сме виждали подобно нещо – изведнъж прозорците остават недоизрисувани (примерно). Много често това се случва ако разлиствате съдържанието на споделена папка на компютър, до който имате бавна връзка (WAN). Примерно \\anotherComputer\sharedFolder\Documents.

Разлистването на съдържанието на папка или устройство е доста просто нещо – цъквате с мишката и то си се случва. На заден план обаче се случват далеч повече неща: намират се свойствата на папката/устройството (т.е. дали е харддиск, назначено устройство, преносимо устройство и т.н.), вътрешно се разлиства съдържанието на обекта, за всеки подобект (файл/папка) се извлича съответната икона, прави се проверка на асоциациираните програми, на базата на разширението, инициализират се вътрешните структури на приложението и интерфейса, визуализират се резултатите и т.н.

Всичко това може да отнеме доста време ако се прави през бавна връзка на отдалечен компютър. По време на този процес интерфейсът (самият прозорец + неговите елементи) не се опреснява и виждаме въпросното “забиване”. Е…забиването може и да е от друго, но ефектът е същия 🙂

Лично аз намирам това “поведение” на Explorer.exe за пълна недомислица от страна на Майкрософт. Би било редно процесът на изследване на отдалечените папки да става в отделна нишка – т.е. интерфейсът да не забива. До колкото знам във Windows Vista е направено по-интелигентно, но пак имаше някакви драми 🙂

Защо ни е Explorer.exe като отделен процес в същата сесия?

Причините са няколко:

  1. Може да искаме отделна инстанция на Windows Explorer / My Computer, в която да разлистваме съдържанието на споделен ресурс на компютър през бавна връзка. Зависването само на тази инстанция няма да влияе на останалите процеси и ще можем да си работим спокойно
  2. RUN AS – за мен лично това е най-голямата драма. Представете си, че работите с ограничен потребител (браво за което!). Използвате RunAs, за да стартирате определени приложения с по-високи привилегии. Обаче идва момент, когато трябва да направите нещо в контролния панел. А той е…shell разширение, което автоматично значи, че се отваря с инстанция на Windows Explorer / My Computer. Цъкате RunAs на Explorer.exe и … ооооп – изненадаааа – НЕ МОЖЕТЕ да направите RunAs на Explorer.exe?!? Защото explorer.exe вече е зареден като процес и не поддържа RunAs за подинстанциите си. Честито на печелившите 🙂

Едина от врътките преди време беше да направите RunAs на иконката Internet Explorer в quick launch. Записвате си алтернативния потребител и парола и IE се стартира в контекста на този потребител. След това в адресната лента просто записвате примерно c:\ и хоп – имате достъпдо устройствата и контролния панел в контекста на въведения преди това потребител. Това обаче работеше до IE6. При IE7 това не може да се случи 🙁

Как да стартираме Explorer.exe като отделен процес тогава?

Официално това не е възможно. Е, има някакви TWEAK-ове, но е много съмнително дали въобще работят, освен това едно и също нещо е описано по различен начин във форумите и май важи само за Windows XP. Тъй че – забравете за този подход и не си губете времето 🙂

Та стартирането като отделен процес нямаше да е възможно ако разни хора не бяха документирали едни недокументирани command-line параметри на Explorer.exe 🙂 Преди време случайно попаднах на едно такова описание. Тествам го повече от 6 месеца и съм много доволен 🙂

Ключът от палатката:

Недокументираният параметър /SEPARATE
Той указва на Explorer.exe да се стартира като отделен процес НЕЗАВИСИМО дали вече е зареден.

Пример за изписване:

[code]explorer.exe /separate[/code]

Резултатът е красноречив:

[singlepic=143]

Уникално просто! Било ни е пред очите толкова години, ама…кой да ни каже? 🙂

Маркираният процес Explorer.exe е тази инстанция, която е заредена и като Shell. Затова е глътнала толкова много ресурси. Но както виждате и останалите инстанции не са глътнали малко 🙂

Недостатъците:

  • всяка инстанция консумира не малко памет (средно 15-19 MB)
  • времето за зареждане/ визуализиране се увеличава – процесът се стартира, инициализира и енумерира изначало, което довежда до по-бавно зареждане

За щастие /SEPARATE може да се комбинира с останалите параметри на Explorer.exe, които описах преди време тук. Ето и един пример, в който стартираме Explorer.exe като отделен процес в двупрозоречен режим и маркираме My Computer:

[code]explorer.exe /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D},/separate[/code]

Explorer.exe, сепарирането и RunAS.

Вече спокойно можете да работите с лимитиран потребител. Когато Ви потрябва административен достъп до контролния панел просто използвайте RunAs в команден ред:

[code]runas.exe /user:computerNameOrDomainName\adminUserName “explorer.exe /separate”[/code]

След като си въведете паролата Explorer.exe ще се зареди като отделен процес в контекста на потребителя computerNameOrDomainName\adminUserName. Обърнете специално внимание на кавичките!

Неудобството тук е, че трябва да въвеждате паролата на другия потребител. RunAsне приема като параметър парола. Причината е проста – админите ще вземат да слагат административни пароли в чист вид в разни скриптове, което си е…трагедия 🙂

Ако все пак искате да си сложите главата в торбата и да автоматизирате подобно стартиране можете да използвате psexec.exe на SysInternals:

За локалния компютър:
[code]psexec -i -d -u computerNameOrDomainName\UserName -p yourPassword explorer.exe /separate[/code]

Заотдалечен компютър:
[code]psexec \\theRemoteComputerName -i -d -u computerNameOrDomainName\UserName -p yourPassword explorer.exe /separate[/code]

-i = interactive

-d = don’t wait the process to exit

Подчертавам дебело, че поставянето на административни пароли или какви да е пароли в скриптове в явен вид е тотално лоша практика! По-добре би било да си изпрограмирате вариант на RunAs, който приема паролата в някакъв криптиран вид. Звучи трудно, но всичко се свежда до само една две API функции: CreateProcessWithLogonW или CreateProcessAsUser, а даже и без парола за такущия потребител: CreateProcessWithTokenW

[ UPDATED – 2009.03.09 ]:

Добавяне на опция в контекстното меню за стартиране на Explorer.exe като отделен процес.

Иван даде много добра идея 🙂 Това може да стане чрез добавка в регистрито. Кодът е:

[code]Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\_Explorer S_E_P_A_R_A_T_E]

[HKEY_CLASSES_ROOT\*\shell\_Explorer S_E_P_A_R_A_T_E\command]
@=”Explorer.exe /e,/separate,/select,\”%L\””

[HKEY_CLASSES_ROOT\folder\shell]

[HKEY_CLASSES_ROOT\folder\shell\_Explorer S_E_P_A_R_A_T_E]

[HKEY_CLASSES_ROOT\folder\shell\_Explorer S_E_P_A_R_A_T_E\command]
@=”Explorer.exe /e,/separate,\”%L\””

[/code]

Този код съхранете във файл с произволно име, но с разшиние .reg. След това го “стартирайте”. Новите настройки ще се отразят в регистрито на момента.

* текстът в контекстното меню можете да замените чрез редактиране на частите “_Explorer S_E_P_A_R_A_T_E”

В резултат се случват две неща:

  1. При десен бутон върху файл излиза опция _Explorer S_E_P_A_R_A_T_E, чрез която се отваря explorer.exe в отделен процес с две рамки. В дясната е маркиран избраният преди това файл (просто за удобство)
  2. При десен бутон върху папка излиза опция _Explorer S_E_P_A_R_A_T_E, чрез която се отваря explorer.exe в отделен процес с две рамки. Маркирана и разгърната е избраната в началото папка.

За съжаление този метод не работи добре със специалните папки като: Control Panel и Network Places

Още веднъж – мерси на Иван А.! 🙂

Винаги има решение…въпрос на време е да го открием 🙂

3 thoughts on “How-To: Стартиране на Explorer.exe като отделен процес

  1. a kakvo moje da se napravi taka che kogato izberem ot kontektstnoto meniu nqkoq direktoriq v tova kontekstno meniu da ima red “explore separate” i da rechem “explore separate runas..” koito suotvetno da ni davat vuzmojnost da startirame explorera v rejim /separate i eventualno v rejim /separate no pod rug potrebitel … (eh murzel, murzel … 🙂 ) mislq che imashe nachin da se dobavqt redove v kontekstnoto meniu (mnogo polezno mi se vidq “open in notepad” ) samo che sam zabravil kak stavashe tochno , a sam zabravil i ot kade mojeh da go procheta 🙁

  2. Интересна идейка 🙂 Ще проверя какво може да се направи по въпроса 🙂

  3. Намерих решение и ъпдейтнах статията 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *