“Clear-Disk” cmdlet 的“-Sanitize”开关在 PowerShell 中起什么作用?

sta*_*tor 2 powershell wmi powershell-5.1 powershell-cmdlet

Clear-Diskcmdlet 似乎有一个当前未记录的 -Sanitize开关:

PS> Get-Command Clear-Disk | Select-Object -ExpandProperty ParameterSets | ? {$_.Name -like 'ByName'} | Select-Object -ExpandProperty Parameters | ? {$_.Name -like 'Sanitize'}

Name                            : Sanitize
ParameterType                   : System.Management.Automation.SwitchParameter
IsMandatory                     : False
IsDynamic                       : False
Position                        : -2147483648
ValueFromPipeline               : False
ValueFromPipelineByPropertyName : False
ValueFromRemainingArguments     : False
HelpMessage                     :
Aliases                         : {}
Attributes                      : {InputObject (cdxml), ByNumber, ByPath, ByName...}
Run Code Online (Sandbox Code Playgroud)

它有什么作用?它会触发 ATA/SCSI 命令吗SANITIZE

Tes*_*ler 6

[编辑:这不完整;毕竟,它看起来 Sanitize 是它自己单独的、未记录的参数]

PowerShell 中有很多 cmdlet,它们是围绕 WMI 自动生成的包装器。cdxml你的问题中提到的就是Clear-Disk其中之一。

运行Get-Command Clear-Disk | Format-List *并浏览结果,它有:

OutputType: Microsoft.Management.Infrastructure.CimInstance#
                ROOT/Microsoft/Windows/Storage/MSFT_Disk
Run Code Online (Sandbox Code Playgroud)

因此,Clear-Disk为 MSFT_Disk WMI 类提供了一个很好的 PowerShell cmdlet 包装器。MSFT_Disk 记录在此处。这似乎已经过时了。

清除磁盘是存储模块的一部分,位于

C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Storage>
Run Code Online (Sandbox Code Playgroud)

其中是Disk.cdxmlWMI到Cmdlet的映射,其中包含:

<DefaultNoun>Disk</DefaultNoun>

[...]

<CmdletMetadata Verb="Clear" ConfirmImpact="High" />
    <Method MethodName="Clear">
Run Code Online (Sandbox Code Playgroud)

注意。PowerShell cmdlet 是Verb-Noun,所以这是默认名词磁盘上动词 Clear 的部分Clear-Disk,我认为它映射到 MSFT_Disk 类上的方法 Clear() 。该部分内有:

      <Parameters>
        <!-- RemoveData -->
        <Parameter ParameterName="RemoveData">
          <Type PSType="System.Management.Automation.SwitchParameter" />
          <CmdletParameterMetadata />
        </Parameter>
        <!-- RemoveOEM -->
        <Parameter ParameterName="RemoveOEM">
          <Type PSType="System.Management.Automation.SwitchParameter" />
          <CmdletParameterMetadata />
        </Parameter>
        <!-- Sanitize -->
          <Parameter ParameterName="Sanitize">
          <Type PSType="System.Management.Automation.SwitchParameter" />
          <CmdletParameterMetadata />
        </Parameter>
        <!-- SourceCaller -->
        <Parameter ParameterName="cim:operationOption:SourceCaller" DefaultValue="Microsoft.PowerShell">
          <Type PSType="System.String" />
        </Parameter>
      </Parameters>
    </Method>
Run Code Online (Sandbox Code Playgroud)

早期的 MSFT_Disk 文档中有一个部分记录了 Clear() 方法

这需要四个参数:

UInt32 Clear(
  [in]  Boolean RemoveData,
  [in]  Boolean RemoveOEM,
  [in]  Boolean ZeroOutEntireDisk,
  [out] String  ExtendedStatus
);
Run Code Online (Sandbox Code Playgroud)

XML 块似乎将它们映射到 PowerShell 参数名称。我首先认为这些是匹配的,并且 ZeroOutEntireDisk 是第三个参数的重命名,但这似乎不正确;马丁·史密斯(Martin Smith)找到了一个提到这两个参数的来源。

ZeroOutEntireDisk [in] 记录为:

如果此参数指示此方法除了删除所有分区信息之外还将整个磁盘清零,则为 TRUE。如果此参数为 FALSE 或 NULL,则仅将磁盘的第一个和最后一个兆字节清零。

C:\Windows\SysWOW64\wbem\en-GB\storagewmi.mfl描述消毒:

“如果为 TRUE,则此参数指示 Clear 向磁盘发送命令以物理删除数据。”

wbemtest是 WMI 测试器,与 PowerShell 分离,您可以连接到root\Microsoft\Windows\Storage命名空间、打开类MSFT_Disk、编辑 Clear 方法并获取其中的参数,输入参数的 MOF 定义为:

[abstract]
class __PARAMETERS
{
    [In, ID(0): DisableOverride ToInstance] boolean RemoveData;
    [In, ID(1): DisableOverride ToInstance] boolean RemoveOEM;
    [In, ID(2): DisableOverride ToInstance] boolean ZeroOutEntireDisk;
    [In, ID(3): DisableOverride ToInstance] boolean Sanitize;
    [In, ID(4): DisableOverride ToInstance] boolean RunAsJob;
};
Run Code Online (Sandbox Code Playgroud)

我不知道 CDXML 定义如何与这些相匹配。它如何使用比该方法所采用的参数更少的参数来调用该方法,是否可以按顺序或按名称匹配它们,可以做什么cim:operationOption:SourceCaller,以及该方法是否有效(有人尝试过吗?)

  • 不错的研究工作! (2认同)