Звідки беруться змінні середовища для підвищеного cmd.exe процесу?
Як і всі процеси, воно отримує своє оточення від процесу, який породив екземпляр командно-рядкового рядка.
Коли процес породжує інший процес, дочірній процес успадковує батьківське середовище. Якщо батько отримав привілей, то він, ймовірно, має більше / різних змінних, ніж якщо його немає. Коли вона породжує дитячий процес, дитина отримує той самий набір, щоб почати.
Змінні середовища, показані командою SET, можуть помітно відрізнятися залежно від рівня привілеїв сеансу командного рядка.
Тому що, коли Explorer фактично не породив привілейовані процеси, це робить CSRSS. Запускаючи програму «як адміністратор», ви отримуєте підказку UAC, яка затемнює екран. Це пояснюється тим, що CSRSS - це системний процес, який обробляє підказки UAC та підвищення процесу. Тож як у Провідника та його дочірніх процесів є одне середовище, підвищений командний рядок (який породжений системним процесом з високими привілеями за бажанням Провідника) отримує дещо інший набір з деякими додатковими / різними змінними.
Крім того, здається, що будь-яка програма, запущена з адміністративними обліковими даними тим самим користувачем, може створювати змінні середовища, які зберігатимуться довгий час після закінчення цього процесу і встановлюватимуться в будь-якому наступному підвищеному процесі, запущеному цим користувачем (і ТІЛЬКИ в цих підвищених процесах).
Ні. set
Команда тільки на час сеансу. Щойно ви закриєте цей командний рядок, будь-які внесені вами зміни починаються з пусту Щоб вносити постійні зміни, потрібно використовувати зовнішній інструмент, як стороння утиліта або програма інструментів Microsoft setx
. Це стосується навіть підвищених командних підказок; set
команда просто не має функціональних можливостей для зміни навколишнього середовища в реєстрі.
Мені не вдалося знайти ці змінні на вкладці "Навколишнє середовище", що відображається Process Explorer, для жодного процесу, пов'язаного з сеансом входу користувачів.
Тому що будь-які зміни, які ви вносите, set
будуть видимі лише в тій конкретній командному рядку та будь-яких процесах, які ви запускаєте з цієї конкретної командної лінії; зміни не поширюються на інші процеси.
Моє запитання полягає в тому, де зберігаються ці значення, і чому процесор Explorer не може отримати доступ до них (звичайно, оскільки Process Explorer за замовчуванням працює піднятим, ці змінні відображаються на його власній вкладці "Середовище")? Або я просто їх не помітив?
Змінні сеансу зберігаються в конкретному середовищі командного рядка. Провідник процесів може бачити їх для конкретного примірника cmd
, але вони не будуть в жодному іншому процесі. Якщо ви запускаєте програму з цього командного рядка, ви можете побачити ці зміни на вкладці « Довкілля процесу» у «Проводнику процесів», оскільки вона отримала їх у спадок від цього командного рядка.
Якщо ви використовуєте таку програму, як setx
для встановлення стійкої змінної, вони будуть зберігатися в реєстрі. Якщо встановити змінну рівня користувача (для поточного користувача), вона буде зберігатися в HKCU\Environment
(або HKU\<USER>\Environment
для інших користувачів). Якщо встановити змінну на рівні системи, вона буде зберігатися в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
Майте на увазі, що якщо ви вручну модифікуєте середовище за допомогою реєстру, зміни вибиратимуть лише нові процеси. Щоб отримати існуючий процес, щоб побачити зміни, потрібно або перезапустити їх, або транслювати WM_SETTINGCHANGE
повідомлення. (Такі засоби, як setx
трансляція повідомлення у всі вікна верхнього рівня.)