我的问题的标题可能已经泄露了我不确定我想要什么的事实,因为它可能没有意义。
对于一个项目,我希望能够在我的应用程序中运行可执行文件,同时重定向它们的标准,以便我的应用程序可以通过这些流与它们进行通信。
同时,我不想让这些可执行文件执行某些操作,比如使用网络,或者在自己的工作目录之外读/写(基本上我只想让它们从标准中写入和读取)进出。)
我在互联网上的不同地方读到,在创建AppDomain时可以使用PermissionStates设置这些权限,然后您可以在其中执行可执行文件。但是,我没有找到通过其标准输入和输出与可执行文件进行通信的方法,这是必不可少的。但是,我可以在启动新进程(Process.Start()
)时执行此操作,但是我无法设置允许可执行文件执行操作的界限。
我的直觉告诉我,我应该以某种方式在AppDomain中执行进程,以便进程运行'在域中,虽然我看不到直接这样做的方法。
我的一位同事通过创建代理应用程序来完成此任务,该代理应用程序基本上是创建AppDomain的另一个可执行文件,其中执行实际的可执行文件。然后,代理应用程序由主应用程序中的Process启动。我认为这是一个很酷的主意,虽然我觉得我不需要这一步。
我可以添加一些代码,其中包含我迄今为止创建的进程和appdomain所做的事情,尽管这个问题已经很久了。如果你想要我,我会添加它。
答案 0 :(得分:2)
"代理"应用程序听起来像一个非常合理的方法(假设您只想运行.NET程序集)。
您可以隔离不同的进程,这些进程允许您通过stdin / stdout进行通信,并提供额外的健壮性,即不受信任的可执行文件不会使您的主应用程序崩溃(如果它在主应用程序内的AppDomain中运行,它可能会崩溃#39过程。
然后,代理应用程序将设置受限制的AppDomain并执行沙盒代码,类似于此处描述的方法:此外,您还可以利用操作系统级别的机制来减少进程的攻击面。这可以通过例如实现。通过启动具有最低完整性的代理进程来删除对大多数资源的写访问(例如,仅允许在AppData \ LocalLow中写入文件)。有关示例,请参阅here。
当然,您需要考虑此级别的沙盒是否足够您。一般来说,沙盒很难,隔离程度总是只有一定程度。