Использование subprocess.Popen(), чтобы дочерний процесс запускался в режиме совместимости в Windows
У меня есть процесс, с которым я должен общаться через каналы. Он работает правильно в режиме совместимости с Windows XP SP3 в Windows 10, но не в других режимах.
Но кажется, что подпроцесс не заботится о режиме совместимости, даже если используется shell=True. Я думал, что если shell запустит его вместо того, чтобы идти напрямую к ядру с запросом, CM будет сохранен, но это не так. При запуске из cmd.exe он работает в режиме совместимости с XP, как и ожидалось.
Как заставить подпроцесс запустить его в режиме совместимости? Или это вопрос использования shell=True с добавлением какой-то специальной переменной среды?
Это процесс Cyshwin's ssh.exe, и он имеет большую проблему с открытием ключевых разрешений в Windows 10. Использование его в XP CM обманывает его, игнорируя списки ACL, которые в противном случае переходят в режим разрешений posix-версии. Дело в том, что я не могу ожидать, что пользователи будут устанавливать правильные разрешения для каждого ключа, который они добавляют через Свойства, и выполнение этого в программе автоматически затруднено, потому что программа может не иметь прав для этого. Это большой беспорядок. Любые идеи приветствуются.
1 ответ
Вы можете попробовать настройки __COMPAT_LAYER
перед вызовом ssh.exe
:
import os
import subprocess
os.environ.update({"__COMPAT_LAYER": "WinXP"}) # set it to WinXP
your_process = proc = subprocess.Popen(["ssh", "whatever"], shell=True, env=os.environ)
# ...