我想拒绝我的计算机上的某些应用程序访问某些驱动器或逻辑卷,但目前还没有找到解决方案。
背景:我的 PC 有一个 SSD 作为系统驱动器,还有一个 15TB Raid-6 和五个硬盘。控制器配置为在约 10-15 分钟后关闭驱动器。这很好,因为有时我几个小时甚至更长时间都不需要访问 Raid 上的任何内容。某些应用程序(例如 Adobe Reader)在启动时会访问所有逻辑卷,原因我无法理解。我的假设是所有分配了驱动器号的卷都会受到影响。删除字母并重新分配它们根本不是一个选择 ;)
如何限制 Adobe Reader 或其他应用程序访问我的 Raid 主机的这些卷?
答案1
在 Windows 中,没有本机支持的方式来阻止某些进程访问某些驱动器,这“违背了”操作系统处理驱动器访问的“当前性质”。
访问权限由启动应用程序的登录用户的权限决定。因此,如果软件开发人员决定其软件应搜索所有可访问的驱动器,并且不提供关闭该功能的选项……那么,这是糟糕的编程,没有考虑到您的特定用例。但有一些解决方法。
唯一“万无一失”的解决方案是 2,因为硬件虚拟化层(来自虚拟机)可以阻止任何应用程序尝试完全访问“真实硬件”。虽然我还没有遇到过解决方案 1 不起作用的情况,但理论上我认为可以绕过它。
选项“1” - 在“低级别”禁用驱动器 - 无需其他软件
选项 1a
可以通过禁用整个驱动器来禁用较低层的卷,但这将禁用驱动器上的所有卷。手动操作,您可以通过启动diskmgmt.msc
,然后右键单击驱动器并将其标记为“脱机”来执行此操作。
如果需要,您也可以使用命令行脚本执行此操作。其应用方式与选项 3a/b 类似。例如,您可以按照所述通过 cmd 执行此操作这里或者通过 PowerShell,如所述这里。
选项 1b
您可以完全停用驱动器的驱动程序。手动操作:开始diskmgmt.msc
,然后右键单击,选择“选项”。然后转到“驱动程序”选项卡并选择“停用”。驱动器将在磁盘管理器中“消失”,并且不再可通过操作系统访问。除非软件不执行机器代码命令来直接与硬件通信,否则应用程序应该无法访问驱动器。至少就我对操作系统的了解而言是这样。
如果需要,您也可以使用命令行脚本执行此操作。其应用方式与选项 3a/b 类似,例如,Devcon.exe
您可以找到详细说明这里。
选项 2 - 使用虚拟环境(主要使用第三方软件)
如果可以在虚拟环境中运行应用程序,那么有很多解决方案:
根据您的 Windows 版本(需要 Win7 及更高版本)和许可证(需要“专业版”,“家庭版”不行),您可以使用 Hyper-V 来设置虚拟环境,而无需任何第三方软件。
您可以使用第三方软件来设置虚拟系统,如 VMplayer、Virtual Box 等。有许多免费软件和付费软件可供选择。使用此解决方案,您将需要第二个 Windows 许可证(或者您将其保留为未授权,但您会在屏幕右下角看到一个覆盖层,提示您注册 Windows)。这肯定会阻止软件访问驱动器。
您可以使用“沙盒”应用程序。但这取决于沙盒应用程序提供的虚拟化级别。在某些情况下,它可以解决问题;在其他情况下,则不能。例如,Sandboxie(harrymc 在他的回答),并不能解决 harrymc 在其 (原始) 回答中描述的配置问题。尽管软件可能会阻止访问,但驱动器仍会启动。另一种方法是使用其他沙盒应用程序,如 Cameyo 等。
顺便一提,这是一篇好文章不同虚拟化软件之间的主要区别,尤其是“整个”虚拟机(如 Virtual Box)和“半虚拟”应用程序(如 Sandboxie)之间的区别。
选项 3 - 仅卸载卷(使驱动器“保持完整”) - 无需其他软件,但它可能不适用于你的情况
选项 3a
您可以编写一个批处理文件,使用以下命令来启动应用程序,而不是通过常规快捷方式启动应用程序,mountvol
该命令首先卸载未使用的卷,然后启动应用程序,然后在应用程序不再访问驱动器时重新安装该卷。通过命令行安装/卸载过程如下所述这里和这里. 您也可以diskpart
按照说明使用这里和这里。
选项 3b
或者,您可以通常不安装驱动器,而是通过批处理文件安装它,在需要时手动启动它。使用完毕后,您可以使用第二个批处理文件手动卸载它。您可以通过监视文件系统访问请求并按照某些规则(例如某些应用程序无权访问)根据需要安装/卸载驱动器来自动化此过程。但我不确定自动化是否值得付出额外的努力。
选项 4 - 限制对驱动器号(卷)的访问。操作简单,但需要 Microsoft 的两个小工具 - 但这可能不适用于你的情况
如果您想不使用第三方软件,但不介意使用微软的两个小工具(如果您还没有使用过的话)。我更喜欢这个解决方案,因为它“从根本上”解决了问题(区分用户和应用程序的权限),而且它相当简单,不需要“大型”第三方软件。
基本上,您添加一个无权访问驱动器的用户,然后使用这些有限的权限启动该程序(您仍将以普通用户身份登录,而不会使用受限帐户登录)。
答案2
我提出了一个解决方案,使用
沙盒。我没有您的环境,因此我已测试Acrobat.exe
在访问D:
被阻止的沙盒中运行。在 Acrobat 中打开菜单时文件 > 打开,我得到了这个:
请注意,Acrobat 甚至无法找到磁盘的标签D:
,因此被迫以一种蹩脚的方式显示它,以及当我单击“本地磁盘(D:)”时它是如何被阻止的。
我使用的步骤如下:
- 已安装 Sandboxie
- 在 Sandboxie Control 中,右键单击默认沙箱并选择沙盒设置
- 开设分行资源访问 > 文件访问,然后点击阻止访问
- 点击添加程序并添加 Acrobat (我的是
C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\Acrobat.exe
) - 点击添加并添加磁盘
D:
- 点击好的
- 在 Sandboxie Control 中,打开程序启动 > 强制文件夹
- 点击新增文件夹
- 添加 Acrobat 所在的文件夹(我的是
C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat
) - 单击“确定”
从现在开始,从 Acrobat 文件夹启动的所有程序都将被强制在沙盒中执行,具体来说Acrobat.exe
就是被阻止访问磁盘D:
。如果 Acrobat 在沙盒内执行时遇到一些困难,您可能需要打开一些其他沙盒限制。
我不知道这是否也会阻止 Acrobat 用来唤醒磁盘的特定 Windows API 调用,但可能值得尝试。
Sandboxie 是一款非常棒且功能多样的产品,我推荐它,对于一个默认沙盒是免费的。对于多个沙盒,它是付费软件,但终身许可价格非常合理(我付费了)。例如,我在沙盒中安装我测试的产品,然后只需单击一下即可将其清除,无需卸载程序。
另一个隔离解决方案是使用 Adobe Reader Docker 容器。Docker 容器很小,工作方式类似于虚拟机,但无需创建机器,因为可以从 Docker 库下载现成的容器。
您可以使用 巧克力味 作为包管理器。
Chocolatey 有许多可用的预构建软件包,其中包含 Adobe Reader Adobe Acrobat Reader DC 2018.011.20063。
使用Docker,可以实现资源的绝对隔离,另一方面,可以以完全原生的方式共享文件夹等资源。