gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:18:24 32 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

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

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

How to: Run Partially Trusted Code in a Sandbox

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

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

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com