установить переменную в cmd.exe

Приветствую землян,

Вот мой вопрос:

Как я могу создать программу, которая устанавливает переменную для текущего сеанса cmd.exe, например.

c:\> set myvar
Environment variable myvar not defined
c:\>myexe.exe
c:>set myvar
myvar=myvalue

Единственная похожая тема, которую я нашел, это -

Как изменить оболочку Windows (cmd.exe) переменные окружения из C++?

Но я не понял ни слова из этого:

Есть способ... Просто введите свой код в родительский процесс и вызовите SetEnvironmentVariableA внутри памяти процесса cmd. После инъекции просто освободите выделенную память.

Хотя C/C++ не является моим «родным» языком, я чувствовал себя совершенно потерянным, когда искал в Google «код для ввода C++» и т. д. Есть ли статья, где я могу получить больше информации об этом.

Кстати, теперь я использую один немного глупый обходной путь. Как установить переменную в

HKEY_CURRENT_USER\Окружающая среда

и

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

сравнительно легко, я просто записываю аналогичную переменную в реестр:

load.temp.vars=set myvar1=myval1&set myvar2=myval2& ....

а затем просто вызовите %load.temp.vars% и он будет выполнен как команда:

c:/>%load.temp.vars%
c:/>set myvar1
myvar1=myval1

Работает нормально, но мне этого мало :)

Живи долго и процветай, \\//_


person npocmaka    schedule 10.07.2010    source источник
comment
возможный дубликат Возможно ли изменить среду родительского процесса в python?   -  person Hans Passant    schedule 10.07.2010


Ответы (2)


Прочтите эту статью: Три способа внедрить свой код в другой процесс .

Также вам, вероятно, понадобится дескриптор вашего родительского процесса (чтобы определить целевой процесс, среду которого нужно изменить). Способ его получения описан здесь.

Просто имейте в виду, что инъекция может не работать, в зависимости от привилегий учетной записи пользователя, а также что некоторые особенно параноидальные антивирусные решения могут осуждать ее.

person atzz    schedule 10.07.2010

Есть очень простой способ сделать это без всяких хитростей.

Вы должны написать небольшую программу myexe.exe, которая выводит простой вывод (консольный вывод), как показано ниже:

SET myvar=Some value

затем вы начинаете свою программу со следующих шагов:

myexe.exe >%TEMP%\t.cmd
call %TEMP%\t.cmd
del %TEMP%\t.cmd

Теперь в текущем cmd.exe, который запустил myexe.exe, существует переменная окружения myvar и она имеет значение Some value. Это не совсем то, что вы хотите?

Способ предельно прост и работает на всех версиях Windows (и не только на Windows). Так что это моя рекомендация для вас.

person Oleg    schedule 10.07.2010
comment
ваш пример в том виде, в котором он опубликован, будет работать только в Windows. Однако этот метод универсален (если предположить, что у всех есть какой-нибудь интерпретатор оболочки, такой как Bash). - person rubenvb; 10.07.2010
comment
Я имею в виду метод (или способ) - person Oleg; 10.07.2010
comment
@Johannes: У каждого человека может быть свое мнение. Если вы предпочитаете производить вывод только со значением, чем вам нужно писать больше кода в пакетном режиме, что ОЧЕНЬ медленно, сделайте это. Более того, в реальной ситуации нужно задать не одну, а набор переменных окружения. В этом случае вывод нескольких строк SET myvar=Some value - лучшее решение, которое я знаю. У меня был первый опыт решения такой задачи в MS DOS с использованием недокументированных, но хорошо известных возможностей. Позже я пробовал разные способы и нашел этот способ, который считаю лучшим. Если вы предпочитаете другой способ, пожалуйста, используйте его. - person Oleg; 10.07.2010