如何在 PowerShell 中对枚举执行按位或 (|)?

How do I perform a bitwise or (|) for enumerations in PowerShell?

我正在尝试执行按位或 (|) 操作,以将多个枚举应用于 .NET 程序集使用的 PowerShell 中的变量。但是,当单竖线字符执行此操作时,我得到一个 Expressions are only allowed as the first element of a pipeline 错误。如何在 PowerShell 中分配多个枚举?

    $everyone = New-Object System.Security.Principal.SecurityIdentifier([System.Security.Principal.WellKnownSidType]::WorldSid, $null);
    $fsr = [System.Security.AccessControl.FileSystemRights]::Read;
    $if = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit | [System.Security.AccessControl.InheritanceFlags]::ObjectInherit;
    $pf = [System.Security.AccessControl.PropagationFlags]::None;
    $act = [System.Security.AccessControl.AccessControlType]::Allow;
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($everyone, $fsr, $if, $pf, $act);

使用-borbitwise operator,例如:

([System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor
 [System.Security.AccessControl.InheritanceFlags]::ObjectInherit)

ContainerInherit, ObjectInherit

这是使用 -bOr 运算符完成的。请参阅按位运算符的 documentation

实施 -bOr 后上面的代码示例如下所示:

$everyone = New-Object System.Security.Principal.SecurityIdentifier([System.Security.Principal.WellKnownSidType]::WorldSid, $null);
$fsr = [System.Security.AccessControl.FileSystemRights]::Read;
$if = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bOr [System.Security.AccessControl.InheritanceFlags]::ObjectInherit;
$pf = [System.Security.AccessControl.PropagationFlags]::None;
$act = [System.Security.AccessControl.AccessControlType]::Allow;
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($everyone, $fsr, $if, $pf, $act);

您也可以将两个 inheritanceflag 对象放在一个数组中:

$everyone = New-Object System.Security.Principal.SecurityIdentifier([System.Security.Principal.WellKnownSidType]::WorldSid, $null);
$fsr = [System.Security.AccessControl.FileSystemRights]::Read;
$if = [System.Security.AccessControl.InheritanceFlags]::ContainerInherit
$if2 = [System.Security.AccessControl.InheritanceFlags]::ObjectInherit;
$pf = [System.Security.AccessControl.PropagationFlags]::None;
$act = [System.Security.AccessControl.AccessControlType]::Allow;
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($everyone, $fsr, ($if,$if2), $pf, $act);

PowerShell 将提供从字符串自动转换的功能,因此您也可以这样做:

$everyone = New-Object System.Security.Principal.SecurityIdentifier([System.Security.Principal.WellKnownSidType]::WorldSid, $null);
$fsr = [System.Security.AccessControl.FileSystemRights]::Read;
$if = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit,ObjectInherit"
$pf = [System.Security.AccessControl.PropagationFlags]::None;
$act = [System.Security.AccessControl.AccessControlType]::Allow;
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($everyone, $fsr, $if, $pf, $act);

事实上,如果您希望它的输入次数大大减少(当您不关心以后阅读的清晰度时,对于快速命令行内容很有用),您可以这样做:

$everyone = New-Object System.Security.Principal.SecurityIdentifier([System.Security.Principal.WellKnownSidType]::WorldSid, $null);
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $everyone, "Read", "ContainerInherit,ObjectInherit", "None", "Allow"