我想知道在 Windows 7 的 diskpart 中可以修改的“只读”磁盘和卷属性的确切含义。我正在尝试设置一个外部 USB 驱动器作为我自己的软件的安装介质,因此我想保护它免受用户随意或无意的更改,这样他们就不会搞砸他们将来可能需要的安装文件。
根据我对 diskpart 的实验,卷的只读属性实际上存储在物理磁盘的某个位置,因为我可以设置它,当我将驱动器带到另一台机器时,它会显示出来。这很好,因为我的用户无法(轻松)更改卷上的任何文件,也无法从 Windows 资源管理器对其进行格式化。
但是,磁盘只读属性似乎只是当前计算机访问驱动器的一个方面。当我设置它时,我无法再通过磁盘管理删除磁盘中的卷,但是当我将驱动器带到另一台计算机时,该属性不再设置,并且在磁盘管理中我可以删除磁盘上的卷。我想我并不担心我的用户这样做,但我很恼火,因为我不明白这些属性到底在做什么。
我不明白的另一件事是,“卷”只读属性实际上似乎是磁盘全局的 - 如果我在磁盘上有两个卷,并且在其中一个上设置了只读标志,那么它也会在另一个上设置。?!?
我感觉我没有搜索到正确的文档 - 我找到的只是 diskpart 文档,它给出了使用这些属性的语法,而不是它们真正的含义。任何指点都非常欢迎!
谢谢,
作为一个
答案1
简短回答:
Attributes DISK [set | clear] READONLY
存储属性在 Windows 注册表中,而不是物理磁盘。这意味着它仅对当前正在运行的 Windows 安装有效,并且不会在其他操作系统上执行、设置和强制执行。
Attributes VOLUME [set | clear] READONLY
存储属性在物理磁盘上。 这意味着它将被携带、设置和执行到其他操作系统上,包括 Linux(我必须以 rw 模式手动重新安装磁盘,而且它没有触及存储的属性,所以我必须在 Windows 中手动将其删除)。
但要小心管理访问权限:
虽然该DISK
属性可以防止整个磁盘上的所有写入(即卷文件系统和分区表),该VOLUME
属性阻止写入仅适用于卷文件系统,使分区表仍然可写(即您仍然可以删除只读卷)。
长答案:
属性DISK
[设置 | 清除] READONLY
该属性存储在名为 的值中"Attribute"
,位于注册表子项HKLM\SYSTEM\CurrentControlSet\Enum\*\Disk*\Device Parameters\Partmgr
,其中*
是磁盘的枚举和安装的设备节点(查看“磁盘管理”中的“设备属性”)。
它是一个位掩码值,属性readonly
为位#1(位#0表示在线/离线磁盘状态),因此readonly
在线磁盘上的设置会将值从 更改为0
,2
但在离线磁盘上设置会将值从 更改1
为3
。
优点:
磁盘是完全只读:所有写入尝试都将保证失败,包括其分区表(例如删除/创建卷、更改磁盘 ID 等),而且状态将在磁盘管理中清晰可见。
缺点:
它仅对当前正在运行的 Windows 安装有效,并且其枚举设备节点相同(不保证可移动驱动器)。如果磁盘连接到另一台计算机或其设备节点由于任何原因发生变化,例如连接到另一条总线、端口或集线器(尤其是 USB),或者在设备管理器中卸载并重新安装,则磁盘将再次处于读写模式。
属性VOLUME
[设置 | 清除] READONLY
该属性是物理存储在磁盘上,但差异取决于底层分区方案(MBR 或 GPT)。
在GPT
磁盘上:
该属性存储在卷分区表条目的“属性”字段中,并且有效仅适用于该卷(如diskpart
帮助说明中所述)。
在MBR
磁盘上:
该属性存储在偏移量 0x400h(或 512 字节逻辑格式化磁盘上的扇区 #2)作为 GPT 条目的“短版本”,其中仅使用Type GUID
和Attributes
字段,总共 0x18h 字节,并且有效适用于所有卷(如diskpart
帮助说明中所述)。
下面是十六进制输出示例及其结构:
Hex Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
0000000400 A2 A0 D0 EB E5 B9 33 44 87 C0 68 B6 B7 26 99 C7
0000000410 00 00 00 00 00 00 00 10
0x400:128 位 GUID
Type GUID
,带有值EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
(即 Microsoft基本数据分区类型GUID);0x410:64 位整数
Attributes
,有值0x1000000000000000
(即位#60
设置)。
以同样的方式,可以设置shadowcopy
(bit #61
)、hidden
(bits #62
) 和nodefaultdriveletter
(bits #63
) 属性。
优点:
当磁盘连接到其他系统(例如 Linux)时,该属性会被保留,即使卷以 rw 模式(重新)安装,也会保留该属性。
缺点:
该属性在“磁盘管理”中不可见,仅在内可见diskpart
,此外:
在GPT
磁盘上:
- 属性仅适用于选定的卷(但这是预期的行为);
- 它不会阻止删除只读卷(但如果删除,则属性会被自动清除,因为其关联的 GPT 条目已完全清零)。
在MBR
磁盘上:
属性适用于磁盘上的所有卷,因为没有其他方法可以在 MBR(以及随之而来的磁盘属性结构)上设置属性;
卷仍然可以被删除(据我所知,原因不明);
如果删除一个或多个或所有卷,则不会清除该属性(安全清除它的唯一方法是在提示符
attributes VOLUME CLEAR readonly
下执行diskpart
);仍然可以创建新卷,但无法格式化(因为它是写入操作)。
这是我的简单观点,但将卷属性应用于 MBR 磁盘上的所有卷的原因可能是:
MBR 扇区中没有更多可用位置,因为“启动指示器”标志拒绝除 0x80 或 0x00 之外的任何值(否则启动顺序将出错)并且位于偏移量 0x1BC(444)处的“可选”字节被声明为“保留”(尽管该 16 位字段的某些位可以使用);
Windows 对分区中的所有文件系统共享相同的类型 GUID,因此设置该类型 GUID 意味着“针对所有数据卷”(其他类型 GUID(例如恢复分区)将不会接收 Diskpart“卷”条目,只会接收“分区”条目)。
感谢上帝,他真的帮助我把所有的谜题碎片拼凑在一起(包括这个更好的完全重写)。
答案2
我目前正在研究卷属性,因为如果未使用官方安装程序,Vista 安装在使用 imagex 和 bcdboot 部署映像的情况下会失败。
我不知道 diskpart 将有关属性的信息保存在哪里,很可能是在磁盘上,因为(nodefaultdriveletter)在重新启动后也会应用;在启动到离线系统时也会应用。
是的,diskpart 始终将卷属性应用于所有卷在选定的磁盘上。的行为attributes volume
不符合预期,并且没有记录. 发生在所有版本上,包括 Win8 的 build 9200。
只读属性只是一个提示,它不会阻止人们在磁盘上写入。
要隐藏 Windows 中的卷,请使用remove
,但该信息将保存到HKLM\SYSTEM\MountedDevices
(因此仅适用于当前正在运行的系统),或者您需要使用set id=
,NTFS 默认 ID 为 07,请尝试 17 或 27。有一个PC 分区标识符列表,来决定你喜欢什么。FAT32 标识符是否 Windows 喜欢也识别为 NTFS,而不自动安装它们。
答案3
在 MBR 磁盘上,将任何卷设置为 RO 都会影响所有卷。Diskpart 不允许您在可移动磁盘(如可移动闪存驱动器)上设置 RO 属性,因此可移动 USB 闪存驱动器在移动到另一个系统时无法被写保护。
答案4
我一直在尝试这个,但意识到当我用属性磁盘设置只读命令设置闪存驱动器时,闪存驱动器仅在我进行该设置的那台电脑上变为只读。在其他电脑上,我仍然可以写入该特定闪存驱动器。我发现可以编辑闪存驱动器的所有权。我将每个人的条目编辑为只读,并将我的用户添加为完全控制。所以这现在对我来说有效,除非有人知道如何编辑所有权,否则这比 diskpart 属性设置更有效。