Переменные среды, показанные командой SET, могут заметно отличаться в зависимости от уровня привилегий сеанса командной строки. Более того, кажется, что любая программа, запущенная с учетными данными администратора одним и тем же пользователем, может создавать переменные среды, которые будут сохраняться еще долго после завершения этого процесса и будут устанавливаться в любом последующем процессе с повышенными правами, запущенном этим пользователем (и ТОЛЬКО в этих процессах с повышенными правами). Мне не удалось найти эти переменные на вкладке «Среда», отображаемой в Process Explorer, для любого процесса, связанного с сеансом входа пользователя в систему. Мой вопрос: где хранятся эти значения и почему Process Explorer не может получить к ним доступ (конечно, поскольку Process Explorer по умолчанию работает с повышенными правами, эти переменные отображаются на его собственной вкладке «Среда»)? Или я их просто не заметил?
3 ответа
Откуда берутся переменные среды для процесса с повышенными правами cmd.exe?
Как и все процессы, он получает свою среду от процесса, который породил экземпляр командной строки.
Когда процесс порождает другой процесс, дочерний процесс наследует родительскую среду. Если родитель был привилегированным, то он, вероятно, имеет больше / других переменных, чем если бы он не был. Когда он порождает дочерний процесс, дочерний процесс получает тот же набор для запуска.
Переменные среды, показанные командой SET, могут заметно отличаться в зависимости от уровня привилегий сеанса командной строки.
Потому что, когда Explorer фактически не порождает привилегированные процессы, CSRSS делает. Когда вы запускаете программу «как администратор», вы получаете приглашение UAC, которое затемняет экран. Это связано с тем, что CSRSS является системным процессом, который обрабатывает запросы UAC и повышение прав. Таким образом, в то время как Explorer и его дочерние процессы имеют одну среду, командная строка с повышенными правами (которая порождается системным процессом с высокими привилегиями по указанию Explorer) получает немного другой набор с некоторыми дополнительными / различными переменными.
Более того, кажется, что любая программа, запускаемая с учетными данными администратора одним и тем же пользователем, может создавать переменные среды, которые сохранятся еще долго после завершения этого процесса и будут установлены в любом последующем процессе с повышенными правами, запущенном этим пользователем (и ТОЛЬКО в этих процессах с повышенными правами).
Нету. Команда set
только для сессии. После того, как вы закроете эту командную строку, все внесенные вами изменения будут сорваны. Чтобы внести постоянные изменения, вы должны использовать внешний инструмент, такой как сторонняя утилита или программа Microsoft setx
. Это верно даже для повышенных командных строк; Команда set
просто не имеет функций для изменения среды в реестре.
Мне не удалось найти эти переменные на вкладке «Среда», отображаемой в Process Explorer, для любого процесса, связанного с сеансом входа пользователя в систему.
Потому что любые изменения, которые вы делаете с помощью set
будут видны только в этой конкретной командной строке и любых процессах, которые вы запускаете из этой конкретной командной строки; изменения не распространяются на другие процессы.
Мой вопрос: где хранятся эти значения и почему Process Explorer не может получить к ним доступ (конечно, поскольку Process Explorer по умолчанию работает с повышенными правами, эти переменные отображаются на его собственной вкладке «Среда»)? Или я их просто не заметил?
Переменные сеанса хранятся в среде этой конкретной командной строки. Process Explorer может видеть их для этого конкретного экземпляра cmd
, но они не будут присутствовать ни в одном другом процессе. Если вы запустите программу из этой командной строки, вы сможете увидеть эти изменения на вкладке « Среда » дочернего процесса в Process Explorer, поскольку она унаследует их от этой командной строки.
Если вы используете программу, подобную setx
для установки постоянной переменной, то они будут сохранены в реестре. Если вы установите переменную уровня пользователя (для текущего пользователя), она будет сохранена в HKCU\Environment
(или HKU\<USER>\Environment
для других пользователей). Если вы установите переменную системного уровня, она будет сохранена в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
Имейте в виду, что если вы вручную измените среду через реестр, изменения внесут только новые процессы. Чтобы заставить существующий процесс увидеть изменения, вы должны либо перезапустить их, либо передать сообщение WM_SETTINGCHANGE
. (Такие инструменты, как setx
передают сообщение всем окнам верхнего уровня.)
Не совсем понятно, как именно задаются переменные среды во вновь созданном процессе с повышенными правами, но большинство из них поступают из существующего набора текущего пользователя (как показано командой SET без повышения прав cmd.exe), а также из любых, которые существует в разделе реестра пользователя HKCU/Volatile Environment, который был создан с начала текущего сеанса входа в систему (или текущего экземпляра Explorer?) и не отображаются в списке без повышения SET. В моей Windows 10 есть несколько переменных, которые встречаются в списке без повышенных прав, но не с повышенными.
Этот вопрос был мотивирован поведением более старых версий Macrium Reflect, которое обсуждается по адресу https://forum.macrium.com/Topic752-1.aspx . Текущая версия этой программы теперь создает эти проблемные переменные в HKU/.ПО УМОЛЧАНИЮ /Volatile Environment (AKA HKU/S-1-5-18 /Volatile Environment) вместо ключа HKCU.
Я думаю, что вывод SET
может отличаться, только если вы не вошли в систему как член группы администраторов. Вот почему вас просят ввести имя пользователя / пароль в этом случае, вы фактически входите в систему как администратор этого процесса.
Если вы уже являетесь членом группы администраторов, то вывод SET одинаков для меня в обоих случаях.
Поэтому, если моя гипотеза верна, переменные с повышенными привилегиями определяются как пользовательские переменные для администратора.