![Откуда берутся переменные среды для процесса cmd.exe с повышенными привилегиями?](https://rvso.com/image/1330226/%D0%9E%D1%82%D0%BA%D1%83%D0%B4%D0%B0%20%D0%B1%D0%B5%D1%80%D1%83%D1%82%D1%81%D1%8F%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%81%D1%80%D0%B5%D0%B4%D1%8B%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B0%20cmd.exe%20%D1%81%20%D0%BF%D0%BE%D0%B2%D1%8B%D1%88%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8%20%D0%BF%D1%80%D0%B8%D0%B2%D0%B8%D0%BB%D0%B5%D0%B3%D0%B8%D1%8F%D0%BC%D0%B8%3F.png)
Переменные среды, отображаемые командой SET, могут существенно различаться в зависимости от уровня привилегий сеанса командной строки. Более того, похоже, что любая программа, запущенная с административными учетными данными тем же пользователем, может создавать переменные среды, которые будут сохраняться долгое время после завершения этого процесса и будут установлены в любом последующем повышенном процессе, запущенном этим пользователем (и ТОЛЬКО в этих повышенных процессах). Мне не удалось найти эти переменные на вкладке Environment, отображаемой Process Explorer для любого процесса, связанного с сеансом входа пользователя. Мой вопрос: где хранятся эти значения и почему Process Explorer не может получить к ним доступ (конечно, поскольку Process Explorer по умолчанию работает с повышенными привилегиями, эти переменные отображаются на его собственной вкладке Environment)? Или я просто их пропустил?
решение1
Откуда берутся переменные среды для процесса cmd.exe с повышенными привилегиями?
Как и все процессы, он получает свою среду от процесса, породившего экземпляр командной строки.
Когда процесс порождает другой процесс, дочерний процесс наследует среду родителя. Если родитель был привилегированным, то у него, вероятно, больше/других переменных, чем если бы он не был привилегированным. Когда он порождает дочерний процесс, дочерний процесс получает тот же набор для начала.
Переменные среды, отображаемые командой SET, могут существенно различаться в зависимости от уровня привилегий сеанса командной строки.
Потому что когда Explorer на самом деле не порождает привилегированные процессы, CSRSS это делает. Когда вы запускаете программу «как администратор», вы получаете запрос UAC, который затемняет экран. Это происходит потому, что CSRSS — это системный процесс, который обрабатывает запросы UAC и повышение прав процесса. Таким образом, в то время как Explorer и его дочерние процессы имеют одну среду, повышенную командную строку (которая порождается системным процессом с высокими привилегиямипо волеExplorer) получает немного другой набор с некоторыми дополнительными/другими переменными.
Более того, похоже, что любая программа, запущенная с правами администратора тем же пользователем, может создавать переменные среды, которые будут сохраняться долгое время после завершения этого процесса и будут установлены в любом последующем процессе с повышенными правами, запущенном этим пользователем (и ТОЛЬКО в этих процессах с повышенными правами).
Нет. set
Команда действует только в течение сеанса. Как только вы закроете эту командную строку, все внесенные вами изменения будут потеряны. Чтобы внести постоянные изменения, вам необходимо использовать внешний инструмент, например стороннюю утилиту или программу Microsoft tool setx
. Это касается даже командных строк с повышенными привилегиями; set
у команды просто нет функциональности для изменения среды в реестре.
Мне не удалось найти эти переменные на вкладке «Среда», отображаемой в Process Explorer, ни для одного процесса, связанного с сеансом входа пользователя.
Потому что любые изменения, которые вы внесете, set
будут видны только вчто конкретныйкомандная строка и любые процессы, которые вы запускаете изЭтот конкретныйкомандная строка; изменения не распространяются на другие процессы.
Мой вопрос: где хранятся эти значения, и почему Process Explorer не может получить к ним доступ (конечно, поскольку Process Explorer по умолчанию работает с повышенными правами, эти переменные отображаются на его собственной вкладке Environment)? Или я просто их проглядел?
Переменные сеанса хранятся в среде этой конкретной командной строки. Process Explorer может видеть их для этого конкретного экземпляра cmd
, но они не будут в каком-либо другом процессе. Если вы запустите программу из этой командной строки, то вы сможете увидеть эти изменения в дочернем процессе.Средавкладку в Process Explorer, поскольку она унаследовала их из этой командной строки.
Если вы используете программу, например, setx
для установки постоянной переменной, то они будут сохранены в реестре. Если вы устанавливаете переменную уровня пользователя (для текущего пользователя), то она будет сохранена в HKCU\Environment
(или HKU\<USER>\Environment
для других пользователей). Если вы устанавливаете переменную уровня системы, то она будет сохранена в HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
Имейте в виду, что если вы вручную измените среду через реестр, только новые процессы подхватят изменения. Чтобы существующий процесс увидел изменения, вам нужно либо перезапустить его, либо транслировать сообщение WM_SETTINGCHANGE
. (Инструменты, такие как setx
трансляция сообщения всем окнам верхнего уровня.)
решение2
Я думаю, что вывод SET
может отличаться только тогда, когда вы не вошли в систему как член группы администраторов. Вот почему вас просят ввести имя пользователя/пароль в этом случае, на самом деле вы входите в систему как администратор для этого процесса.
Если вы уже являетесь членом группы администраторов, то вывод SET для меня одинаков в обоих случаях.
Следовательно, если моя гипотеза верна, переменные с повышенными привилегиями определяются как пользовательские переменные для администратора.
решение3
Не совсем понятно, как именно задаются переменные среды в недавно созданном повышенном процессе, но большинство из них берутся из существующего набора текущего пользователя (как показано неповышенной командой cmd.exe SET), а также из любых, которые существуют в разделе реестра HKCU/Volatile Environment пользователя, которые были созданы с начала текущего сеанса входа (или текущего экземпляра Explorer?) и не отображаются в неповышенном списке SET. В моей Windows 10 есть несколько переменных, которые встречаются в неповышенном списке, но не в повышенном.
Этот вопрос был вызван поведением старых версий Macrium Reflect, которое обсуждается наhttps://forum.macrium.com/Topic752-1.aspxТекущая версия этой программы теперь создает эти проблемные переменные в HKU/.DEFAULT/Volatile Environment (также известном как HKU/S-1-5-18/Volatile Environment), а не в ключе HKCU.