c# - 在 AppDomain 中启动 .NET 进程

标签 c# process appdomain

我的问题的标题可能已经暴露了我不确定我想要什么的事实,因为它可能没有意义。

对于一个项目,我希望能够在我的应用程序中运行可执行文件,同时重定向它们的标准输入和输出,以便我的应用程序可以通过这些流与它们进行通信。

同时,我不想允许这些可执行文件执行某些操作,例如使用网络,或在自己的工作目录之外读/写(基本上我只想允许它们从标准目录中写入和读取)进出)。

我在互联网上的不同地方读到,在创建 AppDomain 时可以使用 PermissionStates 设置这些权限,然后您可以在其中执行可执行文件。但是,我没有找到一种通过标准输入和输出与可执行文件进行通信的方法,这是必不可少的。但是,我可以在启动新进程 (Process.Start()) 时执行此操作,但随后我无法设置允许可执行文件执行的操作的边界。

我的直觉告诉我,我应该以某种方式在 AppDomain 内执行进程,以便该进程在域中“运行”,尽管我看不到直接执行此操作的方法。

我的一位同事通过创建一个代理应用程序来实现这一点,该应用程序基本上是另一个可执行文件,其中创建了 AppDomain,并在其中执行实际的可执行文件。然后代理应用程序由主应用程序中的进程启动。我认为这是一个很酷的想法,尽管我觉得我不需要这一步。

我可以添加一些代码,其中包含到目前为止我创建进程和应用程序域所做的工作,尽管问题已经很长了。如果您需要我会添加它。

最佳答案

“代理”应用程序听起来是一个非常合理的方法(假设您只想运行 .NET 程序集)。

您可以隔离不同的进程,这允许您通过 stdin/stdout 进行通信,并提供额外的稳健性,即不受信任的可执行文件不会使您的主应用程序崩溃(如果它在主应用程序进程内的 AppDomain 中运行,则可能会崩溃)。

然后,代理应用程序将设置一个受限的 AppDomain 并执行沙盒代码,类似于此处描述的方法:

How to: Run Partially Trusted Code in a Sandbox

此外,您可以利用操作系统级机制来减少进程的攻击面。这可以实现,例如通过以最低完整性启动代理进程,这会删除对大多数资源的写访问权限(例如,仅允许在 AppData\LocalLow 中写入文件)。请参阅here举个例子。

当然,您需要考虑这个级别的沙箱是否足以满足您的需求。一般来说,沙箱是很困难的,并且隔离级别始终只能达到一定程度。

关于c# - 在 AppDomain 中启动 .NET 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40930017/

相关文章:

c# - 如何获取数组中方法中使用的泛型类型?

ios - iOS中所有进程的父进程是什么?

c# - 请允许我是应用程序域的新手,我如何使用应用程序域运行构造函数

c# - 事件未通过 AppDomain 触发

c# - session 错误 :Object not set to an instance

c# - 用反斜杠格式化字符串

c# - 如何使用 OAuth 处理多个帐户?

linux - Bash 脚本不会生成 cat 的子进程

google-chrome - Google Chrome --new-window 开关忽略 --window-position 和 --window-size

c# - 如何动态加载包含非托管代码的原始程序集?(绕过 'Unverifiable code failed policy check' 异常)