Я прошу отличаться ответить Ганса:
Конечно, SEE_MASK_NOZONECHECKS является, а предопределенная переменная среды. Изменение его в процессе и затем запуск дочернего процесса (например, msiexec.exe), который по умолчанию наследует среду, имеет тот же результат, что и использование ShellExecuteEx(), и предоставляет SEE_MASK_NOZONECHECKS в качестве параметра структуры SHELLEXECUTEINFO. Первый способ является предпочтительным для админов или быстрых хаков, например. если вы работаете с пакетными или файлами сценариев, которые устанавливают переменную окружения, или когда окончательный вызов файла .msi, лежащего на небезопасном сетевом диске, не выполняется вашим собственным кодом.
Например:
@echo off
set SEE_MASK_NOZONECHECKS=1
call msiexec.exe /i "\\MY_UNC_DRIVE\installs\mysetup.msi /qb /L*v "c:\logs\mysetup.log"
call "\\MY_UNC_DRIVE\installs\Just_another_setup.exe"
Если вы уже используете ShellExecuteEx() в коде, то, конечно, пойти с параметром, как указано Ганс, потому что реализация его более закрытым. (Если вы используете CreateProcess(), подумайте об использовании ShellExecuteEx() вместо этого.
Возврат к переменной окружения. Обычно вы не можете влиять на среду уже запущенных процессов. Вы можете установить среду по умолчанию, используемую NEW обрабатывается командой «setx», используемой в вопросе. Но с «setx» вы не меняете среду для своего текущего процесса. Это была проблема, о которой идет речь. Для этого вам нужно использовать «set», как показано. Поэтому либо используйте обе команды друг после друга, либо вообще не используйте setx, потому что для запуска установки на чужих машинах не нужно делать постоянные изменения безопасности без запроса.
Для получения дополнительной информации о постоянных изменениях/зрения: см. https://superuser.com/questions/595211/removing-the-open-file-security-warning-in-windows-8/934283#934283
Важно: Как уже упоминалось, нет общего пути в Windows, чтобы влиять на процессы, которые уже запуска (только собственные определенные межпроцессного-связь может быть), поэтому важно, чтобы установить переменную окружения перед тем, начиная настройку, на которую будет оказано влияние.
Еще одна вещь: некоторые люди думают, что нужно использовать «SETLOCAL» в пакетном файле. Обычно это не обязательно. Изменения среды с помощью «набора» не являются постоянными и не включают «другие» процессы - они наследуются только для подпроцессов и, частично, для суперпроцессов. Но, когда абонент на первом уровне заканчивается, среда снова возвращается в исходное состояние.
Я пытаюсь автоматизировать установки драйвера из удаленный общий диск один из драйверов дает мне проблемы. –
так будет проще всего вызвать сценарий powershell, который выдает ShellExecuteEx()? –
Нет простого способа отключить все проверки зоны (обратите внимание, что это небезопасная тестовая коробка) –