在 AppDomain 中启动 .NET 进程

Starting a .NET process within an AppDomain

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

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

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

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

我的直觉告诉我,我应该以某种方式在 AppDomain 中执行进程,这样进程就可以在域中 'runs',尽管我看不到直接执行此操作的方法。

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

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

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

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

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

How to: Run Partially Trusted Code in a Sandbox

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

当然,您需要考虑这个级别的沙箱是否适合您。总的来说,沙盒是很难的,隔离级别总是在一定程度上。