Использование 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)
# ...
Другие вопросы по тегам