Browse Source

Merge pull request #125 from raandree/ai/coverage-unknowns

test: close the coverage unknowns of the quality gate and fix three defects
pull/126/head
Raimund Andrée 2 weeks ago
committed by GitHub
parent
commit
17729d783d
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 72
      .memory-bank/activeContext.md
  2. 92
      .memory-bank/debugging-insights.md
  3. 18
      .memory-bank/decisions/0025-out-of-scope-environments.md
  4. 49
      .memory-bank/decisions/0026-no-default-parameter-set-add-remove.md
  5. 44
      .memory-bank/progress.md
  6. 10
      .memory-bank/systemPatterns.md
  7. 52
      .memory-bank/techContext.md
  8. 27
      CHANGELOG.md
  9. 14
      Docs/Cmdlets/Add-NTFSAccess.md
  10. 14
      Docs/Cmdlets/Add-NTFSAudit.md
  11. 14
      Docs/Cmdlets/Remove-NTFSAccess.md
  12. 14
      Docs/Cmdlets/Remove-NTFSAudit.md
  13. 4
      Docs/Examples.md
  14. 15
      NTFSSecurity/AccessCmdlets/AddAccess.cs
  15. 20
      NTFSSecurity/AccessCmdlets/RemoveAccess.cs
  16. 15
      NTFSSecurity/AuditCmdlets/AddAudit.cs
  17. 20
      NTFSSecurity/AuditCmdlets/RemoveAudit.cs
  18. 60
      NTFSSecurity/ItemCmdlets/GetChildItem2.cs
  19. 8
      NTFSSecurity/en-US/NTFSSecurity.dll-Help.xml
  20. 3
      Security2/IdentityReference2.cs
  21. 37
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Cmdlets.csv
  22. 5
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Cultures.csv
  23. 1811
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Evidence.csv
  24. 49
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-LiveRoles.csv
  25. 233
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Methods.csv
  26. 36
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Mutations.csv
  27. 65
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-ParameterSets.csv
  28. 233
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Reconciliation.csv
  29. 232
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Runs.csv
  30. 2162
      Tests/Coverage/Quality-Gate-Unknowns-2026-10-10.md
  31. 37
      Tests/ItemCmdlets.Tests.ps1
  32. 3
      Tests/Lab/Acceptance/Run-MatrixLocalSuite.ps1
  33. 7
      Tests/Lab/README.md
  34. 19
      Tests/ObjectApis.Tests.ps1
  35. 774
      Tests/ParameterSets.Access.Tests.ps1
  36. 726
      Tests/ParameterSets.Audit.Tests.ps1
  37. 751
      Tests/ParameterSets.Inheritance.Tests.ps1
  38. 595
      Tests/ParameterSets.Items.Tests.ps1

72
.memory-bank/activeContext.md

@ -1,6 +1,6 @@
--- ---
status: current status: current
last-verified: 2026-10-10 last-verified: 2026-10-11
owner: active-agent owner: active-agent
source: current task evidence source: current task evidence
--- ---
@ -9,6 +9,23 @@ source: current task evidence
## Current focus ## Current focus
State at 2026-10-11 13:50 UTC: Handoff 5 (the coverage unknowns) is done
locally on `ai/coverage-unknowns`, from `origin/master` `6696f68`; the
maintainer pushed the branch at `2b97422`, and the later commits are local.
The report is `Tests/Coverage/Quality-Gate-Unknowns-2026-10-10.md` with nine
CSV tables. rc7 (`fa0701b`) was measured at 3,198/3,649 sequence points. Three
defects are fixed test-first: two `tr-TR` comparisons (`419cfb3`; `0028ccd`,
`fbe0289`, `8a625c8`) and the piped `AppliesTo` that a path dropped (`93ed2c7`,
`9783d2a`: no default parameter set for Add and Remove of access and audit,
Decision 26); one defect is open (hard-link names under a root that is not the
volume root). 101 new `It` blocks; at `2112ee3` (product code built once at
`9783d2a`): 1,492 cases per configuration, 3,266/3,668 points. The final
package passed in the labs (first lab 245/0/1 per edition; the suite on the file
servers and the client, 16 configurations; the three cells 229/0/2 per
edition), every end state clean. Three independent reviews and two checks read
the work, with no Blocker. The maintainer decides whether the fixes and the
tests enter a new candidate.
State at 2026-10-10 15:45 UTC: the maintainer integrated the release-gate stack State at 2026-10-10 15:45 UTC: the maintainer integrated the release-gate stack
into `master` (`6dd799f`, CI green): #116 (rc7, `8a6be9f`), #120 into `master` (`6dd799f`, CI green): #116 (rc7, `8a6be9f`), #120
(`bdb9981`; it replaced #117, which GitHub closed unmerged when the branch (`bdb9981`; it replaced #117, which GitHub closed unmerged when the branch
@ -101,21 +118,31 @@ acceptance is the maintainer's.
passed. A dry run of `Run-MatrixSequence.ps1 -Version 5.0.0-rc6` showed that passed. A dry run of `Run-MatrixSequence.ps1 -Version 5.0.0-rc6` showed that
the published-package path works. Labs at 07:50 UTC on 2026-10-10: no fixture the published-package path works. Labs at 07:50 UTC on 2026-10-10: no fixture
or probe residue; `OSWin11E` shuts itself down an hour after its start. or probe residue; `OSWin11E` shuts itself down an hour after its start.
- Test coverage of the 5.0.0 code, assessed 2026-10-10 (nothing was changed). - Handoff 5, the coverage unknowns, 2026-10-10 to 11 (report
Measured at `5a5d58b`: 87.84% of the sequence points (3,192 of 3,634) and `Tests/Coverage/Quality-Gate-Unknowns-2026-10-10.md`; raw evidence in the
93.96% of the explicit branch points; every cmdlet is at 72.5% or more. Of session folder `816cf47d-2f80-4eba-8ac9-41702c49560b\files\qg-unknowns`
the 442 unvisited points, 181 are in code that no cmdlet calls, 103 are with a hash manifest). rc7 measured at `fa0701b` (four frozen
parameter getters, 77 defensive, and 81 environment-specific (47 of them the configurations, AltCover): 3,198/3,649 sequence points (87.64%), 1,090/1,168
ownership retry of an audit write over SMB). Since then the production C# explicit branch points; 232 unvisited methods, all classified. Live suite on
changed by 70 inserted lines (`962887a`, `fdd7a8b`), so the ratios are off by an instrumented copy (first lab and three cells) and unit suite on
2 points at most. A parser scan finds all 36 cmdlets and all 147 documented `OSFile25`: together +9 sequence and +4 explicit branch points (the code of
parameters in the unit tests (four only as keys of data-driven hashtables) `fdd7a8b`); no test or probe reaches the audit ownership retry or the audit
and 34 cmdlets in the live tests (not `Enable-Privileges`, `Get-DiskSpace`). read denial. 101 new `It` blocks; 7 of 64 parameter sets closed, 51 partly,
Not measured: the coverage of the live tests and of the suite on a domain 1 open, 4 left to the maintainer. Cultures `de-DE` and `tr-TR`: two defects,
member, and of the code after the fixes. Not tested: Server Core, other fixed. The piped
cultures, servers that aren't Windows (#34), and a judged test matrix per `AppliesTo` (Decision 26, debugging insights): fixed in `93ed2c7`; the
parameter set (57 of 64 sets have a test call that binds them; the coverage independent reviews then found a carry-over of the scope between piped
shows every switch visited). objects (`9783d2a`; rc7 had it for descriptor objects) and two false
sentences of the documents about empty values (`7bc7925`, `2112ee3`). Final
commit `2112ee3`, product code of `9783d2a` (its help file differs from the
package that the labs accepted): 1,492 cases per configuration, 3,266/3,668
points, 183 unvisited methods, all classified. The labs accepted the package
(`ap7`, `ap8`): first lab 245/0/1 per edition; the 22 files on
`OSFile19/22/25` and `OSWin11` 1,189/0 in 16 configurations; the three cells
229/0/2 per edition; all end states clean at 13:45Z. The first start of the
cells did nothing: a `powershell.exe` that PowerShell 7 starts inherits its
`PSModulePath` (lab README). Server Core, ARM64, a localized system, and
non-Windows servers are out of scope (Decision 25).
- Raw evidence is outside git: the session folder - Raw evidence is outside git: the session folder
`4b12e2f4-d4c7-4a5d-883a-ddb7421c4848\files` (`qg-paths`, the matrix runs, the `4b12e2f4-d4c7-4a5d-883a-ddb7421c4848\files` (`qg-paths`, the matrix runs, the
night log) and night log) and
@ -154,9 +181,12 @@ acceptance is the maintainer's.
Modify; protecting them is a design change of the controller and needs a new Modify; protecting them is a design change of the controller and needs a new
acceptance). The help could also say that a local standard user who asks acceptance). The help could also say that a local standard user who asks
about a domain account still gets "Access is denied". about a domain account still gets "Access is denied".
6. The two measurement gaps (Evidence): measure the coverage at the tag again 6. Handoff 5 is done (Evidence). The maintainer decides whether the fixes
with the method of the paths report (about 1.5 hours, local), and run the (`419cfb3`, `0028ccd`, `fbe0289`, `8a625c8`, `93ed2c7`, `9783d2a`) and the
live tests with an instrumented build to see what they add, the audit tests enter a new candidate (rc8), which needs the matrix cells and the
ownership retry first (about 2 to 3 hours with the lab). Neither was first lab on its own bytes, and he decides the open items of the report:
requested; the agent starts them on request. hard-link names under another root (a defect with a reproduction), the
silent default scope for a piped `AppliesTo` that PowerShell cannot convert
(a design change), 8 getters of pipeline parameters, the 51 partly closed
sets, and the audit paths.
7. Do not release stable 5.0.0 or equate a percentage with gate closure. 7. Do not release stable 5.0.0 or equate a percentage with gate closure.

92
.memory-bank/debugging-insights.md

@ -0,0 +1,92 @@
---
status: current
last-verified: 2026-10-10
owner: software-engineer
source: Handoff 5 (the coverage unknowns): probes, red and green runs, and the independent review
---
# Debugging insights
Recurring defect classes and how to find them. Evidence is in
`Tests/Coverage/Quality-Gate-Unknowns-2026-10-10.md`; a fix needs a test that
fails without it (Decision 16).
## Culture-sensitive comparison (`tr-TR`)
- With `tr-TR`, `I` and `i` are different letters, so a comparison that takes
the culture of the thread drops or misses items: `ToLower` or `ToUpper`,
`Compare`, `StartsWith`, `EndsWith`, or `IndexOf(string)` without a
`StringComparison`, a case-insensitive `Regex`, a `WildcardPattern` without
`CultureInvariant` (`string.Equals(a, b)` and `==` are ordinal and safe).
Handoff 5 found two defects of this class: `IdentityReference2.Equals(object)`
called with a name, which lowercased both sides (now `OrdinalIgnoreCase`),
and `Get-ChildItem2 -Filter` (`index*` did not list `Index.txt`).
- A scan of the C# is not enough: AlphaFS 2.2 builds a culture-sensitive regex
from a search pattern. `Get-ChildItem2` therefore enumerates under
`InvariantCultureScope` (around the creation of the enumerator and each
`MoveNext`, never across a `WriteObject`) and its own `WildcardPattern` has
`CultureInvariant`. Check any new library call that takes a user pattern.
- PowerShell `-eq`, `-contains`, and `-in` do not take the thread culture;
only the .NET method call failed. Probe a claim before it enters the
changelog or a report (the first wording named `-eq` and was wrong).
- A test sets the culture of the thread, restores it in `finally`, names the
rows that differ (`index*`, `*.INI`), keeps a control (`INDEX*`), reads the
culture in the next pipeline stage for each item and once after the call (a
cmdlet that does not restore it, or writes an item inside the scope, fails
both: two mutations proved it), and is proved red on the previous build and
green on the new one in all four configurations
(`Tests/ItemCmdlets.Tests.ps1`, `Tests/ObjectApis.Tests.ps1`).
## A test oracle that is wrong on a domain member
- `Get-Acl -Audit` reads the SACL with the other sections and reports an item
without audit entries as protected (Windows Server 2019, 2022, and 2025
domain members, Windows 11); the module and `Get-NTFSInheritance` read the
SACL alone. Tests read the flag with .NET `GetAccessControl(Audit)`
(`Get-TestAuditAcl`). A suite that is green on the host proves nothing about
an oracle: run a new test on a domain member before calling it done.
## A piped property and the parameter set
- An object with a property `AppliesTo`, piped into `Add-` or
`Remove-NTFSAccess` or `-NTFSAudit` with a path, bound the default
`PathComplex` set and lost the property. Fixed in `93ed2c7`: the four cmdlets
declare no default set, so the property selects `PathSimple`, an object with
`AppliesTo` and `InheritanceFlags` fails with `AmbiguousParameterSet`, and the
tests pipe an object of each shape (red on the previous build, green on the
new one). A probe that tells the sets uses an entry of the default scope:
removing `ThisFolderOnly` from it leaves the `InheritOnly` part.
- PowerShell restores only the parameters that the previous piped object
bound. A field that the cmdlet writes itself stays for the next object: the
scope that `ProcessRecord` converted from `AppliesTo` into the field behind
`-InheritanceFlags` went to the next object without a scope. `93ed2c7`
shipped that, the third review found it (rc7 had it for piped
`-SecurityDescriptor` objects), and `9783d2a` keeps the flags of a record in
locals. A pipeline test pipes two or more objects of different shape in one
call (`Objects with different scopes in one pipeline`, both ParameterSets
files); one object per call cannot see it.
- Probe the route that the documentation shows. `Import-Csv` of a file gives an
empty string for a blank cell, `ConvertFrom-Csv` of strings gives `$null` for
a trailing blank cell, and `Import-Csv` gives `$null` for a column that a row
lacks. The binder treats them differently: `$null` fails to bind, and a value
that it cannot convert to the enum (an empty string, a typo) is ignored, so
the object is handled as one without the property. The first statement and
the first tests used the convenient route, and the reviewer found the false
claim; the corrected claim was then too narrow once more (a value that
converts binds, whatever its form; a flag next to an unusable value wins).
Write the claim from a probe of each form, not from the one that you tried.
- A sentence that says what a test proves is a claim too: a title that says
"and change nothing" needs an assertion that can see the change (the audit
cmdlets write the SACL, not the DACL), and "cannot go red" needs a run.
- The cause was `DefaultParameterSetName = "PathComplex"`: when a piped object
satisfies the mandatory parameters of the default set, PowerShell settles on
it and never tries a parameter that belongs to another set. A stand-alone
model with the four sets and no default binds `PathSimple` for an object with
`AppliesTo`, `PathComplex` for one without, and an error for one with
`AppliesTo` and `InheritanceFlags` (`probes\p-parameterset-binding*.ps1` in
the Handoff 5 evidence; the model binds `PathComplex` for a piped descriptor
where the real cmdlets bind `SDSimple`); the real cmdlets agreed for paths
(`probes\p-proto-appliesto.ps1`). The default dated from 4.2.6, when
`AppliesTo` was optional; `4b1abc9` made it mandatory in the Simple sets, so
the default no longer decided a named call. Build a model of the parameter
sets before you change an attribute, and test the real cmdlet afterwards.

18
.memory-bank/decisions/0025-out-of-scope-environments.md

@ -0,0 +1,18 @@
---
status: accepted
date: 2026-10-11
last-verified: 2026-10-11
owner: shared
source: maintainer decision of 2026-10-11
---
# Decision 25: Four environments are out of scope for the tests and the acceptance
- Choice: The tests and the acceptance of the quality gate do not cover
Windows Server Core, ARM64, a localized operating system, or file servers
that are not Windows servers. They are not open items, and no agent plans,
deploys, or tests them (maintainer, 2026-10-11).
- Rationale: The audience of the tool does not need them (maintainer).
- Not changed: Decision 23 and #34, the question of what to do for reporters
with non-Windows file servers, stay as they are until the maintainer says
otherwise.

49
.memory-bank/decisions/0026-no-default-parameter-set-add-remove.md

@ -0,0 +1,49 @@
---
status: accepted
date: 2026-10-11
last-verified: 2026-10-11
owner: shared
source: maintainer decision of 2026-10-11
---
# Decision 26: Add and Remove for access and audit declare no default parameter set
- Choice: `Add-NTFSAccess`, `Remove-NTFSAccess`, `Add-NTFSAudit`, and
`Remove-NTFSAudit` declare no `DefaultParameterSetName` (maintainer,
2026-10-11; `93ed2c7`). An object piped with a path binds `PathSimple` when
it has `AppliesTo`, and `PathComplex` when it has `InheritanceFlags`,
`PropagationFlags`, or neither (the default scope). An object that has
`AppliesTo` and one of the flags fails with `AmbiguousParameterSet`, like the
same named parameters.
- Rationale: With `PathComplex` as the default, an object that satisfied its
mandatory parameters made the binder settle on it, and a piped `AppliesTo`
was dropped without a message (a silent change of the scope). `4b1abc9` had
made `AppliesTo` mandatory in the Simple sets, so the default no longer
decided any named call.
- Consequence: a script that piped objects with `AppliesTo` and the flags
together got the flags before and gets an error now; so does an object that
has both `Path` and `SecurityDescriptor`, where the path won. An
`AppliesTo` that is `$null` fails to bind for that object (a CSV row with
fewer fields than its header has `$null` there); a call with neither
`-Path` nor `-SecurityDescriptor` fails with `AmbiguousParameterSet` instead
of a missing-parameter error (CHANGELOG, Fixed). A value that PowerShell
cannot convert to a scope (the blank cell that `Import-Csv` reads, a typo)
is ignored silently, and the object is handled as one without `AppliesTo`:
its own flags, or the default scope when it has none. The binder swallows a
value that it cannot convert, so failing loudly needs a design change
(report, open item 3). Named calls,
`-SecurityDescriptor` calls without `AppliesTo`, and
`Get-NTFSAccess | Add-NTFSAccess -Path` do not change. The syntax lists
`PathSimple` first, because PowerShell orders the sets by declaration.
- Follow-up: the third independent review found that `ProcessRecord` wrote
the scope converted from `AppliesTo` into the fields behind the flag
parameters, which PowerShell does not reset between piped objects. The flags
of a record are locals since `9783d2a`; rc7 had the defect for piped
`-SecurityDescriptor` objects. The reviewer's checks found that "an empty
`AppliesTo` fails to bind" was true for `$null` only (`7bc7925`), and that
the sentence about unconvertible values was too narrow (`2112ee3`).
- Evidence: report `Tests/Coverage/Quality-Gate-Unknowns-2026-10-10.md`
(decision 23; the section on the fix of the piped `AppliesTo`), the tests in
`Tests/ParameterSets.Access.Tests.ps1` and `Tests/ParameterSets.Audit.Tests.ps1`
(red before, green after, in four configurations), and
`.memory-bank/debugging-insights.md`.

44
.memory-bank/progress.md

@ -1,6 +1,6 @@
--- ---
status: current status: current
last-verified: 2026-10-10 last-verified: 2026-10-11
owner: active-agent owner: active-agent
source: repository and validation evidence source: repository and validation evidence
--- ---
@ -99,6 +99,22 @@ After 5.0.0, archive in favor of WindowsAccessControl (Decision 18).
9 245 / 0 / 1 per edition; every end state CLEAN. The counts equal those of 9 245 / 0 / 1 per edition; every end state CLEAN. The counts equal those of
the final local candidate. Record: the final local candidate. Record:
`Tests/Lab/Acceptance-2026-10-10-published-rc7.md`. `Tests/Lab/Acceptance-2026-10-10-published-rc7.md`.
- 2026-10-10 to 2026-10-11: Handoff 5, the coverage unknowns (local,
`ai/coverage-unknowns`; the maintainer pushed `2b97422`, later commits are
local). rc7 measured at `fa0701b`: 3,198/3,649 sequence points; the live
suite and the suite on a domain member add 9 sequence and 4 explicit branch
points (`fdd7a8b`); two `tr-TR` defects fixed test-first (`419cfb3`;
`0028ccd`, `fbe0289`, `8a625c8`); 101 `It` blocks added. The piped
`AppliesTo` that a path dropped is fixed (`93ed2c7`, `9783d2a`, Decision 26)
after three independent reviews and two checks: a carry-over of the scope
between piped objects, and false sentences about empty values (`7bc7925`,
`2112ee3`). Final `2112ee3`, product code built once at `9783d2a`: 1,492
cases per configuration, 3,266/3,668 points. The labs accepted the package:
first lab 245/0/1 per edition, the suite 1,189/0 in 16 configurations on
four machines, three cells 229/0/2 per edition, every end state clean. Open:
hard-link names under another root, the silent default scope of an
unconvertible piped `AppliesTo`. Report:
`Tests/Coverage/Quality-Gate-Unknowns-2026-10-10.md`.
## Stable capabilities ## Stable capabilities
@ -130,21 +146,23 @@ After 5.0.0, archive in favor of WindowsAccessControl (Decision 18).
4. Architecture/cmdlet design: Decision 22 remains proposed; two link 4. Architecture/cmdlet design: Decision 22 remains proposed; two link
changes are breaking. Keep unused classes/helper overloads until a changes are breaking. Keep unused classes/helper overloads until a
maintainer decision; do not remove them to improve coverage percentages. maintainer decision; do not remove them to improve coverage percentages.
5. ARM64 workstation: PowerShell 7.6.1 crashed under x64 emulation without 5. ARM64 workstation: out of scope (maintainer, 2026-10-11, Decision 25).
module frames; native-x64 CI did not reproduce it.
6. Optional maintainer cleanup: obsolete AppVeyor/Read the Docs access, 6. Optional maintainer cleanup: obsolete AppVeyor/Read the Docs access,
wiki editing restrictions, `test/transfer`, and old lab checkpoints wiki editing restrictions, `test/transfer`, and old lab checkpoints
when no longer needed. No remote changes or snapshot restores here. when no longer needed. No remote changes or snapshot restores here.
7. Remaining-path inventory at the final frozen commit of Handoff 1: 7. Remaining-path inventory at the final measured commit of Handoff 5
442 unvisited sequence points in 231 methods, all classified (`2112ee3`): 402 unvisited sequence points in 183 methods, all classified
(`Tests/Coverage`): 223 explained from source with evidence, 8 open (`Tests/Coverage`): 167 explained from source with evidence, 16 open (8:
(`FileSecurity` conversions, `RemoveAll` account filters). Other open `FileSecurity` conversions, `RemoveAll` account filters; 8 getters of
decisions: lazy path overloads, abandoned `PrivilegeEnabler`, dot patterns pipeline parameters that no test binds by property name). Other open
of `Get-ChildItem2 -Filter`, 17 owner-restore handlers that do not pass on decisions: lazy path overloads, abandoned
what a later command raises (a rare combination), unused classes. An audit `PrivilegeEnabler`, dot patterns of `Get-ChildItem2 -Filter`, 17
write's ownership retry cannot run on a local volume and is covered only owner-restore handlers that do not pass on
by the lab. A conditional ACE display remains a .NET representation limit, what a later command raises (a rare combination), unused classes. No
not evidence of unconditional permissions. trigger for an audit write's ownership retry was found on a local volume or
a Windows file server (probe of 48 calls) and no test reaches it. A
conditional ACE display remains a .NET representation limit, not evidence
of unconditional permissions.
8. Publication recovery (`95b827e`, merged in #120): 14 offline tests and exact 8. Publication recovery (`95b827e`, merged in #120): 14 offline tests and exact
artifact SHA-512 verification; the original upload errors remain errors for artifact SHA-512 verification; the original upload errors remain errors for
missing, different, or unverifiable outcomes. The agent published nothing, missing, different, or unverifiable outcomes. The agent published nothing,

10
.memory-bank/systemPatterns.md

@ -49,6 +49,8 @@ Read only task-relevant records; the index controls routing.
| 22 | [The behavior changes of Phase 2 (proposed)](decisions/0022-phase-2-behavior-changes.md) | | 22 | [The behavior changes of Phase 2 (proposed)](decisions/0022-phase-2-behavior-changes.md) |
| 23 | [Non-Windows file servers before 5.0.0, #34 (proposed)](decisions/0023-non-windows-file-servers.md) | | 23 | [Non-Windows file servers before 5.0.0, #34 (proposed)](decisions/0023-non-windows-file-servers.md) |
| 24 | [The operating-system matrix lab (proposed)](decisions/0024-os-matrix-lab.md) | | 24 | [The operating-system matrix lab (proposed)](decisions/0024-os-matrix-lab.md) |
| 25 | [Four environments are out of scope for the tests](decisions/0025-out-of-scope-environments.md) |
| 26 | [No default parameter set for Add and Remove (access, audit)](decisions/0026-no-default-parameter-set-add-remove.md) |
## Patterns ## Patterns
@ -70,8 +72,7 @@ Read only task-relevant records; the index controls routing.
through a Write call (`IsFromLaterCommand`, `PipelineControl`; see through a Write call (`IsFromLaterCommand`, `PipelineControl`; see
`BaseCmdlets.cs`); add a row to `Tests/PipelineControl.Tests.ps1` for a new `BaseCmdlets.cs`); add a row to `Tests/PipelineControl.Tests.ps1` for a new
cmdlet. Record an enabled privilege before the next write. cmdlet. Record an enabled privilege before the next write.
- `Get-ChildItem2 -Filter` has two matchers (AlphaFS, then a wildcard on the - `Get-ChildItem2 -Filter` matches culture invariant; `*.*` means `*`.
name); `*.*` means `*`, other dot patterns are an open decision.
### Tests and documentation ### Tests and documentation
@ -93,8 +94,9 @@ Read only task-relevant records; the index controls routing.
Get/SetFileSecurity preserves stored DACLs; rights oracles use S4U tokens. Get/SetFileSecurity preserves stored DACLs; rights oracles use S4U tokens.
- A suite that is green on the host and CI misses defects that need a domain - A suite that is green on the host and CI misses defects that need a domain
member or another token (the matrix found three): also run a domain member, member or another token (the matrix found three): also run a domain member,
other builds, and a basic user. A failure that follows cell order, not other builds, and a basic user; a failure that follows cell order points to
version, points to stale account state (Decision 24): alternate the cells. stale account state (Decision 24). Oracles differ there too: `Get-Acl -Audit`
reads an item without audit entries as SACL-protected; read the SACL alone.
### CI, publication, and integration ### CI, publication, and integration

52
.memory-bank/techContext.md

@ -105,35 +105,41 @@ source: repository and executable evidence
four configurations sequentially with the real CI wrappers, then four configurations sequentially with the real CI wrappers, then
AltCover runner --collect recalculates the report. Compute option paths AltCover runner --collect recalculates the report. Compute option paths
before passing native arguments, not inline Join-Path expressions. before passing native arguments, not inline Join-Path expressions.
- Report sequence points, not unique source lines. Four-run baselines: rc5 - Report sequence points, not unique source lines. Four-run baselines:
2,020/3,476 (58.1%); rc6 2,412/3,540 (68.14%); `3442194` 2,641/3,559 `3442194` 2,641/3,559 (74.21%); `5a5d58b` 3,192/3,634 (87.84%); `fa0701b`
(74.21%); `5a5d58b` 3,192/3,634 (87.84%), branches 1,273/1,978 (64.36%). (rc7) 3,198/3,649 (87.64%); `61e936e` 3,258/3,664 (88.92%). The code
The code changes the denominators: never present these as same-source changes the denominators: never present these as same-source increments.
increments. The branch summary counts 820 compiler-generated points; report The branch summary of the tool adds a point to most methods (never visited
the explicit branch points too (1,088/1,158, 93.96%). Suite at `5a5d58b`: for the 626 without a branch): report the explicit branch points
1,310 per configuration, zero failures (skipped: 24 and 55 elevated, 234 (1,090/1,168, 93.32%), not the summary percentage. Suite at `61e936e`: 1,459
and 265 basic, Desktop and Core). per configuration, zero failures (skipped: 26 and 57 elevated, 276 and 307
basic, Desktop and Core).
- NUnit skipped ForEach names retain placeholders and parameter tuples, - NUnit skipped ForEach names retain placeholders and parameter tuples,
executed names expand them: raw-name intersection and positional alignment executed names expand them: raw-name intersection and positional alignment
are invalid. Check skip eligibility by row: run the suite once per are invalid. Check skip eligibility by row: run the suite once per
configuration with Pester PassThru and match skipped with executed rows by configuration with Pester PassThru and match skipped with executed rows by
file, line, path, name, and data (discovery alone misses tests that skip file, line, path, name, and data (discovery alone misses tests that skip
while running; write primitives, as `ConvertTo-Json` of rich rows hangs). while running; write primitives, as `ConvertTo-Json` of rich rows hangs).
- Remaining inventory: 442 points in 231 methods, classified by rule with - Live and domain-member coverage: instrument a copy of the package without
evidence (probe, IL scan, source reading); see `Tests/Coverage`. Preserve `--portable`, with an absolute report path outside the payload
raw XML, row CSVs, logs, commit identity, and build hashes: the frozen (`C:\NtfsMatrixProbe\Coverage`, `icacls` Authenticated Users modify) and a
Build rewrites its hash file, so save the hashes of the measured assemblies SYSTEM task that snapshots the report after each process (a role that is not
(AltCover `__Saved` copies) before any mutation build. an administrator of the client can't write next to the module). It counts
- Bounded mutations: one script per round on the frozen worktree, with guards only when its counts equal the uninstrumented acceptance and every role
that no other mutation of the round can trip (an escape can be an overlap logged a flush. Merge by position, never by `uspid`. PowerShell reads the
or an equivalent mutant: check before changing a test). Restore the source getter of a parameter that it binds from a piped object: unvisited getters
exactly and rebuild. point at missing pipeline tests.
- Red/green matrix (a guard fails without its fix): build each state of the - Remaining inventory at `61e936e`: 406 points in 187 methods, classified by
branch in its own Release worktree, lay the final `Tests` over it, run the rule (`Tests/Coverage`). Preserve raw XML, row CSVs, logs, commit identity,
guarding files with the focused runner in all four configurations, and count and build hashes: the frozen Build rewrites its hash file, so save the
failed rows per name with multiplicity; the last state is the control. Keep hashes of the measured assemblies (AltCover `__Saved` copies) first.
the logs, a manifest with hashes, and the hash of each build: the first red - Mutation proofs: bounded one-statement changes on a second frozen worktree,
runs of Handoff 1 were deleted and could not be reproduced. source restored exactly and rebuilt (an escape can be an overlap, an
equivalent mutant, or a masked case: check before changing a test). Red/green
matrix for a fix: build each state in its own Release worktree, lay the
final `Tests` over it, count failed rows per name in all four
configurations, and keep logs and hashes (Handoff 1's first red runs were
deleted and could not be reproduced).
## Lab acceptance ## Lab acceptance

27
CHANGELOG.md

@ -226,6 +226,22 @@ The format is based on
`-PropagationFlags`; `-AppliesTo` is now mandatory in the `Simple` `-PropagationFlags`; `-AppliesTo` is now mandatory in the `Simple`
parameter sets, so such a command uses the flag parameters and their parameter sets, so such a command uses the flag parameters and their
defaults, as for a path defaults, as for a path
- Fix `Add-NTFSAccess`, `Remove-NTFSAccess`, `Add-NTFSAudit`, and
`Remove-NTFSAudit`, which ignored the `AppliesTo` property of an object
piped to them with a path and used the default scope, and which gave a
piped security descriptor object without a scope the scope of the object
before it; the property now sets the scope of its own object only. A piped
object that has `AppliesTo` and `InheritanceFlags` or `PropagationFlags`
now fails with `AmbiguousParameterSet`, like the same parameters on the
command line, and so does an object that has both `Path` and
`SecurityDescriptor`, where the path won before. An `AppliesTo` that is
`$null` fails to bind for that object (a row of a CSV file that has fewer
fields than its header gives `$null`). A value that PowerShell can't
convert to a scope, such as the empty cell of a CSV file or a misspelled
name, is ignored, and the object is handled as one without `AppliesTo`: it
gets its own flags, or the default scope if it has none. A call with
neither `-Path` nor `-SecurityDescriptor` now fails with
`AmbiguousParameterSet` instead of a missing-parameter error for `-Path`
- Fix `Get-NTFSEffectiveAccess`: `-ExcludeNoneAccessEntries` now leaves out - Fix `Get-NTFSEffectiveAccess`: `-ExcludeNoneAccessEntries` now leaves out
items without access, the cmdlet uses the current location when `-Path` items without access, the cmdlet uses the current location when `-Path`
is omitted, and `-SecurityDescriptor` returns the effective access of the is omitted, and `-SecurityDescriptor` returns the effective access of the
@ -439,5 +455,16 @@ The format is based on
- Fix [Get-ChildItem2](Docs/Cmdlets/Get-ChildItem2.md) with `-Hidden`, - Fix [Get-ChildItem2](Docs/Cmdlets/Get-ChildItem2.md) with `-Hidden`,
which omitted the first hidden item unless `-Force` was also supplied which omitted the first hidden item unless `-Force` was also supplied
- Fix the comparison of an identity with a name by its `Equals` method, such
as `$entry.Account.Equals('nt authority\system')`, in the Turkish culture
(`tr-TR`): it changed the case of both names with the culture of the thread,
which turns `I` into a dotless `ı`, so an account whose name holds an
uppercase `I`, such as `NT AUTHORITY\SYSTEM` or `BUILTIN\Administrators`,
did not match the same name in another case. The operators `-eq`,
`-contains`, and `-in` were not affected
- Fix [Get-ChildItem2](Docs/Cmdlets/Get-ChildItem2.md) with `-Filter` in the
Turkish culture (`tr-TR`), which dropped the items whose names differ from
the filter in the case of an `I`, such as `Index.txt` for `-Filter 'index*'`
or `SETTINGS.INI` for `-Filter '*.ini'`
[Unreleased]: https://github.com/raandree/NTFSSecurity/compare/4.2.6...HEAD [Unreleased]: https://github.com/raandree/NTFSSecurity/compare/4.2.6...HEAD

14
Docs/Cmdlets/Add-NTFSAccess.md

@ -13,17 +13,17 @@ Adds an access control entry (ACE) to a file, a folder, or a security descriptor
## SYNTAX ## SYNTAX
### PathComplex (Default) ### PathSimple
``` ```
Add-NTFSAccess [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2> Add-NTFSAccess [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2>
[-AccessType <AccessControlType>] [-InheritanceFlags <InheritanceFlags>] [-AccessType <AccessControlType>] -AppliesTo <ApplyTo> [-PassThru] [<CommonParameters>]
[-PropagationFlags <PropagationFlags>] [-PassThru] [<CommonParameters>]
``` ```
### PathSimple ### PathComplex
``` ```
Add-NTFSAccess [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2> Add-NTFSAccess [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2>
[-AccessType <AccessControlType>] -AppliesTo <ApplyTo> [-PassThru] [<CommonParameters>] [-AccessType <AccessControlType>] [-InheritanceFlags <InheritanceFlags>]
[-PropagationFlags <PropagationFlags>] [-PassThru] [<CommonParameters>]
``` ```
### SDSimple ### SDSimple
@ -46,7 +46,7 @@ Adds an access control entry (ACE) to the discretionary access control list (DAC
`-AccessRights` accepts the basic rights such as `Read`, `Modify`, and `FullControl` as well as the granular rights such as `CreateFiles` or `WriteAttributes`, and several values can be combined, for example `-AccessRights ReadData, WriteData, Delete`. For the mapping between the values of this module, the rights that Windows displays, and the entries of the advanced security dialog, see [Concepts](../Concepts.md). `-AccessRights` accepts the basic rights such as `Read`, `Modify`, and `FullControl` as well as the granular rights such as `CreateFiles` or `WriteAttributes`, and several values can be combined, for example `-AccessRights ReadData, WriteData, Delete`. For the mapping between the values of this module, the rights that Windows displays, and the entries of the advanced security dialog, see [Concepts](../Concepts.md).
The cmdlet has four parameter sets. The `Path` sets read the item from disk and write the changed DACL back immediately, while the `SD` sets change a `Security2.FileSystemSecurity2` object returned by `Get-NTFSSecurityDescriptor` in memory until `Set-NTFSSecurityDescriptor` writes it back. The `Simple` sets take `-AppliesTo`, the `Complex` sets take `-InheritanceFlags` and `-PropagationFlags`; both describe the same ACE flags, and `PathComplex` is the default. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets. The cmdlet has four parameter sets. The `Path` sets read the item from disk and write the changed DACL back immediately, while the `SD` sets change a `Security2.FileSystemSecurity2` object returned by `Get-NTFSSecurityDescriptor` in memory until `Set-NTFSSecurityDescriptor` writes it back. The `Simple` sets take `-AppliesTo`, the `Complex` sets take `-InheritanceFlags` and `-PropagationFlags`; both describe the same ACE flags. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor, and a command that has `-AppliesTo` together with `-InheritanceFlags` or `-PropagationFlags` fails, because PowerShell can't choose between the sets. The same holds for an object that you pipe in: its property `AppliesTo` selects a `Simple` set, its properties `InheritanceFlags` and `PropagationFlags` select a `Complex` set, and an object that has both kinds, an object that has both `Path` and `SecurityDescriptor`, or one whose `AppliesTo` is `$null`, fails. `Import-Csv` gives `$null` for a column that a row lacks because it has fewer fields than the header. An `AppliesTo` that PowerShell can't convert to a scope, such as the blank cell of a CSV file or a misspelled name, is ignored, and the object is handled as one without `AppliesTo`: it uses its own `InheritanceFlags` and `PropagationFlags`, or the default scope if it has none. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets.
When `-AccessType`, `-AppliesTo`, `-InheritanceFlags`, and `-PropagationFlags` are omitted, the cmdlet adds an `Allow` ACE that applies to this folder, subfolders, and files, which corresponds to the inheritance flags `ContainerInherit, ObjectInherit` and no propagation flags. An `Allow` ACE always receives the `Synchronize` right in addition to the requested rights, inheritance and propagation flags are ignored on files, and rights for an account that already has an ACE with the same access type and the same flags are merged into that ACE. The cmdlet writes no output unless `-PassThru` is used, and a failure on one item is reported as a non-terminating error while the remaining items are processed. When `-AccessType`, `-AppliesTo`, `-InheritanceFlags`, and `-PropagationFlags` are omitted, the cmdlet adds an `Allow` ACE that applies to this folder, subfolders, and files, which corresponds to the inheritance flags `ContainerInherit, ObjectInherit` and no propagation flags. An `Allow` ACE always receives the `Synchronize` right in addition to the requested rights, inheritance and propagation flags are ignored on files, and rights for an account that already has an ACE with the same access type and the same flags are merged into that ACE. The cmdlet writes no output unless `-PassThru` is used, and a failure on one item is reported as a non-terminating error while the remaining items are processed.
@ -196,7 +196,7 @@ Specifies the path of one or more files or folders the ACE is added to. Relative
```yaml ```yaml
Type: String[] Type: String[]
Parameter Sets: PathComplex, PathSimple Parameter Sets: PathSimple, PathComplex
Aliases: FullName Aliases: FullName
Required: True Required: True

14
Docs/Cmdlets/Add-NTFSAudit.md

@ -13,17 +13,17 @@ Adds an audit entry to a file or folder.
## SYNTAX ## SYNTAX
### PathComplex (Default) ### PathSimple
``` ```
Add-NTFSAudit [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2> Add-NTFSAudit [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2>
[-AuditFlags <AuditFlags>] [-InheritanceFlags <InheritanceFlags>] [-PropagationFlags <PropagationFlags>] [-AuditFlags <AuditFlags>] -AppliesTo <ApplyTo> [-PassThru] [<CommonParameters>]
[-PassThru] [<CommonParameters>]
``` ```
### PathSimple ### PathComplex
``` ```
Add-NTFSAudit [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2> Add-NTFSAudit [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2>
[-AuditFlags <AuditFlags>] -AppliesTo <ApplyTo> [-PassThru] [<CommonParameters>] [-AuditFlags <AuditFlags>] [-InheritanceFlags <InheritanceFlags>] [-PropagationFlags <PropagationFlags>]
[-PassThru] [<CommonParameters>]
``` ```
### SDSimple ### SDSimple
@ -46,7 +46,7 @@ The `Add-NTFSAudit` cmdlet adds an audit entry to the system access control list
In the `PathSimple` and `PathComplex` parameter sets the cmdlet reads the security descriptor of every item in `-Path`, adds the entry, and writes the descriptor back right away. In the `SDSimple` and `SDComplex` parameter sets it adds the entry to an in-memory `Security2.FileSystemSecurity2` object that `Get-NTFSSecurityDescriptor` returned; that change only reaches the file system when you pass the object to `Set-NTFSSecurityDescriptor`. The simple sets describe the scope of the entry with the single `-AppliesTo` parameter, the complex sets with `-InheritanceFlags` and `-PropagationFlags`. In the `PathSimple` and `PathComplex` parameter sets the cmdlet reads the security descriptor of every item in `-Path`, adds the entry, and writes the descriptor back right away. In the `SDSimple` and `SDComplex` parameter sets it adds the entry to an in-memory `Security2.FileSystemSecurity2` object that `Get-NTFSSecurityDescriptor` returned; that change only reaches the file system when you pass the object to `Set-NTFSSecurityDescriptor`. The simple sets describe the scope of the entry with the single `-AppliesTo` parameter, the complex sets with `-InheritanceFlags` and `-PropagationFlags`.
`PathComplex` is the default parameter set. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor, and a command that has `-AppliesTo` together with `-InheritanceFlags` or `-PropagationFlags` fails, because PowerShell can't choose between the sets. The same holds for an object that you pipe in: its property `AppliesTo` selects a `Simple` set, its properties `InheritanceFlags` and `PropagationFlags` select a `Complex` set, and an object that has both kinds, an object that has both `Path` and `SecurityDescriptor`, or one whose `AppliesTo` is `$null`, fails. `Import-Csv` gives `$null` for a column that a row lacks because it has fewer fields than the header. An `AppliesTo` that PowerShell can't convert to a scope, such as the blank cell of a CSV file or a misspelled name, is ignored, and the object is handled as one without `AppliesTo`: it uses its own `InheritanceFlags` and `PropagationFlags`, or the default scope if it has none. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets.
When you omit them, `-AuditFlags` is `Success, Failure`, `-InheritanceFlags` is `ContainerInherit, ObjectInherit`, `-PropagationFlags` is `None`, and `-AppliesTo` is `ThisFolderSubfoldersAndFiles`, so both the simple and the complex set audit the item, its subfolders, and its files by default. Inheritance applies to folders only: when the item is a file, the cmdlet stores the entry without inheritance and propagation flags. When you omit them, `-AuditFlags` is `Success, Failure`, `-InheritanceFlags` is `ContainerInherit, ObjectInherit`, `-PropagationFlags` is `None`, and `-AppliesTo` is `ThisFolderSubfoldersAndFiles`, so both the simple and the complex set audit the item, its subfolders, and its files by default. Inheritance applies to folders only: when the item is a file, the cmdlet stores the entry without inheritance and propagation flags.
@ -196,7 +196,7 @@ Specifies the files or folders the audit entry is added to. Relative paths are r
```yaml ```yaml
Type: String[] Type: String[]
Parameter Sets: PathComplex, PathSimple Parameter Sets: PathSimple, PathComplex
Aliases: FullName Aliases: FullName
Required: True Required: True

14
Docs/Cmdlets/Remove-NTFSAccess.md

@ -13,17 +13,17 @@ Removes rights from the access control entries (ACEs) of a file, a folder, or a
## SYNTAX ## SYNTAX
### PathComplex (Default) ### PathSimple
``` ```
Remove-NTFSAccess [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2> Remove-NTFSAccess [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2>
[-AccessType <AccessControlType>] [-InheritanceFlags <InheritanceFlags>] [-AccessType <AccessControlType>] -AppliesTo <ApplyTo> [-RemoveSpecific] [-PassThru] [<CommonParameters>]
[-PropagationFlags <PropagationFlags>] [-RemoveSpecific] [-PassThru] [<CommonParameters>]
``` ```
### PathSimple ### PathComplex
``` ```
Remove-NTFSAccess [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2> Remove-NTFSAccess [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2>
[-AccessType <AccessControlType>] -AppliesTo <ApplyTo> [-RemoveSpecific] [-PassThru] [<CommonParameters>] [-AccessType <AccessControlType>] [-InheritanceFlags <InheritanceFlags>]
[-PropagationFlags <PropagationFlags>] [-RemoveSpecific] [-PassThru] [<CommonParameters>]
``` ```
### SDSimple ### SDSimple
@ -48,7 +48,7 @@ Only the specified rights are taken away: when an entry grants more than `-Acces
Inherited entries cannot be removed from the item that inherits them. Remove them from the folder named in the `InheritedFrom` property, or run `Disable-NTFSAccessInheritance` on the item first, which copies the inherited entries into it as explicit ones that this cmdlet can then remove. Inherited entries cannot be removed from the item that inherits them. Remove them from the folder named in the `InheritedFrom` property, or run `Disable-NTFSAccessInheritance` on the item first, which copies the inherited entries into it as explicit ones that this cmdlet can then remove.
The cmdlet has four parameter sets. The `Path` sets read the item from disk and write the changed DACL back immediately, while the `SD` sets change a `Security2.FileSystemSecurity2` object returned by `Get-NTFSSecurityDescriptor` in memory until `Set-NTFSSecurityDescriptor` writes it back. The `Simple` sets take `-AppliesTo`, the `Complex` sets take `-InheritanceFlags` and `-PropagationFlags`, and `PathComplex` is the default. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets. All relevant parameters bind by property name, so the output of `Get-NTFSAccess` and `Get-NTFSOrphanedAccess` can be piped directly into this cmdlet. The cmdlet writes no output unless `-PassThru` is used. The cmdlet has four parameter sets. The `Path` sets read the item from disk and write the changed DACL back immediately, while the `SD` sets change a `Security2.FileSystemSecurity2` object returned by `Get-NTFSSecurityDescriptor` in memory until `Set-NTFSSecurityDescriptor` writes it back. The `Simple` sets take `-AppliesTo`, the `Complex` sets take `-InheritanceFlags` and `-PropagationFlags`. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor, and a command that has `-AppliesTo` together with `-InheritanceFlags` or `-PropagationFlags` fails, because PowerShell can't choose between the sets. The same holds for an object that you pipe in: its property `AppliesTo` selects a `Simple` set, its properties `InheritanceFlags` and `PropagationFlags` select a `Complex` set, and an object that has both kinds, an object that has both `Path` and `SecurityDescriptor`, or one whose `AppliesTo` is `$null`, fails. `Import-Csv` gives `$null` for a column that a row lacks because it has fewer fields than the header. An `AppliesTo` that PowerShell can't convert to a scope, such as the blank cell of a CSV file or a misspelled name, is ignored, and the object is handled as one without `AppliesTo`: it uses its own `InheritanceFlags` and `PropagationFlags`, or the default scope if it has none. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets. All relevant parameters bind by property name, so the output of `Get-NTFSAccess` and `Get-NTFSOrphanedAccess` can be piped directly into this cmdlet. The cmdlet writes no output unless `-PassThru` is used.
## EXAMPLES ## EXAMPLES
@ -192,7 +192,7 @@ Specifies the path of one or more files or folders whose access control entries
```yaml ```yaml
Type: String[] Type: String[]
Parameter Sets: PathComplex, PathSimple Parameter Sets: PathSimple, PathComplex
Aliases: FullName Aliases: FullName
Required: True Required: True

14
Docs/Cmdlets/Remove-NTFSAudit.md

@ -13,17 +13,17 @@ Removes an audit entry from a file or folder.
## SYNTAX ## SYNTAX
### PathComplex (Default) ### PathSimple
``` ```
Remove-NTFSAudit [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2> Remove-NTFSAudit [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2>
[-AuditFlags <AuditFlags>] [-InheritanceFlags <InheritanceFlags>] [-PropagationFlags <PropagationFlags>] [-AuditFlags <AuditFlags>] -AppliesTo <ApplyTo> [-RemoveSpecific] [-PassThru] [<CommonParameters>]
[-RemoveSpecific] [-PassThru] [<CommonParameters>]
``` ```
### PathSimple ### PathComplex
``` ```
Remove-NTFSAudit [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2> Remove-NTFSAudit [-Path] <String[]> [-Account] <IdentityReference2[]> [-AccessRights] <FileSystemRights2>
[-AuditFlags <AuditFlags>] -AppliesTo <ApplyTo> [-RemoveSpecific] [-PassThru] [<CommonParameters>] [-AuditFlags <AuditFlags>] [-InheritanceFlags <InheritanceFlags>] [-PropagationFlags <PropagationFlags>]
[-RemoveSpecific] [-PassThru] [<CommonParameters>]
``` ```
### SDSimple ### SDSimple
@ -46,7 +46,7 @@ The `Remove-NTFSAudit` cmdlet removes an audit entry from the system access cont
Because the inheritance and propagation flags take part in the match, they must describe the entry you want to remove. `-AppliesTo ThisFolderOnly` removes an entry that is not inherited by child items, which is also the shape of every audit entry on a file, while the default of the complex parameter sets removes an entry that applies to the folder, its subfolders, and its files. An entry that an item inherits from a parent folder is stored on that parent, so remove it there, or use `Clear-NTFSAudit` with `-DisableInheritance` to drop the inherited entries on the item. Because the inheritance and propagation flags take part in the match, they must describe the entry you want to remove. `-AppliesTo ThisFolderOnly` removes an entry that is not inherited by child items, which is also the shape of every audit entry on a file, while the default of the complex parameter sets removes an entry that applies to the folder, its subfolders, and its files. An entry that an item inherits from a parent folder is stored on that parent, so remove it there, or use `Clear-NTFSAudit` with `-DisableInheritance` to drop the inherited entries on the item.
In the `PathSimple` and `PathComplex` parameter sets the cmdlet reads the security descriptor of every item in `-Path` and writes it back right away. In the `SDSimple` and `SDComplex` parameter sets it changes an in-memory `Security2.FileSystemSecurity2` object that `Get-NTFSSecurityDescriptor` returned, and the change reaches the file system only when you pass the object to `Set-NTFSSecurityDescriptor`. `PathComplex` is the default parameter set. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets. In the `PathSimple` and `PathComplex` parameter sets the cmdlet reads the security descriptor of every item in `-Path` and writes it back right away. In the `SDSimple` and `SDComplex` parameter sets it changes an in-memory `Security2.FileSystemSecurity2` object that `Get-NTFSSecurityDescriptor` returned, and the change reaches the file system only when you pass the object to `Set-NTFSSecurityDescriptor`. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor, and a command that has `-AppliesTo` together with `-InheritanceFlags` or `-PropagationFlags` fails, because PowerShell can't choose between the sets. The same holds for an object that you pipe in: its property `AppliesTo` selects a `Simple` set, its properties `InheritanceFlags` and `PropagationFlags` select a `Complex` set, and an object that has both kinds, an object that has both `Path` and `SecurityDescriptor`, or one whose `AppliesTo` is `$null`, fails. `Import-Csv` gives `$null` for a column that a row lacks because it has fewer fields than the header. An `AppliesTo` that PowerShell can't convert to a scope, such as the blank cell of a CSV file or a misspelled name, is ignored, and the object is handled as one without `AppliesTo`: it uses its own `InheritanceFlags` and `PropagationFlags`, or the default scope if it has none. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets.
When you omit them, `-AuditFlags` is `Success, Failure`, `-InheritanceFlags` is `ContainerInherit, ObjectInherit`, `-PropagationFlags` is `None`. All parameters bind by property name, and `-Path` also binds by value and through its `FullName` alias, so you can pipe the output of `Get-NTFSAudit`, `Get-ChildItem`, `Get-ChildItem2`, and `Get-Item2` into the cmdlet. The cmdlet writes no object unless you use `-PassThru`. When you omit them, `-AuditFlags` is `Success, Failure`, `-InheritanceFlags` is `ContainerInherit, ObjectInherit`, `-PropagationFlags` is `None`. All parameters bind by property name, and `-Path` also binds by value and through its `FullName` alias, so you can pipe the output of `Get-NTFSAudit`, `Get-ChildItem`, `Get-ChildItem2`, and `Get-Item2` into the cmdlet. The cmdlet writes no object unless you use `-PassThru`.
@ -194,7 +194,7 @@ Specifies the files or folders the audit entry is removed from. Relative paths a
```yaml ```yaml
Type: String[] Type: String[]
Parameter Sets: PathComplex, PathSimple Parameter Sets: PathSimple, PathComplex
Aliases: FullName Aliases: FullName
Required: True Required: True

4
Docs/Examples.md

@ -173,8 +173,8 @@ Set-NTFSOwner -Path C:\Data -Account 'BUILTIN\Administrators'
## Make several changes in one write ## Make several changes in one write
Get the security descriptor once, change it in memory, and write it back. Get the security descriptor once, change it in memory, and write it back.
With security descriptor input, specify `-AppliesTo` (or the inheritance and `-AppliesTo` sets the scope of the entry; without it, the entry applies to this
propagation flags) so that PowerShell can choose the parameter set: folder, subfolders, and files:
```powershell ```powershell
$sd = Get-NTFSSecurityDescriptor -Path C:\Data $sd = Get-NTFSSecurityDescriptor -Path C:\Data

15
NTFSSecurity/AccessCmdlets/AddAccess.cs

@ -7,7 +7,7 @@ using System.Security.AccessControl;
namespace NTFSSecurity namespace NTFSSecurity
{ {
[Cmdlet(VerbsCommon.Add, "NTFSAccess", DefaultParameterSetName = "PathComplex")] [Cmdlet(VerbsCommon.Add, "NTFSAccess")]
[OutputType(typeof(FileSystemAccessRule2))] [OutputType(typeof(FileSystemAccessRule2))]
public class AddAccess : BaseCmdletWithPrivControl public class AddAccess : BaseCmdletWithPrivControl
{ {
@ -110,9 +110,14 @@ namespace NTFSSecurity
protected override void ProcessRecord() protected override void ProcessRecord()
{ {
// The flags of this record are locals: the fields behind -InheritanceFlags and -PropagationFlags keep the value of the
// previous piped object when the next one binds neither, so the scope that -AppliesTo converts to must not stay in them.
var inheritance = inheritanceFlags;
var propagation = propagationFlags;
if (ParameterSetName.EndsWith("Simple")) if (ParameterSetName.EndsWith("Simple"))
{ {
FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritanceFlags, out propagationFlags); FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritance, out propagation);
} }
if (ParameterSetName.StartsWith("Path")) if (ParameterSetName.StartsWith("Path"))
@ -133,7 +138,7 @@ namespace NTFSSecurity
try try
{ {
FileSystemAccessRule2.AddFileSystemAccessRule(item, account.ToList(), accessRights, accessType, inheritanceFlags, propagationFlags); FileSystemAccessRule2.AddFileSystemAccessRule(item, account.ToList(), accessRights, accessType, inheritance, propagation);
} }
catch (UnauthorizedAccessException) catch (UnauthorizedAccessException)
{ {
@ -141,7 +146,7 @@ namespace NTFSSecurity
{ {
InvokeAsOwner(item, path, () => InvokeAsOwner(item, path, () =>
{ {
FileSystemAccessRule2.AddFileSystemAccessRule(item, account.ToList(), accessRights, accessType, inheritanceFlags, propagationFlags); FileSystemAccessRule2.AddFileSystemAccessRule(item, account.ToList(), accessRights, accessType, inheritance, propagation);
}); });
} }
catch (Exception ex2) catch (Exception ex2)
@ -166,7 +171,7 @@ namespace NTFSSecurity
{ {
foreach (var sd in securityDescriptors) foreach (var sd in securityDescriptors)
{ {
FileSystemAccessRule2.AddFileSystemAccessRule(sd, account.ToList(), accessRights, accessType, inheritanceFlags, propagationFlags); FileSystemAccessRule2.AddFileSystemAccessRule(sd, account.ToList(), accessRights, accessType, inheritance, propagation);
if (passThru == true) if (passThru == true)
{ {

20
NTFSSecurity/AccessCmdlets/RemoveAccess.cs

@ -7,7 +7,7 @@ using System.Security.AccessControl;
namespace NTFSSecurity namespace NTFSSecurity
{ {
[Cmdlet(VerbsCommon.Remove, "NTFSAccess", DefaultParameterSetName = "PathComplex")] [Cmdlet(VerbsCommon.Remove, "NTFSAccess")]
[OutputType(typeof(FileSystemAccessRule2))] [OutputType(typeof(FileSystemAccessRule2))]
public class RemoveAccess : BaseCmdletWithPrivControl public class RemoveAccess : BaseCmdletWithPrivControl
{ {
@ -121,9 +121,14 @@ namespace NTFSSecurity
protected override void ProcessRecord() protected override void ProcessRecord()
{ {
// The flags of this record are locals: the fields behind -InheritanceFlags and -PropagationFlags keep the value of the
// previous piped object when the next one binds neither, so the scope that -AppliesTo converts to must not stay in them.
var inheritance = inheritanceFlags;
var propagation = propagationFlags;
if (ParameterSetName.EndsWith("Simple")) if (ParameterSetName.EndsWith("Simple"))
{ {
FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritanceFlags, out propagationFlags); FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritance, out propagation);
} }
if (ParameterSetName.StartsWith("Path")) if (ParameterSetName.StartsWith("Path"))
@ -142,14 +147,9 @@ namespace NTFSSecurity
continue; continue;
} }
if (ParameterSetName == "PathSimple")
{
FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritanceFlags, out propagationFlags);
}
try try
{ {
FileSystemAccessRule2.RemoveFileSystemAccessRule(item, account.ToList(), accessRights, accessType, inheritanceFlags, propagationFlags, removeSpecific); FileSystemAccessRule2.RemoveFileSystemAccessRule(item, account.ToList(), accessRights, accessType, inheritance, propagation, removeSpecific);
} }
catch (UnauthorizedAccessException) catch (UnauthorizedAccessException)
{ {
@ -157,7 +157,7 @@ namespace NTFSSecurity
{ {
InvokeAsOwner(item, path, () => InvokeAsOwner(item, path, () =>
{ {
FileSystemAccessRule2.RemoveFileSystemAccessRule(item, account.ToList(), accessRights, accessType, inheritanceFlags, propagationFlags, removeSpecific); FileSystemAccessRule2.RemoveFileSystemAccessRule(item, account.ToList(), accessRights, accessType, inheritance, propagation, removeSpecific);
}); });
} }
catch (Exception ex2) catch (Exception ex2)
@ -182,7 +182,7 @@ namespace NTFSSecurity
{ {
foreach (var sd in securityDescriptors) foreach (var sd in securityDescriptors)
{ {
FileSystemAccessRule2.RemoveFileSystemAccessRule(sd, account.ToList(), accessRights, accessType, inheritanceFlags, propagationFlags, removeSpecific); FileSystemAccessRule2.RemoveFileSystemAccessRule(sd, account.ToList(), accessRights, accessType, inheritance, propagation, removeSpecific);
if (passThru == true) if (passThru == true)
{ {

15
NTFSSecurity/AuditCmdlets/AddAudit.cs

@ -7,7 +7,7 @@ using System.Security.AccessControl;
namespace NTFSSecurity namespace NTFSSecurity
{ {
[Cmdlet(VerbsCommon.Add, "NTFSAudit", DefaultParameterSetName = "PathComplex")] [Cmdlet(VerbsCommon.Add, "NTFSAudit")]
[OutputType(typeof(FileSystemAuditRule2))] [OutputType(typeof(FileSystemAuditRule2))]
public class AddAudit : BaseCmdletWithPrivControl public class AddAudit : BaseCmdletWithPrivControl
{ {
@ -109,9 +109,14 @@ namespace NTFSSecurity
protected override void ProcessRecord() protected override void ProcessRecord()
{ {
// The flags of this record are locals: the fields behind -InheritanceFlags and -PropagationFlags keep the value of the
// previous piped object when the next one binds neither, so the scope that -AppliesTo converts to must not stay in them.
var inheritance = inheritanceFlags;
var propagation = propagationFlags;
if (ParameterSetName.EndsWith("Simple")) if (ParameterSetName.EndsWith("Simple"))
{ {
FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritanceFlags, out propagationFlags); FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritance, out propagation);
} }
if (ParameterSetName.StartsWith("Path")) if (ParameterSetName.StartsWith("Path"))
@ -132,7 +137,7 @@ namespace NTFSSecurity
try try
{ {
FileSystemAuditRule2.AddFileSystemAuditRule(item, account.ToList(), accessRights, auditFlags, inheritanceFlags, propagationFlags); FileSystemAuditRule2.AddFileSystemAuditRule(item, account.ToList(), accessRights, auditFlags, inheritance, propagation);
} }
catch (UnauthorizedAccessException) catch (UnauthorizedAccessException)
{ {
@ -140,7 +145,7 @@ namespace NTFSSecurity
{ {
InvokeAsOwner(item, path, () => InvokeAsOwner(item, path, () =>
{ {
FileSystemAuditRule2.AddFileSystemAuditRule(item, account.ToList(), accessRights, auditFlags, inheritanceFlags, propagationFlags); FileSystemAuditRule2.AddFileSystemAuditRule(item, account.ToList(), accessRights, auditFlags, inheritance, propagation);
}); });
} }
catch (Exception ex2) catch (Exception ex2)
@ -170,7 +175,7 @@ namespace NTFSSecurity
continue; continue;
} }
FileSystemAuditRule2.AddFileSystemAuditRule(sd, account.ToList(), accessRights, auditFlags, inheritanceFlags, propagationFlags); FileSystemAuditRule2.AddFileSystemAuditRule(sd, account.ToList(), accessRights, auditFlags, inheritance, propagation);
if (passThru == true) if (passThru == true)
{ {

20
NTFSSecurity/AuditCmdlets/RemoveAudit.cs

@ -7,7 +7,7 @@ using System.Security.AccessControl;
namespace NTFSSecurity namespace NTFSSecurity
{ {
[Cmdlet(VerbsCommon.Remove, "NTFSAudit", DefaultParameterSetName = "PathComplex")] [Cmdlet(VerbsCommon.Remove, "NTFSAudit")]
[OutputType(typeof(FileSystemAuditRule2))] [OutputType(typeof(FileSystemAuditRule2))]
public class RemoveAudit : BaseCmdletWithPrivControl public class RemoveAudit : BaseCmdletWithPrivControl
{ {
@ -120,9 +120,14 @@ namespace NTFSSecurity
protected override void ProcessRecord() protected override void ProcessRecord()
{ {
// The flags of this record are locals: the fields behind -InheritanceFlags and -PropagationFlags keep the value of the
// previous piped object when the next one binds neither, so the scope that -AppliesTo converts to must not stay in them.
var inheritance = inheritanceFlags;
var propagation = propagationFlags;
if (ParameterSetName.EndsWith("Simple")) if (ParameterSetName.EndsWith("Simple"))
{ {
FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritanceFlags, out propagationFlags); FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritance, out propagation);
} }
if (ParameterSetName.StartsWith("Path")) if (ParameterSetName.StartsWith("Path"))
@ -141,14 +146,9 @@ namespace NTFSSecurity
continue; continue;
} }
if (ParameterSetName == "PathSimple")
{
FileSystemSecurity2.ConvertToFileSystemFlags(appliesTo, out inheritanceFlags, out propagationFlags);
}
try try
{ {
FileSystemAuditRule2.RemoveFileSystemAuditRule(item, account.ToList(), accessRights, auditFlags, inheritanceFlags, propagationFlags, removeSpecific); FileSystemAuditRule2.RemoveFileSystemAuditRule(item, account.ToList(), accessRights, auditFlags, inheritance, propagation, removeSpecific);
} }
catch (UnauthorizedAccessException) catch (UnauthorizedAccessException)
{ {
@ -156,7 +156,7 @@ namespace NTFSSecurity
{ {
InvokeAsOwner(item, path, () => InvokeAsOwner(item, path, () =>
{ {
FileSystemAuditRule2.RemoveFileSystemAuditRule(item, account.ToList(), accessRights, auditFlags, inheritanceFlags, propagationFlags, removeSpecific); FileSystemAuditRule2.RemoveFileSystemAuditRule(item, account.ToList(), accessRights, auditFlags, inheritance, propagation, removeSpecific);
}); });
} }
catch (Exception ex2) catch (Exception ex2)
@ -186,7 +186,7 @@ namespace NTFSSecurity
continue; continue;
} }
FileSystemAuditRule2.RemoveFileSystemAuditRule(sd, account.ToList(), accessRights, auditFlags, inheritanceFlags, propagationFlags, removeSpecific); FileSystemAuditRule2.RemoveFileSystemAuditRule(sd, account.ToList(), accessRights, auditFlags, inheritance, propagation, removeSpecific);
if (passThru == true) if (passThru == true)
{ {

60
NTFSSecurity/ItemCmdlets/GetChildItem2.cs

@ -150,8 +150,10 @@ namespace NTFSSecurity
// for itself. Before 5.0.0, [1] was read as a character class, so a file with brackets in its name was not // for itself. Before 5.0.0, [1] was read as a character class, so a file with brackets in its name was not
// returned for its name. The enumeration returns every item for *.* as Windows does, so the comparison does // returned for its name. The enumeration returns every item for *.* as Windows does, so the comparison does
// too; with the dot as an ordinary character, it would drop the items without a dot, most folders. // too; with the dot as an ordinary character, it would drop the items without a dot, most folders.
// CultureInvariant: like the enumeration (see MoveNextInvariant), the comparison would otherwise treat I and i as
// different letters with tr-TR and drop items that the enumeration returned.
var pattern = filter == "*.*" ? "*" : filter; var pattern = filter == "*.*" ? "*" : filter;
wildcard = new WildcardPattern(pattern.Replace("`", "``").Replace("[", "`[").Replace("]", "`]"), WildcardOptions.Compiled | WildcardOptions.IgnoreCase); wildcard = new WildcardPattern(pattern.Replace("`", "``").Replace("[", "`[").Replace("]", "`]"), WildcardOptions.Compiled | WildcardOptions.IgnoreCase | WildcardOptions.CultureInvariant);
modeMethodInfo = typeof(FileSystemCodeMembers).GetMethod("Mode"); modeMethodInfo = typeof(FileSystemCodeMembers).GetMethod("Mode");
@ -206,18 +208,33 @@ namespace NTFSSecurity
{ {
if (directory) if (directory)
{ {
var files = di.EnumerateDirectories(filter, global::System.IO.SearchOption.TopDirectoryOnly); IEnumerator files;
WriteFileSystemInfoCollection(files.GetEnumerator()); using (new InvariantCultureScope())
{
files = di.EnumerateDirectories(filter, global::System.IO.SearchOption.TopDirectoryOnly).GetEnumerator();
}
WriteFileSystemInfoCollection(files);
} }
else if (file) else if (file)
{ {
var files = di.EnumerateFiles(filter, global::System.IO.SearchOption.TopDirectoryOnly); IEnumerator files;
WriteFileSystemInfoCollection(files.GetEnumerator()); using (new InvariantCultureScope())
{
files = di.EnumerateFiles(filter, global::System.IO.SearchOption.TopDirectoryOnly).GetEnumerator();
}
WriteFileSystemInfoCollection(files);
} }
else else
{ {
var files = di.EnumerateFileSystemInfos(filter, global::System.IO.SearchOption.TopDirectoryOnly); IEnumerator files;
WriteFileSystemInfoCollection(files.GetEnumerator()); using (new InvariantCultureScope())
{
files = di.EnumerateFileSystemInfos(filter, global::System.IO.SearchOption.TopDirectoryOnly).GetEnumerator();
}
WriteFileSystemInfoCollection(files);
} }
} }
@ -284,7 +301,7 @@ namespace NTFSSecurity
protected void WriteFileSystemInfoCollection(IEnumerator fileSystemInfos) protected void WriteFileSystemInfoCollection(IEnumerator fileSystemInfos)
{ {
while (fileSystemInfos.MoveNext()) while (MoveNextInvariant(fileSystemInfos))
{ {
FileSystemInfo current = (FileSystemInfo)fileSystemInfos.Current; FileSystemInfo current = (FileSystemInfo)fileSystemInfos.Current;
if (!wildcard.IsMatch(current.Name)) if (!wildcard.IsMatch(current.Name))
@ -357,5 +374,32 @@ namespace NTFSSecurity
{ {
base.EndProcessing(); base.EndProcessing();
} }
// AlphaFS 2.2 matches the filter with a regular expression that takes the culture of the thread, and with tr-TR the
// letters I and i differ: index* did not match Index.txt. The enumeration therefore runs with the invariant culture,
// which is back before an item reaches the pipeline, so that no later command sees it.
private static bool MoveNextInvariant(IEnumerator enumerator)
{
using (new InvariantCultureScope())
{
return enumerator.MoveNext();
}
}
private sealed class InvariantCultureScope : IDisposable
{
private readonly global::System.Globalization.CultureInfo previous;
public InvariantCultureScope()
{
previous = global::System.Threading.Thread.CurrentThread.CurrentCulture;
global::System.Threading.Thread.CurrentThread.CurrentCulture = global::System.Globalization.CultureInfo.InvariantCulture;
}
public void Dispose()
{
global::System.Threading.Thread.CurrentThread.CurrentCulture = previous;
}
}
} }
} }

8
NTFSSecurity/en-US/NTFSSecurity.dll-Help.xml

@ -12,7 +12,7 @@
<maml:description> <maml:description>
<maml:para>Adds an access control entry (ACE) to the discretionary access control list (DACL) of a file or a folder. Every account in `-Account` receives the rights in `-AccessRights`, either as an `Allow` or as a `Deny` entry.</maml:para> <maml:para>Adds an access control entry (ACE) to the discretionary access control list (DACL) of a file or a folder. Every account in `-Account` receives the rights in `-AccessRights`, either as an `Allow` or as a `Deny` entry.</maml:para>
<maml:para>`-AccessRights` accepts the basic rights such as `Read`, `Modify`, and `FullControl` as well as the granular rights such as `CreateFiles` or `WriteAttributes`, and several values can be combined, for example `-AccessRights ReadData, WriteData, Delete`. For the mapping between the values of this module, the rights that Windows displays, and the entries of the advanced security dialog, see Concepts (../Concepts.md).</maml:para> <maml:para>`-AccessRights` accepts the basic rights such as `Read`, `Modify`, and `FullControl` as well as the granular rights such as `CreateFiles` or `WriteAttributes`, and several values can be combined, for example `-AccessRights ReadData, WriteData, Delete`. For the mapping between the values of this module, the rights that Windows displays, and the entries of the advanced security dialog, see Concepts (../Concepts.md).</maml:para>
<maml:para>The cmdlet has four parameter sets. The `Path` sets read the item from disk and write the changed DACL back immediately, while the `SD` sets change a `Security2.FileSystemSecurity2` object returned by `Get-NTFSSecurityDescriptor` in memory until `Set-NTFSSecurityDescriptor` writes it back. The `Simple` sets take `-AppliesTo`, the `Complex` sets take `-InheritanceFlags` and `-PropagationFlags`; both describe the same ACE flags, and `PathComplex` is the default. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets.</maml:para> <maml:para>The cmdlet has four parameter sets. The `Path` sets read the item from disk and write the changed DACL back immediately, while the `SD` sets change a `Security2.FileSystemSecurity2` object returned by `Get-NTFSSecurityDescriptor` in memory until `Set-NTFSSecurityDescriptor` writes it back. The `Simple` sets take `-AppliesTo`, the `Complex` sets take `-InheritanceFlags` and `-PropagationFlags`; both describe the same ACE flags. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor, and a command that has `-AppliesTo` together with `-InheritanceFlags` or `-PropagationFlags` fails, because PowerShell can't choose between the sets. The same holds for an object that you pipe in: its property `AppliesTo` selects a `Simple` set, its properties `InheritanceFlags` and `PropagationFlags` select a `Complex` set, and an object that has both kinds, an object that has both `Path` and `SecurityDescriptor`, or one whose `AppliesTo` is `$null`, fails. `Import-Csv` gives `$null` for a column that a row lacks because it has fewer fields than the header. An `AppliesTo` that PowerShell can't convert to a scope, such as the blank cell of a CSV file or a misspelled name, is ignored, and the object is handled as one without `AppliesTo`: it uses its own `InheritanceFlags` and `PropagationFlags`, or the default scope if it has none. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets.</maml:para>
<maml:para>When `-AccessType`, `-AppliesTo`, `-InheritanceFlags`, and `-PropagationFlags` are omitted, the cmdlet adds an `Allow` ACE that applies to this folder, subfolders, and files, which corresponds to the inheritance flags `ContainerInherit, ObjectInherit` and no propagation flags. An `Allow` ACE always receives the `Synchronize` right in addition to the requested rights, inheritance and propagation flags are ignored on files, and rights for an account that already has an ACE with the same access type and the same flags are merged into that ACE. The cmdlet writes no output unless `-PassThru` is used, and a failure on one item is reported as a non-terminating error while the remaining items are processed.</maml:para> <maml:para>When `-AccessType`, `-AppliesTo`, `-InheritanceFlags`, and `-PropagationFlags` are omitted, the cmdlet adds an `Allow` ACE that applies to this folder, subfolders, and files, which corresponds to the inheritance flags `ContainerInherit, ObjectInherit` and no propagation flags. An `Allow` ACE always receives the `Synchronize` right in addition to the requested rights, inheritance and propagation flags are ignored on files, and rights for an account that already has an ACE with the same access type and the same flags are merged into that ACE. The cmdlet writes no output unless `-PassThru` is used, and a failure on one item is reported as a non-terminating error while the remaining items are processed.</maml:para>
<maml:para>`-Path` accepts pipeline input by value and by property name through its alias `FullName`, so output of `Get-ChildItem`, `Get-ChildItem2`, and `Get-Item2` can be piped in. `-Account`, `-AccessRights`, `-AccessType`, `-InheritanceFlags`, and `-PropagationFlags` bind by property name as well, which lets you pipe `Security2.FileSystemAccessRule2` objects, or rows imported from a CSV file created from them, directly into the cmdlet.</maml:para> <maml:para>`-Path` accepts pipeline input by value and by property name through its alias `FullName`, so output of `Get-ChildItem`, `Get-ChildItem2`, and `Get-Item2` can be piped in. `-Account`, `-AccessRights`, `-AccessType`, `-InheritanceFlags`, and `-PropagationFlags` bind by property name as well, which lets you pipe `Security2.FileSystemAccessRule2` objects, or rows imported from a CSV file created from them, directly into the cmdlet.</maml:para>
</maml:description> </maml:description>
@ -796,7 +796,7 @@
<maml:description> <maml:description>
<maml:para>The `Add-NTFSAudit` cmdlet adds an audit entry to the system access control list (SACL) of a file or folder. Windows then writes an event to the security log when the audited account uses one of the audited access rights on the item. `-AuditFlags Success` audits successful attempts, `-AuditFlags Failure` audits failed attempts, and the default audits both. For what the individual access rights permit, see Concepts (../Concepts.md).</maml:para> <maml:para>The `Add-NTFSAudit` cmdlet adds an audit entry to the system access control list (SACL) of a file or folder. Windows then writes an event to the security log when the audited account uses one of the audited access rights on the item. `-AuditFlags Success` audits successful attempts, `-AuditFlags Failure` audits failed attempts, and the default audits both. For what the individual access rights permit, see Concepts (../Concepts.md).</maml:para>
<maml:para>In the `PathSimple` and `PathComplex` parameter sets the cmdlet reads the security descriptor of every item in `-Path`, adds the entry, and writes the descriptor back right away. In the `SDSimple` and `SDComplex` parameter sets it adds the entry to an in-memory `Security2.FileSystemSecurity2` object that `Get-NTFSSecurityDescriptor` returned; that change only reaches the file system when you pass the object to `Set-NTFSSecurityDescriptor`. The simple sets describe the scope of the entry with the single `-AppliesTo` parameter, the complex sets with `-InheritanceFlags` and `-PropagationFlags`.</maml:para> <maml:para>In the `PathSimple` and `PathComplex` parameter sets the cmdlet reads the security descriptor of every item in `-Path`, adds the entry, and writes the descriptor back right away. In the `SDSimple` and `SDComplex` parameter sets it adds the entry to an in-memory `Security2.FileSystemSecurity2` object that `Get-NTFSSecurityDescriptor` returned; that change only reaches the file system when you pass the object to `Set-NTFSSecurityDescriptor`. The simple sets describe the scope of the entry with the single `-AppliesTo` parameter, the complex sets with `-InheritanceFlags` and `-PropagationFlags`.</maml:para>
<maml:para>`PathComplex` is the default parameter set. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets.</maml:para> <maml:para>A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor, and a command that has `-AppliesTo` together with `-InheritanceFlags` or `-PropagationFlags` fails, because PowerShell can't choose between the sets. The same holds for an object that you pipe in: its property `AppliesTo` selects a `Simple` set, its properties `InheritanceFlags` and `PropagationFlags` select a `Complex` set, and an object that has both kinds, an object that has both `Path` and `SecurityDescriptor`, or one whose `AppliesTo` is `$null`, fails. `Import-Csv` gives `$null` for a column that a row lacks because it has fewer fields than the header. An `AppliesTo` that PowerShell can't convert to a scope, such as the blank cell of a CSV file or a misspelled name, is ignored, and the object is handled as one without `AppliesTo`: it uses its own `InheritanceFlags` and `PropagationFlags`, or the default scope if it has none. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets.</maml:para>
<maml:para>When you omit them, `-AuditFlags` is `Success, Failure`, `-InheritanceFlags` is `ContainerInherit, ObjectInherit`, `-PropagationFlags` is `None`, and `-AppliesTo` is `ThisFolderSubfoldersAndFiles`, so both the simple and the complex set audit the item, its subfolders, and its files by default. Inheritance applies to folders only: when the item is a file, the cmdlet stores the entry without inheritance and propagation flags.</maml:para> <maml:para>When you omit them, `-AuditFlags` is `Success, Failure`, `-InheritanceFlags` is `ContainerInherit, ObjectInherit`, `-PropagationFlags` is `None`, and `-AppliesTo` is `ThisFolderSubfoldersAndFiles`, so both the simple and the complex set audit the item, its subfolders, and its files by default. Inheritance applies to folders only: when the item is a file, the cmdlet stores the entry without inheritance and propagation flags.</maml:para>
<maml:para>`-Path` accepts pipeline input by value and by property name through its `FullName` alias, so the output of `Get-ChildItem`, `Get-ChildItem2`, and `Get-Item2` binds to it, and the remaining parameters bind by property name. The cmdlet writes no object unless you use `-PassThru`.</maml:para> <maml:para>`-Path` accepts pipeline input by value and by property name through its `FullName` alias, so the output of `Get-ChildItem`, `Get-ChildItem2`, and `Get-Item2` binds to it, and the remaining parameters bind by property name. The cmdlet writes no object unless you use `-PassThru`.</maml:para>
</maml:description> </maml:description>
@ -7721,7 +7721,7 @@ PS C:\Data&gt; Get-NTFSSecurityDescriptor</dev:code>
<maml:para>Removes the rights in `-AccessRights` from the access control entries (ACEs) of a file or a folder. An entry is addressed by the account in `-Account`, the access type in `-AccessType`, and the inheritance and propagation flags, which are given either as `-AppliesTo` or as `-InheritanceFlags` and `-PropagationFlags`.</maml:para> <maml:para>Removes the rights in `-AccessRights` from the access control entries (ACEs) of a file or a folder. An entry is addressed by the account in `-Account`, the access type in `-AccessType`, and the inheritance and propagation flags, which are given either as `-AppliesTo` or as `-InheritanceFlags` and `-PropagationFlags`.</maml:para>
<maml:para>Only the specified rights are taken away: when an entry grants more than `-AccessRights` names, the remaining rights stay in place, and the entry disappears only when all of its rights are removed. An `Allow` entry is always matched with the `Synchronize` right added to the specified rights. The flags must describe the entry as it exists on the item; when they do not, Windows splits the entry instead of removing the rights, so use the values that `Get-NTFSAccess` reports for the entry you want to change. With `-RemoveSpecific`, the cmdlet removes only an entry that matches exactly.</maml:para> <maml:para>Only the specified rights are taken away: when an entry grants more than `-AccessRights` names, the remaining rights stay in place, and the entry disappears only when all of its rights are removed. An `Allow` entry is always matched with the `Synchronize` right added to the specified rights. The flags must describe the entry as it exists on the item; when they do not, Windows splits the entry instead of removing the rights, so use the values that `Get-NTFSAccess` reports for the entry you want to change. With `-RemoveSpecific`, the cmdlet removes only an entry that matches exactly.</maml:para>
<maml:para>Inherited entries cannot be removed from the item that inherits them. Remove them from the folder named in the `InheritedFrom` property, or run `Disable-NTFSAccessInheritance` on the item first, which copies the inherited entries into it as explicit ones that this cmdlet can then remove.</maml:para> <maml:para>Inherited entries cannot be removed from the item that inherits them. Remove them from the folder named in the `InheritedFrom` property, or run `Disable-NTFSAccessInheritance` on the item first, which copies the inherited entries into it as explicit ones that this cmdlet can then remove.</maml:para>
<maml:para>The cmdlet has four parameter sets. The `Path` sets read the item from disk and write the changed DACL back immediately, while the `SD` sets change a `Security2.FileSystemSecurity2` object returned by `Get-NTFSSecurityDescriptor` in memory until `Set-NTFSSecurityDescriptor` writes it back. The `Simple` sets take `-AppliesTo`, the `Complex` sets take `-InheritanceFlags` and `-PropagationFlags`, and `PathComplex` is the default. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets. All relevant parameters bind by property name, so the output of `Get-NTFSAccess` and `Get-NTFSOrphanedAccess` can be piped directly into this cmdlet. The cmdlet writes no output unless `-PassThru` is used.</maml:para> <maml:para>The cmdlet has four parameter sets. The `Path` sets read the item from disk and write the changed DACL back immediately, while the `SD` sets change a `Security2.FileSystemSecurity2` object returned by `Get-NTFSSecurityDescriptor` in memory until `Set-NTFSSecurityDescriptor` writes it back. The `Simple` sets take `-AppliesTo`, the `Complex` sets take `-InheritanceFlags` and `-PropagationFlags`. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor, and a command that has `-AppliesTo` together with `-InheritanceFlags` or `-PropagationFlags` fails, because PowerShell can't choose between the sets. The same holds for an object that you pipe in: its property `AppliesTo` selects a `Simple` set, its properties `InheritanceFlags` and `PropagationFlags` select a `Complex` set, and an object that has both kinds, an object that has both `Path` and `SecurityDescriptor`, or one whose `AppliesTo` is `$null`, fails. `Import-Csv` gives `$null` for a column that a row lacks because it has fewer fields than the header. An `AppliesTo` that PowerShell can't convert to a scope, such as the blank cell of a CSV file or a misspelled name, is ignored, and the object is handled as one without `AppliesTo`: it uses its own `InheritanceFlags` and `PropagationFlags`, or the default scope if it has none. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets. All relevant parameters bind by property name, so the output of `Get-NTFSAccess` and `Get-NTFSOrphanedAccess` can be piped directly into this cmdlet. The cmdlet writes no output unless `-PassThru` is used.</maml:para>
</maml:description> </maml:description>
<command:syntax> <command:syntax>
<command:syntaxItem> <command:syntaxItem>
@ -8560,7 +8560,7 @@ PS C:\Data&gt; Get-NTFSSecurityDescriptor</dev:code>
<maml:description> <maml:description>
<maml:para>The `Remove-NTFSAudit` cmdlet removes an audit entry from the system access control list (SACL) of a file or folder. The cmdlet builds an audit entry from `-Account`, `-AccessRights`, `-AuditFlags`, and the inheritance and propagation flags, and removes that entry from the SACL. The audit entries of the account are matched by their inheritance and propagation flags, and the requested access rights and audit flags are then taken away from them: an entry that audits further rights keeps those rights and disappears only when nothing is left. To remove an entry completely, pass the same values that `Get-NTFSAudit` reports for it. With `-RemoveSpecific`, the cmdlet removes only an entry that matches exactly.</maml:para> <maml:para>The `Remove-NTFSAudit` cmdlet removes an audit entry from the system access control list (SACL) of a file or folder. The cmdlet builds an audit entry from `-Account`, `-AccessRights`, `-AuditFlags`, and the inheritance and propagation flags, and removes that entry from the SACL. The audit entries of the account are matched by their inheritance and propagation flags, and the requested access rights and audit flags are then taken away from them: an entry that audits further rights keeps those rights and disappears only when nothing is left. To remove an entry completely, pass the same values that `Get-NTFSAudit` reports for it. With `-RemoveSpecific`, the cmdlet removes only an entry that matches exactly.</maml:para>
<maml:para>Because the inheritance and propagation flags take part in the match, they must describe the entry you want to remove. `-AppliesTo ThisFolderOnly` removes an entry that is not inherited by child items, which is also the shape of every audit entry on a file, while the default of the complex parameter sets removes an entry that applies to the folder, its subfolders, and its files. An entry that an item inherits from a parent folder is stored on that parent, so remove it there, or use `Clear-NTFSAudit` with `-DisableInheritance` to drop the inherited entries on the item.</maml:para> <maml:para>Because the inheritance and propagation flags take part in the match, they must describe the entry you want to remove. `-AppliesTo ThisFolderOnly` removes an entry that is not inherited by child items, which is also the shape of every audit entry on a file, while the default of the complex parameter sets removes an entry that applies to the folder, its subfolders, and its files. An entry that an item inherits from a parent folder is stored on that parent, so remove it there, or use `Clear-NTFSAudit` with `-DisableInheritance` to drop the inherited entries on the item.</maml:para>
<maml:para>In the `PathSimple` and `PathComplex` parameter sets the cmdlet reads the security descriptor of every item in `-Path` and writes it back right away. In the `SDSimple` and `SDComplex` parameter sets it changes an in-memory `Security2.FileSystemSecurity2` object that `Get-NTFSSecurityDescriptor` returned, and the change reaches the file system only when you pass the object to `Set-NTFSSecurityDescriptor`. `PathComplex` is the default parameter set. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets.</maml:para> <maml:para>In the `PathSimple` and `PathComplex` parameter sets the cmdlet reads the security descriptor of every item in `-Path` and writes it back right away. In the `SDSimple` and `SDComplex` parameter sets it changes an in-memory `Security2.FileSystemSecurity2` object that `Get-NTFSSecurityDescriptor` returned, and the change reaches the file system only when you pass the object to `Set-NTFSSecurityDescriptor`. A command without `-AppliesTo` uses a `Complex` set, also when it works on a security descriptor, and a command that has `-AppliesTo` together with `-InheritanceFlags` or `-PropagationFlags` fails, because PowerShell can't choose between the sets. The same holds for an object that you pipe in: its property `AppliesTo` selects a `Simple` set, its properties `InheritanceFlags` and `PropagationFlags` select a `Complex` set, and an object that has both kinds, an object that has both `Path` and `SecurityDescriptor`, or one whose `AppliesTo` is `$null`, fails. `Import-Csv` gives `$null` for a column that a row lacks because it has fewer fields than the header. An `AppliesTo` that PowerShell can't convert to a scope, such as the blank cell of a CSV file or a misspelled name, is ignored, and the object is handled as one without `AppliesTo`: it uses its own `InheritanceFlags` and `PropagationFlags`, or the default scope if it has none. Before 5.0.0, a command that used `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or `-PropagationFlags` failed, because PowerShell couldn't choose between the two `SD` sets.</maml:para>
<maml:para>When you omit them, `-AuditFlags` is `Success, Failure`, `-InheritanceFlags` is `ContainerInherit, ObjectInherit`, `-PropagationFlags` is `None`. All parameters bind by property name, and `-Path` also binds by value and through its `FullName` alias, so you can pipe the output of `Get-NTFSAudit`, `Get-ChildItem`, `Get-ChildItem2`, and `Get-Item2` into the cmdlet. The cmdlet writes no object unless you use `-PassThru`.</maml:para> <maml:para>When you omit them, `-AuditFlags` is `Success, Failure`, `-InheritanceFlags` is `ContainerInherit, ObjectInherit`, `-PropagationFlags` is `None`. All parameters bind by property name, and `-Path` also binds by value and through its `FullName` alias, so you can pipe the output of `Get-NTFSAudit`, `Get-ChildItem`, `Get-ChildItem2`, and `Get-Item2` into the cmdlet. The cmdlet writes no object unless you use `-PassThru`.</maml:para>
</maml:description> </maml:description>
<command:syntax> <command:syntax>

3
Security2/IdentityReference2.cs

@ -195,7 +195,8 @@ namespace Security2
if (this.ntAccount != null) if (this.ntAccount != null)
{ {
if (this.ntAccount.Value.ToLower() == value.ToLower()) // Not ToLower: with the culture of the thread, tr-TR lowercases I to U+0131 and misses names such as NT AUTHORITY\SYSTEM.
if (string.Equals(this.ntAccount.Value, value, StringComparison.OrdinalIgnoreCase))
{ {
return true; return true;
} }

37
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Cmdlets.csv

@ -0,0 +1,37 @@
"Cmdlet","Class","SequenceTotal","Sequence_unit","SequencePercent_unit","Sequence_ls25","SequencePercent_ls25","Sequence_fl2","SequencePercent_fl2","Sequence_final","SequencePercent_final","Sequence_Union","SequencePercent_Union","BranchTotal","Branch_unit","Branch_ls25","Branch_fl2","Branch_final","Branch_Union"
"Add-NTFSAccess","AddAccess","72","63","87.5","63","87.5","38","52.8","67","93.1","67","93.1","12","12","12","10","12","12"
"Add-NTFSAudit","AddAudit","74","56","75.7","56","75.7","35","47.3","63","85.1","63","85.1","14","14","14","5","14","14"
"Clear-NTFSAccess","ClearAccess","50","44","88","44","88","37","74","46","92","46","92","12","12","12","9","12","12"
"Clear-NTFSAudit","ClearAudit","51","37","72.5","37","72.5","21","41.2","39","76.5","39","76.5","14","12","12","4","12","12"
"Copy-Item2","CopyItem2","65","61","93.8","61","93.8","45","69.2","62","95.4","62","95.4","20","20","20","14","20","20"
"Disable-NTFSAccessInheritance","DisableAccessInheritance","49","42","85.7","42","85.7","16","32.7","44","89.8","44","89.8","10","10","10","4","10","10"
"Disable-NTFSAuditInheritance","DisableAuditInheritance","49","36","73.5","36","73.5","19","38.8","38","77.6","38","77.6","10","10","10","4","10","10"
"Disable-Privileges","DisablePrivileges","16","15","93.8","15","93.8","10","62.5","15","93.8","15","93.8","4","4","4","2","4","4"
"Enable-NTFSAccessInheritance","EnableAccessInheritance","49","42","85.7","42","85.7","16","32.7","44","89.8","44","89.8","10","10","10","4","10","10"
"Enable-NTFSAuditInheritance","EnableAuditInheritance","49","36","73.5","36","73.5","19","38.8","38","77.6","38","77.6","10","10","10","4","10","10"
"Enable-Privileges","EnablePrivileges","20","17","85","17","85","0","0","17","85","17","85","8","8","8","0","8","8"
"Get-ChildItem2","GetChildItem2","145","132","91","132","91","88","60.7","133","91.7","133","91.7","70","69","69","38","69","69"
"Get-DiskSpace","GetDiskSpace","24","23","95.8","23","95.8","0","0","23","95.8","23","95.8","6","5","5","0","5","5"
"Get-FileHash2","GetFileHash2","58","50","86.2","50","86.2","33","56.9","50","86.2","50","86.2","10","10","10","6","10","10"
"Get-Item2","GetItem2","22","21","95.5","21","95.5","17","77.3","22","100","22","100","4","4","4","3","4","4"
"Get-NTFSAccess","GetAccess","59","52","88.1","52","88.1","28","47.5","52","88.1","52","88.1","10","10","10","5","10","10"
"Get-NTFSAudit","GetAudit","56","53","94.6","53","94.6","33","58.9","53","94.6","53","94.6","12","12","12","5","12","12"
"Get-NTFSEffectiveAccess","GetEffectiveAccess","76","61","80.3","61","80.3","38","50","63","82.9","63","82.9","20","20","20","12","20","20"
"Get-NTFSHardLink","GetHardLink","37","34","91.9","34","91.9","22","59.5","34","91.9","34","91.9","8","8","8","4","8","8"
"Get-NTFSInheritance","GetInheritance","47","38","80.9","38","80.9","20","42.6","40","85.1","40","85.1","12","11","11","5","11","11"
"Get-NTFSOrphanedAccess","GetOrphanedAccess","46","39","84.8","39","84.8","24","52.2","39","84.8","39","84.8","8","8","8","4","8","8"
"Get-NTFSOrphanedAudit","GetOrphanedAudit","41","38","92.7","38","92.7","24","58.5","38","92.7","38","92.7","10","10","10","4","10","10"
"Get-NTFSOwner","GetOwner","35","32","91.4","32","91.4","17","48.6","32","91.4","32","91.4","6","6","6","3","6","6"
"Get-NTFSSecurityDescriptor","GetSecurityDescriptor","36","28","77.8","28","77.8","15","41.7","29","80.6","29","80.6","8","6","6","3","6","6"
"Get-NTFSSimpleAccess","GetSimpleAccess","61","60","98.4","60","98.4","41","67.2","60","98.4","60","98.4","22","22","22","12","22","22"
"Get-Privileges","GetPrivileges","5","5","100","5","100","5","100","5","100","5","100","0","0","0","0","0","0"
"Move-Item2","MoveItem2","69","65","94.2","65","94.2","41","59.4","66","95.7","66","95.7","22","22","22","13","22","22"
"New-NTFSHardLink","NewHardLink","58","57","98.3","57","98.3","28","48.3","57","98.3","57","98.3","16","16","16","5","16","16"
"New-NTFSSymbolicLink","NewSymbolicLink","39","38","97.4","38","97.4","19","48.7","38","97.4","38","97.4","10","10","10","3","10","10"
"Remove-Item2","RemoveItem2","48","44","91.7","44","91.7","28","58.3","45","93.8","45","93.8","12","12","12","7","12","12"
"Remove-NTFSAccess","RemoveAccess","77","74","96.1","74","96.1","30","39","74","96.1","74","96.1","14","14","14","6","14","14"
"Remove-NTFSAudit","RemoveAudit","79","60","75.9","60","75.9","36","45.6","67","84.8","67","84.8","16","16","16","6","16","16"
"Set-NTFSInheritance","SetInheritance","88","83","94.3","83","94.3","31","35.2","87","98.9","87","98.9","30","30","30","10","30","30"
"Set-NTFSOwner","SetOwner","43","40","93","40","93","27","62.8","41","95.3","41","95.3","12","12","12","7","12","12"
"Set-NTFSSecurityDescriptor","SetSecurityDescriptor","55","54","98.2","54","98.2","39","70.9","54","98.2","54","98.2","14","14","14","9","14","14"
"Test-Path2","TestPath2","41","35","85.4","35","85.4","25","61","35","85.4","35","85.4","12","12","12","9","12","12"
1 Cmdlet Class SequenceTotal Sequence_unit SequencePercent_unit Sequence_ls25 SequencePercent_ls25 Sequence_fl2 SequencePercent_fl2 Sequence_final SequencePercent_final Sequence_Union SequencePercent_Union BranchTotal Branch_unit Branch_ls25 Branch_fl2 Branch_final Branch_Union
2 Add-NTFSAccess AddAccess 72 63 87.5 63 87.5 38 52.8 67 93.1 67 93.1 12 12 12 10 12 12
3 Add-NTFSAudit AddAudit 74 56 75.7 56 75.7 35 47.3 63 85.1 63 85.1 14 14 14 5 14 14
4 Clear-NTFSAccess ClearAccess 50 44 88 44 88 37 74 46 92 46 92 12 12 12 9 12 12
5 Clear-NTFSAudit ClearAudit 51 37 72.5 37 72.5 21 41.2 39 76.5 39 76.5 14 12 12 4 12 12
6 Copy-Item2 CopyItem2 65 61 93.8 61 93.8 45 69.2 62 95.4 62 95.4 20 20 20 14 20 20
7 Disable-NTFSAccessInheritance DisableAccessInheritance 49 42 85.7 42 85.7 16 32.7 44 89.8 44 89.8 10 10 10 4 10 10
8 Disable-NTFSAuditInheritance DisableAuditInheritance 49 36 73.5 36 73.5 19 38.8 38 77.6 38 77.6 10 10 10 4 10 10
9 Disable-Privileges DisablePrivileges 16 15 93.8 15 93.8 10 62.5 15 93.8 15 93.8 4 4 4 2 4 4
10 Enable-NTFSAccessInheritance EnableAccessInheritance 49 42 85.7 42 85.7 16 32.7 44 89.8 44 89.8 10 10 10 4 10 10
11 Enable-NTFSAuditInheritance EnableAuditInheritance 49 36 73.5 36 73.5 19 38.8 38 77.6 38 77.6 10 10 10 4 10 10
12 Enable-Privileges EnablePrivileges 20 17 85 17 85 0 0 17 85 17 85 8 8 8 0 8 8
13 Get-ChildItem2 GetChildItem2 145 132 91 132 91 88 60.7 133 91.7 133 91.7 70 69 69 38 69 69
14 Get-DiskSpace GetDiskSpace 24 23 95.8 23 95.8 0 0 23 95.8 23 95.8 6 5 5 0 5 5
15 Get-FileHash2 GetFileHash2 58 50 86.2 50 86.2 33 56.9 50 86.2 50 86.2 10 10 10 6 10 10
16 Get-Item2 GetItem2 22 21 95.5 21 95.5 17 77.3 22 100 22 100 4 4 4 3 4 4
17 Get-NTFSAccess GetAccess 59 52 88.1 52 88.1 28 47.5 52 88.1 52 88.1 10 10 10 5 10 10
18 Get-NTFSAudit GetAudit 56 53 94.6 53 94.6 33 58.9 53 94.6 53 94.6 12 12 12 5 12 12
19 Get-NTFSEffectiveAccess GetEffectiveAccess 76 61 80.3 61 80.3 38 50 63 82.9 63 82.9 20 20 20 12 20 20
20 Get-NTFSHardLink GetHardLink 37 34 91.9 34 91.9 22 59.5 34 91.9 34 91.9 8 8 8 4 8 8
21 Get-NTFSInheritance GetInheritance 47 38 80.9 38 80.9 20 42.6 40 85.1 40 85.1 12 11 11 5 11 11
22 Get-NTFSOrphanedAccess GetOrphanedAccess 46 39 84.8 39 84.8 24 52.2 39 84.8 39 84.8 8 8 8 4 8 8
23 Get-NTFSOrphanedAudit GetOrphanedAudit 41 38 92.7 38 92.7 24 58.5 38 92.7 38 92.7 10 10 10 4 10 10
24 Get-NTFSOwner GetOwner 35 32 91.4 32 91.4 17 48.6 32 91.4 32 91.4 6 6 6 3 6 6
25 Get-NTFSSecurityDescriptor GetSecurityDescriptor 36 28 77.8 28 77.8 15 41.7 29 80.6 29 80.6 8 6 6 3 6 6
26 Get-NTFSSimpleAccess GetSimpleAccess 61 60 98.4 60 98.4 41 67.2 60 98.4 60 98.4 22 22 22 12 22 22
27 Get-Privileges GetPrivileges 5 5 100 5 100 5 100 5 100 5 100 0 0 0 0 0 0
28 Move-Item2 MoveItem2 69 65 94.2 65 94.2 41 59.4 66 95.7 66 95.7 22 22 22 13 22 22
29 New-NTFSHardLink NewHardLink 58 57 98.3 57 98.3 28 48.3 57 98.3 57 98.3 16 16 16 5 16 16
30 New-NTFSSymbolicLink NewSymbolicLink 39 38 97.4 38 97.4 19 48.7 38 97.4 38 97.4 10 10 10 3 10 10
31 Remove-Item2 RemoveItem2 48 44 91.7 44 91.7 28 58.3 45 93.8 45 93.8 12 12 12 7 12 12
32 Remove-NTFSAccess RemoveAccess 77 74 96.1 74 96.1 30 39 74 96.1 74 96.1 14 14 14 6 14 14
33 Remove-NTFSAudit RemoveAudit 79 60 75.9 60 75.9 36 45.6 67 84.8 67 84.8 16 16 16 6 16 16
34 Set-NTFSInheritance SetInheritance 88 83 94.3 83 94.3 31 35.2 87 98.9 87 98.9 30 30 30 10 30 30
35 Set-NTFSOwner SetOwner 43 40 93 40 93 27 62.8 41 95.3 41 95.3 12 12 12 7 12 12
36 Set-NTFSSecurityDescriptor SetSecurityDescriptor 55 54 98.2 54 98.2 39 70.9 54 98.2 54 98.2 14 14 14 9 14 14
37 Test-Path2 TestPath2 41 35 85.4 35 85.4 25 61 35 85.4 35 85.4 12 12 12 9 12 12

5
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Cultures.csv

@ -0,0 +1,5 @@
"Culture","Edition","Elevated","Cases","Passed","Failed","Skipped","FailedTests","Judgment"
"de-DE","Windows PowerShell 5.1","True","1314","1290","0","24","","no failure"
"de-DE","PowerShell 7","True","1314","1253","6","55","Get-ChildItem2.Recursion, type filters, and depth.Should reject a null -Filter | Invoke-TestsAsBasicUser.ps1.Should refuse a title that ends with a line break | Invoke-TestsAsBasicUser.ps1.Should refuse a title with the character %, which would change the command line of cmd.exe | Invoke-TestsAsBasicUser.ps1.Should refuse a title with the character double quote, which would change the command line of cmd.exe | Invoke-TestsAsBasicUser.ps1.Should refuse a title with the character line feed, which would change the command line of cmd.exe | Invoke-TestsAsBasicUser.ps1.Should refuse a title with the character carriage return, which would change the command line of cmd.exe","assertions on the localized text of PowerShell 7 (the parameter-validation message and the refused titles); not a defect of the module"
"tr-TR","Windows PowerShell 5.1","True","1314","1290","0","24","","no failure"
"tr-TR","PowerShell 7","True","1314","1259","0","55","","no failure"
1 Culture Edition Elevated Cases Passed Failed Skipped FailedTests Judgment
2 de-DE Windows PowerShell 5.1 True 1314 1290 0 24 no failure
3 de-DE PowerShell 7 True 1314 1253 6 55 Get-ChildItem2.Recursion, type filters, and depth.Should reject a null -Filter | Invoke-TestsAsBasicUser.ps1.Should refuse a title that ends with a line break | Invoke-TestsAsBasicUser.ps1.Should refuse a title with the character %, which would change the command line of cmd.exe | Invoke-TestsAsBasicUser.ps1.Should refuse a title with the character double quote, which would change the command line of cmd.exe | Invoke-TestsAsBasicUser.ps1.Should refuse a title with the character line feed, which would change the command line of cmd.exe | Invoke-TestsAsBasicUser.ps1.Should refuse a title with the character carriage return, which would change the command line of cmd.exe assertions on the localized text of PowerShell 7 (the parameter-validation message and the refused titles); not a defect of the module
4 tr-TR Windows PowerShell 5.1 True 1314 1290 0 24 no failure
5 tr-TR PowerShell 7 True 1314 1259 0 55 no failure

1811
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Evidence.csv

File diff suppressed because it is too large

49
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-LiveRoles.csv

@ -0,0 +1,49 @@
"Run","Edition","Role","Kind","Total","VisitedByRole","VisitedByHostUnit","VisitedByRoleNotByHostUnit"
"first lab (fl2)","Desktop","Delegate","Sequence","3649","1548","3198","3"
"first lab (fl2)","Desktop","ServerAdmin","Sequence","3649","1117","3198","9"
"first lab (fl2)","Desktop","Admin","Sequence","3649","1442","3198","3"
"first lab (fl2)","Desktop","Delegate","Branch","1168","418","1090","3"
"first lab (fl2)","Desktop","ServerAdmin","Branch","1168","270","1090","3"
"first lab (fl2)","Desktop","Admin","Branch","1168","359","1090","1"
"first lab (fl2)","Core","Delegate","Sequence","3649","1548","3198","3"
"first lab (fl2)","Core","ServerAdmin","Sequence","3649","1117","3198","9"
"first lab (fl2)","Core","Admin","Sequence","3649","1442","3198","3"
"first lab (fl2)","Core","Delegate","Branch","1168","418","1090","3"
"first lab (fl2)","Core","ServerAdmin","Branch","1168","270","1090","3"
"first lab (fl2)","Core","Admin","Branch","1168","359","1090","1"
"matrix cell OSFile19","Desktop","Delegate","Sequence","3649","1548","3198","3"
"matrix cell OSFile19","Desktop","ServerAdmin","Sequence","3649","1117","3198","9"
"matrix cell OSFile19","Desktop","Admin","Sequence","3649","1392","3198","3"
"matrix cell OSFile19","Desktop","Delegate","Branch","1168","418","1090","3"
"matrix cell OSFile19","Desktop","ServerAdmin","Branch","1168","270","1090","3"
"matrix cell OSFile19","Desktop","Admin","Branch","1168","346","1090","1"
"matrix cell OSFile19","Core","Delegate","Sequence","3649","1548","3198","3"
"matrix cell OSFile19","Core","ServerAdmin","Sequence","3649","1117","3198","9"
"matrix cell OSFile19","Core","Admin","Sequence","3649","1392","3198","3"
"matrix cell OSFile19","Core","Delegate","Branch","1168","418","1090","3"
"matrix cell OSFile19","Core","ServerAdmin","Branch","1168","270","1090","3"
"matrix cell OSFile19","Core","Admin","Branch","1168","346","1090","1"
"matrix cell OSFile22","Desktop","Delegate","Sequence","3649","1548","3198","3"
"matrix cell OSFile22","Desktop","ServerAdmin","Sequence","3649","1117","3198","9"
"matrix cell OSFile22","Desktop","Admin","Sequence","3649","1392","3198","3"
"matrix cell OSFile22","Desktop","Delegate","Branch","1168","418","1090","3"
"matrix cell OSFile22","Desktop","ServerAdmin","Branch","1168","270","1090","3"
"matrix cell OSFile22","Desktop","Admin","Branch","1168","346","1090","1"
"matrix cell OSFile22","Core","Delegate","Sequence","3649","1548","3198","3"
"matrix cell OSFile22","Core","ServerAdmin","Sequence","3649","1117","3198","9"
"matrix cell OSFile22","Core","Admin","Sequence","3649","1392","3198","3"
"matrix cell OSFile22","Core","Delegate","Branch","1168","418","1090","3"
"matrix cell OSFile22","Core","ServerAdmin","Branch","1168","270","1090","3"
"matrix cell OSFile22","Core","Admin","Branch","1168","346","1090","1"
"matrix cell OSFile25","Desktop","Delegate","Sequence","3649","1548","3198","3"
"matrix cell OSFile25","Desktop","ServerAdmin","Sequence","3649","1117","3198","9"
"matrix cell OSFile25","Desktop","Admin","Sequence","3649","1392","3198","3"
"matrix cell OSFile25","Desktop","Delegate","Branch","1168","418","1090","3"
"matrix cell OSFile25","Desktop","ServerAdmin","Branch","1168","270","1090","3"
"matrix cell OSFile25","Desktop","Admin","Branch","1168","346","1090","1"
"matrix cell OSFile25","Core","Delegate","Sequence","3649","1548","3198","3"
"matrix cell OSFile25","Core","ServerAdmin","Sequence","3649","1117","3198","9"
"matrix cell OSFile25","Core","Admin","Sequence","3649","1392","3198","3"
"matrix cell OSFile25","Core","Delegate","Branch","1168","418","1090","3"
"matrix cell OSFile25","Core","ServerAdmin","Branch","1168","270","1090","3"
"matrix cell OSFile25","Core","Admin","Branch","1168","346","1090","1"
1 Run Edition Role Kind Total VisitedByRole VisitedByHostUnit VisitedByRoleNotByHostUnit
2 first lab (fl2) Desktop Delegate Sequence 3649 1548 3198 3
3 first lab (fl2) Desktop ServerAdmin Sequence 3649 1117 3198 9
4 first lab (fl2) Desktop Admin Sequence 3649 1442 3198 3
5 first lab (fl2) Desktop Delegate Branch 1168 418 1090 3
6 first lab (fl2) Desktop ServerAdmin Branch 1168 270 1090 3
7 first lab (fl2) Desktop Admin Branch 1168 359 1090 1
8 first lab (fl2) Core Delegate Sequence 3649 1548 3198 3
9 first lab (fl2) Core ServerAdmin Sequence 3649 1117 3198 9
10 first lab (fl2) Core Admin Sequence 3649 1442 3198 3
11 first lab (fl2) Core Delegate Branch 1168 418 1090 3
12 first lab (fl2) Core ServerAdmin Branch 1168 270 1090 3
13 first lab (fl2) Core Admin Branch 1168 359 1090 1
14 matrix cell OSFile19 Desktop Delegate Sequence 3649 1548 3198 3
15 matrix cell OSFile19 Desktop ServerAdmin Sequence 3649 1117 3198 9
16 matrix cell OSFile19 Desktop Admin Sequence 3649 1392 3198 3
17 matrix cell OSFile19 Desktop Delegate Branch 1168 418 1090 3
18 matrix cell OSFile19 Desktop ServerAdmin Branch 1168 270 1090 3
19 matrix cell OSFile19 Desktop Admin Branch 1168 346 1090 1
20 matrix cell OSFile19 Core Delegate Sequence 3649 1548 3198 3
21 matrix cell OSFile19 Core ServerAdmin Sequence 3649 1117 3198 9
22 matrix cell OSFile19 Core Admin Sequence 3649 1392 3198 3
23 matrix cell OSFile19 Core Delegate Branch 1168 418 1090 3
24 matrix cell OSFile19 Core ServerAdmin Branch 1168 270 1090 3
25 matrix cell OSFile19 Core Admin Branch 1168 346 1090 1
26 matrix cell OSFile22 Desktop Delegate Sequence 3649 1548 3198 3
27 matrix cell OSFile22 Desktop ServerAdmin Sequence 3649 1117 3198 9
28 matrix cell OSFile22 Desktop Admin Sequence 3649 1392 3198 3
29 matrix cell OSFile22 Desktop Delegate Branch 1168 418 1090 3
30 matrix cell OSFile22 Desktop ServerAdmin Branch 1168 270 1090 3
31 matrix cell OSFile22 Desktop Admin Branch 1168 346 1090 1
32 matrix cell OSFile22 Core Delegate Sequence 3649 1548 3198 3
33 matrix cell OSFile22 Core ServerAdmin Sequence 3649 1117 3198 9
34 matrix cell OSFile22 Core Admin Sequence 3649 1392 3198 3
35 matrix cell OSFile22 Core Delegate Branch 1168 418 1090 3
36 matrix cell OSFile22 Core ServerAdmin Branch 1168 270 1090 3
37 matrix cell OSFile22 Core Admin Branch 1168 346 1090 1
38 matrix cell OSFile25 Desktop Delegate Sequence 3649 1548 3198 3
39 matrix cell OSFile25 Desktop ServerAdmin Sequence 3649 1117 3198 9
40 matrix cell OSFile25 Desktop Admin Sequence 3649 1392 3198 3
41 matrix cell OSFile25 Desktop Delegate Branch 1168 418 1090 3
42 matrix cell OSFile25 Desktop ServerAdmin Branch 1168 270 1090 3
43 matrix cell OSFile25 Desktop Admin Branch 1168 346 1090 1
44 matrix cell OSFile25 Core Delegate Sequence 3649 1548 3198 3
45 matrix cell OSFile25 Core ServerAdmin Sequence 3649 1117 3198 9
46 matrix cell OSFile25 Core Admin Sequence 3649 1392 3198 3
47 matrix cell OSFile25 Core Delegate Branch 1168 418 1090 3
48 matrix cell OSFile25 Core ServerAdmin Branch 1168 270 1090 3
49 matrix cell OSFile25 Core Admin Branch 1168 346 1090 1

233
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Methods.csv

@ -0,0 +1,233 @@
"Assembly","Class","Method","Source","UnvisitedLines","UnvisitedSequence","UnvisitedBranches","ReachableFromCmdletInIL","CmdletCallPath","RuleId","Category","Disposition","Since5a5d58b","VisitedElsewhereSequence","UnvisitedAfterOtherSourcesSequence","VisitedByNewTestsSequence","UnvisitedAtFinalSequence","VisitedElsewhereBranches","UnvisitedAfterOtherSourcesBranches","VisitedByNewTestsBranches","UnvisitedAtFinalBranches"
"NTFSSecurity","NTFSSecurity.AddAccess","get_AccessRights()","NTFSSecurity\AccessCmdlets\AddAccess.cs","62","1","0","True","AddAccess::get_AccessRights","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAccess","get_AccessType()","NTFSSecurity\AccessCmdlets\AddAccess.cs","70","1","0","True","AddAccess::get_AccessType","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAccess","get_Account()","NTFSSecurity\AccessCmdlets\AddAccess.cs","54","1","0","True","AddAccess::get_Account","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAccess","get_AppliesTo()","NTFSSecurity\AccessCmdlets\AddAccess.cs","95","1","0","True","AddAccess::get_AppliesTo","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAccess","get_InheritanceFlags()","NTFSSecurity\AccessCmdlets\AddAccess.cs","78","1","0","True","AddAccess::get_InheritanceFlags","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAccess","get_PassThru()","NTFSSecurity\AccessCmdlets\AddAccess.cs","102","1","0","True","AddAccess::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAccess","get_Path()","NTFSSecurity\AccessCmdlets\AddAccess.cs","29","1","0","True","AddAccess::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAccess","get_PropagationFlags()","NTFSSecurity\AccessCmdlets\AddAccess.cs","86","1","0","True","AddAccess::get_PropagationFlags","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAccess","get_SecurityDescriptor()","NTFSSecurity\AccessCmdlets\AddAccess.cs","42","1","0","True","AddAccess::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","get_AccessRights()","NTFSSecurity\AuditCmdlets\AddAudit.cs","62","1","0","True","AddAudit::get_AccessRights","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","get_Account()","NTFSSecurity\AuditCmdlets\AddAudit.cs","54","1","0","True","AddAudit::get_Account","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","get_AppliesTo()","NTFSSecurity\AuditCmdlets\AddAudit.cs","94","1","0","True","AddAudit::get_AppliesTo","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","get_AuditFlags()","NTFSSecurity\AuditCmdlets\AddAudit.cs","69","1","0","True","AddAudit::get_AuditFlags","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","get_InheritanceFlags()","NTFSSecurity\AuditCmdlets\AddAudit.cs","77","1","0","True","AddAudit::get_InheritanceFlags","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","get_PassThru()","NTFSSecurity\AuditCmdlets\AddAudit.cs","101","1","0","True","AddAudit::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","get_Path()","NTFSSecurity\AuditCmdlets\AddAudit.cs","29","1","0","True","AddAudit::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","get_PropagationFlags()","NTFSSecurity\AuditCmdlets\AddAudit.cs","85","1","0","True","AddAudit::get_PropagationFlags","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","get_SecurityDescriptor()","NTFSSecurity\AuditCmdlets\AddAudit.cs","42","1","0","True","AddAudit::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit","ProcessRecord()","NTFSSecurity\AuditCmdlets\AddAudit.cs","137,141,145,146,148,149,151","7","0","True","AddAudit::ProcessRecord","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","7","0","7","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AddAudit/<>c__DisplayClass35_0","<ProcessRecord>b__0()","NTFSSecurity\AuditCmdlets\AddAudit.cs","143,144","2","0","True","AddAudit::ProcessRecord > AddAudit/<>c__DisplayClass35_0::<ProcessRecord>b__0","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.AuditCmdlets.GetOrphanedAudit","ProcessRecord()","NTFSSecurity\AuditCmdlets\Get-OrphanedAudit.cs","56,58,59","3","0","True","GetOrphanedAudit::ProcessRecord","AUDIT-READ-DENIED","environment-specific","Explained","Unchanged","0","3","0","3","0","0","0","0"
"NTFSSecurity","NTFSSecurity.BaseCmdlet","GetFileSystemInfo(String)","NTFSSecurity\BaseCmdlets.cs","166,168,170,172,174,178","6","4","False","","UNUSED-CMDLET-HELPER","unused by cmdlets","Explained","Unchanged","0","6","0","6","0","4","0","4"
"NTFSSecurity","NTFSSecurity.BaseCmdlet","GetRelativePath(String)","NTFSSecurity\BaseCmdlets.cs","229,231","1","1","True","CopyItem2::BeginProcessing > BaseCmdlet::GetRelativePath","RELATIVE-PATH-EMPTY","defensive","Explained","Unchanged","0","1","0","1","0","1","0","1"
"NTFSSecurity","NTFSSecurity.BaseCmdlet","ProcessRecord()","NTFSSecurity\BaseCmdlets.cs","145,146","2","0","True","BaseCmdlet::ProcessRecord","UNUSED-CMDLET-HELPER","unused by cmdlets","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.BaseCmdletWithPrivControl","DisableEnabledPrivileges(Dictionary`2<String,Exception>)","NTFSSecurity\BaseCmdlets.cs","422,424,425","3","0","True","BaseCmdletWithPrivControl::Dispose > BaseCmdletWithPrivControl::DisableEnabledPrivileges","PRIVILEGE-DISABLE-FAILURE","defensive","Explained","Unchanged","0","3","0","3","0","0","0","0"
"NTFSSecurity","NTFSSecurity.BaseCmdletWithPrivControl","DisableFileSystemPrivileges()","NTFSSecurity\BaseCmdlets.cs","544,545","1","1","True","DisablePrivileges::ProcessRecord > BaseCmdletWithPrivControl::DisableFileSystemPrivileges","PRIVILEGE-DISABLE-FAILURE","defensive","Explained","Unchanged","0","1","0","1","0","1","0","1"
"NTFSSecurity","NTFSSecurity.BaseCmdletWithPrivControl","EndProcessing()","NTFSSecurity\BaseCmdlets.cs","389,391,392","3","1","True","BaseCmdletWithPrivControl::EndProcessing","PRIVILEGE-DISABLE-FAILURE","defensive","Explained","Unchanged","0","3","0","3","0","1","0","1"
"NTFSSecurity","NTFSSecurity.BaseCmdletWithPrivControl","TryDisablePrivilege(ProcessPrivileges.Privilege)","NTFSSecurity\BaseCmdlets.cs","490,492,493","3","0","True","DisablePrivileges::ProcessRecord > BaseCmdletWithPrivControl::DisableFileSystemPrivileges > BaseCmdletWithPrivControl::TryDisablePrivilege","PRIVILEGE-DISABLE-FAILURE","defensive","Explained","Unchanged","0","3","0","3","0","0","0","0"
"NTFSSecurity","NTFSSecurity.ClearAccess","get_DisableInheritance()","NTFSSecurity\AccessCmdlets\ClearAccess.cs","42","1","0","True","ClearAccess::get_DisableInheritance","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.ClearAccess","get_Path()","NTFSSecurity\AccessCmdlets\ClearAccess.cs","19","1","0","True","ClearAccess::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.ClearAccess","get_SecurityDescriptor()","NTFSSecurity\AccessCmdlets\ClearAccess.cs","31","1","0","True","ClearAccess::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.ClearAccess","ProcessRecord()","NTFSSecurity\AccessCmdlets\ClearAccess.cs","92,94,95","3","0","True","ClearAccess::ProcessRecord","ACCESS-GENERIC-CATCH","defensive","Explained","Unchanged","0","3","0","3","0","0","0","0"
"NTFSSecurity","NTFSSecurity.ClearAudit","get_DisableInheritance()","NTFSSecurity\AuditCmdlets\ClearAudit.cs","42","1","0","True","ClearAudit::get_DisableInheritance","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.ClearAudit","get_Path()","NTFSSecurity\AuditCmdlets\ClearAudit.cs","19","1","0","True","ClearAudit::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.ClearAudit","get_SecurityDescriptor()","NTFSSecurity\AuditCmdlets\ClearAudit.cs","31","1","0","True","ClearAudit::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.ClearAudit","ProcessRecord()","NTFSSecurity\AuditCmdlets\ClearAudit.cs","76,80,86,87,89,90,91","7","0","True","ClearAudit::ProcessRecord","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","7","0","7","0","0","0","0"
"NTFSSecurity","NTFSSecurity.ClearAudit/<>c__DisplayClass11_0","<ProcessRecord>b__0()","NTFSSecurity\AuditCmdlets\ClearAudit.cs","82,83,84,85","4","2","True","ClearAudit::ProcessRecord > ClearAudit/<>c__DisplayClass11_0::<ProcessRecord>b__0","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","4","0","4","0","2","0","2"
"NTFSSecurity","NTFSSecurity.CopyItem2","get_Destination()","NTFSSecurity\ItemCmdlets\CopyItem2.cs","33","1","0","True","CopyItem2::get_Destination","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.CopyItem2","get_Force()","NTFSSecurity\ItemCmdlets\CopyItem2.cs","40","1","0","True","CopyItem2::get_Force","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.CopyItem2","get_PassThru()","NTFSSecurity\ItemCmdlets\CopyItem2.cs","47","1","0","True","CopyItem2::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.CopyItem2","get_Path()","NTFSSecurity\ItemCmdlets\CopyItem2.cs","21","1","0","True","CopyItem2::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","get_PassThru()","NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs","51","1","0","True","DisableAccessInheritance::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","get_Path()","NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs","21","1","0","True","DisableAccessInheritance::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","get_RemoveInheritedAccessRules()","NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs","44","1","0","True","DisableAccessInheritance::get_RemoveInheritedAccessRules","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","get_SecurityDescriptor()","NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs","33","1","0","True","DisableAccessInheritance::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","ProcessRecord()","NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs","97,99,100","3","0","True","DisableAccessInheritance::ProcessRecord","ACCESS-GENERIC-CATCH","defensive","Explained","Unchanged","0","3","0","3","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","get_PassThru()","NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs","57","1","0","True","DisableAuditInheritance::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","get_Path()","NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs","22","1","0","True","DisableAuditInheritance::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","get_RemoveInheritedAuditRules()","NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs","50","1","0","True","DisableAuditInheritance::get_RemoveInheritedAuditRules","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","get_SecurityDescriptor()","NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs","34","1","0","True","DisableAuditInheritance::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","ProcessRecord()","NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs","88,92,96,97,99,100,102","7","0","True","DisableAuditInheritance::ProcessRecord","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","7","0","7","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance/<>c__DisplayClass15_0","<ProcessRecord>b__0()","NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs","94,95","2","0","True","DisableAuditInheritance::ProcessRecord > DisableAuditInheritance/<>c__DisplayClass15_0::<ProcessRecord>b__0","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.DisablePrivileges","get_PassThru()","NTFSSecurity\OtherCmdlets.cs","83","1","0","True","DisablePrivileges::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","get_PassThru()","NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs","44","1","0","True","EnableAccessInheritance::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","get_Path()","NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs","21","1","0","True","EnableAccessInheritance::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","get_RemoveExplicitAccessRules()","NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs","51","1","0","True","EnableAccessInheritance::get_RemoveExplicitAccessRules","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","get_SecurityDescriptor()","NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs","33","1","0","True","EnableAccessInheritance::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","ProcessRecord()","NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs","97,99,100","3","0","True","EnableAccessInheritance::ProcessRecord","ACCESS-GENERIC-CATCH","defensive","Explained","Unchanged","0","3","0","3","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","get_PassThru()","NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs","44","1","0","True","EnableAuditInheritance::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","get_Path()","NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs","21","1","0","True","EnableAuditInheritance::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","get_RemoveExplicitAuditRules()","NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs","56","1","0","True","EnableAuditInheritance::get_RemoveExplicitAuditRules","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","get_SecurityDescriptor()","NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs","33","1","0","True","EnableAuditInheritance::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","ProcessRecord()","NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs","87,91,95,96,98,99,101","7","0","True","EnableAuditInheritance::ProcessRecord","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","7","0","7","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance/<>c__DisplayClass15_0","<ProcessRecord>b__0()","NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs","93,94","2","0","True","EnableAuditInheritance::ProcessRecord > EnableAuditInheritance/<>c__DisplayClass15_0::<ProcessRecord>b__0","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnablePrivileges","get_PassThru()","NTFSSecurity\OtherCmdlets.cs","21","1","0","True","EnablePrivileges::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.EnablePrivileges","ProcessRecord()","NTFSSecurity\OtherCmdlets.cs","39,41","2","0","True","EnablePrivileges::ProcessRecord","ENABLEPRIVILEGES-INIT","defensive","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.FileSystemCodeMembers","Mode(Management.Automation.PSObject)","NTFSSecurity\CodeMembers.cs","15,17","1","1","False","","CODEMEMBERS-NULL-BASE","defensive","Explained","Unchanged","0","1","0","1","0","1","0","1"
"NTFSSecurity","NTFSSecurity.GetAccess","ProcessRecord()","NTFSSecurity\AccessCmdlets\GetAccess.cs","112,118,119,121,122","5","0","True","GetAccess::ProcessRecord","ACCESS-GENERIC-CATCH","defensive","Explained","Unchanged","0","5","0","5","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetAccess/<>c__DisplayClass20_0","<ProcessRecord>b__0()","NTFSSecurity\AccessCmdlets\GetAccess.cs","110,111","2","0","True","GetAccess::ProcessRecord > GetAccess/<>c__DisplayClass20_0::<ProcessRecord>b__0","READ-RETRY-CLOSURE","defensive","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetAudit","ProcessRecord()","NTFSSecurity\AuditCmdlets\GetAudit.cs","104,107,108","3","0","True","GetAudit::ProcessRecord","AUDIT-READ-DENIED","environment-specific","Explained","Unchanged","0","3","0","3","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_Attributes()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","79","1","0","True","GetChildItem2::get_Attributes","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_Depth()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","128","1","0","True","GetChildItem2::get_Depth","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_Directory()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","65","1","0","True","GetChildItem2::get_Directory","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_File()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","72","1","0","True","GetChildItem2::get_File","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_Filter()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","51","1","0","True","GetChildItem2::get_Filter","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_Force()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","107","1","0","True","GetChildItem2::get_Force","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_Hidden()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","86","1","0","True","GetChildItem2::get_Hidden","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_Path()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","39","1","0","True","GetChildItem2::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_ReadOnly()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","100","1","0","True","GetChildItem2::get_ReadOnly","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_Recurse()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","58","1","0","True","GetChildItem2::get_Recurse","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_SkipMountPoints()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","114","1","0","True","GetChildItem2::get_SkipMountPoints","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_SkipSymbolicLinks()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","121","1","0","True","GetChildItem2::get_SkipSymbolicLinks","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","get_System()","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","93","1","0","True","GetChildItem2::get_System","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetChildItem2","WriteFileSystem(FileSystemInfo,Int32)","NTFSSecurity\ItemCmdlets\GetChildItem2.cs","205","0","1","True","GetChildItem2::ProcessRecord > GetChildItem2::WriteFileSystem","CHILDITEM2-NON-FOLDER","defensive","Explained","Unchanged","0","0","0","0","0","1","0","1"
"NTFSSecurity","NTFSSecurity.GetDiskSpace","get_DriveLetter()","NTFSSecurity\ItemCmdlets\GetDiskSpace.cs","18","1","0","True","GetDiskSpace::get_DriveLetter","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetDiskSpace","ProcessRecord()","NTFSSecurity\ItemCmdlets\GetDiskSpace.cs","52","0","1","True","GetDiskSpace::ProcessRecord","DISKSPACE-EMPTY-VOLUME","environment-specific","Explained","Unchanged","0","0","0","0","0","1","0","1"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","get_Account()","NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs","51","1","0","True","GetEffectiveAccess::get_Account","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","get_ExcludeNoneAccessEntries()","NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs","65","1","0","True","GetEffectiveAccess::get_ExcludeNoneAccessEntries","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","get_Path()","NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs","26","1","0","True","GetEffectiveAccess::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","get_SecurityDescriptor()","NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs","38","1","0","True","GetEffectiveAccess::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","get_ServerName()","NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs","58","1","0","True","GetEffectiveAccess::get_ServerName","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","ProcessRecord()","NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs","99,101,102,141,147,148,150,151","8","0","True","GetEffectiveAccess::ProcessRecord","EFFECTIVE-ACCESS-CATCH","defensive","Explained","Unchanged","0","8","0","8","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess/<>c__DisplayClass20_0","<ProcessRecord>b__0()","NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs","139,140","2","0","True","GetEffectiveAccess::ProcessRecord > GetEffectiveAccess/<>c__DisplayClass20_0::<ProcessRecord>b__0","EFFECTIVE-ACCESS-CATCH","defensive","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetFileHash2","get_Algorithm()","NTFSSecurity\MiscCmdlets\GetFileHash2.cs","33","1","0","True","GetFileHash2::get_Algorithm","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetFileHash2","ProcessRecord()","NTFSSecurity\MiscCmdlets\GetFileHash2.cs","51,52,55,56,103,109","6","0","True","GetFileHash2::ProcessRecord","HASH-POLICY-AND-RETRY","environment-specific","Explained","Unchanged","0","6","0","6","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetFileHash2/<>c__DisplayClass9_0","<ProcessRecord>b__0()","NTFSSecurity\MiscCmdlets\GetFileHash2.cs","102","1","0","True","GetFileHash2::ProcessRecord > GetFileHash2/<>c__DisplayClass9_0::<ProcessRecord>b__0","HASH-POLICY-AND-RETRY","environment-specific","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetHardLink","ProcessRecord()","NTFSSecurity\LinkCmdlets\GetHardLink.cs","77,79,80","3","0","True","GetHardLink::ProcessRecord","HARDLINK-DENIED","environment-specific","Explained","Unchanged","0","3","0","3","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetInheritance","get_Path()","NTFSSecurity\InheritanceCmdlets\GetInheritance.cs","19","1","0","True","GetInheritance::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetInheritance","get_SecurityDescriptor()","NTFSSecurity\InheritanceCmdlets\GetInheritance.cs","31","1","0","True","GetInheritance::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetInheritance","ProcessRecord()","NTFSSecurity\InheritanceCmdlets\GetInheritance.cs","80,86,87,89,90,107","5","1","True","GetInheritance::ProcessRecord","ACCESS-GENERIC-CATCH","defensive","Explained","Unchanged","0","5","0","5","0","1","0","1"
"NTFSSecurity","NTFSSecurity.GetInheritance/<>c__DisplayClass7_0","<ProcessRecord>b__0()","NTFSSecurity\InheritanceCmdlets\GetInheritance.cs","78,79","2","0","True","GetInheritance::ProcessRecord > GetInheritance/<>c__DisplayClass7_0::<ProcessRecord>b__0","READ-RETRY-CLOSURE","defensive","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetItem2","get_Path()","NTFSSecurity\ItemCmdlets\GetItem2.cs","19","1","0","True","GetItem2::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetOrphanedAccess","ProcessRecord()","NTFSSecurity\AccessCmdlets\GetOrphanedAccess.cs","55,62,63,65,66","5","0","True","GetOrphanedAccess::ProcessRecord","ACCESS-GENERIC-CATCH","defensive","Explained","Unchanged","0","5","0","5","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetOrphanedAccess/<>c__DisplayClass1_0","<ProcessRecord>b__0()","NTFSSecurity\AccessCmdlets\GetOrphanedAccess.cs","53,54","2","0","True","GetOrphanedAccess::ProcessRecord > GetOrphanedAccess/<>c__DisplayClass1_0::<ProcessRecord>b__0","READ-RETRY-CLOSURE","defensive","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetSecurityDescriptor","get_Path()","NTFSSecurity\SecurityDescriptorCmdlets\GetSecurityDescriptor.cs","18","1","0","True","GetSecurityDescriptor::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetSecurityDescriptor","ProcessRecord()","NTFSSecurity\SecurityDescriptorCmdlets\GetSecurityDescriptor.cs","64,67,69,75,78,83,84","5","2","True","GetSecurityDescriptor::ProcessRecord","ACCESS-GENERIC-CATCH","defensive","Explained","Unchanged","0","5","0","5","0","2","0","2"
"NTFSSecurity","NTFSSecurity.GetSecurityDescriptor/<>c__DisplayClass4_0","<ProcessRecord>b__0()","NTFSSecurity\SecurityDescriptorCmdlets\GetSecurityDescriptor.cs","62,63","2","0","True","GetSecurityDescriptor::ProcessRecord > GetSecurityDescriptor/<>c__DisplayClass4_0::<ProcessRecord>b__0","READ-RETRY-CLOSURE","defensive","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.GetSimpleAccess","get_IncludeRootFolder()","NTFSSecurity\SimpleAccessCmdlets\SimpleAccessCmdlets.cs","24","1","0","True","GetSimpleAccess::get_IncludeRootFolder","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.MoveItem2","get_Destination()","NTFSSecurity\ItemCmdlets\MoveItem2.cs","33","1","0","True","MoveItem2::get_Destination","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.MoveItem2","get_Force()","NTFSSecurity\ItemCmdlets\MoveItem2.cs","40","1","0","True","MoveItem2::get_Force","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.MoveItem2","get_PassThru()","NTFSSecurity\ItemCmdlets\MoveItem2.cs","47","1","0","True","MoveItem2::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.MoveItem2","get_Path()","NTFSSecurity\ItemCmdlets\MoveItem2.cs","21","1","0","True","MoveItem2::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.NewHardLink","get_PassThru()","NTFSSecurity\LinkCmdlets\NewHardLink.cs","47","1","0","True","NewHardLink::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.NewSymbolicLink","get_PassThru()","NTFSSecurity\LinkCmdlets\NewSymbolicLink.cs","45","1","0","True","NewSymbolicLink::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.OwnerCmdlets.GetOwner","ProcessRecord()","NTFSSecurity\OwnerCmdlets\GetOwner.cs","72,74,75","3","0","True","GetOwner::ProcessRecord","ACCESS-GENERIC-CATCH","defensive","Explained","Unchanged","0","3","0","3","0","0","0","0"
"NTFSSecurity","NTFSSecurity.Properties.Resources",".ctor()","NTFSSecurity\Properties\Resources.Designer.cs","32,33","2","0","False","","GENERATED-RESOURCES","unused by cmdlets","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.Properties.Resources","get_ContainerIcon()","NTFSSecurity\Properties\Resources.Designer.cs","68","1","0","False","","GENERATED-RESOURCES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.Properties.Resources","get_Culture()","NTFSSecurity\Properties\Resources.Designer.cs","56","1","0","False","","GENERATED-RESOURCES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.Properties.Resources","get_IconContainer()","NTFSSecurity\Properties\Resources.Designer.cs","77,78","2","0","False","","GENERATED-RESOURCES","unused by cmdlets","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.Properties.Resources","get_ResourceManager()","NTFSSecurity\Properties\Resources.Designer.cs","41,42,43,45","4","2","False","","GENERATED-RESOURCES","unused by cmdlets","Explained","Unchanged","0","4","0","4","0","2","0","2"
"NTFSSecurity","NTFSSecurity.Properties.Resources","set_Culture(Globalization.CultureInfo)","NTFSSecurity\Properties\Resources.Designer.cs","59,60","2","0","False","","GENERATED-RESOURCES","unused by cmdlets","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAccess","get_AppliesTo()","NTFSSecurity\AccessCmdlets\RemoveAccess.cs","96","1","0","True","RemoveAccess::get_AppliesTo","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAccess","get_PassThru()","NTFSSecurity\AccessCmdlets\RemoveAccess.cs","113","1","0","True","RemoveAccess::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAccess","get_RemoveSpecific()","NTFSSecurity\AccessCmdlets\RemoveAccess.cs","106","1","0","True","RemoveAccess::get_RemoveSpecific","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_AccessRights()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","63","1","0","True","RemoveAudit::get_AccessRights","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_Account()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","55","1","0","True","RemoveAudit::get_Account","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_AppliesTo()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","95","1","0","True","RemoveAudit::get_AppliesTo","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_AuditFlags()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","70","1","0","True","RemoveAudit::get_AuditFlags","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_InheritanceFlags()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","78","1","0","True","RemoveAudit::get_InheritanceFlags","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_PassThru()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","112","1","0","True","RemoveAudit::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_Path()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","30","1","0","True","RemoveAudit::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_PropagationFlags()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","86","1","0","True","RemoveAudit::get_PropagationFlags","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_RemoveSpecific()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","105","1","0","True","RemoveAudit::get_RemoveSpecific","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","get_SecurityDescriptor()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","43","1","0","True","RemoveAudit::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit","ProcessRecord()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","153,157,161,162,164,165,167","7","0","True","RemoveAudit::ProcessRecord","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","7","0","7","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveAudit/<>c__DisplayClass39_0","<ProcessRecord>b__0()","NTFSSecurity\AuditCmdlets\RemoveAudit.cs","159,160","2","0","True","RemoveAudit::ProcessRecord > RemoveAudit/<>c__DisplayClass39_0::<ProcessRecord>b__0","AUDIT-OWNER-RETRY","environment-specific","Explained","Unchanged","0","2","0","2","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveItem2","get_Force()","NTFSSecurity\ItemCmdlets\RemoveItem2.cs","32","1","0","True","RemoveItem2::get_Force","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveItem2","get_PassThru()","NTFSSecurity\ItemCmdlets\RemoveItem2.cs","48","1","0","True","RemoveItem2::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveItem2","get_Path()","NTFSSecurity\ItemCmdlets\RemoveItem2.cs","21","1","0","True","RemoveItem2::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.RemoveItem2","get_Recurse()","NTFSSecurity\ItemCmdlets\RemoveItem2.cs","39","1","0","True","RemoveItem2::get_Recurse","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.SetInheritance","get_AccessInheritanceEnabled()","NTFSSecurity\InheritanceCmdlets\SetInheritance.cs","45","1","0","True","SetInheritance::get_AccessInheritanceEnabled","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.SetInheritance","get_AuditInheritanceEnabled()","NTFSSecurity\InheritanceCmdlets\SetInheritance.cs","52","1","0","True","SetInheritance::get_AuditInheritanceEnabled","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.SetInheritance","get_PassThru()","NTFSSecurity\InheritanceCmdlets\SetInheritance.cs","59","1","0","True","SetInheritance::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.SetInheritance","get_Path()","NTFSSecurity\InheritanceCmdlets\SetInheritance.cs","22","1","0","True","SetInheritance::get_Path","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.SetInheritance","get_SecurityDescriptor()","NTFSSecurity\InheritanceCmdlets\SetInheritance.cs","34","1","0","True","SetInheritance::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.SetOwner","get_Account()","NTFSSecurity\OwnerCmdlets\SetOwner.cs","44","1","0","True","SetOwner::get_Account","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.SetOwner","get_PassThru()","NTFSSecurity\OwnerCmdlets\SetOwner.cs","51","1","0","True","SetOwner::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.SetOwner","get_SecurityDescriptor()","NTFSSecurity\OwnerCmdlets\SetOwner.cs","33","1","0","True","SetOwner::get_SecurityDescriptor","CMDLET-GETTER-PIPELINE","parameter/API surface","Open","Unchanged","0","1","1","0","0","0","0","0"
"NTFSSecurity","NTFSSecurity.SetSecurityDescriptor","get_PassThru()","NTFSSecurity\SecurityDescriptorCmdlets\SetSecurityDescriptor.cs","28","1","0","True","SetSecurityDescriptor::get_PassThru","CMDLET-GETTER","parameter/API surface","Explained","Unchanged","0","1","0","1","0","0","0","0"
"NTFSSecurity","NTFSSecurity.TestPath2","ProcessRecord()","NTFSSecurity\PathCmdlets\TestPath2.cs","53,55,56,65,67,68","6","0","True","TestPath2::ProcessRecord","TESTPATH-DEAD-CATCH","defensive","Explained","Unchanged","0","6","0","6","0","0","0","0"
"PrivilegeControl","Security2.PrivilegeControl","DisablePrivilege(ProcessPrivileges.Privilege)","PrivilegeControl\PrivilegeControl.cs","61,67","1","1","True","BaseCmdletWithPrivControl::Dispose > BaseCmdletWithPrivControl::DisableEnabledPrivileges > BaseCmdletWithPrivControl::DisablePrivilege > PrivilegeControl::DisablePrivilege","PRIVILEGECONTROL-DEAD-ELSE","defensive","Explained","Unchanged","0","1","0","1","0","1","0","1"
"PrivilegeControl","Security2.PrivilegeControl","EnablePrivilege(ProcessPrivileges.Privilege)","PrivilegeControl\PrivilegeControl.cs","40,46","1","1","True","BaseCmdletWithPrivControl::BeginProcessing > BaseCmdletWithPrivControl::EnableFileSystemPrivileges > BaseCmdletWithPrivControl::TryEnablePrivilege > BaseCmdletWithPrivControl::EnablePrivilege > PrivilegeControl::EnablePrivilege","PRIVILEGECONTROL-DEAD-ELSE","defensive","Explained","Unchanged","0","1","0","1","0","1","0","1"
"ProcessPrivileges","ProcessPrivileges.AccessTokenHandle",".ctor(ProcessPrivileges.ProcessHandle,ProcessPrivileges.TokenAccessRights)","ProcessPrivileges\AccessTokenHandle.cs","21,23","1","1","True","DisablePrivileges::ProcessRecord > PrivilegeControl::GetPrivileges > ProcessExtensions::GetPrivileges > AccessTokenHandle::.ctor","TOKEN-NATIVE-FAILURE","environment-specific","Explained","Unchanged","0","1","0","1","0","1","0","1"
"ProcessPrivileges","ProcessPrivileges.AccessTokenHandle","ReleaseHandle()","ProcessPrivileges\AccessTokenHandle.cs","32,34","1","1","False","","TOKEN-NATIVE-FAILURE","environment-specific","Explained","Unchanged","0","1","0","1","0","1","0","1"
"ProcessPrivileges","ProcessPrivileges.AllocatedMemory","Finalize()","ProcessPrivileges\AllocatedMemory.cs","28,29","3","0","False","","ALLOCATED-MEMORY-FINALIZER","defensive","Explained","Unchanged","0","3","0","3","0","0","0","0"
"ProcessPrivileges","ProcessPrivileges.AllocatedMemory","InternalDispose()","ProcessPrivileges\AllocatedMemory.cs","47","0","1","False","","ALLOCATED-MEMORY-FINALIZER","defensive","Explained","Unchanged","0","0","0","0","0","1","0","1"
"ProcessPrivileges","ProcessPrivileges.PrivilegeEnabler","EnablePrivilege(ProcessPrivileges.Privilege)","ProcessPrivileges\PrivilegeEnabler.cs","172","0","1","False","","PRIVILEGE-ENABLER-RACE","defensive","Explained","Unchanged","0","0","0","0","0","1","0","1"
"ProcessPrivileges","ProcessPrivileges.Privileges","GetLuid(ProcessPrivileges.Privilege)","ProcessPrivileges\Privileges.cs","236,238","1","1","True","BaseCmdletWithPrivControl::Dispose > BaseCmdletWithPrivControl::DisableEnabledPrivileges > BaseCmdletWithPrivControl::DisablePrivilege > PrivilegeControl::DisablePrivilege > ProcessExtensions::GetPrivilegeState > ProcessExtensions::GetPrivilegeAttributes > Privileges::GetPrivilegeAttributes > Privileges::GetLuid","TOKEN-NATIVE-FAILURE","environment-specific","Explained","Unchanged","0","1","0","1","0","1","0","1"
"ProcessPrivileges","ProcessPrivileges.Privileges","GetPrivilegeName(ProcessPrivileges.Luid)","ProcessPrivileges\Privileges.cs","249,251,255,257,261,263","3","3","True","DisablePrivileges::ProcessRecord > PrivilegeControl::GetPrivileges > ProcessExtensions::GetPrivileges > Privileges::GetPrivileges > Privileges::GetPrivilegeName","TOKEN-NATIVE-FAILURE","environment-specific","Explained","Unchanged","0","3","0","3","0","3","0","3"
"ProcessPrivileges","ProcessPrivileges.Privileges","GetTokenPrivileges(ProcessPrivileges.AccessTokenHandle)","ProcessPrivileges\Privileges.cs","273,280,294,301","2","2","True","DisablePrivileges::ProcessRecord > PrivilegeControl::GetPrivileges > ProcessExtensions::GetPrivileges > Privileges::GetPrivileges > Privileges::GetTokenPrivileges","TOKEN-NATIVE-FAILURE","environment-specific","Explained","Unchanged","0","2","0","2","0","2","0","2"
"ProcessPrivileges","ProcessPrivileges.ProcessHandle","ReleaseHandle()","ProcessPrivileges\ProcessHandle.cs","27,29,32","3","2","False","","TOKEN-NATIVE-FAILURE","environment-specific","Explained","Unchanged","0","3","0","3","0","2","0","2"
"Security2","Security2.FileSystemAccessRule2","RemoveFileSystemAccessRuleAll(FileSystemSecurity2,List`1<IdentityReference2>)","Security2\FileSystem\FileSystemAccessRule2 Class\FileSystemAccessRule2.RemoveFileSystemAccessRulesAll.cs","15,17","1","1","True","ClearAccess::ProcessRecord > FileSystemAccessRule2::RemoveFileSystemAccessRuleAll","REMOVEALL-ACCOUNT-FILTER","unused by cmdlets","Open","Unchanged","0","1","0","1","0","1","0","1"
"Security2","Security2.FileSystemAccessRule2/<>c__DisplayClass36_0","<RemoveFileSystemAccessRuleAll>b__0(FileSystemAccessRule)","Security2\FileSystem\FileSystemAccessRule2 Class\FileSystemAccessRule2.RemoveFileSystemAccessRulesAll.cs","17","1","0","True","ClearAccess::ProcessRecord > FileSystemAccessRule2::RemoveFileSystemAccessRuleAll > FileSystemAccessRule2/<>c__DisplayClass36_0::<RemoveFileSystemAccessRuleAll>b__0","REMOVEALL-ACCOUNT-FILTER","unused by cmdlets","Open","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.FileSystemAccessRule2/<>c__DisplayClass36_1","<RemoveFileSystemAccessRuleAll>b__1(IdentityReference2)","Security2\FileSystem\FileSystemAccessRule2 Class\FileSystemAccessRule2.RemoveFileSystemAccessRulesAll.cs","17","1","0","True","ClearAccess::ProcessRecord > FileSystemAccessRule2::RemoveFileSystemAccessRuleAll > FileSystemAccessRule2/<>c__DisplayClass36_0::<RemoveFileSystemAccessRuleAll>b__0 > FileSystemAccessRule2/<>c__DisplayClass36_1::<RemoveFileSystemAccessRuleAll>b__1","REMOVEALL-ACCOUNT-FILTER","unused by cmdlets","Open","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.FileSystemAuditRule2","GetFileSystemAuditRules(FileSystemSecurity2,Boolean,Boolean,Boolean)","Security2\FileSystem\FileSystemAuditRule2 Class\FileSystemAuditRule2.GetFileSystemAuditRules.cs","44","0","1","True","AddAudit::ProcessRecord > FileSystemAuditRule2::GetFileSystemAuditRules","INHERITED-FROM-EMPTY-LIST","defensive","Explained","Unchanged","0","0","0","0","0","1","0","1"
"Security2","Security2.FileSystemAuditRule2","RemoveFileSystemAuditRuleAll(FileSystemSecurity2,List`1<IdentityReference2>)","Security2\FileSystem\FileSystemAuditRule2 Class\FileSystemAuditRule2.RemoveFileSystemAuditRuleAll.cs","15,17","1","1","True","ClearAudit::ProcessRecord > FileSystemAuditRule2::RemoveFileSystemAuditRuleAll","REMOVEALL-ACCOUNT-FILTER","unused by cmdlets","Open","Unchanged","0","1","0","1","0","1","0","1"
"Security2","Security2.FileSystemAuditRule2/<>c__DisplayClass7_0","<RemoveFileSystemAuditRuleAll>b__0(FileSystemAuditRule)","Security2\FileSystem\FileSystemAuditRule2 Class\FileSystemAuditRule2.RemoveFileSystemAuditRuleAll.cs","17","1","0","True","ClearAudit::ProcessRecord > FileSystemAuditRule2::RemoveFileSystemAuditRuleAll > FileSystemAuditRule2/<>c__DisplayClass7_0::<RemoveFileSystemAuditRuleAll>b__0","REMOVEALL-ACCOUNT-FILTER","unused by cmdlets","Open","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.FileSystemAuditRule2/<>c__DisplayClass7_1","<RemoveFileSystemAuditRuleAll>b__1(IdentityReference2)","Security2\FileSystem\FileSystemAuditRule2 Class\FileSystemAuditRule2.RemoveFileSystemAuditRuleAll.cs","17","1","0","True","ClearAudit::ProcessRecord > FileSystemAuditRule2::RemoveFileSystemAuditRuleAll > FileSystemAuditRule2/<>c__DisplayClass7_0::<RemoveFileSystemAuditRuleAll>b__0 > FileSystemAuditRule2/<>c__DisplayClass7_1::<RemoveFileSystemAuditRuleAll>b__1","REMOVEALL-ACCOUNT-FILTER","unused by cmdlets","Open","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.FileSystemSecurity2",".ctor(FileSystemInfo)","Security2\FileSystem\FileSystemSecurity2.cs","62,63","2","0","True","GetSecurityDescriptor::ProcessRecord > FileSystemSecurity2::.ctor","FSSEC2-CONSTRUCTOR-FALLBACK","environment-specific","Explained","Unchanged","0","2","0","2","0","0","0","0"
"Security2","Security2.FileSystemSecurity2","GetHashCode()","Security2\FileSystem\FileSystemSecurity2.cs","275","0","1","False","","FSSEC2-HASHCODE-NULL","defensive","Explained","Moved","0","0","0","0","0","1","0","1"
"Security2","Security2.FileSystemSecurity2","op_Implicit(DirectorySecurity)","Security2\FileSystem\FileSystemSecurity2.cs","262","1","0","False","","FILESECURITY-CONVERSION","unused by cmdlets","Open","Moved","0","1","0","1","0","0","0","0"
"Security2","Security2.FileSystemSecurity2","op_Implicit(FileSecurity)","Security2\FileSystem\FileSystemSecurity2.cs","253","1","0","False","","FILESECURITY-CONVERSION","unused by cmdlets","Open","Moved","0","1","0","1","0","0","0","0"
"Security2","Security2.FileSystemSecurity2","TryGetDriveRoot(FileSystemInfo,String&)","Security2\FileSystem\FileSystemSecurity2.cs","130","0","1","True","DisableAccessInheritance::ProcessRecord > FileSystemInheritanceInfo::GetFileSystemInheritanceInfo > FileSystemSecurity2::GetSecurity > FileSystemSecurity2::TryGetDriveRoot","FSSEC2-DRIVE-LETTER-CHARS","defensive","Explained","Moved","0","0","0","0","0","1","0","1"
"Security2","Security2.IdentityReference2",".ctor(Security.Principal.IdentityReference)","Security2\IdentityReference2.cs","49","0","1","True","AddAccess::ProcessRecord > BaseCmdlet::InvokeAsOwner > IdentityReference2::op_Implicit > IdentityReference2::.ctor","IDENTITY-NULL-REFERENCE","defensive","Explained","Unchanged","0","0","0","0","0","1","0","1"
"Security2","Security2.IntPtrExtensions","Increment(IntPtr)","Security2\Extensions.cs","15","1","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2",".ctor(RegistryAccessRule)","Security2\Registry\RegistrySecurity.cs","140,142,143","3","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","3","0","3","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","Dispose()","Security2\Registry\RegistrySecurity.cs","180","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","Equals(Object)","Security2\Registry\RegistrySecurity.cs","166","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","get_AccessControlType()","Security2\Registry\RegistrySecurity.cs","146","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","get_IdentityReference()","Security2\Registry\RegistrySecurity.cs","148","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","get_InheritanceFlags()","Security2\Registry\RegistrySecurity.cs","149","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","get_IsInherited()","Security2\Registry\RegistrySecurity.cs","150","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","get_Name()","Security2\Registry\RegistrySecurity.cs","117,119,121,122,126,131","6","4","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","6","0","6","0","4","0","4"
"Security2","Security2.RegistryAccessRule2","get_PropagationFlags()","Security2\Registry\RegistrySecurity.cs","151","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","get_RegistryRights()","Security2\Registry\RegistrySecurity.cs","147","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","GetHashCode()","Security2\Registry\RegistrySecurity.cs","170","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","op_Implicit(RegistryAccessRule)","Security2\Registry\RegistrySecurity.cs","161","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","op_Implicit(RegistryAccessRule2)","Security2\Registry\RegistrySecurity.cs","157","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryAccessRule2","ToString()","Security2\Registry\RegistrySecurity.cs","174","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryEffectivePermissionEntry",".ctor(IdentityReference2,UInt32,String)","Security2\Registry\RegistrySecurity.cs","252,254,255,256,257,259,261,265,266,268,271","13","4","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","13","0","13","0","4","0","4"
"Security2","Security2.RegistryEffectivePermissionEntry","get_AccessAsString()","Security2\Registry\RegistrySecurity.cs","250","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryEffectivePermissionEntry","get_AccessMask()","Security2\Registry\RegistrySecurity.cs","224","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryEffectivePermissionEntry","get_Account()","Security2\Registry\RegistrySecurity.cs","221","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryEffectivePermissionEntry","get_FullName()","Security2\Registry\RegistrySecurity.cs","227","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryEffectivePermissionEntry","get_Name()","Security2\Registry\RegistrySecurity.cs","230,232,234,235,239,244","6","4","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","6","0","6","0","4","0","4"
"Security2","Security2.RegistryInheritanceInfo","get_FullName()","Security2\Registry\RegistrySecurity.cs","191","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryInheritanceInfo","get_Name()","Security2\Registry\RegistrySecurity.cs","196,198,200,201,205,210","6","4","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","6","0","6","0","4","0","4"
"Security2","Security2.RegistryKeyOpenException",".ctor()","Security2\Registry\RegistrySecurity.cs","333,334","2","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","2","0","2","0","0","0","0"
"Security2","Security2.RegistryKeyOpenException",".ctor(Exception,Int64)","Security2\Registry\RegistrySecurity.cs","347,349,350","3","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","3","0","3","0","0","0","0"
"Security2","Security2.RegistryKeyOpenException",".ctor(Exception)","Security2\Registry\RegistrySecurity.cs","337,338","2","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","2","0","2","0","0","0","0"
"Security2","Security2.RegistryKeyOpenException",".ctor(Int64)","Security2\Registry\RegistrySecurity.cs","341,343,344","3","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","3","0","3","0","0","0","0"
"Security2","Security2.RegistryKeyOpenException","get_Win32ErrorCode()","Security2\Registry\RegistrySecurity.cs","330","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.RegistryKeySetSecurityException",".ctor()","Security2\Registry\RegistrySecurity.cs","359,360","2","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","2","0","2","0","0","0","0"
"Security2","Security2.RegistryKeySetSecurityException",".ctor(Exception,Int64)","Security2\Registry\RegistrySecurity.cs","373,375,376","3","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","3","0","3","0","0","0","0"
"Security2","Security2.RegistryKeySetSecurityException",".ctor(Exception)","Security2\Registry\RegistrySecurity.cs","363,364","2","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","2","0","2","0","0","0","0"
"Security2","Security2.RegistryKeySetSecurityException",".ctor(Int64)","Security2\Registry\RegistrySecurity.cs","367,369,370","3","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","3","0","3","0","0","0","0"
"Security2","Security2.RegistryKeySetSecurityException","get_Win32ErrorCode()","Security2\Registry\RegistrySecurity.cs","356","1","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.SafeAuthzRMHandle",".ctor(IntPtr)","Security2\Win32\SafeHandleEx.cs","299,301,302","3","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","3","0","3","0","0","0","0"
"Security2","Security2.SafeAuthzRMHandle","get_InvalidHandle()","Security2\Win32\SafeHandleEx.cs","309","1","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.SafeHGlobalHandle",".ctor(IntPtr)","Security2\Win32\SafeHandleEx.cs","31,33,34","3","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","3","0","3","0","0","0","0"
"Security2","Security2.SafeHGlobalHandle","AddSubReference(IEnumerable`1<SafeHGlobalHandle>)","Security2\Win32\SafeHandleEx.cs","60,62,65,66","4","2","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","4","0","4","0","2","0","2"
"Security2","Security2.SafeHGlobalHandle","AllocHGlobal(ICollection`1<T>)","Security2\Win32\SafeHandleEx.cs","109","1","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.SafeHGlobalHandle","AllocHGlobal(Int32,IEnumerable`1<T>,Int32)","Security2\Win32\SafeHandleEx.cs","130,132,133,135,136,139","8","2","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","8","0","8","0","2","0","2"
"Security2","Security2.SafeHGlobalHandle","AllocHGlobal(Int32)","Security2\Win32\SafeHandleEx.cs","184,186","1","1","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","1","0","1"
"Security2","Security2.SafeHGlobalHandle","AllocHGlobal(IntPtr[])","Security2\Win32\SafeHandleEx.cs","77,79,81","3","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","3","0","3","0","0","0","0"
"Security2","Security2.SafeHGlobalHandle","AllocHGlobal(String)","Security2\Win32\SafeHandleEx.cs","150","1","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.SafeHGlobalHandle","Dispose()","Security2\Win32\SafeHandleEx.cs","169","0","1","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","0","0","0","0","1","0","1"
"Security2","Security2.SafeHGlobalHandle","get_InvalidHandle()","Security2\Win32\SafeHandleEx.cs","45","1","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.SafeTokenHandle",".ctor()","Security2\Win32\SafeHandleEx.cs","243","2","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","2","0","2","0","0","0","0"
"Security2","Security2.SafeTokenHandle",".ctor(IntPtr)","Security2\Win32\SafeHandleEx.cs","247,249,250","3","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","3","0","3","0","0","0","0"
"Security2","Security2.SafeTokenHandle","get_InvalidHandle()","Security2\Win32\SafeHandleEx.cs","256","1","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.SafeTokenHandle","ReleaseHandle()","Security2\Win32\SafeHandleEx.cs","266","1","0","False","","NATIVE-HANDLES","unused by cmdlets","Explained","Unchanged","0","1","0","1","0","0","0","0"
"Security2","Security2.Win32","GetByteSecurityDescriptor(Microsoft.Win32.SafeHandles.SafeFileHandle,SecurityInformationClass)","Security2\Win32\Lib.cs","346,347,350,358,360,363,365,366,367,370,371,372,374","13","2","False","","WIN32-RAW-DESCRIPTOR","unused by cmdlets","Explained","Moved","0","13","0","13","0","2","0","2"
"Security2","Security2.Win32","GetEffectiveAccess(ObjectSecurity,IdentityReference2,String,Boolean&,Exception&)","Security2\Win32\Lib.cs","139,140","2","0","True","GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess","WIN32-AUTHZ-FAILURE","environment-specific","Explained","Moved","0","2","0","2","0","0","0","0"
"Security2","Security2.Win32","GetEffectivePermissions_AuthzAccessCheck(ObjectSecurity)","Security2\Win32\Lib.cs","316","0","1","True","GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzAccessCheck","WIN32-AUTHZ-FAILURE","environment-specific","Explained","Moved","0","0","0","0","0","1","0","1"
"Security2","Security2.Win32","GetEffectivePermissions_AuthzInitializeContextFromSid(IdentityReference2)","Security2\Win32\Lib.cs","270,272,273,274,275,276,277,280","6","4","True","GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzInitializeContextFromSid","AUTHZ-LOCAL-FALLBACK","environment-specific","Explained","Changed","6","0","0","0","3","1","0","1"
"Security2","Security2.Win32","GetEffectivePermissions_AuthzInitializeLocalResourceManager()","Security2\Win32\Lib.cs","235,243","1","1","True","GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzInitializeResourceManager > Win32::GetEffectivePermissions_AuthzInitializeLocalResourceManager","AUTHZ-LOCAL-RM-FAILURE","defensive","Explained","New","0","1","0","1","0","1","0","1"
"Security2","Security2.Win32","GetEffectivePermissions_AuthzInitializeResourceManager(String,Boolean&)","Security2\Win32\Lib.cs","198,200,201,202,212,215","4","6","True","GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzInitializeResourceManager","AUTHZ-INIT-ERROR","environment-specific","Explained","Changed","3","1","0","1","1","5","0","5"
"Security2","Security2.Win32","GetRawSecurityDescriptor(Microsoft.Win32.SafeHandles.SafeFileHandle,SecurityInformationClass)","Security2\Win32\Lib.cs","341","1","0","False","","WIN32-RAW-DESCRIPTOR","unused by cmdlets","Explained","Moved","0","1","0","1","0","0","0","0"
"Security2","Security2.Win32","IsLocalComputer(String)","Security2\Win32\Lib.cs","155,157,174,176","3","1","True","GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzInitializeResourceManager > Win32::IsLocalComputer","WIN32-LOCAL-NAME-LOOKUP","defensive","Explained","Changed","0","3","0","3","0","1","0","1"
"Security2","Security2.Win32RegistrySecurity","GetRegistryKey(REGISTRY_ROOT,String,RegistryRights)","Security2\Registry\RegistrySecurity.cs","429,431,433,435,437,440,442,444","8","0","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","8","0","8","0","0","0","0"
"Security2","Security2.Win32RegistrySecurity","SetRegistryOwner(REGISTRY_ROOT,String,Security.Principal.SecurityIdentifier)","Security2\Registry\RegistrySecurity.cs","448,450,451,452,454,458,459,461,463,464,466,470,473,474,478,479,481,483,484,486,490,494,495,496","24","4","False","","REGISTRY-MODEL","unused by cmdlets","Explained","Unchanged","0","24","0","24","0","4","0","4"
1 Assembly Class Method Source UnvisitedLines UnvisitedSequence UnvisitedBranches ReachableFromCmdletInIL CmdletCallPath RuleId Category Disposition Since5a5d58b VisitedElsewhereSequence UnvisitedAfterOtherSourcesSequence VisitedByNewTestsSequence UnvisitedAtFinalSequence VisitedElsewhereBranches UnvisitedAfterOtherSourcesBranches VisitedByNewTestsBranches UnvisitedAtFinalBranches
2 NTFSSecurity NTFSSecurity.AddAccess get_AccessRights() NTFSSecurity\AccessCmdlets\AddAccess.cs 62 1 0 True AddAccess::get_AccessRights CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
3 NTFSSecurity NTFSSecurity.AddAccess get_AccessType() NTFSSecurity\AccessCmdlets\AddAccess.cs 70 1 0 True AddAccess::get_AccessType CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
4 NTFSSecurity NTFSSecurity.AddAccess get_Account() NTFSSecurity\AccessCmdlets\AddAccess.cs 54 1 0 True AddAccess::get_Account CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
5 NTFSSecurity NTFSSecurity.AddAccess get_AppliesTo() NTFSSecurity\AccessCmdlets\AddAccess.cs 95 1 0 True AddAccess::get_AppliesTo CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
6 NTFSSecurity NTFSSecurity.AddAccess get_InheritanceFlags() NTFSSecurity\AccessCmdlets\AddAccess.cs 78 1 0 True AddAccess::get_InheritanceFlags CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
7 NTFSSecurity NTFSSecurity.AddAccess get_PassThru() NTFSSecurity\AccessCmdlets\AddAccess.cs 102 1 0 True AddAccess::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
8 NTFSSecurity NTFSSecurity.AddAccess get_Path() NTFSSecurity\AccessCmdlets\AddAccess.cs 29 1 0 True AddAccess::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
9 NTFSSecurity NTFSSecurity.AddAccess get_PropagationFlags() NTFSSecurity\AccessCmdlets\AddAccess.cs 86 1 0 True AddAccess::get_PropagationFlags CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
10 NTFSSecurity NTFSSecurity.AddAccess get_SecurityDescriptor() NTFSSecurity\AccessCmdlets\AddAccess.cs 42 1 0 True AddAccess::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
11 NTFSSecurity NTFSSecurity.AddAudit get_AccessRights() NTFSSecurity\AuditCmdlets\AddAudit.cs 62 1 0 True AddAudit::get_AccessRights CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
12 NTFSSecurity NTFSSecurity.AddAudit get_Account() NTFSSecurity\AuditCmdlets\AddAudit.cs 54 1 0 True AddAudit::get_Account CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
13 NTFSSecurity NTFSSecurity.AddAudit get_AppliesTo() NTFSSecurity\AuditCmdlets\AddAudit.cs 94 1 0 True AddAudit::get_AppliesTo CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
14 NTFSSecurity NTFSSecurity.AddAudit get_AuditFlags() NTFSSecurity\AuditCmdlets\AddAudit.cs 69 1 0 True AddAudit::get_AuditFlags CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
15 NTFSSecurity NTFSSecurity.AddAudit get_InheritanceFlags() NTFSSecurity\AuditCmdlets\AddAudit.cs 77 1 0 True AddAudit::get_InheritanceFlags CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
16 NTFSSecurity NTFSSecurity.AddAudit get_PassThru() NTFSSecurity\AuditCmdlets\AddAudit.cs 101 1 0 True AddAudit::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
17 NTFSSecurity NTFSSecurity.AddAudit get_Path() NTFSSecurity\AuditCmdlets\AddAudit.cs 29 1 0 True AddAudit::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
18 NTFSSecurity NTFSSecurity.AddAudit get_PropagationFlags() NTFSSecurity\AuditCmdlets\AddAudit.cs 85 1 0 True AddAudit::get_PropagationFlags CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
19 NTFSSecurity NTFSSecurity.AddAudit get_SecurityDescriptor() NTFSSecurity\AuditCmdlets\AddAudit.cs 42 1 0 True AddAudit::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
20 NTFSSecurity NTFSSecurity.AddAudit ProcessRecord() NTFSSecurity\AuditCmdlets\AddAudit.cs 137,141,145,146,148,149,151 7 0 True AddAudit::ProcessRecord AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 7 0 7 0 0 0 0
21 NTFSSecurity NTFSSecurity.AddAudit/<>c__DisplayClass35_0 <ProcessRecord>b__0() NTFSSecurity\AuditCmdlets\AddAudit.cs 143,144 2 0 True AddAudit::ProcessRecord > AddAudit/<>c__DisplayClass35_0::<ProcessRecord>b__0 AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 2 0 2 0 0 0 0
22 NTFSSecurity NTFSSecurity.AuditCmdlets.GetOrphanedAudit ProcessRecord() NTFSSecurity\AuditCmdlets\Get-OrphanedAudit.cs 56,58,59 3 0 True GetOrphanedAudit::ProcessRecord AUDIT-READ-DENIED environment-specific Explained Unchanged 0 3 0 3 0 0 0 0
23 NTFSSecurity NTFSSecurity.BaseCmdlet GetFileSystemInfo(String) NTFSSecurity\BaseCmdlets.cs 166,168,170,172,174,178 6 4 False UNUSED-CMDLET-HELPER unused by cmdlets Explained Unchanged 0 6 0 6 0 4 0 4
24 NTFSSecurity NTFSSecurity.BaseCmdlet GetRelativePath(String) NTFSSecurity\BaseCmdlets.cs 229,231 1 1 True CopyItem2::BeginProcessing > BaseCmdlet::GetRelativePath RELATIVE-PATH-EMPTY defensive Explained Unchanged 0 1 0 1 0 1 0 1
25 NTFSSecurity NTFSSecurity.BaseCmdlet ProcessRecord() NTFSSecurity\BaseCmdlets.cs 145,146 2 0 True BaseCmdlet::ProcessRecord UNUSED-CMDLET-HELPER unused by cmdlets Explained Unchanged 0 2 0 2 0 0 0 0
26 NTFSSecurity NTFSSecurity.BaseCmdletWithPrivControl DisableEnabledPrivileges(Dictionary`2<String,Exception>) NTFSSecurity\BaseCmdlets.cs 422,424,425 3 0 True BaseCmdletWithPrivControl::Dispose > BaseCmdletWithPrivControl::DisableEnabledPrivileges PRIVILEGE-DISABLE-FAILURE defensive Explained Unchanged 0 3 0 3 0 0 0 0
27 NTFSSecurity NTFSSecurity.BaseCmdletWithPrivControl DisableFileSystemPrivileges() NTFSSecurity\BaseCmdlets.cs 544,545 1 1 True DisablePrivileges::ProcessRecord > BaseCmdletWithPrivControl::DisableFileSystemPrivileges PRIVILEGE-DISABLE-FAILURE defensive Explained Unchanged 0 1 0 1 0 1 0 1
28 NTFSSecurity NTFSSecurity.BaseCmdletWithPrivControl EndProcessing() NTFSSecurity\BaseCmdlets.cs 389,391,392 3 1 True BaseCmdletWithPrivControl::EndProcessing PRIVILEGE-DISABLE-FAILURE defensive Explained Unchanged 0 3 0 3 0 1 0 1
29 NTFSSecurity NTFSSecurity.BaseCmdletWithPrivControl TryDisablePrivilege(ProcessPrivileges.Privilege) NTFSSecurity\BaseCmdlets.cs 490,492,493 3 0 True DisablePrivileges::ProcessRecord > BaseCmdletWithPrivControl::DisableFileSystemPrivileges > BaseCmdletWithPrivControl::TryDisablePrivilege PRIVILEGE-DISABLE-FAILURE defensive Explained Unchanged 0 3 0 3 0 0 0 0
30 NTFSSecurity NTFSSecurity.ClearAccess get_DisableInheritance() NTFSSecurity\AccessCmdlets\ClearAccess.cs 42 1 0 True ClearAccess::get_DisableInheritance CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
31 NTFSSecurity NTFSSecurity.ClearAccess get_Path() NTFSSecurity\AccessCmdlets\ClearAccess.cs 19 1 0 True ClearAccess::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
32 NTFSSecurity NTFSSecurity.ClearAccess get_SecurityDescriptor() NTFSSecurity\AccessCmdlets\ClearAccess.cs 31 1 0 True ClearAccess::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
33 NTFSSecurity NTFSSecurity.ClearAccess ProcessRecord() NTFSSecurity\AccessCmdlets\ClearAccess.cs 92,94,95 3 0 True ClearAccess::ProcessRecord ACCESS-GENERIC-CATCH defensive Explained Unchanged 0 3 0 3 0 0 0 0
34 NTFSSecurity NTFSSecurity.ClearAudit get_DisableInheritance() NTFSSecurity\AuditCmdlets\ClearAudit.cs 42 1 0 True ClearAudit::get_DisableInheritance CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
35 NTFSSecurity NTFSSecurity.ClearAudit get_Path() NTFSSecurity\AuditCmdlets\ClearAudit.cs 19 1 0 True ClearAudit::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
36 NTFSSecurity NTFSSecurity.ClearAudit get_SecurityDescriptor() NTFSSecurity\AuditCmdlets\ClearAudit.cs 31 1 0 True ClearAudit::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
37 NTFSSecurity NTFSSecurity.ClearAudit ProcessRecord() NTFSSecurity\AuditCmdlets\ClearAudit.cs 76,80,86,87,89,90,91 7 0 True ClearAudit::ProcessRecord AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 7 0 7 0 0 0 0
38 NTFSSecurity NTFSSecurity.ClearAudit/<>c__DisplayClass11_0 <ProcessRecord>b__0() NTFSSecurity\AuditCmdlets\ClearAudit.cs 82,83,84,85 4 2 True ClearAudit::ProcessRecord > ClearAudit/<>c__DisplayClass11_0::<ProcessRecord>b__0 AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 4 0 4 0 2 0 2
39 NTFSSecurity NTFSSecurity.CopyItem2 get_Destination() NTFSSecurity\ItemCmdlets\CopyItem2.cs 33 1 0 True CopyItem2::get_Destination CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
40 NTFSSecurity NTFSSecurity.CopyItem2 get_Force() NTFSSecurity\ItemCmdlets\CopyItem2.cs 40 1 0 True CopyItem2::get_Force CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
41 NTFSSecurity NTFSSecurity.CopyItem2 get_PassThru() NTFSSecurity\ItemCmdlets\CopyItem2.cs 47 1 0 True CopyItem2::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
42 NTFSSecurity NTFSSecurity.CopyItem2 get_Path() NTFSSecurity\ItemCmdlets\CopyItem2.cs 21 1 0 True CopyItem2::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
43 NTFSSecurity NTFSSecurity.DisableAccessInheritance get_PassThru() NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs 51 1 0 True DisableAccessInheritance::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
44 NTFSSecurity NTFSSecurity.DisableAccessInheritance get_Path() NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs 21 1 0 True DisableAccessInheritance::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
45 NTFSSecurity NTFSSecurity.DisableAccessInheritance get_RemoveInheritedAccessRules() NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs 44 1 0 True DisableAccessInheritance::get_RemoveInheritedAccessRules CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
46 NTFSSecurity NTFSSecurity.DisableAccessInheritance get_SecurityDescriptor() NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs 33 1 0 True DisableAccessInheritance::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
47 NTFSSecurity NTFSSecurity.DisableAccessInheritance ProcessRecord() NTFSSecurity\InheritanceCmdlets\DisableAccessInheritance.cs 97,99,100 3 0 True DisableAccessInheritance::ProcessRecord ACCESS-GENERIC-CATCH defensive Explained Unchanged 0 3 0 3 0 0 0 0
48 NTFSSecurity NTFSSecurity.DisableAuditInheritance get_PassThru() NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs 57 1 0 True DisableAuditInheritance::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
49 NTFSSecurity NTFSSecurity.DisableAuditInheritance get_Path() NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs 22 1 0 True DisableAuditInheritance::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
50 NTFSSecurity NTFSSecurity.DisableAuditInheritance get_RemoveInheritedAuditRules() NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs 50 1 0 True DisableAuditInheritance::get_RemoveInheritedAuditRules CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
51 NTFSSecurity NTFSSecurity.DisableAuditInheritance get_SecurityDescriptor() NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs 34 1 0 True DisableAuditInheritance::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
52 NTFSSecurity NTFSSecurity.DisableAuditInheritance ProcessRecord() NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs 88,92,96,97,99,100,102 7 0 True DisableAuditInheritance::ProcessRecord AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 7 0 7 0 0 0 0
53 NTFSSecurity NTFSSecurity.DisableAuditInheritance/<>c__DisplayClass15_0 <ProcessRecord>b__0() NTFSSecurity\InheritanceCmdlets\DisableAuditInheritance.cs 94,95 2 0 True DisableAuditInheritance::ProcessRecord > DisableAuditInheritance/<>c__DisplayClass15_0::<ProcessRecord>b__0 AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 2 0 2 0 0 0 0
54 NTFSSecurity NTFSSecurity.DisablePrivileges get_PassThru() NTFSSecurity\OtherCmdlets.cs 83 1 0 True DisablePrivileges::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
55 NTFSSecurity NTFSSecurity.EnableAccessInheritance get_PassThru() NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs 44 1 0 True EnableAccessInheritance::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
56 NTFSSecurity NTFSSecurity.EnableAccessInheritance get_Path() NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs 21 1 0 True EnableAccessInheritance::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
57 NTFSSecurity NTFSSecurity.EnableAccessInheritance get_RemoveExplicitAccessRules() NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs 51 1 0 True EnableAccessInheritance::get_RemoveExplicitAccessRules CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
58 NTFSSecurity NTFSSecurity.EnableAccessInheritance get_SecurityDescriptor() NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs 33 1 0 True EnableAccessInheritance::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
59 NTFSSecurity NTFSSecurity.EnableAccessInheritance ProcessRecord() NTFSSecurity\InheritanceCmdlets\EnableAccessInheritance.cs 97,99,100 3 0 True EnableAccessInheritance::ProcessRecord ACCESS-GENERIC-CATCH defensive Explained Unchanged 0 3 0 3 0 0 0 0
60 NTFSSecurity NTFSSecurity.EnableAuditInheritance get_PassThru() NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs 44 1 0 True EnableAuditInheritance::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
61 NTFSSecurity NTFSSecurity.EnableAuditInheritance get_Path() NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs 21 1 0 True EnableAuditInheritance::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
62 NTFSSecurity NTFSSecurity.EnableAuditInheritance get_RemoveExplicitAuditRules() NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs 56 1 0 True EnableAuditInheritance::get_RemoveExplicitAuditRules CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
63 NTFSSecurity NTFSSecurity.EnableAuditInheritance get_SecurityDescriptor() NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs 33 1 0 True EnableAuditInheritance::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
64 NTFSSecurity NTFSSecurity.EnableAuditInheritance ProcessRecord() NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs 87,91,95,96,98,99,101 7 0 True EnableAuditInheritance::ProcessRecord AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 7 0 7 0 0 0 0
65 NTFSSecurity NTFSSecurity.EnableAuditInheritance/<>c__DisplayClass15_0 <ProcessRecord>b__0() NTFSSecurity\InheritanceCmdlets\EnableAuditInheritance.cs 93,94 2 0 True EnableAuditInheritance::ProcessRecord > EnableAuditInheritance/<>c__DisplayClass15_0::<ProcessRecord>b__0 AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 2 0 2 0 0 0 0
66 NTFSSecurity NTFSSecurity.EnablePrivileges get_PassThru() NTFSSecurity\OtherCmdlets.cs 21 1 0 True EnablePrivileges::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
67 NTFSSecurity NTFSSecurity.EnablePrivileges ProcessRecord() NTFSSecurity\OtherCmdlets.cs 39,41 2 0 True EnablePrivileges::ProcessRecord ENABLEPRIVILEGES-INIT defensive Explained Unchanged 0 2 0 2 0 0 0 0
68 NTFSSecurity NTFSSecurity.FileSystemCodeMembers Mode(Management.Automation.PSObject) NTFSSecurity\CodeMembers.cs 15,17 1 1 False CODEMEMBERS-NULL-BASE defensive Explained Unchanged 0 1 0 1 0 1 0 1
69 NTFSSecurity NTFSSecurity.GetAccess ProcessRecord() NTFSSecurity\AccessCmdlets\GetAccess.cs 112,118,119,121,122 5 0 True GetAccess::ProcessRecord ACCESS-GENERIC-CATCH defensive Explained Unchanged 0 5 0 5 0 0 0 0
70 NTFSSecurity NTFSSecurity.GetAccess/<>c__DisplayClass20_0 <ProcessRecord>b__0() NTFSSecurity\AccessCmdlets\GetAccess.cs 110,111 2 0 True GetAccess::ProcessRecord > GetAccess/<>c__DisplayClass20_0::<ProcessRecord>b__0 READ-RETRY-CLOSURE defensive Explained Unchanged 0 2 0 2 0 0 0 0
71 NTFSSecurity NTFSSecurity.GetAudit ProcessRecord() NTFSSecurity\AuditCmdlets\GetAudit.cs 104,107,108 3 0 True GetAudit::ProcessRecord AUDIT-READ-DENIED environment-specific Explained Unchanged 0 3 0 3 0 0 0 0
72 NTFSSecurity NTFSSecurity.GetChildItem2 get_Attributes() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 79 1 0 True GetChildItem2::get_Attributes CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
73 NTFSSecurity NTFSSecurity.GetChildItem2 get_Depth() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 128 1 0 True GetChildItem2::get_Depth CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
74 NTFSSecurity NTFSSecurity.GetChildItem2 get_Directory() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 65 1 0 True GetChildItem2::get_Directory CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
75 NTFSSecurity NTFSSecurity.GetChildItem2 get_File() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 72 1 0 True GetChildItem2::get_File CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
76 NTFSSecurity NTFSSecurity.GetChildItem2 get_Filter() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 51 1 0 True GetChildItem2::get_Filter CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
77 NTFSSecurity NTFSSecurity.GetChildItem2 get_Force() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 107 1 0 True GetChildItem2::get_Force CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
78 NTFSSecurity NTFSSecurity.GetChildItem2 get_Hidden() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 86 1 0 True GetChildItem2::get_Hidden CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
79 NTFSSecurity NTFSSecurity.GetChildItem2 get_Path() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 39 1 0 True GetChildItem2::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
80 NTFSSecurity NTFSSecurity.GetChildItem2 get_ReadOnly() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 100 1 0 True GetChildItem2::get_ReadOnly CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
81 NTFSSecurity NTFSSecurity.GetChildItem2 get_Recurse() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 58 1 0 True GetChildItem2::get_Recurse CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
82 NTFSSecurity NTFSSecurity.GetChildItem2 get_SkipMountPoints() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 114 1 0 True GetChildItem2::get_SkipMountPoints CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
83 NTFSSecurity NTFSSecurity.GetChildItem2 get_SkipSymbolicLinks() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 121 1 0 True GetChildItem2::get_SkipSymbolicLinks CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
84 NTFSSecurity NTFSSecurity.GetChildItem2 get_System() NTFSSecurity\ItemCmdlets\GetChildItem2.cs 93 1 0 True GetChildItem2::get_System CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
85 NTFSSecurity NTFSSecurity.GetChildItem2 WriteFileSystem(FileSystemInfo,Int32) NTFSSecurity\ItemCmdlets\GetChildItem2.cs 205 0 1 True GetChildItem2::ProcessRecord > GetChildItem2::WriteFileSystem CHILDITEM2-NON-FOLDER defensive Explained Unchanged 0 0 0 0 0 1 0 1
86 NTFSSecurity NTFSSecurity.GetDiskSpace get_DriveLetter() NTFSSecurity\ItemCmdlets\GetDiskSpace.cs 18 1 0 True GetDiskSpace::get_DriveLetter CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
87 NTFSSecurity NTFSSecurity.GetDiskSpace ProcessRecord() NTFSSecurity\ItemCmdlets\GetDiskSpace.cs 52 0 1 True GetDiskSpace::ProcessRecord DISKSPACE-EMPTY-VOLUME environment-specific Explained Unchanged 0 0 0 0 0 1 0 1
88 NTFSSecurity NTFSSecurity.GetEffectiveAccess get_Account() NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs 51 1 0 True GetEffectiveAccess::get_Account CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
89 NTFSSecurity NTFSSecurity.GetEffectiveAccess get_ExcludeNoneAccessEntries() NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs 65 1 0 True GetEffectiveAccess::get_ExcludeNoneAccessEntries CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
90 NTFSSecurity NTFSSecurity.GetEffectiveAccess get_Path() NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs 26 1 0 True GetEffectiveAccess::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
91 NTFSSecurity NTFSSecurity.GetEffectiveAccess get_SecurityDescriptor() NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs 38 1 0 True GetEffectiveAccess::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
92 NTFSSecurity NTFSSecurity.GetEffectiveAccess get_ServerName() NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs 58 1 0 True GetEffectiveAccess::get_ServerName CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
93 NTFSSecurity NTFSSecurity.GetEffectiveAccess ProcessRecord() NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs 99,101,102,141,147,148,150,151 8 0 True GetEffectiveAccess::ProcessRecord EFFECTIVE-ACCESS-CATCH defensive Explained Unchanged 0 8 0 8 0 0 0 0
94 NTFSSecurity NTFSSecurity.GetEffectiveAccess/<>c__DisplayClass20_0 <ProcessRecord>b__0() NTFSSecurity\AccessCmdlets\GetEffectiveAccess.cs 139,140 2 0 True GetEffectiveAccess::ProcessRecord > GetEffectiveAccess/<>c__DisplayClass20_0::<ProcessRecord>b__0 EFFECTIVE-ACCESS-CATCH defensive Explained Unchanged 0 2 0 2 0 0 0 0
95 NTFSSecurity NTFSSecurity.GetFileHash2 get_Algorithm() NTFSSecurity\MiscCmdlets\GetFileHash2.cs 33 1 0 True GetFileHash2::get_Algorithm CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
96 NTFSSecurity NTFSSecurity.GetFileHash2 ProcessRecord() NTFSSecurity\MiscCmdlets\GetFileHash2.cs 51,52,55,56,103,109 6 0 True GetFileHash2::ProcessRecord HASH-POLICY-AND-RETRY environment-specific Explained Unchanged 0 6 0 6 0 0 0 0
97 NTFSSecurity NTFSSecurity.GetFileHash2/<>c__DisplayClass9_0 <ProcessRecord>b__0() NTFSSecurity\MiscCmdlets\GetFileHash2.cs 102 1 0 True GetFileHash2::ProcessRecord > GetFileHash2/<>c__DisplayClass9_0::<ProcessRecord>b__0 HASH-POLICY-AND-RETRY environment-specific Explained Unchanged 0 1 0 1 0 0 0 0
98 NTFSSecurity NTFSSecurity.GetHardLink ProcessRecord() NTFSSecurity\LinkCmdlets\GetHardLink.cs 77,79,80 3 0 True GetHardLink::ProcessRecord HARDLINK-DENIED environment-specific Explained Unchanged 0 3 0 3 0 0 0 0
99 NTFSSecurity NTFSSecurity.GetInheritance get_Path() NTFSSecurity\InheritanceCmdlets\GetInheritance.cs 19 1 0 True GetInheritance::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
100 NTFSSecurity NTFSSecurity.GetInheritance get_SecurityDescriptor() NTFSSecurity\InheritanceCmdlets\GetInheritance.cs 31 1 0 True GetInheritance::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
101 NTFSSecurity NTFSSecurity.GetInheritance ProcessRecord() NTFSSecurity\InheritanceCmdlets\GetInheritance.cs 80,86,87,89,90,107 5 1 True GetInheritance::ProcessRecord ACCESS-GENERIC-CATCH defensive Explained Unchanged 0 5 0 5 0 1 0 1
102 NTFSSecurity NTFSSecurity.GetInheritance/<>c__DisplayClass7_0 <ProcessRecord>b__0() NTFSSecurity\InheritanceCmdlets\GetInheritance.cs 78,79 2 0 True GetInheritance::ProcessRecord > GetInheritance/<>c__DisplayClass7_0::<ProcessRecord>b__0 READ-RETRY-CLOSURE defensive Explained Unchanged 0 2 0 2 0 0 0 0
103 NTFSSecurity NTFSSecurity.GetItem2 get_Path() NTFSSecurity\ItemCmdlets\GetItem2.cs 19 1 0 True GetItem2::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
104 NTFSSecurity NTFSSecurity.GetOrphanedAccess ProcessRecord() NTFSSecurity\AccessCmdlets\GetOrphanedAccess.cs 55,62,63,65,66 5 0 True GetOrphanedAccess::ProcessRecord ACCESS-GENERIC-CATCH defensive Explained Unchanged 0 5 0 5 0 0 0 0
105 NTFSSecurity NTFSSecurity.GetOrphanedAccess/<>c__DisplayClass1_0 <ProcessRecord>b__0() NTFSSecurity\AccessCmdlets\GetOrphanedAccess.cs 53,54 2 0 True GetOrphanedAccess::ProcessRecord > GetOrphanedAccess/<>c__DisplayClass1_0::<ProcessRecord>b__0 READ-RETRY-CLOSURE defensive Explained Unchanged 0 2 0 2 0 0 0 0
106 NTFSSecurity NTFSSecurity.GetSecurityDescriptor get_Path() NTFSSecurity\SecurityDescriptorCmdlets\GetSecurityDescriptor.cs 18 1 0 True GetSecurityDescriptor::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
107 NTFSSecurity NTFSSecurity.GetSecurityDescriptor ProcessRecord() NTFSSecurity\SecurityDescriptorCmdlets\GetSecurityDescriptor.cs 64,67,69,75,78,83,84 5 2 True GetSecurityDescriptor::ProcessRecord ACCESS-GENERIC-CATCH defensive Explained Unchanged 0 5 0 5 0 2 0 2
108 NTFSSecurity NTFSSecurity.GetSecurityDescriptor/<>c__DisplayClass4_0 <ProcessRecord>b__0() NTFSSecurity\SecurityDescriptorCmdlets\GetSecurityDescriptor.cs 62,63 2 0 True GetSecurityDescriptor::ProcessRecord > GetSecurityDescriptor/<>c__DisplayClass4_0::<ProcessRecord>b__0 READ-RETRY-CLOSURE defensive Explained Unchanged 0 2 0 2 0 0 0 0
109 NTFSSecurity NTFSSecurity.GetSimpleAccess get_IncludeRootFolder() NTFSSecurity\SimpleAccessCmdlets\SimpleAccessCmdlets.cs 24 1 0 True GetSimpleAccess::get_IncludeRootFolder CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
110 NTFSSecurity NTFSSecurity.MoveItem2 get_Destination() NTFSSecurity\ItemCmdlets\MoveItem2.cs 33 1 0 True MoveItem2::get_Destination CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
111 NTFSSecurity NTFSSecurity.MoveItem2 get_Force() NTFSSecurity\ItemCmdlets\MoveItem2.cs 40 1 0 True MoveItem2::get_Force CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
112 NTFSSecurity NTFSSecurity.MoveItem2 get_PassThru() NTFSSecurity\ItemCmdlets\MoveItem2.cs 47 1 0 True MoveItem2::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
113 NTFSSecurity NTFSSecurity.MoveItem2 get_Path() NTFSSecurity\ItemCmdlets\MoveItem2.cs 21 1 0 True MoveItem2::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
114 NTFSSecurity NTFSSecurity.NewHardLink get_PassThru() NTFSSecurity\LinkCmdlets\NewHardLink.cs 47 1 0 True NewHardLink::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
115 NTFSSecurity NTFSSecurity.NewSymbolicLink get_PassThru() NTFSSecurity\LinkCmdlets\NewSymbolicLink.cs 45 1 0 True NewSymbolicLink::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
116 NTFSSecurity NTFSSecurity.OwnerCmdlets.GetOwner ProcessRecord() NTFSSecurity\OwnerCmdlets\GetOwner.cs 72,74,75 3 0 True GetOwner::ProcessRecord ACCESS-GENERIC-CATCH defensive Explained Unchanged 0 3 0 3 0 0 0 0
117 NTFSSecurity NTFSSecurity.Properties.Resources .ctor() NTFSSecurity\Properties\Resources.Designer.cs 32,33 2 0 False GENERATED-RESOURCES unused by cmdlets Explained Unchanged 0 2 0 2 0 0 0 0
118 NTFSSecurity NTFSSecurity.Properties.Resources get_ContainerIcon() NTFSSecurity\Properties\Resources.Designer.cs 68 1 0 False GENERATED-RESOURCES unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
119 NTFSSecurity NTFSSecurity.Properties.Resources get_Culture() NTFSSecurity\Properties\Resources.Designer.cs 56 1 0 False GENERATED-RESOURCES unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
120 NTFSSecurity NTFSSecurity.Properties.Resources get_IconContainer() NTFSSecurity\Properties\Resources.Designer.cs 77,78 2 0 False GENERATED-RESOURCES unused by cmdlets Explained Unchanged 0 2 0 2 0 0 0 0
121 NTFSSecurity NTFSSecurity.Properties.Resources get_ResourceManager() NTFSSecurity\Properties\Resources.Designer.cs 41,42,43,45 4 2 False GENERATED-RESOURCES unused by cmdlets Explained Unchanged 0 4 0 4 0 2 0 2
122 NTFSSecurity NTFSSecurity.Properties.Resources set_Culture(Globalization.CultureInfo) NTFSSecurity\Properties\Resources.Designer.cs 59,60 2 0 False GENERATED-RESOURCES unused by cmdlets Explained Unchanged 0 2 0 2 0 0 0 0
123 NTFSSecurity NTFSSecurity.RemoveAccess get_AppliesTo() NTFSSecurity\AccessCmdlets\RemoveAccess.cs 96 1 0 True RemoveAccess::get_AppliesTo CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
124 NTFSSecurity NTFSSecurity.RemoveAccess get_PassThru() NTFSSecurity\AccessCmdlets\RemoveAccess.cs 113 1 0 True RemoveAccess::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
125 NTFSSecurity NTFSSecurity.RemoveAccess get_RemoveSpecific() NTFSSecurity\AccessCmdlets\RemoveAccess.cs 106 1 0 True RemoveAccess::get_RemoveSpecific CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
126 NTFSSecurity NTFSSecurity.RemoveAudit get_AccessRights() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 63 1 0 True RemoveAudit::get_AccessRights CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
127 NTFSSecurity NTFSSecurity.RemoveAudit get_Account() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 55 1 0 True RemoveAudit::get_Account CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
128 NTFSSecurity NTFSSecurity.RemoveAudit get_AppliesTo() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 95 1 0 True RemoveAudit::get_AppliesTo CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
129 NTFSSecurity NTFSSecurity.RemoveAudit get_AuditFlags() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 70 1 0 True RemoveAudit::get_AuditFlags CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
130 NTFSSecurity NTFSSecurity.RemoveAudit get_InheritanceFlags() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 78 1 0 True RemoveAudit::get_InheritanceFlags CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
131 NTFSSecurity NTFSSecurity.RemoveAudit get_PassThru() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 112 1 0 True RemoveAudit::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
132 NTFSSecurity NTFSSecurity.RemoveAudit get_Path() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 30 1 0 True RemoveAudit::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
133 NTFSSecurity NTFSSecurity.RemoveAudit get_PropagationFlags() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 86 1 0 True RemoveAudit::get_PropagationFlags CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
134 NTFSSecurity NTFSSecurity.RemoveAudit get_RemoveSpecific() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 105 1 0 True RemoveAudit::get_RemoveSpecific CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
135 NTFSSecurity NTFSSecurity.RemoveAudit get_SecurityDescriptor() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 43 1 0 True RemoveAudit::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
136 NTFSSecurity NTFSSecurity.RemoveAudit ProcessRecord() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 153,157,161,162,164,165,167 7 0 True RemoveAudit::ProcessRecord AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 7 0 7 0 0 0 0
137 NTFSSecurity NTFSSecurity.RemoveAudit/<>c__DisplayClass39_0 <ProcessRecord>b__0() NTFSSecurity\AuditCmdlets\RemoveAudit.cs 159,160 2 0 True RemoveAudit::ProcessRecord > RemoveAudit/<>c__DisplayClass39_0::<ProcessRecord>b__0 AUDIT-OWNER-RETRY environment-specific Explained Unchanged 0 2 0 2 0 0 0 0
138 NTFSSecurity NTFSSecurity.RemoveItem2 get_Force() NTFSSecurity\ItemCmdlets\RemoveItem2.cs 32 1 0 True RemoveItem2::get_Force CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
139 NTFSSecurity NTFSSecurity.RemoveItem2 get_PassThru() NTFSSecurity\ItemCmdlets\RemoveItem2.cs 48 1 0 True RemoveItem2::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
140 NTFSSecurity NTFSSecurity.RemoveItem2 get_Path() NTFSSecurity\ItemCmdlets\RemoveItem2.cs 21 1 0 True RemoveItem2::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
141 NTFSSecurity NTFSSecurity.RemoveItem2 get_Recurse() NTFSSecurity\ItemCmdlets\RemoveItem2.cs 39 1 0 True RemoveItem2::get_Recurse CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
142 NTFSSecurity NTFSSecurity.SetInheritance get_AccessInheritanceEnabled() NTFSSecurity\InheritanceCmdlets\SetInheritance.cs 45 1 0 True SetInheritance::get_AccessInheritanceEnabled CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
143 NTFSSecurity NTFSSecurity.SetInheritance get_AuditInheritanceEnabled() NTFSSecurity\InheritanceCmdlets\SetInheritance.cs 52 1 0 True SetInheritance::get_AuditInheritanceEnabled CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
144 NTFSSecurity NTFSSecurity.SetInheritance get_PassThru() NTFSSecurity\InheritanceCmdlets\SetInheritance.cs 59 1 0 True SetInheritance::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
145 NTFSSecurity NTFSSecurity.SetInheritance get_Path() NTFSSecurity\InheritanceCmdlets\SetInheritance.cs 22 1 0 True SetInheritance::get_Path CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
146 NTFSSecurity NTFSSecurity.SetInheritance get_SecurityDescriptor() NTFSSecurity\InheritanceCmdlets\SetInheritance.cs 34 1 0 True SetInheritance::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
147 NTFSSecurity NTFSSecurity.SetOwner get_Account() NTFSSecurity\OwnerCmdlets\SetOwner.cs 44 1 0 True SetOwner::get_Account CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 0 1 0 0 0 0
148 NTFSSecurity NTFSSecurity.SetOwner get_PassThru() NTFSSecurity\OwnerCmdlets\SetOwner.cs 51 1 0 True SetOwner::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
149 NTFSSecurity NTFSSecurity.SetOwner get_SecurityDescriptor() NTFSSecurity\OwnerCmdlets\SetOwner.cs 33 1 0 True SetOwner::get_SecurityDescriptor CMDLET-GETTER-PIPELINE parameter/API surface Open Unchanged 0 1 1 0 0 0 0 0
150 NTFSSecurity NTFSSecurity.SetSecurityDescriptor get_PassThru() NTFSSecurity\SecurityDescriptorCmdlets\SetSecurityDescriptor.cs 28 1 0 True SetSecurityDescriptor::get_PassThru CMDLET-GETTER parameter/API surface Explained Unchanged 0 1 0 1 0 0 0 0
151 NTFSSecurity NTFSSecurity.TestPath2 ProcessRecord() NTFSSecurity\PathCmdlets\TestPath2.cs 53,55,56,65,67,68 6 0 True TestPath2::ProcessRecord TESTPATH-DEAD-CATCH defensive Explained Unchanged 0 6 0 6 0 0 0 0
152 PrivilegeControl Security2.PrivilegeControl DisablePrivilege(ProcessPrivileges.Privilege) PrivilegeControl\PrivilegeControl.cs 61,67 1 1 True BaseCmdletWithPrivControl::Dispose > BaseCmdletWithPrivControl::DisableEnabledPrivileges > BaseCmdletWithPrivControl::DisablePrivilege > PrivilegeControl::DisablePrivilege PRIVILEGECONTROL-DEAD-ELSE defensive Explained Unchanged 0 1 0 1 0 1 0 1
153 PrivilegeControl Security2.PrivilegeControl EnablePrivilege(ProcessPrivileges.Privilege) PrivilegeControl\PrivilegeControl.cs 40,46 1 1 True BaseCmdletWithPrivControl::BeginProcessing > BaseCmdletWithPrivControl::EnableFileSystemPrivileges > BaseCmdletWithPrivControl::TryEnablePrivilege > BaseCmdletWithPrivControl::EnablePrivilege > PrivilegeControl::EnablePrivilege PRIVILEGECONTROL-DEAD-ELSE defensive Explained Unchanged 0 1 0 1 0 1 0 1
154 ProcessPrivileges ProcessPrivileges.AccessTokenHandle .ctor(ProcessPrivileges.ProcessHandle,ProcessPrivileges.TokenAccessRights) ProcessPrivileges\AccessTokenHandle.cs 21,23 1 1 True DisablePrivileges::ProcessRecord > PrivilegeControl::GetPrivileges > ProcessExtensions::GetPrivileges > AccessTokenHandle::.ctor TOKEN-NATIVE-FAILURE environment-specific Explained Unchanged 0 1 0 1 0 1 0 1
155 ProcessPrivileges ProcessPrivileges.AccessTokenHandle ReleaseHandle() ProcessPrivileges\AccessTokenHandle.cs 32,34 1 1 False TOKEN-NATIVE-FAILURE environment-specific Explained Unchanged 0 1 0 1 0 1 0 1
156 ProcessPrivileges ProcessPrivileges.AllocatedMemory Finalize() ProcessPrivileges\AllocatedMemory.cs 28,29 3 0 False ALLOCATED-MEMORY-FINALIZER defensive Explained Unchanged 0 3 0 3 0 0 0 0
157 ProcessPrivileges ProcessPrivileges.AllocatedMemory InternalDispose() ProcessPrivileges\AllocatedMemory.cs 47 0 1 False ALLOCATED-MEMORY-FINALIZER defensive Explained Unchanged 0 0 0 0 0 1 0 1
158 ProcessPrivileges ProcessPrivileges.PrivilegeEnabler EnablePrivilege(ProcessPrivileges.Privilege) ProcessPrivileges\PrivilegeEnabler.cs 172 0 1 False PRIVILEGE-ENABLER-RACE defensive Explained Unchanged 0 0 0 0 0 1 0 1
159 ProcessPrivileges ProcessPrivileges.Privileges GetLuid(ProcessPrivileges.Privilege) ProcessPrivileges\Privileges.cs 236,238 1 1 True BaseCmdletWithPrivControl::Dispose > BaseCmdletWithPrivControl::DisableEnabledPrivileges > BaseCmdletWithPrivControl::DisablePrivilege > PrivilegeControl::DisablePrivilege > ProcessExtensions::GetPrivilegeState > ProcessExtensions::GetPrivilegeAttributes > Privileges::GetPrivilegeAttributes > Privileges::GetLuid TOKEN-NATIVE-FAILURE environment-specific Explained Unchanged 0 1 0 1 0 1 0 1
160 ProcessPrivileges ProcessPrivileges.Privileges GetPrivilegeName(ProcessPrivileges.Luid) ProcessPrivileges\Privileges.cs 249,251,255,257,261,263 3 3 True DisablePrivileges::ProcessRecord > PrivilegeControl::GetPrivileges > ProcessExtensions::GetPrivileges > Privileges::GetPrivileges > Privileges::GetPrivilegeName TOKEN-NATIVE-FAILURE environment-specific Explained Unchanged 0 3 0 3 0 3 0 3
161 ProcessPrivileges ProcessPrivileges.Privileges GetTokenPrivileges(ProcessPrivileges.AccessTokenHandle) ProcessPrivileges\Privileges.cs 273,280,294,301 2 2 True DisablePrivileges::ProcessRecord > PrivilegeControl::GetPrivileges > ProcessExtensions::GetPrivileges > Privileges::GetPrivileges > Privileges::GetTokenPrivileges TOKEN-NATIVE-FAILURE environment-specific Explained Unchanged 0 2 0 2 0 2 0 2
162 ProcessPrivileges ProcessPrivileges.ProcessHandle ReleaseHandle() ProcessPrivileges\ProcessHandle.cs 27,29,32 3 2 False TOKEN-NATIVE-FAILURE environment-specific Explained Unchanged 0 3 0 3 0 2 0 2
163 Security2 Security2.FileSystemAccessRule2 RemoveFileSystemAccessRuleAll(FileSystemSecurity2,List`1<IdentityReference2>) Security2\FileSystem\FileSystemAccessRule2 Class\FileSystemAccessRule2.RemoveFileSystemAccessRulesAll.cs 15,17 1 1 True ClearAccess::ProcessRecord > FileSystemAccessRule2::RemoveFileSystemAccessRuleAll REMOVEALL-ACCOUNT-FILTER unused by cmdlets Open Unchanged 0 1 0 1 0 1 0 1
164 Security2 Security2.FileSystemAccessRule2/<>c__DisplayClass36_0 <RemoveFileSystemAccessRuleAll>b__0(FileSystemAccessRule) Security2\FileSystem\FileSystemAccessRule2 Class\FileSystemAccessRule2.RemoveFileSystemAccessRulesAll.cs 17 1 0 True ClearAccess::ProcessRecord > FileSystemAccessRule2::RemoveFileSystemAccessRuleAll > FileSystemAccessRule2/<>c__DisplayClass36_0::<RemoveFileSystemAccessRuleAll>b__0 REMOVEALL-ACCOUNT-FILTER unused by cmdlets Open Unchanged 0 1 0 1 0 0 0 0
165 Security2 Security2.FileSystemAccessRule2/<>c__DisplayClass36_1 <RemoveFileSystemAccessRuleAll>b__1(IdentityReference2) Security2\FileSystem\FileSystemAccessRule2 Class\FileSystemAccessRule2.RemoveFileSystemAccessRulesAll.cs 17 1 0 True ClearAccess::ProcessRecord > FileSystemAccessRule2::RemoveFileSystemAccessRuleAll > FileSystemAccessRule2/<>c__DisplayClass36_0::<RemoveFileSystemAccessRuleAll>b__0 > FileSystemAccessRule2/<>c__DisplayClass36_1::<RemoveFileSystemAccessRuleAll>b__1 REMOVEALL-ACCOUNT-FILTER unused by cmdlets Open Unchanged 0 1 0 1 0 0 0 0
166 Security2 Security2.FileSystemAuditRule2 GetFileSystemAuditRules(FileSystemSecurity2,Boolean,Boolean,Boolean) Security2\FileSystem\FileSystemAuditRule2 Class\FileSystemAuditRule2.GetFileSystemAuditRules.cs 44 0 1 True AddAudit::ProcessRecord > FileSystemAuditRule2::GetFileSystemAuditRules INHERITED-FROM-EMPTY-LIST defensive Explained Unchanged 0 0 0 0 0 1 0 1
167 Security2 Security2.FileSystemAuditRule2 RemoveFileSystemAuditRuleAll(FileSystemSecurity2,List`1<IdentityReference2>) Security2\FileSystem\FileSystemAuditRule2 Class\FileSystemAuditRule2.RemoveFileSystemAuditRuleAll.cs 15,17 1 1 True ClearAudit::ProcessRecord > FileSystemAuditRule2::RemoveFileSystemAuditRuleAll REMOVEALL-ACCOUNT-FILTER unused by cmdlets Open Unchanged 0 1 0 1 0 1 0 1
168 Security2 Security2.FileSystemAuditRule2/<>c__DisplayClass7_0 <RemoveFileSystemAuditRuleAll>b__0(FileSystemAuditRule) Security2\FileSystem\FileSystemAuditRule2 Class\FileSystemAuditRule2.RemoveFileSystemAuditRuleAll.cs 17 1 0 True ClearAudit::ProcessRecord > FileSystemAuditRule2::RemoveFileSystemAuditRuleAll > FileSystemAuditRule2/<>c__DisplayClass7_0::<RemoveFileSystemAuditRuleAll>b__0 REMOVEALL-ACCOUNT-FILTER unused by cmdlets Open Unchanged 0 1 0 1 0 0 0 0
169 Security2 Security2.FileSystemAuditRule2/<>c__DisplayClass7_1 <RemoveFileSystemAuditRuleAll>b__1(IdentityReference2) Security2\FileSystem\FileSystemAuditRule2 Class\FileSystemAuditRule2.RemoveFileSystemAuditRuleAll.cs 17 1 0 True ClearAudit::ProcessRecord > FileSystemAuditRule2::RemoveFileSystemAuditRuleAll > FileSystemAuditRule2/<>c__DisplayClass7_0::<RemoveFileSystemAuditRuleAll>b__0 > FileSystemAuditRule2/<>c__DisplayClass7_1::<RemoveFileSystemAuditRuleAll>b__1 REMOVEALL-ACCOUNT-FILTER unused by cmdlets Open Unchanged 0 1 0 1 0 0 0 0
170 Security2 Security2.FileSystemSecurity2 .ctor(FileSystemInfo) Security2\FileSystem\FileSystemSecurity2.cs 62,63 2 0 True GetSecurityDescriptor::ProcessRecord > FileSystemSecurity2::.ctor FSSEC2-CONSTRUCTOR-FALLBACK environment-specific Explained Unchanged 0 2 0 2 0 0 0 0
171 Security2 Security2.FileSystemSecurity2 GetHashCode() Security2\FileSystem\FileSystemSecurity2.cs 275 0 1 False FSSEC2-HASHCODE-NULL defensive Explained Moved 0 0 0 0 0 1 0 1
172 Security2 Security2.FileSystemSecurity2 op_Implicit(DirectorySecurity) Security2\FileSystem\FileSystemSecurity2.cs 262 1 0 False FILESECURITY-CONVERSION unused by cmdlets Open Moved 0 1 0 1 0 0 0 0
173 Security2 Security2.FileSystemSecurity2 op_Implicit(FileSecurity) Security2\FileSystem\FileSystemSecurity2.cs 253 1 0 False FILESECURITY-CONVERSION unused by cmdlets Open Moved 0 1 0 1 0 0 0 0
174 Security2 Security2.FileSystemSecurity2 TryGetDriveRoot(FileSystemInfo,String&) Security2\FileSystem\FileSystemSecurity2.cs 130 0 1 True DisableAccessInheritance::ProcessRecord > FileSystemInheritanceInfo::GetFileSystemInheritanceInfo > FileSystemSecurity2::GetSecurity > FileSystemSecurity2::TryGetDriveRoot FSSEC2-DRIVE-LETTER-CHARS defensive Explained Moved 0 0 0 0 0 1 0 1
175 Security2 Security2.IdentityReference2 .ctor(Security.Principal.IdentityReference) Security2\IdentityReference2.cs 49 0 1 True AddAccess::ProcessRecord > BaseCmdlet::InvokeAsOwner > IdentityReference2::op_Implicit > IdentityReference2::.ctor IDENTITY-NULL-REFERENCE defensive Explained Unchanged 0 0 0 0 0 1 0 1
176 Security2 Security2.IntPtrExtensions Increment(IntPtr) Security2\Extensions.cs 15 1 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
177 Security2 Security2.RegistryAccessRule2 .ctor(RegistryAccessRule) Security2\Registry\RegistrySecurity.cs 140,142,143 3 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 3 0 3 0 0 0 0
178 Security2 Security2.RegistryAccessRule2 Dispose() Security2\Registry\RegistrySecurity.cs 180 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
179 Security2 Security2.RegistryAccessRule2 Equals(Object) Security2\Registry\RegistrySecurity.cs 166 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
180 Security2 Security2.RegistryAccessRule2 get_AccessControlType() Security2\Registry\RegistrySecurity.cs 146 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
181 Security2 Security2.RegistryAccessRule2 get_IdentityReference() Security2\Registry\RegistrySecurity.cs 148 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
182 Security2 Security2.RegistryAccessRule2 get_InheritanceFlags() Security2\Registry\RegistrySecurity.cs 149 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
183 Security2 Security2.RegistryAccessRule2 get_IsInherited() Security2\Registry\RegistrySecurity.cs 150 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
184 Security2 Security2.RegistryAccessRule2 get_Name() Security2\Registry\RegistrySecurity.cs 117,119,121,122,126,131 6 4 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 6 0 6 0 4 0 4
185 Security2 Security2.RegistryAccessRule2 get_PropagationFlags() Security2\Registry\RegistrySecurity.cs 151 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
186 Security2 Security2.RegistryAccessRule2 get_RegistryRights() Security2\Registry\RegistrySecurity.cs 147 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
187 Security2 Security2.RegistryAccessRule2 GetHashCode() Security2\Registry\RegistrySecurity.cs 170 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
188 Security2 Security2.RegistryAccessRule2 op_Implicit(RegistryAccessRule) Security2\Registry\RegistrySecurity.cs 161 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
189 Security2 Security2.RegistryAccessRule2 op_Implicit(RegistryAccessRule2) Security2\Registry\RegistrySecurity.cs 157 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
190 Security2 Security2.RegistryAccessRule2 ToString() Security2\Registry\RegistrySecurity.cs 174 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
191 Security2 Security2.RegistryEffectivePermissionEntry .ctor(IdentityReference2,UInt32,String) Security2\Registry\RegistrySecurity.cs 252,254,255,256,257,259,261,265,266,268,271 13 4 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 13 0 13 0 4 0 4
192 Security2 Security2.RegistryEffectivePermissionEntry get_AccessAsString() Security2\Registry\RegistrySecurity.cs 250 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
193 Security2 Security2.RegistryEffectivePermissionEntry get_AccessMask() Security2\Registry\RegistrySecurity.cs 224 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
194 Security2 Security2.RegistryEffectivePermissionEntry get_Account() Security2\Registry\RegistrySecurity.cs 221 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
195 Security2 Security2.RegistryEffectivePermissionEntry get_FullName() Security2\Registry\RegistrySecurity.cs 227 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
196 Security2 Security2.RegistryEffectivePermissionEntry get_Name() Security2\Registry\RegistrySecurity.cs 230,232,234,235,239,244 6 4 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 6 0 6 0 4 0 4
197 Security2 Security2.RegistryInheritanceInfo get_FullName() Security2\Registry\RegistrySecurity.cs 191 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
198 Security2 Security2.RegistryInheritanceInfo get_Name() Security2\Registry\RegistrySecurity.cs 196,198,200,201,205,210 6 4 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 6 0 6 0 4 0 4
199 Security2 Security2.RegistryKeyOpenException .ctor() Security2\Registry\RegistrySecurity.cs 333,334 2 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 2 0 2 0 0 0 0
200 Security2 Security2.RegistryKeyOpenException .ctor(Exception,Int64) Security2\Registry\RegistrySecurity.cs 347,349,350 3 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 3 0 3 0 0 0 0
201 Security2 Security2.RegistryKeyOpenException .ctor(Exception) Security2\Registry\RegistrySecurity.cs 337,338 2 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 2 0 2 0 0 0 0
202 Security2 Security2.RegistryKeyOpenException .ctor(Int64) Security2\Registry\RegistrySecurity.cs 341,343,344 3 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 3 0 3 0 0 0 0
203 Security2 Security2.RegistryKeyOpenException get_Win32ErrorCode() Security2\Registry\RegistrySecurity.cs 330 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
204 Security2 Security2.RegistryKeySetSecurityException .ctor() Security2\Registry\RegistrySecurity.cs 359,360 2 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 2 0 2 0 0 0 0
205 Security2 Security2.RegistryKeySetSecurityException .ctor(Exception,Int64) Security2\Registry\RegistrySecurity.cs 373,375,376 3 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 3 0 3 0 0 0 0
206 Security2 Security2.RegistryKeySetSecurityException .ctor(Exception) Security2\Registry\RegistrySecurity.cs 363,364 2 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 2 0 2 0 0 0 0
207 Security2 Security2.RegistryKeySetSecurityException .ctor(Int64) Security2\Registry\RegistrySecurity.cs 367,369,370 3 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 3 0 3 0 0 0 0
208 Security2 Security2.RegistryKeySetSecurityException get_Win32ErrorCode() Security2\Registry\RegistrySecurity.cs 356 1 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
209 Security2 Security2.SafeAuthzRMHandle .ctor(IntPtr) Security2\Win32\SafeHandleEx.cs 299,301,302 3 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 3 0 3 0 0 0 0
210 Security2 Security2.SafeAuthzRMHandle get_InvalidHandle() Security2\Win32\SafeHandleEx.cs 309 1 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
211 Security2 Security2.SafeHGlobalHandle .ctor(IntPtr) Security2\Win32\SafeHandleEx.cs 31,33,34 3 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 3 0 3 0 0 0 0
212 Security2 Security2.SafeHGlobalHandle AddSubReference(IEnumerable`1<SafeHGlobalHandle>) Security2\Win32\SafeHandleEx.cs 60,62,65,66 4 2 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 4 0 4 0 2 0 2
213 Security2 Security2.SafeHGlobalHandle AllocHGlobal(ICollection`1<T>) Security2\Win32\SafeHandleEx.cs 109 1 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
214 Security2 Security2.SafeHGlobalHandle AllocHGlobal(Int32,IEnumerable`1<T>,Int32) Security2\Win32\SafeHandleEx.cs 130,132,133,135,136,139 8 2 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 8 0 8 0 2 0 2
215 Security2 Security2.SafeHGlobalHandle AllocHGlobal(Int32) Security2\Win32\SafeHandleEx.cs 184,186 1 1 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 1 0 1 0 1 0 1
216 Security2 Security2.SafeHGlobalHandle AllocHGlobal(IntPtr[]) Security2\Win32\SafeHandleEx.cs 77,79,81 3 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 3 0 3 0 0 0 0
217 Security2 Security2.SafeHGlobalHandle AllocHGlobal(String) Security2\Win32\SafeHandleEx.cs 150 1 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
218 Security2 Security2.SafeHGlobalHandle Dispose() Security2\Win32\SafeHandleEx.cs 169 0 1 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 0 0 0 0 1 0 1
219 Security2 Security2.SafeHGlobalHandle get_InvalidHandle() Security2\Win32\SafeHandleEx.cs 45 1 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
220 Security2 Security2.SafeTokenHandle .ctor() Security2\Win32\SafeHandleEx.cs 243 2 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 2 0 2 0 0 0 0
221 Security2 Security2.SafeTokenHandle .ctor(IntPtr) Security2\Win32\SafeHandleEx.cs 247,249,250 3 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 3 0 3 0 0 0 0
222 Security2 Security2.SafeTokenHandle get_InvalidHandle() Security2\Win32\SafeHandleEx.cs 256 1 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
223 Security2 Security2.SafeTokenHandle ReleaseHandle() Security2\Win32\SafeHandleEx.cs 266 1 0 False NATIVE-HANDLES unused by cmdlets Explained Unchanged 0 1 0 1 0 0 0 0
224 Security2 Security2.Win32 GetByteSecurityDescriptor(Microsoft.Win32.SafeHandles.SafeFileHandle,SecurityInformationClass) Security2\Win32\Lib.cs 346,347,350,358,360,363,365,366,367,370,371,372,374 13 2 False WIN32-RAW-DESCRIPTOR unused by cmdlets Explained Moved 0 13 0 13 0 2 0 2
225 Security2 Security2.Win32 GetEffectiveAccess(ObjectSecurity,IdentityReference2,String,Boolean&,Exception&) Security2\Win32\Lib.cs 139,140 2 0 True GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess WIN32-AUTHZ-FAILURE environment-specific Explained Moved 0 2 0 2 0 0 0 0
226 Security2 Security2.Win32 GetEffectivePermissions_AuthzAccessCheck(ObjectSecurity) Security2\Win32\Lib.cs 316 0 1 True GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzAccessCheck WIN32-AUTHZ-FAILURE environment-specific Explained Moved 0 0 0 0 0 1 0 1
227 Security2 Security2.Win32 GetEffectivePermissions_AuthzInitializeContextFromSid(IdentityReference2) Security2\Win32\Lib.cs 270,272,273,274,275,276,277,280 6 4 True GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzInitializeContextFromSid AUTHZ-LOCAL-FALLBACK environment-specific Explained Changed 6 0 0 0 3 1 0 1
228 Security2 Security2.Win32 GetEffectivePermissions_AuthzInitializeLocalResourceManager() Security2\Win32\Lib.cs 235,243 1 1 True GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzInitializeResourceManager > Win32::GetEffectivePermissions_AuthzInitializeLocalResourceManager AUTHZ-LOCAL-RM-FAILURE defensive Explained New 0 1 0 1 0 1 0 1
229 Security2 Security2.Win32 GetEffectivePermissions_AuthzInitializeResourceManager(String,Boolean&) Security2\Win32\Lib.cs 198,200,201,202,212,215 4 6 True GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzInitializeResourceManager AUTHZ-INIT-ERROR environment-specific Explained Changed 3 1 0 1 1 5 0 5
230 Security2 Security2.Win32 GetRawSecurityDescriptor(Microsoft.Win32.SafeHandles.SafeFileHandle,SecurityInformationClass) Security2\Win32\Lib.cs 341 1 0 False WIN32-RAW-DESCRIPTOR unused by cmdlets Explained Moved 0 1 0 1 0 0 0 0
231 Security2 Security2.Win32 IsLocalComputer(String) Security2\Win32\Lib.cs 155,157,174,176 3 1 True GetEffectiveAccess::ProcessRecord > EffectiveAccess::GetEffectiveAccess > Win32::GetEffectiveAccess > Win32::GetEffectivePermissions_AuthzInitializeResourceManager > Win32::IsLocalComputer WIN32-LOCAL-NAME-LOOKUP defensive Explained Changed 0 3 0 3 0 1 0 1
232 Security2 Security2.Win32RegistrySecurity GetRegistryKey(REGISTRY_ROOT,String,RegistryRights) Security2\Registry\RegistrySecurity.cs 429,431,433,435,437,440,442,444 8 0 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 8 0 8 0 0 0 0
233 Security2 Security2.Win32RegistrySecurity SetRegistryOwner(REGISTRY_ROOT,String,Security.Principal.SecurityIdentifier) Security2\Registry\RegistrySecurity.cs 448,450,451,452,454,458,459,461,463,464,466,470,473,474,478,479,481,483,484,486,490,494,495,496 24 4 False REGISTRY-MODEL unused by cmdlets Explained Unchanged 0 24 0 24 0 4 0 4

36
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Mutations.csv

@ -0,0 +1,36 @@
"Group","Id","Mutation","File","Line","TestsThatFailed","Configurations","Detected","Note"
"access","M1","Drop the WriteError for AddAceError in the retry-failed catch (swallows the error of the item)","AddAccess.cs","149","Add-NTFSAccess PathComplex: one AddAceError for the blocked path, unchanged, -PassThru only for the changed path","ElevatedDesktop, ElevatedCore","True",""
"access","M2","Remove the continue after RemoveAceError in the retry-failed catch (-PassThru writes for the failed item too)","RemoveAccess.cs","166","Remove-NTFSAccess PathComplex: one RemoveAceError for the blocked path, unchanged, -PassThru only for the changed path","ElevatedDesktop, ElevatedCore","True",""
"access","M3","Change the category of ClearAclError from WriteError to InvalidOperation in the retry-failed catch","ClearAccess.cs","89","Clear-NTFSAccess: ReadFileError and ClearAclError, each by category and target","ElevatedDesktop, ElevatedCore","True",""
"access","M4","Change the category of ReadFileError from OpenError to ReadError","GetAccess.cs","96","Get-NTFSAccess Path: the error of a missing path by category and target","ElevatedDesktop, ElevatedCore","True",""
"access","M5","Invert the orphan predicate (IsNullOrEmpty to not IsNullOrEmpty), so that it keeps resolvable accounts","GetOrphanedAccess.cs","75","All three Get-NTFSOrphanedAccess tests (Path state, Path error and pipeline, SD)","ElevatedDesktop, ElevatedCore","True",""
"access","M6","Invert the -Account filter (== to !=)","SimpleAccessCmdlets.cs","126","Get-NTFSSimpleAccess SD: filter and partition a descriptor like -Path","ElevatedDesktop, ElevatedCore","True",""
"access","M7","Default -Account changed from the current user to S-1-1-0 (Everyone)","GetEffectiveAccess.cs","15","Get-NTFSEffectiveAccess Path (allowed right present) and SecurityDescriptor (follows an in-memory change)","ElevatedDesktop, ElevatedCore","True",""
"access","M8","Gate the -AppliesTo scope conversion on a condition that is never true (EndsWith(""Simple"") to EndsWith(""NeverSimple"")), so that the Simple sets keep default flags","AddAccess.cs","113","Add-NTFSAccess PathSimple: scope the entry of the next path","ElevatedDesktop, ElevatedCore","True",""
"audit","M1","Delete the WriteError(ReadFileError) call, keep the continue","AddAudit.cs","129","Add-NTFSAudit pipeline by Path (both rows)","ElevatedDesktop, ElevatedCore","True",""
"audit","M2","Invert removeSpecific in the primary Remove call","RemoveAudit.cs","151","Remove-NTFSAudit pipeline by Path (PathSimple row), narrow-rights test","ElevatedDesktop, ElevatedCore","True",""
"audit","M3","DisableAuditInheritance(item, true) to (item, false)","ClearAudit.cs","74","Clear-NTFSAudit -DisableInheritance state test","ElevatedDesktop, ElevatedCore","True",""
"audit","M4","ErrorCategory OpenError to NotSpecified in the generic catch of the SACL read","GetAudit.cs","112","Get-NTFSAudit without the Security privilege: category test","BasicDesktop, BasicCore","True","Invisible in the elevated configurations: the mutated line is reached only without the Security privilege"
"audit","M5","ErrorId ReadError to ReadFileError for a missing path","Get-OrphanedAudit.cs","43","Get-NTFSOrphanedAudit pipeline by Path","ElevatedDesktop, ElevatedCore","True",""
"audit","M6","ErrorCategory InvalidData to InvalidOperation in TestAuditSection","BaseCmdlets.cs","159","All 7 cross-cutting rows and the Get-NTFSAudit SD pipeline test (8 failures)","ElevatedDesktop, ElevatedCore","True",""
"audit","M7","Delete the continue after the ReadFileError WriteError","RemoveAudit.cs","141","Remove-NTFSAudit pipeline by Path (both rows; cascades to a RemoveAceError NullReferenceException)","ElevatedDesktop, ElevatedCore","True",""
"audit","M8","Invert IsNullOrEmpty in the orphaned-entry filter","Get-OrphanedAudit.cs","74","Get-NTFSOrphanedAudit pipeline by Path, pipeline SD, direct SD (3 failures)","ElevatedDesktop, ElevatedCore","True",""
"audit","M9","Disable the -AppliesTo to flags conversion for the Simple sets (if (false && ...))","AddAudit.cs","114","None of the new tests","ElevatedDesktop, ElevatedCore","False","Masked on a file target: AddFileSystemAuditRule forces InheritanceFlags None and PropagationFlags None for a file. PermissionScopes.Tests.ps1 (folder targets) catches the same mutation with 24 failures"
"inheritance","1","Disable-NTFSAccessInheritance ignores -RemoveInheritedAccessRules","DisableAccessInheritance.cs","80","4 of 8 rows of the DACL protected-flag test","ElevatedDesktop, ElevatedCore","True",""
"inheritance","2","Enable-NTFSAccessInheritance ignores -RemoveExplicitAccessRules","EnableAccessInheritance.cs","80","2 of 8 rows of the DACL protected-flag test","ElevatedDesktop, ElevatedCore","True",""
"inheritance","3","GetFileSystemInheritanceInfo(item) inverts the reported access flag","FileSystemInheritanceInfo.cs","71","8 tests: ModifySdError rows, the RestoreOwnerError of Set-NTFSInheritance, two piped rows, Get-NTFSInheritance pipe, the Set-NTFSInheritance round trip","ElevatedDesktop, ElevatedCore","True",""
"inheritance","4","Get-NTFSOwner -SecurityDescriptor always returns the owner of the first descriptor","GetOwner.cs","86","Get-NTFSOwner -SecurityDescriptor, piped and passed directly","ElevatedDesktop, ElevatedCore","True",""
"inheritance","5","Set-NTFSOwner -SecurityDescriptor always sets the owner of the first descriptor","SetOwner.cs","104","Set-NTFSOwner -SecurityDescriptor, after the test got a direct multi-element array call","ElevatedDesktop, ElevatedCore","True","Not detected by the pipeline-only test: the pipeline rebinds the list to one element per item, which hides an index bug. The test was strengthened with a direct call with an array and the mutation was detected"
"inheritance","6","InvokeAsOwner swallows the error of the restore of the owner","BaseCmdlets.cs","344","The 3 RestoreOwnerError rows","ElevatedDesktop, ElevatedCore","True",""
"inheritance","7","Disable-NTFSAuditInheritance -Path loses ValueFromPipeline (keeps ValueFromPipelineByPropertyName)","DisableAuditInheritance.cs","16","None of the new tests","ElevatedDesktop, ElevatedCore","False","Get-ChildItem2 objects have a FullName property, so the binding by property name alone still binds them; only a bare string piped by value would show it"
"inheritance","8","Get-NTFSSecurityDescriptor reports NotSpecified instead of OpenError for a missing path","GetSecurityDescriptor.cs","48","OpenError for a path that does not exist","ElevatedDesktop, ElevatedCore","True",""
"inheritance","9","GetFileSystemInheritanceInfo(sd) inverts the reported audit flag","FileSystemInheritanceInfo.cs","80","Set-NTFSInheritance -SecurityDescriptor: both flags in one call","ElevatedDesktop, ElevatedCore","True",""
"inheritance","10","Set-NTFSInheritance -AccessInheritanceEnabled loses ValueFromPipelineByPropertyName","SetInheritance.cs","42","Restore a saved inheritance state through the pipeline","ElevatedDesktop, ElevatedCore","True",""
"items","M1","RemoveItem2 catch no longer writes DeleteError for an IOException","RemoveItem2.cs","101","Remove-Item2 pipeline test (expected 1 error, got 0)","ElevatedDesktop, ElevatedCore","True",""
"items","M2","GetFileHash2 generic catch no longer continues, so a null hash is written after the error","GetFileHash2.cs","113","Get-FileHash2 locked file first (expected 1 result, got 2)","ElevatedDesktop, ElevatedCore","True",""
"items","M3","GetItem2.Path loses ValueFromPipeline","GetItem2.cs","13","Get-Item2 pipeline test","ElevatedDesktop, ElevatedCore","True",""
"items","M4","RemoveItem2.Path loses ValidateNotNullOrEmpty","RemoveItem2.cs","16","All 4 rows of the Remove-Item2 empty-path test","ElevatedDesktop, ElevatedCore","True","A recursive-delete guard; the test acts only inside its own disposable sandbox folder"
"items","M5","GetDiskSpace.DriveLetter loses Position = 1","GetDiskSpace.cs","14","Get-DiskSpace positional test","ElevatedDesktop, ElevatedCore","True",""
"items","M6","GetFileHash2.Algorithm setter ignores the value and forces SHA256","GetFileHash2.cs","34","Get-FileHash2 pipeline and Algorithm test (MD5 assertion)","ElevatedDesktop, ElevatedCore","True",""
"items","M7","NewSymbolicLink no longer returns after the ResourceExists error and falls through to the create attempt","NewSymbolicLink.cs","80","New-NTFSSymbolicLink success after a failure (expected 1 error, got 2)","ElevatedDesktop, ElevatedCore","True",""
"items","M8","DisablePrivileges off by one: Count() == 0 to Count() == 1, which suppresses the error when nothing is enabled","OtherCmdlets.cs","100","Disable-Privileges error-path test","ElevatedDesktop, ElevatedCore","True",""
1 Group Id Mutation File Line TestsThatFailed Configurations Detected Note
2 access M1 Drop the WriteError for AddAceError in the retry-failed catch (swallows the error of the item) AddAccess.cs 149 Add-NTFSAccess PathComplex: one AddAceError for the blocked path, unchanged, -PassThru only for the changed path ElevatedDesktop, ElevatedCore True
3 access M2 Remove the continue after RemoveAceError in the retry-failed catch (-PassThru writes for the failed item too) RemoveAccess.cs 166 Remove-NTFSAccess PathComplex: one RemoveAceError for the blocked path, unchanged, -PassThru only for the changed path ElevatedDesktop, ElevatedCore True
4 access M3 Change the category of ClearAclError from WriteError to InvalidOperation in the retry-failed catch ClearAccess.cs 89 Clear-NTFSAccess: ReadFileError and ClearAclError, each by category and target ElevatedDesktop, ElevatedCore True
5 access M4 Change the category of ReadFileError from OpenError to ReadError GetAccess.cs 96 Get-NTFSAccess Path: the error of a missing path by category and target ElevatedDesktop, ElevatedCore True
6 access M5 Invert the orphan predicate (IsNullOrEmpty to not IsNullOrEmpty), so that it keeps resolvable accounts GetOrphanedAccess.cs 75 All three Get-NTFSOrphanedAccess tests (Path state, Path error and pipeline, SD) ElevatedDesktop, ElevatedCore True
7 access M6 Invert the -Account filter (== to !=) SimpleAccessCmdlets.cs 126 Get-NTFSSimpleAccess SD: filter and partition a descriptor like -Path ElevatedDesktop, ElevatedCore True
8 access M7 Default -Account changed from the current user to S-1-1-0 (Everyone) GetEffectiveAccess.cs 15 Get-NTFSEffectiveAccess Path (allowed right present) and SecurityDescriptor (follows an in-memory change) ElevatedDesktop, ElevatedCore True
9 access M8 Gate the -AppliesTo scope conversion on a condition that is never true (EndsWith("Simple") to EndsWith("NeverSimple")), so that the Simple sets keep default flags AddAccess.cs 113 Add-NTFSAccess PathSimple: scope the entry of the next path ElevatedDesktop, ElevatedCore True
10 audit M1 Delete the WriteError(ReadFileError) call, keep the continue AddAudit.cs 129 Add-NTFSAudit pipeline by Path (both rows) ElevatedDesktop, ElevatedCore True
11 audit M2 Invert removeSpecific in the primary Remove call RemoveAudit.cs 151 Remove-NTFSAudit pipeline by Path (PathSimple row), narrow-rights test ElevatedDesktop, ElevatedCore True
12 audit M3 DisableAuditInheritance(item, true) to (item, false) ClearAudit.cs 74 Clear-NTFSAudit -DisableInheritance state test ElevatedDesktop, ElevatedCore True
13 audit M4 ErrorCategory OpenError to NotSpecified in the generic catch of the SACL read GetAudit.cs 112 Get-NTFSAudit without the Security privilege: category test BasicDesktop, BasicCore True Invisible in the elevated configurations: the mutated line is reached only without the Security privilege
14 audit M5 ErrorId ReadError to ReadFileError for a missing path Get-OrphanedAudit.cs 43 Get-NTFSOrphanedAudit pipeline by Path ElevatedDesktop, ElevatedCore True
15 audit M6 ErrorCategory InvalidData to InvalidOperation in TestAuditSection BaseCmdlets.cs 159 All 7 cross-cutting rows and the Get-NTFSAudit SD pipeline test (8 failures) ElevatedDesktop, ElevatedCore True
16 audit M7 Delete the continue after the ReadFileError WriteError RemoveAudit.cs 141 Remove-NTFSAudit pipeline by Path (both rows; cascades to a RemoveAceError NullReferenceException) ElevatedDesktop, ElevatedCore True
17 audit M8 Invert IsNullOrEmpty in the orphaned-entry filter Get-OrphanedAudit.cs 74 Get-NTFSOrphanedAudit pipeline by Path, pipeline SD, direct SD (3 failures) ElevatedDesktop, ElevatedCore True
18 audit M9 Disable the -AppliesTo to flags conversion for the Simple sets (if (false && ...)) AddAudit.cs 114 None of the new tests ElevatedDesktop, ElevatedCore False Masked on a file target: AddFileSystemAuditRule forces InheritanceFlags None and PropagationFlags None for a file. PermissionScopes.Tests.ps1 (folder targets) catches the same mutation with 24 failures
19 inheritance 1 Disable-NTFSAccessInheritance ignores -RemoveInheritedAccessRules DisableAccessInheritance.cs 80 4 of 8 rows of the DACL protected-flag test ElevatedDesktop, ElevatedCore True
20 inheritance 2 Enable-NTFSAccessInheritance ignores -RemoveExplicitAccessRules EnableAccessInheritance.cs 80 2 of 8 rows of the DACL protected-flag test ElevatedDesktop, ElevatedCore True
21 inheritance 3 GetFileSystemInheritanceInfo(item) inverts the reported access flag FileSystemInheritanceInfo.cs 71 8 tests: ModifySdError rows, the RestoreOwnerError of Set-NTFSInheritance, two piped rows, Get-NTFSInheritance pipe, the Set-NTFSInheritance round trip ElevatedDesktop, ElevatedCore True
22 inheritance 4 Get-NTFSOwner -SecurityDescriptor always returns the owner of the first descriptor GetOwner.cs 86 Get-NTFSOwner -SecurityDescriptor, piped and passed directly ElevatedDesktop, ElevatedCore True
23 inheritance 5 Set-NTFSOwner -SecurityDescriptor always sets the owner of the first descriptor SetOwner.cs 104 Set-NTFSOwner -SecurityDescriptor, after the test got a direct multi-element array call ElevatedDesktop, ElevatedCore True Not detected by the pipeline-only test: the pipeline rebinds the list to one element per item, which hides an index bug. The test was strengthened with a direct call with an array and the mutation was detected
24 inheritance 6 InvokeAsOwner swallows the error of the restore of the owner BaseCmdlets.cs 344 The 3 RestoreOwnerError rows ElevatedDesktop, ElevatedCore True
25 inheritance 7 Disable-NTFSAuditInheritance -Path loses ValueFromPipeline (keeps ValueFromPipelineByPropertyName) DisableAuditInheritance.cs 16 None of the new tests ElevatedDesktop, ElevatedCore False Get-ChildItem2 objects have a FullName property, so the binding by property name alone still binds them; only a bare string piped by value would show it
26 inheritance 8 Get-NTFSSecurityDescriptor reports NotSpecified instead of OpenError for a missing path GetSecurityDescriptor.cs 48 OpenError for a path that does not exist ElevatedDesktop, ElevatedCore True
27 inheritance 9 GetFileSystemInheritanceInfo(sd) inverts the reported audit flag FileSystemInheritanceInfo.cs 80 Set-NTFSInheritance -SecurityDescriptor: both flags in one call ElevatedDesktop, ElevatedCore True
28 inheritance 10 Set-NTFSInheritance -AccessInheritanceEnabled loses ValueFromPipelineByPropertyName SetInheritance.cs 42 Restore a saved inheritance state through the pipeline ElevatedDesktop, ElevatedCore True
29 items M1 RemoveItem2 catch no longer writes DeleteError for an IOException RemoveItem2.cs 101 Remove-Item2 pipeline test (expected 1 error, got 0) ElevatedDesktop, ElevatedCore True
30 items M2 GetFileHash2 generic catch no longer continues, so a null hash is written after the error GetFileHash2.cs 113 Get-FileHash2 locked file first (expected 1 result, got 2) ElevatedDesktop, ElevatedCore True
31 items M3 GetItem2.Path loses ValueFromPipeline GetItem2.cs 13 Get-Item2 pipeline test ElevatedDesktop, ElevatedCore True
32 items M4 RemoveItem2.Path loses ValidateNotNullOrEmpty RemoveItem2.cs 16 All 4 rows of the Remove-Item2 empty-path test ElevatedDesktop, ElevatedCore True A recursive-delete guard; the test acts only inside its own disposable sandbox folder
33 items M5 GetDiskSpace.DriveLetter loses Position = 1 GetDiskSpace.cs 14 Get-DiskSpace positional test ElevatedDesktop, ElevatedCore True
34 items M6 GetFileHash2.Algorithm setter ignores the value and forces SHA256 GetFileHash2.cs 34 Get-FileHash2 pipeline and Algorithm test (MD5 assertion) ElevatedDesktop, ElevatedCore True
35 items M7 NewSymbolicLink no longer returns after the ResourceExists error and falls through to the create attempt NewSymbolicLink.cs 80 New-NTFSSymbolicLink success after a failure (expected 1 error, got 2) ElevatedDesktop, ElevatedCore True
36 items M8 DisablePrivileges off by one: Count() == 0 to Count() == 1, which suppresses the error when nothing is enabled OtherCmdlets.cs 100 Disable-Privileges error-path test ElevatedDesktop, ElevatedCore True

65
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-ParameterSets.csv

@ -0,0 +1,65 @@
"Group","Cmdlet","ParameterSet","Default","TestInvocationsScan","LiveInvocationsScan","AmbiguousInvocationsThatMayBindIt","BoundBy","StateAssertion","ErrorAssertion","PipelineInput","Continuation","OutputAssertion","KeyTests","LiveEvidence","Gap","GapKind","Evidence","StatusAfter","NewTests","Remaining","Reason"
"access","Add-NTFSAccess","PathComplex","True","33","6","1","36","Yes","Yes","No","Partly","Yes","Access.Tests.ps1:740 Should write an AddAceError for each item, change nothing, and return nothing with -PassThru | PathErrors.Tests.ps1:178 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | Access.Tests.ps1:807 Should write all entries of the item after the change | PathErrors.Tests.ps1:230 Add-NTFSAccess should take ownership, add the entry, and set the owner back","6: SMB share as delegated and domain accounts - add keeps the owner (#34), add by foreign-domain account name, deny-entry fixtures (Live:253, 877, 927, 987, 1038, 1280)","No test pipes anything into the set (FileInfo/DirectoryInfo, or objects with Account/AccessRights properties), and none combines -PassThru with one failing and one succeeding path: continuation (PathErrors:178, no -PassThru) and no output after a failure (Access:740, all items fail) are asserted in separate tests. Several -Account values, a Deny entry written through -Path (type, no Synchronize) and positional binding are untested.","TestNeeded","Access.Tests.ps1:740-751 asserts ErrorId, category WriteError, TargetObject, ArgumentException, no output and unchanged SDDL for two failing paths; PathErrors.Tests.ps1:178-192 asserts one error with the blocked target, its SDDL unchanged and the next item's entry added; Access.Tests.ps1:807-815 asserts type, entry count and the added entry of -PassThru. BoundBy = scan 33 + PathErrors:108 and :178 (& $Command) + PermissionScopes:86 (splat, Form=Flags, Source=Path); about 14 of the 36 calls are the subject of an assertion, the rest are fixtures.","Partly","ParameterSets.Access.Tests.ps1:72,73 Should add one explicit entry for each path bound through the pipeline, by FullName and by property name, leaving the rest of each item unchanged | ParameterSets.Access.Tests.ps1:102 Should write one AddAceError for the blocked path, leave it unchanged, and return -PassThru entries only for the path it changed","several -Account values in one call; a Deny entry written through -Path checked for AccessControlType=Deny and no auto-added Synchronize; positional binding (Add-NTFSAccess $path $account $rights)","budget (all three; proposal 1c was traded for the pipeline and PassThru-combined tests)"
"access","Add-NTFSAccess","PathSimple","False","6","1","2","8","Partly","No","No","No","Yes","PermissionScopes.Tests.ps1:86 Should add and remove <Name> using <Form> on <Source>, preserving the other account | PermissionScopes.Tests.ps1:110 Should apply <Name> only to its intended descendants, including the OneLevel boundary | Access.Tests.ps1:1035 Should name the folder of an inheritable entry, also with -ExcludeExplicit | ObjectApis.Tests.ps1:747 Should name the item of a descriptor and write it to a folder by its path","1: SMB share - Deny ReadPermissions entry with -AppliesTo ThisFolderOnly as a fixture of the unknown-parent case (Live:1039); no assertion on the set itself","No test makes the set fail (missing path, denied write, deny entry without rights), pipes into it, or reads its result back with .NET: every read-back goes through -PassThru or Get-NTFSAccess. -AccessType Deny with -AppliesTo and the exclusion of -AppliesTo with -InheritanceFlags are untested.","TestNeeded","PermissionScopes.Tests.ps1:86-94 asserts type, flags, rights and ConvertToApplyTo of the -PassThru entry for 13 scopes (Form=AppliesTo, Source=Path) and :110-133 asserts which descendants inherit it, both read through the module's own cmdlets. Access.Tests.ps1:1035, Inheritance.Tests.ps1:326/365/474 and ObjectApis.Tests.ps1:747 use the set as a fixture. BoundBy = scan 6 + the splats PermissionScopes:84 and :86 (Source=Path); 2 of the 8 calls are the subject of an assertion.","Partly","ParameterSets.Access.Tests.ps1:247,259 Should report a missing path's error by category and target, still scope the next path's entry, and keep binding -Path through the pipeline once -AppliesTo selects the set | ParameterSets.Access.Tests.ps1:769 Should require -AppliesTo only in the Simple parameter sets, -InheritanceFlags/-PropagationFlags only in the Complex parameter sets, and reject combining -AppliesTo with -InheritanceFlags without changing the item","a denied write for this set; a Deny entry without rights (-AccessType Deny -AccessRights None) for this set; -AccessType Deny combined with -AppliesTo","budget (all three; the write-denial code path is shared with PathComplex and already covered there)"
"access","Add-NTFSAccess","SDSimple","False","2","0","2","4","Partly","No","No","No","Yes","Access.Tests.ps1:898 Add-NTFSAccess should still take -AppliesTo for a security descriptor | PermissionScopes.Tests.ps1:86 Should add and remove <Name> using <Form> on <Source>, preserving the other account | SecurityDescriptor.Tests.ps1:355 Should write the descriptor and report a read error for -PassThru, not a write error","0","Only InheritanceFlags for ThisFolderOnly is read back from the descriptor with .NET (Access:898); the 13 scopes are checked through the cmdlet's own -PassThru, and no test pipes descriptors in or passes several. A failing change (for example a deny entry without rights) ends the cmdlet with a terminating error and no test pins it (open item 1).","MaintainerDecision","Access.Tests.ps1:898-902 reads the rule from $sd.SecurityDescriptor with .NET; PermissionScopes.Tests.ps1:86-97 asserts type, flags, rights and, for Source=SecurityDescriptor, that the SDDL on disk is unchanged (13 cases). BoundBy = scan 2 (Access:898; SecurityDescriptor:355 is a fixture) + the splats PermissionScopes:84 and :86 (Source=SecurityDescriptor, Form=AppliesTo).","MaintainerDecision","","all 13 scopes read back with .NET for Source=SecurityDescriptor (only ThisFolderOnly already was, pre-existing); piped descriptors; several descriptors; the failing-change (deny entry without rights) terminating error, not pinned","budget (the 13-scope/pipe/several items, notes proposal (b2)#1 not implemented); MaintainerDecision (the failing-change open item)"
"access","Add-NTFSAccess","SDComplex","False","14","2","1","16","Yes","No","No","No","Yes","Access.Tests.ps1:822 Should write all entries of a security descriptor after the change and leave the item unchanged | Access.Tests.ps1:887 Add-NTFSAccess should apply the entry to the folder, its subfolders, and files by default | SecurityDescriptor.Tests.ps1:81 Should write the entry as the only explicit entry of the item | PermissionScopes.Tests.ps1:86 Should add and remove <Name> using <Form> on <Source>, preserving the other account","2: SMB share - descriptor written back keeps the owner (#34, Live:316) and the fixture of the later-command cases (Live:1151)","No test pipes descriptors into the cmdlet, and arrays of descriptors appear only as fixtures of Set-NTFSSecurityDescriptor (SecurityDescriptor.Tests.ps1:306, :324; PipelineControl.Tests.ps1:211). A failing descriptor (deny entry without rights) ends the cmdlet with a terminating error and no test pins it (open item 1).","MaintainerDecision","Access.Tests.ps1:822-827 asserts that -PassThru writes as many entries as $sd.SecurityDescriptor holds, one new explicit entry, and no Everyone entry on disk; :887-892 reads the default flags back with .NET; SecurityDescriptor.Tests.ps1:81-86 asserts exactly one explicit entry on disk after Set-NTFSSecurityDescriptor. BoundBy = scan 14 + Access:872 (& $_, asserts only no throw) + PermissionScopes:86 (splat); 5 of the 16 calls are the subject of an assertion.","MaintainerDecision","","piped descriptors into the cmdlet; arrays of descriptors used only as Set-NTFSSecurityDescriptor fixtures, not asserted for Add itself; the failing descriptor (deny entry without rights) terminating error, not pinned","budget (the pipe/array items, notes proposal (b2)#2 not implemented); MaintainerDecision (the failing-descriptor open item)"
"access","Remove-NTFSAccess","PathComplex","True","13","2","2","17","Yes","Yes","Yes","Partly","Partly","Access.Tests.ps1:539 Should write a RemoveAceError for each item, change nothing, and return nothing with -PassThru | Access.Tests.ps1:617 Should remove an inherit-only entry that Get-NTFSAccess returned, and nothing else | PathErrors.Tests.ps1:178 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | Access.Tests.ps1:651 Should take only the requested generic right from the entry of the account when another account has an exact entry","2: SMB share - remove keeps the owner (#34, Live:264), remove by foreign-domain account name (Live:886)","No test combines -PassThru with one failing and one succeeding path, none asserts the type or the complete entry list of the -PassThru output, and the pipeline test pipes a single entry per case. Several -Account values and positional binding are untested.","TestNeeded","Access.Tests.ps1:539-550 asserts ErrorId, category, target, ArgumentException, no output and unchanged SDDL for two paths; :616-620 pipes Get-NTFSAccess output (binding by property name) and asserts the exact SDDL minus the entry in 3 cases; PathErrors.Tests.ps1:178-192 asserts the next item's entry is removed after one error. BoundBy = scan 13 + Access:617 (pipeline, resolves to PathComplex), PathErrors:108 and :178 (& $Command), PermissionScopes:99 (splat, Form=AppliesTo, Source=Path); all 17 calls are the subject of an assertion.","Partly","ParameterSets.Access.Tests.ps1:287 Should write one RemoveAceError for the blocked path, leave it unchanged, and return -PassThru entries only for the path it changed","the -PassThru output's count is not checked against the complete entry list of the surviving item (only non-emptiness, type, FullName, and absence of the removed account); the pipeline test still pipes only a single entry per call; several -Account values; positional binding","budget (all four)"
"access","Remove-NTFSAccess","PathSimple","False","0","0","2","1","Partly","No","No","No","Partly","PermissionScopes.Tests.ps1:99 Should add and remove <Name> using <Form> on <Source>, preserving the other account","0","Only the -RemoveSpecific form with -PassThru is bound (13 scopes, Form=Flags); removing rights without -RemoveSpecific, a Deny entry, a missing or denied path, several paths and piped input are untested for this set, and nothing reads the item back with .NET.","TestNeeded","BoundBy = 1 although the scan found 0: PermissionScopes.Tests.ps1:99 binds -AppliesTo when Form is Flags (add with flags, remove with -AppliesTo), 13 cases with Source=Path; it asserts that the account's entry is gone from the -PassThru output and the keeper stays once (:101-102) and that Get-NTFSAccess finds nothing (:103). No other test binds -AppliesTo with Remove-NTFSAccess.","Partly","ParameterSets.Access.Tests.ps1:376 Should take only the requested rights from an entry scoped by -AppliesTo without -RemoveSpecific, keep its flags, and leave another account's entry untouched","a Deny entry's rights-reduction without -RemoveSpecific; a missing or denied path for this set; several paths in one call; piped input","budget (all four; the shared path-resolution/write-denial code is already covered for PathComplex)"
"access","Remove-NTFSAccess","SDSimple","False","0","0","2","1","Partly","No","No","No","Partly","PermissionScopes.Tests.ps1:99 Should add and remove <Name> using <Form> on <Source>, preserving the other account","0","Same single splat test as PathSimple with a descriptor: the removal is read back only through -PassThru and Get-NTFSAccess, the item on disk is not checked after it, and nothing tests removal without -RemoveSpecific, piped descriptors or several descriptors. A failing removal ends the cmdlet with a terminating error and no test pins it (open item 1).","MaintainerDecision","BoundBy = 1 although the scan found 0: PermissionScopes.Tests.ps1:99 binds the set for Source=SecurityDescriptor, Form=Flags (13 cases) and asserts the -PassThru output (:101-102) and Get-NTFSAccess -SecurityDescriptor (:103) after the removal; the SDDL check at :96 runs before the removal.","MaintainerDecision","","removal read back only through -PassThru/Get-NTFSAccess, not the item on disk after it; removal without -RemoveSpecific; piped descriptors; several descriptors; the failing removal terminating error, not pinned","budget (the read-back/RemoveSpecific/pipe/several items, notes proposal (b2)#3 not implemented); MaintainerDecision (the failing-removal open item)"
"access","Remove-NTFSAccess","SDComplex","False","4","0","2","6","Partly","No","No","No","Partly","Access.Tests.ps1:915 Remove-NTFSAccess should remove a deny entry from the descriptor and leave the item unchanged | Access.Tests.ps1:682 Should remove an entry that matches exactly | Access.Tests.ps1:688 Should take the rights away from a matching entry without -RemoveSpecific | Access.Tests.ps1:676 Should keep an entry that does not match exactly","0","No test removes an entry that exists on disk from a descriptor and checks that the item keeps it until Set-NTFSSecurityDescriptor: the entries of Access:676-688 and :915 are added in memory only, so a write-through would go unnoticed. No piped or multiple descriptors, and a failing removal ends the cmdlet with a terminating error (open item 1).","MaintainerDecision","Access.Tests.ps1:676-692 reads $sd.SecurityDescriptor with .NET for -RemoveSpecific (kept or removed) and for the rights removal; :915-920 removes an in-memory Deny entry and checks that no such entry is on disk, which also holds if both cmdlets wrote through. BoundBy = scan 4 + Access:872 (& $_, no throw only) + PermissionScopes:99 (splat, Form=AppliesTo, Source=SecurityDescriptor, -PassThru check).","MaintainerDecision","","no test removes an on-disk entry from a descriptor and checks the item keeps it until Set-NTFSSecurityDescriptor (write-through check); no piped or multiple descriptors; the failing removal terminating error, not pinned","budget (the write-through/pipe/several items, notes proposal (b2)#3 not implemented); MaintainerDecision (the failing-removal open item)"
"access","Clear-NTFSAccess","Path","True","6","2","0","8","Partly","Partly","No","Yes","NA","PathErrors.Tests.ps1:178 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | Access.Tests.ps1:932 Should leave the item with an empty, protected DACL | PathErrors.Tests.ps1:271 Clear-NTFSAccess -DisableInheritance should take ownership, clear and protect the DACL, and not set an unchanged owner back | PathErrors.Tests.ps1:289 Clear-NTFSAccess -DisableInheritance should report RestoreOwnerError for a previous owner that it cannot set back","2: SMB share - clear keeps the owner (#34, Live:274); -DisableInheritance as the owner takes ownership without a RestoreOwnerError (Live:957)","No test asserts that a plain Clear leaves the inherited entries and the inheritance flag untouched, or clears a folder (all unit tests use files). ClearAclError and ReadFileError are asserted by ErrorId and target without category, and nothing is piped in.","TestNeeded","PathErrors.Tests.ps1:178-192 asserts one ClearAclError for the blocked path, its SDDL unchanged and no explicit entry on the next item; Access.Tests.ps1:932-936 and PathErrors.Tests.ps1:271-277 assert a protected, empty DACL and the unchanged owner with .NET; PathErrors.Tests.ps1:289-294 asserts RestoreOwnerError with category WriteError and target (elevated only). BoundBy = scan 6 + PathErrors:108 and :178 (& $Command); 7 of the 8 calls are the subject of an assertion.","Closed","ParameterSets.Access.Tests.ps1:409 Should clear each piped folder's explicit entries, including an inherit-only one, and leave inherited entries and the owner untouched | ParameterSets.Access.Tests.ps1:434,445 Should report a missing path's ReadFileError and a blocked path's ClearAclError, each by category and target","",""
"access","Clear-NTFSAccess","SD","False","3","1","0","3","Partly","No","No","No","NA","SecurityDescriptorSets.Tests.ps1:60 Clear-NTFSAccess -DisableInheritance should leave the descriptor with an empty, protected DACL | SecurityDescriptorSets.Tests.ps1:45 Clear-NTFSAccess should remove the explicit access entries of the descriptor | SecurityDescriptor.Tests.ps1:236 Should not report an owner that did not change when the write that took ownership leaves an empty DACL","1: SMB share - cleared descriptor written with Set-NTFSSecurityDescriptor without a RestoreOwnerError (Live:966)","No test checks that a plain Clear of a descriptor keeps its inherited entries and inheritance flag, pipes descriptors in, or passes several. The set has no per-item handler and no test makes it fail; it is not among the open items, so no test is proposed for that.","TestNeeded","SecurityDescriptorSets.Tests.ps1:45-50 asserts 0 explicit entries in the descriptor, 1 still on disk, then 0 after Set-NTFSSecurityDescriptor; :60-68 asserts a protected, empty DACL in memory, the DACL on disk unchanged and the written result; SecurityDescriptor.Tests.ps1:236-244 asserts that the owner stays after the write (the call there is a fixture of a Set-NTFSSecurityDescriptor test). BoundBy = 3 (no ambiguous calls).","Closed","ParameterSets.Access.Tests.ps1:468 Should clear each piped descriptor's explicit entries in memory, leave the items unchanged until Set-NTFSSecurityDescriptor, and keep the owner","",""
"access","Get-NTFSAccess","Path","True","25","3","2","29","NA","Partly","No","Yes","Partly","PathErrors.Tests.ps1:108 <Command> should write a <ErrorId> for it and continue with the next path | PathErrors.Tests.ps1:145 <Command> should write a ReadSecurityError for it and continue with the next path | Access.Tests.ps1:55 Should return the entries of the first item once | DriveRoot.Tests.ps1:34 Get-NTFSAccess should return the access entries of the root folder","3: SMB share - entries of a path longer than 260 characters, foreign-domain account entries, unknown-parent InheritedFrom (Live:543, 859, 1048)","No test pipes FileInfo/DirectoryInfo into the set (or passes a folder object by position, #88), asserts what it returns without -Path (Owner.Tests.ps1:98 only checks that nothing throws), or asserts the category of ReadFileError and ReadSecurityError (the latter is WriteError after a failed ownership retry, see notes). No test asserts the emitted type or the declared OutputType.","TestNeeded","PathErrors.Tests.ps1:108-115 and :145-152 assert one error with ErrorId and target and output for the next path; Access.Tests.ps1:55-59 asserts the first item's entries appear once after a failing path, but the path fails only without elevation; Access.Tests.ps1:1108-1118 asserts a NULL DACL gives one entry with Sid, IsInherited and InheritedFrom, and DriveRoot.Tests.ps1:34-36 that the SID list equals Get-Acl. BoundBy = scan 25 + PathErrors:108/:145 + Owner.Tests.ps1:98 (& $cmdlet, no throw only) + PermissionScopes:103 (splat, Source=Path).","Partly","ParameterSets.Access.Tests.ps1:500,502,512 Should return the same entries for a folder bound through the pipeline and by position, and report a missing path's error by category and target | ParameterSets.Access.Tests.ps1:745 <Name> should declare <Types> as its output type","what the cmdlet returns without -Path at all (beyond not throwing, Owner.Tests.ps1:98); the category of ReadSecurityError after a failed ownership retry; BeOfType on an actual emitted object (only the declared OutputType is asserted)","budget (the no -Path case); would-pin (ReadSecurityError is WriteError after a failed retry but OpenError from the generic catch - asserting a category here would cement that inconsistency, per the notes); budget (BeOfType on a live object)"
"access","Get-NTFSAccess","SD","False","1","0","2","3","NA","No","Partly","No","Partly","SecurityDescriptorSets.Tests.ps1:139 Get-NTFSAccess should return the entries that it returns for the path | Access.Tests.ps1:1098 Should read a security descriptor with audit entries and name the same folders | PermissionScopes.Tests.ps1:103 Should add and remove <Name> using <Form> on <Source>, preserving the other account","0","No test uses -Account, -ExcludeExplicit or -ExcludeInherited with a descriptor except the empty-result check of PermissionScopes:103, so an entry added to the descriptor in memory is never shown in the output; no test passes several descriptors or pipes more than one. The set has no per-item handler and no failing descriptor is tested.","TestNeeded","SecurityDescriptorSets.Tests.ps1:139-143 pipes one descriptor and compares Sid, rights and IsInherited of every entry with the -Path result (one item; the output cannot tell the SecurityDescriptor parameter from -Path bound by FullName); Access.Tests.ps1:1098-1103 (elevated only) compares count and InheritedFrom with the path result. BoundBy = scan 1 + SecurityDescriptorSets:139 (pipeline) + PermissionScopes:103 (splat, Source=SecurityDescriptor, asserts only an empty result).","Partly","ParameterSets.Access.Tests.ps1:528,533,535,542 Should filter an entry added to a descriptor in memory by -Account, partition it with -ExcludeInherited and -ExcludeExplicit, and read two descriptors bound through the pipeline","no failing descriptor is tested for this set (no per-item handler)","Limit (the SD loop has no try/catch; an exception would be unhandled and terminating, not a graceful per-item error - the same situation as the Clear-NTFSAccess SD row, which the notes explicitly excuse and this row's Gap text does not)"
"access","Get-NTFSOrphanedAccess","Path","False","4","4","0","6","NA","Partly","No","Partly","Partly","Access.Tests.ps1:218 Should return the entries whose account cannot be resolved | Access.Tests.ps1:222 Should return only the entries of -Account | PathErrors.Tests.ps1:145 <Command> should write a ReadSecurityError for it and continue with the next path | PipelineControl.Tests.ps1:148 <Name> should stop after the first object for Select-Object -First 1 and change nothing else","4: SMB share - entry of a deleted domain account with its SID, inherited entry and -ExcludeInherited, foreign-domain accounts not reported (Live:504, 515, 516, 868)","-ExcludeExplicit and -ExcludeInherited are untested in unit tests (lab only), and PathErrors runs this cmdlet with Output=false, so no test shows that the next path is processed after an error; no pipeline input and no category for ReadFileError or ReadSecurityError. A read failure other than access denied is written as a warning, which no test reaches.","TestNeeded","Access.Tests.ps1:218-225 asserts 2 orphaned entries and, for -Account, 1 entry with its Sid; PathErrors.Tests.ps1:108-115 and :145-152 assert one error with ErrorId and target but cannot show continuation because Output is false for this cmdlet (:29, :56). BoundBy = scan 4 + PathErrors:108 and :145 (& $Command).","Partly","ParameterSets.Access.Tests.ps1:559,560,566,567 Should mark an orphaned entry explicit on its own folder and inherited on a child, partitioned by -ExcludeInherited and -ExcludeExplicit | ParameterSets.Access.Tests.ps1:576,590 Should write a ReadFileError for a missing path, still return the orphaned entry of the next path, and accept both bound through the pipeline","the category of ReadSecurityError after a failed ownership retry; a read failure other than access denied, which is written as a warning, not an error","budget (ReadSecurityError here has one consistent category, ReadError, unlike Get-NTFSAccess, so it was safely assertable but not attempted); would-pin (the warning-not-error choice; the notes explicitly decline to propose pinning it)"
"access","Get-NTFSOrphanedAccess","SD","False","1","0","0","1","NA","No","No","No","Partly","Access.Tests.ps1:231 Should read the entries of a security descriptor","0","Only the count (2) and FullName are asserted; -Account, -ExcludeExplicit and -ExcludeInherited with a descriptor, the orphaned Sids, several or piped descriptors, and a descriptor changed in memory are untested.","TestNeeded","BoundBy = 1 (unambiguous; the cmdlet has no ambiguous rows): Access.Tests.ps1:231-234 asserts 2 entries, each with FullName equal to the file. Nothing else binds the set.","Partly","ParameterSets.Access.Tests.ps1:605,606,607,617 Should filter a descriptor's orphaned entries by -Account, report both orphaned Sids by default, exclude them all with -ExcludeExplicit, and read two descriptors bound through the pipeline","-ExcludeInherited with a descriptor; a descriptor changed only in memory (not written to disk) still reporting its orphaned entries","budget (both; the same fixture already built in this test could have been extended)"
"access","Get-NTFSSimpleAccess","Path","False","20","1","2","21","NA","Partly","Yes","Yes","Yes","Access.Tests.ps1:353 Should report all entries of the first folder and of the following folder only what the parent does not cover | Access.Tests.ps1:362 Should compare the folders from the pipeline in the same way | Access.Tests.ps1:485 Should write an error for a path that does not exist and continue with the next path | Access.Tests.ps1:267 Should show the entries as a table with the account, the rights, and the type","1: SMB share - parent folder first and for the subfolder only its own entry, as the delegated account (Live:832)","The ReadError of a missing path is asserted by ErrorId only (no category or target), and no test makes a folder unreadable: unlike Get-NTFSAccess the cmdlet does not retry as the owner, so what an unreadable folder reports is unpinned.","TestNeeded","Access.Tests.ps1:353-358 and :362-364 assert all 4 entries of the parent and only the child's own entry, for -Path and for Get-Item2 objects piped in; :485-490 asserts one ReadError and that every output object belongs to the next path; :267-269 asserts the table view; :251-254 and the rights-reduction cases assert Identity.Sid and AccessRights. BoundBy = scan 20 + Access:362 (pipeline, resolves to Path).","Partly","ParameterSets.Access.Tests.ps1:645 Should report an unreadable folder's error by category and target and still report the next folder's entries","the ReadError of a missing path (as opposed to an unreadable one) is still asserted by ErrorId only, without category or target","budget (Access.Tests.ps1:485 cannot be edited under a one-new-file brief, and no equivalent new test for the missing-path precondition specifically was added)"
"access","Get-NTFSSimpleAccess","SD","False","1","0","2","2","NA","No","Partly","No","Partly","Access.Tests.ps1:476 Should report the security descriptor of a file | Access.Tests.ps1:260 Should read the entries of a security descriptor","0","Only non-empty output and FullName are asserted; -Account, -ExcludeExplicit, -ExcludeInherited, the reduced rights and several descriptors are untested for the descriptor set, and no failing descriptor is tested.","TestNeeded","Access.Tests.ps1:260-263 reads one descriptor; :476-479 pipes one descriptor of a file: the -Path set skips files (Access:468-473), so a non-empty result can only come from the SD set; both assert FullName only. BoundBy = scan 1 + Access:476 (pipeline, resolves to SD).","Partly","ParameterSets.Access.Tests.ps1:666,667,671,673,674,679 Should filter and partition a descriptor's entries like the equivalent -Path call, and read two descriptors bound through the pipeline","no failing descriptor is tested for this set (no per-item handler)","Limit (same no-per-item-handler situation as the Clear-NTFSAccess SD and Get-NTFSAccess SD rows)"
"access","Get-NTFSEffectiveAccess","Path","True","11","7","1","15","NA","Yes","No","Partly","Partly","Access.Tests.ps1:1140 Should report the native identity error for each <Source> and return no access entry | Access.Tests.ps1:86 Should leave out an account without access when -ExcludeNoneAccessEntries is used | Access.Tests.ps1:145 Should return the result of this computer and warn | PathErrors.Tests.ps1:108 <Command> should write a <ErrorId> for it and continue with the next path","7: SMB share, domain and delegated accounts - rights through domain groups and file-server groups with -ServerName, fallback warning, GetEffectiveAccessError for access denied (Live:419, 428, 438, 456, 478, 486, 895)","No unit test asserts the content of the rights (for example an allow and a deny entry on a file with a protected DACL: ReadData present, WriteData absent), pipes objects in, or shows in one call that a failing path emits nothing while the next path emits only its own result. The ReadEffectivePermissionError handlers cannot be reached because the library hides its failures, and remote and group-based results need the lab.","TestNeeded","Access.Tests.ps1:1140-1153 asserts for two failing paths ErrorId GetEffectiveAccessError, category ReadError, TargetObject, Win32Exception 1332, no output and unchanged SDDL; PathErrors.Tests.ps1:108-115 asserts ReadFileError and output for the next path; Access.Tests.ps1:86-95 asserts the ExcludeNone filter and :145-157 the warning text and equal rights. BoundBy = scan 11 + Access:1140 (splat, Source=Path) + PathErrors:108/:145 + Owner.Tests.ps1:98 (& $cmdlet, no throw only).","Partly","ParameterSets.Access.Tests.ps1:695 Should report an allowed right as present and a denied right as absent for a protected DACL | ParameterSets.Access.Tests.ps1:705 Should return one result per item bound through the pipeline, in order","one call combining a failing path (for example a missing one) with a succeeding one, showing the failing path emits nothing and the next emits only its own result; the ReadEffectivePermissionError handler; remote and group-based results","budget (the failing+succeeding combination); Limit (ReadEffectivePermissionError is unreachable - the library records failures instead of throwing); Limit (remote/group-based results need the lab)"
"access","Get-NTFSEffectiveAccess","SecurityDescriptor","False","2","0","1","3","NA","Yes","No","Partly","Partly","Access.Tests.ps1:1140 Should report the native identity error for each <Source> and return no access entry | Access.Tests.ps1:132 Should name the cause in the error, not the Security privilege | Access.Tests.ps1:107 Should compute the effective access of a security descriptor","0","No test shows that the result follows an entry added to the descriptor in memory (and not the file on disk), pipes descriptors in, or passes a mix of failing and succeeding descriptors; the rights themselves are not asserted.","TestNeeded","Access.Tests.ps1:1140-1153 (Source=SecurityDescriptor, 2 descriptors) asserts the same error triple, Win32Exception 1332 and no output; :132-137 asserts one GetEffectiveAccessError that does not blame the privilege; :107-111 asserts one result with the FullName of the file. BoundBy = scan 2 + Access:1140 (splat, Source=SecurityDescriptor).","Partly","ParameterSets.Access.Tests.ps1:721,727,736 Should follow a descriptor changed only in memory while the -Path result stays on disk, and read two descriptors bound through the pipeline","a mix of a failing and a succeeding descriptor in one call","Limit (the per-item catch exists but is unreachable in a unit sandbox; the library records the Authz failure instead of throwing, per the notes)"
"audit","Add-NTFSAudit","PathComplex","True","27","4","1","30","Yes","Yes","No","Yes","Yes","Audit.Tests.ps1:147 Should write an AddAceError for each item, change nothing, and return nothing with -PassThru | Audit.Tests.ps1:629 <Command> should use a held privilege or report a missing one and continue to the next path | Audit.Tests.ps1:178 Should add the audit entry and keep the owner | PermissionScopes.Tests.ps1:146 Should add and remove <Name> using <Form> on <Source>, preserving the other account","4 (NTFSSecurity.Live.Tests.ps1:348, 385, 1010, 1016): SMB share with domain accounts; owner kept; the delegated account gets an AddAceError that names the missing privilege and leaves the SDDL unchanged; the file server counts the SACL entries (:1441)","No test pipes paths or objects into -Path, binds Account/AccessRights/AuditFlags by property name, or adds for several accounts. No test asserts the result of a succeeding path that follows a failing one (PathErrors.Tests.ps1:124 only counts errors), and the owner retry after access denied cannot run on a local volume (Limit).","TestNeeded","Audit.Tests.ps1:149-158 asserts AddAceError, WriteError, target, ArgumentException, no -PassThru output and an unchanged SACL (Get-Acl -Audit) for two failing paths; :631-669 and :672-679 assert ReadFileError/OpenError/target, the FullName of the output, the SACL rule, and unchanged DACL/owner SDDL. BoundBy 30 = scan 27 + PermissionScopes:146 (13 of 52 cases) + 2 calls through & $Command that the scan cannot see (Audit.Tests.ps1:629, PathErrors.Tests.ps1:124); 23 of the 27 scanned calls are fixtures.","Partly","ParameterSets.Audit.Tests.ps1:129 Should add the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and leave the DACL unchanged","AuditFlags not bound by property name; adding for several accounts in one call; the owner retry after access denied","budget; budget; Limit (needs a lab or a remote server)"
"audit","Add-NTFSAudit","PathSimple","False","5","0","2","7","Partly","No","No","No","Yes","PermissionScopes.Tests.ps1:146 Should add and remove <Name> using <Form> on <Source>, preserving the other account | Inheritance.Tests.ps1:386 Should set enabled=<Enable> on a <Type>, remove requested audit entries=<Remove>, and leave the DACL unchanged | Inheritance.Tests.ps1:424 Set-NTFSInheritance should re-enable audit inheritance on a <_> and keep its explicit audit entry","0","No call of this set fails on purpose, passes several paths, or pipes objects, and a conflict of -AppliesTo with -InheritanceFlags is not tested. The added entry is read back only from -PassThru and Get-NTFSAudit, and owner and DACL after the call are not asserted for this set.","TestNeeded","The only call under test is PermissionScopes.Tests.ps1:146 (Source=Path with the -AppliesTo form, 13 of 52 cases): :149-154 assert type, Inheritance/Propagation/AuditFlags and the scope name, and :161-163 that the other account remains. The other calls (PermissionScopes:144, Audit.Tests.ps1:618 and :690, Inheritance.Tests.ps1:386, :424, :503) are fixtures; BoundBy 7 = scan 5 + :144 and :146 resolved from the splat.","Closed","ParameterSets.Audit.Tests.ps1:129 Should add the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and leave the DACL unchanged | ParameterSets.Audit.Tests.ps1:314 Should reject -AppliesTo combined with -InheritanceFlags with an AmbiguousParameterSet error","",""
"audit","Add-NTFSAudit","SDSimple","False","0","0","2","2","Partly","No","No","No","Yes","PermissionScopes.Tests.ps1:146 Should add and remove <Name> using <Form> on <Source>, preserving the other account | Audit.Tests.ps1:89 Should take -Account at position 2 and -AccessRights at position 3 in the <_> parameter set","0","No test makes this set fail, passes or pipes several descriptors, or reads the changed descriptor with .NET; a descriptor without audit entries is tested only with the complex form. Exceptions of the change itself end the cmdlet (open item 1) and are not to be pinned.","TestNeeded","Only PermissionScopes.Tests.ps1:146 binds it (Source=SecurityDescriptor with -AppliesTo, 13 of 52 cases; the fixture at :144 in 26): :149-154 assert the -PassThru type and flags and :156 that the SACL of the item is unchanged (Get-Acl -Audit). Audit.Tests.ps1:89 checks the positions by reflection only; BoundBy 2 resolves the two splat calls, the scan found 0.","Partly","ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:161 Should add the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and leave the item on disk unchanged until Set-NTFSSecurityDescriptor writes it | ParameterSets.Audit.Tests.ps1:326 Should add the entry to the descriptor when -SecurityDescriptor, -Account, -AccessRights, and -AppliesTo are all named directly","exceptions from the change itself (open item 1)","MaintainerDecision (open item)"
"audit","Add-NTFSAudit","SDComplex","False","5","0","1","8","Yes","Partly","No","No","Yes","Audit.Tests.ps1:107 Should bind an account and access rights that are passed by position | Audit.Tests.ps1:120 Should return the audit entries of a security descriptor, not its access entries | SecurityDescriptor.Tests.ps1:120 Should write an added audit entry and keep the owner | Audit.Tests.ps1:425 <Command> should write an error and leave the descriptor without audit entries","0","Only the ErrorId is asserted for a descriptor without audit entries, not its category (InvalidData) or target, and no test pipes descriptors or passes several (one without audit entries), so pipeline binding and continuation are untested. Exceptions of the change itself are open item 1 and are not to be pinned.","TestNeeded","Audit.Tests.ps1:109-110 reads the in-memory SACL with .NET and :122-136 assert type, Sid, InheritanceEnabled and the unchanged access protection; SecurityDescriptor.Tests.ps1:124-126 asserts after Set-NTFSSecurityDescriptor that the owner is kept and the entry exists; PermissionScopes.Tests.ps1:156 asserts the item is untouched until written. BoundBy 8 = scan 5 + PermissionScopes:146 (13 of 52 cases) + & $Command at Audit.Tests.ps1:425 and Access.Tests.ps1:881 (Should -Not -Throw only).","Partly","ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:161 Should add the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and leave the item on disk unchanged until Set-NTFSSecurityDescriptor writes it","exceptions from the change itself (open item 1)","MaintainerDecision (open item)"
"audit","Remove-NTFSAudit","PathComplex","True","7","2","1","10","Yes","Yes","No","Yes","Yes","Audit.Tests.ps1:629 <Command> should use a held privilege or report a missing one and continue to the next path | Audit.Tests.ps1:361 Should keep an audit entry that does not match exactly, given the path | Audit.Tests.ps1:371 Should remove an audit entry that matches exactly, given the path | Audit.Tests.ps1:384 Should return the audit entries of the item, not its access entries","2 (NTFSSecurity.Live.Tests.ps1:357, 398): SMB share with domain accounts; owner kept; the delegated account gets a RemoveAceError that names the missing privilege and leaves the SDDL unchanged; the file server counts the SACL entries (:1441)","No test pipes paths or objects in, removes for several accounts, asserts the result of a succeeding path after a failing one, or removes only some rights (without -RemoveSpecific). An item without SACL is tested for no error only (Audit.Tests.ps1:406), and the owner retry cannot run on a local volume (Limit).","TestNeeded","Audit.Tests.ps1:631-669 and :672-679 assert ReadFileError/OpenError/target (RemoveAceError/WriteError/target as a basic user), the SACL changed with no rule left, and unchanged DACL/owner SDDL; :363-365 and :373-374 read back through Get-NTFSAudit. BoundBy 10 = scan 7 + PermissionScopes:159 (13 of 52 cases) + & $Command at Audit.Tests.ps1:629 and PathErrors.Tests.ps1:124; :386-388 assert type and the other entry but pass even if nothing was removed.","Partly","ParameterSets.Audit.Tests.ps1:343 Should remove the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and keep the other account's entry | ParameterSets.Audit.Tests.ps1:466 Should narrow an entry that grants more rights than it removes, instead of deleting it","removing for several accounts in one call; state (empty Audit SDDL, unchanged DACL) of an item without a SACL; the owner retry after access denied","budget; budget; Limit (needs a lab or a remote server)"
"audit","Remove-NTFSAudit","PathSimple","False","0","0","1","1","Partly","No","No","No","Partly","PermissionScopes.Tests.ps1:159 Should add and remove <Name> using <Form> on <Source>, preserving the other account","0","Only one data-driven call binds it: no failing item, pipeline input, several items, or owner and DACL check after the call, the objects are checked by Sid only, and it never runs without -RemoveSpecific.","TestNeeded","PermissionScopes.Tests.ps1:159 binds it only when Source=Path and Form=Flags (13 of 52 cases, always with -RemoveSpecific): :161-163 assert that the entry of the account is gone from -PassThru, that the other account remains, and that Get-NTFSAudit returns nothing for the account. BoundBy 1: the scan found 0 and this ambiguous splat call is the only one that binds the set.","Closed","ParameterSets.Audit.Tests.ps1:343 Should remove the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and keep the other account's entry | ParameterSets.Audit.Tests.ps1:484 Should remove the entry from the path when -Path, -Account, -AccessRights, and -AppliesTo are all named directly","",""
"audit","Remove-NTFSAudit","SDSimple","False","0","0","1","1","Partly","No","No","No","Partly","PermissionScopes.Tests.ps1:159 Should add and remove <Name> using <Form> on <Source>, preserving the other account","0","Only one data-driven call binds it: the changed descriptor is read only through -PassThru and Get-NTFSAudit, the item being untouched after the removal is not asserted, and no test makes it fail, pipes or passes several descriptors, or runs without -RemoveSpecific.","TestNeeded","PermissionScopes.Tests.ps1:159 binds it only when Source=SecurityDescriptor and Form=Flags (13 of 52 cases, always with -RemoveSpecific): :161-163 assert that the entry of the account is gone, that the other account remains, and that Get-NTFSAudit returns nothing; the SACL on disk is compared only after the Add (:156). BoundBy 1: the scan found 0 and this ambiguous splat call is the only one that binds the set.","Partly","ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:375 Should remove the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and keep the other account's entry | ParameterSets.Audit.Tests.ps1:501 Should remove the entry from the descriptor when -SecurityDescriptor, -Account, -AccessRights, and -AppliesTo are all named directly","the item on disk being untouched after the removal, until Set-NTFSSecurityDescriptor writes it","budget"
"audit","Remove-NTFSAudit","SDComplex","False","2","0","1","5","Partly","Partly","No","No","Partly","Audit.Tests.ps1:347 Should keep an audit entry that does not match exactly | Audit.Tests.ps1:353 Should remove an audit entry that matches exactly | Audit.Tests.ps1:425 <Command> should write an error and leave the descriptor without audit entries | PermissionScopes.Tests.ps1:159 Should add and remove <Name> using <Form> on <Source>, preserving the other account","0","The item being untouched after the removal and the result after Set-NTFSSecurityDescriptor are not asserted, the error test lacks category and target, and no test pipes or passes several descriptors, checks the -PassThru type, or asserts a removal without -RemoveSpecific. Exceptions of the change itself are open item 1 and are not to be pinned.","TestNeeded","Audit.Tests.ps1:349 and :355 read the in-memory SACL with .NET (non-matching entry kept, matching entry removed) and :427-432 assert one ReadSecurityError, no output and the SACL still empty; PermissionScopes.Tests.ps1:161-163 assert by Sid only. BoundBy 5 = scan 2 + PermissionScopes:159 (13 of 52 cases) + & $Command at Audit.Tests.ps1:425 and Access.Tests.ps1:881 (Should -Not -Throw only).","Partly","ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:375 Should remove the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and keep the other account's entry","the item on disk untouched after the removal and the result after Set-NTFSSecurityDescriptor; the -PassThru output type; exceptions from the change itself (open item 1)","budget; budget; MaintainerDecision (open item)"
"audit","Clear-NTFSAudit","Path","True","3","1","0","5","Yes","Yes","No","Yes","NA","Audit.Tests.ps1:629 <Command> should use a held privilege or report a missing one and continue to the next path | Audit.Tests.ps1:455 Should remove the audit entries and keep the owner | Audit.Tests.ps1:478 Should write no error and leave the access entries unchanged | Audit.Tests.ps1:495 Should write an error and leave the item unchanged","2 (NTFSSecurity.Live.Tests.ps1:652, plus :684 through & $Command that the scan cannot see): SMB share; explicit entry cleared with the inherited entry and the owner kept; the delegated account gets a ClearAclError that names the missing privilege and leaves the SDDL unchanged; the file server checks the SACL (:1453)","-DisableInheritance on a path is passed (Audit.Tests.ps1:629) but its end state (protected SACL, no copied inherited entries) is never asserted, and no test pipes paths or asserts the result of a succeeding path after a failing one. The owner retry after access denied cannot run on a local volume (Limit).","TestNeeded","Audit.Tests.ps1:457-459 asserts no error, owner kept (.NET) and no entry left (Get-NTFSAudit); :480-483 and :497-499 assert an unchanged DACL and, without the privilege, a ClearAclError with an unchanged SDDL; :631-669 and :672-679 add category and target. BoundBy 5 = scan 3 + & $Command at Audit.Tests.ps1:629 and PathErrors.Tests.ps1:124.","Partly","ParameterSets.Audit.Tests.ps1:519 Should clear the audit entries of each path taken from the pipeline and leave the DACL of each unchanged | ParameterSets.Audit.Tests.ps1:540 Should protect the SACL and not copy the parent's inherited entry when clearing a child path","the result of a succeeding path that follows a failing one; the owner retry after access denied","budget; Limit (needs a lab or a remote server)"
"audit","Clear-NTFSAudit","SD","False","2","0","0","3","Yes","Partly","No","No","NA","Audit.Tests.ps1:696 Should clear and protect the descriptor SACL without writing the <Type> | SecurityDescriptorSets.Tests.ps1:107 Clear-NTFSAudit should remove the explicit audit entries of the descriptor | Audit.Tests.ps1:425 <Command> should write an error and leave the descriptor without audit entries","0","No test pipes descriptors or passes several (one without audit entries), and the error test asserts the ErrorId but not category or target.","TestNeeded","Audit.Tests.ps1:698-705 asserts the in-memory SACL cleared and protected (.NET), the SACL of the item untouched until Set-NTFSSecurityDescriptor, then the state on disk and an unchanged DACL; SecurityDescriptorSets.Tests.ps1:109-112 asserts the same for the unprotected form. BoundBy 3 = scan 2 + & $Command at Audit.Tests.ps1:425 (error case only).","Closed","ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:561 Should clear each piped descriptor that has an audit section and continue past one that does not","",""
"audit","Get-NTFSAudit","Path","False","24","4","2","27","NA","Partly","No","Partly","Partly","Audit.Tests.ps1:529 Should name the folder that an inherited entry comes from, also with -ExcludeExplicit | Audit.Tests.ps1:48 Should write an error without the Security privilege instead of returning nothing | PathErrors.Tests.ps1:124 <Command> should write a ReadFileError for it and continue with the next path | Inheritance.Tests.ps1:387 Should set enabled=<Enable> on a <Type>, remove requested audit entries=<Remove>, and leave the DACL unchanged","4 (NTFSSecurity.Live.Tests.ps1:336, 373, 656, 657): SMB share with domain accounts; Sid, AuditFlags and rights of the entry; the delegated account gets a ReadSecurityError that names the missing privilege","No test pipes paths or FileInfo/DirectoryInfo into it, asserts the category of its errors or the target of ReadSecurityError, or (in unit tests) the type, AuditFlags and inheritance flags of the output. No unit test has a failing path followed by a path whose entries are asserted (Audit.Tests.ps1:70-73 documents that the second path of the test at :80 no longer fails), and the PermissionDenied branch cannot run on a local volume (Limit).","TestNeeded","Audit.Tests.ps1:50-52 asserts one ReadSecurityError by ErrorId only (basic user); :531-534 and :577-578 assert IsInherited and InheritedFrom; PathErrors.Tests.ps1:130-132 asserts ReadFileError and target for a missing path but discards the output (:124). BoundBy 27 = scan 24 + PermissionScopes:163 (26 of 52 cases) + & $Command at PathErrors.Tests.ps1:124 and Owner.Tests.ps1:98 (no -Path, Should -Not -Throw).","Partly","ParameterSets.Audit.Tests.ps1:590 Should return the entries of the existing path in either position and a ReadFileError, category OpenError, for the missing one | ParameterSets.Audit.Tests.ps1:619 Should return the entries of each path object taken from the pipeline by value | ParameterSets.Audit.Tests.ps1:634 Should write a ReadSecurityError with category OpenError and the path as target without the Security privilege","the PermissionDenied category branch of ReadSecurityError","Limit (needs a lab or a remote server)"
"audit","Get-NTFSAudit","SD","False","1","0","2","3","NA","Partly","Partly","No","Partly","Audit.Tests.ps1:61 Should write an error for a security descriptor that was read without the audit entries | SecurityDescriptorSets.Tests.ps1:160 Get-NTFSAudit should return the audit entries that it returns for the path | PermissionScopes.Tests.ps1:163 Should add and remove <Name> using <Form> on <Source>, preserving the other account","0","The output is compared only with the output of the Path set (no expected type, flags or values), at most one descriptor is piped, and no test passes several descriptors (one without audit entries). The error test lacks category and target.","TestNeeded","Audit.Tests.ps1:63-65 asserts no output and one ReadSecurityError; SecurityDescriptorSets.Tests.ps1:160-163 pipes one descriptor and asserts one entry equal to the Path result (Sid, AccessRights, AuditFlags); PermissionScopes.Tests.ps1:163 asserts only emptiness after a removal. BoundBy 3 = scan 1 + SecurityDescriptorSets:160 (piped by value, so SD) + PermissionScopes:163 (26 of 52 cases).","Partly","ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:648 Should return the entries of the piped descriptor that has an audit section and continue past one that does not","an expected type, flags, or values for the output, independent of comparing it to the Path set's output","budget"
"audit","Get-NTFSOrphanedAudit","Path","False","9","1","2","9","NA","Partly","No","Yes","Yes","Audit.Tests.ps1:228 Should return one object per entry whose account cannot be resolved | Audit.Tests.ps1:250 Should return an inherited entry, and nothing with -ExcludeInherited | Audit.Tests.ps1:279 Should write an error for a path that does not exist and continue with the next path without the Security privilege | Audit.Tests.ps1:304 Should write a ReadSecurityError without the Security privilege instead of returning nothing","1 (NTFSSecurity.Live.Tests.ps1:843): SMB share; the entry of a deleted domain account is returned with its SID, without error or warning","No test pipes paths into it, asserts the category of ReadError or ReadSecurityError, or runs -ExcludeExplicit, and the elevated continuation test passes on an empty result (Audit.Tests.ps1:273).","TestNeeded","Audit.Tests.ps1:230-232, :238-239 and :253-256 assert count, type, Sid and IsInherited; :282-286 (basic user) asserts ReadError for the missing path and a ReadSecurityError with its own target for the next path, which shows that the cmdlet continued, while :270-273 (elevated) asserts one error and then only a ForEach over the result. BoundBy 9 = scan 9.","Partly","ParameterSets.Audit.Tests.ps1:670 Should return the orphaned entries of each path taken from the pipeline and write a ReadError, category OpenError, for one that does not exist","the category of ReadSecurityError without the Security privilege; -ExcludeExplicit","budget; budget"
"audit","Get-NTFSOrphanedAudit","SD","False","0","0","2","2","NA","Partly","Partly","No","Partly","Audit.Tests.ps1:243 Should read the entries of a security descriptor | Audit.Tests.ps1:294 Should write an error for a security descriptor that was read without the audit entries","0","At most one descriptor is piped and none is passed in an array, so continuation is untested; -Account and -Exclude* with a descriptor, the entry type and Sid, and the category and target of the error are not asserted.","TestNeeded","Both calls pipe one descriptor, which PowerShell binds by value to -SecurityDescriptor (the elevated run of :296-298 proves it: a Path binding would return entries): :245-246 assert 2 entries with FullName and :296-298 assert no output and one ReadSecurityError. BoundBy 2 = the two ambiguous piped calls (Audit.Tests.ps1:243 and :294); the scan found 0.","Partly","ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:691 Should return the orphaned entries of the piped descriptor that has an audit section and continue past one that does not | ParameterSets.Audit.Tests.ps1:713 Should return the orphaned entries when -SecurityDescriptor is named directly","-Account and -ExcludeInherited/-ExcludeExplicit filters with a descriptor","budget"
"inheritance","Disable-NTFSAccessInheritance","Path","True","9","1","0","16","Partly","Partly","No","Partly","Yes","Inheritance.Tests.ps1:318 Should set enabled=<Enable> on a <Type>, remove requested entries=<Remove>, and report the written state | PathErrors.Tests.ps1:157 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | PathErrors.Tests.ps1:301 Disable-NTFSAccessInheritance should take ownership, protect the DACL, and set the owner back | Inheritance.Tests.ps1:133 <_> should write an error and return nothing when the security descriptor cannot be read","1 (SMB as the delegated account, NTFSSecurity.Live.Tests.ps1:281-289: no error, owner Administrators kept, DACL protected by Get-Acl)","Not asserted: the error category (OpenError, WriteError), piped input (documented: Get-ChildItem2 | Disable-NTFSAccessInheritance -PassThru), a .NET readback of the kept or removed inherited entries (only Get-NTFSAccess reads them), RestoreOwnerError, -PassThru with a failing item among several, and the documented no-op when no -Path is given.","TestNeeded","Inheritance.Tests.ps1:341-360 asserts the -PassThru object (type, FullName, flag) and reads flag, owner and entries back only with Get-NTFSInheritance, Get-NTFSOwner and Get-NTFSAccess; the .NET readbacks assert flag and owner only (PathErrors.Tests.ps1:307-309 and 183-191, DriveRoot.Tests.ps1:113). Errors: PathErrors.Tests.ps1:110-112 and 180-182 assert ErrorId and target, never the category; no test pipes into the cmdlet. BoundBy 16 = scan 9 (6 are fixtures) + 7 calls through & $Command or & $_ (PathErrors:108,178; Inheritance:139,152,339,456; Privileges:123).","Partly","ParameterSets.Inheritance.Tests.ps1:178 Should set the DACL protected flag to <Enable> and the explicit/inherited rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl | ParameterSets.Inheritance.Tests.ps1:345 <Command> should report <ErrorId> with category WriteError and target for the denied item, and still return the next item's new state with -PassThru | ParameterSets.Inheritance.Tests.ps1:368 <Command> should report RestoreOwnerError after a successful ownership retry and continue with the next path | ParameterSets.Inheritance.Tests.ps1:479 <Command> should take piped folders from Get-ChildItem2 and report the <Scope> inheritance state of each with -PassThru","OpenError category for a path that does not exist; the documented no-op without -Path","budget; budget"
"inheritance","Disable-NTFSAccessInheritance","SecurityDescriptor","False","1","0","0","2","Yes","NA","No","NA","Yes","SecurityDescriptorSets.Tests.ps1:71 Disable-NTFSAccessInheritance should protect the DACL of the descriptor and keep the inherited entries | Inheritance.Tests.ps1:543 <Command> should return the changed descriptor state without writing the <Type>","0","Not asserted: -RemoveInheritedAccessRules with a descriptor, the owner after the write, and several descriptors (array or pipeline). The set has no per-item handler, like the sets of open item 1 (which does not name it), but it cannot fail on a descriptor from Get-NTFSSecurityDescriptor.","TestNeeded","SecurityDescriptorSets.Tests.ps1:79-84 asserts the in-memory flag, the item unchanged before the write (Get-Acl), and after Set-NTFSSecurityDescriptor the flag and an explicit count equal to the inherited count (.NET); Inheritance.Tests.ps1:557-562 asserts count, FullName and flag of the -PassThru object. BoundBy 2 = scan 1 + Inheritance:555 (& $Command -SecurityDescriptor).","Partly","ParameterSets.Inheritance.Tests.ps1:255 <Command> -SecurityDescriptor should change the in-memory access entries per -<SwitchName>:<Remove>, applied to the item only after Set-NTFSSecurityDescriptor writes it | ParameterSets.Inheritance.Tests.ps1:513,547 <Command> -SecurityDescriptor should take two piped descriptors and report both in order, written only by Set-NTFSSecurityDescriptor","the owner unchanged after the descriptor write","budget"
"inheritance","Enable-NTFSAccessInheritance","Path","True","3","1","0","10","Partly","Partly","No","Partly","Yes","Inheritance.Tests.ps1:318 Should set enabled=<Enable> on a <Type>, remove requested entries=<Remove>, and report the written state | PathErrors.Tests.ps1:157 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | PathErrors.Tests.ps1:312 Enable-NTFSAccessInheritance should take ownership, let the DACL inherit, and set the owner back | DriveRoot.Tests.ps1:110 Should block and restore the access inheritance of the folder that the drive maps","1 (SMB as the delegated account, NTFSSecurity.Live.Tests.ps1:291-299: no error, owner kept, DACL inherits again by Get-Acl)","Not asserted: the error category, piped input (documented: Get-NTFSInheritance output piped into Enable-NTFSAccessInheritance -RemoveExplicitAccessRules), a .NET readback of explicit and inherited entries after the call (only Get-NTFSAccess reads them), RestoreOwnerError, -PassThru with a failing item among several, and the documented no-op when no -Path is given.","TestNeeded","Inheritance.Tests.ps1:341-360 (Enable cases) asserts the object and reads re-inherited and explicit entries back only with Get-NTFSAccess; the .NET readbacks assert flag and owner only (PathErrors.Tests.ps1:319-321 and 190-191, DriveRoot.Tests.ps1:117). Errors as for Disable: ErrorId and target (PathErrors.Tests.ps1:110-112, 180-182), no category; no piped input. BoundBy 10 = scan 3 + 7 calls through & $Command or & $_ (PathErrors:108,178; Inheritance:139,152,339,456; Privileges:123).","Partly","ParameterSets.Inheritance.Tests.ps1:178 Should set the DACL protected flag to <Enable> and the explicit/inherited rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl | ParameterSets.Inheritance.Tests.ps1:345 <Command> should report <ErrorId> with category WriteError and target for the denied item, and still return the next item's new state with -PassThru | ParameterSets.Inheritance.Tests.ps1:368 <Command> should report RestoreOwnerError after a successful ownership retry and continue with the next path | ParameterSets.Inheritance.Tests.ps1:479 <Command> should take piped folders from Get-ChildItem2 and report the <Scope> inheritance state of each with -PassThru","OpenError category for a path that does not exist; the documented no-op without -Path","budget; budget"
"inheritance","Enable-NTFSAccessInheritance","SecurityDescriptor","False","1","0","0","2","Partly","NA","No","NA","Yes","SecurityDescriptorSets.Tests.ps1:87 Enable-NTFSAccessInheritance should let the DACL of the descriptor inherit | Inheritance.Tests.ps1:543 <Command> should return the changed descriptor state without writing the <Type>","0","Not asserted: -RemoveExplicitAccessRules with a descriptor, that an explicit entry survives a plain Enable (the test descriptor has none), and several descriptors (array or pipeline). The set works in memory, so it has no error path or handler to test.","TestNeeded","SecurityDescriptorSets.Tests.ps1:94-99 asserts the in-memory flag, the item still protected, then (.NET) the flag false and inherited entries present after the write; the descriptor has no explicit entry, so kept versus removed is unasserted. Inheritance.Tests.ps1:557-562 (Enable cases) asserts count, FullName and flag. BoundBy 2 = scan 1 + Inheritance:555.","Closed","ParameterSets.Inheritance.Tests.ps1:255 <Command> -SecurityDescriptor should change the in-memory access entries per -<SwitchName>:<Remove>, applied to the item only after Set-NTFSSecurityDescriptor writes it | ParameterSets.Inheritance.Tests.ps1:513,547 <Command> -SecurityDescriptor should take two piped descriptors and report both in order, written only by Set-NTFSSecurityDescriptor","",""
"inheritance","Disable-NTFSAuditInheritance","Path","True","7","1","0","15","Partly","Yes","No","Yes","Yes","Audit.Tests.ps1:606 <Command> should use a held privilege or report a missing one and continue to the next path | Inheritance.Tests.ps1:378 Should set enabled=<Enable> on a <Type>, remove requested audit entries=<Remove>, and leave the DACL unchanged | Inheritance.Tests.ps1:256 <Command> should set the audit inheritance of a <Type> and keep its access entries | Inheritance.Tests.ps1:113 <_> should return nothing when the audit change fails","2 (SMB: Admin and ServerAdmin write it and the file server checks the SACL with Get-Acl -Audit, NTFSSecurity.Live.Tests.ps1:632 and 1453-1458; the delegated account gets ModifySdError naming the missing privilege and the folder stays unchanged, :684-690)","Unit tests read the SACL only through module cmdlets (no Get-Acl -Audit; the lab does, NTFSSecurity.Live.Tests.ps1:1453-1458), no test pipes into the set (documented: Get-ChildItem2 -Directory | Disable-NTFSAuditInheritance), and the documented no-op without -Path is untested. [Limit] The ownership retry and RestoreOwnerError of a SACL write cannot be provoked on a local volume (rule AUDIT-OWNER-RETRY).","TestNeeded","Audit.Tests.ps1:629-679 runs two paths with -PassThru: as a basic user ModifySdError/WriteError/target then ReadFileError/OpenError/target and an empty result (672-679), elevated the object flag, the explicit SACL rules and the unchanged DACL and owner (631, 654-657). Inheritance.Tests.ps1:401-419 reads the SACL back only through Get-NTFSInheritance and Get-NTFSAudit (the DACL through .NET at 405). BoundBy 15 = scan 7 + 8 calls through & $Command or & $_ (PathErrors:124; Inheritance:118,152,268,313,399; Privileges:123; Audit:629).","Partly","ParameterSets.Inheritance.Tests.ps1:220 Should set the SACL protected flag to <Enable> and the explicit/inherited audit-rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl -Audit | ParameterSets.Inheritance.Tests.ps1:479 <Command> should take piped folders from Get-ChildItem2 and report the <Scope> inheritance state of each with -PassThru","the documented no-op without -Path; a successful ownership-retry/RestoreOwnerError of a SACL write","budget; Limit, rule AUDIT-OWNER-RETRY needs a remote/SMB target"
"inheritance","Disable-NTFSAuditInheritance","SecurityDescriptor","False","1","0","0","2","Partly","NA","No","NA","Yes","Inheritance.Tests.ps1:565 <Command> should return the changed audit state without writing the <Type> | Inheritance.Tests.ps1:276 Should add no SACL to a security descriptor that was read without its audit entries","0","Not asserted: -RemoveInheritedAuditRules with a descriptor, an independent SACL readback after the write, the owner and DACL after the write, and several descriptors. The set accepts a descriptor without audit entries silently (pinned for Disable at Inheritance.Tests.ps1:276), unlike Add, Remove and Clear-NTFSAudit; see the notes.","TestNeeded","Inheritance.Tests.ps1:579-585 (elevated only) asserts count, FullName and flag of the object, the SACL SDDL unchanged until Set-NTFSSecurityDescriptor, and the flag after it, all through module cmdlets; :284-286 asserts that no SACL is added to a descriptor read without audit entries. BoundBy 2 = scan 1 (Inheritance:282) + Inheritance:577 (& $Command -SecurityDescriptor).","Partly","ParameterSets.Inheritance.Tests.ps1:513,547 <Command> -SecurityDescriptor should take two piped descriptors and report both in order, written only by Set-NTFSSecurityDescriptor","-RemoveInheritedAuditRules with a descriptor as its own dedicated state test; the owner and DACL unchanged after the write","budget; budget"
"inheritance","Enable-NTFSAuditInheritance","Path","True","1","1","0","9","Partly","Yes","No","Yes","Yes","Audit.Tests.ps1:606 <Command> should use a held privilege or report a missing one and continue to the next path | Inheritance.Tests.ps1:378 Should set enabled=<Enable> on a <Type>, remove requested audit entries=<Remove>, and leave the DACL unchanged | Inheritance.Tests.ps1:256 <Command> should set the audit inheritance of a <Type> and keep its access entries | PathErrors.Tests.ps1:118 <Command> should write a ReadFileError for it and continue with the next path","2 (SMB: the file server checks the SACL with Get-Acl -Audit, NTFSSecurity.Live.Tests.ps1:642 and 1453-1458; the delegated account gets ModifySdError naming the missing privilege and the folder stays unchanged, :684-690)","Unit tests read the SACL only through module cmdlets (no Get-Acl -Audit), the result of -RemoveExplicitAuditRules is read back only with Get-NTFSAudit, no test pipes into the set (documented: Get-NTFSInheritance output piped into Enable-NTFSAuditInheritance), and the documented no-op without -Path is untested. [Limit] The ownership retry and RestoreOwnerError of a SACL write cannot be provoked on a local volume (rule AUDIT-OWNER-RETRY).","TestNeeded","Audit.Tests.ps1:660-662 (elevated) asserts the flag true and the explicit rules removed, and :672-679 the errors as a basic user; Inheritance.Tests.ps1:259-260 and 270-272 cover an item without SACL (flag by Get-NTFSInheritance, DACL by .NET). SACL state is never read with .NET in a unit test. BoundBy 9 = scan 1 (PipelineControl:284) + 8 calls through & $Command or & $_ (PathErrors:124; Inheritance:118,152,268,313,399; Privileges:123; Audit:629).","Partly","ParameterSets.Inheritance.Tests.ps1:220 Should set the SACL protected flag to <Enable> and the explicit/inherited audit-rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl -Audit | ParameterSets.Inheritance.Tests.ps1:479 <Command> should take piped folders from Get-ChildItem2 and report the <Scope> inheritance state of each with -PassThru","the documented no-op without -Path; a successful ownership-retry/RestoreOwnerError of a SACL write","budget; Limit, rule AUDIT-OWNER-RETRY needs a remote/SMB target"
"inheritance","Enable-NTFSAuditInheritance","SecurityDescriptor","False","1","0","0","2","Partly","NA","No","NA","Yes","SecurityDescriptorSets.Tests.ps1:115 Enable-NTFSAuditInheritance should let the SACL of the descriptor inherit | Inheritance.Tests.ps1:565 <Command> should return the changed audit state without writing the <Type>","0","Not asserted: -RemoveExplicitAuditRules with a descriptor, that an explicit audit entry survives a plain Enable, an independent SACL readback after the write, and several descriptors. Enable with an access-only descriptor is pinned only through Set-NTFSInheritance (Inheritance.Tests.ps1:524-539).","TestNeeded","SecurityDescriptorSets.Tests.ps1:119-126 (elevated) asserts the in-memory flag, the item still protected (Get-NTFSInheritance) and the flag after the write; Inheritance.Tests.ps1:579-585 (Enable cases) asserts count, FullName and flag. Nothing reads the SACL with .NET. BoundBy 2 = scan 1 + Inheritance:577.","Partly","ParameterSets.Inheritance.Tests.ps1:513,547 <Command> -SecurityDescriptor should take two piped descriptors and report both in order, written only by Set-NTFSSecurityDescriptor","-RemoveExplicitAuditRules with a descriptor as its own dedicated state test; an explicit audit entry surviving a plain Enable","budget; budget"
"inheritance","Get-NTFSInheritance","Path","True","23","4","0","27","NA","Partly","No","Partly","Partly","PathErrors.Tests.ps1:104 <Command> should write a <ErrorId> for it and continue with the next path | PathErrors.Tests.ps1:140 <Command> should write a ReadSecurityError for it and continue with the next path | Inheritance.Tests.ps1:78 Should report the disabled audit inheritance of a <Type> as for its path | Inheritance.Tests.ps1:54 Should report the same state as for the path of the item","4 (SMB: protected DACL with inherited audit flag, NTFSSecurity.Live.Tests.ps1:661-666; null audit state without the Security privilege, :695-700; two of the four calls are read-backs, :636 and :646)","Not asserted: FullName, Name, type or exact count of the output, a protected state created without the module (all protected states come from the module's own cmdlets), the error category, piped input (documented: Get-ChildItem2 | Get-NTFSInheritance), and the result for no -Path (documented: current location; Owner.Tests.ps1:92 asserts -Not -Throw only). [Limit] The documented ownership retry has no success path on a local volume.","TestNeeded","Inheritance.Tests.ps1:58-59, 74-75 and 88-90 assert only the flags (the descriptor result equals the -Path result; audit false after Disable-NTFSAuditInheritance), no FullName, type or count. PathErrors.Tests.ps1:110-115 and 147-152 assert ErrorId, target and non-empty output for the next path, no category. BoundBy 27 = scan 23 + 4 calls through & $Command or & $_ (PathErrors:108,145; Owner:98; Privileges:123).","Partly","ParameterSets.Inheritance.Tests.ps1:385 <Command> should write <ErrorId> with category OpenError for a path that does not exist, and return exactly one object for the next path | ParameterSets.Inheritance.Tests.ps1:564,573 Get-NTFSInheritance should take piped folder objects from Get-ChildItem2 and a piped custom object by its FullName property","the Name property of the output; a protected state created without the module; the result for no -Path; a successful ownership-retry read","budget; budget; budget; Limit, no local volume reaches the success path"
"inheritance","Get-NTFSInheritance","SecurityDescriptor","False","4","0","0","4","NA","NA","No","NA","Partly","Inheritance.Tests.ps1:54 Should report the same state as for the path of the item | Inheritance.Tests.ps1:65 Should report the same state as for the path of a <Type> without audit entries | Inheritance.Tests.ps1:78 Should report the disabled audit inheritance of a <Type> as for its path | Inheritance.Tests.ps1:93 Should report the audit inheritance as $null for a security descriptor without the audit entries","0","Not asserted: FullName, Name, type, exact count, several descriptors, a protected descriptor created without the module, and piped descriptors (documented: Get-NTFSSecurityDescriptor | Get-NTFSInheritance). The set works in memory and cannot fail on a readable descriptor.","TestNeeded","Inheritance.Tests.ps1:58-59, 74-75, 88-90 and 100-101 compare the flags with the -Path result and assert a null audit state for an access-only descriptor; none asserts FullName, Name, type, count or several descriptors. BoundBy 4 = scan 4.","Partly","ParameterSets.Inheritance.Tests.ps1:586,596 Get-NTFSInheritance -SecurityDescriptor should take two piped descriptors, one protected, and report both in order","the type of the output (BeOfType); a protected descriptor created without the module","budget; budget"
"inheritance","Set-NTFSInheritance","Path","True","14","1","0","18","Partly","Partly","No","Partly","Partly","Inheritance.Tests.ps1:164 Should keep the inherited access entries as explicit ones when it disables access inheritance | PathErrors.Tests.ps1:157 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | PathErrors.Tests.ps1:324 Set-NTFSInheritance should take ownership, protect the DACL, and set the owner back | Inheritance.Tests.ps1:422 Set-NTFSInheritance should re-enable audit inheritance on a <_> and keep its explicit audit entry","1 (SMB as the delegated account, NTFSSecurity.Live.Tests.ps1:302-309: DACL protected, owner kept)","No test pipes into the set, including the documented round trip (Get-NTFSInheritance output piped into Set-NTFSInheritance, which binds both flags by property name); the SACL and the access-enable direction are read back only through module cmdlets. Also not asserted: the error category, the FullName of the -Path -PassThru object, RestoreOwnerError, -PassThru with a failing item among several, and the documented no-op without -Path.","TestNeeded","Inheritance.Tests.ps1:173-175 (.NET flag and explicit count), 428-433 (object, entries, DACL unchanged by .NET) and PathErrors.Tests.ps1:330-332 and 180-191 (owner, denied item unchanged, next item protected) are the strongest; the SACL and the access-enable direction are read back only with module cmdlets (Inheritance.Tests.ps1:371-373, 431-432). Inheritance.Tests.ps1:127-130 asserts no object after a failed audit change for one item, as a basic user only. BoundBy 18 = scan 14 + 4 calls through & $Command or & $_ (PathErrors:108,178; Inheritance:268; Privileges:123).","Partly","ParameterSets.Inheritance.Tests.ps1:345 <Command> should report <ErrorId> with category WriteError and target for the denied item, and still return the next item's new state with -PassThru | ParameterSets.Inheritance.Tests.ps1:368 <Command> should report RestoreOwnerError after a successful ownership retry and continue with the next path | ParameterSets.Inheritance.Tests.ps1:609 Set-NTFSInheritance should restore a saved inheritance state through the pipeline by property name","an independent SACL readback of the result; OpenError category for a path that does not exist; the documented no-op without -Path","budget; budget; budget"
"inheritance","Set-NTFSInheritance","SecurityDescriptor","False","5","0","0","5","Partly","NA","No","NA","Yes","Inheritance.Tests.ps1:465 Should set access inheritance enabled=<Enable> on a <Type> only when the descriptor is written | Inheritance.Tests.ps1:494 Should set audit inheritance enabled=<Enable> on a <Type> without changing its DACL or owner | Inheritance.Tests.ps1:524 Should keep audit inheritance unknown when requested enabled=<_> on an access-only descriptor | Inheritance.Tests.ps1:180 Should keep the inherited access entries of a security descriptor","0","Not asserted: several descriptors (array or pipeline), a single call that sets both -AccessInheritanceEnabled and -AuditInheritanceEnabled, and an independent SACL readback after the write (the audit side uses module cmdlets). The set works in memory and cannot fail on a readable descriptor.","TestNeeded","Inheritance.Tests.ps1:481-491 asserts count, FullName, Name, flag, the item unchanged until Set-NTFSSecurityDescriptor, then flag and owner by .NET and the explicit entry; :511-521 (elevated) does the audit side through module cmdlets; :533-539 asserts a null audit state and no SACL for an access-only descriptor. BoundBy 5 = scan 5.","Closed","ParameterSets.Inheritance.Tests.ps1:288 Set-NTFSInheritance -SecurityDescriptor should set both inheritance flags in one call, changing only the in-memory descriptor until it is written | ParameterSets.Inheritance.Tests.ps1:621,638 Set-NTFSInheritance -SecurityDescriptor should protect both descriptors in memory, written only by Set-NTFSSecurityDescriptor, piped and passed directly to the parameter","",""
"inheritance","Get-NTFSOwner","Path","True","22","4","3","26","NA","Partly","Partly","Partly","Yes","Owner.Tests.ps1:47 Should write one permission error and keep the owner | PathErrors.Tests.ps1:140 <Command> should write a ReadSecurityError for it and continue with the next path | DriveRoot.Tests.ps1:45 Get-NTFSOwner should return the owner of the root folder | ObjectApis.Tests.ps1:725 Should name the item and the account of an owner object","4 (SMB: owner Administrators, NTFSSecurity.Live.Tests.ps1:585-589; three calls check that the privileges are disabled after a later command ends the pipeline, :1406, 1411, 1422)","No test asserts ErrorId, category and target together (Owner.Tests.ps1:55-56 id and category, PathErrors.Tests.ps1:148-149 id and target); piping covers one FileInfo only (documented: Get-ChildItem2 -Recurse | Get-NTFSOwner); the next item's output is asserted only as non-empty; the documented 'returns nothing' without -Path is untested.","TestNeeded","Owner.Tests.ps1:53-56 asserts no output, one error, ReadSecurityError and PermissionDenied (basic user only, skipped with the Backup privilege); PathErrors.Tests.ps1:147-151 asserts id, target and non-empty output for the next path; DriveRoot.Tests.ps1:46 compares Owner.Sid with Get-Acl; ObjectApis.Tests.ps1:730-732 (line numbers at HEAD 6696f68; +19 in a work tree with the uncommitted ObjectApis edit) asserts Item, FullName and Account. BoundBy 26 = scan 22 + ambiguous Owner:177 and :185 (both bind Path) + PathErrors:108,145.","Partly","ParameterSets.Inheritance.Tests.ps1:400 Get-NTFSOwner should write a ReadSecurityError with its id, category, and target together for a denied item, and return exactly one object for the next path | ParameterSets.Inheritance.Tests.ps1:652 Get-NTFSOwner should take two piped folders from Get-ChildItem2 and return the owner of each, verified with Get-Acl","the documented 'returns nothing' without -Path","budget"
"inheritance","Get-NTFSOwner","SecurityDescriptor","False","0","0","3","1","NA","NA","Partly","NA","Partly","SecurityDescriptorSets.Tests.ps1:146 Get-NTFSOwner should return the owner that it returns for the path","0","One test, one descriptor; the owner is compared with the -Path result of the same cmdlet, with no .NET oracle, no type assertion and no several descriptors. The result for a descriptor read without its Owner section is unexercised (see the notes).","TestNeeded","The scan's ambiguous rows Owner.Tests.ps1:177 (System.IO DirectoryInfo by position) and :185 (System.IO FileInfo piped) bind Path: FileSystemPathTransformation turns a file system object into its path, and those types do not convert to FileSystemSecurity2[]. Only SecurityDescriptorSets.Tests.ps1:149-153 binds the set: a FileSystemSecurity2 piped by value, asserting count 1, Owner.Sid against the -Path result and FullName. BoundBy 1 (scan 0 + that call).","Partly","ParameterSets.Inheritance.Tests.ps1:676,686 Get-NTFSOwner -SecurityDescriptor should return the owner of each descriptor, piped and passed directly to the parameter, verified with Get-Acl","the result for a descriptor read without its Owner section","budget, a read-only probe just now shows it returns the item's real owner, not a crash, so it is safely testable and simply was not written"
"inheritance","Set-NTFSOwner","Path","True","8","4","1","10","Partly","Partly","Yes","Partly","Yes","Owner.Tests.ps1:240 Should set an owner that only the Restore privilege allows | Owner.Tests.ps1:232 Should take the items from the pipeline | Owner.Tests.ps1:270 Should write a SetOwnerError and keep the owner | Owner.Tests.ps1:248 Should write a read error for a path that does not exist and continue with the next path","4 (SMB: take ownership as the account itself, assign another account only with the file server's Restore privilege (SetOwnerError for the delegated account), NTFSSecurity.Live.Tests.ps1:595 and 604; a later command that stops the pipeline leaves the second item's owner unchanged, :1143, 1182)","Not asserted: DACL, SACL and group unchanged after the owner changes; as a basic user the owner already equals the user, so Owner.Tests.ps1:217, 229 and 256 cannot show a change; the error category and target (SetOwnerError); -PassThru with a failing item among several; and the documented no-op without -Path.","TestNeeded","Owner.Tests.ps1:245 (.NET owner is TrustedInstaller, needs the Restore privilege), :225-229 (count, type, FullName, Owner.Sid, .NET owner), :237 (two piped Get-Item2 objects) and :277-279 (SetOwnerError id only, owner unchanged). The scan's ambiguous Owner:235 binds Path (the Get-Item2 objects bind by their FullName property). BoundBy 10 = scan 8 + Owner:235 + PathErrors:108.","Partly","ParameterSets.Inheritance.Tests.ps1:314 Set-NTFSOwner should change only the owner and leave the Access entries and the group unchanged | ParameterSets.Inheritance.Tests.ps1:427,444 Should write <ErrorId> with its category and target for <Scenario>, and keep processing the remaining path","the SACL unchanged after the owner changes; the documented no-op without -Path","budget; budget"
"inheritance","Set-NTFSOwner","SecurityDescriptor","False","2","0","1","2","Partly","NA","No","NA","Partly","Owner.Tests.ps1:284 Should change only the descriptor in memory until Set-NTFSSecurityDescriptor writes it | Owner.Tests.ps1:303 Should write nothing without -PassThru and leave the owner of the item unchanged","0","The persisted-owner test is skipped for basic users (Owner.Tests.ps1:287-290); not asserted: DACL unchanged after the write, FullName and type of the -PassThru object (only the -Path set asserts them), and several descriptors (array or pipeline).","TestNeeded","Owner.Tests.ps1:296-300 asserts count, Owner.Sid, the item's owner unchanged until Set-NTFSSecurityDescriptor and changed after (.NET), but the test is skipped when the user owns new items (:287-290); :312-314 asserts no output without -PassThru, the in-memory owner and the item's owner unchanged. BoundBy 2 = scan 2.","Partly","ParameterSets.Inheritance.Tests.ps1:698,713 Set-NTFSOwner -SecurityDescriptor should change both owners in memory without touching the items, piped and passed directly to the parameter","the DACL unchanged after the write; the type of the -PassThru object (BeOfType)","budget; budget"
"inheritance","Get-NTFSSecurityDescriptor","__AllParameterSets","False","79","5","0","82","NA","Partly","No","Partly","Yes","SecurityDescriptor.Tests.ps1:52 Should report the inherited access entries as inherited | SecurityDescriptor.Tests.ps1:63 Should read the owner and the audit entries with the access entries | DriveRoot.Tests.ps1:39 Get-NTFSSecurityDescriptor should read the DACL of the root folder | PathErrors.Tests.ps1:140 <Command> should write a ReadSecurityError for it and continue with the next path","5 (SMB read-backs for the descriptor tests, NTFSSecurity.Live.Tests.ps1:315, 965, 1150, and InheritedFrom of a vanished item, :988, 1017)","Untested combinations: piped paths and file or folder objects (documented: Get-ChildItem2 | Get-NTFSSecurityDescriptor), no -Path (current location; Owner.Tests.ps1:92 asserts -Not -Throw only), the error category, and that the next item yields exactly one descriptor. [Limit] The documented ownership retry has no success path on a local volume.","TestNeeded","SecurityDescriptor.Tests.ps1:59-60 (inherited flags against the Get-Acl count) and :70-71 (owner against Get-Acl, audit rules) need the Security privilege; DriveRoot.Tests.ps1:42 compares the DACL SDDL with Get-Acl; PathErrors.Tests.ps1:110-115 and 147-152 assert ReadFileError and ReadSecurityError with target and non-empty output. BoundBy 82 = scan 79 + 3 calls through & $Command or & $_ (PathErrors:108,145; Owner:98).","Partly","ParameterSets.Inheritance.Tests.ps1:385 <Command> should write <ErrorId> with category OpenError for a path that does not exist, and return exactly one object for the next path | ParameterSets.Inheritance.Tests.ps1:727,738,745 Get-NTFSSecurityDescriptor should take piped folder objects, a standard Get-Item object, and a piped custom object by its Path property","the result for no -Path (current location); a successful ownership-retry read","budget; Limit, no local volume reaches the success path"
"inheritance","Set-NTFSSecurityDescriptor","__AllParameterSets","False","29","4","0","29","Yes","Yes","Yes","Yes","Yes","SecurityDescriptor.Tests.ps1:299 Should report a denied write, return no failed item, and write the next descriptor | SecurityDescriptor.Tests.ps1:249 Should report RestoreOwnerError for a previous owner that it cannot set back after the write | SecurityDescriptor.Tests.ps1:213 Should return the written descriptor with -PassThru also when it took ownership for the write | SecurityDescriptor.Tests.ps1:133 Should not write back the access entries of an unchanged descriptor","4 (SMB: writes the added entry and keeps the owner, NTFSSecurity.Live.Tests.ps1:317; writes the cleared DACL without RestoreOwnerError, :968; a later command that stops the pipeline leaves the second descriptor unwritten, :1154, 1165)","Untested combinations: positional binding (declared Position 2), the by-property-name pipeline form, and the category and target of the -PassThru ReadSecurityError (only its ErrorId is asserted, SecurityDescriptor.Tests.ps1:361). [Limit] A failing SACL write needs a lab.","None","SecurityDescriptor.Tests.ps1:308-317 pipes two descriptors with -PassThru and asserts WriteSdError, category WriteError, target, the denied item's SDDL unchanged (.NET), one object for the next item and its entry; :259-264 asserts RestoreOwnerError with category and target; :223-226 asserts the -PassThru object after an ownership retry. BoundBy 29 = scan 29 (no calls through variables).","None","","positional binding at Position 2; the by-property-name pipeline form; category and target of the -PassThru ReadSecurityError","would-pin, Position 2 vs siblings' Position 1 looks like an undecided inconsistency per the notes; budget, row judged GapKind None; budget, row judged GapKind None"
"items","Copy-Item2","__AllParameterSets","False","6","4","0","20","Yes","Yes","No","Yes","Partly","ItemCmdlets.Tests.ps1:793 <Command> should write a <ErrorId> for a source that another process has locked and continue with the next path | ItemCmdlets.Tests.ps1:822 <Command> should write a <ErrorId> for each source when the destination folder denies new files | ItemCmdlets.Tests.ps1:642 <_> should write DestinationFileAlreadyExists for a folder that exists at the destination and change nothing | ItemCmdlets.Tests.ps1:681 Copy-Item2 -Force should copy a folder into an existing folder of the same name and replace the files in both","4: -WhatIf onto an existing file on a share (#108, administrator); copy of a file and a folder as the delegated account; later-command stop on a share","No test pipes paths into it (documented: Get-ChildItem2 | Copy-Item2 -Destination), passes an empty or null -Path, a FileInfo object, a path with brackets, a path over 260 characters or a drive root, and -Force replacing an existing file is covered only through the folder merge. FileNotFound and the file case of DestinationFileAlreadyExists are asserted by error count only, and -PassThru asserts FullName but not the output type or that nothing is written without it.","TestNeeded","ItemCmdlets.Tests.ps1:793-808 and :822-834 assert ErrorId, category, target, exception type, only the second item's result and untouched sources; :605-613 and :644-649 read the folder conflict and the merge back; Owner.Tests.ps1:160-163 reads the copied content. 14 of the 20 call sites are '& $Command' calls in ItemCmdlets.Tests.ps1 (lines 514 to 814) that the scan does not resolve.","Partly","ParameterSets.Items.Tests.ps1:36 <Command> should accept <InputKind> piped by value and still process the surrounding items | ParameterSets.Items.Tests.ps1:229 <Command> should reject -Path <CaseName> instead of silently using the current location","a path with brackets; a path over 260 characters; a drive root; -Force replacing an existing file (still only covered through the folder merge); the file case of DestinationFileAlreadyExists with category/target (still error count only); -PassThru output type; that nothing is written without -PassThru","budget (all items; none needs a lab, none pins an open maintainer decision)"
"items","Get-ChildItem2","__AllParameterSets","False","34","8","0","36","NA","Yes","No","Yes","Yes","ItemCmdlets.Tests.ps1:98 Should apply <Case> without broadening the other attribute filters | ItemCmdlets.Tests.ps1:137 Should return the exact tree for <Case> | ItemCmdlets.Tests.ps1:319 Should report the denied folder and continue with the next path | ItemCmdlets.Tests.ps1:377 Should report a junction whose target was removed as a DirUnspecifiedError and continue with the next folder","8: over SMB: path over 260 characters (administrator), -Hidden and a listing (delegated account), -Filter cases, later-command stop with a denied nested folder","No test pipes folders or strings into -Path (documented by value and by FullName), asserts the result of omitting -Path or of a relative -Path (Owner.Tests.ps1:98 only asserts no throw), or lists a drive root or a path over 260 characters in a unit test. -Directory with -File, -Attributes with -Force/-Hidden/-System/-ReadOnly (documented: ignored), -Depth without -Recurse and the dir2 alias are unasserted, and FileNotFound and AttributesEmpty are asserted without category (and without target for AttributesEmpty); the -Filter dot rules are pinned already and are the maintainer's, so they are not counted here.","TestNeeded","ItemCmdlets.Tests.ps1:98-100 and :137-140 assert exact name sets for ten attribute-switch cases and for the Recurse/Depth/Directory/File/Filter cases; :282-289 and :340-348 assert ErrorId, category, target (and exception type) and that the next path or sibling is still listed; :44-49 and :402-406 assert the AlphaFS types; PathErrors.Tests.ps1:108-114 covers FileNotFound (ID and target only).","Partly","ParameterSets.Items.Tests.ps1:91 Should accept piped folders by value, write one error for a path that does not exist, and list the items of the other folders | ParameterSets.Items.Tests.ps1:111 Should accept folder objects piped from Get-ChildItem2 -Directory and list only the files directly below them","the result of an omitted -Path; the result of a relative -Path; a drive root in a unit test; a path over 260 characters in a unit test; -Directory with -File together; -Attributes with -Force/-Hidden/-System/-ReadOnly; -Depth without -Recurse; the dir2 alias; AttributesEmpty category and target","budget (all items; the -Filter dot rules are the maintainer's and were already excluded from this Gap)"
"items","Get-Item2","__AllParameterSets","False","17","1","0","19","NA","Partly","No","Partly","Partly","PathErrors.Tests.ps1:108 <Command> should write a <ErrorId> for it and continue with the next path | ItemCmdlets.Tests.ps1:972 Get-Item2 should resolve <Path> against the current location | Owner.Tests.ps1:235 Should take the items from the pipeline | PipelineControl.Tests.ps1:124 <Name> should stop after the first object for Select-Object -First 1 and change nothing else","1: FullName and Length of a file on a share (delegated account)","No test pipes paths into it (documented: 'C:\Data','C:\Data\Reports' | Get-Item2) or omits -Path (documented: the current location), and the output type (FileInfo or DirectoryInfo) and the Mode property are never asserted; bracket paths, paths over 260 characters and a drive root are untested. The FileNotFound category is not asserted and the output for the next path is checked only as non-empty.","TestNeeded","PathErrors.Tests.ps1:108-114 asserts one FileNotFound error with the missing path as target and non-empty output for the next path; ItemCmdlets.Tests.ps1:972-980 asserts HaveCount 1 and FullName for six relative paths. 15 of the 17 scan calls are fixtures that feed descriptors or other cmdlets (Access, Audit, Inheritance, ObjectApis, Owner, SecurityDescriptor).","Partly","ParameterSets.Items.Tests.ps1:133 Should accept piped items by value, return each in order with its output type, and write one error for a path that does not exist","an omitted -Path defaulting to the current location; bracket paths; paths over 260 characters; a drive root","budget (all items)"
"items","Move-Item2","__AllParameterSets","False","7","3","0","21","Yes","Yes","No","Yes","Yes","ItemCmdlets.Tests.ps1:793 <Command> should write a <ErrorId> for a source that another process has locked and continue with the next path | ItemCmdlets.Tests.ps1:822 <Command> should write a <ErrorId> for each source when the destination folder denies new files | ItemCmdlets.Tests.ps1:658 Move-Item2 -Force should replace an existing file with PassThru=<_> | ItemCmdlets.Tests.ps1:878 Should refuse to move <Kind> folder to another volume and leave it in place","3: -WhatIf onto an existing file on a share (administrator); move of a file as the delegated account; later-command stop on a share","No test pipes paths into it (documented), passes an empty or null -Path, moves a non-empty folder tree, or renames an item inside one folder on the same volume (the cross-volume cases need an elevated admin share), and -Force replacing a folder, bracket or wildcard paths, paths over 260 characters and a drive-root destination are untested. FileNotFound is asserted by error count only.","TestNeeded","ItemCmdlets.Tests.ps1:658-668 asserts the source is gone, the content at the destination and PassThru true and false; :576-592 asserts the moved file and folder (DirectoryInfo) and the removed source folder; :756-771 and :785-797 assert ErrorId, category, target, exception type and the other item's result. The cross-volume tests at :841-878 skip without an elevated admin share.","Partly","ParameterSets.Items.Tests.ps1:36 <Command> should accept <InputKind> piped by value and still process the surrounding items | ParameterSets.Items.Tests.ps1:229 <Command> should reject -Path <CaseName> instead of silently using the current location","moving a non-empty folder tree; renaming an item in place on the same volume; -Force replacing a folder; bracket or wildcard paths; paths over 260 characters; a drive-root destination","budget (all items)"
"items","Remove-Item2","__AllParameterSets","False","15","2","0","16","Yes","Yes","No","Yes","Partly","Remove-Item2.Tests.ps1:43 Should report DeleteError for a non-empty folder without -Recurse and continue with the next path | Remove-Item2.Tests.ps1:104 Should write DeleteError when a descendant is open without delete sharing, not a successful -PassThru result | Remove-Item2.Tests.ps1:126 Should delete a junction with -Recurse without deleting or changing its target | Remove-Item2.Tests.ps1:77 Should leave a folder tree unchanged with -Recurse -Force -WhatIf and write nothing with -PassThru","2: removal of a file on a share as the delegated account; later-command stop on a share","No test pipes items into it (documented: Get-ChildItem2 ... | Remove-Item2), omits -Path (documented: the cmdlet does nothing), passes an empty or null -Path (the ValidateNotNullOrEmpty guard that keeps it from meaning the current location), passes bracket or wildcard paths (documented: literal) or uses rm2/del2. FileNotFound is asserted by error count only (ItemCmdlets.Tests.ps1:544), the access-denied branch of DeleteError (category NotSpecified) is unasserted, and that a successful removal without -PassThru writes nothing is not asserted.","TestNeeded","Remove-Item2.Tests.ps1:43-52 asserts DeleteError, InvalidData, target, kept content, the removed next item and exactly one result; :104-114 and :152-158 assert DeleteError and no success-shaped result with the content kept; :126-130 asserts the junction is removed and its target content and SDDL are unchanged; :176-184 covers the -PassThur alias.","Partly","ParameterSets.Items.Tests.ps1:157 Should accept piped items by value, write one error for a non-empty folder, remove the files, and keep the folder | ParameterSets.Items.Tests.ps1:185 Remove-Item2 should reject -Path <CaseName> instead of removing the current location","-Path omitted entirely (documented: the cmdlet does nothing); bracket or wildcard paths; the rm2/del2 aliases; FileNotFound category/target (still error count only); the access-denied DeleteError branch (category NotSpecified); that a successful removal without -PassThru writes nothing","budget (all items)"
"items","Test-Path2","__AllParameterSets","False","14","3","0","14","NA","NA","Partly","Yes","Yes","ItemCmdlets.Tests.ps1:1004 Should return <Expected> for a <Kind> with -PathType <PathType> | ItemCmdlets.Tests.ps1:1046 Should return $false for a path with the character <_> and continue with the next path | ItemCmdlets.Tests.ps1:1037 Should find a folder whose path is longer than 260 characters | ItemCmdlets.Tests.ps1:1018 Should take the items from the pipeline","3: file, folder and missing item with -PathType on a share (delegated account)","The pipeline test pipes one file; no test pipes several items (documented: Get-ChildItem2 -Recurse | Test-Path2 -PathType Leaf) or objects with PathType by property name, or tests a drive root, a UNC path or a bracket path. Errors are NA because the cmdlet writes $false for a missing or invalid path; its PathNotFound handler looks unreachable (see the notes).","TestNeeded","ItemCmdlets.Tests.ps1:1004-1009 asserts one [bool] with the expected value for file, folder and missing item under all three -PathType values; :1009-1013 asserts no error and 'False,True' for six invalid characters followed by a valid path; :981-983 pipes one FileInfo; :992-1001 covers a folder path over 260 characters.","Open","","piping several items into -Path; -PathType bound by property name; a drive root; a UNC path; a bracket path","budget (deprioritized: PipelineInput was already Partly, not No, so lower priority than the cmdlets with no pipeline test at all)"
"items","Get-FileHash2","__AllParameterSets","False","12","2","0","13","Partly","Partly","Partly","Partly","Yes","FileHash.Tests.ps1:41 Should return the hash of Get-FileHash for <_> | FileHash.Tests.ps1:94 Should skip the folder and hash the files that follow it | FileHash.Tests.ps1:108 Should write an error and no result for the file | FileHash.Tests.ps1:153 Should report both the failed read and the failed owner restoration without returning a hash","2: SHA256 equals Get-FileHash on a share (delegated account); later-command stop at the verbose message","No test pipes FileInfo/DirectoryInfo objects or folders (documented: Get-ChildItem2 -Recurse | Get-FileHash2) or Algorithm by property name, hashes a relative path or a path over 260 characters, or puts the failing path first and asserts the next hash; no error category is asserted. The owner-restore tests run only elevated and read the owner back with Get-NTFSOwner, and the retry that succeeds after taking ownership is untested.","TestNeeded","FileHash.Tests.ps1:41-44 compares Hash and Algorithm with Get-FileHash for five algorithms; :94-98 skips a folder and hashes the next file with the SHA256 default; :108-115 asserts one error and no result for a locked file; :153-160 (elevated only) asserts RestoreOwnerError and GetHashError with target, no result and the restored owner; OutputTypes.Tests.ps1:57 asserts the type name.","Partly","ParameterSets.Items.Tests.ps1:531 Should accept Get-ChildItem2 objects piped by value, skip a folder, and match Get-FileHash for each file | ParameterSets.Items.Tests.ps1:565 Should write GetHashError with its category for a locked file first, hash the file that follows it, and resolve a relative path","-Algorithm bound by property name from the pipeline; a path over 260 characters; the ownership-retry-after-taking-ownership success path","-Algorithm by property name and >260 chars: budget; ownership-retry success: Limit (elevated-only, needs a DACL/owner setup not shown buildable)"
"items","Get-DiskSpace","__AllParameterSets","False","6","0","0","6","NA","Partly","NA","No","Yes","ItemCmdlets.Tests.ps1:1075 Should return the size of the system drive | ItemCmdlets.Tests.ps1:1093 Should return the volumes with a size greater than zero without -DriveLetter | ItemCmdlets.Tests.ps1:1109 Should warn and return nothing for a drive letter without a volume | ItemCmdlets.Tests.ps1:1117 Should reject a drive letter without a colon","0","No test passes several drive letters, so the documented warn-and-continue for a letter without a volume is never combined with a valid letter; lower-case letters, positional binding and the free-space values against an independent source are unasserted. The validation error is asserted by ErrorId only (no category or target).","TestNeeded","ItemCmdlets.Tests.ps1:1075-1080 asserts type, DriveName and TotalNumberOfBytes against System.IO.DriveInfo; :1072-1077 asserts the exact warning text and no output or error for a letter without a volume; :1056-1061 asserts every volume has a size above zero and the system drive is included; :1080-1081 asserts the ErrorId of the validation error.","Partly","ParameterSets.Items.Tests.ps1:470 Should return only the system drive and warn for a drive letter without a volume, regardless of order (<Order>) | ParameterSets.Items.Tests.ps1:491 Should accept a lower-case drive letter positionally and report the same total size as .NET","the free-space values (TotalNumberOfFreeBytes/FreeBytesAvailable) against an independent source (only TotalNumberOfBytes was compared); the validation error's category and target (still ErrorId only)","budget (both items)"
"items","New-NTFSHardLink","__AllParameterSets","False","14","2","0","17","Yes","Yes","Yes","Yes","Yes","Links.Tests.ps1:134 Should write a non-terminating error for each link that it cannot create and continue with the next one | Links.Tests.ps1:170 Should write a PermissionDenied error and create no link in a folder that denies new files | Links.Tests.ps1:67 Should return every name of the file with -PassThru | Links.Tests.ps1:79 Should give both names the same data","2: link creation on a share (administrator) and -PassThru, which writes GetHardLinkError there","Positional binding (documented example 2), a FileInfo object bound to -Path or -Target and the end of a pipeline by a later command are untested; the -PassThru GetHardLinkError on a share is asserted by ErrorId only (no category or target) and only with an elevated admin share. A hard link across volumes cannot be built on a one-volume host.","TestNeeded","Links.Tests.ps1:134-145 pipes four objects by property name and asserts three errors (ErrorId, categories, targets, message), the created link and unchanged files; :170-179 asserts PermissionDenied, exception type, no output and no link; :36-41, :67-73 and :79-84 read back existence, all names and the shared data. Three of the 17 call sites (Links.Tests.ps1:450, 468, 494) are '& $Command' calls that the scan does not resolve.","Partly","ParameterSets.Items.Tests.ps1:264 <Command> should reject <CaseName> instead of creating a link to the current folder | ParameterSets.Items.Tests.ps1:324 New-NTFSHardLink should stop after the first pass-through object for Select-Object -First 1 and leave the second request untouched","positional binding (documented example 2); a FileInfo object bound to -Path or -Target; the -PassThru GetHardLinkError category and target on an admin share (still ID only)","budget (all items; an elevated admin share is already available on this host, simply not used for this)"
"items","Get-NTFSHardLink","__AllParameterSets","False","9","1","0","10","NA","Partly","Yes","Yes","Partly","Links.Tests.ps1:224 Should write an error for a path that does not exist and continue with the next path | Links.Tests.ps1:236 Should write an error for a folder and continue with the next path | Links.Tests.ps1:214 Should take the files with more than one name from Get-ChildItem2 | Links.Tests.ps1:200 Should return every name of a file with hard links","1: writes GetHardLinkError on a share (administrator)","The output type is never asserted (only FullName and Mode), the error categories (InvalidArgument for a folder, ObjectNotFound, ReadError on a share) are unasserted, and positional binding and strings from the pipeline are untested. The UnauthorizedAccessException handler cannot be reached by a test because Windows lists the names without opening the file (Links.Tests.ps1:262).","TestNeeded","Links.Tests.ps1:224-229 and :236-243 assert one error (FileNotFound; GetHardLinkError with target and message) and exactly the next file; :214-218 pipes AlphaFS file objects and asserts the names of both linked files and not the third; :200-203 asserts all names of a linked file; PathErrors.Tests.ps1:108-114 asserts ID and target for a missing path.","Partly","ParameterSets.Items.Tests.ps1:297 Should accept piped strings by value, write errors with their categories for a folder and a missing path, and return the files in order","the ReadError category on a network share (still ID/target only); the UnauthorizedAccessException handler","ReadError on a share: budget (admin share available elevated, not implemented here); UnauthorizedAccessException handler: Limit (structurally unreachable, Windows lists hard-link names without opening the file)"
"items","New-NTFSSymbolicLink","__AllParameterSets","False","12","2","0","15","Yes","Yes","Yes","Partly","Yes","Links.Tests.ps1:297 Should create a link to a file that reads the data of the file | Links.Tests.ps1:387 Should write a non-terminating error for an existing -Path and continue with the next link | Links.Tests.ps1:420 Should write a PermissionDenied error and create no link in a folder that denies new files | Links.Tests.ps1:335 Should return a folder object for a link to a folder with -PassThru","2: link to a file and to a folder on a share (administrator); asserts no error only","No test creates a link after a failed one in a pipeline (every piped request fails so that the tests run without the privilege), and a link to a folder is checked only for the Directory attribute and reachability through Test-Path2, not for LinkType and target. The success paths run only with SeCreateSymbolicLinkPrivilege; positional binding and an empty -Target (the value that meant the current folder before rc7, while the tests check only the Mandatory metadata) are untested.","TestNeeded","Links.Tests.ps1:297-302 reads back LinkType, target and data of a file link; :387-393 pipes two objects by property name and asserts two errors (ErrorId, categories) and that no link exists; :420-429 asserts PermissionDenied, exception type and no output; :323-339 assert FileInfo and DirectoryInfo with -PassThru.","Partly","ParameterSets.Items.Tests.ps1:264 <Command> should reject <CaseName> instead of creating a link to the current folder | ParameterSets.Items.Tests.ps1:343 New-NTFSSymbolicLink should stop after the first pass-through object for Select-Object -First 1 and leave the second request untouched | ParameterSets.Items.Tests.ps1:367 Should write one ResourceExists error for an existing -Path and still create the links for the requests that follow it","positional binding; the folder link's LinkType and resolved target (only the file link's LinkType was asserted)","budget (both items)"
"items","Enable-Privileges","__AllParameterSets","False","5","0","0","7","Partly","No","NA","NA","Partly","Privileges.Tests.ps1:61 Should disable the privileges that Enable-Privileges enabled | Privileges.Tests.ps1:284 Should enable the privileges when the module setting EnablePrivileges is $true | Privileges.Tests.ps1:302 Should enable the privileges in a script of another name also when the module setting EnablePrivileges is $false | Privileges.Tests.ps1:179 Enable-Privileges should keep the privileges enabled also when the pipeline stops early","0","The error path (Enable Privilege Error, SecurityError, 'Could not enable requested privileges' when not all four privileges can be enabled) is never asserted, although OutputTypes.Tests.ps1:86 (in a token without the privileges) and the partial-token child script at Privileges.Tests.ps1:93 run it with errors suppressed. Only the Backup state is read back, only through Get-Privileges and only with all four privileges held, and the states in the -PassThru objects are unasserted.","TestNeeded","Privileges.Tests.ps1:61-62 reads the Backup state after Enable-Privileges; :281-305 run it in child scripts and assert the Backup state and the verbose announcement for the Init script with the setting true and false and for another script name; :179-181 asserts the state stays enabled when the pipeline stops; OutputTypes.Tests.ps1:86-89 compares the -PassThru count with Get-Privileges. All but OutputTypes.Tests.ps1:86 skip unless the token holds the four privileges.","Partly","ParameterSets.Items.Tests.ps1:441 Enable-Privileges should write Enable Privilege Error with SecurityError and AdjustPriviledgeException when it cannot enable all four privileges","the -PassThru privilege states (TakeOwnership/Restore/Backup/Security) with an independent read-back beyond Get-Privileges, only verifiable elevated","budget"
"items","Disable-Privileges","__AllParameterSets","False","19","3","0","20","Partly","No","NA","NA","Partly","Privileges.Tests.ps1:64 Should disable the privileges that Enable-Privileges enabled | Privileges.Tests.ps1:94 Should not warn about the privileges that the access token does not hold | OutputTypes.Tests.ps1:95 Disable-Privileges should write one object per privilege | Privileges.Tests.ps1:382 Should not fail when Disable-Privileges runs inside the pipeline","3: AfterAll/BeforeEach/AfterEach resets in the privileges-on-share tests; no assertion on the cmdlet itself","The error path (Disable Privilege Error, documented as non-terminating, when none of TakeOwnership, Restore and Backup is enabled) is never asserted although 15 of the 19 scan calls (BeforeEach/AfterEach/AfterAll) run it with errors suppressed; -PassThru asserts only a count above 1 and the type, and the warning for a privilege that cannot be disabled is unasserted.","TestNeeded","Privileges.Tests.ps1:64-67 asserts no warning and the Backup state Disabled through Get-Privileges, :74-76 the verbose message, :94 (child script) no warnings for a token that holds only some privileges, :382-387 that no privilege stays enabled after it runs inside a pipeline; OutputTypes.Tests.ps1:95-98 asserts a count above 1 and the type. All skip unless the token holds the privileges.","Partly","ParameterSets.Items.Tests.ps1:451 Disable-Privileges should write Disable Privilege Error with SecurityError and AdjustPriviledgeException and no output when nothing is enabled","the -PassThru object privilege-state values on the successful disable path (still only count/type asserted); the warning when a privilege cannot be disabled","state values on success path: budget; the warning: Limit (needs a race with another command)"
"items","Get-Privileges","__AllParameterSets","False","18","2","0","19","NA","NA","NA","NA","Partly","ObjectApis.Tests.ps1:229 Should compare boxed and typed privilege values consistently without accepting an attributes enum | OutputTypes.Tests.ps1:88 Enable-Privileges should write one object per privilege | Privileges.Tests.ps1:62 Should disable the privileges that Enable-Privileges enabled | PipelineControl.Tests.ps1:164 <Name> should stop after the first object for Select-Object -First 1 and change nothing else","2: a read helper and the check that the account holds the four file system privileges","The output is never compared with an independent source (whoami /priv or the Win32 token), and no test asserts the objects beyond a count above 0, the Equals contract of the first value and the privilege and state that other cmdlets' tests read back; the Removed state and the PrivilegeAttributes property are unasserted. Errors are NA: the cmdlet has no handler and no designed failure.","TestNeeded","ObjectApis.Tests.ps1:229-233 asserts a count above 0 and the equality contract; OutputTypes.Tests.ps1:88 compares the -PassThru count with the cmdlet itself; Privileges.Tests.ps1:30 (read helper) reads one privilege state for the tests of Enable-Privileges and Disable-Privileges. The other calls are preconditions or read-backs.","Partly","ParameterSets.Items.Tests.ps1:503 Should match whoami /priv for the privileges that whoami and the library name the same way","the Removed PrivilegeState value","budget"
1 Group Cmdlet ParameterSet Default TestInvocationsScan LiveInvocationsScan AmbiguousInvocationsThatMayBindIt BoundBy StateAssertion ErrorAssertion PipelineInput Continuation OutputAssertion KeyTests LiveEvidence Gap GapKind Evidence StatusAfter NewTests Remaining Reason
2 access Add-NTFSAccess PathComplex True 33 6 1 36 Yes Yes No Partly Yes Access.Tests.ps1:740 Should write an AddAceError for each item, change nothing, and return nothing with -PassThru | PathErrors.Tests.ps1:178 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | Access.Tests.ps1:807 Should write all entries of the item after the change | PathErrors.Tests.ps1:230 Add-NTFSAccess should take ownership, add the entry, and set the owner back 6: SMB share as delegated and domain accounts - add keeps the owner (#34), add by foreign-domain account name, deny-entry fixtures (Live:253, 877, 927, 987, 1038, 1280) No test pipes anything into the set (FileInfo/DirectoryInfo, or objects with Account/AccessRights properties), and none combines -PassThru with one failing and one succeeding path: continuation (PathErrors:178, no -PassThru) and no output after a failure (Access:740, all items fail) are asserted in separate tests. Several -Account values, a Deny entry written through -Path (type, no Synchronize) and positional binding are untested. TestNeeded Access.Tests.ps1:740-751 asserts ErrorId, category WriteError, TargetObject, ArgumentException, no output and unchanged SDDL for two failing paths; PathErrors.Tests.ps1:178-192 asserts one error with the blocked target, its SDDL unchanged and the next item's entry added; Access.Tests.ps1:807-815 asserts type, entry count and the added entry of -PassThru. BoundBy = scan 33 + PathErrors:108 and :178 (& $Command) + PermissionScopes:86 (splat, Form=Flags, Source=Path); about 14 of the 36 calls are the subject of an assertion, the rest are fixtures. Partly ParameterSets.Access.Tests.ps1:72,73 Should add one explicit entry for each path bound through the pipeline, by FullName and by property name, leaving the rest of each item unchanged | ParameterSets.Access.Tests.ps1:102 Should write one AddAceError for the blocked path, leave it unchanged, and return -PassThru entries only for the path it changed several -Account values in one call; a Deny entry written through -Path checked for AccessControlType=Deny and no auto-added Synchronize; positional binding (Add-NTFSAccess $path $account $rights) budget (all three; proposal 1c was traded for the pipeline and PassThru-combined tests)
3 access Add-NTFSAccess PathSimple False 6 1 2 8 Partly No No No Yes PermissionScopes.Tests.ps1:86 Should add and remove <Name> using <Form> on <Source>, preserving the other account | PermissionScopes.Tests.ps1:110 Should apply <Name> only to its intended descendants, including the OneLevel boundary | Access.Tests.ps1:1035 Should name the folder of an inheritable entry, also with -ExcludeExplicit | ObjectApis.Tests.ps1:747 Should name the item of a descriptor and write it to a folder by its path 1: SMB share - Deny ReadPermissions entry with -AppliesTo ThisFolderOnly as a fixture of the unknown-parent case (Live:1039); no assertion on the set itself No test makes the set fail (missing path, denied write, deny entry without rights), pipes into it, or reads its result back with .NET: every read-back goes through -PassThru or Get-NTFSAccess. -AccessType Deny with -AppliesTo and the exclusion of -AppliesTo with -InheritanceFlags are untested. TestNeeded PermissionScopes.Tests.ps1:86-94 asserts type, flags, rights and ConvertToApplyTo of the -PassThru entry for 13 scopes (Form=AppliesTo, Source=Path) and :110-133 asserts which descendants inherit it, both read through the module's own cmdlets. Access.Tests.ps1:1035, Inheritance.Tests.ps1:326/365/474 and ObjectApis.Tests.ps1:747 use the set as a fixture. BoundBy = scan 6 + the splats PermissionScopes:84 and :86 (Source=Path); 2 of the 8 calls are the subject of an assertion. Partly ParameterSets.Access.Tests.ps1:247,259 Should report a missing path's error by category and target, still scope the next path's entry, and keep binding -Path through the pipeline once -AppliesTo selects the set | ParameterSets.Access.Tests.ps1:769 Should require -AppliesTo only in the Simple parameter sets, -InheritanceFlags/-PropagationFlags only in the Complex parameter sets, and reject combining -AppliesTo with -InheritanceFlags without changing the item a denied write for this set; a Deny entry without rights (-AccessType Deny -AccessRights None) for this set; -AccessType Deny combined with -AppliesTo budget (all three; the write-denial code path is shared with PathComplex and already covered there)
4 access Add-NTFSAccess SDSimple False 2 0 2 4 Partly No No No Yes Access.Tests.ps1:898 Add-NTFSAccess should still take -AppliesTo for a security descriptor | PermissionScopes.Tests.ps1:86 Should add and remove <Name> using <Form> on <Source>, preserving the other account | SecurityDescriptor.Tests.ps1:355 Should write the descriptor and report a read error for -PassThru, not a write error 0 Only InheritanceFlags for ThisFolderOnly is read back from the descriptor with .NET (Access:898); the 13 scopes are checked through the cmdlet's own -PassThru, and no test pipes descriptors in or passes several. A failing change (for example a deny entry without rights) ends the cmdlet with a terminating error and no test pins it (open item 1). MaintainerDecision Access.Tests.ps1:898-902 reads the rule from $sd.SecurityDescriptor with .NET; PermissionScopes.Tests.ps1:86-97 asserts type, flags, rights and, for Source=SecurityDescriptor, that the SDDL on disk is unchanged (13 cases). BoundBy = scan 2 (Access:898; SecurityDescriptor:355 is a fixture) + the splats PermissionScopes:84 and :86 (Source=SecurityDescriptor, Form=AppliesTo). MaintainerDecision all 13 scopes read back with .NET for Source=SecurityDescriptor (only ThisFolderOnly already was, pre-existing); piped descriptors; several descriptors; the failing-change (deny entry without rights) terminating error, not pinned budget (the 13-scope/pipe/several items, notes proposal (b2)#1 not implemented); MaintainerDecision (the failing-change open item)
5 access Add-NTFSAccess SDComplex False 14 2 1 16 Yes No No No Yes Access.Tests.ps1:822 Should write all entries of a security descriptor after the change and leave the item unchanged | Access.Tests.ps1:887 Add-NTFSAccess should apply the entry to the folder, its subfolders, and files by default | SecurityDescriptor.Tests.ps1:81 Should write the entry as the only explicit entry of the item | PermissionScopes.Tests.ps1:86 Should add and remove <Name> using <Form> on <Source>, preserving the other account 2: SMB share - descriptor written back keeps the owner (#34, Live:316) and the fixture of the later-command cases (Live:1151) No test pipes descriptors into the cmdlet, and arrays of descriptors appear only as fixtures of Set-NTFSSecurityDescriptor (SecurityDescriptor.Tests.ps1:306, :324; PipelineControl.Tests.ps1:211). A failing descriptor (deny entry without rights) ends the cmdlet with a terminating error and no test pins it (open item 1). MaintainerDecision Access.Tests.ps1:822-827 asserts that -PassThru writes as many entries as $sd.SecurityDescriptor holds, one new explicit entry, and no Everyone entry on disk; :887-892 reads the default flags back with .NET; SecurityDescriptor.Tests.ps1:81-86 asserts exactly one explicit entry on disk after Set-NTFSSecurityDescriptor. BoundBy = scan 14 + Access:872 (& $_, asserts only no throw) + PermissionScopes:86 (splat); 5 of the 16 calls are the subject of an assertion. MaintainerDecision piped descriptors into the cmdlet; arrays of descriptors used only as Set-NTFSSecurityDescriptor fixtures, not asserted for Add itself; the failing descriptor (deny entry without rights) terminating error, not pinned budget (the pipe/array items, notes proposal (b2)#2 not implemented); MaintainerDecision (the failing-descriptor open item)
6 access Remove-NTFSAccess PathComplex True 13 2 2 17 Yes Yes Yes Partly Partly Access.Tests.ps1:539 Should write a RemoveAceError for each item, change nothing, and return nothing with -PassThru | Access.Tests.ps1:617 Should remove an inherit-only entry that Get-NTFSAccess returned, and nothing else | PathErrors.Tests.ps1:178 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | Access.Tests.ps1:651 Should take only the requested generic right from the entry of the account when another account has an exact entry 2: SMB share - remove keeps the owner (#34, Live:264), remove by foreign-domain account name (Live:886) No test combines -PassThru with one failing and one succeeding path, none asserts the type or the complete entry list of the -PassThru output, and the pipeline test pipes a single entry per case. Several -Account values and positional binding are untested. TestNeeded Access.Tests.ps1:539-550 asserts ErrorId, category, target, ArgumentException, no output and unchanged SDDL for two paths; :616-620 pipes Get-NTFSAccess output (binding by property name) and asserts the exact SDDL minus the entry in 3 cases; PathErrors.Tests.ps1:178-192 asserts the next item's entry is removed after one error. BoundBy = scan 13 + Access:617 (pipeline, resolves to PathComplex), PathErrors:108 and :178 (& $Command), PermissionScopes:99 (splat, Form=AppliesTo, Source=Path); all 17 calls are the subject of an assertion. Partly ParameterSets.Access.Tests.ps1:287 Should write one RemoveAceError for the blocked path, leave it unchanged, and return -PassThru entries only for the path it changed the -PassThru output's count is not checked against the complete entry list of the surviving item (only non-emptiness, type, FullName, and absence of the removed account); the pipeline test still pipes only a single entry per call; several -Account values; positional binding budget (all four)
7 access Remove-NTFSAccess PathSimple False 0 0 2 1 Partly No No No Partly PermissionScopes.Tests.ps1:99 Should add and remove <Name> using <Form> on <Source>, preserving the other account 0 Only the -RemoveSpecific form with -PassThru is bound (13 scopes, Form=Flags); removing rights without -RemoveSpecific, a Deny entry, a missing or denied path, several paths and piped input are untested for this set, and nothing reads the item back with .NET. TestNeeded BoundBy = 1 although the scan found 0: PermissionScopes.Tests.ps1:99 binds -AppliesTo when Form is Flags (add with flags, remove with -AppliesTo), 13 cases with Source=Path; it asserts that the account's entry is gone from the -PassThru output and the keeper stays once (:101-102) and that Get-NTFSAccess finds nothing (:103). No other test binds -AppliesTo with Remove-NTFSAccess. Partly ParameterSets.Access.Tests.ps1:376 Should take only the requested rights from an entry scoped by -AppliesTo without -RemoveSpecific, keep its flags, and leave another account's entry untouched a Deny entry's rights-reduction without -RemoveSpecific; a missing or denied path for this set; several paths in one call; piped input budget (all four; the shared path-resolution/write-denial code is already covered for PathComplex)
8 access Remove-NTFSAccess SDSimple False 0 0 2 1 Partly No No No Partly PermissionScopes.Tests.ps1:99 Should add and remove <Name> using <Form> on <Source>, preserving the other account 0 Same single splat test as PathSimple with a descriptor: the removal is read back only through -PassThru and Get-NTFSAccess, the item on disk is not checked after it, and nothing tests removal without -RemoveSpecific, piped descriptors or several descriptors. A failing removal ends the cmdlet with a terminating error and no test pins it (open item 1). MaintainerDecision BoundBy = 1 although the scan found 0: PermissionScopes.Tests.ps1:99 binds the set for Source=SecurityDescriptor, Form=Flags (13 cases) and asserts the -PassThru output (:101-102) and Get-NTFSAccess -SecurityDescriptor (:103) after the removal; the SDDL check at :96 runs before the removal. MaintainerDecision removal read back only through -PassThru/Get-NTFSAccess, not the item on disk after it; removal without -RemoveSpecific; piped descriptors; several descriptors; the failing removal terminating error, not pinned budget (the read-back/RemoveSpecific/pipe/several items, notes proposal (b2)#3 not implemented); MaintainerDecision (the failing-removal open item)
9 access Remove-NTFSAccess SDComplex False 4 0 2 6 Partly No No No Partly Access.Tests.ps1:915 Remove-NTFSAccess should remove a deny entry from the descriptor and leave the item unchanged | Access.Tests.ps1:682 Should remove an entry that matches exactly | Access.Tests.ps1:688 Should take the rights away from a matching entry without -RemoveSpecific | Access.Tests.ps1:676 Should keep an entry that does not match exactly 0 No test removes an entry that exists on disk from a descriptor and checks that the item keeps it until Set-NTFSSecurityDescriptor: the entries of Access:676-688 and :915 are added in memory only, so a write-through would go unnoticed. No piped or multiple descriptors, and a failing removal ends the cmdlet with a terminating error (open item 1). MaintainerDecision Access.Tests.ps1:676-692 reads $sd.SecurityDescriptor with .NET for -RemoveSpecific (kept or removed) and for the rights removal; :915-920 removes an in-memory Deny entry and checks that no such entry is on disk, which also holds if both cmdlets wrote through. BoundBy = scan 4 + Access:872 (& $_, no throw only) + PermissionScopes:99 (splat, Form=AppliesTo, Source=SecurityDescriptor, -PassThru check). MaintainerDecision no test removes an on-disk entry from a descriptor and checks the item keeps it until Set-NTFSSecurityDescriptor (write-through check); no piped or multiple descriptors; the failing removal terminating error, not pinned budget (the write-through/pipe/several items, notes proposal (b2)#3 not implemented); MaintainerDecision (the failing-removal open item)
10 access Clear-NTFSAccess Path True 6 2 0 8 Partly Partly No Yes NA PathErrors.Tests.ps1:178 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | Access.Tests.ps1:932 Should leave the item with an empty, protected DACL | PathErrors.Tests.ps1:271 Clear-NTFSAccess -DisableInheritance should take ownership, clear and protect the DACL, and not set an unchanged owner back | PathErrors.Tests.ps1:289 Clear-NTFSAccess -DisableInheritance should report RestoreOwnerError for a previous owner that it cannot set back 2: SMB share - clear keeps the owner (#34, Live:274); -DisableInheritance as the owner takes ownership without a RestoreOwnerError (Live:957) No test asserts that a plain Clear leaves the inherited entries and the inheritance flag untouched, or clears a folder (all unit tests use files). ClearAclError and ReadFileError are asserted by ErrorId and target without category, and nothing is piped in. TestNeeded PathErrors.Tests.ps1:178-192 asserts one ClearAclError for the blocked path, its SDDL unchanged and no explicit entry on the next item; Access.Tests.ps1:932-936 and PathErrors.Tests.ps1:271-277 assert a protected, empty DACL and the unchanged owner with .NET; PathErrors.Tests.ps1:289-294 asserts RestoreOwnerError with category WriteError and target (elevated only). BoundBy = scan 6 + PathErrors:108 and :178 (& $Command); 7 of the 8 calls are the subject of an assertion. Closed ParameterSets.Access.Tests.ps1:409 Should clear each piped folder's explicit entries, including an inherit-only one, and leave inherited entries and the owner untouched | ParameterSets.Access.Tests.ps1:434,445 Should report a missing path's ReadFileError and a blocked path's ClearAclError, each by category and target
11 access Clear-NTFSAccess SD False 3 1 0 3 Partly No No No NA SecurityDescriptorSets.Tests.ps1:60 Clear-NTFSAccess -DisableInheritance should leave the descriptor with an empty, protected DACL | SecurityDescriptorSets.Tests.ps1:45 Clear-NTFSAccess should remove the explicit access entries of the descriptor | SecurityDescriptor.Tests.ps1:236 Should not report an owner that did not change when the write that took ownership leaves an empty DACL 1: SMB share - cleared descriptor written with Set-NTFSSecurityDescriptor without a RestoreOwnerError (Live:966) No test checks that a plain Clear of a descriptor keeps its inherited entries and inheritance flag, pipes descriptors in, or passes several. The set has no per-item handler and no test makes it fail; it is not among the open items, so no test is proposed for that. TestNeeded SecurityDescriptorSets.Tests.ps1:45-50 asserts 0 explicit entries in the descriptor, 1 still on disk, then 0 after Set-NTFSSecurityDescriptor; :60-68 asserts a protected, empty DACL in memory, the DACL on disk unchanged and the written result; SecurityDescriptor.Tests.ps1:236-244 asserts that the owner stays after the write (the call there is a fixture of a Set-NTFSSecurityDescriptor test). BoundBy = 3 (no ambiguous calls). Closed ParameterSets.Access.Tests.ps1:468 Should clear each piped descriptor's explicit entries in memory, leave the items unchanged until Set-NTFSSecurityDescriptor, and keep the owner
12 access Get-NTFSAccess Path True 25 3 2 29 NA Partly No Yes Partly PathErrors.Tests.ps1:108 <Command> should write a <ErrorId> for it and continue with the next path | PathErrors.Tests.ps1:145 <Command> should write a ReadSecurityError for it and continue with the next path | Access.Tests.ps1:55 Should return the entries of the first item once | DriveRoot.Tests.ps1:34 Get-NTFSAccess should return the access entries of the root folder 3: SMB share - entries of a path longer than 260 characters, foreign-domain account entries, unknown-parent InheritedFrom (Live:543, 859, 1048) No test pipes FileInfo/DirectoryInfo into the set (or passes a folder object by position, #88), asserts what it returns without -Path (Owner.Tests.ps1:98 only checks that nothing throws), or asserts the category of ReadFileError and ReadSecurityError (the latter is WriteError after a failed ownership retry, see notes). No test asserts the emitted type or the declared OutputType. TestNeeded PathErrors.Tests.ps1:108-115 and :145-152 assert one error with ErrorId and target and output for the next path; Access.Tests.ps1:55-59 asserts the first item's entries appear once after a failing path, but the path fails only without elevation; Access.Tests.ps1:1108-1118 asserts a NULL DACL gives one entry with Sid, IsInherited and InheritedFrom, and DriveRoot.Tests.ps1:34-36 that the SID list equals Get-Acl. BoundBy = scan 25 + PathErrors:108/:145 + Owner.Tests.ps1:98 (& $cmdlet, no throw only) + PermissionScopes:103 (splat, Source=Path). Partly ParameterSets.Access.Tests.ps1:500,502,512 Should return the same entries for a folder bound through the pipeline and by position, and report a missing path's error by category and target | ParameterSets.Access.Tests.ps1:745 <Name> should declare <Types> as its output type what the cmdlet returns without -Path at all (beyond not throwing, Owner.Tests.ps1:98); the category of ReadSecurityError after a failed ownership retry; BeOfType on an actual emitted object (only the declared OutputType is asserted) budget (the no -Path case); would-pin (ReadSecurityError is WriteError after a failed retry but OpenError from the generic catch - asserting a category here would cement that inconsistency, per the notes); budget (BeOfType on a live object)
13 access Get-NTFSAccess SD False 1 0 2 3 NA No Partly No Partly SecurityDescriptorSets.Tests.ps1:139 Get-NTFSAccess should return the entries that it returns for the path | Access.Tests.ps1:1098 Should read a security descriptor with audit entries and name the same folders | PermissionScopes.Tests.ps1:103 Should add and remove <Name> using <Form> on <Source>, preserving the other account 0 No test uses -Account, -ExcludeExplicit or -ExcludeInherited with a descriptor except the empty-result check of PermissionScopes:103, so an entry added to the descriptor in memory is never shown in the output; no test passes several descriptors or pipes more than one. The set has no per-item handler and no failing descriptor is tested. TestNeeded SecurityDescriptorSets.Tests.ps1:139-143 pipes one descriptor and compares Sid, rights and IsInherited of every entry with the -Path result (one item; the output cannot tell the SecurityDescriptor parameter from -Path bound by FullName); Access.Tests.ps1:1098-1103 (elevated only) compares count and InheritedFrom with the path result. BoundBy = scan 1 + SecurityDescriptorSets:139 (pipeline) + PermissionScopes:103 (splat, Source=SecurityDescriptor, asserts only an empty result). Partly ParameterSets.Access.Tests.ps1:528,533,535,542 Should filter an entry added to a descriptor in memory by -Account, partition it with -ExcludeInherited and -ExcludeExplicit, and read two descriptors bound through the pipeline no failing descriptor is tested for this set (no per-item handler) Limit (the SD loop has no try/catch; an exception would be unhandled and terminating, not a graceful per-item error - the same situation as the Clear-NTFSAccess SD row, which the notes explicitly excuse and this row's Gap text does not)
14 access Get-NTFSOrphanedAccess Path False 4 4 0 6 NA Partly No Partly Partly Access.Tests.ps1:218 Should return the entries whose account cannot be resolved | Access.Tests.ps1:222 Should return only the entries of -Account | PathErrors.Tests.ps1:145 <Command> should write a ReadSecurityError for it and continue with the next path | PipelineControl.Tests.ps1:148 <Name> should stop after the first object for Select-Object -First 1 and change nothing else 4: SMB share - entry of a deleted domain account with its SID, inherited entry and -ExcludeInherited, foreign-domain accounts not reported (Live:504, 515, 516, 868) -ExcludeExplicit and -ExcludeInherited are untested in unit tests (lab only), and PathErrors runs this cmdlet with Output=false, so no test shows that the next path is processed after an error; no pipeline input and no category for ReadFileError or ReadSecurityError. A read failure other than access denied is written as a warning, which no test reaches. TestNeeded Access.Tests.ps1:218-225 asserts 2 orphaned entries and, for -Account, 1 entry with its Sid; PathErrors.Tests.ps1:108-115 and :145-152 assert one error with ErrorId and target but cannot show continuation because Output is false for this cmdlet (:29, :56). BoundBy = scan 4 + PathErrors:108 and :145 (& $Command). Partly ParameterSets.Access.Tests.ps1:559,560,566,567 Should mark an orphaned entry explicit on its own folder and inherited on a child, partitioned by -ExcludeInherited and -ExcludeExplicit | ParameterSets.Access.Tests.ps1:576,590 Should write a ReadFileError for a missing path, still return the orphaned entry of the next path, and accept both bound through the pipeline the category of ReadSecurityError after a failed ownership retry; a read failure other than access denied, which is written as a warning, not an error budget (ReadSecurityError here has one consistent category, ReadError, unlike Get-NTFSAccess, so it was safely assertable but not attempted); would-pin (the warning-not-error choice; the notes explicitly decline to propose pinning it)
15 access Get-NTFSOrphanedAccess SD False 1 0 0 1 NA No No No Partly Access.Tests.ps1:231 Should read the entries of a security descriptor 0 Only the count (2) and FullName are asserted; -Account, -ExcludeExplicit and -ExcludeInherited with a descriptor, the orphaned Sids, several or piped descriptors, and a descriptor changed in memory are untested. TestNeeded BoundBy = 1 (unambiguous; the cmdlet has no ambiguous rows): Access.Tests.ps1:231-234 asserts 2 entries, each with FullName equal to the file. Nothing else binds the set. Partly ParameterSets.Access.Tests.ps1:605,606,607,617 Should filter a descriptor's orphaned entries by -Account, report both orphaned Sids by default, exclude them all with -ExcludeExplicit, and read two descriptors bound through the pipeline -ExcludeInherited with a descriptor; a descriptor changed only in memory (not written to disk) still reporting its orphaned entries budget (both; the same fixture already built in this test could have been extended)
16 access Get-NTFSSimpleAccess Path False 20 1 2 21 NA Partly Yes Yes Yes Access.Tests.ps1:353 Should report all entries of the first folder and of the following folder only what the parent does not cover | Access.Tests.ps1:362 Should compare the folders from the pipeline in the same way | Access.Tests.ps1:485 Should write an error for a path that does not exist and continue with the next path | Access.Tests.ps1:267 Should show the entries as a table with the account, the rights, and the type 1: SMB share - parent folder first and for the subfolder only its own entry, as the delegated account (Live:832) The ReadError of a missing path is asserted by ErrorId only (no category or target), and no test makes a folder unreadable: unlike Get-NTFSAccess the cmdlet does not retry as the owner, so what an unreadable folder reports is unpinned. TestNeeded Access.Tests.ps1:353-358 and :362-364 assert all 4 entries of the parent and only the child's own entry, for -Path and for Get-Item2 objects piped in; :485-490 asserts one ReadError and that every output object belongs to the next path; :267-269 asserts the table view; :251-254 and the rights-reduction cases assert Identity.Sid and AccessRights. BoundBy = scan 20 + Access:362 (pipeline, resolves to Path). Partly ParameterSets.Access.Tests.ps1:645 Should report an unreadable folder's error by category and target and still report the next folder's entries the ReadError of a missing path (as opposed to an unreadable one) is still asserted by ErrorId only, without category or target budget (Access.Tests.ps1:485 cannot be edited under a one-new-file brief, and no equivalent new test for the missing-path precondition specifically was added)
17 access Get-NTFSSimpleAccess SD False 1 0 2 2 NA No Partly No Partly Access.Tests.ps1:476 Should report the security descriptor of a file | Access.Tests.ps1:260 Should read the entries of a security descriptor 0 Only non-empty output and FullName are asserted; -Account, -ExcludeExplicit, -ExcludeInherited, the reduced rights and several descriptors are untested for the descriptor set, and no failing descriptor is tested. TestNeeded Access.Tests.ps1:260-263 reads one descriptor; :476-479 pipes one descriptor of a file: the -Path set skips files (Access:468-473), so a non-empty result can only come from the SD set; both assert FullName only. BoundBy = scan 1 + Access:476 (pipeline, resolves to SD). Partly ParameterSets.Access.Tests.ps1:666,667,671,673,674,679 Should filter and partition a descriptor's entries like the equivalent -Path call, and read two descriptors bound through the pipeline no failing descriptor is tested for this set (no per-item handler) Limit (same no-per-item-handler situation as the Clear-NTFSAccess SD and Get-NTFSAccess SD rows)
18 access Get-NTFSEffectiveAccess Path True 11 7 1 15 NA Yes No Partly Partly Access.Tests.ps1:1140 Should report the native identity error for each <Source> and return no access entry | Access.Tests.ps1:86 Should leave out an account without access when -ExcludeNoneAccessEntries is used | Access.Tests.ps1:145 Should return the result of this computer and warn | PathErrors.Tests.ps1:108 <Command> should write a <ErrorId> for it and continue with the next path 7: SMB share, domain and delegated accounts - rights through domain groups and file-server groups with -ServerName, fallback warning, GetEffectiveAccessError for access denied (Live:419, 428, 438, 456, 478, 486, 895) No unit test asserts the content of the rights (for example an allow and a deny entry on a file with a protected DACL: ReadData present, WriteData absent), pipes objects in, or shows in one call that a failing path emits nothing while the next path emits only its own result. The ReadEffectivePermissionError handlers cannot be reached because the library hides its failures, and remote and group-based results need the lab. TestNeeded Access.Tests.ps1:1140-1153 asserts for two failing paths ErrorId GetEffectiveAccessError, category ReadError, TargetObject, Win32Exception 1332, no output and unchanged SDDL; PathErrors.Tests.ps1:108-115 asserts ReadFileError and output for the next path; Access.Tests.ps1:86-95 asserts the ExcludeNone filter and :145-157 the warning text and equal rights. BoundBy = scan 11 + Access:1140 (splat, Source=Path) + PathErrors:108/:145 + Owner.Tests.ps1:98 (& $cmdlet, no throw only). Partly ParameterSets.Access.Tests.ps1:695 Should report an allowed right as present and a denied right as absent for a protected DACL | ParameterSets.Access.Tests.ps1:705 Should return one result per item bound through the pipeline, in order one call combining a failing path (for example a missing one) with a succeeding one, showing the failing path emits nothing and the next emits only its own result; the ReadEffectivePermissionError handler; remote and group-based results budget (the failing+succeeding combination); Limit (ReadEffectivePermissionError is unreachable - the library records failures instead of throwing); Limit (remote/group-based results need the lab)
19 access Get-NTFSEffectiveAccess SecurityDescriptor False 2 0 1 3 NA Yes No Partly Partly Access.Tests.ps1:1140 Should report the native identity error for each <Source> and return no access entry | Access.Tests.ps1:132 Should name the cause in the error, not the Security privilege | Access.Tests.ps1:107 Should compute the effective access of a security descriptor 0 No test shows that the result follows an entry added to the descriptor in memory (and not the file on disk), pipes descriptors in, or passes a mix of failing and succeeding descriptors; the rights themselves are not asserted. TestNeeded Access.Tests.ps1:1140-1153 (Source=SecurityDescriptor, 2 descriptors) asserts the same error triple, Win32Exception 1332 and no output; :132-137 asserts one GetEffectiveAccessError that does not blame the privilege; :107-111 asserts one result with the FullName of the file. BoundBy = scan 2 + Access:1140 (splat, Source=SecurityDescriptor). Partly ParameterSets.Access.Tests.ps1:721,727,736 Should follow a descriptor changed only in memory while the -Path result stays on disk, and read two descriptors bound through the pipeline a mix of a failing and a succeeding descriptor in one call Limit (the per-item catch exists but is unreachable in a unit sandbox; the library records the Authz failure instead of throwing, per the notes)
20 audit Add-NTFSAudit PathComplex True 27 4 1 30 Yes Yes No Yes Yes Audit.Tests.ps1:147 Should write an AddAceError for each item, change nothing, and return nothing with -PassThru | Audit.Tests.ps1:629 <Command> should use a held privilege or report a missing one and continue to the next path | Audit.Tests.ps1:178 Should add the audit entry and keep the owner | PermissionScopes.Tests.ps1:146 Should add and remove <Name> using <Form> on <Source>, preserving the other account 4 (NTFSSecurity.Live.Tests.ps1:348, 385, 1010, 1016): SMB share with domain accounts; owner kept; the delegated account gets an AddAceError that names the missing privilege and leaves the SDDL unchanged; the file server counts the SACL entries (:1441) No test pipes paths or objects into -Path, binds Account/AccessRights/AuditFlags by property name, or adds for several accounts. No test asserts the result of a succeeding path that follows a failing one (PathErrors.Tests.ps1:124 only counts errors), and the owner retry after access denied cannot run on a local volume (Limit). TestNeeded Audit.Tests.ps1:149-158 asserts AddAceError, WriteError, target, ArgumentException, no -PassThru output and an unchanged SACL (Get-Acl -Audit) for two failing paths; :631-669 and :672-679 assert ReadFileError/OpenError/target, the FullName of the output, the SACL rule, and unchanged DACL/owner SDDL. BoundBy 30 = scan 27 + PermissionScopes:146 (13 of 52 cases) + 2 calls through & $Command that the scan cannot see (Audit.Tests.ps1:629, PathErrors.Tests.ps1:124); 23 of the 27 scanned calls are fixtures. Partly ParameterSets.Audit.Tests.ps1:129 Should add the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and leave the DACL unchanged AuditFlags not bound by property name; adding for several accounts in one call; the owner retry after access denied budget; budget; Limit (needs a lab or a remote server)
21 audit Add-NTFSAudit PathSimple False 5 0 2 7 Partly No No No Yes PermissionScopes.Tests.ps1:146 Should add and remove <Name> using <Form> on <Source>, preserving the other account | Inheritance.Tests.ps1:386 Should set enabled=<Enable> on a <Type>, remove requested audit entries=<Remove>, and leave the DACL unchanged | Inheritance.Tests.ps1:424 Set-NTFSInheritance should re-enable audit inheritance on a <_> and keep its explicit audit entry 0 No call of this set fails on purpose, passes several paths, or pipes objects, and a conflict of -AppliesTo with -InheritanceFlags is not tested. The added entry is read back only from -PassThru and Get-NTFSAudit, and owner and DACL after the call are not asserted for this set. TestNeeded The only call under test is PermissionScopes.Tests.ps1:146 (Source=Path with the -AppliesTo form, 13 of 52 cases): :149-154 assert type, Inheritance/Propagation/AuditFlags and the scope name, and :161-163 that the other account remains. The other calls (PermissionScopes:144, Audit.Tests.ps1:618 and :690, Inheritance.Tests.ps1:386, :424, :503) are fixtures; BoundBy 7 = scan 5 + :144 and :146 resolved from the splat. Closed ParameterSets.Audit.Tests.ps1:129 Should add the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and leave the DACL unchanged | ParameterSets.Audit.Tests.ps1:314 Should reject -AppliesTo combined with -InheritanceFlags with an AmbiguousParameterSet error
22 audit Add-NTFSAudit SDSimple False 0 0 2 2 Partly No No No Yes PermissionScopes.Tests.ps1:146 Should add and remove <Name> using <Form> on <Source>, preserving the other account | Audit.Tests.ps1:89 Should take -Account at position 2 and -AccessRights at position 3 in the <_> parameter set 0 No test makes this set fail, passes or pipes several descriptors, or reads the changed descriptor with .NET; a descriptor without audit entries is tested only with the complex form. Exceptions of the change itself end the cmdlet (open item 1) and are not to be pinned. TestNeeded Only PermissionScopes.Tests.ps1:146 binds it (Source=SecurityDescriptor with -AppliesTo, 13 of 52 cases; the fixture at :144 in 26): :149-154 assert the -PassThru type and flags and :156 that the SACL of the item is unchanged (Get-Acl -Audit). Audit.Tests.ps1:89 checks the positions by reflection only; BoundBy 2 resolves the two splat calls, the scan found 0. Partly ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:161 Should add the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and leave the item on disk unchanged until Set-NTFSSecurityDescriptor writes it | ParameterSets.Audit.Tests.ps1:326 Should add the entry to the descriptor when -SecurityDescriptor, -Account, -AccessRights, and -AppliesTo are all named directly exceptions from the change itself (open item 1) MaintainerDecision (open item)
23 audit Add-NTFSAudit SDComplex False 5 0 1 8 Yes Partly No No Yes Audit.Tests.ps1:107 Should bind an account and access rights that are passed by position | Audit.Tests.ps1:120 Should return the audit entries of a security descriptor, not its access entries | SecurityDescriptor.Tests.ps1:120 Should write an added audit entry and keep the owner | Audit.Tests.ps1:425 <Command> should write an error and leave the descriptor without audit entries 0 Only the ErrorId is asserted for a descriptor without audit entries, not its category (InvalidData) or target, and no test pipes descriptors or passes several (one without audit entries), so pipeline binding and continuation are untested. Exceptions of the change itself are open item 1 and are not to be pinned. TestNeeded Audit.Tests.ps1:109-110 reads the in-memory SACL with .NET and :122-136 assert type, Sid, InheritanceEnabled and the unchanged access protection; SecurityDescriptor.Tests.ps1:124-126 asserts after Set-NTFSSecurityDescriptor that the owner is kept and the entry exists; PermissionScopes.Tests.ps1:156 asserts the item is untouched until written. BoundBy 8 = scan 5 + PermissionScopes:146 (13 of 52 cases) + & $Command at Audit.Tests.ps1:425 and Access.Tests.ps1:881 (Should -Not -Throw only). Partly ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:161 Should add the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and leave the item on disk unchanged until Set-NTFSSecurityDescriptor writes it exceptions from the change itself (open item 1) MaintainerDecision (open item)
24 audit Remove-NTFSAudit PathComplex True 7 2 1 10 Yes Yes No Yes Yes Audit.Tests.ps1:629 <Command> should use a held privilege or report a missing one and continue to the next path | Audit.Tests.ps1:361 Should keep an audit entry that does not match exactly, given the path | Audit.Tests.ps1:371 Should remove an audit entry that matches exactly, given the path | Audit.Tests.ps1:384 Should return the audit entries of the item, not its access entries 2 (NTFSSecurity.Live.Tests.ps1:357, 398): SMB share with domain accounts; owner kept; the delegated account gets a RemoveAceError that names the missing privilege and leaves the SDDL unchanged; the file server counts the SACL entries (:1441) No test pipes paths or objects in, removes for several accounts, asserts the result of a succeeding path after a failing one, or removes only some rights (without -RemoveSpecific). An item without SACL is tested for no error only (Audit.Tests.ps1:406), and the owner retry cannot run on a local volume (Limit). TestNeeded Audit.Tests.ps1:631-669 and :672-679 assert ReadFileError/OpenError/target (RemoveAceError/WriteError/target as a basic user), the SACL changed with no rule left, and unchanged DACL/owner SDDL; :363-365 and :373-374 read back through Get-NTFSAudit. BoundBy 10 = scan 7 + PermissionScopes:159 (13 of 52 cases) + & $Command at Audit.Tests.ps1:629 and PathErrors.Tests.ps1:124; :386-388 assert type and the other entry but pass even if nothing was removed. Partly ParameterSets.Audit.Tests.ps1:343 Should remove the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and keep the other account's entry | ParameterSets.Audit.Tests.ps1:466 Should narrow an entry that grants more rights than it removes, instead of deleting it removing for several accounts in one call; state (empty Audit SDDL, unchanged DACL) of an item without a SACL; the owner retry after access denied budget; budget; Limit (needs a lab or a remote server)
25 audit Remove-NTFSAudit PathSimple False 0 0 1 1 Partly No No No Partly PermissionScopes.Tests.ps1:159 Should add and remove <Name> using <Form> on <Source>, preserving the other account 0 Only one data-driven call binds it: no failing item, pipeline input, several items, or owner and DACL check after the call, the objects are checked by Sid only, and it never runs without -RemoveSpecific. TestNeeded PermissionScopes.Tests.ps1:159 binds it only when Source=Path and Form=Flags (13 of 52 cases, always with -RemoveSpecific): :161-163 assert that the entry of the account is gone from -PassThru, that the other account remains, and that Get-NTFSAudit returns nothing for the account. BoundBy 1: the scan found 0 and this ambiguous splat call is the only one that binds the set. Closed ParameterSets.Audit.Tests.ps1:343 Should remove the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and keep the other account's entry | ParameterSets.Audit.Tests.ps1:484 Should remove the entry from the path when -Path, -Account, -AccessRights, and -AppliesTo are all named directly
26 audit Remove-NTFSAudit SDSimple False 0 0 1 1 Partly No No No Partly PermissionScopes.Tests.ps1:159 Should add and remove <Name> using <Form> on <Source>, preserving the other account 0 Only one data-driven call binds it: the changed descriptor is read only through -PassThru and Get-NTFSAudit, the item being untouched after the removal is not asserted, and no test makes it fail, pipes or passes several descriptors, or runs without -RemoveSpecific. TestNeeded PermissionScopes.Tests.ps1:159 binds it only when Source=SecurityDescriptor and Form=Flags (13 of 52 cases, always with -RemoveSpecific): :161-163 assert that the entry of the account is gone, that the other account remains, and that Get-NTFSAudit returns nothing; the SACL on disk is compared only after the Add (:156). BoundBy 1: the scan found 0 and this ambiguous splat call is the only one that binds the set. Partly ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:375 Should remove the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and keep the other account's entry | ParameterSets.Audit.Tests.ps1:501 Should remove the entry from the descriptor when -SecurityDescriptor, -Account, -AccessRights, and -AppliesTo are all named directly the item on disk being untouched after the removal, until Set-NTFSSecurityDescriptor writes it budget
27 audit Remove-NTFSAudit SDComplex False 2 0 1 5 Partly Partly No No Partly Audit.Tests.ps1:347 Should keep an audit entry that does not match exactly | Audit.Tests.ps1:353 Should remove an audit entry that matches exactly | Audit.Tests.ps1:425 <Command> should write an error and leave the descriptor without audit entries | PermissionScopes.Tests.ps1:159 Should add and remove <Name> using <Form> on <Source>, preserving the other account 0 The item being untouched after the removal and the result after Set-NTFSSecurityDescriptor are not asserted, the error test lacks category and target, and no test pipes or passes several descriptors, checks the -PassThru type, or asserts a removal without -RemoveSpecific. Exceptions of the change itself are open item 1 and are not to be pinned. TestNeeded Audit.Tests.ps1:349 and :355 read the in-memory SACL with .NET (non-matching entry kept, matching entry removed) and :427-432 assert one ReadSecurityError, no output and the SACL still empty; PermissionScopes.Tests.ps1:161-163 assert by Sid only. BoundBy 5 = scan 2 + PermissionScopes:159 (13 of 52 cases) + & $Command at Audit.Tests.ps1:425 and Access.Tests.ps1:881 (Should -Not -Throw only). Partly ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:375 Should remove the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and keep the other account's entry the item on disk untouched after the removal and the result after Set-NTFSSecurityDescriptor; the -PassThru output type; exceptions from the change itself (open item 1) budget; budget; MaintainerDecision (open item)
28 audit Clear-NTFSAudit Path True 3 1 0 5 Yes Yes No Yes NA Audit.Tests.ps1:629 <Command> should use a held privilege or report a missing one and continue to the next path | Audit.Tests.ps1:455 Should remove the audit entries and keep the owner | Audit.Tests.ps1:478 Should write no error and leave the access entries unchanged | Audit.Tests.ps1:495 Should write an error and leave the item unchanged 2 (NTFSSecurity.Live.Tests.ps1:652, plus :684 through & $Command that the scan cannot see): SMB share; explicit entry cleared with the inherited entry and the owner kept; the delegated account gets a ClearAclError that names the missing privilege and leaves the SDDL unchanged; the file server checks the SACL (:1453) -DisableInheritance on a path is passed (Audit.Tests.ps1:629) but its end state (protected SACL, no copied inherited entries) is never asserted, and no test pipes paths or asserts the result of a succeeding path after a failing one. The owner retry after access denied cannot run on a local volume (Limit). TestNeeded Audit.Tests.ps1:457-459 asserts no error, owner kept (.NET) and no entry left (Get-NTFSAudit); :480-483 and :497-499 assert an unchanged DACL and, without the privilege, a ClearAclError with an unchanged SDDL; :631-669 and :672-679 add category and target. BoundBy 5 = scan 3 + & $Command at Audit.Tests.ps1:629 and PathErrors.Tests.ps1:124. Partly ParameterSets.Audit.Tests.ps1:519 Should clear the audit entries of each path taken from the pipeline and leave the DACL of each unchanged | ParameterSets.Audit.Tests.ps1:540 Should protect the SACL and not copy the parent's inherited entry when clearing a child path the result of a succeeding path that follows a failing one; the owner retry after access denied budget; Limit (needs a lab or a remote server)
29 audit Clear-NTFSAudit SD False 2 0 0 3 Yes Partly No No NA Audit.Tests.ps1:696 Should clear and protect the descriptor SACL without writing the <Type> | SecurityDescriptorSets.Tests.ps1:107 Clear-NTFSAudit should remove the explicit audit entries of the descriptor | Audit.Tests.ps1:425 <Command> should write an error and leave the descriptor without audit entries 0 No test pipes descriptors or passes several (one without audit entries), and the error test asserts the ErrorId but not category or target. TestNeeded Audit.Tests.ps1:698-705 asserts the in-memory SACL cleared and protected (.NET), the SACL of the item untouched until Set-NTFSSecurityDescriptor, then the state on disk and an unchanged DACL; SecurityDescriptorSets.Tests.ps1:109-112 asserts the same for the unprotected form. BoundBy 3 = scan 2 + & $Command at Audit.Tests.ps1:425 (error case only). Closed ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:561 Should clear each piped descriptor that has an audit section and continue past one that does not
30 audit Get-NTFSAudit Path False 24 4 2 27 NA Partly No Partly Partly Audit.Tests.ps1:529 Should name the folder that an inherited entry comes from, also with -ExcludeExplicit | Audit.Tests.ps1:48 Should write an error without the Security privilege instead of returning nothing | PathErrors.Tests.ps1:124 <Command> should write a ReadFileError for it and continue with the next path | Inheritance.Tests.ps1:387 Should set enabled=<Enable> on a <Type>, remove requested audit entries=<Remove>, and leave the DACL unchanged 4 (NTFSSecurity.Live.Tests.ps1:336, 373, 656, 657): SMB share with domain accounts; Sid, AuditFlags and rights of the entry; the delegated account gets a ReadSecurityError that names the missing privilege No test pipes paths or FileInfo/DirectoryInfo into it, asserts the category of its errors or the target of ReadSecurityError, or (in unit tests) the type, AuditFlags and inheritance flags of the output. No unit test has a failing path followed by a path whose entries are asserted (Audit.Tests.ps1:70-73 documents that the second path of the test at :80 no longer fails), and the PermissionDenied branch cannot run on a local volume (Limit). TestNeeded Audit.Tests.ps1:50-52 asserts one ReadSecurityError by ErrorId only (basic user); :531-534 and :577-578 assert IsInherited and InheritedFrom; PathErrors.Tests.ps1:130-132 asserts ReadFileError and target for a missing path but discards the output (:124). BoundBy 27 = scan 24 + PermissionScopes:163 (26 of 52 cases) + & $Command at PathErrors.Tests.ps1:124 and Owner.Tests.ps1:98 (no -Path, Should -Not -Throw). Partly ParameterSets.Audit.Tests.ps1:590 Should return the entries of the existing path in either position and a ReadFileError, category OpenError, for the missing one | ParameterSets.Audit.Tests.ps1:619 Should return the entries of each path object taken from the pipeline by value | ParameterSets.Audit.Tests.ps1:634 Should write a ReadSecurityError with category OpenError and the path as target without the Security privilege the PermissionDenied category branch of ReadSecurityError Limit (needs a lab or a remote server)
31 audit Get-NTFSAudit SD False 1 0 2 3 NA Partly Partly No Partly Audit.Tests.ps1:61 Should write an error for a security descriptor that was read without the audit entries | SecurityDescriptorSets.Tests.ps1:160 Get-NTFSAudit should return the audit entries that it returns for the path | PermissionScopes.Tests.ps1:163 Should add and remove <Name> using <Form> on <Source>, preserving the other account 0 The output is compared only with the output of the Path set (no expected type, flags or values), at most one descriptor is piped, and no test passes several descriptors (one without audit entries). The error test lacks category and target. TestNeeded Audit.Tests.ps1:63-65 asserts no output and one ReadSecurityError; SecurityDescriptorSets.Tests.ps1:160-163 pipes one descriptor and asserts one entry equal to the Path result (Sid, AccessRights, AuditFlags); PermissionScopes.Tests.ps1:163 asserts only emptiness after a removal. BoundBy 3 = scan 1 + SecurityDescriptorSets:160 (piped by value, so SD) + PermissionScopes:163 (26 of 52 cases). Partly ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:648 Should return the entries of the piped descriptor that has an audit section and continue past one that does not an expected type, flags, or values for the output, independent of comparing it to the Path set's output budget
32 audit Get-NTFSOrphanedAudit Path False 9 1 2 9 NA Partly No Yes Yes Audit.Tests.ps1:228 Should return one object per entry whose account cannot be resolved | Audit.Tests.ps1:250 Should return an inherited entry, and nothing with -ExcludeInherited | Audit.Tests.ps1:279 Should write an error for a path that does not exist and continue with the next path without the Security privilege | Audit.Tests.ps1:304 Should write a ReadSecurityError without the Security privilege instead of returning nothing 1 (NTFSSecurity.Live.Tests.ps1:843): SMB share; the entry of a deleted domain account is returned with its SID, without error or warning No test pipes paths into it, asserts the category of ReadError or ReadSecurityError, or runs -ExcludeExplicit, and the elevated continuation test passes on an empty result (Audit.Tests.ps1:273). TestNeeded Audit.Tests.ps1:230-232, :238-239 and :253-256 assert count, type, Sid and IsInherited; :282-286 (basic user) asserts ReadError for the missing path and a ReadSecurityError with its own target for the next path, which shows that the cmdlet continued, while :270-273 (elevated) asserts one error and then only a ForEach over the result. BoundBy 9 = scan 9. Partly ParameterSets.Audit.Tests.ps1:670 Should return the orphaned entries of each path taken from the pipeline and write a ReadError, category OpenError, for one that does not exist the category of ReadSecurityError without the Security privilege; -ExcludeExplicit budget; budget
33 audit Get-NTFSOrphanedAudit SD False 0 0 2 2 NA Partly Partly No Partly Audit.Tests.ps1:243 Should read the entries of a security descriptor | Audit.Tests.ps1:294 Should write an error for a security descriptor that was read without the audit entries 0 At most one descriptor is piped and none is passed in an array, so continuation is untested; -Account and -Exclude* with a descriptor, the entry type and Sid, and the category and target of the error are not asserted. TestNeeded Both calls pipe one descriptor, which PowerShell binds by value to -SecurityDescriptor (the elevated run of :296-298 proves it: a Path binding would return entries): :245-246 assert 2 entries with FullName and :296-298 assert no output and one ReadSecurityError. BoundBy 2 = the two ambiguous piped calls (Audit.Tests.ps1:243 and :294); the scan found 0. Partly ParameterSets.Audit.Tests.ps1:102 <Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing | ParameterSets.Audit.Tests.ps1:691 Should return the orphaned entries of the piped descriptor that has an audit section and continue past one that does not | ParameterSets.Audit.Tests.ps1:713 Should return the orphaned entries when -SecurityDescriptor is named directly -Account and -ExcludeInherited/-ExcludeExplicit filters with a descriptor budget
34 inheritance Disable-NTFSAccessInheritance Path True 9 1 0 16 Partly Partly No Partly Yes Inheritance.Tests.ps1:318 Should set enabled=<Enable> on a <Type>, remove requested entries=<Remove>, and report the written state | PathErrors.Tests.ps1:157 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | PathErrors.Tests.ps1:301 Disable-NTFSAccessInheritance should take ownership, protect the DACL, and set the owner back | Inheritance.Tests.ps1:133 <_> should write an error and return nothing when the security descriptor cannot be read 1 (SMB as the delegated account, NTFSSecurity.Live.Tests.ps1:281-289: no error, owner Administrators kept, DACL protected by Get-Acl) Not asserted: the error category (OpenError, WriteError), piped input (documented: Get-ChildItem2 | Disable-NTFSAccessInheritance -PassThru), a .NET readback of the kept or removed inherited entries (only Get-NTFSAccess reads them), RestoreOwnerError, -PassThru with a failing item among several, and the documented no-op when no -Path is given. TestNeeded Inheritance.Tests.ps1:341-360 asserts the -PassThru object (type, FullName, flag) and reads flag, owner and entries back only with Get-NTFSInheritance, Get-NTFSOwner and Get-NTFSAccess; the .NET readbacks assert flag and owner only (PathErrors.Tests.ps1:307-309 and 183-191, DriveRoot.Tests.ps1:113). Errors: PathErrors.Tests.ps1:110-112 and 180-182 assert ErrorId and target, never the category; no test pipes into the cmdlet. BoundBy 16 = scan 9 (6 are fixtures) + 7 calls through & $Command or & $_ (PathErrors:108,178; Inheritance:139,152,339,456; Privileges:123). Partly ParameterSets.Inheritance.Tests.ps1:178 Should set the DACL protected flag to <Enable> and the explicit/inherited rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl | ParameterSets.Inheritance.Tests.ps1:345 <Command> should report <ErrorId> with category WriteError and target for the denied item, and still return the next item's new state with -PassThru | ParameterSets.Inheritance.Tests.ps1:368 <Command> should report RestoreOwnerError after a successful ownership retry and continue with the next path | ParameterSets.Inheritance.Tests.ps1:479 <Command> should take piped folders from Get-ChildItem2 and report the <Scope> inheritance state of each with -PassThru OpenError category for a path that does not exist; the documented no-op without -Path budget; budget
35 inheritance Disable-NTFSAccessInheritance SecurityDescriptor False 1 0 0 2 Yes NA No NA Yes SecurityDescriptorSets.Tests.ps1:71 Disable-NTFSAccessInheritance should protect the DACL of the descriptor and keep the inherited entries | Inheritance.Tests.ps1:543 <Command> should return the changed descriptor state without writing the <Type> 0 Not asserted: -RemoveInheritedAccessRules with a descriptor, the owner after the write, and several descriptors (array or pipeline). The set has no per-item handler, like the sets of open item 1 (which does not name it), but it cannot fail on a descriptor from Get-NTFSSecurityDescriptor. TestNeeded SecurityDescriptorSets.Tests.ps1:79-84 asserts the in-memory flag, the item unchanged before the write (Get-Acl), and after Set-NTFSSecurityDescriptor the flag and an explicit count equal to the inherited count (.NET); Inheritance.Tests.ps1:557-562 asserts count, FullName and flag of the -PassThru object. BoundBy 2 = scan 1 + Inheritance:555 (& $Command -SecurityDescriptor). Partly ParameterSets.Inheritance.Tests.ps1:255 <Command> -SecurityDescriptor should change the in-memory access entries per -<SwitchName>:<Remove>, applied to the item only after Set-NTFSSecurityDescriptor writes it | ParameterSets.Inheritance.Tests.ps1:513,547 <Command> -SecurityDescriptor should take two piped descriptors and report both in order, written only by Set-NTFSSecurityDescriptor the owner unchanged after the descriptor write budget
36 inheritance Enable-NTFSAccessInheritance Path True 3 1 0 10 Partly Partly No Partly Yes Inheritance.Tests.ps1:318 Should set enabled=<Enable> on a <Type>, remove requested entries=<Remove>, and report the written state | PathErrors.Tests.ps1:157 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | PathErrors.Tests.ps1:312 Enable-NTFSAccessInheritance should take ownership, let the DACL inherit, and set the owner back | DriveRoot.Tests.ps1:110 Should block and restore the access inheritance of the folder that the drive maps 1 (SMB as the delegated account, NTFSSecurity.Live.Tests.ps1:291-299: no error, owner kept, DACL inherits again by Get-Acl) Not asserted: the error category, piped input (documented: Get-NTFSInheritance output piped into Enable-NTFSAccessInheritance -RemoveExplicitAccessRules), a .NET readback of explicit and inherited entries after the call (only Get-NTFSAccess reads them), RestoreOwnerError, -PassThru with a failing item among several, and the documented no-op when no -Path is given. TestNeeded Inheritance.Tests.ps1:341-360 (Enable cases) asserts the object and reads re-inherited and explicit entries back only with Get-NTFSAccess; the .NET readbacks assert flag and owner only (PathErrors.Tests.ps1:319-321 and 190-191, DriveRoot.Tests.ps1:117). Errors as for Disable: ErrorId and target (PathErrors.Tests.ps1:110-112, 180-182), no category; no piped input. BoundBy 10 = scan 3 + 7 calls through & $Command or & $_ (PathErrors:108,178; Inheritance:139,152,339,456; Privileges:123). Partly ParameterSets.Inheritance.Tests.ps1:178 Should set the DACL protected flag to <Enable> and the explicit/inherited rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl | ParameterSets.Inheritance.Tests.ps1:345 <Command> should report <ErrorId> with category WriteError and target for the denied item, and still return the next item's new state with -PassThru | ParameterSets.Inheritance.Tests.ps1:368 <Command> should report RestoreOwnerError after a successful ownership retry and continue with the next path | ParameterSets.Inheritance.Tests.ps1:479 <Command> should take piped folders from Get-ChildItem2 and report the <Scope> inheritance state of each with -PassThru OpenError category for a path that does not exist; the documented no-op without -Path budget; budget
37 inheritance Enable-NTFSAccessInheritance SecurityDescriptor False 1 0 0 2 Partly NA No NA Yes SecurityDescriptorSets.Tests.ps1:87 Enable-NTFSAccessInheritance should let the DACL of the descriptor inherit | Inheritance.Tests.ps1:543 <Command> should return the changed descriptor state without writing the <Type> 0 Not asserted: -RemoveExplicitAccessRules with a descriptor, that an explicit entry survives a plain Enable (the test descriptor has none), and several descriptors (array or pipeline). The set works in memory, so it has no error path or handler to test. TestNeeded SecurityDescriptorSets.Tests.ps1:94-99 asserts the in-memory flag, the item still protected, then (.NET) the flag false and inherited entries present after the write; the descriptor has no explicit entry, so kept versus removed is unasserted. Inheritance.Tests.ps1:557-562 (Enable cases) asserts count, FullName and flag. BoundBy 2 = scan 1 + Inheritance:555. Closed ParameterSets.Inheritance.Tests.ps1:255 <Command> -SecurityDescriptor should change the in-memory access entries per -<SwitchName>:<Remove>, applied to the item only after Set-NTFSSecurityDescriptor writes it | ParameterSets.Inheritance.Tests.ps1:513,547 <Command> -SecurityDescriptor should take two piped descriptors and report both in order, written only by Set-NTFSSecurityDescriptor
38 inheritance Disable-NTFSAuditInheritance Path True 7 1 0 15 Partly Yes No Yes Yes Audit.Tests.ps1:606 <Command> should use a held privilege or report a missing one and continue to the next path | Inheritance.Tests.ps1:378 Should set enabled=<Enable> on a <Type>, remove requested audit entries=<Remove>, and leave the DACL unchanged | Inheritance.Tests.ps1:256 <Command> should set the audit inheritance of a <Type> and keep its access entries | Inheritance.Tests.ps1:113 <_> should return nothing when the audit change fails 2 (SMB: Admin and ServerAdmin write it and the file server checks the SACL with Get-Acl -Audit, NTFSSecurity.Live.Tests.ps1:632 and 1453-1458; the delegated account gets ModifySdError naming the missing privilege and the folder stays unchanged, :684-690) Unit tests read the SACL only through module cmdlets (no Get-Acl -Audit; the lab does, NTFSSecurity.Live.Tests.ps1:1453-1458), no test pipes into the set (documented: Get-ChildItem2 -Directory | Disable-NTFSAuditInheritance), and the documented no-op without -Path is untested. [Limit] The ownership retry and RestoreOwnerError of a SACL write cannot be provoked on a local volume (rule AUDIT-OWNER-RETRY). TestNeeded Audit.Tests.ps1:629-679 runs two paths with -PassThru: as a basic user ModifySdError/WriteError/target then ReadFileError/OpenError/target and an empty result (672-679), elevated the object flag, the explicit SACL rules and the unchanged DACL and owner (631, 654-657). Inheritance.Tests.ps1:401-419 reads the SACL back only through Get-NTFSInheritance and Get-NTFSAudit (the DACL through .NET at 405). BoundBy 15 = scan 7 + 8 calls through & $Command or & $_ (PathErrors:124; Inheritance:118,152,268,313,399; Privileges:123; Audit:629). Partly ParameterSets.Inheritance.Tests.ps1:220 Should set the SACL protected flag to <Enable> and the explicit/inherited audit-rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl -Audit | ParameterSets.Inheritance.Tests.ps1:479 <Command> should take piped folders from Get-ChildItem2 and report the <Scope> inheritance state of each with -PassThru the documented no-op without -Path; a successful ownership-retry/RestoreOwnerError of a SACL write budget; Limit, rule AUDIT-OWNER-RETRY needs a remote/SMB target
39 inheritance Disable-NTFSAuditInheritance SecurityDescriptor False 1 0 0 2 Partly NA No NA Yes Inheritance.Tests.ps1:565 <Command> should return the changed audit state without writing the <Type> | Inheritance.Tests.ps1:276 Should add no SACL to a security descriptor that was read without its audit entries 0 Not asserted: -RemoveInheritedAuditRules with a descriptor, an independent SACL readback after the write, the owner and DACL after the write, and several descriptors. The set accepts a descriptor without audit entries silently (pinned for Disable at Inheritance.Tests.ps1:276), unlike Add, Remove and Clear-NTFSAudit; see the notes. TestNeeded Inheritance.Tests.ps1:579-585 (elevated only) asserts count, FullName and flag of the object, the SACL SDDL unchanged until Set-NTFSSecurityDescriptor, and the flag after it, all through module cmdlets; :284-286 asserts that no SACL is added to a descriptor read without audit entries. BoundBy 2 = scan 1 (Inheritance:282) + Inheritance:577 (& $Command -SecurityDescriptor). Partly ParameterSets.Inheritance.Tests.ps1:513,547 <Command> -SecurityDescriptor should take two piped descriptors and report both in order, written only by Set-NTFSSecurityDescriptor -RemoveInheritedAuditRules with a descriptor as its own dedicated state test; the owner and DACL unchanged after the write budget; budget
40 inheritance Enable-NTFSAuditInheritance Path True 1 1 0 9 Partly Yes No Yes Yes Audit.Tests.ps1:606 <Command> should use a held privilege or report a missing one and continue to the next path | Inheritance.Tests.ps1:378 Should set enabled=<Enable> on a <Type>, remove requested audit entries=<Remove>, and leave the DACL unchanged | Inheritance.Tests.ps1:256 <Command> should set the audit inheritance of a <Type> and keep its access entries | PathErrors.Tests.ps1:118 <Command> should write a ReadFileError for it and continue with the next path 2 (SMB: the file server checks the SACL with Get-Acl -Audit, NTFSSecurity.Live.Tests.ps1:642 and 1453-1458; the delegated account gets ModifySdError naming the missing privilege and the folder stays unchanged, :684-690) Unit tests read the SACL only through module cmdlets (no Get-Acl -Audit), the result of -RemoveExplicitAuditRules is read back only with Get-NTFSAudit, no test pipes into the set (documented: Get-NTFSInheritance output piped into Enable-NTFSAuditInheritance), and the documented no-op without -Path is untested. [Limit] The ownership retry and RestoreOwnerError of a SACL write cannot be provoked on a local volume (rule AUDIT-OWNER-RETRY). TestNeeded Audit.Tests.ps1:660-662 (elevated) asserts the flag true and the explicit rules removed, and :672-679 the errors as a basic user; Inheritance.Tests.ps1:259-260 and 270-272 cover an item without SACL (flag by Get-NTFSInheritance, DACL by .NET). SACL state is never read with .NET in a unit test. BoundBy 9 = scan 1 (PipelineControl:284) + 8 calls through & $Command or & $_ (PathErrors:124; Inheritance:118,152,268,313,399; Privileges:123; Audit:629). Partly ParameterSets.Inheritance.Tests.ps1:220 Should set the SACL protected flag to <Enable> and the explicit/inherited audit-rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl -Audit | ParameterSets.Inheritance.Tests.ps1:479 <Command> should take piped folders from Get-ChildItem2 and report the <Scope> inheritance state of each with -PassThru the documented no-op without -Path; a successful ownership-retry/RestoreOwnerError of a SACL write budget; Limit, rule AUDIT-OWNER-RETRY needs a remote/SMB target
41 inheritance Enable-NTFSAuditInheritance SecurityDescriptor False 1 0 0 2 Partly NA No NA Yes SecurityDescriptorSets.Tests.ps1:115 Enable-NTFSAuditInheritance should let the SACL of the descriptor inherit | Inheritance.Tests.ps1:565 <Command> should return the changed audit state without writing the <Type> 0 Not asserted: -RemoveExplicitAuditRules with a descriptor, that an explicit audit entry survives a plain Enable, an independent SACL readback after the write, and several descriptors. Enable with an access-only descriptor is pinned only through Set-NTFSInheritance (Inheritance.Tests.ps1:524-539). TestNeeded SecurityDescriptorSets.Tests.ps1:119-126 (elevated) asserts the in-memory flag, the item still protected (Get-NTFSInheritance) and the flag after the write; Inheritance.Tests.ps1:579-585 (Enable cases) asserts count, FullName and flag. Nothing reads the SACL with .NET. BoundBy 2 = scan 1 + Inheritance:577. Partly ParameterSets.Inheritance.Tests.ps1:513,547 <Command> -SecurityDescriptor should take two piped descriptors and report both in order, written only by Set-NTFSSecurityDescriptor -RemoveExplicitAuditRules with a descriptor as its own dedicated state test; an explicit audit entry surviving a plain Enable budget; budget
42 inheritance Get-NTFSInheritance Path True 23 4 0 27 NA Partly No Partly Partly PathErrors.Tests.ps1:104 <Command> should write a <ErrorId> for it and continue with the next path | PathErrors.Tests.ps1:140 <Command> should write a ReadSecurityError for it and continue with the next path | Inheritance.Tests.ps1:78 Should report the disabled audit inheritance of a <Type> as for its path | Inheritance.Tests.ps1:54 Should report the same state as for the path of the item 4 (SMB: protected DACL with inherited audit flag, NTFSSecurity.Live.Tests.ps1:661-666; null audit state without the Security privilege, :695-700; two of the four calls are read-backs, :636 and :646) Not asserted: FullName, Name, type or exact count of the output, a protected state created without the module (all protected states come from the module's own cmdlets), the error category, piped input (documented: Get-ChildItem2 | Get-NTFSInheritance), and the result for no -Path (documented: current location; Owner.Tests.ps1:92 asserts -Not -Throw only). [Limit] The documented ownership retry has no success path on a local volume. TestNeeded Inheritance.Tests.ps1:58-59, 74-75 and 88-90 assert only the flags (the descriptor result equals the -Path result; audit false after Disable-NTFSAuditInheritance), no FullName, type or count. PathErrors.Tests.ps1:110-115 and 147-152 assert ErrorId, target and non-empty output for the next path, no category. BoundBy 27 = scan 23 + 4 calls through & $Command or & $_ (PathErrors:108,145; Owner:98; Privileges:123). Partly ParameterSets.Inheritance.Tests.ps1:385 <Command> should write <ErrorId> with category OpenError for a path that does not exist, and return exactly one object for the next path | ParameterSets.Inheritance.Tests.ps1:564,573 Get-NTFSInheritance should take piped folder objects from Get-ChildItem2 and a piped custom object by its FullName property the Name property of the output; a protected state created without the module; the result for no -Path; a successful ownership-retry read budget; budget; budget; Limit, no local volume reaches the success path
43 inheritance Get-NTFSInheritance SecurityDescriptor False 4 0 0 4 NA NA No NA Partly Inheritance.Tests.ps1:54 Should report the same state as for the path of the item | Inheritance.Tests.ps1:65 Should report the same state as for the path of a <Type> without audit entries | Inheritance.Tests.ps1:78 Should report the disabled audit inheritance of a <Type> as for its path | Inheritance.Tests.ps1:93 Should report the audit inheritance as $null for a security descriptor without the audit entries 0 Not asserted: FullName, Name, type, exact count, several descriptors, a protected descriptor created without the module, and piped descriptors (documented: Get-NTFSSecurityDescriptor | Get-NTFSInheritance). The set works in memory and cannot fail on a readable descriptor. TestNeeded Inheritance.Tests.ps1:58-59, 74-75, 88-90 and 100-101 compare the flags with the -Path result and assert a null audit state for an access-only descriptor; none asserts FullName, Name, type, count or several descriptors. BoundBy 4 = scan 4. Partly ParameterSets.Inheritance.Tests.ps1:586,596 Get-NTFSInheritance -SecurityDescriptor should take two piped descriptors, one protected, and report both in order the type of the output (BeOfType); a protected descriptor created without the module budget; budget
44 inheritance Set-NTFSInheritance Path True 14 1 0 18 Partly Partly No Partly Partly Inheritance.Tests.ps1:164 Should keep the inherited access entries as explicit ones when it disables access inheritance | PathErrors.Tests.ps1:157 <Command> should keep the denied item unchanged, report <ErrorId>, and process the next item | PathErrors.Tests.ps1:324 Set-NTFSInheritance should take ownership, protect the DACL, and set the owner back | Inheritance.Tests.ps1:422 Set-NTFSInheritance should re-enable audit inheritance on a <_> and keep its explicit audit entry 1 (SMB as the delegated account, NTFSSecurity.Live.Tests.ps1:302-309: DACL protected, owner kept) No test pipes into the set, including the documented round trip (Get-NTFSInheritance output piped into Set-NTFSInheritance, which binds both flags by property name); the SACL and the access-enable direction are read back only through module cmdlets. Also not asserted: the error category, the FullName of the -Path -PassThru object, RestoreOwnerError, -PassThru with a failing item among several, and the documented no-op without -Path. TestNeeded Inheritance.Tests.ps1:173-175 (.NET flag and explicit count), 428-433 (object, entries, DACL unchanged by .NET) and PathErrors.Tests.ps1:330-332 and 180-191 (owner, denied item unchanged, next item protected) are the strongest; the SACL and the access-enable direction are read back only with module cmdlets (Inheritance.Tests.ps1:371-373, 431-432). Inheritance.Tests.ps1:127-130 asserts no object after a failed audit change for one item, as a basic user only. BoundBy 18 = scan 14 + 4 calls through & $Command or & $_ (PathErrors:108,178; Inheritance:268; Privileges:123). Partly ParameterSets.Inheritance.Tests.ps1:345 <Command> should report <ErrorId> with category WriteError and target for the denied item, and still return the next item's new state with -PassThru | ParameterSets.Inheritance.Tests.ps1:368 <Command> should report RestoreOwnerError after a successful ownership retry and continue with the next path | ParameterSets.Inheritance.Tests.ps1:609 Set-NTFSInheritance should restore a saved inheritance state through the pipeline by property name an independent SACL readback of the result; OpenError category for a path that does not exist; the documented no-op without -Path budget; budget; budget
45 inheritance Set-NTFSInheritance SecurityDescriptor False 5 0 0 5 Partly NA No NA Yes Inheritance.Tests.ps1:465 Should set access inheritance enabled=<Enable> on a <Type> only when the descriptor is written | Inheritance.Tests.ps1:494 Should set audit inheritance enabled=<Enable> on a <Type> without changing its DACL or owner | Inheritance.Tests.ps1:524 Should keep audit inheritance unknown when requested enabled=<_> on an access-only descriptor | Inheritance.Tests.ps1:180 Should keep the inherited access entries of a security descriptor 0 Not asserted: several descriptors (array or pipeline), a single call that sets both -AccessInheritanceEnabled and -AuditInheritanceEnabled, and an independent SACL readback after the write (the audit side uses module cmdlets). The set works in memory and cannot fail on a readable descriptor. TestNeeded Inheritance.Tests.ps1:481-491 asserts count, FullName, Name, flag, the item unchanged until Set-NTFSSecurityDescriptor, then flag and owner by .NET and the explicit entry; :511-521 (elevated) does the audit side through module cmdlets; :533-539 asserts a null audit state and no SACL for an access-only descriptor. BoundBy 5 = scan 5. Closed ParameterSets.Inheritance.Tests.ps1:288 Set-NTFSInheritance -SecurityDescriptor should set both inheritance flags in one call, changing only the in-memory descriptor until it is written | ParameterSets.Inheritance.Tests.ps1:621,638 Set-NTFSInheritance -SecurityDescriptor should protect both descriptors in memory, written only by Set-NTFSSecurityDescriptor, piped and passed directly to the parameter
46 inheritance Get-NTFSOwner Path True 22 4 3 26 NA Partly Partly Partly Yes Owner.Tests.ps1:47 Should write one permission error and keep the owner | PathErrors.Tests.ps1:140 <Command> should write a ReadSecurityError for it and continue with the next path | DriveRoot.Tests.ps1:45 Get-NTFSOwner should return the owner of the root folder | ObjectApis.Tests.ps1:725 Should name the item and the account of an owner object 4 (SMB: owner Administrators, NTFSSecurity.Live.Tests.ps1:585-589; three calls check that the privileges are disabled after a later command ends the pipeline, :1406, 1411, 1422) No test asserts ErrorId, category and target together (Owner.Tests.ps1:55-56 id and category, PathErrors.Tests.ps1:148-149 id and target); piping covers one FileInfo only (documented: Get-ChildItem2 -Recurse | Get-NTFSOwner); the next item's output is asserted only as non-empty; the documented 'returns nothing' without -Path is untested. TestNeeded Owner.Tests.ps1:53-56 asserts no output, one error, ReadSecurityError and PermissionDenied (basic user only, skipped with the Backup privilege); PathErrors.Tests.ps1:147-151 asserts id, target and non-empty output for the next path; DriveRoot.Tests.ps1:46 compares Owner.Sid with Get-Acl; ObjectApis.Tests.ps1:730-732 (line numbers at HEAD 6696f68; +19 in a work tree with the uncommitted ObjectApis edit) asserts Item, FullName and Account. BoundBy 26 = scan 22 + ambiguous Owner:177 and :185 (both bind Path) + PathErrors:108,145. Partly ParameterSets.Inheritance.Tests.ps1:400 Get-NTFSOwner should write a ReadSecurityError with its id, category, and target together for a denied item, and return exactly one object for the next path | ParameterSets.Inheritance.Tests.ps1:652 Get-NTFSOwner should take two piped folders from Get-ChildItem2 and return the owner of each, verified with Get-Acl the documented 'returns nothing' without -Path budget
47 inheritance Get-NTFSOwner SecurityDescriptor False 0 0 3 1 NA NA Partly NA Partly SecurityDescriptorSets.Tests.ps1:146 Get-NTFSOwner should return the owner that it returns for the path 0 One test, one descriptor; the owner is compared with the -Path result of the same cmdlet, with no .NET oracle, no type assertion and no several descriptors. The result for a descriptor read without its Owner section is unexercised (see the notes). TestNeeded The scan's ambiguous rows Owner.Tests.ps1:177 (System.IO DirectoryInfo by position) and :185 (System.IO FileInfo piped) bind Path: FileSystemPathTransformation turns a file system object into its path, and those types do not convert to FileSystemSecurity2[]. Only SecurityDescriptorSets.Tests.ps1:149-153 binds the set: a FileSystemSecurity2 piped by value, asserting count 1, Owner.Sid against the -Path result and FullName. BoundBy 1 (scan 0 + that call). Partly ParameterSets.Inheritance.Tests.ps1:676,686 Get-NTFSOwner -SecurityDescriptor should return the owner of each descriptor, piped and passed directly to the parameter, verified with Get-Acl the result for a descriptor read without its Owner section budget, a read-only probe just now shows it returns the item's real owner, not a crash, so it is safely testable and simply was not written
48 inheritance Set-NTFSOwner Path True 8 4 1 10 Partly Partly Yes Partly Yes Owner.Tests.ps1:240 Should set an owner that only the Restore privilege allows | Owner.Tests.ps1:232 Should take the items from the pipeline | Owner.Tests.ps1:270 Should write a SetOwnerError and keep the owner | Owner.Tests.ps1:248 Should write a read error for a path that does not exist and continue with the next path 4 (SMB: take ownership as the account itself, assign another account only with the file server's Restore privilege (SetOwnerError for the delegated account), NTFSSecurity.Live.Tests.ps1:595 and 604; a later command that stops the pipeline leaves the second item's owner unchanged, :1143, 1182) Not asserted: DACL, SACL and group unchanged after the owner changes; as a basic user the owner already equals the user, so Owner.Tests.ps1:217, 229 and 256 cannot show a change; the error category and target (SetOwnerError); -PassThru with a failing item among several; and the documented no-op without -Path. TestNeeded Owner.Tests.ps1:245 (.NET owner is TrustedInstaller, needs the Restore privilege), :225-229 (count, type, FullName, Owner.Sid, .NET owner), :237 (two piped Get-Item2 objects) and :277-279 (SetOwnerError id only, owner unchanged). The scan's ambiguous Owner:235 binds Path (the Get-Item2 objects bind by their FullName property). BoundBy 10 = scan 8 + Owner:235 + PathErrors:108. Partly ParameterSets.Inheritance.Tests.ps1:314 Set-NTFSOwner should change only the owner and leave the Access entries and the group unchanged | ParameterSets.Inheritance.Tests.ps1:427,444 Should write <ErrorId> with its category and target for <Scenario>, and keep processing the remaining path the SACL unchanged after the owner changes; the documented no-op without -Path budget; budget
49 inheritance Set-NTFSOwner SecurityDescriptor False 2 0 1 2 Partly NA No NA Partly Owner.Tests.ps1:284 Should change only the descriptor in memory until Set-NTFSSecurityDescriptor writes it | Owner.Tests.ps1:303 Should write nothing without -PassThru and leave the owner of the item unchanged 0 The persisted-owner test is skipped for basic users (Owner.Tests.ps1:287-290); not asserted: DACL unchanged after the write, FullName and type of the -PassThru object (only the -Path set asserts them), and several descriptors (array or pipeline). TestNeeded Owner.Tests.ps1:296-300 asserts count, Owner.Sid, the item's owner unchanged until Set-NTFSSecurityDescriptor and changed after (.NET), but the test is skipped when the user owns new items (:287-290); :312-314 asserts no output without -PassThru, the in-memory owner and the item's owner unchanged. BoundBy 2 = scan 2. Partly ParameterSets.Inheritance.Tests.ps1:698,713 Set-NTFSOwner -SecurityDescriptor should change both owners in memory without touching the items, piped and passed directly to the parameter the DACL unchanged after the write; the type of the -PassThru object (BeOfType) budget; budget
50 inheritance Get-NTFSSecurityDescriptor __AllParameterSets False 79 5 0 82 NA Partly No Partly Yes SecurityDescriptor.Tests.ps1:52 Should report the inherited access entries as inherited | SecurityDescriptor.Tests.ps1:63 Should read the owner and the audit entries with the access entries | DriveRoot.Tests.ps1:39 Get-NTFSSecurityDescriptor should read the DACL of the root folder | PathErrors.Tests.ps1:140 <Command> should write a ReadSecurityError for it and continue with the next path 5 (SMB read-backs for the descriptor tests, NTFSSecurity.Live.Tests.ps1:315, 965, 1150, and InheritedFrom of a vanished item, :988, 1017) Untested combinations: piped paths and file or folder objects (documented: Get-ChildItem2 | Get-NTFSSecurityDescriptor), no -Path (current location; Owner.Tests.ps1:92 asserts -Not -Throw only), the error category, and that the next item yields exactly one descriptor. [Limit] The documented ownership retry has no success path on a local volume. TestNeeded SecurityDescriptor.Tests.ps1:59-60 (inherited flags against the Get-Acl count) and :70-71 (owner against Get-Acl, audit rules) need the Security privilege; DriveRoot.Tests.ps1:42 compares the DACL SDDL with Get-Acl; PathErrors.Tests.ps1:110-115 and 147-152 assert ReadFileError and ReadSecurityError with target and non-empty output. BoundBy 82 = scan 79 + 3 calls through & $Command or & $_ (PathErrors:108,145; Owner:98). Partly ParameterSets.Inheritance.Tests.ps1:385 <Command> should write <ErrorId> with category OpenError for a path that does not exist, and return exactly one object for the next path | ParameterSets.Inheritance.Tests.ps1:727,738,745 Get-NTFSSecurityDescriptor should take piped folder objects, a standard Get-Item object, and a piped custom object by its Path property the result for no -Path (current location); a successful ownership-retry read budget; Limit, no local volume reaches the success path
51 inheritance Set-NTFSSecurityDescriptor __AllParameterSets False 29 4 0 29 Yes Yes Yes Yes Yes SecurityDescriptor.Tests.ps1:299 Should report a denied write, return no failed item, and write the next descriptor | SecurityDescriptor.Tests.ps1:249 Should report RestoreOwnerError for a previous owner that it cannot set back after the write | SecurityDescriptor.Tests.ps1:213 Should return the written descriptor with -PassThru also when it took ownership for the write | SecurityDescriptor.Tests.ps1:133 Should not write back the access entries of an unchanged descriptor 4 (SMB: writes the added entry and keeps the owner, NTFSSecurity.Live.Tests.ps1:317; writes the cleared DACL without RestoreOwnerError, :968; a later command that stops the pipeline leaves the second descriptor unwritten, :1154, 1165) Untested combinations: positional binding (declared Position 2), the by-property-name pipeline form, and the category and target of the -PassThru ReadSecurityError (only its ErrorId is asserted, SecurityDescriptor.Tests.ps1:361). [Limit] A failing SACL write needs a lab. None SecurityDescriptor.Tests.ps1:308-317 pipes two descriptors with -PassThru and asserts WriteSdError, category WriteError, target, the denied item's SDDL unchanged (.NET), one object for the next item and its entry; :259-264 asserts RestoreOwnerError with category and target; :223-226 asserts the -PassThru object after an ownership retry. BoundBy 29 = scan 29 (no calls through variables). None positional binding at Position 2; the by-property-name pipeline form; category and target of the -PassThru ReadSecurityError would-pin, Position 2 vs siblings' Position 1 looks like an undecided inconsistency per the notes; budget, row judged GapKind None; budget, row judged GapKind None
52 items Copy-Item2 __AllParameterSets False 6 4 0 20 Yes Yes No Yes Partly ItemCmdlets.Tests.ps1:793 <Command> should write a <ErrorId> for a source that another process has locked and continue with the next path | ItemCmdlets.Tests.ps1:822 <Command> should write a <ErrorId> for each source when the destination folder denies new files | ItemCmdlets.Tests.ps1:642 <_> should write DestinationFileAlreadyExists for a folder that exists at the destination and change nothing | ItemCmdlets.Tests.ps1:681 Copy-Item2 -Force should copy a folder into an existing folder of the same name and replace the files in both 4: -WhatIf onto an existing file on a share (#108, administrator); copy of a file and a folder as the delegated account; later-command stop on a share No test pipes paths into it (documented: Get-ChildItem2 | Copy-Item2 -Destination), passes an empty or null -Path, a FileInfo object, a path with brackets, a path over 260 characters or a drive root, and -Force replacing an existing file is covered only through the folder merge. FileNotFound and the file case of DestinationFileAlreadyExists are asserted by error count only, and -PassThru asserts FullName but not the output type or that nothing is written without it. TestNeeded ItemCmdlets.Tests.ps1:793-808 and :822-834 assert ErrorId, category, target, exception type, only the second item's result and untouched sources; :605-613 and :644-649 read the folder conflict and the merge back; Owner.Tests.ps1:160-163 reads the copied content. 14 of the 20 call sites are '& $Command' calls in ItemCmdlets.Tests.ps1 (lines 514 to 814) that the scan does not resolve. Partly ParameterSets.Items.Tests.ps1:36 <Command> should accept <InputKind> piped by value and still process the surrounding items | ParameterSets.Items.Tests.ps1:229 <Command> should reject -Path <CaseName> instead of silently using the current location a path with brackets; a path over 260 characters; a drive root; -Force replacing an existing file (still only covered through the folder merge); the file case of DestinationFileAlreadyExists with category/target (still error count only); -PassThru output type; that nothing is written without -PassThru budget (all items; none needs a lab, none pins an open maintainer decision)
53 items Get-ChildItem2 __AllParameterSets False 34 8 0 36 NA Yes No Yes Yes ItemCmdlets.Tests.ps1:98 Should apply <Case> without broadening the other attribute filters | ItemCmdlets.Tests.ps1:137 Should return the exact tree for <Case> | ItemCmdlets.Tests.ps1:319 Should report the denied folder and continue with the next path | ItemCmdlets.Tests.ps1:377 Should report a junction whose target was removed as a DirUnspecifiedError and continue with the next folder 8: over SMB: path over 260 characters (administrator), -Hidden and a listing (delegated account), -Filter cases, later-command stop with a denied nested folder No test pipes folders or strings into -Path (documented by value and by FullName), asserts the result of omitting -Path or of a relative -Path (Owner.Tests.ps1:98 only asserts no throw), or lists a drive root or a path over 260 characters in a unit test. -Directory with -File, -Attributes with -Force/-Hidden/-System/-ReadOnly (documented: ignored), -Depth without -Recurse and the dir2 alias are unasserted, and FileNotFound and AttributesEmpty are asserted without category (and without target for AttributesEmpty); the -Filter dot rules are pinned already and are the maintainer's, so they are not counted here. TestNeeded ItemCmdlets.Tests.ps1:98-100 and :137-140 assert exact name sets for ten attribute-switch cases and for the Recurse/Depth/Directory/File/Filter cases; :282-289 and :340-348 assert ErrorId, category, target (and exception type) and that the next path or sibling is still listed; :44-49 and :402-406 assert the AlphaFS types; PathErrors.Tests.ps1:108-114 covers FileNotFound (ID and target only). Partly ParameterSets.Items.Tests.ps1:91 Should accept piped folders by value, write one error for a path that does not exist, and list the items of the other folders | ParameterSets.Items.Tests.ps1:111 Should accept folder objects piped from Get-ChildItem2 -Directory and list only the files directly below them the result of an omitted -Path; the result of a relative -Path; a drive root in a unit test; a path over 260 characters in a unit test; -Directory with -File together; -Attributes with -Force/-Hidden/-System/-ReadOnly; -Depth without -Recurse; the dir2 alias; AttributesEmpty category and target budget (all items; the -Filter dot rules are the maintainer's and were already excluded from this Gap)
54 items Get-Item2 __AllParameterSets False 17 1 0 19 NA Partly No Partly Partly PathErrors.Tests.ps1:108 <Command> should write a <ErrorId> for it and continue with the next path | ItemCmdlets.Tests.ps1:972 Get-Item2 should resolve <Path> against the current location | Owner.Tests.ps1:235 Should take the items from the pipeline | PipelineControl.Tests.ps1:124 <Name> should stop after the first object for Select-Object -First 1 and change nothing else 1: FullName and Length of a file on a share (delegated account) No test pipes paths into it (documented: 'C:\Data','C:\Data\Reports' | Get-Item2) or omits -Path (documented: the current location), and the output type (FileInfo or DirectoryInfo) and the Mode property are never asserted; bracket paths, paths over 260 characters and a drive root are untested. The FileNotFound category is not asserted and the output for the next path is checked only as non-empty. TestNeeded PathErrors.Tests.ps1:108-114 asserts one FileNotFound error with the missing path as target and non-empty output for the next path; ItemCmdlets.Tests.ps1:972-980 asserts HaveCount 1 and FullName for six relative paths. 15 of the 17 scan calls are fixtures that feed descriptors or other cmdlets (Access, Audit, Inheritance, ObjectApis, Owner, SecurityDescriptor). Partly ParameterSets.Items.Tests.ps1:133 Should accept piped items by value, return each in order with its output type, and write one error for a path that does not exist an omitted -Path defaulting to the current location; bracket paths; paths over 260 characters; a drive root budget (all items)
55 items Move-Item2 __AllParameterSets False 7 3 0 21 Yes Yes No Yes Yes ItemCmdlets.Tests.ps1:793 <Command> should write a <ErrorId> for a source that another process has locked and continue with the next path | ItemCmdlets.Tests.ps1:822 <Command> should write a <ErrorId> for each source when the destination folder denies new files | ItemCmdlets.Tests.ps1:658 Move-Item2 -Force should replace an existing file with PassThru=<_> | ItemCmdlets.Tests.ps1:878 Should refuse to move <Kind> folder to another volume and leave it in place 3: -WhatIf onto an existing file on a share (administrator); move of a file as the delegated account; later-command stop on a share No test pipes paths into it (documented), passes an empty or null -Path, moves a non-empty folder tree, or renames an item inside one folder on the same volume (the cross-volume cases need an elevated admin share), and -Force replacing a folder, bracket or wildcard paths, paths over 260 characters and a drive-root destination are untested. FileNotFound is asserted by error count only. TestNeeded ItemCmdlets.Tests.ps1:658-668 asserts the source is gone, the content at the destination and PassThru true and false; :576-592 asserts the moved file and folder (DirectoryInfo) and the removed source folder; :756-771 and :785-797 assert ErrorId, category, target, exception type and the other item's result. The cross-volume tests at :841-878 skip without an elevated admin share. Partly ParameterSets.Items.Tests.ps1:36 <Command> should accept <InputKind> piped by value and still process the surrounding items | ParameterSets.Items.Tests.ps1:229 <Command> should reject -Path <CaseName> instead of silently using the current location moving a non-empty folder tree; renaming an item in place on the same volume; -Force replacing a folder; bracket or wildcard paths; paths over 260 characters; a drive-root destination budget (all items)
56 items Remove-Item2 __AllParameterSets False 15 2 0 16 Yes Yes No Yes Partly Remove-Item2.Tests.ps1:43 Should report DeleteError for a non-empty folder without -Recurse and continue with the next path | Remove-Item2.Tests.ps1:104 Should write DeleteError when a descendant is open without delete sharing, not a successful -PassThru result | Remove-Item2.Tests.ps1:126 Should delete a junction with -Recurse without deleting or changing its target | Remove-Item2.Tests.ps1:77 Should leave a folder tree unchanged with -Recurse -Force -WhatIf and write nothing with -PassThru 2: removal of a file on a share as the delegated account; later-command stop on a share No test pipes items into it (documented: Get-ChildItem2 ... | Remove-Item2), omits -Path (documented: the cmdlet does nothing), passes an empty or null -Path (the ValidateNotNullOrEmpty guard that keeps it from meaning the current location), passes bracket or wildcard paths (documented: literal) or uses rm2/del2. FileNotFound is asserted by error count only (ItemCmdlets.Tests.ps1:544), the access-denied branch of DeleteError (category NotSpecified) is unasserted, and that a successful removal without -PassThru writes nothing is not asserted. TestNeeded Remove-Item2.Tests.ps1:43-52 asserts DeleteError, InvalidData, target, kept content, the removed next item and exactly one result; :104-114 and :152-158 assert DeleteError and no success-shaped result with the content kept; :126-130 asserts the junction is removed and its target content and SDDL are unchanged; :176-184 covers the -PassThur alias. Partly ParameterSets.Items.Tests.ps1:157 Should accept piped items by value, write one error for a non-empty folder, remove the files, and keep the folder | ParameterSets.Items.Tests.ps1:185 Remove-Item2 should reject -Path <CaseName> instead of removing the current location -Path omitted entirely (documented: the cmdlet does nothing); bracket or wildcard paths; the rm2/del2 aliases; FileNotFound category/target (still error count only); the access-denied DeleteError branch (category NotSpecified); that a successful removal without -PassThru writes nothing budget (all items)
57 items Test-Path2 __AllParameterSets False 14 3 0 14 NA NA Partly Yes Yes ItemCmdlets.Tests.ps1:1004 Should return <Expected> for a <Kind> with -PathType <PathType> | ItemCmdlets.Tests.ps1:1046 Should return $false for a path with the character <_> and continue with the next path | ItemCmdlets.Tests.ps1:1037 Should find a folder whose path is longer than 260 characters | ItemCmdlets.Tests.ps1:1018 Should take the items from the pipeline 3: file, folder and missing item with -PathType on a share (delegated account) The pipeline test pipes one file; no test pipes several items (documented: Get-ChildItem2 -Recurse | Test-Path2 -PathType Leaf) or objects with PathType by property name, or tests a drive root, a UNC path or a bracket path. Errors are NA because the cmdlet writes $false for a missing or invalid path; its PathNotFound handler looks unreachable (see the notes). TestNeeded ItemCmdlets.Tests.ps1:1004-1009 asserts one [bool] with the expected value for file, folder and missing item under all three -PathType values; :1009-1013 asserts no error and 'False,True' for six invalid characters followed by a valid path; :981-983 pipes one FileInfo; :992-1001 covers a folder path over 260 characters. Open piping several items into -Path; -PathType bound by property name; a drive root; a UNC path; a bracket path budget (deprioritized: PipelineInput was already Partly, not No, so lower priority than the cmdlets with no pipeline test at all)
58 items Get-FileHash2 __AllParameterSets False 12 2 0 13 Partly Partly Partly Partly Yes FileHash.Tests.ps1:41 Should return the hash of Get-FileHash for <_> | FileHash.Tests.ps1:94 Should skip the folder and hash the files that follow it | FileHash.Tests.ps1:108 Should write an error and no result for the file | FileHash.Tests.ps1:153 Should report both the failed read and the failed owner restoration without returning a hash 2: SHA256 equals Get-FileHash on a share (delegated account); later-command stop at the verbose message No test pipes FileInfo/DirectoryInfo objects or folders (documented: Get-ChildItem2 -Recurse | Get-FileHash2) or Algorithm by property name, hashes a relative path or a path over 260 characters, or puts the failing path first and asserts the next hash; no error category is asserted. The owner-restore tests run only elevated and read the owner back with Get-NTFSOwner, and the retry that succeeds after taking ownership is untested. TestNeeded FileHash.Tests.ps1:41-44 compares Hash and Algorithm with Get-FileHash for five algorithms; :94-98 skips a folder and hashes the next file with the SHA256 default; :108-115 asserts one error and no result for a locked file; :153-160 (elevated only) asserts RestoreOwnerError and GetHashError with target, no result and the restored owner; OutputTypes.Tests.ps1:57 asserts the type name. Partly ParameterSets.Items.Tests.ps1:531 Should accept Get-ChildItem2 objects piped by value, skip a folder, and match Get-FileHash for each file | ParameterSets.Items.Tests.ps1:565 Should write GetHashError with its category for a locked file first, hash the file that follows it, and resolve a relative path -Algorithm bound by property name from the pipeline; a path over 260 characters; the ownership-retry-after-taking-ownership success path -Algorithm by property name and >260 chars: budget; ownership-retry success: Limit (elevated-only, needs a DACL/owner setup not shown buildable)
59 items Get-DiskSpace __AllParameterSets False 6 0 0 6 NA Partly NA No Yes ItemCmdlets.Tests.ps1:1075 Should return the size of the system drive | ItemCmdlets.Tests.ps1:1093 Should return the volumes with a size greater than zero without -DriveLetter | ItemCmdlets.Tests.ps1:1109 Should warn and return nothing for a drive letter without a volume | ItemCmdlets.Tests.ps1:1117 Should reject a drive letter without a colon 0 No test passes several drive letters, so the documented warn-and-continue for a letter without a volume is never combined with a valid letter; lower-case letters, positional binding and the free-space values against an independent source are unasserted. The validation error is asserted by ErrorId only (no category or target). TestNeeded ItemCmdlets.Tests.ps1:1075-1080 asserts type, DriveName and TotalNumberOfBytes against System.IO.DriveInfo; :1072-1077 asserts the exact warning text and no output or error for a letter without a volume; :1056-1061 asserts every volume has a size above zero and the system drive is included; :1080-1081 asserts the ErrorId of the validation error. Partly ParameterSets.Items.Tests.ps1:470 Should return only the system drive and warn for a drive letter without a volume, regardless of order (<Order>) | ParameterSets.Items.Tests.ps1:491 Should accept a lower-case drive letter positionally and report the same total size as .NET the free-space values (TotalNumberOfFreeBytes/FreeBytesAvailable) against an independent source (only TotalNumberOfBytes was compared); the validation error's category and target (still ErrorId only) budget (both items)
60 items New-NTFSHardLink __AllParameterSets False 14 2 0 17 Yes Yes Yes Yes Yes Links.Tests.ps1:134 Should write a non-terminating error for each link that it cannot create and continue with the next one | Links.Tests.ps1:170 Should write a PermissionDenied error and create no link in a folder that denies new files | Links.Tests.ps1:67 Should return every name of the file with -PassThru | Links.Tests.ps1:79 Should give both names the same data 2: link creation on a share (administrator) and -PassThru, which writes GetHardLinkError there Positional binding (documented example 2), a FileInfo object bound to -Path or -Target and the end of a pipeline by a later command are untested; the -PassThru GetHardLinkError on a share is asserted by ErrorId only (no category or target) and only with an elevated admin share. A hard link across volumes cannot be built on a one-volume host. TestNeeded Links.Tests.ps1:134-145 pipes four objects by property name and asserts three errors (ErrorId, categories, targets, message), the created link and unchanged files; :170-179 asserts PermissionDenied, exception type, no output and no link; :36-41, :67-73 and :79-84 read back existence, all names and the shared data. Three of the 17 call sites (Links.Tests.ps1:450, 468, 494) are '& $Command' calls that the scan does not resolve. Partly ParameterSets.Items.Tests.ps1:264 <Command> should reject <CaseName> instead of creating a link to the current folder | ParameterSets.Items.Tests.ps1:324 New-NTFSHardLink should stop after the first pass-through object for Select-Object -First 1 and leave the second request untouched positional binding (documented example 2); a FileInfo object bound to -Path or -Target; the -PassThru GetHardLinkError category and target on an admin share (still ID only) budget (all items; an elevated admin share is already available on this host, simply not used for this)
61 items Get-NTFSHardLink __AllParameterSets False 9 1 0 10 NA Partly Yes Yes Partly Links.Tests.ps1:224 Should write an error for a path that does not exist and continue with the next path | Links.Tests.ps1:236 Should write an error for a folder and continue with the next path | Links.Tests.ps1:214 Should take the files with more than one name from Get-ChildItem2 | Links.Tests.ps1:200 Should return every name of a file with hard links 1: writes GetHardLinkError on a share (administrator) The output type is never asserted (only FullName and Mode), the error categories (InvalidArgument for a folder, ObjectNotFound, ReadError on a share) are unasserted, and positional binding and strings from the pipeline are untested. The UnauthorizedAccessException handler cannot be reached by a test because Windows lists the names without opening the file (Links.Tests.ps1:262). TestNeeded Links.Tests.ps1:224-229 and :236-243 assert one error (FileNotFound; GetHardLinkError with target and message) and exactly the next file; :214-218 pipes AlphaFS file objects and asserts the names of both linked files and not the third; :200-203 asserts all names of a linked file; PathErrors.Tests.ps1:108-114 asserts ID and target for a missing path. Partly ParameterSets.Items.Tests.ps1:297 Should accept piped strings by value, write errors with their categories for a folder and a missing path, and return the files in order the ReadError category on a network share (still ID/target only); the UnauthorizedAccessException handler ReadError on a share: budget (admin share available elevated, not implemented here); UnauthorizedAccessException handler: Limit (structurally unreachable, Windows lists hard-link names without opening the file)
62 items New-NTFSSymbolicLink __AllParameterSets False 12 2 0 15 Yes Yes Yes Partly Yes Links.Tests.ps1:297 Should create a link to a file that reads the data of the file | Links.Tests.ps1:387 Should write a non-terminating error for an existing -Path and continue with the next link | Links.Tests.ps1:420 Should write a PermissionDenied error and create no link in a folder that denies new files | Links.Tests.ps1:335 Should return a folder object for a link to a folder with -PassThru 2: link to a file and to a folder on a share (administrator); asserts no error only No test creates a link after a failed one in a pipeline (every piped request fails so that the tests run without the privilege), and a link to a folder is checked only for the Directory attribute and reachability through Test-Path2, not for LinkType and target. The success paths run only with SeCreateSymbolicLinkPrivilege; positional binding and an empty -Target (the value that meant the current folder before rc7, while the tests check only the Mandatory metadata) are untested. TestNeeded Links.Tests.ps1:297-302 reads back LinkType, target and data of a file link; :387-393 pipes two objects by property name and asserts two errors (ErrorId, categories) and that no link exists; :420-429 asserts PermissionDenied, exception type and no output; :323-339 assert FileInfo and DirectoryInfo with -PassThru. Partly ParameterSets.Items.Tests.ps1:264 <Command> should reject <CaseName> instead of creating a link to the current folder | ParameterSets.Items.Tests.ps1:343 New-NTFSSymbolicLink should stop after the first pass-through object for Select-Object -First 1 and leave the second request untouched | ParameterSets.Items.Tests.ps1:367 Should write one ResourceExists error for an existing -Path and still create the links for the requests that follow it positional binding; the folder link's LinkType and resolved target (only the file link's LinkType was asserted) budget (both items)
63 items Enable-Privileges __AllParameterSets False 5 0 0 7 Partly No NA NA Partly Privileges.Tests.ps1:61 Should disable the privileges that Enable-Privileges enabled | Privileges.Tests.ps1:284 Should enable the privileges when the module setting EnablePrivileges is $true | Privileges.Tests.ps1:302 Should enable the privileges in a script of another name also when the module setting EnablePrivileges is $false | Privileges.Tests.ps1:179 Enable-Privileges should keep the privileges enabled also when the pipeline stops early 0 The error path (Enable Privilege Error, SecurityError, 'Could not enable requested privileges' when not all four privileges can be enabled) is never asserted, although OutputTypes.Tests.ps1:86 (in a token without the privileges) and the partial-token child script at Privileges.Tests.ps1:93 run it with errors suppressed. Only the Backup state is read back, only through Get-Privileges and only with all four privileges held, and the states in the -PassThru objects are unasserted. TestNeeded Privileges.Tests.ps1:61-62 reads the Backup state after Enable-Privileges; :281-305 run it in child scripts and assert the Backup state and the verbose announcement for the Init script with the setting true and false and for another script name; :179-181 asserts the state stays enabled when the pipeline stops; OutputTypes.Tests.ps1:86-89 compares the -PassThru count with Get-Privileges. All but OutputTypes.Tests.ps1:86 skip unless the token holds the four privileges. Partly ParameterSets.Items.Tests.ps1:441 Enable-Privileges should write Enable Privilege Error with SecurityError and AdjustPriviledgeException when it cannot enable all four privileges the -PassThru privilege states (TakeOwnership/Restore/Backup/Security) with an independent read-back beyond Get-Privileges, only verifiable elevated budget
64 items Disable-Privileges __AllParameterSets False 19 3 0 20 Partly No NA NA Partly Privileges.Tests.ps1:64 Should disable the privileges that Enable-Privileges enabled | Privileges.Tests.ps1:94 Should not warn about the privileges that the access token does not hold | OutputTypes.Tests.ps1:95 Disable-Privileges should write one object per privilege | Privileges.Tests.ps1:382 Should not fail when Disable-Privileges runs inside the pipeline 3: AfterAll/BeforeEach/AfterEach resets in the privileges-on-share tests; no assertion on the cmdlet itself The error path (Disable Privilege Error, documented as non-terminating, when none of TakeOwnership, Restore and Backup is enabled) is never asserted although 15 of the 19 scan calls (BeforeEach/AfterEach/AfterAll) run it with errors suppressed; -PassThru asserts only a count above 1 and the type, and the warning for a privilege that cannot be disabled is unasserted. TestNeeded Privileges.Tests.ps1:64-67 asserts no warning and the Backup state Disabled through Get-Privileges, :74-76 the verbose message, :94 (child script) no warnings for a token that holds only some privileges, :382-387 that no privilege stays enabled after it runs inside a pipeline; OutputTypes.Tests.ps1:95-98 asserts a count above 1 and the type. All skip unless the token holds the privileges. Partly ParameterSets.Items.Tests.ps1:451 Disable-Privileges should write Disable Privilege Error with SecurityError and AdjustPriviledgeException and no output when nothing is enabled the -PassThru object privilege-state values on the successful disable path (still only count/type asserted); the warning when a privilege cannot be disabled state values on success path: budget; the warning: Limit (needs a race with another command)
65 items Get-Privileges __AllParameterSets False 18 2 0 19 NA NA NA NA Partly ObjectApis.Tests.ps1:229 Should compare boxed and typed privilege values consistently without accepting an attributes enum | OutputTypes.Tests.ps1:88 Enable-Privileges should write one object per privilege | Privileges.Tests.ps1:62 Should disable the privileges that Enable-Privileges enabled | PipelineControl.Tests.ps1:164 <Name> should stop after the first object for Select-Object -First 1 and change nothing else 2: a read helper and the check that the account holds the four file system privileges The output is never compared with an independent source (whoami /priv or the Win32 token), and no test asserts the objects beyond a count above 0, the Equals contract of the first value and the privilege and state that other cmdlets' tests read back; the Removed state and the PrivilegeAttributes property are unasserted. Errors are NA: the cmdlet has no handler and no designed failure. TestNeeded ObjectApis.Tests.ps1:229-233 asserts a count above 0 and the equality contract; OutputTypes.Tests.ps1:88 compares the -PassThru count with the cmdlet itself; Privileges.Tests.ps1:30 (read helper) reads one privilege state for the tests of Enable-Privileges and Disable-Privileges. The other calls are preconditions or read-backs. Partly ParameterSets.Items.Tests.ps1:503 Should match whoami /priv for the privileges that whoami and the library name the same way the Removed PrivilegeState value budget

233
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Reconciliation.csv

@ -0,0 +1,233 @@
"Assembly","Class","Method","Status","OldSequence","NewSequence","OldBranches","NewBranches","OldLines","NewLines"
"NTFSSecurity","NTFSSecurity.AddAccess","Security2.ApplyTo NTFSSecurity.AddAccess::get_AppliesTo()","Unchanged","1","1","0","0","95","95"
"NTFSSecurity","NTFSSecurity.AddAccess","Security2.FileSystemRights2 NTFSSecurity.AddAccess::get_AccessRights()","Unchanged","1","1","0","0","62","62"
"NTFSSecurity","NTFSSecurity.AddAccess","Security2.FileSystemSecurity2[] NTFSSecurity.AddAccess::get_SecurityDescriptor()","Unchanged","1","1","0","0","42","42"
"NTFSSecurity","NTFSSecurity.AddAccess","Security2.IdentityReference2[] NTFSSecurity.AddAccess::get_Account()","Unchanged","1","1","0","0","54","54"
"NTFSSecurity","NTFSSecurity.AddAccess","System.Management.Automation.SwitchParameter NTFSSecurity.AddAccess::get_PassThru()","Unchanged","1","1","0","0","102","102"
"NTFSSecurity","NTFSSecurity.AddAccess","System.Security.AccessControl.AccessControlType NTFSSecurity.AddAccess::get_AccessType()","Unchanged","1","1","0","0","70","70"
"NTFSSecurity","NTFSSecurity.AddAccess","System.Security.AccessControl.InheritanceFlags NTFSSecurity.AddAccess::get_InheritanceFlags()","Unchanged","1","1","0","0","78","78"
"NTFSSecurity","NTFSSecurity.AddAccess","System.Security.AccessControl.PropagationFlags NTFSSecurity.AddAccess::get_PropagationFlags()","Unchanged","1","1","0","0","86","86"
"NTFSSecurity","NTFSSecurity.AddAccess","System.String[] NTFSSecurity.AddAccess::get_Path()","Unchanged","1","1","0","0","29","29"
"NTFSSecurity","NTFSSecurity.AddAudit/<>c__DisplayClass35_0","System.Void NTFSSecurity.AddAudit/<>c__DisplayClass35_0::<ProcessRecord>b__0()","Unchanged","2","2","0","0","143,144","143,144"
"NTFSSecurity","NTFSSecurity.AddAudit","Security2.ApplyTo NTFSSecurity.AddAudit::get_AppliesTo()","Unchanged","1","1","0","0","94","94"
"NTFSSecurity","NTFSSecurity.AddAudit","Security2.FileSystemRights2 NTFSSecurity.AddAudit::get_AccessRights()","Unchanged","1","1","0","0","62","62"
"NTFSSecurity","NTFSSecurity.AddAudit","Security2.FileSystemSecurity2[] NTFSSecurity.AddAudit::get_SecurityDescriptor()","Unchanged","1","1","0","0","42","42"
"NTFSSecurity","NTFSSecurity.AddAudit","Security2.IdentityReference2[] NTFSSecurity.AddAudit::get_Account()","Unchanged","1","1","0","0","54","54"
"NTFSSecurity","NTFSSecurity.AddAudit","System.Management.Automation.SwitchParameter NTFSSecurity.AddAudit::get_PassThru()","Unchanged","1","1","0","0","101","101"
"NTFSSecurity","NTFSSecurity.AddAudit","System.Security.AccessControl.AuditFlags NTFSSecurity.AddAudit::get_AuditFlags()","Unchanged","1","1","0","0","69","69"
"NTFSSecurity","NTFSSecurity.AddAudit","System.Security.AccessControl.InheritanceFlags NTFSSecurity.AddAudit::get_InheritanceFlags()","Unchanged","1","1","0","0","77","77"
"NTFSSecurity","NTFSSecurity.AddAudit","System.Security.AccessControl.PropagationFlags NTFSSecurity.AddAudit::get_PropagationFlags()","Unchanged","1","1","0","0","85","85"
"NTFSSecurity","NTFSSecurity.AddAudit","System.String[] NTFSSecurity.AddAudit::get_Path()","Unchanged","1","1","0","0","29","29"
"NTFSSecurity","NTFSSecurity.AddAudit","System.Void NTFSSecurity.AddAudit::ProcessRecord()","Unchanged","7","7","0","0","137,141,145,146,148,149,151","137,141,145,146,148,149,151"
"NTFSSecurity","NTFSSecurity.AuditCmdlets.GetOrphanedAudit","System.Void NTFSSecurity.AuditCmdlets.GetOrphanedAudit::ProcessRecord()","Unchanged","3","3","0","0","56,58,59","56,58,59"
"NTFSSecurity","NTFSSecurity.BaseCmdlet","System.IO.FileSystemInfo NTFSSecurity.BaseCmdlet::GetFileSystemInfo(System.String)","Unchanged","6","6","4","4","166,168,170,172,174,178","166,168,170,172,174,178"
"NTFSSecurity","NTFSSecurity.BaseCmdlet","System.String NTFSSecurity.BaseCmdlet::GetRelativePath(System.String)","Unchanged","1","1","1","1","229,231","229,231"
"NTFSSecurity","NTFSSecurity.BaseCmdlet","System.Void NTFSSecurity.BaseCmdlet::ProcessRecord()","Unchanged","2","2","0","0","145,146","145,146"
"NTFSSecurity","NTFSSecurity.BaseCmdletWithPrivControl","System.Boolean NTFSSecurity.BaseCmdletWithPrivControl::TryDisablePrivilege(ProcessPrivileges.Privilege)","Unchanged","3","3","0","0","490,492,493","490,492,493"
"NTFSSecurity","NTFSSecurity.BaseCmdletWithPrivControl","System.Collections.Generic.List`1<System.String> NTFSSecurity.BaseCmdletWithPrivControl::DisableEnabledPrivileges(System.Collections.Generic.Dictionary`2<System.String,System.Exception>)","Unchanged","3","3","0","0","422,424,425","422,424,425"
"NTFSSecurity","NTFSSecurity.BaseCmdletWithPrivControl","System.Void NTFSSecurity.BaseCmdletWithPrivControl::DisableFileSystemPrivileges()","Unchanged","1","1","1","1","544,545","544,545"
"NTFSSecurity","NTFSSecurity.BaseCmdletWithPrivControl","System.Void NTFSSecurity.BaseCmdletWithPrivControl::EndProcessing()","Unchanged","3","3","1","1","389,391,392","389,391,392"
"NTFSSecurity","NTFSSecurity.ClearAccess","Security2.FileSystemSecurity2[] NTFSSecurity.ClearAccess::get_SecurityDescriptor()","Unchanged","1","1","0","0","31","31"
"NTFSSecurity","NTFSSecurity.ClearAccess","System.Management.Automation.SwitchParameter NTFSSecurity.ClearAccess::get_DisableInheritance()","Unchanged","1","1","0","0","42","42"
"NTFSSecurity","NTFSSecurity.ClearAccess","System.String[] NTFSSecurity.ClearAccess::get_Path()","Unchanged","1","1","0","0","19","19"
"NTFSSecurity","NTFSSecurity.ClearAccess","System.Void NTFSSecurity.ClearAccess::ProcessRecord()","Unchanged","3","3","0","0","92,94,95","92,94,95"
"NTFSSecurity","NTFSSecurity.ClearAudit/<>c__DisplayClass11_0","System.Void NTFSSecurity.ClearAudit/<>c__DisplayClass11_0::<ProcessRecord>b__0()","Unchanged","4","4","2","2","82,83,84,85","82,83,84,85"
"NTFSSecurity","NTFSSecurity.ClearAudit","Security2.FileSystemSecurity2[] NTFSSecurity.ClearAudit::get_SecurityDescriptor()","Unchanged","1","1","0","0","31","31"
"NTFSSecurity","NTFSSecurity.ClearAudit","System.Management.Automation.SwitchParameter NTFSSecurity.ClearAudit::get_DisableInheritance()","Unchanged","1","1","0","0","42","42"
"NTFSSecurity","NTFSSecurity.ClearAudit","System.String[] NTFSSecurity.ClearAudit::get_Path()","Unchanged","1","1","0","0","19","19"
"NTFSSecurity","NTFSSecurity.ClearAudit","System.Void NTFSSecurity.ClearAudit::ProcessRecord()","Unchanged","7","7","0","0","76,80,86,87,89,90,91","76,80,86,87,89,90,91"
"NTFSSecurity","NTFSSecurity.CopyItem2","System.Boolean NTFSSecurity.CopyItem2::get_PassThru()","Unchanged","1","1","0","0","47","47"
"NTFSSecurity","NTFSSecurity.CopyItem2","System.Management.Automation.SwitchParameter NTFSSecurity.CopyItem2::get_Force()","Unchanged","1","1","0","0","40","40"
"NTFSSecurity","NTFSSecurity.CopyItem2","System.String NTFSSecurity.CopyItem2::get_Destination()","Unchanged","1","1","0","0","33","33"
"NTFSSecurity","NTFSSecurity.CopyItem2","System.String[] NTFSSecurity.CopyItem2::get_Path()","Unchanged","1","1","0","0","21","21"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","Security2.FileSystemSecurity2[] NTFSSecurity.DisableAccessInheritance::get_SecurityDescriptor()","Unchanged","1","1","0","0","33","33"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","System.Management.Automation.SwitchParameter NTFSSecurity.DisableAccessInheritance::get_PassThru()","Unchanged","1","1","0","0","51","51"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","System.Management.Automation.SwitchParameter NTFSSecurity.DisableAccessInheritance::get_RemoveInheritedAccessRules()","Unchanged","1","1","0","0","44","44"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","System.String[] NTFSSecurity.DisableAccessInheritance::get_Path()","Unchanged","1","1","0","0","21","21"
"NTFSSecurity","NTFSSecurity.DisableAccessInheritance","System.Void NTFSSecurity.DisableAccessInheritance::ProcessRecord()","Unchanged","3","3","0","0","97,99,100","97,99,100"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance/<>c__DisplayClass15_0","System.Void NTFSSecurity.DisableAuditInheritance/<>c__DisplayClass15_0::<ProcessRecord>b__0()","Unchanged","2","2","0","0","94,95","94,95"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","Security2.FileSystemSecurity2[] NTFSSecurity.DisableAuditInheritance::get_SecurityDescriptor()","Unchanged","1","1","0","0","34","34"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","System.Management.Automation.SwitchParameter NTFSSecurity.DisableAuditInheritance::get_PassThru()","Unchanged","1","1","0","0","57","57"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","System.Management.Automation.SwitchParameter NTFSSecurity.DisableAuditInheritance::get_RemoveInheritedAuditRules()","Unchanged","1","1","0","0","50","50"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","System.String[] NTFSSecurity.DisableAuditInheritance::get_Path()","Unchanged","1","1","0","0","22","22"
"NTFSSecurity","NTFSSecurity.DisableAuditInheritance","System.Void NTFSSecurity.DisableAuditInheritance::ProcessRecord()","Unchanged","7","7","0","0","88,92,96,97,99,100,102","88,92,96,97,99,100,102"
"NTFSSecurity","NTFSSecurity.DisablePrivileges","System.Management.Automation.SwitchParameter NTFSSecurity.DisablePrivileges::get_PassThru()","Unchanged","1","1","0","0","83","83"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","Security2.FileSystemSecurity2[] NTFSSecurity.EnableAccessInheritance::get_SecurityDescriptor()","Unchanged","1","1","0","0","33","33"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","System.Management.Automation.SwitchParameter NTFSSecurity.EnableAccessInheritance::get_PassThru()","Unchanged","1","1","0","0","44","44"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","System.Management.Automation.SwitchParameter NTFSSecurity.EnableAccessInheritance::get_RemoveExplicitAccessRules()","Unchanged","1","1","0","0","51","51"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","System.String[] NTFSSecurity.EnableAccessInheritance::get_Path()","Unchanged","1","1","0","0","21","21"
"NTFSSecurity","NTFSSecurity.EnableAccessInheritance","System.Void NTFSSecurity.EnableAccessInheritance::ProcessRecord()","Unchanged","3","3","0","0","97,99,100","97,99,100"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance/<>c__DisplayClass15_0","System.Void NTFSSecurity.EnableAuditInheritance/<>c__DisplayClass15_0::<ProcessRecord>b__0()","Unchanged","2","2","0","0","93,94","93,94"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","Security2.FileSystemSecurity2[] NTFSSecurity.EnableAuditInheritance::get_SecurityDescriptor()","Unchanged","1","1","0","0","33","33"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","System.Management.Automation.SwitchParameter NTFSSecurity.EnableAuditInheritance::get_PassThru()","Unchanged","1","1","0","0","44","44"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","System.Management.Automation.SwitchParameter NTFSSecurity.EnableAuditInheritance::get_RemoveExplicitAuditRules()","Unchanged","1","1","0","0","56","56"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","System.String[] NTFSSecurity.EnableAuditInheritance::get_Path()","Unchanged","1","1","0","0","21","21"
"NTFSSecurity","NTFSSecurity.EnableAuditInheritance","System.Void NTFSSecurity.EnableAuditInheritance::ProcessRecord()","Unchanged","7","7","0","0","87,91,95,96,98,99,101","87,91,95,96,98,99,101"
"NTFSSecurity","NTFSSecurity.EnablePrivileges","System.Management.Automation.SwitchParameter NTFSSecurity.EnablePrivileges::get_PassThru()","Unchanged","1","1","0","0","21","21"
"NTFSSecurity","NTFSSecurity.EnablePrivileges","System.Void NTFSSecurity.EnablePrivileges::ProcessRecord()","Unchanged","2","2","0","0","39,41","39,41"
"NTFSSecurity","NTFSSecurity.FileSystemCodeMembers","System.String NTFSSecurity.FileSystemCodeMembers::Mode(System.Management.Automation.PSObject)","Unchanged","1","1","1","1","15,17","15,17"
"NTFSSecurity","NTFSSecurity.GetAccess/<>c__DisplayClass20_0","System.Void NTFSSecurity.GetAccess/<>c__DisplayClass20_0::<ProcessRecord>b__0()","Unchanged","2","2","0","0","110,111","110,111"
"NTFSSecurity","NTFSSecurity.GetAccess","System.Void NTFSSecurity.GetAccess::ProcessRecord()","Unchanged","5","5","0","0","112,118,119,121,122","112,118,119,121,122"
"NTFSSecurity","NTFSSecurity.GetAudit","System.Void NTFSSecurity.GetAudit::ProcessRecord()","Unchanged","3","3","0","0","104,107,108","104,107,108"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.IO.FileAttributes NTFSSecurity.GetChildItem2::get_Attributes()","Unchanged","1","1","0","0","79","79"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_Directory()","Unchanged","1","1","0","0","65","65"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_File()","Unchanged","1","1","0","0","72","72"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_Force()","Unchanged","1","1","0","0","107","107"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_Hidden()","Unchanged","1","1","0","0","86","86"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_ReadOnly()","Unchanged","1","1","0","0","100","100"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_Recurse()","Unchanged","1","1","0","0","58","58"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_SkipMountPoints()","Unchanged","1","1","0","0","114","114"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_SkipSymbolicLinks()","Unchanged","1","1","0","0","121","121"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_System()","Unchanged","1","1","0","0","93","93"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Nullable`1<System.Int32> NTFSSecurity.GetChildItem2::get_Depth()","Unchanged","1","1","0","0","128","128"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.String NTFSSecurity.GetChildItem2::get_Filter()","Unchanged","1","1","0","0","51","51"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.String[] NTFSSecurity.GetChildItem2::get_Path()","Unchanged","1","1","0","0","39","39"
"NTFSSecurity","NTFSSecurity.GetChildItem2","System.Void NTFSSecurity.GetChildItem2::WriteFileSystem(Alphaleonis.Win32.Filesystem.FileSystemInfo,System.Int32)","Unchanged","0","0","1","1","205","205"
"NTFSSecurity","NTFSSecurity.GetDiskSpace","System.String[] NTFSSecurity.GetDiskSpace::get_DriveLetter()","Unchanged","1","1","0","0","18","18"
"NTFSSecurity","NTFSSecurity.GetDiskSpace","System.Void NTFSSecurity.GetDiskSpace::ProcessRecord()","Unchanged","0","0","1","1","52","52"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess/<>c__DisplayClass20_0","System.Void NTFSSecurity.GetEffectiveAccess/<>c__DisplayClass20_0::<ProcessRecord>b__0()","Unchanged","2","2","0","0","139,140","139,140"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","Security2.FileSystemSecurity2[] NTFSSecurity.GetEffectiveAccess::get_SecurityDescriptor()","Unchanged","1","1","0","0","38","38"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","Security2.IdentityReference2 NTFSSecurity.GetEffectiveAccess::get_Account()","Unchanged","1","1","0","0","51","51"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","System.Management.Automation.SwitchParameter NTFSSecurity.GetEffectiveAccess::get_ExcludeNoneAccessEntries()","Unchanged","1","1","0","0","65","65"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","System.String NTFSSecurity.GetEffectiveAccess::get_ServerName()","Unchanged","1","1","0","0","58","58"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","System.String[] NTFSSecurity.GetEffectiveAccess::get_Path()","Unchanged","1","1","0","0","26","26"
"NTFSSecurity","NTFSSecurity.GetEffectiveAccess","System.Void NTFSSecurity.GetEffectiveAccess::ProcessRecord()","Unchanged","8","8","0","0","99,101,102,141,147,148,150,151","99,101,102,141,147,148,150,151"
"NTFSSecurity","NTFSSecurity.GetFileHash2/<>c__DisplayClass9_0","System.Void NTFSSecurity.GetFileHash2/<>c__DisplayClass9_0::<ProcessRecord>b__0()","Unchanged","1","1","0","0","102","102"
"NTFSSecurity","NTFSSecurity.GetFileHash2","Security2.FileSystem.FileInfo.HashAlgorithms NTFSSecurity.GetFileHash2::get_Algorithm()","Unchanged","1","1","0","0","33","33"
"NTFSSecurity","NTFSSecurity.GetFileHash2","System.Void NTFSSecurity.GetFileHash2::ProcessRecord()","Unchanged","6","6","0","0","51,52,55,56,103,109","51,52,55,56,103,109"
"NTFSSecurity","NTFSSecurity.GetHardLink","System.Void NTFSSecurity.GetHardLink::ProcessRecord()","Unchanged","3","3","0","0","77,79,80","77,79,80"
"NTFSSecurity","NTFSSecurity.GetInheritance/<>c__DisplayClass7_0","System.Void NTFSSecurity.GetInheritance/<>c__DisplayClass7_0::<ProcessRecord>b__0()","Unchanged","2","2","0","0","78,79","78,79"
"NTFSSecurity","NTFSSecurity.GetInheritance","Security2.FileSystemSecurity2[] NTFSSecurity.GetInheritance::get_SecurityDescriptor()","Unchanged","1","1","0","0","31","31"
"NTFSSecurity","NTFSSecurity.GetInheritance","System.String[] NTFSSecurity.GetInheritance::get_Path()","Unchanged","1","1","0","0","19","19"
"NTFSSecurity","NTFSSecurity.GetInheritance","System.Void NTFSSecurity.GetInheritance::ProcessRecord()","Unchanged","5","5","1","1","80,86,87,89,90,107","80,86,87,89,90,107"
"NTFSSecurity","NTFSSecurity.GetItem2","System.String[] NTFSSecurity.GetItem2::get_Path()","Unchanged","1","1","0","0","19","19"
"NTFSSecurity","NTFSSecurity.GetOrphanedAccess/<>c__DisplayClass1_0","System.Void NTFSSecurity.GetOrphanedAccess/<>c__DisplayClass1_0::<ProcessRecord>b__0()","Unchanged","2","2","0","0","53,54","53,54"
"NTFSSecurity","NTFSSecurity.GetOrphanedAccess","System.Void NTFSSecurity.GetOrphanedAccess::ProcessRecord()","Unchanged","5","5","0","0","55,62,63,65,66","55,62,63,65,66"
"NTFSSecurity","NTFSSecurity.GetSecurityDescriptor/<>c__DisplayClass4_0","System.Void NTFSSecurity.GetSecurityDescriptor/<>c__DisplayClass4_0::<ProcessRecord>b__0()","Unchanged","2","2","0","0","62,63","62,63"
"NTFSSecurity","NTFSSecurity.GetSecurityDescriptor","System.String[] NTFSSecurity.GetSecurityDescriptor::get_Path()","Unchanged","1","1","0","0","18","18"
"NTFSSecurity","NTFSSecurity.GetSecurityDescriptor","System.Void NTFSSecurity.GetSecurityDescriptor::ProcessRecord()","Unchanged","5","5","2","2","64,67,69,75,78,83,84","64,67,69,75,78,83,84"
"NTFSSecurity","NTFSSecurity.GetSimpleAccess","System.Management.Automation.SwitchParameter NTFSSecurity.GetSimpleAccess::get_IncludeRootFolder()","Unchanged","1","1","0","0","24","24"
"NTFSSecurity","NTFSSecurity.MoveItem2","System.Boolean NTFSSecurity.MoveItem2::get_PassThru()","Unchanged","1","1","0","0","47","47"
"NTFSSecurity","NTFSSecurity.MoveItem2","System.Management.Automation.SwitchParameter NTFSSecurity.MoveItem2::get_Force()","Unchanged","1","1","0","0","40","40"
"NTFSSecurity","NTFSSecurity.MoveItem2","System.String NTFSSecurity.MoveItem2::get_Destination()","Unchanged","1","1","0","0","33","33"
"NTFSSecurity","NTFSSecurity.MoveItem2","System.String[] NTFSSecurity.MoveItem2::get_Path()","Unchanged","1","1","0","0","21","21"
"NTFSSecurity","NTFSSecurity.NewHardLink","System.Management.Automation.SwitchParameter NTFSSecurity.NewHardLink::get_PassThru()","Unchanged","1","1","0","0","47","47"
"NTFSSecurity","NTFSSecurity.NewSymbolicLink","System.Management.Automation.SwitchParameter NTFSSecurity.NewSymbolicLink::get_PassThru()","Unchanged","1","1","0","0","45","45"
"NTFSSecurity","NTFSSecurity.OwnerCmdlets.GetOwner","System.Void NTFSSecurity.OwnerCmdlets.GetOwner::ProcessRecord()","Unchanged","3","3","0","0","72,74,75","72,74,75"
"NTFSSecurity","NTFSSecurity.Properties.Resources","System.Drawing.Bitmap NTFSSecurity.Properties.Resources::get_IconContainer()","Unchanged","2","2","0","0","77,78","77,78"
"NTFSSecurity","NTFSSecurity.Properties.Resources","System.Globalization.CultureInfo NTFSSecurity.Properties.Resources::get_Culture()","Unchanged","1","1","0","0","56","56"
"NTFSSecurity","NTFSSecurity.Properties.Resources","System.Resources.ResourceManager NTFSSecurity.Properties.Resources::get_ResourceManager()","Unchanged","4","4","2","2","41,42,43,45","41,42,43,45"
"NTFSSecurity","NTFSSecurity.Properties.Resources","System.String NTFSSecurity.Properties.Resources::get_ContainerIcon()","Unchanged","1","1","0","0","68","68"
"NTFSSecurity","NTFSSecurity.Properties.Resources","System.Void NTFSSecurity.Properties.Resources::.ctor()","Unchanged","2","2","0","0","32,33","32,33"
"NTFSSecurity","NTFSSecurity.Properties.Resources","System.Void NTFSSecurity.Properties.Resources::set_Culture(System.Globalization.CultureInfo)","Unchanged","2","2","0","0","59,60","59,60"
"NTFSSecurity","NTFSSecurity.RemoveAccess","Security2.ApplyTo NTFSSecurity.RemoveAccess::get_AppliesTo()","Unchanged","1","1","0","0","96","96"
"NTFSSecurity","NTFSSecurity.RemoveAccess","System.Management.Automation.SwitchParameter NTFSSecurity.RemoveAccess::get_PassThru()","Unchanged","1","1","0","0","113","113"
"NTFSSecurity","NTFSSecurity.RemoveAccess","System.Management.Automation.SwitchParameter NTFSSecurity.RemoveAccess::get_RemoveSpecific()","Unchanged","1","1","0","0","106","106"
"NTFSSecurity","NTFSSecurity.RemoveAudit/<>c__DisplayClass39_0","System.Void NTFSSecurity.RemoveAudit/<>c__DisplayClass39_0::<ProcessRecord>b__0()","Unchanged","2","2","0","0","159,160","159,160"
"NTFSSecurity","NTFSSecurity.RemoveAudit","Security2.ApplyTo NTFSSecurity.RemoveAudit::get_AppliesTo()","Unchanged","1","1","0","0","95","95"
"NTFSSecurity","NTFSSecurity.RemoveAudit","Security2.FileSystemRights2 NTFSSecurity.RemoveAudit::get_AccessRights()","Unchanged","1","1","0","0","63","63"
"NTFSSecurity","NTFSSecurity.RemoveAudit","Security2.FileSystemSecurity2[] NTFSSecurity.RemoveAudit::get_SecurityDescriptor()","Unchanged","1","1","0","0","43","43"
"NTFSSecurity","NTFSSecurity.RemoveAudit","Security2.IdentityReference2[] NTFSSecurity.RemoveAudit::get_Account()","Unchanged","1","1","0","0","55","55"
"NTFSSecurity","NTFSSecurity.RemoveAudit","System.Management.Automation.SwitchParameter NTFSSecurity.RemoveAudit::get_PassThru()","Unchanged","1","1","0","0","112","112"
"NTFSSecurity","NTFSSecurity.RemoveAudit","System.Management.Automation.SwitchParameter NTFSSecurity.RemoveAudit::get_RemoveSpecific()","Unchanged","1","1","0","0","105","105"
"NTFSSecurity","NTFSSecurity.RemoveAudit","System.Security.AccessControl.AuditFlags NTFSSecurity.RemoveAudit::get_AuditFlags()","Unchanged","1","1","0","0","70","70"
"NTFSSecurity","NTFSSecurity.RemoveAudit","System.Security.AccessControl.InheritanceFlags NTFSSecurity.RemoveAudit::get_InheritanceFlags()","Unchanged","1","1","0","0","78","78"
"NTFSSecurity","NTFSSecurity.RemoveAudit","System.Security.AccessControl.PropagationFlags NTFSSecurity.RemoveAudit::get_PropagationFlags()","Unchanged","1","1","0","0","86","86"
"NTFSSecurity","NTFSSecurity.RemoveAudit","System.String[] NTFSSecurity.RemoveAudit::get_Path()","Unchanged","1","1","0","0","30","30"
"NTFSSecurity","NTFSSecurity.RemoveAudit","System.Void NTFSSecurity.RemoveAudit::ProcessRecord()","Unchanged","7","7","0","0","153,157,161,162,164,165,167","153,157,161,162,164,165,167"
"NTFSSecurity","NTFSSecurity.RemoveItem2","System.Management.Automation.SwitchParameter NTFSSecurity.RemoveItem2::get_Force()","Unchanged","1","1","0","0","32","32"
"NTFSSecurity","NTFSSecurity.RemoveItem2","System.Management.Automation.SwitchParameter NTFSSecurity.RemoveItem2::get_PassThru()","Unchanged","1","1","0","0","48","48"
"NTFSSecurity","NTFSSecurity.RemoveItem2","System.Management.Automation.SwitchParameter NTFSSecurity.RemoveItem2::get_Recurse()","Unchanged","1","1","0","0","39","39"
"NTFSSecurity","NTFSSecurity.RemoveItem2","System.String[] NTFSSecurity.RemoveItem2::get_Path()","Unchanged","1","1","0","0","21","21"
"NTFSSecurity","NTFSSecurity.SetInheritance","Security2.FileSystemSecurity2[] NTFSSecurity.SetInheritance::get_SecurityDescriptor()","Unchanged","1","1","0","0","34","34"
"NTFSSecurity","NTFSSecurity.SetInheritance","System.Management.Automation.SwitchParameter NTFSSecurity.SetInheritance::get_PassThru()","Unchanged","1","1","0","0","59","59"
"NTFSSecurity","NTFSSecurity.SetInheritance","System.Nullable`1<System.Boolean> NTFSSecurity.SetInheritance::get_AccessInheritanceEnabled()","Unchanged","1","1","0","0","45","45"
"NTFSSecurity","NTFSSecurity.SetInheritance","System.Nullable`1<System.Boolean> NTFSSecurity.SetInheritance::get_AuditInheritanceEnabled()","Unchanged","1","1","0","0","52","52"
"NTFSSecurity","NTFSSecurity.SetInheritance","System.String[] NTFSSecurity.SetInheritance::get_Path()","Unchanged","1","1","0","0","22","22"
"NTFSSecurity","NTFSSecurity.SetOwner","Security2.FileSystemSecurity2[] NTFSSecurity.SetOwner::get_SecurityDescriptor()","Unchanged","1","1","0","0","33","33"
"NTFSSecurity","NTFSSecurity.SetOwner","Security2.IdentityReference2 NTFSSecurity.SetOwner::get_Account()","Unchanged","1","1","0","0","44","44"
"NTFSSecurity","NTFSSecurity.SetOwner","System.Management.Automation.SwitchParameter NTFSSecurity.SetOwner::get_PassThru()","Unchanged","1","1","0","0","51","51"
"NTFSSecurity","NTFSSecurity.SetSecurityDescriptor","System.Management.Automation.SwitchParameter NTFSSecurity.SetSecurityDescriptor::get_PassThru()","Unchanged","1","1","0","0","28","28"
"NTFSSecurity","NTFSSecurity.TestPath2","System.Void NTFSSecurity.TestPath2::ProcessRecord()","Unchanged","6","6","0","0","53,55,56,65,67,68","53,55,56,65,67,68"
"PrivilegeControl","Security2.PrivilegeControl","ProcessPrivileges.AdjustPrivilegeResult Security2.PrivilegeControl::DisablePrivilege(ProcessPrivileges.Privilege)","Unchanged","1","1","1","1","61,67","61,67"
"PrivilegeControl","Security2.PrivilegeControl","ProcessPrivileges.AdjustPrivilegeResult Security2.PrivilegeControl::EnablePrivilege(ProcessPrivileges.Privilege)","Unchanged","1","1","1","1","40,46","40,46"
"ProcessPrivileges","ProcessPrivileges.AccessTokenHandle","System.Boolean ProcessPrivileges.AccessTokenHandle::ReleaseHandle()","Unchanged","1","1","1","1","32,34","32,34"
"ProcessPrivileges","ProcessPrivileges.AccessTokenHandle","System.Void ProcessPrivileges.AccessTokenHandle::.ctor(ProcessPrivileges.ProcessHandle,ProcessPrivileges.TokenAccessRights)","Unchanged","1","1","1","1","21,23","21,23"
"ProcessPrivileges","ProcessPrivileges.AllocatedMemory","System.Void ProcessPrivileges.AllocatedMemory::Finalize()","Unchanged","3","3","0","0","28,29","28,29"
"ProcessPrivileges","ProcessPrivileges.AllocatedMemory","System.Void ProcessPrivileges.AllocatedMemory::InternalDispose()","Unchanged","0","0","1","1","47","47"
"ProcessPrivileges","ProcessPrivileges.PrivilegeEnabler","ProcessPrivileges.AdjustPrivilegeResult ProcessPrivileges.PrivilegeEnabler::EnablePrivilege(ProcessPrivileges.Privilege)","Unchanged","0","0","1","1","172","172"
"ProcessPrivileges","ProcessPrivileges.Privileges","ProcessPrivileges.Luid ProcessPrivileges.Privileges::GetLuid(ProcessPrivileges.Privilege)","Unchanged","1","1","1","1","236,238","236,238"
"ProcessPrivileges","ProcessPrivileges.Privileges","ProcessPrivileges.LuidAndAttributes[] ProcessPrivileges.Privileges::GetTokenPrivileges(ProcessPrivileges.AccessTokenHandle)","Unchanged","2","2","2","2","273,280,294,301","273,280,294,301"
"ProcessPrivileges","ProcessPrivileges.Privileges","System.String ProcessPrivileges.Privileges::GetPrivilegeName(ProcessPrivileges.Luid)","Unchanged","3","3","3","3","249,251,255,257,261,263","249,251,255,257,261,263"
"ProcessPrivileges","ProcessPrivileges.ProcessHandle","System.Boolean ProcessPrivileges.ProcessHandle::ReleaseHandle()","Unchanged","3","3","2","2","27,29,32","27,29,32"
"Security2","Security2.FileSystemAccessRule2/<>c__DisplayClass36_0","System.Boolean Security2.FileSystemAccessRule2/<>c__DisplayClass36_0::<RemoveFileSystemAccessRuleAll>b__0(System.Security.AccessControl.FileSystemAccessRule)","Unchanged","1","1","0","0","17","17"
"Security2","Security2.FileSystemAccessRule2/<>c__DisplayClass36_1","System.Boolean Security2.FileSystemAccessRule2/<>c__DisplayClass36_1::<RemoveFileSystemAccessRuleAll>b__1(Security2.IdentityReference2)","Unchanged","1","1","0","0","17","17"
"Security2","Security2.FileSystemAccessRule2","System.Void Security2.FileSystemAccessRule2::RemoveFileSystemAccessRuleAll(Security2.FileSystemSecurity2,System.Collections.Generic.List`1<Security2.IdentityReference2>)","Unchanged","1","1","1","1","15,17","15,17"
"Security2","Security2.FileSystemAuditRule2/<>c__DisplayClass7_0","System.Boolean Security2.FileSystemAuditRule2/<>c__DisplayClass7_0::<RemoveFileSystemAuditRuleAll>b__0(System.Security.AccessControl.FileSystemAuditRule)","Unchanged","1","1","0","0","17","17"
"Security2","Security2.FileSystemAuditRule2/<>c__DisplayClass7_1","System.Boolean Security2.FileSystemAuditRule2/<>c__DisplayClass7_1::<RemoveFileSystemAuditRuleAll>b__1(Security2.IdentityReference2)","Unchanged","1","1","0","0","17","17"
"Security2","Security2.FileSystemAuditRule2","System.Collections.Generic.IEnumerable`1<Security2.FileSystemAuditRule2> Security2.FileSystemAuditRule2::GetFileSystemAuditRules(Security2.FileSystemSecurity2,System.Boolean,System.Boolean,System.Boolean)","Unchanged","0","0","1","1","44","44"
"Security2","Security2.FileSystemAuditRule2","System.Void Security2.FileSystemAuditRule2::RemoveFileSystemAuditRuleAll(Security2.FileSystemSecurity2,System.Collections.Generic.List`1<Security2.IdentityReference2>)","Unchanged","1","1","1","1","15,17","15,17"
"Security2","Security2.FileSystemSecurity2","Security2.FileSystemSecurity2 Security2.FileSystemSecurity2::op_Implicit(System.Security.AccessControl.DirectorySecurity)","Moved","1","1","0","0","254","262"
"Security2","Security2.FileSystemSecurity2","Security2.FileSystemSecurity2 Security2.FileSystemSecurity2::op_Implicit(System.Security.AccessControl.FileSecurity)","Moved","1","1","0","0","245","253"
"Security2","Security2.FileSystemSecurity2","System.Boolean Security2.FileSystemSecurity2::TryGetDriveRoot(Alphaleonis.Win32.Filesystem.FileSystemInfo,System.String&)","Moved","0","0","1","1","122","130"
"Security2","Security2.FileSystemSecurity2","System.Int32 Security2.FileSystemSecurity2::GetHashCode()","Moved","0","0","1","1","267","275"
"Security2","Security2.FileSystemSecurity2","System.Void Security2.FileSystemSecurity2::.ctor(Alphaleonis.Win32.Filesystem.FileSystemInfo)","Unchanged","2","2","0","0","62,63","62,63"
"Security2","Security2.IdentityReference2","System.Void Security2.IdentityReference2::.ctor(System.Security.Principal.IdentityReference)","Unchanged","0","0","1","1","49","49"
"Security2","Security2.IntPtrExtensions","System.IntPtr Security2.IntPtrExtensions::Increment(System.IntPtr)","Unchanged","1","1","0","0","15","15"
"Security2","Security2.RegistryAccessRule2","Security2.IdentityReference2 Security2.RegistryAccessRule2::get_IdentityReference()","Unchanged","1","1","0","0","148","148"
"Security2","Security2.RegistryAccessRule2","Security2.RegistryAccessRule2 Security2.RegistryAccessRule2::op_Implicit(System.Security.AccessControl.RegistryAccessRule)","Unchanged","1","1","0","0","161","161"
"Security2","Security2.RegistryAccessRule2","System.Boolean Security2.RegistryAccessRule2::Equals(System.Object)","Unchanged","1","1","0","0","166","166"
"Security2","Security2.RegistryAccessRule2","System.Boolean Security2.RegistryAccessRule2::get_IsInherited()","Unchanged","1","1","0","0","150","150"
"Security2","Security2.RegistryAccessRule2","System.Int32 Security2.RegistryAccessRule2::GetHashCode()","Unchanged","1","1","0","0","170","170"
"Security2","Security2.RegistryAccessRule2","System.Security.AccessControl.AccessControlType Security2.RegistryAccessRule2::get_AccessControlType()","Unchanged","1","1","0","0","146","146"
"Security2","Security2.RegistryAccessRule2","System.Security.AccessControl.InheritanceFlags Security2.RegistryAccessRule2::get_InheritanceFlags()","Unchanged","1","1","0","0","149","149"
"Security2","Security2.RegistryAccessRule2","System.Security.AccessControl.PropagationFlags Security2.RegistryAccessRule2::get_PropagationFlags()","Unchanged","1","1","0","0","151","151"
"Security2","Security2.RegistryAccessRule2","System.Security.AccessControl.RegistryAccessRule Security2.RegistryAccessRule2::op_Implicit(Security2.RegistryAccessRule2)","Unchanged","1","1","0","0","157","157"
"Security2","Security2.RegistryAccessRule2","System.Security.AccessControl.RegistryRights Security2.RegistryAccessRule2::get_RegistryRights()","Unchanged","1","1","0","0","147","147"
"Security2","Security2.RegistryAccessRule2","System.String Security2.RegistryAccessRule2::get_Name()","Unchanged","6","6","4","4","117,119,121,122,126,131","117,119,121,122,126,131"
"Security2","Security2.RegistryAccessRule2","System.String Security2.RegistryAccessRule2::ToString()","Unchanged","1","1","0","0","174","174"
"Security2","Security2.RegistryAccessRule2","System.Void Security2.RegistryAccessRule2::.ctor(System.Security.AccessControl.RegistryAccessRule)","Unchanged","3","3","0","0","140,142,143","140,142,143"
"Security2","Security2.RegistryAccessRule2","System.Void Security2.RegistryAccessRule2::Dispose()","Unchanged","1","1","0","0","180","180"
"Security2","Security2.RegistryEffectivePermissionEntry","Security2.IdentityReference2 Security2.RegistryEffectivePermissionEntry::get_Account()","Unchanged","1","1","0","0","221","221"
"Security2","Security2.RegistryEffectivePermissionEntry","System.Collections.Generic.List`1<System.String> Security2.RegistryEffectivePermissionEntry::get_AccessAsString()","Unchanged","1","1","0","0","250","250"
"Security2","Security2.RegistryEffectivePermissionEntry","System.String Security2.RegistryEffectivePermissionEntry::get_FullName()","Unchanged","1","1","0","0","227","227"
"Security2","Security2.RegistryEffectivePermissionEntry","System.String Security2.RegistryEffectivePermissionEntry::get_Name()","Unchanged","6","6","4","4","230,232,234,235,239,244","230,232,234,235,239,244"
"Security2","Security2.RegistryEffectivePermissionEntry","System.UInt32 Security2.RegistryEffectivePermissionEntry::get_AccessMask()","Unchanged","1","1","0","0","224","224"
"Security2","Security2.RegistryEffectivePermissionEntry","System.Void Security2.RegistryEffectivePermissionEntry::.ctor(Security2.IdentityReference2,System.UInt32,System.String)","Unchanged","13","13","4","4","252,254,255,256,257,259,261,265,266,268,271","252,254,255,256,257,259,261,265,266,268,271"
"Security2","Security2.RegistryInheritanceInfo","System.String Security2.RegistryInheritanceInfo::get_FullName()","Unchanged","1","1","0","0","191","191"
"Security2","Security2.RegistryInheritanceInfo","System.String Security2.RegistryInheritanceInfo::get_Name()","Unchanged","6","6","4","4","196,198,200,201,205,210","196,198,200,201,205,210"
"Security2","Security2.RegistryKeyOpenException","System.Int64 Security2.RegistryKeyOpenException::get_Win32ErrorCode()","Unchanged","1","1","0","0","330","330"
"Security2","Security2.RegistryKeyOpenException","System.Void Security2.RegistryKeyOpenException::.ctor()","Unchanged","2","2","0","0","333,334","333,334"
"Security2","Security2.RegistryKeyOpenException","System.Void Security2.RegistryKeyOpenException::.ctor(System.Exception,System.Int64)","Unchanged","3","3","0","0","347,349,350","347,349,350"
"Security2","Security2.RegistryKeyOpenException","System.Void Security2.RegistryKeyOpenException::.ctor(System.Exception)","Unchanged","2","2","0","0","337,338","337,338"
"Security2","Security2.RegistryKeyOpenException","System.Void Security2.RegistryKeyOpenException::.ctor(System.Int64)","Unchanged","3","3","0","0","341,343,344","341,343,344"
"Security2","Security2.RegistryKeySetSecurityException","System.Int64 Security2.RegistryKeySetSecurityException::get_Win32ErrorCode()","Unchanged","1","1","0","0","356","356"
"Security2","Security2.RegistryKeySetSecurityException","System.Void Security2.RegistryKeySetSecurityException::.ctor()","Unchanged","2","2","0","0","359,360","359,360"
"Security2","Security2.RegistryKeySetSecurityException","System.Void Security2.RegistryKeySetSecurityException::.ctor(System.Exception,System.Int64)","Unchanged","3","3","0","0","373,375,376","373,375,376"
"Security2","Security2.RegistryKeySetSecurityException","System.Void Security2.RegistryKeySetSecurityException::.ctor(System.Exception)","Unchanged","2","2","0","0","363,364","363,364"
"Security2","Security2.RegistryKeySetSecurityException","System.Void Security2.RegistryKeySetSecurityException::.ctor(System.Int64)","Unchanged","3","3","0","0","367,369,370","367,369,370"
"Security2","Security2.SafeAuthzRMHandle","Security2.SafeAuthzRMHandle Security2.SafeAuthzRMHandle::get_InvalidHandle()","Unchanged","1","1","0","0","309","309"
"Security2","Security2.SafeAuthzRMHandle","System.Void Security2.SafeAuthzRMHandle::.ctor(System.IntPtr)","Unchanged","3","3","0","0","299,301,302","299,301,302"
"Security2","Security2.SafeHGlobalHandle","Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.Collections.Generic.ICollection`1<T>)","Unchanged","1","1","0","0","109","109"
"Security2","Security2.SafeHGlobalHandle","Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.Int32,System.Collections.Generic.IEnumerable`1<T>,System.Int32)","Unchanged","8","8","2","2","130,132,133,135,136,139","130,132,133,135,136,139"
"Security2","Security2.SafeHGlobalHandle","Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.Int32)","Unchanged","1","1","1","1","184,186","184,186"
"Security2","Security2.SafeHGlobalHandle","Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.IntPtr[])","Unchanged","3","3","0","0","77,79,81","77,79,81"
"Security2","Security2.SafeHGlobalHandle","Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.String)","Unchanged","1","1","0","0","150","150"
"Security2","Security2.SafeHGlobalHandle","Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::get_InvalidHandle()","Unchanged","1","1","0","0","45","45"
"Security2","Security2.SafeHGlobalHandle","System.Void Security2.SafeHGlobalHandle::.ctor(System.IntPtr)","Unchanged","3","3","0","0","31,33,34","31,33,34"
"Security2","Security2.SafeHGlobalHandle","System.Void Security2.SafeHGlobalHandle::AddSubReference(System.Collections.Generic.IEnumerable`1<Security2.SafeHGlobalHandle>)","Unchanged","4","4","2","2","60,62,65,66","60,62,65,66"
"Security2","Security2.SafeHGlobalHandle","System.Void Security2.SafeHGlobalHandle::Dispose()","Unchanged","0","0","1","1","169","169"
"Security2","Security2.SafeTokenHandle","Security2.SafeTokenHandle Security2.SafeTokenHandle::get_InvalidHandle()","Unchanged","1","1","0","0","256","256"
"Security2","Security2.SafeTokenHandle","System.Boolean Security2.SafeTokenHandle::ReleaseHandle()","Unchanged","1","1","0","0","266","266"
"Security2","Security2.SafeTokenHandle","System.Void Security2.SafeTokenHandle::.ctor()","Unchanged","2","2","0","0","243","243"
"Security2","Security2.SafeTokenHandle","System.Void Security2.SafeTokenHandle::.ctor(System.IntPtr)","Unchanged","3","3","0","0","247,249,250","247,249,250"
"Security2","Security2.Win32","System.Boolean Security2.Win32::IsLocalComputer(System.String)","Changed","2","3","0","1","170,172","155,157,174,176"
"Security2","Security2.Win32","System.Byte[] Security2.Win32::GetByteSecurityDescriptor(Microsoft.Win32.SafeHandles.SafeFileHandle,Security2.SecurityInformationClass)","Moved","13","13","2","2","311,312,315,323,325,328,330,331,332,335,336,337,339","346,347,350,358,360,363,365,366,367,370,371,372,374"
"Security2","Security2.Win32","System.Int32 Security2.Win32::GetEffectiveAccess(System.Security.AccessControl.ObjectSecurity,Security2.IdentityReference2,System.String,System.Boolean&,System.Exception&)","Moved","2","2","0","0","135,136","139,140"
"Security2","Security2.Win32","System.Int32 Security2.Win32::GetEffectivePermissions_AuthzAccessCheck(System.Security.AccessControl.ObjectSecurity)","Moved","0","0","1","1","281","316"
"Security2","Security2.Win32","System.Security.AccessControl.RawSecurityDescriptor Security2.Win32::GetRawSecurityDescriptor(Microsoft.Win32.SafeHandles.SafeFileHandle,Security2.SecurityInformationClass)","Moved","1","1","0","0","306","341"
"Security2","Security2.Win32","System.Void Security2.Win32::GetEffectivePermissions_AuthzInitializeContextFromSid(Security2.IdentityReference2)","Changed","0","6","1","4","245","270,272,273,274,275,276,277,280"
"Security2","Security2.Win32","System.Void Security2.Win32::GetEffectivePermissions_AuthzInitializeLocalResourceManager()","New","","1","","1","","235,243"
"Security2","Security2.Win32","System.Void Security2.Win32::GetEffectivePermissions_AuthzInitializeResourceManager(System.String,System.Boolean&)","Changed","3","4","3","6","188,194,196,210,218,223","198,200,201,202,212,215"
"Security2","Security2.Win32RegistrySecurity","Microsoft.Win32.RegistryKey Security2.Win32RegistrySecurity::GetRegistryKey(Security2.REGISTRY_ROOT,System.String,System.Security.AccessControl.RegistryRights)","Unchanged","8","8","0","0","429,431,433,435,437,440,442,444","429,431,433,435,437,440,442,444"
"Security2","Security2.Win32RegistrySecurity","System.Void Security2.Win32RegistrySecurity::SetRegistryOwner(Security2.REGISTRY_ROOT,System.String,System.Security.Principal.SecurityIdentifier)","Unchanged","24","24","4","4","448,450,451,452,454,458,459,461,463,464,466,470,473,474,478,479,481,483,484,486,490,494,495,496","448,450,451,452,454,458,459,461,463,464,466,470,473,474,478,479,481,483,484,486,490,494,495,496"
1 Assembly Class Method Status OldSequence NewSequence OldBranches NewBranches OldLines NewLines
2 NTFSSecurity NTFSSecurity.AddAccess Security2.ApplyTo NTFSSecurity.AddAccess::get_AppliesTo() Unchanged 1 1 0 0 95 95
3 NTFSSecurity NTFSSecurity.AddAccess Security2.FileSystemRights2 NTFSSecurity.AddAccess::get_AccessRights() Unchanged 1 1 0 0 62 62
4 NTFSSecurity NTFSSecurity.AddAccess Security2.FileSystemSecurity2[] NTFSSecurity.AddAccess::get_SecurityDescriptor() Unchanged 1 1 0 0 42 42
5 NTFSSecurity NTFSSecurity.AddAccess Security2.IdentityReference2[] NTFSSecurity.AddAccess::get_Account() Unchanged 1 1 0 0 54 54
6 NTFSSecurity NTFSSecurity.AddAccess System.Management.Automation.SwitchParameter NTFSSecurity.AddAccess::get_PassThru() Unchanged 1 1 0 0 102 102
7 NTFSSecurity NTFSSecurity.AddAccess System.Security.AccessControl.AccessControlType NTFSSecurity.AddAccess::get_AccessType() Unchanged 1 1 0 0 70 70
8 NTFSSecurity NTFSSecurity.AddAccess System.Security.AccessControl.InheritanceFlags NTFSSecurity.AddAccess::get_InheritanceFlags() Unchanged 1 1 0 0 78 78
9 NTFSSecurity NTFSSecurity.AddAccess System.Security.AccessControl.PropagationFlags NTFSSecurity.AddAccess::get_PropagationFlags() Unchanged 1 1 0 0 86 86
10 NTFSSecurity NTFSSecurity.AddAccess System.String[] NTFSSecurity.AddAccess::get_Path() Unchanged 1 1 0 0 29 29
11 NTFSSecurity NTFSSecurity.AddAudit/<>c__DisplayClass35_0 System.Void NTFSSecurity.AddAudit/<>c__DisplayClass35_0::<ProcessRecord>b__0() Unchanged 2 2 0 0 143,144 143,144
12 NTFSSecurity NTFSSecurity.AddAudit Security2.ApplyTo NTFSSecurity.AddAudit::get_AppliesTo() Unchanged 1 1 0 0 94 94
13 NTFSSecurity NTFSSecurity.AddAudit Security2.FileSystemRights2 NTFSSecurity.AddAudit::get_AccessRights() Unchanged 1 1 0 0 62 62
14 NTFSSecurity NTFSSecurity.AddAudit Security2.FileSystemSecurity2[] NTFSSecurity.AddAudit::get_SecurityDescriptor() Unchanged 1 1 0 0 42 42
15 NTFSSecurity NTFSSecurity.AddAudit Security2.IdentityReference2[] NTFSSecurity.AddAudit::get_Account() Unchanged 1 1 0 0 54 54
16 NTFSSecurity NTFSSecurity.AddAudit System.Management.Automation.SwitchParameter NTFSSecurity.AddAudit::get_PassThru() Unchanged 1 1 0 0 101 101
17 NTFSSecurity NTFSSecurity.AddAudit System.Security.AccessControl.AuditFlags NTFSSecurity.AddAudit::get_AuditFlags() Unchanged 1 1 0 0 69 69
18 NTFSSecurity NTFSSecurity.AddAudit System.Security.AccessControl.InheritanceFlags NTFSSecurity.AddAudit::get_InheritanceFlags() Unchanged 1 1 0 0 77 77
19 NTFSSecurity NTFSSecurity.AddAudit System.Security.AccessControl.PropagationFlags NTFSSecurity.AddAudit::get_PropagationFlags() Unchanged 1 1 0 0 85 85
20 NTFSSecurity NTFSSecurity.AddAudit System.String[] NTFSSecurity.AddAudit::get_Path() Unchanged 1 1 0 0 29 29
21 NTFSSecurity NTFSSecurity.AddAudit System.Void NTFSSecurity.AddAudit::ProcessRecord() Unchanged 7 7 0 0 137,141,145,146,148,149,151 137,141,145,146,148,149,151
22 NTFSSecurity NTFSSecurity.AuditCmdlets.GetOrphanedAudit System.Void NTFSSecurity.AuditCmdlets.GetOrphanedAudit::ProcessRecord() Unchanged 3 3 0 0 56,58,59 56,58,59
23 NTFSSecurity NTFSSecurity.BaseCmdlet System.IO.FileSystemInfo NTFSSecurity.BaseCmdlet::GetFileSystemInfo(System.String) Unchanged 6 6 4 4 166,168,170,172,174,178 166,168,170,172,174,178
24 NTFSSecurity NTFSSecurity.BaseCmdlet System.String NTFSSecurity.BaseCmdlet::GetRelativePath(System.String) Unchanged 1 1 1 1 229,231 229,231
25 NTFSSecurity NTFSSecurity.BaseCmdlet System.Void NTFSSecurity.BaseCmdlet::ProcessRecord() Unchanged 2 2 0 0 145,146 145,146
26 NTFSSecurity NTFSSecurity.BaseCmdletWithPrivControl System.Boolean NTFSSecurity.BaseCmdletWithPrivControl::TryDisablePrivilege(ProcessPrivileges.Privilege) Unchanged 3 3 0 0 490,492,493 490,492,493
27 NTFSSecurity NTFSSecurity.BaseCmdletWithPrivControl System.Collections.Generic.List`1<System.String> NTFSSecurity.BaseCmdletWithPrivControl::DisableEnabledPrivileges(System.Collections.Generic.Dictionary`2<System.String,System.Exception>) Unchanged 3 3 0 0 422,424,425 422,424,425
28 NTFSSecurity NTFSSecurity.BaseCmdletWithPrivControl System.Void NTFSSecurity.BaseCmdletWithPrivControl::DisableFileSystemPrivileges() Unchanged 1 1 1 1 544,545 544,545
29 NTFSSecurity NTFSSecurity.BaseCmdletWithPrivControl System.Void NTFSSecurity.BaseCmdletWithPrivControl::EndProcessing() Unchanged 3 3 1 1 389,391,392 389,391,392
30 NTFSSecurity NTFSSecurity.ClearAccess Security2.FileSystemSecurity2[] NTFSSecurity.ClearAccess::get_SecurityDescriptor() Unchanged 1 1 0 0 31 31
31 NTFSSecurity NTFSSecurity.ClearAccess System.Management.Automation.SwitchParameter NTFSSecurity.ClearAccess::get_DisableInheritance() Unchanged 1 1 0 0 42 42
32 NTFSSecurity NTFSSecurity.ClearAccess System.String[] NTFSSecurity.ClearAccess::get_Path() Unchanged 1 1 0 0 19 19
33 NTFSSecurity NTFSSecurity.ClearAccess System.Void NTFSSecurity.ClearAccess::ProcessRecord() Unchanged 3 3 0 0 92,94,95 92,94,95
34 NTFSSecurity NTFSSecurity.ClearAudit/<>c__DisplayClass11_0 System.Void NTFSSecurity.ClearAudit/<>c__DisplayClass11_0::<ProcessRecord>b__0() Unchanged 4 4 2 2 82,83,84,85 82,83,84,85
35 NTFSSecurity NTFSSecurity.ClearAudit Security2.FileSystemSecurity2[] NTFSSecurity.ClearAudit::get_SecurityDescriptor() Unchanged 1 1 0 0 31 31
36 NTFSSecurity NTFSSecurity.ClearAudit System.Management.Automation.SwitchParameter NTFSSecurity.ClearAudit::get_DisableInheritance() Unchanged 1 1 0 0 42 42
37 NTFSSecurity NTFSSecurity.ClearAudit System.String[] NTFSSecurity.ClearAudit::get_Path() Unchanged 1 1 0 0 19 19
38 NTFSSecurity NTFSSecurity.ClearAudit System.Void NTFSSecurity.ClearAudit::ProcessRecord() Unchanged 7 7 0 0 76,80,86,87,89,90,91 76,80,86,87,89,90,91
39 NTFSSecurity NTFSSecurity.CopyItem2 System.Boolean NTFSSecurity.CopyItem2::get_PassThru() Unchanged 1 1 0 0 47 47
40 NTFSSecurity NTFSSecurity.CopyItem2 System.Management.Automation.SwitchParameter NTFSSecurity.CopyItem2::get_Force() Unchanged 1 1 0 0 40 40
41 NTFSSecurity NTFSSecurity.CopyItem2 System.String NTFSSecurity.CopyItem2::get_Destination() Unchanged 1 1 0 0 33 33
42 NTFSSecurity NTFSSecurity.CopyItem2 System.String[] NTFSSecurity.CopyItem2::get_Path() Unchanged 1 1 0 0 21 21
43 NTFSSecurity NTFSSecurity.DisableAccessInheritance Security2.FileSystemSecurity2[] NTFSSecurity.DisableAccessInheritance::get_SecurityDescriptor() Unchanged 1 1 0 0 33 33
44 NTFSSecurity NTFSSecurity.DisableAccessInheritance System.Management.Automation.SwitchParameter NTFSSecurity.DisableAccessInheritance::get_PassThru() Unchanged 1 1 0 0 51 51
45 NTFSSecurity NTFSSecurity.DisableAccessInheritance System.Management.Automation.SwitchParameter NTFSSecurity.DisableAccessInheritance::get_RemoveInheritedAccessRules() Unchanged 1 1 0 0 44 44
46 NTFSSecurity NTFSSecurity.DisableAccessInheritance System.String[] NTFSSecurity.DisableAccessInheritance::get_Path() Unchanged 1 1 0 0 21 21
47 NTFSSecurity NTFSSecurity.DisableAccessInheritance System.Void NTFSSecurity.DisableAccessInheritance::ProcessRecord() Unchanged 3 3 0 0 97,99,100 97,99,100
48 NTFSSecurity NTFSSecurity.DisableAuditInheritance/<>c__DisplayClass15_0 System.Void NTFSSecurity.DisableAuditInheritance/<>c__DisplayClass15_0::<ProcessRecord>b__0() Unchanged 2 2 0 0 94,95 94,95
49 NTFSSecurity NTFSSecurity.DisableAuditInheritance Security2.FileSystemSecurity2[] NTFSSecurity.DisableAuditInheritance::get_SecurityDescriptor() Unchanged 1 1 0 0 34 34
50 NTFSSecurity NTFSSecurity.DisableAuditInheritance System.Management.Automation.SwitchParameter NTFSSecurity.DisableAuditInheritance::get_PassThru() Unchanged 1 1 0 0 57 57
51 NTFSSecurity NTFSSecurity.DisableAuditInheritance System.Management.Automation.SwitchParameter NTFSSecurity.DisableAuditInheritance::get_RemoveInheritedAuditRules() Unchanged 1 1 0 0 50 50
52 NTFSSecurity NTFSSecurity.DisableAuditInheritance System.String[] NTFSSecurity.DisableAuditInheritance::get_Path() Unchanged 1 1 0 0 22 22
53 NTFSSecurity NTFSSecurity.DisableAuditInheritance System.Void NTFSSecurity.DisableAuditInheritance::ProcessRecord() Unchanged 7 7 0 0 88,92,96,97,99,100,102 88,92,96,97,99,100,102
54 NTFSSecurity NTFSSecurity.DisablePrivileges System.Management.Automation.SwitchParameter NTFSSecurity.DisablePrivileges::get_PassThru() Unchanged 1 1 0 0 83 83
55 NTFSSecurity NTFSSecurity.EnableAccessInheritance Security2.FileSystemSecurity2[] NTFSSecurity.EnableAccessInheritance::get_SecurityDescriptor() Unchanged 1 1 0 0 33 33
56 NTFSSecurity NTFSSecurity.EnableAccessInheritance System.Management.Automation.SwitchParameter NTFSSecurity.EnableAccessInheritance::get_PassThru() Unchanged 1 1 0 0 44 44
57 NTFSSecurity NTFSSecurity.EnableAccessInheritance System.Management.Automation.SwitchParameter NTFSSecurity.EnableAccessInheritance::get_RemoveExplicitAccessRules() Unchanged 1 1 0 0 51 51
58 NTFSSecurity NTFSSecurity.EnableAccessInheritance System.String[] NTFSSecurity.EnableAccessInheritance::get_Path() Unchanged 1 1 0 0 21 21
59 NTFSSecurity NTFSSecurity.EnableAccessInheritance System.Void NTFSSecurity.EnableAccessInheritance::ProcessRecord() Unchanged 3 3 0 0 97,99,100 97,99,100
60 NTFSSecurity NTFSSecurity.EnableAuditInheritance/<>c__DisplayClass15_0 System.Void NTFSSecurity.EnableAuditInheritance/<>c__DisplayClass15_0::<ProcessRecord>b__0() Unchanged 2 2 0 0 93,94 93,94
61 NTFSSecurity NTFSSecurity.EnableAuditInheritance Security2.FileSystemSecurity2[] NTFSSecurity.EnableAuditInheritance::get_SecurityDescriptor() Unchanged 1 1 0 0 33 33
62 NTFSSecurity NTFSSecurity.EnableAuditInheritance System.Management.Automation.SwitchParameter NTFSSecurity.EnableAuditInheritance::get_PassThru() Unchanged 1 1 0 0 44 44
63 NTFSSecurity NTFSSecurity.EnableAuditInheritance System.Management.Automation.SwitchParameter NTFSSecurity.EnableAuditInheritance::get_RemoveExplicitAuditRules() Unchanged 1 1 0 0 56 56
64 NTFSSecurity NTFSSecurity.EnableAuditInheritance System.String[] NTFSSecurity.EnableAuditInheritance::get_Path() Unchanged 1 1 0 0 21 21
65 NTFSSecurity NTFSSecurity.EnableAuditInheritance System.Void NTFSSecurity.EnableAuditInheritance::ProcessRecord() Unchanged 7 7 0 0 87,91,95,96,98,99,101 87,91,95,96,98,99,101
66 NTFSSecurity NTFSSecurity.EnablePrivileges System.Management.Automation.SwitchParameter NTFSSecurity.EnablePrivileges::get_PassThru() Unchanged 1 1 0 0 21 21
67 NTFSSecurity NTFSSecurity.EnablePrivileges System.Void NTFSSecurity.EnablePrivileges::ProcessRecord() Unchanged 2 2 0 0 39,41 39,41
68 NTFSSecurity NTFSSecurity.FileSystemCodeMembers System.String NTFSSecurity.FileSystemCodeMembers::Mode(System.Management.Automation.PSObject) Unchanged 1 1 1 1 15,17 15,17
69 NTFSSecurity NTFSSecurity.GetAccess/<>c__DisplayClass20_0 System.Void NTFSSecurity.GetAccess/<>c__DisplayClass20_0::<ProcessRecord>b__0() Unchanged 2 2 0 0 110,111 110,111
70 NTFSSecurity NTFSSecurity.GetAccess System.Void NTFSSecurity.GetAccess::ProcessRecord() Unchanged 5 5 0 0 112,118,119,121,122 112,118,119,121,122
71 NTFSSecurity NTFSSecurity.GetAudit System.Void NTFSSecurity.GetAudit::ProcessRecord() Unchanged 3 3 0 0 104,107,108 104,107,108
72 NTFSSecurity NTFSSecurity.GetChildItem2 System.IO.FileAttributes NTFSSecurity.GetChildItem2::get_Attributes() Unchanged 1 1 0 0 79 79
73 NTFSSecurity NTFSSecurity.GetChildItem2 System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_Directory() Unchanged 1 1 0 0 65 65
74 NTFSSecurity NTFSSecurity.GetChildItem2 System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_File() Unchanged 1 1 0 0 72 72
75 NTFSSecurity NTFSSecurity.GetChildItem2 System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_Force() Unchanged 1 1 0 0 107 107
76 NTFSSecurity NTFSSecurity.GetChildItem2 System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_Hidden() Unchanged 1 1 0 0 86 86
77 NTFSSecurity NTFSSecurity.GetChildItem2 System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_ReadOnly() Unchanged 1 1 0 0 100 100
78 NTFSSecurity NTFSSecurity.GetChildItem2 System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_Recurse() Unchanged 1 1 0 0 58 58
79 NTFSSecurity NTFSSecurity.GetChildItem2 System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_SkipMountPoints() Unchanged 1 1 0 0 114 114
80 NTFSSecurity NTFSSecurity.GetChildItem2 System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_SkipSymbolicLinks() Unchanged 1 1 0 0 121 121
81 NTFSSecurity NTFSSecurity.GetChildItem2 System.Management.Automation.SwitchParameter NTFSSecurity.GetChildItem2::get_System() Unchanged 1 1 0 0 93 93
82 NTFSSecurity NTFSSecurity.GetChildItem2 System.Nullable`1<System.Int32> NTFSSecurity.GetChildItem2::get_Depth() Unchanged 1 1 0 0 128 128
83 NTFSSecurity NTFSSecurity.GetChildItem2 System.String NTFSSecurity.GetChildItem2::get_Filter() Unchanged 1 1 0 0 51 51
84 NTFSSecurity NTFSSecurity.GetChildItem2 System.String[] NTFSSecurity.GetChildItem2::get_Path() Unchanged 1 1 0 0 39 39
85 NTFSSecurity NTFSSecurity.GetChildItem2 System.Void NTFSSecurity.GetChildItem2::WriteFileSystem(Alphaleonis.Win32.Filesystem.FileSystemInfo,System.Int32) Unchanged 0 0 1 1 205 205
86 NTFSSecurity NTFSSecurity.GetDiskSpace System.String[] NTFSSecurity.GetDiskSpace::get_DriveLetter() Unchanged 1 1 0 0 18 18
87 NTFSSecurity NTFSSecurity.GetDiskSpace System.Void NTFSSecurity.GetDiskSpace::ProcessRecord() Unchanged 0 0 1 1 52 52
88 NTFSSecurity NTFSSecurity.GetEffectiveAccess/<>c__DisplayClass20_0 System.Void NTFSSecurity.GetEffectiveAccess/<>c__DisplayClass20_0::<ProcessRecord>b__0() Unchanged 2 2 0 0 139,140 139,140
89 NTFSSecurity NTFSSecurity.GetEffectiveAccess Security2.FileSystemSecurity2[] NTFSSecurity.GetEffectiveAccess::get_SecurityDescriptor() Unchanged 1 1 0 0 38 38
90 NTFSSecurity NTFSSecurity.GetEffectiveAccess Security2.IdentityReference2 NTFSSecurity.GetEffectiveAccess::get_Account() Unchanged 1 1 0 0 51 51
91 NTFSSecurity NTFSSecurity.GetEffectiveAccess System.Management.Automation.SwitchParameter NTFSSecurity.GetEffectiveAccess::get_ExcludeNoneAccessEntries() Unchanged 1 1 0 0 65 65
92 NTFSSecurity NTFSSecurity.GetEffectiveAccess System.String NTFSSecurity.GetEffectiveAccess::get_ServerName() Unchanged 1 1 0 0 58 58
93 NTFSSecurity NTFSSecurity.GetEffectiveAccess System.String[] NTFSSecurity.GetEffectiveAccess::get_Path() Unchanged 1 1 0 0 26 26
94 NTFSSecurity NTFSSecurity.GetEffectiveAccess System.Void NTFSSecurity.GetEffectiveAccess::ProcessRecord() Unchanged 8 8 0 0 99,101,102,141,147,148,150,151 99,101,102,141,147,148,150,151
95 NTFSSecurity NTFSSecurity.GetFileHash2/<>c__DisplayClass9_0 System.Void NTFSSecurity.GetFileHash2/<>c__DisplayClass9_0::<ProcessRecord>b__0() Unchanged 1 1 0 0 102 102
96 NTFSSecurity NTFSSecurity.GetFileHash2 Security2.FileSystem.FileInfo.HashAlgorithms NTFSSecurity.GetFileHash2::get_Algorithm() Unchanged 1 1 0 0 33 33
97 NTFSSecurity NTFSSecurity.GetFileHash2 System.Void NTFSSecurity.GetFileHash2::ProcessRecord() Unchanged 6 6 0 0 51,52,55,56,103,109 51,52,55,56,103,109
98 NTFSSecurity NTFSSecurity.GetHardLink System.Void NTFSSecurity.GetHardLink::ProcessRecord() Unchanged 3 3 0 0 77,79,80 77,79,80
99 NTFSSecurity NTFSSecurity.GetInheritance/<>c__DisplayClass7_0 System.Void NTFSSecurity.GetInheritance/<>c__DisplayClass7_0::<ProcessRecord>b__0() Unchanged 2 2 0 0 78,79 78,79
100 NTFSSecurity NTFSSecurity.GetInheritance Security2.FileSystemSecurity2[] NTFSSecurity.GetInheritance::get_SecurityDescriptor() Unchanged 1 1 0 0 31 31
101 NTFSSecurity NTFSSecurity.GetInheritance System.String[] NTFSSecurity.GetInheritance::get_Path() Unchanged 1 1 0 0 19 19
102 NTFSSecurity NTFSSecurity.GetInheritance System.Void NTFSSecurity.GetInheritance::ProcessRecord() Unchanged 5 5 1 1 80,86,87,89,90,107 80,86,87,89,90,107
103 NTFSSecurity NTFSSecurity.GetItem2 System.String[] NTFSSecurity.GetItem2::get_Path() Unchanged 1 1 0 0 19 19
104 NTFSSecurity NTFSSecurity.GetOrphanedAccess/<>c__DisplayClass1_0 System.Void NTFSSecurity.GetOrphanedAccess/<>c__DisplayClass1_0::<ProcessRecord>b__0() Unchanged 2 2 0 0 53,54 53,54
105 NTFSSecurity NTFSSecurity.GetOrphanedAccess System.Void NTFSSecurity.GetOrphanedAccess::ProcessRecord() Unchanged 5 5 0 0 55,62,63,65,66 55,62,63,65,66
106 NTFSSecurity NTFSSecurity.GetSecurityDescriptor/<>c__DisplayClass4_0 System.Void NTFSSecurity.GetSecurityDescriptor/<>c__DisplayClass4_0::<ProcessRecord>b__0() Unchanged 2 2 0 0 62,63 62,63
107 NTFSSecurity NTFSSecurity.GetSecurityDescriptor System.String[] NTFSSecurity.GetSecurityDescriptor::get_Path() Unchanged 1 1 0 0 18 18
108 NTFSSecurity NTFSSecurity.GetSecurityDescriptor System.Void NTFSSecurity.GetSecurityDescriptor::ProcessRecord() Unchanged 5 5 2 2 64,67,69,75,78,83,84 64,67,69,75,78,83,84
109 NTFSSecurity NTFSSecurity.GetSimpleAccess System.Management.Automation.SwitchParameter NTFSSecurity.GetSimpleAccess::get_IncludeRootFolder() Unchanged 1 1 0 0 24 24
110 NTFSSecurity NTFSSecurity.MoveItem2 System.Boolean NTFSSecurity.MoveItem2::get_PassThru() Unchanged 1 1 0 0 47 47
111 NTFSSecurity NTFSSecurity.MoveItem2 System.Management.Automation.SwitchParameter NTFSSecurity.MoveItem2::get_Force() Unchanged 1 1 0 0 40 40
112 NTFSSecurity NTFSSecurity.MoveItem2 System.String NTFSSecurity.MoveItem2::get_Destination() Unchanged 1 1 0 0 33 33
113 NTFSSecurity NTFSSecurity.MoveItem2 System.String[] NTFSSecurity.MoveItem2::get_Path() Unchanged 1 1 0 0 21 21
114 NTFSSecurity NTFSSecurity.NewHardLink System.Management.Automation.SwitchParameter NTFSSecurity.NewHardLink::get_PassThru() Unchanged 1 1 0 0 47 47
115 NTFSSecurity NTFSSecurity.NewSymbolicLink System.Management.Automation.SwitchParameter NTFSSecurity.NewSymbolicLink::get_PassThru() Unchanged 1 1 0 0 45 45
116 NTFSSecurity NTFSSecurity.OwnerCmdlets.GetOwner System.Void NTFSSecurity.OwnerCmdlets.GetOwner::ProcessRecord() Unchanged 3 3 0 0 72,74,75 72,74,75
117 NTFSSecurity NTFSSecurity.Properties.Resources System.Drawing.Bitmap NTFSSecurity.Properties.Resources::get_IconContainer() Unchanged 2 2 0 0 77,78 77,78
118 NTFSSecurity NTFSSecurity.Properties.Resources System.Globalization.CultureInfo NTFSSecurity.Properties.Resources::get_Culture() Unchanged 1 1 0 0 56 56
119 NTFSSecurity NTFSSecurity.Properties.Resources System.Resources.ResourceManager NTFSSecurity.Properties.Resources::get_ResourceManager() Unchanged 4 4 2 2 41,42,43,45 41,42,43,45
120 NTFSSecurity NTFSSecurity.Properties.Resources System.String NTFSSecurity.Properties.Resources::get_ContainerIcon() Unchanged 1 1 0 0 68 68
121 NTFSSecurity NTFSSecurity.Properties.Resources System.Void NTFSSecurity.Properties.Resources::.ctor() Unchanged 2 2 0 0 32,33 32,33
122 NTFSSecurity NTFSSecurity.Properties.Resources System.Void NTFSSecurity.Properties.Resources::set_Culture(System.Globalization.CultureInfo) Unchanged 2 2 0 0 59,60 59,60
123 NTFSSecurity NTFSSecurity.RemoveAccess Security2.ApplyTo NTFSSecurity.RemoveAccess::get_AppliesTo() Unchanged 1 1 0 0 96 96
124 NTFSSecurity NTFSSecurity.RemoveAccess System.Management.Automation.SwitchParameter NTFSSecurity.RemoveAccess::get_PassThru() Unchanged 1 1 0 0 113 113
125 NTFSSecurity NTFSSecurity.RemoveAccess System.Management.Automation.SwitchParameter NTFSSecurity.RemoveAccess::get_RemoveSpecific() Unchanged 1 1 0 0 106 106
126 NTFSSecurity NTFSSecurity.RemoveAudit/<>c__DisplayClass39_0 System.Void NTFSSecurity.RemoveAudit/<>c__DisplayClass39_0::<ProcessRecord>b__0() Unchanged 2 2 0 0 159,160 159,160
127 NTFSSecurity NTFSSecurity.RemoveAudit Security2.ApplyTo NTFSSecurity.RemoveAudit::get_AppliesTo() Unchanged 1 1 0 0 95 95
128 NTFSSecurity NTFSSecurity.RemoveAudit Security2.FileSystemRights2 NTFSSecurity.RemoveAudit::get_AccessRights() Unchanged 1 1 0 0 63 63
129 NTFSSecurity NTFSSecurity.RemoveAudit Security2.FileSystemSecurity2[] NTFSSecurity.RemoveAudit::get_SecurityDescriptor() Unchanged 1 1 0 0 43 43
130 NTFSSecurity NTFSSecurity.RemoveAudit Security2.IdentityReference2[] NTFSSecurity.RemoveAudit::get_Account() Unchanged 1 1 0 0 55 55
131 NTFSSecurity NTFSSecurity.RemoveAudit System.Management.Automation.SwitchParameter NTFSSecurity.RemoveAudit::get_PassThru() Unchanged 1 1 0 0 112 112
132 NTFSSecurity NTFSSecurity.RemoveAudit System.Management.Automation.SwitchParameter NTFSSecurity.RemoveAudit::get_RemoveSpecific() Unchanged 1 1 0 0 105 105
133 NTFSSecurity NTFSSecurity.RemoveAudit System.Security.AccessControl.AuditFlags NTFSSecurity.RemoveAudit::get_AuditFlags() Unchanged 1 1 0 0 70 70
134 NTFSSecurity NTFSSecurity.RemoveAudit System.Security.AccessControl.InheritanceFlags NTFSSecurity.RemoveAudit::get_InheritanceFlags() Unchanged 1 1 0 0 78 78
135 NTFSSecurity NTFSSecurity.RemoveAudit System.Security.AccessControl.PropagationFlags NTFSSecurity.RemoveAudit::get_PropagationFlags() Unchanged 1 1 0 0 86 86
136 NTFSSecurity NTFSSecurity.RemoveAudit System.String[] NTFSSecurity.RemoveAudit::get_Path() Unchanged 1 1 0 0 30 30
137 NTFSSecurity NTFSSecurity.RemoveAudit System.Void NTFSSecurity.RemoveAudit::ProcessRecord() Unchanged 7 7 0 0 153,157,161,162,164,165,167 153,157,161,162,164,165,167
138 NTFSSecurity NTFSSecurity.RemoveItem2 System.Management.Automation.SwitchParameter NTFSSecurity.RemoveItem2::get_Force() Unchanged 1 1 0 0 32 32
139 NTFSSecurity NTFSSecurity.RemoveItem2 System.Management.Automation.SwitchParameter NTFSSecurity.RemoveItem2::get_PassThru() Unchanged 1 1 0 0 48 48
140 NTFSSecurity NTFSSecurity.RemoveItem2 System.Management.Automation.SwitchParameter NTFSSecurity.RemoveItem2::get_Recurse() Unchanged 1 1 0 0 39 39
141 NTFSSecurity NTFSSecurity.RemoveItem2 System.String[] NTFSSecurity.RemoveItem2::get_Path() Unchanged 1 1 0 0 21 21
142 NTFSSecurity NTFSSecurity.SetInheritance Security2.FileSystemSecurity2[] NTFSSecurity.SetInheritance::get_SecurityDescriptor() Unchanged 1 1 0 0 34 34
143 NTFSSecurity NTFSSecurity.SetInheritance System.Management.Automation.SwitchParameter NTFSSecurity.SetInheritance::get_PassThru() Unchanged 1 1 0 0 59 59
144 NTFSSecurity NTFSSecurity.SetInheritance System.Nullable`1<System.Boolean> NTFSSecurity.SetInheritance::get_AccessInheritanceEnabled() Unchanged 1 1 0 0 45 45
145 NTFSSecurity NTFSSecurity.SetInheritance System.Nullable`1<System.Boolean> NTFSSecurity.SetInheritance::get_AuditInheritanceEnabled() Unchanged 1 1 0 0 52 52
146 NTFSSecurity NTFSSecurity.SetInheritance System.String[] NTFSSecurity.SetInheritance::get_Path() Unchanged 1 1 0 0 22 22
147 NTFSSecurity NTFSSecurity.SetOwner Security2.FileSystemSecurity2[] NTFSSecurity.SetOwner::get_SecurityDescriptor() Unchanged 1 1 0 0 33 33
148 NTFSSecurity NTFSSecurity.SetOwner Security2.IdentityReference2 NTFSSecurity.SetOwner::get_Account() Unchanged 1 1 0 0 44 44
149 NTFSSecurity NTFSSecurity.SetOwner System.Management.Automation.SwitchParameter NTFSSecurity.SetOwner::get_PassThru() Unchanged 1 1 0 0 51 51
150 NTFSSecurity NTFSSecurity.SetSecurityDescriptor System.Management.Automation.SwitchParameter NTFSSecurity.SetSecurityDescriptor::get_PassThru() Unchanged 1 1 0 0 28 28
151 NTFSSecurity NTFSSecurity.TestPath2 System.Void NTFSSecurity.TestPath2::ProcessRecord() Unchanged 6 6 0 0 53,55,56,65,67,68 53,55,56,65,67,68
152 PrivilegeControl Security2.PrivilegeControl ProcessPrivileges.AdjustPrivilegeResult Security2.PrivilegeControl::DisablePrivilege(ProcessPrivileges.Privilege) Unchanged 1 1 1 1 61,67 61,67
153 PrivilegeControl Security2.PrivilegeControl ProcessPrivileges.AdjustPrivilegeResult Security2.PrivilegeControl::EnablePrivilege(ProcessPrivileges.Privilege) Unchanged 1 1 1 1 40,46 40,46
154 ProcessPrivileges ProcessPrivileges.AccessTokenHandle System.Boolean ProcessPrivileges.AccessTokenHandle::ReleaseHandle() Unchanged 1 1 1 1 32,34 32,34
155 ProcessPrivileges ProcessPrivileges.AccessTokenHandle System.Void ProcessPrivileges.AccessTokenHandle::.ctor(ProcessPrivileges.ProcessHandle,ProcessPrivileges.TokenAccessRights) Unchanged 1 1 1 1 21,23 21,23
156 ProcessPrivileges ProcessPrivileges.AllocatedMemory System.Void ProcessPrivileges.AllocatedMemory::Finalize() Unchanged 3 3 0 0 28,29 28,29
157 ProcessPrivileges ProcessPrivileges.AllocatedMemory System.Void ProcessPrivileges.AllocatedMemory::InternalDispose() Unchanged 0 0 1 1 47 47
158 ProcessPrivileges ProcessPrivileges.PrivilegeEnabler ProcessPrivileges.AdjustPrivilegeResult ProcessPrivileges.PrivilegeEnabler::EnablePrivilege(ProcessPrivileges.Privilege) Unchanged 0 0 1 1 172 172
159 ProcessPrivileges ProcessPrivileges.Privileges ProcessPrivileges.Luid ProcessPrivileges.Privileges::GetLuid(ProcessPrivileges.Privilege) Unchanged 1 1 1 1 236,238 236,238
160 ProcessPrivileges ProcessPrivileges.Privileges ProcessPrivileges.LuidAndAttributes[] ProcessPrivileges.Privileges::GetTokenPrivileges(ProcessPrivileges.AccessTokenHandle) Unchanged 2 2 2 2 273,280,294,301 273,280,294,301
161 ProcessPrivileges ProcessPrivileges.Privileges System.String ProcessPrivileges.Privileges::GetPrivilegeName(ProcessPrivileges.Luid) Unchanged 3 3 3 3 249,251,255,257,261,263 249,251,255,257,261,263
162 ProcessPrivileges ProcessPrivileges.ProcessHandle System.Boolean ProcessPrivileges.ProcessHandle::ReleaseHandle() Unchanged 3 3 2 2 27,29,32 27,29,32
163 Security2 Security2.FileSystemAccessRule2/<>c__DisplayClass36_0 System.Boolean Security2.FileSystemAccessRule2/<>c__DisplayClass36_0::<RemoveFileSystemAccessRuleAll>b__0(System.Security.AccessControl.FileSystemAccessRule) Unchanged 1 1 0 0 17 17
164 Security2 Security2.FileSystemAccessRule2/<>c__DisplayClass36_1 System.Boolean Security2.FileSystemAccessRule2/<>c__DisplayClass36_1::<RemoveFileSystemAccessRuleAll>b__1(Security2.IdentityReference2) Unchanged 1 1 0 0 17 17
165 Security2 Security2.FileSystemAccessRule2 System.Void Security2.FileSystemAccessRule2::RemoveFileSystemAccessRuleAll(Security2.FileSystemSecurity2,System.Collections.Generic.List`1<Security2.IdentityReference2>) Unchanged 1 1 1 1 15,17 15,17
166 Security2 Security2.FileSystemAuditRule2/<>c__DisplayClass7_0 System.Boolean Security2.FileSystemAuditRule2/<>c__DisplayClass7_0::<RemoveFileSystemAuditRuleAll>b__0(System.Security.AccessControl.FileSystemAuditRule) Unchanged 1 1 0 0 17 17
167 Security2 Security2.FileSystemAuditRule2/<>c__DisplayClass7_1 System.Boolean Security2.FileSystemAuditRule2/<>c__DisplayClass7_1::<RemoveFileSystemAuditRuleAll>b__1(Security2.IdentityReference2) Unchanged 1 1 0 0 17 17
168 Security2 Security2.FileSystemAuditRule2 System.Collections.Generic.IEnumerable`1<Security2.FileSystemAuditRule2> Security2.FileSystemAuditRule2::GetFileSystemAuditRules(Security2.FileSystemSecurity2,System.Boolean,System.Boolean,System.Boolean) Unchanged 0 0 1 1 44 44
169 Security2 Security2.FileSystemAuditRule2 System.Void Security2.FileSystemAuditRule2::RemoveFileSystemAuditRuleAll(Security2.FileSystemSecurity2,System.Collections.Generic.List`1<Security2.IdentityReference2>) Unchanged 1 1 1 1 15,17 15,17
170 Security2 Security2.FileSystemSecurity2 Security2.FileSystemSecurity2 Security2.FileSystemSecurity2::op_Implicit(System.Security.AccessControl.DirectorySecurity) Moved 1 1 0 0 254 262
171 Security2 Security2.FileSystemSecurity2 Security2.FileSystemSecurity2 Security2.FileSystemSecurity2::op_Implicit(System.Security.AccessControl.FileSecurity) Moved 1 1 0 0 245 253
172 Security2 Security2.FileSystemSecurity2 System.Boolean Security2.FileSystemSecurity2::TryGetDriveRoot(Alphaleonis.Win32.Filesystem.FileSystemInfo,System.String&) Moved 0 0 1 1 122 130
173 Security2 Security2.FileSystemSecurity2 System.Int32 Security2.FileSystemSecurity2::GetHashCode() Moved 0 0 1 1 267 275
174 Security2 Security2.FileSystemSecurity2 System.Void Security2.FileSystemSecurity2::.ctor(Alphaleonis.Win32.Filesystem.FileSystemInfo) Unchanged 2 2 0 0 62,63 62,63
175 Security2 Security2.IdentityReference2 System.Void Security2.IdentityReference2::.ctor(System.Security.Principal.IdentityReference) Unchanged 0 0 1 1 49 49
176 Security2 Security2.IntPtrExtensions System.IntPtr Security2.IntPtrExtensions::Increment(System.IntPtr) Unchanged 1 1 0 0 15 15
177 Security2 Security2.RegistryAccessRule2 Security2.IdentityReference2 Security2.RegistryAccessRule2::get_IdentityReference() Unchanged 1 1 0 0 148 148
178 Security2 Security2.RegistryAccessRule2 Security2.RegistryAccessRule2 Security2.RegistryAccessRule2::op_Implicit(System.Security.AccessControl.RegistryAccessRule) Unchanged 1 1 0 0 161 161
179 Security2 Security2.RegistryAccessRule2 System.Boolean Security2.RegistryAccessRule2::Equals(System.Object) Unchanged 1 1 0 0 166 166
180 Security2 Security2.RegistryAccessRule2 System.Boolean Security2.RegistryAccessRule2::get_IsInherited() Unchanged 1 1 0 0 150 150
181 Security2 Security2.RegistryAccessRule2 System.Int32 Security2.RegistryAccessRule2::GetHashCode() Unchanged 1 1 0 0 170 170
182 Security2 Security2.RegistryAccessRule2 System.Security.AccessControl.AccessControlType Security2.RegistryAccessRule2::get_AccessControlType() Unchanged 1 1 0 0 146 146
183 Security2 Security2.RegistryAccessRule2 System.Security.AccessControl.InheritanceFlags Security2.RegistryAccessRule2::get_InheritanceFlags() Unchanged 1 1 0 0 149 149
184 Security2 Security2.RegistryAccessRule2 System.Security.AccessControl.PropagationFlags Security2.RegistryAccessRule2::get_PropagationFlags() Unchanged 1 1 0 0 151 151
185 Security2 Security2.RegistryAccessRule2 System.Security.AccessControl.RegistryAccessRule Security2.RegistryAccessRule2::op_Implicit(Security2.RegistryAccessRule2) Unchanged 1 1 0 0 157 157
186 Security2 Security2.RegistryAccessRule2 System.Security.AccessControl.RegistryRights Security2.RegistryAccessRule2::get_RegistryRights() Unchanged 1 1 0 0 147 147
187 Security2 Security2.RegistryAccessRule2 System.String Security2.RegistryAccessRule2::get_Name() Unchanged 6 6 4 4 117,119,121,122,126,131 117,119,121,122,126,131
188 Security2 Security2.RegistryAccessRule2 System.String Security2.RegistryAccessRule2::ToString() Unchanged 1 1 0 0 174 174
189 Security2 Security2.RegistryAccessRule2 System.Void Security2.RegistryAccessRule2::.ctor(System.Security.AccessControl.RegistryAccessRule) Unchanged 3 3 0 0 140,142,143 140,142,143
190 Security2 Security2.RegistryAccessRule2 System.Void Security2.RegistryAccessRule2::Dispose() Unchanged 1 1 0 0 180 180
191 Security2 Security2.RegistryEffectivePermissionEntry Security2.IdentityReference2 Security2.RegistryEffectivePermissionEntry::get_Account() Unchanged 1 1 0 0 221 221
192 Security2 Security2.RegistryEffectivePermissionEntry System.Collections.Generic.List`1<System.String> Security2.RegistryEffectivePermissionEntry::get_AccessAsString() Unchanged 1 1 0 0 250 250
193 Security2 Security2.RegistryEffectivePermissionEntry System.String Security2.RegistryEffectivePermissionEntry::get_FullName() Unchanged 1 1 0 0 227 227
194 Security2 Security2.RegistryEffectivePermissionEntry System.String Security2.RegistryEffectivePermissionEntry::get_Name() Unchanged 6 6 4 4 230,232,234,235,239,244 230,232,234,235,239,244
195 Security2 Security2.RegistryEffectivePermissionEntry System.UInt32 Security2.RegistryEffectivePermissionEntry::get_AccessMask() Unchanged 1 1 0 0 224 224
196 Security2 Security2.RegistryEffectivePermissionEntry System.Void Security2.RegistryEffectivePermissionEntry::.ctor(Security2.IdentityReference2,System.UInt32,System.String) Unchanged 13 13 4 4 252,254,255,256,257,259,261,265,266,268,271 252,254,255,256,257,259,261,265,266,268,271
197 Security2 Security2.RegistryInheritanceInfo System.String Security2.RegistryInheritanceInfo::get_FullName() Unchanged 1 1 0 0 191 191
198 Security2 Security2.RegistryInheritanceInfo System.String Security2.RegistryInheritanceInfo::get_Name() Unchanged 6 6 4 4 196,198,200,201,205,210 196,198,200,201,205,210
199 Security2 Security2.RegistryKeyOpenException System.Int64 Security2.RegistryKeyOpenException::get_Win32ErrorCode() Unchanged 1 1 0 0 330 330
200 Security2 Security2.RegistryKeyOpenException System.Void Security2.RegistryKeyOpenException::.ctor() Unchanged 2 2 0 0 333,334 333,334
201 Security2 Security2.RegistryKeyOpenException System.Void Security2.RegistryKeyOpenException::.ctor(System.Exception,System.Int64) Unchanged 3 3 0 0 347,349,350 347,349,350
202 Security2 Security2.RegistryKeyOpenException System.Void Security2.RegistryKeyOpenException::.ctor(System.Exception) Unchanged 2 2 0 0 337,338 337,338
203 Security2 Security2.RegistryKeyOpenException System.Void Security2.RegistryKeyOpenException::.ctor(System.Int64) Unchanged 3 3 0 0 341,343,344 341,343,344
204 Security2 Security2.RegistryKeySetSecurityException System.Int64 Security2.RegistryKeySetSecurityException::get_Win32ErrorCode() Unchanged 1 1 0 0 356 356
205 Security2 Security2.RegistryKeySetSecurityException System.Void Security2.RegistryKeySetSecurityException::.ctor() Unchanged 2 2 0 0 359,360 359,360
206 Security2 Security2.RegistryKeySetSecurityException System.Void Security2.RegistryKeySetSecurityException::.ctor(System.Exception,System.Int64) Unchanged 3 3 0 0 373,375,376 373,375,376
207 Security2 Security2.RegistryKeySetSecurityException System.Void Security2.RegistryKeySetSecurityException::.ctor(System.Exception) Unchanged 2 2 0 0 363,364 363,364
208 Security2 Security2.RegistryKeySetSecurityException System.Void Security2.RegistryKeySetSecurityException::.ctor(System.Int64) Unchanged 3 3 0 0 367,369,370 367,369,370
209 Security2 Security2.SafeAuthzRMHandle Security2.SafeAuthzRMHandle Security2.SafeAuthzRMHandle::get_InvalidHandle() Unchanged 1 1 0 0 309 309
210 Security2 Security2.SafeAuthzRMHandle System.Void Security2.SafeAuthzRMHandle::.ctor(System.IntPtr) Unchanged 3 3 0 0 299,301,302 299,301,302
211 Security2 Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.Collections.Generic.ICollection`1<T>) Unchanged 1 1 0 0 109 109
212 Security2 Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.Int32,System.Collections.Generic.IEnumerable`1<T>,System.Int32) Unchanged 8 8 2 2 130,132,133,135,136,139 130,132,133,135,136,139
213 Security2 Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.Int32) Unchanged 1 1 1 1 184,186 184,186
214 Security2 Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.IntPtr[]) Unchanged 3 3 0 0 77,79,81 77,79,81
215 Security2 Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::AllocHGlobal(System.String) Unchanged 1 1 0 0 150 150
216 Security2 Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle Security2.SafeHGlobalHandle::get_InvalidHandle() Unchanged 1 1 0 0 45 45
217 Security2 Security2.SafeHGlobalHandle System.Void Security2.SafeHGlobalHandle::.ctor(System.IntPtr) Unchanged 3 3 0 0 31,33,34 31,33,34
218 Security2 Security2.SafeHGlobalHandle System.Void Security2.SafeHGlobalHandle::AddSubReference(System.Collections.Generic.IEnumerable`1<Security2.SafeHGlobalHandle>) Unchanged 4 4 2 2 60,62,65,66 60,62,65,66
219 Security2 Security2.SafeHGlobalHandle System.Void Security2.SafeHGlobalHandle::Dispose() Unchanged 0 0 1 1 169 169
220 Security2 Security2.SafeTokenHandle Security2.SafeTokenHandle Security2.SafeTokenHandle::get_InvalidHandle() Unchanged 1 1 0 0 256 256
221 Security2 Security2.SafeTokenHandle System.Boolean Security2.SafeTokenHandle::ReleaseHandle() Unchanged 1 1 0 0 266 266
222 Security2 Security2.SafeTokenHandle System.Void Security2.SafeTokenHandle::.ctor() Unchanged 2 2 0 0 243 243
223 Security2 Security2.SafeTokenHandle System.Void Security2.SafeTokenHandle::.ctor(System.IntPtr) Unchanged 3 3 0 0 247,249,250 247,249,250
224 Security2 Security2.Win32 System.Boolean Security2.Win32::IsLocalComputer(System.String) Changed 2 3 0 1 170,172 155,157,174,176
225 Security2 Security2.Win32 System.Byte[] Security2.Win32::GetByteSecurityDescriptor(Microsoft.Win32.SafeHandles.SafeFileHandle,Security2.SecurityInformationClass) Moved 13 13 2 2 311,312,315,323,325,328,330,331,332,335,336,337,339 346,347,350,358,360,363,365,366,367,370,371,372,374
226 Security2 Security2.Win32 System.Int32 Security2.Win32::GetEffectiveAccess(System.Security.AccessControl.ObjectSecurity,Security2.IdentityReference2,System.String,System.Boolean&,System.Exception&) Moved 2 2 0 0 135,136 139,140
227 Security2 Security2.Win32 System.Int32 Security2.Win32::GetEffectivePermissions_AuthzAccessCheck(System.Security.AccessControl.ObjectSecurity) Moved 0 0 1 1 281 316
228 Security2 Security2.Win32 System.Security.AccessControl.RawSecurityDescriptor Security2.Win32::GetRawSecurityDescriptor(Microsoft.Win32.SafeHandles.SafeFileHandle,Security2.SecurityInformationClass) Moved 1 1 0 0 306 341
229 Security2 Security2.Win32 System.Void Security2.Win32::GetEffectivePermissions_AuthzInitializeContextFromSid(Security2.IdentityReference2) Changed 0 6 1 4 245 270,272,273,274,275,276,277,280
230 Security2 Security2.Win32 System.Void Security2.Win32::GetEffectivePermissions_AuthzInitializeLocalResourceManager() New 1 1 235,243
231 Security2 Security2.Win32 System.Void Security2.Win32::GetEffectivePermissions_AuthzInitializeResourceManager(System.String,System.Boolean&) Changed 3 4 3 6 188,194,196,210,218,223 198,200,201,202,212,215
232 Security2 Security2.Win32RegistrySecurity Microsoft.Win32.RegistryKey Security2.Win32RegistrySecurity::GetRegistryKey(Security2.REGISTRY_ROOT,System.String,System.Security.AccessControl.RegistryRights) Unchanged 8 8 0 0 429,431,433,435,437,440,442,444 429,431,433,435,437,440,442,444
233 Security2 Security2.Win32RegistrySecurity System.Void Security2.Win32RegistrySecurity::SetRegistryOwner(Security2.REGISTRY_ROOT,System.String,System.Security.Principal.SecurityIdentifier) Unchanged 24 24 4 4 448,450,451,452,454,458,459,461,463,464,466,470,473,474,478,479,481,483,484,486,490,494,495,496 448,450,451,452,454,458,459,461,463,464,466,470,473,474,478,479,481,483,484,486,490,494,495,496

232
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10-Runs.csv

@ -0,0 +1,232 @@
"Run","Configuration","Passed","Failed","Skipped","Total","Source"
"Stage A validate (fa0701b, host)","Windows PowerShell 5.1, elevated","1290","0","24","1314","fa0701b\validate\elevated-Desktop.xml"
"Stage A validate (fa0701b, host)","Windows PowerShell 5.1, basic user","1078","0","236","1314","fa0701b\validate\basic-Desktop.xml"
"Stage A validate (fa0701b, host)","PowerShell 7, elevated","1259","0","55","1314","fa0701b\validate\elevated-Core.xml"
"Stage A validate (fa0701b, host)","PowerShell 7, basic user","1047","0","267","1314","fa0701b\validate\basic-Core.xml"
"Stage A coverage (fa0701b, host)","Windows PowerShell 5.1, elevated","1290","0","24","1314","fa0701b\coverage\elevated-Desktop.xml"
"Stage A coverage (fa0701b, host)","Windows PowerShell 5.1, basic user","1078","0","236","1314","fa0701b\coverage\basic-Desktop.xml"
"Stage A coverage (fa0701b, host)","PowerShell 7, elevated","1259","0","55","1314","fa0701b\coverage\elevated-Core.xml"
"Stage A coverage (fa0701b, host)","PowerShell 7, basic user","1047","0","267","1314","fa0701b\coverage\basic-Core.xml"
"Unit suite, culture de-DE (fa0701b, host)","Windows PowerShell 5.1, elevated","1290","0","24","1314","cultures\de-DE-Desktop.xml"
"Unit suite, culture de-DE (fa0701b, host)","PowerShell 7, elevated","1253","6","55","1314","cultures\de-DE-Core.xml"
"Unit suite, culture tr-TR (fa0701b, host)","Windows PowerShell 5.1, elevated","1290","0","24","1314","cultures\tr-TR-Desktop.xml"
"Unit suite, culture tr-TR (fa0701b, host)","PowerShell 7, elevated","1259","0","55","1314","cultures\tr-TR-Core.xml"
"Unit suite on OSFile25 (18 behavior files, instrumented)","PowerShell 7, basic user","780","0","231","1011","localsuite-osfile25\ls25-localsuite-summary.csv"
"Unit suite on OSFile25 (18 behavior files, instrumented)","PowerShell 7, elevated","992","0","19","1011","localsuite-osfile25\ls25-localsuite-summary.csv"
"Unit suite on OSFile25 (18 behavior files, instrumented)","Windows PowerShell 5.1, basic user","782","0","229","1011","localsuite-osfile25\ls25-localsuite-summary.csv"
"Unit suite on OSFile25 (18 behavior files, instrumented)","Windows PowerShell 5.1, elevated","994","0","17","1011","localsuite-osfile25\ls25-localsuite-summary.csv"
"Live suite, first lab (fl2, instrumented)","Windows PowerShell 5.1, four roles","245","0","1","246","live-fl2\fl2-Desktop-counts.csv"
"Live suite, first lab (fl2, instrumented)","PowerShell 7, four roles","245","0","1","246","live-fl2\fl2-Core-counts.csv"
"Live suite, matrix cell OSFile19 with OSWin11E (mx1, instrumented)","Windows PowerShell 5.1, four roles","229","0","2","231","live-matrix\mx1-OSFile19\mx1-OSFile19-counts.csv"
"Live suite, matrix cell OSFile19 with OSWin11E (mx1, instrumented)","PowerShell 7, four roles","229","0","2","231","live-matrix\mx1-OSFile19\mx1-OSFile19-counts.csv"
"Live suite, matrix cell OSFile22 with OSWin11E (mx1, instrumented)","Windows PowerShell 5.1, four roles","229","0","2","231","live-matrix\mx1-OSFile22\mx1-OSFile22-counts.csv"
"Live suite, matrix cell OSFile22 with OSWin11E (mx1, instrumented)","PowerShell 7, four roles","229","0","2","231","live-matrix\mx1-OSFile22\mx1-OSFile22-counts.csv"
"Live suite, matrix cell OSFile25 with OSWin11E (mx1, instrumented)","Windows PowerShell 5.1, four roles","229","0","2","231","live-matrix\mx1-OSFile25\mx1-OSFile25-counts.csv"
"Live suite, matrix cell OSFile25 with OSWin11E (mx1, instrumented)","PowerShell 7, four roles","229","0","2","231","live-matrix\mx1-OSFile25\mx1-OSFile25-counts.csv"
"Live suite, matrix cell OSFile19 with OSWin11E (mxf, final build of 8a625c8, not instrumented)","Windows PowerShell 5.1, four roles","229","0","2","231","live-matrix-final\mxf-OSFile19\mxf-OSFile19-counts.csv"
"Live suite, matrix cell OSFile19 with OSWin11E (mxf, final build of 8a625c8, not instrumented)","PowerShell 7, four roles","229","0","2","231","live-matrix-final\mxf-OSFile19\mxf-OSFile19-counts.csv"
"Live suite, matrix cell OSFile22 with OSWin11E (mxf, final build of 8a625c8, not instrumented)","Windows PowerShell 5.1, four roles","229","0","2","231","live-matrix-final\mxf-OSFile22\mxf-OSFile22-counts.csv"
"Live suite, matrix cell OSFile22 with OSWin11E (mxf, final build of 8a625c8, not instrumented)","PowerShell 7, four roles","229","0","2","231","live-matrix-final\mxf-OSFile22\mxf-OSFile22-counts.csv"
"Live suite, matrix cell OSFile25 with OSWin11E (mxf, final build of 8a625c8, not instrumented)","Windows PowerShell 5.1, four roles","229","0","2","231","live-matrix-final\mxf-OSFile25\mxf-OSFile25-counts.csv"
"Live suite, matrix cell OSFile25 with OSWin11E (mxf, final build of 8a625c8, not instrumented)","PowerShell 7, four roles","229","0","2","231","live-matrix-final\mxf-OSFile25\mxf-OSFile25-counts.csv"
"Live suite, matrix cell OSFile19 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented)","Windows PowerShell 5.1, four roles","229","0","2","231","live-matrix-ap8\ap8-OSFile19\ap8-OSFile19-counts.csv"
"Live suite, matrix cell OSFile19 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented)","PowerShell 7, four roles","229","0","2","231","live-matrix-ap8\ap8-OSFile19\ap8-OSFile19-counts.csv"
"Live suite, matrix cell OSFile22 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented)","Windows PowerShell 5.1, four roles","229","0","2","231","live-matrix-ap8\ap8-OSFile22\ap8-OSFile22-counts.csv"
"Live suite, matrix cell OSFile22 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented)","PowerShell 7, four roles","229","0","2","231","live-matrix-ap8\ap8-OSFile22\ap8-OSFile22-counts.csv"
"Live suite, matrix cell OSFile25 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented)","Windows PowerShell 5.1, four roles","229","0","2","231","live-matrix-ap8\ap8-OSFile25\ap8-OSFile25-counts.csv"
"Live suite, matrix cell OSFile25 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented)","PowerShell 7, four roles","229","0","2","231","live-matrix-ap8\ap8-OSFile25\ap8-OSFile25-counts.csv"
"Final validate (b2cb47b, host)","Windows PowerShell 5.1, elevated","1429","0","26","1455","final\validate\elevated-Desktop.xml"
"Final validate (b2cb47b, host)","Windows PowerShell 5.1, basic user","1179","0","276","1455","final\validate\basic-Desktop.xml"
"Final validate (b2cb47b, host)","PowerShell 7, elevated","1398","0","57","1455","final\validate\elevated-Core.xml"
"Final validate (b2cb47b, host)","PowerShell 7, basic user","1148","0","307","1455","final\validate\basic-Core.xml"
"Final coverage (b2cb47b, host)","Windows PowerShell 5.1, elevated","1429","0","26","1455","final\coverage\elevated-Desktop.xml"
"Final coverage (b2cb47b, host)","Windows PowerShell 5.1, basic user","1179","0","276","1455","final\coverage\basic-Desktop.xml"
"Final coverage (b2cb47b, host)","PowerShell 7, elevated","1398","0","57","1455","final\coverage\elevated-Core.xml"
"Final coverage (b2cb47b, host)","PowerShell 7, basic user","1148","0","307","1455","final\coverage\basic-Core.xml"
"Final validate (f1f3d8f, host)","Windows PowerShell 5.1, elevated","1429","0","26","1455","final2\validate\elevated-Desktop.xml"
"Final validate (f1f3d8f, host)","Windows PowerShell 5.1, basic user","1179","0","276","1455","final2\validate\basic-Desktop.xml"
"Final validate (f1f3d8f, host)","PowerShell 7, elevated","1398","0","57","1455","final2\validate\elevated-Core.xml"
"Final validate (f1f3d8f, host)","PowerShell 7, basic user","1148","0","307","1455","final2\validate\basic-Core.xml"
"Final coverage (f1f3d8f, host)","Windows PowerShell 5.1, elevated","1429","0","26","1455","final2\coverage\elevated-Desktop.xml"
"Final coverage (f1f3d8f, host)","Windows PowerShell 5.1, basic user","1179","0","276","1455","final2\coverage\basic-Desktop.xml"
"Final coverage (f1f3d8f, host)","PowerShell 7, elevated","1398","0","57","1455","final2\coverage\elevated-Core.xml"
"Final coverage (f1f3d8f, host)","PowerShell 7, basic user","1148","0","307","1455","final2\coverage\basic-Core.xml"
"Final validate (61e936e, host)","Windows PowerShell 5.1, elevated","1433","0","26","1459","final5\validate\elevated-Desktop.xml"
"Final validate (61e936e, host)","Windows PowerShell 5.1, basic user","1183","0","276","1459","final5\validate\basic-Desktop.xml"
"Final validate (61e936e, host)","PowerShell 7, elevated","1402","0","57","1459","final5\validate\elevated-Core.xml"
"Final validate (61e936e, host)","PowerShell 7, basic user","1152","0","307","1459","final5\validate\basic-Core.xml"
"Final coverage (61e936e, host)","Windows PowerShell 5.1, elevated","1433","0","26","1459","final5\coverage\elevated-Desktop.xml"
"Final coverage (61e936e, host)","Windows PowerShell 5.1, basic user","1183","0","276","1459","final5\coverage\basic-Desktop.xml"
"Final coverage (61e936e, host)","PowerShell 7, elevated","1402","0","57","1459","final5\coverage\elevated-Core.xml"
"Final coverage (61e936e, host)","PowerShell 7, basic user","1152","0","307","1459","final5\coverage\basic-Core.xml"
"Final validate (93ed2c7, host)","Windows PowerShell 5.1, elevated","1452","0","26","1478","final6\validate\elevated-Desktop.xml"
"Final validate (93ed2c7, host)","Windows PowerShell 5.1, basic user","1194","0","284","1478","final6\validate\basic-Desktop.xml"
"Final validate (93ed2c7, host)","PowerShell 7, elevated","1421","0","57","1478","final6\validate\elevated-Core.xml"
"Final validate (93ed2c7, host)","PowerShell 7, basic user","1163","0","315","1478","final6\validate\basic-Core.xml"
"Final coverage (93ed2c7, host)","Windows PowerShell 5.1, elevated","1452","0","26","1478","final6\coverage\elevated-Desktop.xml"
"Final coverage (93ed2c7, host)","Windows PowerShell 5.1, basic user","1194","0","284","1478","final6\coverage\basic-Desktop.xml"
"Final coverage (93ed2c7, host)","PowerShell 7, elevated","1421","0","57","1478","final6\coverage\elevated-Core.xml"
"Final coverage (93ed2c7, host)","PowerShell 7, basic user","1163","0","315","1478","final6\coverage\basic-Core.xml"
"Final validate (9783d2a, host)","Windows PowerShell 5.1, elevated","1464","0","26","1490","final7\validate\elevated-Desktop.xml"
"Final validate (9783d2a, host)","Windows PowerShell 5.1, basic user","1200","0","290","1490","final7\validate\basic-Desktop.xml"
"Final validate (9783d2a, host)","PowerShell 7, elevated","1433","0","57","1490","final7\validate\elevated-Core.xml"
"Final validate (9783d2a, host)","PowerShell 7, basic user","1169","0","321","1490","final7\validate\basic-Core.xml"
"Final coverage (9783d2a, host)","Windows PowerShell 5.1, elevated","1464","0","26","1490","final7\coverage\elevated-Desktop.xml"
"Final coverage (9783d2a, host)","Windows PowerShell 5.1, basic user","1200","0","290","1490","final7\coverage\basic-Desktop.xml"
"Final coverage (9783d2a, host)","PowerShell 7, elevated","1433","0","57","1490","final7\coverage\elevated-Core.xml"
"Final coverage (9783d2a, host)","PowerShell 7, basic user","1169","0","321","1490","final7\coverage\basic-Core.xml"
"Final validate (7bc7925, host)","Windows PowerShell 5.1, elevated","1466","0","26","1492","final8\validate\elevated-Desktop.xml"
"Final validate (7bc7925, host)","Windows PowerShell 5.1, basic user","1201","0","291","1492","final8\validate\basic-Desktop.xml"
"Final validate (7bc7925, host)","PowerShell 7, elevated","1435","0","57","1492","final8\validate\elevated-Core.xml"
"Final validate (7bc7925, host)","PowerShell 7, basic user","1170","0","322","1492","final8\validate\basic-Core.xml"
"Final coverage (7bc7925, host)","Windows PowerShell 5.1, elevated","1466","0","26","1492","final8\coverage\elevated-Desktop.xml"
"Final coverage (7bc7925, host)","Windows PowerShell 5.1, basic user","1201","0","291","1492","final8\coverage\basic-Desktop.xml"
"Final coverage (7bc7925, host)","PowerShell 7, elevated","1435","0","57","1492","final8\coverage\elevated-Core.xml"
"Final coverage (7bc7925, host)","PowerShell 7, basic user","1170","0","322","1492","final8\coverage\basic-Core.xml"
"Final validate (2112ee3, host)","Windows PowerShell 5.1, elevated","1466","0","26","1492","final9\validate\elevated-Desktop.xml"
"Final validate (2112ee3, host)","Windows PowerShell 5.1, basic user","1201","0","291","1492","final9\validate\basic-Desktop.xml"
"Final validate (2112ee3, host)","PowerShell 7, elevated","1435","0","57","1492","final9\validate\elevated-Core.xml"
"Final validate (2112ee3, host)","PowerShell 7, basic user","1170","0","322","1492","final9\validate\basic-Core.xml"
"Final coverage (2112ee3, host)","Windows PowerShell 5.1, elevated","1466","0","26","1492","final9\coverage\elevated-Desktop.xml"
"Final coverage (2112ee3, host)","Windows PowerShell 5.1, basic user","1201","0","291","1492","final9\coverage\basic-Desktop.xml"
"Final coverage (2112ee3, host)","PowerShell 7, elevated","1435","0","57","1492","final9\coverage\elevated-Core.xml"
"Final coverage (2112ee3, host)","PowerShell 7, basic user","1170","0","322","1492","final9\coverage\basic-Core.xml"
"Focused: the two ParameterSets files on the build before the fix (tdd3red2, red)","PowerShell 7, basic user","38","8","29","75","tdd3\tdd3red2-basiccore.log"
"Focused: the two ParameterSets files on the build before the fix (tdd3red2, red)","Windows PowerShell 5.1, basic user","38","8","29","75","tdd3\tdd3red2-basicdesktop.log"
"Focused: the two ParameterSets files on the build before the fix (tdd3red2, red)","PowerShell 7, elevated","62","12","1","75","tdd3\tdd3red2-elevatedcore.log"
"Focused: the two ParameterSets files on the build before the fix (tdd3red2, red)","Windows PowerShell 5.1, elevated","62","12","1","75","tdd3\tdd3red2-elevateddesktop.log"
"Focused: the two files and the Items file on 93ed2c7 (tdd3green, green)","PowerShell 7, basic user","173","0","36","209","tdd3\tdd3green-basiccore.log"
"Focused: the two files and the Items file on 93ed2c7 (tdd3green, green)","Windows PowerShell 5.1, basic user","174","0","35","209","tdd3\tdd3green-basicdesktop.log"
"Focused: the two files and the Items file on 93ed2c7 (tdd3green, green)","PowerShell 7, elevated","207","0","2","209","tdd3\tdd3green-elevatedcore.log"
"Focused: the two files and the Items file on 93ed2c7 (tdd3green, green)","Windows PowerShell 5.1, elevated","208","0","1","209","tdd3\tdd3green-elevateddesktop.log"
"Focused: the two files with the mixed-pipeline rows on 93ed2c7 (tdd4red2, red)","PowerShell 7, basic user","48","4","35","87","tdd4\tdd4red2-basiccore.log"
"Focused: the two files with the mixed-pipeline rows on 93ed2c7 (tdd4red2, red)","Windows PowerShell 5.1, basic user","48","4","35","87","tdd4\tdd4red2-basicdesktop.log"
"Focused: the two files with the mixed-pipeline rows on 93ed2c7 (tdd4red2, red)","PowerShell 7, elevated","78","8","1","87","tdd4\tdd4red2-elevatedcore.log"
"Focused: the two files with the mixed-pipeline rows on 93ed2c7 (tdd4red2, red)","Windows PowerShell 5.1, elevated","78","8","1","87","tdd4\tdd4red2-elevateddesktop.log"
"Focused: the three files on 9783d2a (tdd4green, green)","PowerShell 7, basic user","179","0","42","221","tdd4\tdd4green-basiccore.log"
"Focused: the three files on 9783d2a (tdd4green, green)","Windows PowerShell 5.1, basic user","180","0","41","221","tdd4\tdd4green-basicdesktop.log"
"Focused: the three files on 9783d2a (tdd4green, green)","PowerShell 7, elevated","219","0","2","221","tdd4\tdd4green-elevatedcore.log"
"Focused: the three files on 9783d2a (tdd4green, green)","Windows PowerShell 5.1, elevated","220","0","1","221","tdd4\tdd4green-elevateddesktop.log"
"Focused: the two files with the Import-Csv and $null rows on the build before the fix, 8a625c8 (tdd5red, red)","PowerShell 7, basic user","38","15","36","89","tdd5red\logs\tdd5red-basiccore.log"
"Focused: the two files with the Import-Csv and $null rows on the build before the fix, 8a625c8 (tdd5red, red)","Windows PowerShell 5.1, basic user","38","15","36","89","tdd5red\logs\tdd5red-basicdesktop.log"
"Focused: the two files with the Import-Csv and $null rows on the build before the fix, 8a625c8 (tdd5red, red)","PowerShell 7, elevated","62","26","1","89","tdd5red\logs\tdd5red-elevatedcore.log"
"Focused: the two files with the Import-Csv and $null rows on the build before the fix, 8a625c8 (tdd5red, red)","Windows PowerShell 5.1, elevated","62","26","1","89","tdd5red\logs\tdd5red-elevateddesktop.log"
"Focused: the two files with the Import-Csv and $null rows on 93ed2c7 (tdd5red93, red)","PowerShell 7, basic user","48","5","36","89","tdd5red93\logs\tdd5red93-basiccore.log"
"Focused: the two files with the Import-Csv and $null rows on 93ed2c7 (tdd5red93, red)","Windows PowerShell 5.1, basic user","48","5","36","89","tdd5red93\logs\tdd5red93-basicdesktop.log"
"Focused: the two files with the Import-Csv and $null rows on 93ed2c7 (tdd5red93, red)","PowerShell 7, elevated","78","10","1","89","tdd5red93\logs\tdd5red93-elevatedcore.log"
"Focused: the two files with the Import-Csv and $null rows on 93ed2c7 (tdd5red93, red)","Windows PowerShell 5.1, elevated","78","10","1","89","tdd5red93\logs\tdd5red93-elevateddesktop.log"
"Focused: the two files with the Import-Csv and $null rows on 9783d2a (tdd5, green)","PowerShell 7, basic user","53","0","36","89","tdd5\tdd5-basiccore.log"
"Focused: the two files with the Import-Csv and $null rows on 9783d2a (tdd5, green)","Windows PowerShell 5.1, basic user","53","0","36","89","tdd5\tdd5-basicdesktop.log"
"Focused: the two files with the Import-Csv and $null rows on 9783d2a (tdd5, green)","PowerShell 7, elevated","88","0","1","89","tdd5\tdd5-elevatedcore.log"
"Focused: the two files with the Import-Csv and $null rows on 9783d2a (tdd5, green)","Windows PowerShell 5.1, elevated","88","0","1","89","tdd5\tdd5-elevateddesktop.log"
"Focused: the two files of 2112ee3, three audit titles changed, on the package of 9783d2a (tdd6, green)","PowerShell 7, basic user","53","0","36","89","tdd6\tdd6-basiccore.log"
"Focused: the two files of 2112ee3, three audit titles changed, on the package of 9783d2a (tdd6, green)","Windows PowerShell 5.1, basic user","53","0","36","89","tdd6\tdd6-basicdesktop.log"
"Focused: the two files of 2112ee3, three audit titles changed, on the package of 9783d2a (tdd6, green)","PowerShell 7, elevated","88","0","1","89","tdd6\tdd6-elevatedcore.log"
"Focused: the two files of 2112ee3, three audit titles changed, on the package of 9783d2a (tdd6, green)","Windows PowerShell 5.1, elevated","88","0","1","89","tdd6\tdd6-elevateddesktop.log"
"Focused: Items file, mutation B of GetChildItem2 (item written inside the scope)","Windows PowerShell 5.1, elevated","130","4","0","134","tdd3\mutB-elevateddesktop.log"
"Focused: Items file, mutation A of GetChildItem2 (culture not restored)","PowerShell 7, elevated","129","4","1","134","tdd3\mutA2-elevatedcore.log"
"Focused: Items file, mutation A of GetChildItem2 (culture not restored)","Windows PowerShell 5.1, elevated","130","4","0","134","tdd3\mutA2-elevateddesktop.log"
"Focused: Items file, mutation C of GetChildItem2 (culture restored only after an item)","PowerShell 7, elevated","129","4","1","134","tdd4\mutC-elevatedcore.log"
"Focused: Items file, mutation C of GetChildItem2 (culture restored only after an item)","Windows PowerShell 5.1, elevated","130","4","0","134","tdd4\mutC-elevateddesktop.log"
"Live suite, first lab, build of b2cb47b (fix1, not instrumented)","Windows PowerShell 5.1, four roles","245","0","1","246","live-fix1\fix1-Desktop-counts.csv"
"Live suite, first lab, build of b2cb47b (fix1, not instrumented)","PowerShell 7, four roles","245","0","1","246","live-fix1\fix1-Core-counts.csv"
"Live suite, first lab, intermediate build of 0028ccd (fix3, not instrumented)","Windows PowerShell 5.1, four roles","245","0","1","246","live-fix3\fix3-Desktop-counts.csv"
"Live suite, first lab, intermediate build of 0028ccd (fix3, not instrumented)","PowerShell 7, four roles","245","0","1","246","live-fix3\fix3-Core-counts.csv"
"Live suite, first lab, final build of 8a625c8 (fix4, not instrumented)","Windows PowerShell 5.1, four roles","245","0","1","246","live-fix4\fix4-Desktop-counts.csv"
"Live suite, first lab, final build of 8a625c8 (fix4, not instrumented)","PowerShell 7, four roles","245","0","1","246","live-fix4\fix4-Core-counts.csv"
"Live suite, first lab, final build of 9783d2a (acc-ap7, not instrumented)","Windows PowerShell 5.1, four roles","245","0","1","246","live-ap7\acc-ap7-Desktop-counts.csv"
"Live suite, first lab, final build of 9783d2a (acc-ap7, not instrumented)","PowerShell 7, four roles","245","0","1","246","live-ap7\acc-ap7-Core-counts.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile25, PowerShell 7, basic user","881","0","271","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile25, PowerShell 7, elevated","1130","1","21","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile25, Windows PowerShell 5.1, basic user","883","0","269","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile25, Windows PowerShell 5.1, elevated","1132","1","19","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile19, PowerShell 7, basic user","881","0","271","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile19, PowerShell 7, elevated","1130","1","21","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile19, Windows PowerShell 5.1, basic user","883","0","269","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile19, Windows PowerShell 5.1, elevated","1132","1","19","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile22, PowerShell 7, basic user","881","0","271","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile22, PowerShell 7, elevated","1130","1","21","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile22, Windows PowerShell 5.1, basic user","883","0","269","1152","localsuite-final\fix1-localsuite-summary.csv"
"Unit suite on the file servers (fix1, 22 files, tests of b2cb47b)","OSFile22, Windows PowerShell 5.1, elevated","1132","1","19","1152","localsuite-final\fix1-localsuite-summary.csv"
"Diagnosis of the failing file on the file servers (rep1, one file with prints)","OSFile25, PowerShell 7, elevated","46","1","1","48","repro\rep1-localsuite-summary.csv"
"Diagnosis of the failing file on the file servers (rep1, one file with prints)","OSFile25, Windows PowerShell 5.1, elevated","46","1","1","48","repro\rep1-localsuite-summary.csv"
"Diagnosis of the failing file on the file servers (rep1, one file with prints)","OSFile19, PowerShell 7, elevated","46","1","1","48","repro\rep1-localsuite-summary.csv"
"Diagnosis of the failing file on the file servers (rep1, one file with prints)","OSFile19, Windows PowerShell 5.1, elevated","46","1","1","48","repro\rep1-localsuite-summary.csv"
"The two changed test files on the file servers (rep2, tests of f1f3d8f)","OSFile25, PowerShell 7, elevated","76","0","2","78","repro-fixed\rep2-localsuite-summary.csv"
"The two changed test files on the file servers (rep2, tests of f1f3d8f)","OSFile25, Windows PowerShell 5.1, elevated","76","0","2","78","repro-fixed\rep2-localsuite-summary.csv"
"The two changed test files on the file servers (rep2, tests of f1f3d8f)","OSFile19, PowerShell 7, elevated","76","0","2","78","repro-fixed\rep2-localsuite-summary.csv"
"The two changed test files on the file servers (rep2, tests of f1f3d8f)","OSFile19, Windows PowerShell 5.1, elevated","76","0","2","78","repro-fixed\rep2-localsuite-summary.csv"
"The two changed test files on the file servers (rep2, tests of f1f3d8f)","OSFile22, PowerShell 7, elevated","76","0","2","78","repro-fixed\rep2-localsuite-summary.csv"
"The two changed test files on the file servers (rep2, tests of f1f3d8f)","OSFile22, Windows PowerShell 5.1, elevated","76","0","2","78","repro-fixed\rep2-localsuite-summary.csv"
"The two changed test files on the host (hostfix, tests of f1f3d8f)","host, PowerShell 7, basic user","40","0","38","78","repro-host\hostfix-localsuite-summary.csv"
"The two changed test files on the host (hostfix, tests of f1f3d8f)","host, PowerShell 7, elevated","76","0","2","78","repro-host\hostfix-localsuite-summary.csv"
"The two changed test files on the host (hostfix, tests of f1f3d8f)","host, Windows PowerShell 5.1, basic user","40","0","38","78","repro-host\hostfix-localsuite-summary.csv"
"The two changed test files on the host (hostfix, tests of f1f3d8f)","host, Windows PowerShell 5.1, elevated","76","0","2","78","repro-host\hostfix-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile25, PowerShell 7, basic user","881","0","271","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile25, PowerShell 7, elevated","1131","0","21","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile25, Windows PowerShell 5.1, basic user","883","0","269","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile25, Windows PowerShell 5.1, elevated","1133","0","19","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile19, PowerShell 7, basic user","881","0","271","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile19, PowerShell 7, elevated","1131","0","21","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile19, Windows PowerShell 5.1, basic user","883","0","269","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile19, Windows PowerShell 5.1, elevated","1133","0","19","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile22, PowerShell 7, basic user","881","0","271","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile22, PowerShell 7, elevated","1131","0","21","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile22, Windows PowerShell 5.1, basic user","883","0","269","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f)","OSFile22, Windows PowerShell 5.1, elevated","1133","0","19","1152","localsuite-final2\fix2-localsuite-summary.csv"
"Unit suite on the Windows 11 client (fix2c, 22 files, tests of f1f3d8f)","OSWin11, PowerShell 7, basic user","881","0","271","1152","localsuite-final2-client\fix2c-localsuite-summary.csv"
"Unit suite on the Windows 11 client (fix2c, 22 files, tests of f1f3d8f)","OSWin11, PowerShell 7, elevated","1131","0","21","1152","localsuite-final2-client\fix2c-localsuite-summary.csv"
"Unit suite on the Windows 11 client (fix2c, 22 files, tests of f1f3d8f)","OSWin11, Windows PowerShell 5.1, basic user","883","0","269","1152","localsuite-final2-client\fix2c-localsuite-summary.csv"
"Unit suite on the Windows 11 client (fix2c, 22 files, tests of f1f3d8f)","OSWin11, Windows PowerShell 5.1, elevated","1133","0","19","1152","localsuite-final2-client\fix2c-localsuite-summary.csv"
"Test of the filter before the fix (tdd2red, ItemCmdlets file, build of b2cb47b)","host, PowerShell 7, basic user","124","3","7","134","tdd2\red\tdd2red-localsuite-summary.csv"
"Test of the filter before the fix (tdd2red, ItemCmdlets file, build of b2cb47b)","host, PowerShell 7, elevated","130","3","1","134","tdd2\red\tdd2red-localsuite-summary.csv"
"Test of the filter before the fix (tdd2red, ItemCmdlets file, build of b2cb47b)","host, Windows PowerShell 5.1, basic user","125","3","6","134","tdd2\red\tdd2red-localsuite-summary.csv"
"Test of the filter before the fix (tdd2red, ItemCmdlets file, build of b2cb47b)","host, Windows PowerShell 5.1, elevated","131","3","0","134","tdd2\red\tdd2red-localsuite-summary.csv"
"Tests of the filter after the fix (tdd2green3, three files, build of 8a625c8)","host, PowerShell 7, basic user","170","0","30","200","tdd2\green3\tdd2green3-localsuite-summary.csv"
"Tests of the filter after the fix (tdd2green3, three files, build of 8a625c8)","host, PowerShell 7, elevated","198","0","2","200","tdd2\green3\tdd2green3-localsuite-summary.csv"
"Tests of the filter after the fix (tdd2green3, three files, build of 8a625c8)","host, Windows PowerShell 5.1, basic user","171","0","29","200","tdd2\green3\tdd2green3-localsuite-summary.csv"
"Tests of the filter after the fix (tdd2green3, three files, build of 8a625c8)","host, Windows PowerShell 5.1, elevated","199","0","1","200","tdd2\green3\tdd2green3-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile25, PowerShell 7, basic user","885","0","271","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile25, PowerShell 7, elevated","1135","0","21","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile25, Windows PowerShell 5.1, basic user","887","0","269","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile25, Windows PowerShell 5.1, elevated","1137","0","19","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile19, PowerShell 7, basic user","885","0","271","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile19, PowerShell 7, elevated","1135","0","21","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile19, Windows PowerShell 5.1, basic user","887","0","269","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile19, Windows PowerShell 5.1, elevated","1137","0","19","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile22, PowerShell 7, basic user","885","0","271","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile22, PowerShell 7, elevated","1135","0","21","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile22, Windows PowerShell 5.1, basic user","887","0","269","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e)","OSFile22, Windows PowerShell 5.1, elevated","1137","0","19","1156","localsuite-final5\fix5-localsuite-summary.csv"
"Unit suite on the Windows 11 client (fix5c, 22 files, final build and tests of 61e936e)","OSWin11, PowerShell 7, basic user","885","0","271","1156","localsuite-final5-client\fix5c-localsuite-summary.csv"
"Unit suite on the Windows 11 client (fix5c, 22 files, final build and tests of 61e936e)","OSWin11, PowerShell 7, elevated","1135","0","21","1156","localsuite-final5-client\fix5c-localsuite-summary.csv"
"Unit suite on the Windows 11 client (fix5c, 22 files, final build and tests of 61e936e)","OSWin11, Windows PowerShell 5.1, basic user","887","0","269","1156","localsuite-final5-client\fix5c-localsuite-summary.csv"
"Unit suite on the Windows 11 client (fix5c, 22 files, final build and tests of 61e936e)","OSWin11, Windows PowerShell 5.1, elevated","1137","0","19","1156","localsuite-final5-client\fix5c-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile25, PowerShell 7, basic user","896","0","279","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile25, PowerShell 7, elevated","1154","0","21","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile25, Windows PowerShell 5.1, basic user","898","0","277","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile25, Windows PowerShell 5.1, elevated","1156","0","19","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile19, PowerShell 7, basic user","896","0","279","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile19, PowerShell 7, elevated","1154","0","21","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile19, Windows PowerShell 5.1, basic user","898","0","277","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile19, Windows PowerShell 5.1, elevated","1156","0","19","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile22, PowerShell 7, basic user","896","0","279","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile22, PowerShell 7, elevated","1154","0","21","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile22, Windows PowerShell 5.1, basic user","898","0","277","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on)","OSFile22, Windows PowerShell 5.1, elevated","1156","0","19","1175","localsuite-ap6\s-ap6-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile25, PowerShell 7, basic user","903","0","286","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile25, PowerShell 7, elevated","1168","0","21","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile25, Windows PowerShell 5.1, basic user","905","0","284","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile25, Windows PowerShell 5.1, elevated","1170","0","19","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile19, PowerShell 7, basic user","903","0","286","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile19, PowerShell 7, elevated","1168","0","21","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile19, Windows PowerShell 5.1, basic user","905","0","284","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile19, Windows PowerShell 5.1, elevated","1170","0","19","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile22, PowerShell 7, basic user","903","0","286","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile22, PowerShell 7, elevated","1168","0","21","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile22, Windows PowerShell 5.1, basic user","905","0","284","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925)","OSFile22, Windows PowerShell 5.1, elevated","1170","0","19","1189","localsuite-ap8\s-ap8-localsuite-summary.csv"
"Unit suite on the Windows 11 client (sc-ap8, 22 files, final package and tests of 7bc7925)","OSWin11, PowerShell 7, basic user","903","0","286","1189","localsuite-ap8-client\sc-ap8-localsuite-summary.csv"
"Unit suite on the Windows 11 client (sc-ap8, 22 files, final package and tests of 7bc7925)","OSWin11, PowerShell 7, elevated","1168","0","21","1189","localsuite-ap8-client\sc-ap8-localsuite-summary.csv"
"Unit suite on the Windows 11 client (sc-ap8, 22 files, final package and tests of 7bc7925)","OSWin11, Windows PowerShell 5.1, basic user","905","0","284","1189","localsuite-ap8-client\sc-ap8-localsuite-summary.csv"
"Unit suite on the Windows 11 client (sc-ap8, 22 files, final package and tests of 7bc7925)","OSWin11, Windows PowerShell 5.1, elevated","1170","0","19","1189","localsuite-ap8-client\sc-ap8-localsuite-summary.csv"
1 Run Configuration Passed Failed Skipped Total Source
2 Stage A validate (fa0701b, host) Windows PowerShell 5.1, elevated 1290 0 24 1314 fa0701b\validate\elevated-Desktop.xml
3 Stage A validate (fa0701b, host) Windows PowerShell 5.1, basic user 1078 0 236 1314 fa0701b\validate\basic-Desktop.xml
4 Stage A validate (fa0701b, host) PowerShell 7, elevated 1259 0 55 1314 fa0701b\validate\elevated-Core.xml
5 Stage A validate (fa0701b, host) PowerShell 7, basic user 1047 0 267 1314 fa0701b\validate\basic-Core.xml
6 Stage A coverage (fa0701b, host) Windows PowerShell 5.1, elevated 1290 0 24 1314 fa0701b\coverage\elevated-Desktop.xml
7 Stage A coverage (fa0701b, host) Windows PowerShell 5.1, basic user 1078 0 236 1314 fa0701b\coverage\basic-Desktop.xml
8 Stage A coverage (fa0701b, host) PowerShell 7, elevated 1259 0 55 1314 fa0701b\coverage\elevated-Core.xml
9 Stage A coverage (fa0701b, host) PowerShell 7, basic user 1047 0 267 1314 fa0701b\coverage\basic-Core.xml
10 Unit suite, culture de-DE (fa0701b, host) Windows PowerShell 5.1, elevated 1290 0 24 1314 cultures\de-DE-Desktop.xml
11 Unit suite, culture de-DE (fa0701b, host) PowerShell 7, elevated 1253 6 55 1314 cultures\de-DE-Core.xml
12 Unit suite, culture tr-TR (fa0701b, host) Windows PowerShell 5.1, elevated 1290 0 24 1314 cultures\tr-TR-Desktop.xml
13 Unit suite, culture tr-TR (fa0701b, host) PowerShell 7, elevated 1259 0 55 1314 cultures\tr-TR-Core.xml
14 Unit suite on OSFile25 (18 behavior files, instrumented) PowerShell 7, basic user 780 0 231 1011 localsuite-osfile25\ls25-localsuite-summary.csv
15 Unit suite on OSFile25 (18 behavior files, instrumented) PowerShell 7, elevated 992 0 19 1011 localsuite-osfile25\ls25-localsuite-summary.csv
16 Unit suite on OSFile25 (18 behavior files, instrumented) Windows PowerShell 5.1, basic user 782 0 229 1011 localsuite-osfile25\ls25-localsuite-summary.csv
17 Unit suite on OSFile25 (18 behavior files, instrumented) Windows PowerShell 5.1, elevated 994 0 17 1011 localsuite-osfile25\ls25-localsuite-summary.csv
18 Live suite, first lab (fl2, instrumented) Windows PowerShell 5.1, four roles 245 0 1 246 live-fl2\fl2-Desktop-counts.csv
19 Live suite, first lab (fl2, instrumented) PowerShell 7, four roles 245 0 1 246 live-fl2\fl2-Core-counts.csv
20 Live suite, matrix cell OSFile19 with OSWin11E (mx1, instrumented) Windows PowerShell 5.1, four roles 229 0 2 231 live-matrix\mx1-OSFile19\mx1-OSFile19-counts.csv
21 Live suite, matrix cell OSFile19 with OSWin11E (mx1, instrumented) PowerShell 7, four roles 229 0 2 231 live-matrix\mx1-OSFile19\mx1-OSFile19-counts.csv
22 Live suite, matrix cell OSFile22 with OSWin11E (mx1, instrumented) Windows PowerShell 5.1, four roles 229 0 2 231 live-matrix\mx1-OSFile22\mx1-OSFile22-counts.csv
23 Live suite, matrix cell OSFile22 with OSWin11E (mx1, instrumented) PowerShell 7, four roles 229 0 2 231 live-matrix\mx1-OSFile22\mx1-OSFile22-counts.csv
24 Live suite, matrix cell OSFile25 with OSWin11E (mx1, instrumented) Windows PowerShell 5.1, four roles 229 0 2 231 live-matrix\mx1-OSFile25\mx1-OSFile25-counts.csv
25 Live suite, matrix cell OSFile25 with OSWin11E (mx1, instrumented) PowerShell 7, four roles 229 0 2 231 live-matrix\mx1-OSFile25\mx1-OSFile25-counts.csv
26 Live suite, matrix cell OSFile19 with OSWin11E (mxf, final build of 8a625c8, not instrumented) Windows PowerShell 5.1, four roles 229 0 2 231 live-matrix-final\mxf-OSFile19\mxf-OSFile19-counts.csv
27 Live suite, matrix cell OSFile19 with OSWin11E (mxf, final build of 8a625c8, not instrumented) PowerShell 7, four roles 229 0 2 231 live-matrix-final\mxf-OSFile19\mxf-OSFile19-counts.csv
28 Live suite, matrix cell OSFile22 with OSWin11E (mxf, final build of 8a625c8, not instrumented) Windows PowerShell 5.1, four roles 229 0 2 231 live-matrix-final\mxf-OSFile22\mxf-OSFile22-counts.csv
29 Live suite, matrix cell OSFile22 with OSWin11E (mxf, final build of 8a625c8, not instrumented) PowerShell 7, four roles 229 0 2 231 live-matrix-final\mxf-OSFile22\mxf-OSFile22-counts.csv
30 Live suite, matrix cell OSFile25 with OSWin11E (mxf, final build of 8a625c8, not instrumented) Windows PowerShell 5.1, four roles 229 0 2 231 live-matrix-final\mxf-OSFile25\mxf-OSFile25-counts.csv
31 Live suite, matrix cell OSFile25 with OSWin11E (mxf, final build of 8a625c8, not instrumented) PowerShell 7, four roles 229 0 2 231 live-matrix-final\mxf-OSFile25\mxf-OSFile25-counts.csv
32 Live suite, matrix cell OSFile19 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented) Windows PowerShell 5.1, four roles 229 0 2 231 live-matrix-ap8\ap8-OSFile19\ap8-OSFile19-counts.csv
33 Live suite, matrix cell OSFile19 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented) PowerShell 7, four roles 229 0 2 231 live-matrix-ap8\ap8-OSFile19\ap8-OSFile19-counts.csv
34 Live suite, matrix cell OSFile22 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented) Windows PowerShell 5.1, four roles 229 0 2 231 live-matrix-ap8\ap8-OSFile22\ap8-OSFile22-counts.csv
35 Live suite, matrix cell OSFile22 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented) PowerShell 7, four roles 229 0 2 231 live-matrix-ap8\ap8-OSFile22\ap8-OSFile22-counts.csv
36 Live suite, matrix cell OSFile25 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented) Windows PowerShell 5.1, four roles 229 0 2 231 live-matrix-ap8\ap8-OSFile25\ap8-OSFile25-counts.csv
37 Live suite, matrix cell OSFile25 with OSWin11E (ap8, final package of 7bc7925 with the DLLs of 9783d2a, not instrumented) PowerShell 7, four roles 229 0 2 231 live-matrix-ap8\ap8-OSFile25\ap8-OSFile25-counts.csv
38 Final validate (b2cb47b, host) Windows PowerShell 5.1, elevated 1429 0 26 1455 final\validate\elevated-Desktop.xml
39 Final validate (b2cb47b, host) Windows PowerShell 5.1, basic user 1179 0 276 1455 final\validate\basic-Desktop.xml
40 Final validate (b2cb47b, host) PowerShell 7, elevated 1398 0 57 1455 final\validate\elevated-Core.xml
41 Final validate (b2cb47b, host) PowerShell 7, basic user 1148 0 307 1455 final\validate\basic-Core.xml
42 Final coverage (b2cb47b, host) Windows PowerShell 5.1, elevated 1429 0 26 1455 final\coverage\elevated-Desktop.xml
43 Final coverage (b2cb47b, host) Windows PowerShell 5.1, basic user 1179 0 276 1455 final\coverage\basic-Desktop.xml
44 Final coverage (b2cb47b, host) PowerShell 7, elevated 1398 0 57 1455 final\coverage\elevated-Core.xml
45 Final coverage (b2cb47b, host) PowerShell 7, basic user 1148 0 307 1455 final\coverage\basic-Core.xml
46 Final validate (f1f3d8f, host) Windows PowerShell 5.1, elevated 1429 0 26 1455 final2\validate\elevated-Desktop.xml
47 Final validate (f1f3d8f, host) Windows PowerShell 5.1, basic user 1179 0 276 1455 final2\validate\basic-Desktop.xml
48 Final validate (f1f3d8f, host) PowerShell 7, elevated 1398 0 57 1455 final2\validate\elevated-Core.xml
49 Final validate (f1f3d8f, host) PowerShell 7, basic user 1148 0 307 1455 final2\validate\basic-Core.xml
50 Final coverage (f1f3d8f, host) Windows PowerShell 5.1, elevated 1429 0 26 1455 final2\coverage\elevated-Desktop.xml
51 Final coverage (f1f3d8f, host) Windows PowerShell 5.1, basic user 1179 0 276 1455 final2\coverage\basic-Desktop.xml
52 Final coverage (f1f3d8f, host) PowerShell 7, elevated 1398 0 57 1455 final2\coverage\elevated-Core.xml
53 Final coverage (f1f3d8f, host) PowerShell 7, basic user 1148 0 307 1455 final2\coverage\basic-Core.xml
54 Final validate (61e936e, host) Windows PowerShell 5.1, elevated 1433 0 26 1459 final5\validate\elevated-Desktop.xml
55 Final validate (61e936e, host) Windows PowerShell 5.1, basic user 1183 0 276 1459 final5\validate\basic-Desktop.xml
56 Final validate (61e936e, host) PowerShell 7, elevated 1402 0 57 1459 final5\validate\elevated-Core.xml
57 Final validate (61e936e, host) PowerShell 7, basic user 1152 0 307 1459 final5\validate\basic-Core.xml
58 Final coverage (61e936e, host) Windows PowerShell 5.1, elevated 1433 0 26 1459 final5\coverage\elevated-Desktop.xml
59 Final coverage (61e936e, host) Windows PowerShell 5.1, basic user 1183 0 276 1459 final5\coverage\basic-Desktop.xml
60 Final coverage (61e936e, host) PowerShell 7, elevated 1402 0 57 1459 final5\coverage\elevated-Core.xml
61 Final coverage (61e936e, host) PowerShell 7, basic user 1152 0 307 1459 final5\coverage\basic-Core.xml
62 Final validate (93ed2c7, host) Windows PowerShell 5.1, elevated 1452 0 26 1478 final6\validate\elevated-Desktop.xml
63 Final validate (93ed2c7, host) Windows PowerShell 5.1, basic user 1194 0 284 1478 final6\validate\basic-Desktop.xml
64 Final validate (93ed2c7, host) PowerShell 7, elevated 1421 0 57 1478 final6\validate\elevated-Core.xml
65 Final validate (93ed2c7, host) PowerShell 7, basic user 1163 0 315 1478 final6\validate\basic-Core.xml
66 Final coverage (93ed2c7, host) Windows PowerShell 5.1, elevated 1452 0 26 1478 final6\coverage\elevated-Desktop.xml
67 Final coverage (93ed2c7, host) Windows PowerShell 5.1, basic user 1194 0 284 1478 final6\coverage\basic-Desktop.xml
68 Final coverage (93ed2c7, host) PowerShell 7, elevated 1421 0 57 1478 final6\coverage\elevated-Core.xml
69 Final coverage (93ed2c7, host) PowerShell 7, basic user 1163 0 315 1478 final6\coverage\basic-Core.xml
70 Final validate (9783d2a, host) Windows PowerShell 5.1, elevated 1464 0 26 1490 final7\validate\elevated-Desktop.xml
71 Final validate (9783d2a, host) Windows PowerShell 5.1, basic user 1200 0 290 1490 final7\validate\basic-Desktop.xml
72 Final validate (9783d2a, host) PowerShell 7, elevated 1433 0 57 1490 final7\validate\elevated-Core.xml
73 Final validate (9783d2a, host) PowerShell 7, basic user 1169 0 321 1490 final7\validate\basic-Core.xml
74 Final coverage (9783d2a, host) Windows PowerShell 5.1, elevated 1464 0 26 1490 final7\coverage\elevated-Desktop.xml
75 Final coverage (9783d2a, host) Windows PowerShell 5.1, basic user 1200 0 290 1490 final7\coverage\basic-Desktop.xml
76 Final coverage (9783d2a, host) PowerShell 7, elevated 1433 0 57 1490 final7\coverage\elevated-Core.xml
77 Final coverage (9783d2a, host) PowerShell 7, basic user 1169 0 321 1490 final7\coverage\basic-Core.xml
78 Final validate (7bc7925, host) Windows PowerShell 5.1, elevated 1466 0 26 1492 final8\validate\elevated-Desktop.xml
79 Final validate (7bc7925, host) Windows PowerShell 5.1, basic user 1201 0 291 1492 final8\validate\basic-Desktop.xml
80 Final validate (7bc7925, host) PowerShell 7, elevated 1435 0 57 1492 final8\validate\elevated-Core.xml
81 Final validate (7bc7925, host) PowerShell 7, basic user 1170 0 322 1492 final8\validate\basic-Core.xml
82 Final coverage (7bc7925, host) Windows PowerShell 5.1, elevated 1466 0 26 1492 final8\coverage\elevated-Desktop.xml
83 Final coverage (7bc7925, host) Windows PowerShell 5.1, basic user 1201 0 291 1492 final8\coverage\basic-Desktop.xml
84 Final coverage (7bc7925, host) PowerShell 7, elevated 1435 0 57 1492 final8\coverage\elevated-Core.xml
85 Final coverage (7bc7925, host) PowerShell 7, basic user 1170 0 322 1492 final8\coverage\basic-Core.xml
86 Final validate (2112ee3, host) Windows PowerShell 5.1, elevated 1466 0 26 1492 final9\validate\elevated-Desktop.xml
87 Final validate (2112ee3, host) Windows PowerShell 5.1, basic user 1201 0 291 1492 final9\validate\basic-Desktop.xml
88 Final validate (2112ee3, host) PowerShell 7, elevated 1435 0 57 1492 final9\validate\elevated-Core.xml
89 Final validate (2112ee3, host) PowerShell 7, basic user 1170 0 322 1492 final9\validate\basic-Core.xml
90 Final coverage (2112ee3, host) Windows PowerShell 5.1, elevated 1466 0 26 1492 final9\coverage\elevated-Desktop.xml
91 Final coverage (2112ee3, host) Windows PowerShell 5.1, basic user 1201 0 291 1492 final9\coverage\basic-Desktop.xml
92 Final coverage (2112ee3, host) PowerShell 7, elevated 1435 0 57 1492 final9\coverage\elevated-Core.xml
93 Final coverage (2112ee3, host) PowerShell 7, basic user 1170 0 322 1492 final9\coverage\basic-Core.xml
94 Focused: the two ParameterSets files on the build before the fix (tdd3red2, red) PowerShell 7, basic user 38 8 29 75 tdd3\tdd3red2-basiccore.log
95 Focused: the two ParameterSets files on the build before the fix (tdd3red2, red) Windows PowerShell 5.1, basic user 38 8 29 75 tdd3\tdd3red2-basicdesktop.log
96 Focused: the two ParameterSets files on the build before the fix (tdd3red2, red) PowerShell 7, elevated 62 12 1 75 tdd3\tdd3red2-elevatedcore.log
97 Focused: the two ParameterSets files on the build before the fix (tdd3red2, red) Windows PowerShell 5.1, elevated 62 12 1 75 tdd3\tdd3red2-elevateddesktop.log
98 Focused: the two files and the Items file on 93ed2c7 (tdd3green, green) PowerShell 7, basic user 173 0 36 209 tdd3\tdd3green-basiccore.log
99 Focused: the two files and the Items file on 93ed2c7 (tdd3green, green) Windows PowerShell 5.1, basic user 174 0 35 209 tdd3\tdd3green-basicdesktop.log
100 Focused: the two files and the Items file on 93ed2c7 (tdd3green, green) PowerShell 7, elevated 207 0 2 209 tdd3\tdd3green-elevatedcore.log
101 Focused: the two files and the Items file on 93ed2c7 (tdd3green, green) Windows PowerShell 5.1, elevated 208 0 1 209 tdd3\tdd3green-elevateddesktop.log
102 Focused: the two files with the mixed-pipeline rows on 93ed2c7 (tdd4red2, red) PowerShell 7, basic user 48 4 35 87 tdd4\tdd4red2-basiccore.log
103 Focused: the two files with the mixed-pipeline rows on 93ed2c7 (tdd4red2, red) Windows PowerShell 5.1, basic user 48 4 35 87 tdd4\tdd4red2-basicdesktop.log
104 Focused: the two files with the mixed-pipeline rows on 93ed2c7 (tdd4red2, red) PowerShell 7, elevated 78 8 1 87 tdd4\tdd4red2-elevatedcore.log
105 Focused: the two files with the mixed-pipeline rows on 93ed2c7 (tdd4red2, red) Windows PowerShell 5.1, elevated 78 8 1 87 tdd4\tdd4red2-elevateddesktop.log
106 Focused: the three files on 9783d2a (tdd4green, green) PowerShell 7, basic user 179 0 42 221 tdd4\tdd4green-basiccore.log
107 Focused: the three files on 9783d2a (tdd4green, green) Windows PowerShell 5.1, basic user 180 0 41 221 tdd4\tdd4green-basicdesktop.log
108 Focused: the three files on 9783d2a (tdd4green, green) PowerShell 7, elevated 219 0 2 221 tdd4\tdd4green-elevatedcore.log
109 Focused: the three files on 9783d2a (tdd4green, green) Windows PowerShell 5.1, elevated 220 0 1 221 tdd4\tdd4green-elevateddesktop.log
110 Focused: the two files with the Import-Csv and $null rows on the build before the fix, 8a625c8 (tdd5red, red) PowerShell 7, basic user 38 15 36 89 tdd5red\logs\tdd5red-basiccore.log
111 Focused: the two files with the Import-Csv and $null rows on the build before the fix, 8a625c8 (tdd5red, red) Windows PowerShell 5.1, basic user 38 15 36 89 tdd5red\logs\tdd5red-basicdesktop.log
112 Focused: the two files with the Import-Csv and $null rows on the build before the fix, 8a625c8 (tdd5red, red) PowerShell 7, elevated 62 26 1 89 tdd5red\logs\tdd5red-elevatedcore.log
113 Focused: the two files with the Import-Csv and $null rows on the build before the fix, 8a625c8 (tdd5red, red) Windows PowerShell 5.1, elevated 62 26 1 89 tdd5red\logs\tdd5red-elevateddesktop.log
114 Focused: the two files with the Import-Csv and $null rows on 93ed2c7 (tdd5red93, red) PowerShell 7, basic user 48 5 36 89 tdd5red93\logs\tdd5red93-basiccore.log
115 Focused: the two files with the Import-Csv and $null rows on 93ed2c7 (tdd5red93, red) Windows PowerShell 5.1, basic user 48 5 36 89 tdd5red93\logs\tdd5red93-basicdesktop.log
116 Focused: the two files with the Import-Csv and $null rows on 93ed2c7 (tdd5red93, red) PowerShell 7, elevated 78 10 1 89 tdd5red93\logs\tdd5red93-elevatedcore.log
117 Focused: the two files with the Import-Csv and $null rows on 93ed2c7 (tdd5red93, red) Windows PowerShell 5.1, elevated 78 10 1 89 tdd5red93\logs\tdd5red93-elevateddesktop.log
118 Focused: the two files with the Import-Csv and $null rows on 9783d2a (tdd5, green) PowerShell 7, basic user 53 0 36 89 tdd5\tdd5-basiccore.log
119 Focused: the two files with the Import-Csv and $null rows on 9783d2a (tdd5, green) Windows PowerShell 5.1, basic user 53 0 36 89 tdd5\tdd5-basicdesktop.log
120 Focused: the two files with the Import-Csv and $null rows on 9783d2a (tdd5, green) PowerShell 7, elevated 88 0 1 89 tdd5\tdd5-elevatedcore.log
121 Focused: the two files with the Import-Csv and $null rows on 9783d2a (tdd5, green) Windows PowerShell 5.1, elevated 88 0 1 89 tdd5\tdd5-elevateddesktop.log
122 Focused: the two files of 2112ee3, three audit titles changed, on the package of 9783d2a (tdd6, green) PowerShell 7, basic user 53 0 36 89 tdd6\tdd6-basiccore.log
123 Focused: the two files of 2112ee3, three audit titles changed, on the package of 9783d2a (tdd6, green) Windows PowerShell 5.1, basic user 53 0 36 89 tdd6\tdd6-basicdesktop.log
124 Focused: the two files of 2112ee3, three audit titles changed, on the package of 9783d2a (tdd6, green) PowerShell 7, elevated 88 0 1 89 tdd6\tdd6-elevatedcore.log
125 Focused: the two files of 2112ee3, three audit titles changed, on the package of 9783d2a (tdd6, green) Windows PowerShell 5.1, elevated 88 0 1 89 tdd6\tdd6-elevateddesktop.log
126 Focused: Items file, mutation B of GetChildItem2 (item written inside the scope) Windows PowerShell 5.1, elevated 130 4 0 134 tdd3\mutB-elevateddesktop.log
127 Focused: Items file, mutation A of GetChildItem2 (culture not restored) PowerShell 7, elevated 129 4 1 134 tdd3\mutA2-elevatedcore.log
128 Focused: Items file, mutation A of GetChildItem2 (culture not restored) Windows PowerShell 5.1, elevated 130 4 0 134 tdd3\mutA2-elevateddesktop.log
129 Focused: Items file, mutation C of GetChildItem2 (culture restored only after an item) PowerShell 7, elevated 129 4 1 134 tdd4\mutC-elevatedcore.log
130 Focused: Items file, mutation C of GetChildItem2 (culture restored only after an item) Windows PowerShell 5.1, elevated 130 4 0 134 tdd4\mutC-elevateddesktop.log
131 Live suite, first lab, build of b2cb47b (fix1, not instrumented) Windows PowerShell 5.1, four roles 245 0 1 246 live-fix1\fix1-Desktop-counts.csv
132 Live suite, first lab, build of b2cb47b (fix1, not instrumented) PowerShell 7, four roles 245 0 1 246 live-fix1\fix1-Core-counts.csv
133 Live suite, first lab, intermediate build of 0028ccd (fix3, not instrumented) Windows PowerShell 5.1, four roles 245 0 1 246 live-fix3\fix3-Desktop-counts.csv
134 Live suite, first lab, intermediate build of 0028ccd (fix3, not instrumented) PowerShell 7, four roles 245 0 1 246 live-fix3\fix3-Core-counts.csv
135 Live suite, first lab, final build of 8a625c8 (fix4, not instrumented) Windows PowerShell 5.1, four roles 245 0 1 246 live-fix4\fix4-Desktop-counts.csv
136 Live suite, first lab, final build of 8a625c8 (fix4, not instrumented) PowerShell 7, four roles 245 0 1 246 live-fix4\fix4-Core-counts.csv
137 Live suite, first lab, final build of 9783d2a (acc-ap7, not instrumented) Windows PowerShell 5.1, four roles 245 0 1 246 live-ap7\acc-ap7-Desktop-counts.csv
138 Live suite, first lab, final build of 9783d2a (acc-ap7, not instrumented) PowerShell 7, four roles 245 0 1 246 live-ap7\acc-ap7-Core-counts.csv
139 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile25, PowerShell 7, basic user 881 0 271 1152 localsuite-final\fix1-localsuite-summary.csv
140 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile25, PowerShell 7, elevated 1130 1 21 1152 localsuite-final\fix1-localsuite-summary.csv
141 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile25, Windows PowerShell 5.1, basic user 883 0 269 1152 localsuite-final\fix1-localsuite-summary.csv
142 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile25, Windows PowerShell 5.1, elevated 1132 1 19 1152 localsuite-final\fix1-localsuite-summary.csv
143 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile19, PowerShell 7, basic user 881 0 271 1152 localsuite-final\fix1-localsuite-summary.csv
144 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile19, PowerShell 7, elevated 1130 1 21 1152 localsuite-final\fix1-localsuite-summary.csv
145 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile19, Windows PowerShell 5.1, basic user 883 0 269 1152 localsuite-final\fix1-localsuite-summary.csv
146 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile19, Windows PowerShell 5.1, elevated 1132 1 19 1152 localsuite-final\fix1-localsuite-summary.csv
147 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile22, PowerShell 7, basic user 881 0 271 1152 localsuite-final\fix1-localsuite-summary.csv
148 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile22, PowerShell 7, elevated 1130 1 21 1152 localsuite-final\fix1-localsuite-summary.csv
149 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile22, Windows PowerShell 5.1, basic user 883 0 269 1152 localsuite-final\fix1-localsuite-summary.csv
150 Unit suite on the file servers (fix1, 22 files, tests of b2cb47b) OSFile22, Windows PowerShell 5.1, elevated 1132 1 19 1152 localsuite-final\fix1-localsuite-summary.csv
151 Diagnosis of the failing file on the file servers (rep1, one file with prints) OSFile25, PowerShell 7, elevated 46 1 1 48 repro\rep1-localsuite-summary.csv
152 Diagnosis of the failing file on the file servers (rep1, one file with prints) OSFile25, Windows PowerShell 5.1, elevated 46 1 1 48 repro\rep1-localsuite-summary.csv
153 Diagnosis of the failing file on the file servers (rep1, one file with prints) OSFile19, PowerShell 7, elevated 46 1 1 48 repro\rep1-localsuite-summary.csv
154 Diagnosis of the failing file on the file servers (rep1, one file with prints) OSFile19, Windows PowerShell 5.1, elevated 46 1 1 48 repro\rep1-localsuite-summary.csv
155 The two changed test files on the file servers (rep2, tests of f1f3d8f) OSFile25, PowerShell 7, elevated 76 0 2 78 repro-fixed\rep2-localsuite-summary.csv
156 The two changed test files on the file servers (rep2, tests of f1f3d8f) OSFile25, Windows PowerShell 5.1, elevated 76 0 2 78 repro-fixed\rep2-localsuite-summary.csv
157 The two changed test files on the file servers (rep2, tests of f1f3d8f) OSFile19, PowerShell 7, elevated 76 0 2 78 repro-fixed\rep2-localsuite-summary.csv
158 The two changed test files on the file servers (rep2, tests of f1f3d8f) OSFile19, Windows PowerShell 5.1, elevated 76 0 2 78 repro-fixed\rep2-localsuite-summary.csv
159 The two changed test files on the file servers (rep2, tests of f1f3d8f) OSFile22, PowerShell 7, elevated 76 0 2 78 repro-fixed\rep2-localsuite-summary.csv
160 The two changed test files on the file servers (rep2, tests of f1f3d8f) OSFile22, Windows PowerShell 5.1, elevated 76 0 2 78 repro-fixed\rep2-localsuite-summary.csv
161 The two changed test files on the host (hostfix, tests of f1f3d8f) host, PowerShell 7, basic user 40 0 38 78 repro-host\hostfix-localsuite-summary.csv
162 The two changed test files on the host (hostfix, tests of f1f3d8f) host, PowerShell 7, elevated 76 0 2 78 repro-host\hostfix-localsuite-summary.csv
163 The two changed test files on the host (hostfix, tests of f1f3d8f) host, Windows PowerShell 5.1, basic user 40 0 38 78 repro-host\hostfix-localsuite-summary.csv
164 The two changed test files on the host (hostfix, tests of f1f3d8f) host, Windows PowerShell 5.1, elevated 76 0 2 78 repro-host\hostfix-localsuite-summary.csv
165 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile25, PowerShell 7, basic user 881 0 271 1152 localsuite-final2\fix2-localsuite-summary.csv
166 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile25, PowerShell 7, elevated 1131 0 21 1152 localsuite-final2\fix2-localsuite-summary.csv
167 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile25, Windows PowerShell 5.1, basic user 883 0 269 1152 localsuite-final2\fix2-localsuite-summary.csv
168 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile25, Windows PowerShell 5.1, elevated 1133 0 19 1152 localsuite-final2\fix2-localsuite-summary.csv
169 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile19, PowerShell 7, basic user 881 0 271 1152 localsuite-final2\fix2-localsuite-summary.csv
170 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile19, PowerShell 7, elevated 1131 0 21 1152 localsuite-final2\fix2-localsuite-summary.csv
171 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile19, Windows PowerShell 5.1, basic user 883 0 269 1152 localsuite-final2\fix2-localsuite-summary.csv
172 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile19, Windows PowerShell 5.1, elevated 1133 0 19 1152 localsuite-final2\fix2-localsuite-summary.csv
173 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile22, PowerShell 7, basic user 881 0 271 1152 localsuite-final2\fix2-localsuite-summary.csv
174 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile22, PowerShell 7, elevated 1131 0 21 1152 localsuite-final2\fix2-localsuite-summary.csv
175 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile22, Windows PowerShell 5.1, basic user 883 0 269 1152 localsuite-final2\fix2-localsuite-summary.csv
176 Unit suite on the file servers (fix2, 22 files, tests of f1f3d8f) OSFile22, Windows PowerShell 5.1, elevated 1133 0 19 1152 localsuite-final2\fix2-localsuite-summary.csv
177 Unit suite on the Windows 11 client (fix2c, 22 files, tests of f1f3d8f) OSWin11, PowerShell 7, basic user 881 0 271 1152 localsuite-final2-client\fix2c-localsuite-summary.csv
178 Unit suite on the Windows 11 client (fix2c, 22 files, tests of f1f3d8f) OSWin11, PowerShell 7, elevated 1131 0 21 1152 localsuite-final2-client\fix2c-localsuite-summary.csv
179 Unit suite on the Windows 11 client (fix2c, 22 files, tests of f1f3d8f) OSWin11, Windows PowerShell 5.1, basic user 883 0 269 1152 localsuite-final2-client\fix2c-localsuite-summary.csv
180 Unit suite on the Windows 11 client (fix2c, 22 files, tests of f1f3d8f) OSWin11, Windows PowerShell 5.1, elevated 1133 0 19 1152 localsuite-final2-client\fix2c-localsuite-summary.csv
181 Test of the filter before the fix (tdd2red, ItemCmdlets file, build of b2cb47b) host, PowerShell 7, basic user 124 3 7 134 tdd2\red\tdd2red-localsuite-summary.csv
182 Test of the filter before the fix (tdd2red, ItemCmdlets file, build of b2cb47b) host, PowerShell 7, elevated 130 3 1 134 tdd2\red\tdd2red-localsuite-summary.csv
183 Test of the filter before the fix (tdd2red, ItemCmdlets file, build of b2cb47b) host, Windows PowerShell 5.1, basic user 125 3 6 134 tdd2\red\tdd2red-localsuite-summary.csv
184 Test of the filter before the fix (tdd2red, ItemCmdlets file, build of b2cb47b) host, Windows PowerShell 5.1, elevated 131 3 0 134 tdd2\red\tdd2red-localsuite-summary.csv
185 Tests of the filter after the fix (tdd2green3, three files, build of 8a625c8) host, PowerShell 7, basic user 170 0 30 200 tdd2\green3\tdd2green3-localsuite-summary.csv
186 Tests of the filter after the fix (tdd2green3, three files, build of 8a625c8) host, PowerShell 7, elevated 198 0 2 200 tdd2\green3\tdd2green3-localsuite-summary.csv
187 Tests of the filter after the fix (tdd2green3, three files, build of 8a625c8) host, Windows PowerShell 5.1, basic user 171 0 29 200 tdd2\green3\tdd2green3-localsuite-summary.csv
188 Tests of the filter after the fix (tdd2green3, three files, build of 8a625c8) host, Windows PowerShell 5.1, elevated 199 0 1 200 tdd2\green3\tdd2green3-localsuite-summary.csv
189 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile25, PowerShell 7, basic user 885 0 271 1156 localsuite-final5\fix5-localsuite-summary.csv
190 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile25, PowerShell 7, elevated 1135 0 21 1156 localsuite-final5\fix5-localsuite-summary.csv
191 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile25, Windows PowerShell 5.1, basic user 887 0 269 1156 localsuite-final5\fix5-localsuite-summary.csv
192 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile25, Windows PowerShell 5.1, elevated 1137 0 19 1156 localsuite-final5\fix5-localsuite-summary.csv
193 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile19, PowerShell 7, basic user 885 0 271 1156 localsuite-final5\fix5-localsuite-summary.csv
194 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile19, PowerShell 7, elevated 1135 0 21 1156 localsuite-final5\fix5-localsuite-summary.csv
195 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile19, Windows PowerShell 5.1, basic user 887 0 269 1156 localsuite-final5\fix5-localsuite-summary.csv
196 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile19, Windows PowerShell 5.1, elevated 1137 0 19 1156 localsuite-final5\fix5-localsuite-summary.csv
197 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile22, PowerShell 7, basic user 885 0 271 1156 localsuite-final5\fix5-localsuite-summary.csv
198 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile22, PowerShell 7, elevated 1135 0 21 1156 localsuite-final5\fix5-localsuite-summary.csv
199 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile22, Windows PowerShell 5.1, basic user 887 0 269 1156 localsuite-final5\fix5-localsuite-summary.csv
200 Unit suite on the file servers (fix5, 22 files, final build and tests of 61e936e) OSFile22, Windows PowerShell 5.1, elevated 1137 0 19 1156 localsuite-final5\fix5-localsuite-summary.csv
201 Unit suite on the Windows 11 client (fix5c, 22 files, final build and tests of 61e936e) OSWin11, PowerShell 7, basic user 885 0 271 1156 localsuite-final5-client\fix5c-localsuite-summary.csv
202 Unit suite on the Windows 11 client (fix5c, 22 files, final build and tests of 61e936e) OSWin11, PowerShell 7, elevated 1135 0 21 1156 localsuite-final5-client\fix5c-localsuite-summary.csv
203 Unit suite on the Windows 11 client (fix5c, 22 files, final build and tests of 61e936e) OSWin11, Windows PowerShell 5.1, basic user 887 0 269 1156 localsuite-final5-client\fix5c-localsuite-summary.csv
204 Unit suite on the Windows 11 client (fix5c, 22 files, final build and tests of 61e936e) OSWin11, Windows PowerShell 5.1, elevated 1137 0 19 1156 localsuite-final5-client\fix5c-localsuite-summary.csv
205 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile25, PowerShell 7, basic user 896 0 279 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
206 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile25, PowerShell 7, elevated 1154 0 21 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
207 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile25, Windows PowerShell 5.1, basic user 898 0 277 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
208 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile25, Windows PowerShell 5.1, elevated 1156 0 19 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
209 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile19, PowerShell 7, basic user 896 0 279 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
210 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile19, PowerShell 7, elevated 1154 0 21 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
211 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile19, Windows PowerShell 5.1, basic user 898 0 277 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
212 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile19, Windows PowerShell 5.1, elevated 1156 0 19 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
213 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile22, PowerShell 7, basic user 896 0 279 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
214 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile22, PowerShell 7, elevated 1154 0 21 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
215 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile22, Windows PowerShell 5.1, basic user 898 0 277 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
216 Unit suite on the file servers (s-ap6, 22 files, build and tests of 93ed2c7; the chain was stopped, the stage ran on) OSFile22, Windows PowerShell 5.1, elevated 1156 0 19 1175 localsuite-ap6\s-ap6-localsuite-summary.csv
217 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile25, PowerShell 7, basic user 903 0 286 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
218 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile25, PowerShell 7, elevated 1168 0 21 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
219 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile25, Windows PowerShell 5.1, basic user 905 0 284 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
220 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile25, Windows PowerShell 5.1, elevated 1170 0 19 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
221 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile19, PowerShell 7, basic user 903 0 286 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
222 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile19, PowerShell 7, elevated 1168 0 21 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
223 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile19, Windows PowerShell 5.1, basic user 905 0 284 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
224 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile19, Windows PowerShell 5.1, elevated 1170 0 19 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
225 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile22, PowerShell 7, basic user 903 0 286 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
226 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile22, PowerShell 7, elevated 1168 0 21 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
227 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile22, Windows PowerShell 5.1, basic user 905 0 284 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
228 Unit suite on the file servers (s-ap8, 22 files, final package and tests of 7bc7925) OSFile22, Windows PowerShell 5.1, elevated 1170 0 19 1189 localsuite-ap8\s-ap8-localsuite-summary.csv
229 Unit suite on the Windows 11 client (sc-ap8, 22 files, final package and tests of 7bc7925) OSWin11, PowerShell 7, basic user 903 0 286 1189 localsuite-ap8-client\sc-ap8-localsuite-summary.csv
230 Unit suite on the Windows 11 client (sc-ap8, 22 files, final package and tests of 7bc7925) OSWin11, PowerShell 7, elevated 1168 0 21 1189 localsuite-ap8-client\sc-ap8-localsuite-summary.csv
231 Unit suite on the Windows 11 client (sc-ap8, 22 files, final package and tests of 7bc7925) OSWin11, Windows PowerShell 5.1, basic user 905 0 284 1189 localsuite-ap8-client\sc-ap8-localsuite-summary.csv
232 Unit suite on the Windows 11 client (sc-ap8, 22 files, final package and tests of 7bc7925) OSWin11, Windows PowerShell 5.1, elevated 1170 0 19 1189 localsuite-ap8-client\sc-ap8-localsuite-summary.csv

2162
Tests/Coverage/Quality-Gate-Unknowns-2026-10-10.md

File diff suppressed because it is too large

37
Tests/ItemCmdlets.Tests.ps1

@ -159,6 +159,43 @@ Describe 'Get-ChildItem2' {
($result.Name | Sort-Object) -join ',' | Should -Be (($Expected | Sort-Object) -join ',') ($result.Name | Sort-Object) -join ',' | Should -Be (($Expected | Sort-Object) -join ',')
} }
# With the culture of the thread tr-TR, a case-insensitive regular expression that is not culture invariant treats I and i
# as different letters. AlphaFS matches the filter that way, and so did the comparison of the cmdlet, so the cmdlet
# dropped the items whose names differ from the filter in the case of an I. INDEX* is the control: both sides turn I
# into the dotless letter.
It 'Should match -Filter <Filter> ignoring case in Turkish, where I and i are different letters' -ForEach @(
@{ Filter = 'index*'; Expected = 'Index.txt' }
@{ Filter = 'INDEX*'; Expected = 'Index.txt' }
@{ Filter = '*.ini'; Expected = 'desktop.ini,SETTINGS.INI' }
@{ Filter = '*.INI'; Expected = 'desktop.ini,SETTINGS.INI' }
) {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'FilterTurkish' -Directory
foreach ($name in 'Index.txt', 'desktop.ini', 'SETTINGS.INI', 'Other.txt') {
$file = Join-Path -Path $folder -ChildPath $name
Assert-TestSandboxPath -Sandbox $sandbox -Path $file
Set-Content -LiteralPath $file -Value $name
}
$original = [System.Threading.Thread]::CurrentThread.CurrentCulture
try {
[System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo]::GetCultureInfo('tr-TR')
'I'.ToLower() | Should -Be ([string][char]0x131) -Because 'the culture of the thread has to be Turkish for the test to mean anything'
# The next stage of the pipeline reads the culture of the thread for each item, and the test reads it once more
# after the cmdlet has returned: Turkish both times shows that the cmdlet restores the culture and writes no
# item inside the scope of the invariant culture.
$result = @(Get-ChildItem2 -Path $folder -Filter $Filter -ErrorAction Stop |
ForEach-Object -Process { [pscustomobject]@{ Name = $_.Name; Culture = [System.Threading.Thread]::CurrentThread.CurrentCulture.Name } })
$cultureAfter = [System.Threading.Thread]::CurrentThread.CurrentCulture.Name
}
finally {
[System.Threading.Thread]::CurrentThread.CurrentCulture = $original
}
($result.Name | Sort-Object) -join ',' | Should -BeExactly $Expected
(@($result.Culture) | Select-Object -Unique) -join ',' | Should -BeExactly 'tr-TR' -Because 'the cmdlet writes each item outside the scope of the invariant culture'
$cultureAfter | Should -BeExactly 'tr-TR' -Because 'the cmdlet restores the culture of the caller'
}
# Only * and ? are wildcards in -Filter. A bracket stands for itself, so a file with brackets in its name is found # Only * and ? are wildcards in -Filter. A bracket stands for itself, so a file with brackets in its name is found
# by its name, as Get-ChildItem finds it, and the file that the brackets would select as a character class is not. # by its name, as Get-ChildItem finds it, and the file that the brackets would select as a character class is not.
# Before 5.0.0, the cmdlet read [1] as a character class and returned nothing. # Before 5.0.0, the cmdlet read [1] as a character class and returned nothing.

3
Tests/Lab/Acceptance/Run-MatrixLocalSuite.ps1

@ -35,7 +35,8 @@ $editions = @($Edition -split ',' | Where-Object -FilterScript { $_ })
$modes = @($Mode -split ',' | Where-Object -FilterScript { $_ }) $modes = @($Mode -split ',' | Where-Object -FilterScript { $_ })
if ($modes | Where-Object -FilterScript { $_ -notin 'Elevated', 'Basic' }) { throw "-Mode takes Elevated, Basic, or both, separated by a comma." } if ($modes | Where-Object -FilterScript { $_ -notin 'Elevated', 'Basic' }) { throw "-Mode takes Elevated, Basic, or both, separated by a comma." }
$localCredential = @($LocalCredentialMachine -split ',' | Where-Object -FilterScript { $_ }) $localCredential = @($LocalCredentialMachine -split ',' | Where-Object -FilterScript { $_ })
$behaviorFiles = 'Access', 'Audit', 'DriveRoot', 'FileHash', 'Inheritance', 'ItemCmdlets', 'Links', 'ObjectApis', 'OutputTypes', 'Owner', 'PathErrors', $behaviorFiles = 'Access', 'Audit', 'DriveRoot', 'FileHash', 'Inheritance', 'ItemCmdlets', 'Links', 'ObjectApis', 'OutputTypes', 'Owner',
'ParameterSets.Access', 'ParameterSets.Audit', 'ParameterSets.Inheritance', 'ParameterSets.Items', 'PathErrors',
'PermissionScopes', 'PipelineControl', 'Privileges', 'Remove-Item2', 'SecurityDescriptor', 'SecurityDescriptorSets', 'TestHelpers' 'PermissionScopes', 'PipelineControl', 'Privileges', 'Remove-Item2', 'SecurityDescriptor', 'SecurityDescriptorSets', 'TestHelpers'
$null = New-Item -ItemType Directory -Path $OutputRoot -Force $null = New-Item -ItemType Directory -Path $OutputRoot -Force
$sequenceLog = Join-Path -Path $OutputRoot -ChildPath "$Label-localsuite.log" $sequenceLog = Join-Path -Path $OutputRoot -ChildPath "$Label-localsuite.log"

7
Tests/Lab/README.md

@ -176,7 +176,12 @@ A run with `-ModulePath` validates a build. The acceptance of a release is the
run with `-Version` of the exact prerelease on the PowerShell Gallery, as run with `-Version` of the exact prerelease on the PowerShell Gallery, as
`Docs\Contributing\05-Releasing.md` describes. The scripts in the folder `Docs\Contributing\05-Releasing.md` describes. The scripts in the folder
[Acceptance](Acceptance) support it, and each runs in Windows PowerShell 5.1 on [Acceptance](Acceptance) support it, and each runs in Windows PowerShell 5.1 on
the host: the host. Start them in a Windows PowerShell window. A `powershell.exe` that
PowerShell 7 starts inherits the `PSModulePath` of PowerShell 7, and the script
stops at its first call of `Get-FileHash`, without a log when its window is
hidden; from PowerShell 7, set `$env:PSModulePath` to the three
`WindowsPowerShell\Modules` folders (Documents, Program Files, and System32)
before you start one:
- `Test-PublishedRelease.ps1 -Version <version> -OutputPath <folder>` checks a - `Test-PublishedRelease.ps1 -Version <version> -OutputPath <folder>` checks a
published version and changes nothing: the tag and its commit on `master`, published version and changes nothing: the tag and its commit on `master`,

19
Tests/ObjectApis.Tests.ps1

@ -159,6 +159,25 @@ Describe 'Identity comparisons and conversions' {
$identity.Equals($other) | Should -Be $Expected $identity.Equals($other) | Should -Be $Expected
} }
# tr-TR lowercases I to U+0131, so a comparison that lowercases both names with the current culture misses an account name that holds an
# uppercase I (NT AUTHORITY, BUILTIN) when the other name has another case. The name must match in every culture.
It 'Should compare a name with the account ignoring case in Turkish, where I and i are different letters' {
$system = [Security2.IdentityReference2] 'S-1-5-18'
$system.AccountName | Should -MatchExactly 'I' -Because 'the test needs an account name with an uppercase I'
$original = [System.Threading.Thread]::CurrentThread.CurrentCulture
try {
[System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo]::GetCultureInfo('tr-TR')
'I'.ToLower() | Should -Be ([string][char]0x131) -Because 'the culture of the thread has to be Turkish for the test to mean anything'
$system.Equals($system.AccountName) | Should -BeTrue
$system.Equals($system.AccountName.ToLowerInvariant()) | Should -BeTrue
$system.Equals($system.AccountName.ToUpperInvariant()) | Should -BeTrue
$system.Equals('NTFSSecurity-not-an-account') | Should -BeFalse
}
finally {
[System.Threading.Thread]::CurrentThread.CurrentCulture = $original
}
}
It 'Should compare null operands and distinct instances through both operators' { It 'Should compare null operands and distinct instances through both operators' {
$same = [Security2.IdentityReference2] 'S-1-1-0' $same = [Security2.IdentityReference2] 'S-1-1-0'
$different = [Security2.IdentityReference2] 'S-1-5-32-546' $different = [Security2.IdentityReference2] 'S-1-5-32-546'

774
Tests/ParameterSets.Access.Tests.ps1

@ -0,0 +1,774 @@
<#
Tests the parameter sets of the access cmdlets (Add-NTFSAccess, Remove-NTFSAccess, Clear-NTFSAccess,
Get-NTFSAccess, Get-NTFSOrphanedAccess, Get-NTFSSimpleAccess, Get-NTFSEffectiveAccess) that the judged test matrix
found untested, with the module built in NTFSSecurity\bin\Release on files in a sandbox folder. Each test closes a
gap the matrix recorded for the row it names (state, error, pipeline, continuation, or output); it does not repeat
what Access.Tests.ps1, PathErrors.Tests.ps1, PermissionScopes.Tests.ps1, SecurityDescriptorSets.Tests.ps1, or
PipelineControl.Tests.ps1 already assert. The -SecurityDescriptor sets of Add-NTFSAccess and Remove-NTFSAccess have
no per-item error handler (an open item for the maintainer); no test here makes one of those two sets fail.
#>
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
'PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'Pester shares variables between blocks.'
)]
param ()
BeforeDiscovery {
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers.psm1') -Force
# Security2.FileSystemAccessRule2 for Add/Remove/Get-NTFSAccess/Get-NTFSOrphanedAccess/Get-NTFSEffectiveAccess,
# Security2.SimpleFileSystemAccessRule for Get-NTFSSimpleAccess; Clear-NTFSAccess declares no output type (no -PassThru).
$declaredOutputTypes = @(
@{ Name = 'Add-NTFSAccess'; Types = @('Security2.FileSystemAccessRule2') }
@{ Name = 'Remove-NTFSAccess'; Types = @('Security2.FileSystemAccessRule2') }
@{ Name = 'Get-NTFSAccess'; Types = @('Security2.FileSystemAccessRule2') }
@{ Name = 'Get-NTFSOrphanedAccess'; Types = @('Security2.FileSystemAccessRule2') }
@{ Name = 'Get-NTFSEffectiveAccess'; Types = @('Security2.FileSystemAccessRule2') }
@{ Name = 'Get-NTFSSimpleAccess'; Types = @('Security2.SimpleFileSystemAccessRule') }
)
}
BeforeAll {
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers.psm1') -Force
$modulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\NTFSSecurity\bin\Release\NTFSSecurity.psd1'
Import-Module -Name $modulePath -Force -ErrorAction Stop
$sandbox = New-TestSandbox -Name 'ParameterSetsAccess'
Push-Location -LiteralPath $sandbox
$privateData = (Get-Module -Name NTFSSecurity).PrivateData
$enablePrivileges = $privateData['EnablePrivileges']
$sidType = [System.Security.Principal.SecurityIdentifier]
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
function Get-TestAccountScope {
# The scopes of the explicit entries of one account, each as 'inheritance flags/propagation flags', joined by ';'
param (
[Parameter(Mandatory)] [System.Security.AccessControl.FileSystemSecurity] $Acl,
[Parameter(Mandatory)] [string] $Account
)
@($Acl.GetAccessRules($true, $false, $sidType) |
Where-Object -FilterScript { $_.IdentityReference.Value -eq $Account } |
ForEach-Object -Process { '{0}/{1}' -f $_.InheritanceFlags, $_.PropagationFlags }) -join ';'
}
}
AfterAll {
$privateData['EnablePrivileges'] = $enablePrivileges
Pop-Location
Remove-TestSandbox -Sandbox $sandbox
Remove-Module -Name NTFSSecurity -Force -ErrorAction SilentlyContinue
}
Describe 'Add-NTFSAccess' {
Context 'PathComplex parameter set bound through the pipeline' {
It 'Should add one explicit entry for each path bound through the pipeline, by FullName and by property name, leaving the rest of each item unchanged' {
$first = New-TestSandboxItem -Sandbox $sandbox -Name 'AddPipeFirst'
$second = New-TestSandboxItem -Sandbox $sandbox -Name 'AddPipeSecond'
$third = New-TestSandboxItem -Sandbox $sandbox -Name 'AddPipeThird'
$before = foreach ($path in $first, $second, $third) {
$acl = Get-Acl -LiteralPath $path
[pscustomobject]@{ Path = $path; Owner = $acl.GetOwner($sidType).Value; Inherited = @($acl.GetAccessRules($false, $true, $sidType)).Count }
}
Get-Item2 -Path $first, $second | Add-NTFSAccess -Account 'S-1-1-0' -AccessRights ReadData -ErrorAction Stop
[pscustomobject]@{ Path = $third; Account = 'S-1-1-0'; AccessRights = 'ReadData' } | Add-NTFSAccess -ErrorAction Stop
foreach ($state in $before) {
$acl = Get-Acl -LiteralPath $state.Path
$acl.GetOwner($sidType).Value | Should -Be $state.Owner
@($acl.GetAccessRules($false, $true, $sidType)) | Should -HaveCount $state.Inherited
$explicit = @($acl.GetAccessRules($true, $false, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq 'S-1-1-0' })
$explicit | Should -HaveCount 1
$explicit[0].FileSystemRights.HasFlag([System.Security.AccessControl.FileSystemRights]::ReadData) | Should -BeTrue
}
}
}
Context 'PathComplex parameter set with one denied path and -PassThru' {
BeforeAll {
# So that an elevated session meets the same denial as a basic user (see PathErrors.Tests.ps1).
$privateData['EnablePrivileges'] = $false
}
AfterAll {
$privateData['EnablePrivileges'] = $enablePrivileges
}
It 'Should write one AddAceError for the blocked path, leave it unchanged, and return -PassThru entries only for the path it changed' {
$blocked = New-TestSandboxItem -Sandbox $sandbox -Name 'AddPassThruBlocked'
$next = New-TestSandboxItem -Sandbox $sandbox -Name 'AddPassThruNext'
Block-TestWritePermission -Sandbox $sandbox -Path $blocked
$before = (Get-Acl -LiteralPath $blocked).Sddl
$result = @(Add-NTFSAccess -Path $blocked, $next -Account 'S-1-1-0' -AccessRights ReadData -PassThru -ErrorVariable addErrors -ErrorAction SilentlyContinue)
$addErrors | Should -HaveCount 1
$addErrors[0].FullyQualifiedErrorId | Should -BeLike 'AddAceError,*'
$addErrors[0].CategoryInfo.Category | Should -Be 'WriteError'
$addErrors[0].TargetObject | Should -Be $blocked
(Get-Acl -LiteralPath $blocked).Sddl | Should -BeExactly $before
$result | Should -Not -BeNullOrEmpty
$result | ForEach-Object -Process {
$_ | Should -BeOfType ([Security2.FileSystemAccessRule2])
$_.FullName | Should -Be $next
}
@($result | Where-Object -FilterScript { $_.Account.Sid -eq 'S-1-1-0' -and -not $_.IsInherited }) | Should -HaveCount 1
}
}
# The property AppliesTo selects PathSimple, InheritanceFlags and PropagationFlags select PathComplex, and an object that
# has none of them gets the default scope. No parameter set is the default: while PathComplex was, an object that had
# AppliesTo bound PathComplex as well, and the cmdlet dropped the property.
Context 'Choosing the parameter set of an object bound through the pipeline by property name' {
It 'Should give the entry for the piped object that has <Shape> the scope <Scope>' -ForEach @(
@{ Name = 'AddPipedThisFolderOnly'; Shape = 'AppliesTo ThisFolderOnly'; Extra = @{ AppliesTo = 'ThisFolderOnly' }; Scope = 'None/None' }
@{ Name = 'AddPipedSubfolders'; Shape = 'AppliesTo ThisFolderAndSubfolders'; Extra = @{ AppliesTo = 'ThisFolderAndSubfolders' }; Scope = 'ContainerInherit/None' }
@{ Name = 'AddPipedInheritOnly'; Shape = 'AppliesTo SubfoldersAndFilesOnly'; Extra = @{ AppliesTo = 'SubfoldersAndFilesOnly' }; Scope = 'ContainerInherit, ObjectInherit/InheritOnly' }
@{ Name = 'AddPipedFlags'; Shape = 'InheritanceFlags and PropagationFlags'; Extra = @{ InheritanceFlags = 'ContainerInherit'; PropagationFlags = 'InheritOnly' }; Scope = 'ContainerInherit/InheritOnly' }
@{ Name = 'AddPipedNoScope'; Shape = 'no scope'; Extra = @{}; Scope = 'ContainerInherit, ObjectInherit/None' }
) {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name $Name -Directory
[pscustomobject] (@{ Path = $folder; Account = 'S-1-5-32-546'; AccessRights = 'ReadData' } + $Extra) | Add-NTFSAccess -ErrorAction Stop
Get-TestAccountScope -Acl (Get-Acl -LiteralPath $folder) -Account 'S-1-5-32-546' | Should -BeExactly $Scope
}
It 'Should reject a piped object that has both AppliesTo and InheritanceFlags with an AmbiguousParameterSet error and change nothing' {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'AddPipedBoth' -Directory
$before = (Get-Acl -LiteralPath $folder).Sddl
$object = [pscustomobject]@{ Path = $folder; Account = 'S-1-1-0'; AccessRights = 'ReadData'; AppliesTo = 'ThisFolderOnly'; InheritanceFlags = 'None' }
{ $object | Add-NTFSAccess -ErrorAction Stop } | Should -Throw -ErrorId 'AmbiguousParameterSet*'
(Get-Acl -LiteralPath $folder).Sddl | Should -BeExactly $before
}
}
# PowerShell resets only the parameters that the previous object bound from the pipeline. The scope that the cmdlet
# derives from AppliesTo must therefore not stay in the fields behind InheritanceFlags and PropagationFlags: the next
# object that has no scope, or only one flag, would get it.
Context 'Objects with different scopes in one pipeline' {
It 'Should give each piped path object only its own scope: AppliesTo, none, AppliesTo, one flag, none' {
$folders = @('AddMixedThisFolderOnly', 'AddMixedNoScope', 'AddMixedInheritOnly', 'AddMixedOneFlag', 'AddMixedNoScopeAgain' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
$entry = @{ Account = 'S-1-5-32-546'; AccessRights = 'ReadData' }
@(
[pscustomobject] ($entry + @{ Path = $folders[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ Path = $folders[1] })
[pscustomobject] ($entry + @{ Path = $folders[2]; AppliesTo = 'SubfoldersAndFilesOnly' })
[pscustomobject] ($entry + @{ Path = $folders[3]; InheritanceFlags = 'ContainerInherit' })
[pscustomobject] ($entry + @{ Path = $folders[4] })
) | Add-NTFSAccess -ErrorAction Stop
$scopes = $folders | ForEach-Object -Process { Get-TestAccountScope -Acl (Get-Acl -LiteralPath $_) -Account 'S-1-5-32-546' }
$scopes -join '|' | Should -BeExactly 'None/None|ContainerInherit, ObjectInherit/None|ContainerInherit, ObjectInherit/InheritOnly|ContainerInherit/None|ContainerInherit, ObjectInherit/None'
}
It 'Should give each row of a CSV file that Import-Csv reads and that has an AppliesTo column its own scope' {
$folders = @('AddCsvThisFolderOnly', 'AddCsvSubfolders', 'AddCsvInheritOnly' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
$csv = Join-Path -Path $sandbox -ChildPath 'AddCsvScopes.csv'
Assert-TestSandboxPath -Sandbox $sandbox -Path $csv
Set-Content -LiteralPath $csv -Value @(
'Path,Account,AccessRights,AppliesTo'
('"{0}",S-1-5-32-546,ReadData,ThisFolderOnly' -f $folders[0])
('"{0}",S-1-5-32-546,ReadData,ThisFolderAndSubfolders' -f $folders[1])
('"{0}",S-1-5-32-546,ReadData,SubfoldersAndFilesOnly' -f $folders[2])
)
Import-Csv -LiteralPath $csv | Add-NTFSAccess -ErrorAction Stop
$scopes = $folders | ForEach-Object -Process { Get-TestAccountScope -Acl (Get-Acl -LiteralPath $_) -Account 'S-1-5-32-546' }
$scopes -join '|' | Should -BeExactly 'None/None|ContainerInherit/None|ContainerInherit, ObjectInherit/InheritOnly'
}
# A blank cell that Import-Csv reads is an empty string: not $null, and not a scope name. The binder cannot convert it, so
# PathSimple does not bind, and the row gets the default scope, as an object without the property does.
It 'Should give the row of a CSV file whose AppliesTo cell is blank the default scope, and the other rows their own' {
$folders = @('AddCsvBlankFirst', 'AddCsvBlankCell', 'AddCsvBlankLast' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
$csv = Join-Path -Path $sandbox -ChildPath 'AddCsvBlank.csv'
Assert-TestSandboxPath -Sandbox $sandbox -Path $csv
Set-Content -LiteralPath $csv -Value @(
'Path,Account,AccessRights,AppliesTo'
('"{0}",S-1-5-32-546,ReadData,ThisFolderOnly' -f $folders[0])
('"{0}",S-1-5-32-546,ReadData,' -f $folders[1])
('"{0}",S-1-5-32-546,ReadData,SubfoldersAndFilesOnly' -f $folders[2])
)
Import-Csv -LiteralPath $csv | Add-NTFSAccess -ErrorAction Stop
$scopes = $folders | ForEach-Object -Process { Get-TestAccountScope -Acl (Get-Acl -LiteralPath $_) -Account 'S-1-5-32-546' }
$scopes -join '|' | Should -BeExactly 'None/None|ContainerInherit, ObjectInherit/None|ContainerInherit, ObjectInherit/InheritOnly'
}
# $null cannot be bound at all (ConvertFrom-Csv makes it of a trailing blank cell): the object fails, loudly, and the cmdlet goes
# on with the next one.
It 'Should report a binding error for the piped object whose AppliesTo is $null, leave its folder alone, and still process the other objects' {
$folders = @('AddNullFirst', 'AddNullMiddle', 'AddNullLast' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
$entry = @{ Account = 'S-1-5-32-546'; AccessRights = 'ReadData' }
@(
[pscustomobject] ($entry + @{ Path = $folders[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ Path = $folders[1]; AppliesTo = $null })
[pscustomobject] ($entry + @{ Path = $folders[2]; AppliesTo = 'SubfoldersAndFilesOnly' })
) | Add-NTFSAccess -ErrorVariable addErrors -ErrorAction SilentlyContinue
@($addErrors) | Should -HaveCount 1
$addErrors[0].FullyQualifiedErrorId | Should -BeLike 'ParameterArgumentValidationErrorNullNotAllowed,*'
$scopes = $folders | ForEach-Object -Process { Get-TestAccountScope -Acl (Get-Acl -LiteralPath $_) -Account 'S-1-5-32-546' }
$scopes -join '|' | Should -BeExactly 'None/None||ContainerInherit, ObjectInherit/InheritOnly'
}
It 'Should give each piped descriptor object only its own scope: AppliesTo, then none' {
$folders = @('AddMixedSDThisFolderOnly', 'AddMixedSDNoScope' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
$descriptors = @(Get-NTFSSecurityDescriptor -Path $folders -ErrorAction Stop)
$entry = @{ Account = 'S-1-5-32-546'; AccessRights = 'ReadData' }
@(
[pscustomobject] ($entry + @{ SecurityDescriptor = $descriptors[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ SecurityDescriptor = $descriptors[1] })
) | Add-NTFSAccess -ErrorAction Stop
$scopes = $descriptors | ForEach-Object -Process { Get-TestAccountScope -Acl $_.SecurityDescriptor -Account 'S-1-5-32-546' }
$scopes -join '|' | Should -BeExactly 'None/None|ContainerInherit, ObjectInherit/None'
}
}
Context 'PathSimple parameter set' {
It 'Should report a missing path''s error by category and target, still scope the next path''s entry, and keep binding -Path through the pipeline once -AppliesTo selects the set' {
$missing = Join-Path -Path $sandbox -ChildPath ('AddSimpleMissing-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
Assert-TestSandboxPath -Sandbox $sandbox -Path $missing
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'AddSimpleNext'
Add-NTFSAccess -Path $missing, $file -Account 'S-1-1-0' -AccessRights ReadData -AppliesTo ThisFolderOnly -ErrorVariable addErrors -ErrorAction SilentlyContinue
$addErrors | Should -HaveCount 1
$addErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadFileError,*'
$addErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$addErrors[0].TargetObject | Should -Be $missing
$fileRule = @((Get-Acl -LiteralPath $file).GetAccessRules($true, $false, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq 'S-1-1-0' })
$fileRule | Should -HaveCount 1
# -AppliesTo named explicitly selects PathSimple while -Path arrives through the pipeline.
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'AddSimplePipedFolder' -Directory
Get-Item2 -Path $folder | Add-NTFSAccess -Account 'S-1-5-32-546' -AccessRights ReadData -AppliesTo ThisFolderAndSubfolders -ErrorAction Stop
$guestsRule = @((Get-Acl -LiteralPath $folder).GetAccessRules($true, $false, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq 'S-1-5-32-546' })
$guestsRule | Should -HaveCount 1
$guestsRule[0].InheritanceFlags | Should -Be ([System.Security.AccessControl.InheritanceFlags]::ContainerInherit)
$guestsRule[0].PropagationFlags | Should -Be ([System.Security.AccessControl.PropagationFlags]::None)
$guestsRule[0].FileSystemRights.HasFlag([System.Security.AccessControl.FileSystemRights]::ReadData) | Should -BeTrue
}
}
}
Describe 'Remove-NTFSAccess' {
Context 'PathComplex parameter set with one denied path and -PassThru' {
BeforeAll {
$privateData['EnablePrivileges'] = $false
}
AfterAll {
$privateData['EnablePrivileges'] = $enablePrivileges
}
It 'Should write one RemoveAceError for the blocked path, leave it unchanged, and return -PassThru entries only for the path it changed' {
$blocked = New-TestSandboxItem -Sandbox $sandbox -Name 'RemovePassThruBlocked'
$next = New-TestSandboxItem -Sandbox $sandbox -Name 'RemovePassThruNext'
Add-NTFSAccess -Path $blocked, $next -Account 'S-1-1-0' -AccessRights ReadData -ErrorAction Stop
Block-TestWritePermission -Sandbox $sandbox -Path $blocked
$before = (Get-Acl -LiteralPath $blocked).Sddl
$result = @(Remove-NTFSAccess -Path $blocked, $next -Account 'S-1-1-0' -AccessRights ReadData -PassThru -ErrorVariable removeErrors -ErrorAction SilentlyContinue)
$removeErrors | Should -HaveCount 1
$removeErrors[0].FullyQualifiedErrorId | Should -BeLike 'RemoveAceError,*'
$removeErrors[0].CategoryInfo.Category | Should -Be 'WriteError'
$removeErrors[0].TargetObject | Should -Be $blocked
(Get-Acl -LiteralPath $blocked).Sddl | Should -BeExactly $before
$result | Should -Not -BeNullOrEmpty
$result | ForEach-Object -Process {
$_ | Should -BeOfType ([Security2.FileSystemAccessRule2])
$_.FullName | Should -Be $next
}
@($result | Where-Object -FilterScript { $_.Account.Sid -eq 'S-1-1-0' }) | Should -BeNullOrEmpty
}
}
# As for Add-NTFSAccess, the property AppliesTo of the piped object selects PathSimple, and the entry that the cmdlet
# addresses is the one of the scope it names: the rest of an entry of a wider scope stays.
Context 'Choosing the parameter set of an object bound through the pipeline by property name' {
It 'Should leave <Meaning> of an entry that applies to this folder, subfolders, and files when the piped object that has <Shape> removes its rights' -ForEach @(
@{ Name = 'RemovePipedThisFolderOnly'; Shape = 'AppliesTo ThisFolderOnly'; Extra = @{ AppliesTo = 'ThisFolderOnly' }; Meaning = 'the part that only subfolders and files inherit'; Left = 'ContainerInherit, ObjectInherit/InheritOnly' }
@{ Name = 'RemovePipedNoScope'; Shape = 'no scope'; Extra = @{}; Meaning = 'nothing'; Left = '' }
) {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name $Name -Directory
Add-NTFSAccess -Path $folder -Account 'S-1-5-32-546' -AccessRights ReadData -AppliesTo ThisFolderSubfoldersAndFiles -ErrorAction Stop
[pscustomobject] (@{ Path = $folder; Account = 'S-1-5-32-546'; AccessRights = 'ReadData' } + $Extra) | Remove-NTFSAccess -ErrorAction Stop
Get-TestAccountScope -Acl (Get-Acl -LiteralPath $folder) -Account 'S-1-5-32-546' | Should -BeExactly $Left
}
It 'Should reject a piped object that has both AppliesTo and InheritanceFlags with an AmbiguousParameterSet error and change nothing' {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'RemovePipedBoth' -Directory
Add-NTFSAccess -Path $folder -Account 'S-1-1-0' -AccessRights ReadData -AppliesTo ThisFolderOnly -ErrorAction Stop
$before = (Get-Acl -LiteralPath $folder).Sddl
$object = [pscustomobject]@{ Path = $folder; Account = 'S-1-1-0'; AccessRights = 'ReadData'; AppliesTo = 'ThisFolderOnly'; InheritanceFlags = 'None' }
{ $object | Remove-NTFSAccess -ErrorAction Stop } | Should -Throw -ErrorId 'AmbiguousParameterSet*'
(Get-Acl -LiteralPath $folder).Sddl | Should -BeExactly $before
}
}
# As for Add-NTFSAccess: the scope that the cmdlet derives from AppliesTo must not stay for the next object.
Context 'Objects with different scopes in one pipeline' {
It 'Should remove from each piped path object the entry of its own scope: AppliesTo, none, AppliesTo, none' {
$folders = @('RemoveMixedFirst', 'RemoveMixedSecond', 'RemoveMixedThird', 'RemoveMixedFourth' | ForEach-Object -Process {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory
Add-NTFSAccess -Path $folder -Account 'S-1-5-32-546' -AccessRights ReadData -AppliesTo ThisFolderSubfoldersAndFiles -ErrorAction Stop
$folder
})
$entry = @{ Account = 'S-1-5-32-546'; AccessRights = 'ReadData' }
@(
[pscustomobject] ($entry + @{ Path = $folders[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ Path = $folders[1] })
[pscustomobject] ($entry + @{ Path = $folders[2]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ Path = $folders[3] })
) | Remove-NTFSAccess -ErrorAction Stop
$remaining = $folders | ForEach-Object -Process { Get-TestAccountScope -Acl (Get-Acl -LiteralPath $_) -Account 'S-1-5-32-546' }
$remaining -join '|' | Should -BeExactly 'ContainerInherit, ObjectInherit/InheritOnly||ContainerInherit, ObjectInherit/InheritOnly|'
}
It 'Should remove from each piped descriptor object the entry of its own scope: AppliesTo, then none' {
$folders = @('RemoveMixedSDFirst', 'RemoveMixedSDSecond' | ForEach-Object -Process {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory
Add-NTFSAccess -Path $folder -Account 'S-1-5-32-546' -AccessRights ReadData -AppliesTo ThisFolderSubfoldersAndFiles -ErrorAction Stop
$folder
})
$descriptors = @(Get-NTFSSecurityDescriptor -Path $folders -ErrorAction Stop)
$entry = @{ Account = 'S-1-5-32-546'; AccessRights = 'ReadData' }
@(
[pscustomobject] ($entry + @{ SecurityDescriptor = $descriptors[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ SecurityDescriptor = $descriptors[1] })
) | Remove-NTFSAccess -ErrorAction Stop
$remaining = $descriptors | ForEach-Object -Process { Get-TestAccountScope -Acl $_.SecurityDescriptor -Account 'S-1-5-32-546' }
$remaining -join '|' | Should -BeExactly 'ContainerInherit, ObjectInherit/InheritOnly|'
}
}
Context 'PathSimple parameter set' {
It 'Should take only the requested rights from an entry scoped by -AppliesTo without -RemoveSpecific, keep its flags, and leave another account''s entry untouched' {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'RemoveSimpleScope' -Directory
Add-NTFSAccess -Path $folder -Account 'S-1-1-0' -AccessRights Modify -AppliesTo ThisFolderSubfoldersAndFiles -ErrorAction Stop
Add-NTFSAccess -Path $folder -Account 'S-1-5-32-546' -AccessRights Delete -AppliesTo ThisFolderSubfoldersAndFiles -ErrorAction Stop
Remove-NTFSAccess -Path $folder -Account 'S-1-1-0' -AccessRights ReadData -AppliesTo ThisFolderSubfoldersAndFiles -ErrorAction Stop
$rules = (Get-Acl -LiteralPath $folder).GetAccessRules($true, $false, $sidType)
$everyoneRule = @($rules | Where-Object -FilterScript { $_.IdentityReference.Value -eq 'S-1-1-0' })
$everyoneRule | Should -HaveCount 1
$everyoneRule[0].FileSystemRights.HasFlag([System.Security.AccessControl.FileSystemRights]::ReadData) | Should -BeFalse
$everyoneRule[0].FileSystemRights.HasFlag([System.Security.AccessControl.FileSystemRights]::WriteData) | Should -BeTrue
$everyoneRule[0].InheritanceFlags | Should -Be ([System.Security.AccessControl.InheritanceFlags] 'ContainerInherit, ObjectInherit')
$everyoneRule[0].PropagationFlags | Should -Be ([System.Security.AccessControl.PropagationFlags]::None)
$guestsRule = @($rules | Where-Object -FilterScript { $_.IdentityReference.Value -eq 'S-1-5-32-546' })
$guestsRule | Should -HaveCount 1
$guestsRule[0].FileSystemRights.HasFlag([System.Security.AccessControl.FileSystemRights]::Delete) | Should -BeTrue
}
}
}
Describe 'Clear-NTFSAccess' {
Context 'Path parameter set on folders bound through the pipeline' {
It 'Should clear each piped folder''s explicit entries, including an inherit-only one, and leave inherited entries and the owner untouched' {
$folders = foreach ($name in 'ClearPipeFirst', 'ClearPipeSecond') {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name $name -Directory
Add-NTFSAccess -Path $folder -Account 'S-1-1-0' -AccessRights ReadData -AppliesTo ThisFolderOnly -ErrorAction Stop
Add-NTFSAccess -Path $folder -Account 'S-1-5-32-546' -AccessRights ReadData -AppliesTo SubfoldersAndFilesOnly -ErrorAction Stop
$folder
}
$before = foreach ($folder in $folders) {
$acl = Get-Acl -LiteralPath $folder
[pscustomobject]@{ Path = $folder; Owner = $acl.GetOwner($sidType).Value; Inherited = @($acl.GetAccessRules($false, $true, $sidType)).Count }
}
foreach ($state in $before) {
$state.Inherited | Should -BeGreaterThan 0
}
Get-Item2 -Path $folders | Clear-NTFSAccess -ErrorAction Stop
foreach ($state in $before) {
$acl = Get-Acl -LiteralPath $state.Path
@($acl.GetAccessRules($true, $false, $sidType)) | Should -BeNullOrEmpty
@($acl.GetAccessRules($false, $true, $sidType)) | Should -HaveCount $state.Inherited
$acl.AreAccessRulesProtected | Should -BeFalse
$acl.GetOwner($sidType).Value | Should -Be $state.Owner
}
}
}
Context 'Path parameter set errors' {
BeforeAll {
$privateData['EnablePrivileges'] = $false
}
AfterAll {
$privateData['EnablePrivileges'] = $enablePrivileges
}
It 'Should report a missing path''s ReadFileError and a blocked path''s ClearAclError, each by category and target' {
$missing = Join-Path -Path $sandbox -ChildPath ('ClearMissing-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
Assert-TestSandboxPath -Sandbox $sandbox -Path $missing
Clear-NTFSAccess -Path $missing -ErrorVariable missingErrors -ErrorAction SilentlyContinue
$missingErrors | Should -HaveCount 1
$missingErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadFileError,*'
$missingErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$missingErrors[0].TargetObject | Should -Be $missing
$blocked = New-TestSandboxItem -Sandbox $sandbox -Name 'ClearBlocked'
Block-TestWritePermission -Sandbox $sandbox -Path $blocked
$before = (Get-Acl -LiteralPath $blocked).Sddl
Clear-NTFSAccess -Path $blocked -ErrorVariable blockedErrors -ErrorAction SilentlyContinue
$blockedErrors | Should -HaveCount 1
$blockedErrors[0].FullyQualifiedErrorId | Should -BeLike 'ClearAclError,*'
$blockedErrors[0].CategoryInfo.Category | Should -Be 'WriteError'
$blockedErrors[0].TargetObject | Should -Be $blocked
(Get-Acl -LiteralPath $blocked).Sddl | Should -BeExactly $before
}
}
Context 'SD parameter set bound through the pipeline' {
It 'Should clear each piped descriptor''s explicit entries in memory, leave the items unchanged until Set-NTFSSecurityDescriptor, and keep the owner' {
$files = foreach ($name in 'ClearSdFirst', 'ClearSdSecond') {
$file = New-TestSandboxItem -Sandbox $sandbox -Name $name
Add-NTFSAccess -Path $file -Account 'S-1-1-0' -AccessRights ReadData -ErrorAction Stop
$file
}
$before = foreach ($file in $files) {
$acl = Get-Acl -LiteralPath $file
[pscustomobject]@{ Path = $file; Owner = $acl.GetOwner($sidType).Value; Inherited = @($acl.GetAccessRules($false, $true, $sidType)).Count; Sddl = $acl.Sddl }
}
$descriptors = @(Get-NTFSSecurityDescriptor -Path $files -ErrorAction Stop)
$descriptors | Clear-NTFSAccess -ErrorAction Stop
for ($index = 0; $index -lt $descriptors.Count; $index++) {
$sd = $descriptors[$index]
$state = $before[$index]
@($sd.SecurityDescriptor.GetAccessRules($true, $false, $sidType)) | Should -BeNullOrEmpty
@($sd.SecurityDescriptor.GetAccessRules($false, $true, $sidType)) | Should -HaveCount $state.Inherited
$sd.SecurityDescriptor.AreAccessRulesProtected | Should -BeFalse
(Get-Acl -LiteralPath $state.Path).Sddl | Should -BeExactly $state.Sddl
}
Set-NTFSSecurityDescriptor -SecurityDescriptor $descriptors -ErrorAction Stop
foreach ($state in $before) {
$acl = Get-Acl -LiteralPath $state.Path
@($acl.GetAccessRules($true, $false, $sidType)) | Should -BeNullOrEmpty
$acl.GetOwner($sidType).Value | Should -Be $state.Owner
}
}
}
}
Describe 'Get-NTFSAccess' {
Context 'Path parameter set' {
It 'Should return the same entries for a folder bound through the pipeline and by position, and report a missing path''s error by category and target' {
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'GetAccessPositionParent' -Directory
Add-NTFSAccess -Path $parent -Account 'S-1-1-0' -AccessRights ReadData -ErrorAction Stop
$child = Join-Path -Path $parent -ChildPath 'Child'
Assert-TestSandboxPath -Sandbox $sandbox -Path $child
New-Item -ItemType Directory -Path $child | Out-Null
$expected = @(Get-NTFSAccess -Path $child -ErrorAction Stop | ForEach-Object -Process { '{0}|{1}|{2}' -f $_.Account.Sid, $_.AccessRights, $_.IsInherited })
$pipedResult = @(Get-Item2 -Path $child | Get-NTFSAccess -ErrorAction Stop)
$positionalFolder = Get-ChildItem -LiteralPath $parent -Directory
$positionalResult = @(Get-NTFSAccess $positionalFolder -ErrorAction Stop)
($pipedResult | ForEach-Object -Process { '{0}|{1}|{2}' -f $_.Account.Sid, $_.AccessRights, $_.IsInherited }) -join ';' | Should -Be ($expected -join ';')
$pipedResult | ForEach-Object -Process { $_.FullName | Should -Be $child }
($positionalResult | ForEach-Object -Process { '{0}|{1}|{2}' -f $_.Account.Sid, $_.AccessRights, $_.IsInherited }) -join ';' | Should -Be ($expected -join ';')
$positionalResult | ForEach-Object -Process { $_.FullName | Should -Be $child }
$missing = Join-Path -Path $sandbox -ChildPath ('GetAccessMissing-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
Assert-TestSandboxPath -Sandbox $sandbox -Path $missing
Get-NTFSAccess -Path $missing -ErrorVariable getErrors -ErrorAction SilentlyContinue
$getErrors | Should -HaveCount 1
$getErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadFileError,*'
$getErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$getErrors[0].TargetObject | Should -Be $missing
}
}
Context 'SD parameter set' {
It 'Should filter an entry added to a descriptor in memory by -Account, partition it with -ExcludeInherited and -ExcludeExplicit, and read two descriptors bound through the pipeline' {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'GetAccessSdFilter'
$sd = Get-NTFSSecurityDescriptor -Path $file -ErrorAction Stop
Add-NTFSAccess -SecurityDescriptor $sd -Account 'S-1-1-0' -AccessRights ReadData -ErrorAction Stop
$bySd = @(Get-NTFSAccess -SecurityDescriptor $sd -Account 'S-1-1-0' -ErrorAction Stop)
$byPath = @(Get-NTFSAccess -Path $file -Account 'S-1-1-0' -ErrorAction Stop)
$bySd | Should -HaveCount 1
$bySd[0].IsInherited | Should -BeFalse
$byPath | Should -BeNullOrEmpty
$explicitOnly = @(Get-NTFSAccess -SecurityDescriptor $sd -ExcludeInherited -ErrorAction Stop)
@($explicitOnly | Where-Object -FilterScript { $_.Account.Sid -eq 'S-1-1-0' }) | Should -HaveCount 1
$inheritedOnly = @(Get-NTFSAccess -SecurityDescriptor $sd -ExcludeExplicit -ErrorAction Stop)
@($inheritedOnly | Where-Object -FilterScript { $_.Account.Sid -eq 'S-1-1-0' }) | Should -BeNullOrEmpty
$file2 = New-TestSandboxItem -Sandbox $sandbox -Name 'GetAccessSdFilter2'
$expectedFirst = @(Get-NTFSAccess -Path $file -ErrorAction Stop).Count
$expectedSecond = @(Get-NTFSAccess -Path $file2 -ErrorAction Stop).Count
$piped = @(Get-NTFSSecurityDescriptor -Path $file, $file2 -ErrorAction Stop | Get-NTFSAccess -ErrorAction Stop)
@($piped | Where-Object -FilterScript { $_.FullName -eq $file }) | Should -HaveCount $expectedFirst
@($piped | Where-Object -FilterScript { $_.FullName -eq $file2 }) | Should -HaveCount $expectedSecond
}
}
}
Describe 'Get-NTFSOrphanedAccess' {
Context 'Path parameter set' {
It 'Should mark an orphaned entry explicit on its own folder and inherited on a child, partitioned by -ExcludeInherited and -ExcludeExplicit' {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'OrphanedInheritableFolder' -Directory
Add-NTFSAccess -Path $folder -Account 'S-1-5-21-1-2-3-9101' -AccessRights ReadData -AppliesTo ThisFolderSubfoldersAndFiles -ErrorAction Stop
$child = Join-Path -Path $folder -ChildPath 'Child.txt'
Assert-TestSandboxPath -Sandbox $sandbox -Path $child
Set-Content -LiteralPath $child -Value 'Child'
$folderResult = @(Get-NTFSOrphanedAccess -Path $folder -ErrorAction Stop)
$childResult = @(Get-NTFSOrphanedAccess -Path $child -ErrorAction Stop)
$folderResult | Should -HaveCount 1
$folderResult[0].IsInherited | Should -BeFalse
$childResult | Should -HaveCount 1
$childResult[0].IsInherited | Should -BeTrue
@(Get-NTFSOrphanedAccess -Path $child -ExcludeInherited -ErrorAction Stop) | Should -BeNullOrEmpty
@(Get-NTFSOrphanedAccess -Path $folder -ExcludeExplicit -ErrorAction Stop) | Should -BeNullOrEmpty
}
It 'Should write a ReadFileError for a missing path, still return the orphaned entry of the next path, and accept both bound through the pipeline' {
$missing = Join-Path -Path $sandbox -ChildPath ('OrphanedMissing-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
Assert-TestSandboxPath -Sandbox $sandbox -Path $missing
$withOrphan = New-TestSandboxItem -Sandbox $sandbox -Name 'OrphanedNext'
Add-NTFSAccess -Path $withOrphan -Account 'S-1-5-21-1-2-3-9102' -AccessRights ReadData -ErrorAction Stop
$result = @(Get-NTFSOrphanedAccess -Path $missing, $withOrphan -ErrorVariable orphanErrors -ErrorAction SilentlyContinue)
$orphanErrors | Should -HaveCount 1
$orphanErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadFileError,*'
$orphanErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$orphanErrors[0].TargetObject | Should -Be $missing
$result | Should -HaveCount 1
$result[0] | Should -BeOfType ([Security2.FileSystemAccessRule2])
$result[0].FullName | Should -Be $withOrphan
"$($result[0].Account.Sid)" | Should -Be 'S-1-5-21-1-2-3-9102'
$withOrphan2 = New-TestSandboxItem -Sandbox $sandbox -Name 'OrphanedNext2'
Add-NTFSAccess -Path $withOrphan2 -Account 'S-1-5-21-1-2-3-9103' -AccessRights ReadData -ErrorAction Stop
$pipedResult = @(Get-Item2 -Path $withOrphan, $withOrphan2 | Get-NTFSOrphanedAccess -ErrorAction Stop)
$pipedResult | Should -HaveCount 2
@($pipedResult | Where-Object -FilterScript { $_.FullName -eq $withOrphan }) | Should -HaveCount 1
@($pipedResult | Where-Object -FilterScript { $_.FullName -eq $withOrphan2 }) | Should -HaveCount 1
}
}
Context 'SD parameter set' {
It 'Should filter a descriptor''s orphaned entries by -Account, report both orphaned Sids by default, exclude them all with -ExcludeExplicit, and read two descriptors bound through the pipeline' {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'OrphanedSdFile'
Add-NTFSAccess -Path $file -Account 'S-1-5-21-1-2-3-9201' -AccessRights ReadData -ErrorAction Stop
Add-NTFSAccess -Path $file -Account 'S-1-5-21-1-2-3-9202' -AccessRights ReadData -ErrorAction Stop
$sd = Get-NTFSSecurityDescriptor -Path $file -ErrorAction Stop
$filtered = @(Get-NTFSOrphanedAccess -SecurityDescriptor $sd -Account 'S-1-5-21-1-2-3-9202' -ErrorAction Stop)
$default = @(Get-NTFSOrphanedAccess -SecurityDescriptor $sd -ErrorAction Stop)
$excludeExplicit = @(Get-NTFSOrphanedAccess -SecurityDescriptor $sd -ExcludeExplicit -ErrorAction Stop)
$filtered | Should -HaveCount 1
"$($filtered[0].Account.Sid)" | Should -Be 'S-1-5-21-1-2-3-9202'
($default | ForEach-Object -Process { "$($_.Account.Sid)" } | Sort-Object) -join ',' | Should -Be (('S-1-5-21-1-2-3-9201', 'S-1-5-21-1-2-3-9202' | Sort-Object) -join ',')
$excludeExplicit | Should -BeNullOrEmpty
$file2 = New-TestSandboxItem -Sandbox $sandbox -Name 'OrphanedSdFile2'
Add-NTFSAccess -Path $file2 -Account 'S-1-5-21-1-2-3-9203' -AccessRights ReadData -ErrorAction Stop
$piped = @(Get-NTFSSecurityDescriptor -Path $file, $file2 -ErrorAction Stop | Get-NTFSOrphanedAccess -ErrorAction Stop)
@($piped | Where-Object -FilterScript { $_.FullName -eq $file }) | Should -HaveCount 2
@($piped | Where-Object -FilterScript { $_.FullName -eq $file2 }) | Should -HaveCount 1
}
}
}
Describe 'Get-NTFSSimpleAccess' {
Context 'Path parameter set, unreadable folder' {
BeforeAll {
# Without this, an elevated session auto-enables the Backup privilege in BeginProcessing (every
# BaseCmdletWithPrivControl cmdlet does, see EnableFileSystemPrivileges) and that alone, with no retry
# logic in this cmdlet, bypasses the owner-rights read denial below; forcing it off reproduces the same
# denial as a basic user, like PathErrors.Tests.ps1 does for its own read-denial cases.
$privateData['EnablePrivileges'] = $false
}
AfterAll {
$privateData['EnablePrivileges'] = $enablePrivileges
}
It 'Should report an unreadable folder''s error by category and target and still report the next folder''s entries' {
$blocked = New-TestSandboxItem -Sandbox $sandbox -Name 'SimpleBlocked' -Directory
Block-TestReadPermission -Sandbox $sandbox -Path $blocked
$next = New-TestSandboxItem -Sandbox $sandbox -Name 'SimpleNext' -Directory
Add-NTFSAccess -Path $next -Account 'S-1-1-0' -AccessRights ReadData -ErrorAction Stop
$result = @(Get-NTFSSimpleAccess -Path $blocked, $next -IncludeRootFolder:$false -ErrorVariable simpleErrors -ErrorAction SilentlyContinue)
$simpleErrors | Should -HaveCount 1
$simpleErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadError,*'
$simpleErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$simpleErrors[0].TargetObject | Should -Be $blocked
@($result | Where-Object -FilterScript { $_.FullName -eq $blocked }) | Should -BeNullOrEmpty
@($result | Where-Object -FilterScript { $_.FullName -eq $next }) | Should -Not -BeNullOrEmpty
}
}
Context 'SD parameter set' {
It 'Should filter and partition a descriptor''s entries like the equivalent -Path call, and read two descriptors bound through the pipeline' {
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'SimpleSdParent' -Directory
Add-NTFSAccess -Path $parent -Account 'S-1-5-32-546' -AccessRights ReadData -AppliesTo ThisFolderSubfoldersAndFiles -ErrorAction Stop
$child = Join-Path -Path $parent -ChildPath 'Child'
Assert-TestSandboxPath -Sandbox $sandbox -Path $child
New-Item -ItemType Directory -Path $child | Out-Null
Add-NTFSAccess -Path $child -Account 'S-1-1-0' -AccessRights ReadData -ErrorAction Stop
$sd = Get-NTFSSecurityDescriptor -Path $child -ErrorAction Stop
$bySd = @(Get-NTFSSimpleAccess -SecurityDescriptor $sd -ErrorAction Stop)
$byPath = @(Get-NTFSSimpleAccess -Path $child -IncludeRootFolder:$false -ErrorAction Stop)
(($bySd | ForEach-Object -Process { '{0}|{1}|{2}' -f $_.Identity.Sid, $_.AccessRights, $_.AccessControlType }) | Sort-Object) -join ';' |
Should -Be ((($byPath | ForEach-Object -Process { '{0}|{1}|{2}' -f $_.Identity.Sid, $_.AccessRights, $_.AccessControlType }) | Sort-Object) -join ';')
$filtered = @(Get-NTFSSimpleAccess -SecurityDescriptor $sd -Account 'S-1-1-0' -ErrorAction Stop)
$filtered | Should -HaveCount 1
$explicitOnly = @(Get-NTFSSimpleAccess -SecurityDescriptor $sd -ExcludeInherited -ErrorAction Stop)
$inheritedOnly = @(Get-NTFSSimpleAccess -SecurityDescriptor $sd -ExcludeExplicit -ErrorAction Stop)
($explicitOnly.Count + $inheritedOnly.Count) | Should -Be $bySd.Count
@($explicitOnly | Where-Object -FilterScript { $_.Identity.Sid -eq 'S-1-1-0' }) | Should -HaveCount 1
@($inheritedOnly | Where-Object -FilterScript { $_.Identity.Sid -eq 'S-1-5-32-546' }) | Should -HaveCount 1
$piped = @(Get-NTFSSecurityDescriptor -Path $child, $parent -ErrorAction Stop | Get-NTFSSimpleAccess -ErrorAction Stop)
@($piped | Where-Object -FilterScript { $_.FullName -eq $child }) | Should -HaveCount $bySd.Count
@($piped | Where-Object -FilterScript { $_.FullName -eq $parent }) | Should -Not -BeNullOrEmpty
}
}
}
Describe 'Get-NTFSEffectiveAccess' {
Context 'Path parameter set' {
It 'Should report an allowed right as present and a denied right as absent for a protected DACL' {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'EffectiveRights'
Disable-NTFSAccessInheritance -Path $file -RemoveInheritedAccessRules -ErrorAction Stop
Add-NTFSAccess -Path $file -Account $currentUser -AccessRights ReadData -ErrorAction Stop
Add-NTFSAccess -Path $file -Account $currentUser -AccessRights WriteData -AccessType Deny -ErrorAction Stop
$result = Get-NTFSEffectiveAccess -Path $file -WarningAction SilentlyContinue -ErrorAction Stop
$result.AccessRights.HasFlag([Security2.FileSystemRights2]::ReadData) | Should -BeTrue
$result.AccessRights.HasFlag([Security2.FileSystemRights2]::WriteData) | Should -BeFalse
}
It 'Should return one result per item bound through the pipeline, in order' {
$first = New-TestSandboxItem -Sandbox $sandbox -Name 'EffectivePipeFirst'
$second = New-TestSandboxItem -Sandbox $sandbox -Name 'EffectivePipeSecond'
$result = @(Get-Item2 -Path $first, $second | Get-NTFSEffectiveAccess -Account 'S-1-5-32-546' -WarningAction SilentlyContinue -ErrorAction Stop)
$result | Should -HaveCount 2
$result[0].FullName | Should -Be $first
$result[1].FullName | Should -Be $second
}
}
Context 'SecurityDescriptor parameter set' {
It 'Should follow a descriptor changed only in memory while the -Path result stays on disk, and read two descriptors bound through the pipeline' {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'EffectiveSdFile'
Disable-NTFSAccessInheritance -Path $file -RemoveInheritedAccessRules -ErrorAction Stop
Add-NTFSAccess -Path $file -Account $currentUser -AccessRights FullControl -ErrorAction Stop
$sd = Get-NTFSSecurityDescriptor -Path $file -ErrorAction Stop
$pathBefore = Get-NTFSEffectiveAccess -Path $file -WarningAction SilentlyContinue -ErrorAction Stop
$sdBefore = Get-NTFSEffectiveAccess -SecurityDescriptor $sd -WarningAction SilentlyContinue -ErrorAction Stop
$pathBefore.AccessRights.HasFlag([Security2.FileSystemRights2]::WriteData) | Should -BeTrue
$sdBefore.AccessRights.HasFlag([Security2.FileSystemRights2]::WriteData) | Should -BeTrue
Add-NTFSAccess -SecurityDescriptor $sd -Account $currentUser -AccessType Deny -AccessRights WriteData -ErrorAction Stop
$sdAfter = Get-NTFSEffectiveAccess -SecurityDescriptor $sd -WarningAction SilentlyContinue -ErrorAction Stop
$pathAfter = Get-NTFSEffectiveAccess -Path $file -WarningAction SilentlyContinue -ErrorAction Stop
$sdAfter.AccessRights.HasFlag([Security2.FileSystemRights2]::WriteData) | Should -BeFalse
$pathAfter.AccessRights.HasFlag([Security2.FileSystemRights2]::WriteData) | Should -BeTrue
$file2 = New-TestSandboxItem -Sandbox $sandbox -Name 'EffectiveSdFile2'
Disable-NTFSAccessInheritance -Path $file2 -RemoveInheritedAccessRules -ErrorAction Stop
Add-NTFSAccess -Path $file2 -Account $currentUser -AccessRights FullControl -ErrorAction Stop
$piped = @(Get-NTFSSecurityDescriptor -Path $file, $file2 -ErrorAction Stop | Get-NTFSEffectiveAccess -WarningAction SilentlyContinue -ErrorAction Stop)
$piped | Should -HaveCount 2
}
}
}
Describe 'Declared output types and parameter set boundaries' {
It '<Name> should declare <Types> as its output type' -ForEach $declaredOutputTypes {
@((Get-Command -Name $Name).OutputType.Name) | Should -Be $Types
}
It '<_> should require -AppliesTo only in the Simple parameter sets, -InheritanceFlags/-PropagationFlags only in the Complex parameter sets, and reject combining -AppliesTo with -InheritanceFlags without changing the item' -ForEach @(
'Add-NTFSAccess', 'Remove-NTFSAccess'
) {
$parameterSets = (Get-Command -Name $_).ParameterSets
foreach ($setName in 'PathSimple', 'SDSimple') {
$parameterSet = $parameterSets | Where-Object -Property Name -EQ -Value $setName
($parameterSet.Parameters | Where-Object -Property Name -EQ -Value 'AppliesTo').IsMandatory | Should -BeTrue
$parameterSet.Parameters.Name | Should -Not -Contain 'InheritanceFlags'
$parameterSet.Parameters.Name | Should -Not -Contain 'PropagationFlags'
}
foreach ($setName in 'PathComplex', 'SDComplex') {
$parameterSet = $parameterSets | Where-Object -Property Name -EQ -Value $setName
$parameterSet.Parameters.Name | Should -Not -Contain 'AppliesTo'
$parameterSet.Parameters.Name | Should -Contain 'InheritanceFlags'
$parameterSet.Parameters.Name | Should -Contain 'PropagationFlags'
}
$file = New-TestSandboxItem -Sandbox $sandbox -Name ('Boundary{0}' -f $_.Replace('-', ''))
$before = (Get-Acl -LiteralPath $file).Sddl
{ & $_ -Path $file -Account 'S-1-1-0' -AccessRights ReadData -AppliesTo ThisFolderOnly -InheritanceFlags None -ErrorAction Stop } |
Should -Throw -ErrorId 'AmbiguousParameterSet*'
(Get-Acl -LiteralPath $file).Sddl | Should -BeExactly $before
}
}

726
Tests/ParameterSets.Audit.Tests.ps1

@ -0,0 +1,726 @@
<#
Closes the parameter-set gaps that the judged test matrix (judged-audit.csv / judged-audit-notes.md) found for
the audit cmdlets: pipeline binding by value and by property name, continuation past a failing path or
descriptor, and state or output assertions beyond -PassThru, with the module built in NTFSSecurity\bin\Release
on files in a sandbox folder. Reading and changing audit entries needs the Security privilege; tests that need
it skip without it and run in CI, whose runners are elevated, like Audit.Tests.ps1. The -SecurityDescriptor sets
of Add-NTFSAudit and Remove-NTFSAudit have no per-item handler around the change itself (an open maintainer
item), so no test here pins what happens when that change throws for one of several descriptors; the only
failure the -SecurityDescriptor scenarios below exercise is the already-handled one of a descriptor that was
read without its audit section.
#>
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
'PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'Pester shares variables between blocks.'
)]
param ()
BeforeDiscovery {
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers.psm1') -Force
$canReadAudit = Test-PrivilegeHeld -Name 'SeSecurityPrivilege'
}
BeforeAll {
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers.psm1') -Force
$modulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\NTFSSecurity\bin\Release\NTFSSecurity.psd1'
Import-Module -Name $modulePath -Force -ErrorAction Stop
$sandbox = New-TestSandbox -Name 'ParameterSetsAudit'
Push-Location -LiteralPath $sandbox
$sidType = [System.Security.Principal.SecurityIdentifier]
$probe = 'S-1-1-0'
$keeper = 'S-1-5-32-545'
$entry = @{ Account = $probe; AccessRights = 'ReadData' }
function Get-TestAuditSddl {
param ([Parameter(Mandatory)] [string] $Path)
(Get-Acl -LiteralPath $Path -Audit).GetSecurityDescriptorSddlForm('Audit')
}
function Get-TestDaclSddl {
param ([Parameter(Mandatory)] [string] $Path)
(Get-Acl -LiteralPath $Path).Sddl
}
function Get-TestAuditAcl {
# The SACL read alone, through .NET. Get-Acl -Audit reads it together with the other sections, and on a domain
# member that reports the SACL of an item without audit entries as protected from inheritance, which is not its
# state (see Security2\FileSystem\FileSystemSecurity2.cs). Matches the helper of ParameterSets.Inheritance.Tests.ps1.
param ([Parameter(Mandatory)] [string] $Path)
$sections = [System.Security.AccessControl.AccessControlSections]::Audit
$info = if (Test-Path -LiteralPath $Path -PathType Container) {
New-Object -TypeName 'System.IO.DirectoryInfo' -ArgumentList $Path
}
else {
New-Object -TypeName 'System.IO.FileInfo' -ArgumentList $Path
}
if ($PSVersionTable.PSEdition -eq 'Desktop') {
$info.GetAccessControl($sections)
}
else {
[System.IO.FileSystemAclExtensions]::GetAccessControl($info, $sections)
}
}
function Get-TestAccessOnlyDescriptor {
# A descriptor read with the Access section only, like one that Get-NTFSSecurityDescriptor returns without
# the Security privilege: the audit cmdlets have nothing to read or change and report it the same way.
param ([Parameter(Mandatory)] [string] $Path)
New-Object -TypeName 'Security2.FileSystemSecurity2' -ArgumentList (
(Get-Item2 -Path $Path), [System.Security.AccessControl.AccessControlSections]::Access
)
}
function Get-TestAccountAuditRule {
param (
[Parameter(Mandatory)] [System.Security.AccessControl.FileSystemSecurity] $Acl,
[Parameter(Mandatory)] [string] $Account
)
@($Acl.GetAuditRules($true, $false, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq $Account })
}
function Get-TestAuditScope {
# The scopes of the explicit audit entries of the probe account, each as 'inheritance flags/propagation flags', joined by ';'
param ([Parameter(Mandatory)] [System.Security.AccessControl.FileSystemSecurity] $Acl)
@(Get-TestAccountAuditRule -Acl $Acl -Account $probe |
ForEach-Object -Process { '{0}/{1}' -f $_.InheritanceFlags, $_.PropagationFlags }) -join ';'
}
}
AfterAll {
Pop-Location
Remove-TestSandbox -Sandbox $sandbox
Remove-Module -Name NTFSSecurity -Force -ErrorAction SilentlyContinue
}
Describe 'Audit cmdlets with a security descriptor that has no audit section' {
# TestAuditSection (#109) handles this the same way for every cmdlet that takes -SecurityDescriptor: Audit.Tests.ps1
# line 425 already asserts the ErrorId for Add-NTFSAudit, Remove-NTFSAudit, and Clear-NTFSAudit; this data set adds
# the category and the target, which must be the descriptor itself, not its path, and also covers Get-NTFSAudit and
# Get-NTFSOrphanedAudit and the Simple parameter sets of Add and Remove. None of this needs the Security privilege:
# the descriptor already carries no audit section before the cmdlet runs.
It '<Command> should write a ReadSecurityError with category InvalidData and the descriptor as target for the <Set> set, and change nothing' -ForEach @(
@{ Command = 'Add-NTFSAudit'; Set = 'SDSimple'; Parameters = @{ Account = 'S-1-1-0'; AccessRights = 'ReadData'; AppliesTo = 'ThisFolderOnly'; PassThru = $true } }
@{ Command = 'Add-NTFSAudit'; Set = 'SDComplex'; Parameters = @{ Account = 'S-1-1-0'; AccessRights = 'ReadData'; PassThru = $true } }
@{ Command = 'Remove-NTFSAudit'; Set = 'SDSimple'; Parameters = @{ Account = 'S-1-1-0'; AccessRights = 'ReadData'; AppliesTo = 'ThisFolderOnly'; PassThru = $true } }
@{ Command = 'Remove-NTFSAudit'; Set = 'SDComplex'; Parameters = @{ Account = 'S-1-1-0'; AccessRights = 'ReadData'; PassThru = $true } }
@{ Command = 'Clear-NTFSAudit'; Set = 'SD'; Parameters = @{} }
@{ Command = 'Get-NTFSAudit'; Set = 'SD'; Parameters = @{} }
@{ Command = 'Get-NTFSOrphanedAudit'; Set = 'SD'; Parameters = @{} }
) {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'NoAuditSection'
$sd = Get-TestAccessOnlyDescriptor -Path $file
$result = @(& $Command -SecurityDescriptor $sd @Parameters -ErrorVariable auditErrors -ErrorAction SilentlyContinue)
$result | Should -BeNullOrEmpty
$auditErrors | Should -HaveCount 1
$auditErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadSecurityError,*'
$auditErrors[0].CategoryInfo.Category | Should -Be 'InvalidData'
$auditErrors[0].TargetObject | Should -Be $sd
$sd.SecurityDescriptor.GetSecurityDescriptorSddlForm('Audit') | Should -BeNullOrEmpty
}
}
Describe 'Add-NTFSAudit' {
Context 'Binding -Path from the pipeline by property name' {
# The PathSimple row pipes AppliesTo, which selects the set; the PathSimpleNamed row names -AppliesTo instead, and the
# piped object brings only the path.
It 'Should add the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and leave the DACL unchanged' -ForEach @(
@{ Set = 'PathComplex'; ExtraProperties = @{ InheritanceFlags = 'None'; PropagationFlags = 'None' }; Named = @{} }
@{ Set = 'PathSimple'; ExtraProperties = @{ AppliesTo = 'ThisFolderOnly' }; Named = @{} }
@{ Set = 'PathSimpleNamed'; ExtraProperties = @{}; Named = @{ AppliesTo = 'ThisFolderOnly' } }
) -Skip:(-not $canReadAudit) {
$missing = Join-Path -Path $sandbox -ChildPath ('AddPipeMissing-{0}' -f [guid]::NewGuid().ToString('N'))
Assert-TestSandboxPath -Sandbox $sandbox -Path $missing
$good = New-TestSandboxItem -Sandbox $sandbox -Name "AddPipeGood$Set" -Directory
$daclBefore = Get-TestDaclSddl -Path $good
$items = @(
[pscustomobject] (@{ FullName = $missing; Account = $probe; AccessRights = 'ReadData' } + $ExtraProperties)
[pscustomobject] (@{ FullName = $good; Account = $probe; AccessRights = 'ReadData' } + $ExtraProperties)
)
$result = @($items | Add-NTFSAudit @Named -PassThru -ErrorVariable auditErrors -ErrorAction SilentlyContinue)
$auditErrors | Should -HaveCount 1
$auditErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadFileError,*'
$auditErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$auditErrors[0].TargetObject | Should -Be $missing
$result | Should -HaveCount 1
$result[0].FullName | Should -Be $good
# The default scope of a new entry is ContainerInherit and ObjectInherit; None shows that the scope was honored
$rule = Get-TestAccountAuditRule -Acl (Get-Acl -LiteralPath $good -Audit) -Account $probe
$rule | Should -HaveCount 1
$rule[0].InheritanceFlags | Should -Be ([System.Security.AccessControl.InheritanceFlags]::None)
Get-TestDaclSddl -Path $good | Should -BeExactly $daclBefore
}
}
Context 'Binding -SecurityDescriptor from the pipeline by property name' {
It 'Should add the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and leave the item on disk unchanged until Set-NTFSSecurityDescriptor writes it' -ForEach @(
@{ Set = 'SDSimple'; ExtraProperties = @{ AppliesTo = 'ThisFolderOnly' } }
@{ Set = 'SDComplex'; ExtraProperties = @{ InheritanceFlags = 'None'; PropagationFlags = 'None' } }
) -Skip:(-not $canReadAudit) {
$badFile = New-TestSandboxItem -Sandbox $sandbox -Name "AddPipeSDBad$Set"
$sdBad = Get-TestAccessOnlyDescriptor -Path $badFile
# A folder, so that the scope of the entry is observable; the piped AppliesTo property binds SDSimple, as it binds
# PathSimple for a path
$goodFile = New-TestSandboxItem -Sandbox $sandbox -Name "AddPipeSDGood$Set" -Directory
$auditBefore = Get-TestAuditSddl -Path $goodFile
$daclBefore = Get-TestDaclSddl -Path $goodFile
$sdGood = Get-NTFSSecurityDescriptor -Path $goodFile -ErrorAction Stop
$items = @(
[pscustomobject] (@{ SecurityDescriptor = $sdBad; Account = $probe; AccessRights = 'ReadData' } + $ExtraProperties)
[pscustomobject] (@{ SecurityDescriptor = $sdGood; Account = $probe; AccessRights = 'ReadData' } + $ExtraProperties)
)
$result = @($items | Add-NTFSAudit -PassThru -ErrorVariable auditErrors -ErrorAction SilentlyContinue)
$auditErrors | Should -HaveCount 1
$auditErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadSecurityError,*'
$auditErrors[0].TargetObject | Should -Be $sdBad
$result | Should -HaveCount 1
$result[0].FullName | Should -Be $goodFile
$rule = Get-TestAccountAuditRule -Acl $sdGood.SecurityDescriptor -Account $probe
$rule | Should -HaveCount 1
$rule[0].InheritanceFlags | Should -Be ([System.Security.AccessControl.InheritanceFlags]::None)
Get-TestAuditSddl -Path $goodFile | Should -BeExactly $auditBefore
Set-NTFSSecurityDescriptor -SecurityDescriptor $sdGood -ErrorAction Stop
(Get-TestAccountAuditRule -Acl (Get-TestAuditAcl -Path $goodFile) -Account $probe) | Should -HaveCount 1
Get-TestAuditSddl -Path $goodFile | Should -Not -BeExactly $auditBefore
Get-TestDaclSddl -Path $goodFile | Should -BeExactly $daclBefore
}
}
# The property AppliesTo selects PathSimple, InheritanceFlags and PropagationFlags select PathComplex, and an object that
# has none of them gets the default scope, as for Add-NTFSAccess (ParameterSets.Access.Tests.ps1).
Context 'Choosing the parameter set of an object bound through the pipeline by property name' {
It 'Should give the audit entry for the piped object that has <Shape> the scope <Scope>' -ForEach @(
@{ Name = 'AddPipedAuditThisFolderOnly'; Shape = 'AppliesTo ThisFolderOnly'; Extra = @{ AppliesTo = 'ThisFolderOnly' }; Scope = 'None/None' }
@{ Name = 'AddPipedAuditSubfolders'; Shape = 'AppliesTo ThisFolderAndSubfolders'; Extra = @{ AppliesTo = 'ThisFolderAndSubfolders' }; Scope = 'ContainerInherit/None' }
@{ Name = 'AddPipedAuditFlags'; Shape = 'InheritanceFlags and PropagationFlags'; Extra = @{ InheritanceFlags = 'ContainerInherit'; PropagationFlags = 'InheritOnly' }; Scope = 'ContainerInherit/InheritOnly' }
@{ Name = 'AddPipedAuditNoScope'; Shape = 'no scope'; Extra = @{}; Scope = 'ContainerInherit, ObjectInherit/None' }
) -Skip:(-not $canReadAudit) {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name $Name -Directory
[pscustomobject] (@{ FullName = $folder; Account = $probe; AccessRights = 'ReadData' } + $Extra) | Add-NTFSAudit -ErrorAction Stop
Get-TestAuditScope -Acl (Get-Acl -LiteralPath $folder -Audit) | Should -BeExactly $Scope
}
It 'Should reject a piped object that has both AppliesTo and InheritanceFlags with an AmbiguousParameterSet error' {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'AddPipedAuditBoth' -Directory
$object = [pscustomobject]@{ FullName = $folder; Account = $probe; AccessRights = 'ReadData'; AppliesTo = 'ThisFolderOnly'; InheritanceFlags = 'None' }
{ $object | Add-NTFSAudit -ErrorAction Stop } | Should -Throw -ErrorId 'AmbiguousParameterSet*'
}
}
# PowerShell resets only the parameters that the previous object bound from the pipeline. The scope that the cmdlet
# derives from AppliesTo must therefore not stay in the fields behind InheritanceFlags and PropagationFlags: the next
# object that has no scope, or only one flag, would get it (ParameterSets.Access.Tests.ps1 has the same rows).
Context 'Objects with different scopes in one pipeline' {
It 'Should give each piped path object only its own scope: AppliesTo, none, AppliesTo, one flag, none' -Skip:(-not $canReadAudit) {
$folders = @('AddMixedAuditThisFolderOnly', 'AddMixedAuditNoScope', 'AddMixedAuditInheritOnly', 'AddMixedAuditOneFlag', 'AddMixedAuditNoScopeAgain' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
@(
[pscustomobject] ($entry + @{ FullName = $folders[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ FullName = $folders[1] })
[pscustomobject] ($entry + @{ FullName = $folders[2]; AppliesTo = 'SubfoldersAndFilesOnly' })
[pscustomobject] ($entry + @{ FullName = $folders[3]; InheritanceFlags = 'ContainerInherit' })
[pscustomobject] ($entry + @{ FullName = $folders[4] })
) | Add-NTFSAudit -ErrorAction Stop
$scopes = $folders | ForEach-Object -Process { Get-TestAuditScope -Acl (Get-Acl -LiteralPath $_ -Audit) }
$scopes -join '|' | Should -BeExactly 'None/None|ContainerInherit, ObjectInherit/None|ContainerInherit, ObjectInherit/InheritOnly|ContainerInherit/None|ContainerInherit, ObjectInherit/None'
}
It 'Should give each row of a CSV file that Import-Csv reads and that has an AppliesTo column its own scope' -Skip:(-not $canReadAudit) {
$folders = @('AddCsvAuditThisFolderOnly', 'AddCsvAuditSubfolders', 'AddCsvAuditInheritOnly' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
$csv = Join-Path -Path $sandbox -ChildPath 'AddCsvAuditScopes.csv'
Assert-TestSandboxPath -Sandbox $sandbox -Path $csv
Set-Content -LiteralPath $csv -Value @(
'FullName,Account,AccessRights,AppliesTo'
('"{0}",{1},ReadData,ThisFolderOnly' -f $folders[0], $probe)
('"{0}",{1},ReadData,ThisFolderAndSubfolders' -f $folders[1], $probe)
('"{0}",{1},ReadData,SubfoldersAndFilesOnly' -f $folders[2], $probe)
)
Import-Csv -LiteralPath $csv | Add-NTFSAudit -ErrorAction Stop
$scopes = $folders | ForEach-Object -Process { Get-TestAuditScope -Acl (Get-Acl -LiteralPath $_ -Audit) }
$scopes -join '|' | Should -BeExactly 'None/None|ContainerInherit/None|ContainerInherit, ObjectInherit/InheritOnly'
}
# A blank cell that Import-Csv reads is an empty string, not $null: the row gets the default scope (ParameterSets.Access.Tests.ps1
# has the same rows and says why).
It 'Should give the row of a CSV file whose AppliesTo cell is blank the default scope, and the other rows their own' -Skip:(-not $canReadAudit) {
$folders = @('AddCsvAuditBlankFirst', 'AddCsvAuditBlankCell', 'AddCsvAuditBlankLast' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
$csv = Join-Path -Path $sandbox -ChildPath 'AddCsvAuditBlank.csv'
Assert-TestSandboxPath -Sandbox $sandbox -Path $csv
Set-Content -LiteralPath $csv -Value @(
'FullName,Account,AccessRights,AppliesTo'
('"{0}",{1},ReadData,ThisFolderOnly' -f $folders[0], $probe)
('"{0}",{1},ReadData,' -f $folders[1], $probe)
('"{0}",{1},ReadData,SubfoldersAndFilesOnly' -f $folders[2], $probe)
)
Import-Csv -LiteralPath $csv | Add-NTFSAudit -ErrorAction Stop
$scopes = $folders | ForEach-Object -Process { Get-TestAuditScope -Acl (Get-Acl -LiteralPath $_ -Audit) }
$scopes -join '|' | Should -BeExactly 'None/None|ContainerInherit, ObjectInherit/None|ContainerInherit, ObjectInherit/InheritOnly'
}
# $null cannot be bound at all: the object fails, loudly, and the cmdlet goes on with the next one.
It 'Should report a binding error for the piped object whose AppliesTo is $null, leave its folder alone, and still process the other objects' -Skip:(-not $canReadAudit) {
$folders = @('AddNullAuditFirst', 'AddNullAuditMiddle', 'AddNullAuditLast' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
@(
[pscustomobject] ($entry + @{ FullName = $folders[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ FullName = $folders[1]; AppliesTo = $null })
[pscustomobject] ($entry + @{ FullName = $folders[2]; AppliesTo = 'SubfoldersAndFilesOnly' })
) | Add-NTFSAudit -ErrorVariable auditErrors -ErrorAction SilentlyContinue
@($auditErrors) | Should -HaveCount 1
$auditErrors[0].FullyQualifiedErrorId | Should -BeLike 'ParameterArgumentValidationErrorNullNotAllowed,*'
$scopes = $folders | ForEach-Object -Process { Get-TestAuditScope -Acl (Get-Acl -LiteralPath $_ -Audit) }
$scopes -join '|' | Should -BeExactly 'None/None||ContainerInherit, ObjectInherit/InheritOnly'
}
It 'Should give each piped descriptor object only its own scope: AppliesTo, then none' -Skip:(-not $canReadAudit) {
$folders = @('AddMixedAuditSDThisFolderOnly', 'AddMixedAuditSDNoScope' |
ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory })
$descriptors = @(Get-NTFSSecurityDescriptor -Path $folders -ErrorAction Stop)
@(
[pscustomobject] ($entry + @{ SecurityDescriptor = $descriptors[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ SecurityDescriptor = $descriptors[1] })
) | Add-NTFSAudit -ErrorAction Stop
$scopes = $descriptors | ForEach-Object -Process { Get-TestAuditScope -Acl $_.SecurityDescriptor }
$scopes -join '|' | Should -BeExactly 'None/None|ContainerInherit, ObjectInherit/None'
}
}
Context 'Conflicting parameters' {
It 'Should reject -AppliesTo combined with -InheritanceFlags with an AmbiguousParameterSet error' {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'AddAmbiguous'
{ Add-NTFSAudit -Path $file -Account $probe -AccessRights ReadData -AppliesTo ThisFolderOnly -InheritanceFlags None -ErrorAction Stop } |
Should -Throw -ErrorId 'AmbiguousParameterSet,NTFSSecurity.AddAudit'
}
}
Context 'Direct call of -SecurityDescriptor with -AppliesTo' {
# Add-NTFSAudit SDSimple (judged-audit.csv): every existing call binds it only through a splat
# (PermissionScopes.Tests.ps1) or through position (Audit.Tests.ps1); this one names the set's parameters
# directly.
It 'Should add the entry to the descriptor when -SecurityDescriptor, -Account, -AccessRights, and -AppliesTo are all named directly' -Skip:(-not $canReadAudit) {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'AddDirectSDSimple'
$sd = Get-NTFSSecurityDescriptor -Path $file -ErrorAction Stop
$result = @(Add-NTFSAudit -SecurityDescriptor $sd -Account $probe -AccessRights ReadData -AppliesTo ThisFolderOnly -PassThru -ErrorAction Stop)
$result | Should -HaveCount 1
$result[0] | Should -BeOfType [Security2.FileSystemAuditRule2]
(Get-TestAccountAuditRule -Acl $sd.SecurityDescriptor -Account $probe) | Should -HaveCount 1
}
}
}
Describe 'Remove-NTFSAudit' {
Context 'Binding -Path from the pipeline by property name' {
# The PathSimple row pipes AppliesTo and the PathSimpleNamed row names it. Neither can tell the sets apart here: the
# entry is on a file, where the scope does not matter. The Contexts on folders below do.
It "Should remove the audit entry for the piped <Set> object that exists, write a ReadFileError for the one that does not, and keep the other account's entry" -ForEach @(
@{ Set = 'PathComplex'; ExtraProperties = @{ InheritanceFlags = 'None'; PropagationFlags = 'None' }; Named = @{} }
@{ Set = 'PathSimple'; ExtraProperties = @{ AppliesTo = 'ThisFolderOnly' }; Named = @{} }
@{ Set = 'PathSimpleNamed'; ExtraProperties = @{}; Named = @{ AppliesTo = 'ThisFolderOnly' } }
) -Skip:(-not $canReadAudit) {
$missing = Join-Path -Path $sandbox -ChildPath ('RemovePipeMissing-{0}' -f [guid]::NewGuid().ToString('N'))
Assert-TestSandboxPath -Sandbox $sandbox -Path $missing
$good = New-TestSandboxItem -Sandbox $sandbox -Name "RemovePipeGood$Set"
Add-NTFSAudit -Path $good @entry -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
Add-NTFSAudit -Path $good -Account $keeper -AccessRights Delete -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$daclBefore = Get-TestDaclSddl -Path $good
$items = @(
[pscustomobject] (@{ FullName = $missing; Account = $probe; AccessRights = 'ReadData' } + $ExtraProperties)
[pscustomobject] (@{ FullName = $good; Account = $probe; AccessRights = 'ReadData' } + $ExtraProperties)
)
$result = @($items | Remove-NTFSAudit @Named -PassThru -ErrorVariable auditErrors -ErrorAction SilentlyContinue)
$auditErrors | Should -HaveCount 1
$auditErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadFileError,*'
$auditErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$auditErrors[0].TargetObject | Should -Be $missing
$result | Should -Not -BeNullOrEmpty
$result | ForEach-Object -Process { $_.FullName | Should -Be $good }
(Get-TestAccountAuditRule -Acl (Get-Acl -LiteralPath $good -Audit) -Account $probe) | Should -BeNullOrEmpty
(Get-TestAccountAuditRule -Acl (Get-Acl -LiteralPath $good -Audit) -Account $keeper) | Should -HaveCount 1
Get-TestDaclSddl -Path $good | Should -BeExactly $daclBefore
}
}
Context 'Binding -SecurityDescriptor from the pipeline by property name' {
It "Should remove the audit entry for the piped <Set> object that has an audit section, write a ReadSecurityError for the one that does not, and keep the other account's entry" -ForEach @(
@{ Set = 'SDSimple'; ExtraProperties = @{ AppliesTo = 'ThisFolderOnly' } }
@{ Set = 'SDComplex'; ExtraProperties = @{ InheritanceFlags = 'None'; PropagationFlags = 'None' } }
) -Skip:(-not $canReadAudit) {
$badFile = New-TestSandboxItem -Sandbox $sandbox -Name "RemovePipeSDBad$Set"
$sdBad = Get-TestAccessOnlyDescriptor -Path $badFile
$goodFile = New-TestSandboxItem -Sandbox $sandbox -Name "RemovePipeSDGood$Set"
Add-NTFSAudit -Path $goodFile @entry -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
Add-NTFSAudit -Path $goodFile -Account $keeper -AccessRights Delete -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$sdGood = Get-NTFSSecurityDescriptor -Path $goodFile -ErrorAction Stop
$items = @(
[pscustomobject] (@{ SecurityDescriptor = $sdBad; Account = $probe; AccessRights = 'ReadData' } + $ExtraProperties)
[pscustomobject] (@{ SecurityDescriptor = $sdGood; Account = $probe; AccessRights = 'ReadData' } + $ExtraProperties)
)
$result = @($items | Remove-NTFSAudit -PassThru -ErrorVariable auditErrors -ErrorAction SilentlyContinue)
$auditErrors | Should -HaveCount 1
$auditErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadSecurityError,*'
$auditErrors[0].TargetObject | Should -Be $sdBad
$result | Should -Not -BeNullOrEmpty
$result | ForEach-Object -Process { $_.FullName | Should -Be $goodFile }
(Get-TestAccountAuditRule -Acl $sdGood.SecurityDescriptor -Account $probe) | Should -BeNullOrEmpty
(Get-TestAccountAuditRule -Acl $sdGood.SecurityDescriptor -Account $keeper) | Should -HaveCount 1
}
}
# As for Add-NTFSAudit, the property AppliesTo of the piped object selects PathSimple, and the entry that the cmdlet
# addresses is the one of the scope it names: the rest of an entry of a wider scope stays.
Context 'Choosing the parameter set of an object bound through the pipeline by property name' {
It 'Should leave <Meaning> of an audit entry that applies to this folder, subfolders, and files when the piped object that has <Shape> removes its rights' -ForEach @(
@{ Name = 'RemovePipedAuditThisFolderOnly'; Shape = 'AppliesTo ThisFolderOnly'; Extra = @{ AppliesTo = 'ThisFolderOnly' }; Meaning = 'the part that only subfolders and files inherit'; Left = 'ContainerInherit, ObjectInherit/InheritOnly' }
@{ Name = 'RemovePipedAuditNoScope'; Shape = 'no scope'; Extra = @{}; Meaning = 'nothing'; Left = '' }
) -Skip:(-not $canReadAudit) {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name $Name -Directory
Add-NTFSAudit -Path $folder @entry -ErrorAction Stop
[pscustomobject] (@{ FullName = $folder; Account = $probe; AccessRights = 'ReadData' } + $Extra) | Remove-NTFSAudit -ErrorAction Stop
Get-TestAuditScope -Acl (Get-Acl -LiteralPath $folder -Audit) | Should -BeExactly $Left
}
It 'Should reject a piped object that has both AppliesTo and InheritanceFlags with an AmbiguousParameterSet error' {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'RemovePipedAuditBoth' -Directory
$object = [pscustomobject]@{ FullName = $folder; Account = $probe; AccessRights = 'ReadData'; AppliesTo = 'ThisFolderOnly'; InheritanceFlags = 'None' }
{ $object | Remove-NTFSAudit -ErrorAction Stop } | Should -Throw -ErrorId 'AmbiguousParameterSet*'
}
}
# As for Add-NTFSAudit: the scope that the cmdlet derives from AppliesTo must not stay for the next object.
Context 'Objects with different scopes in one pipeline' {
It 'Should remove from each piped path object the entry of its own scope: AppliesTo, none, AppliesTo, none' -Skip:(-not $canReadAudit) {
$folders = @('RemoveMixedAuditFirst', 'RemoveMixedAuditSecond', 'RemoveMixedAuditThird', 'RemoveMixedAuditFourth' | ForEach-Object -Process {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory
Add-NTFSAudit -Path $folder @entry -ErrorAction Stop
$folder
})
@(
[pscustomobject] ($entry + @{ FullName = $folders[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ FullName = $folders[1] })
[pscustomobject] ($entry + @{ FullName = $folders[2]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ FullName = $folders[3] })
) | Remove-NTFSAudit -ErrorAction Stop
$remaining = $folders | ForEach-Object -Process { Get-TestAuditScope -Acl (Get-Acl -LiteralPath $_ -Audit) }
$remaining -join '|' | Should -BeExactly 'ContainerInherit, ObjectInherit/InheritOnly||ContainerInherit, ObjectInherit/InheritOnly|'
}
It 'Should remove from each piped descriptor object the entry of its own scope: AppliesTo, then none' -Skip:(-not $canReadAudit) {
$folders = @('RemoveMixedAuditSDFirst', 'RemoveMixedAuditSDSecond' | ForEach-Object -Process {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name $_ -Directory
Add-NTFSAudit -Path $folder @entry -ErrorAction Stop
$folder
})
$descriptors = @(Get-NTFSSecurityDescriptor -Path $folders -ErrorAction Stop)
@(
[pscustomobject] ($entry + @{ SecurityDescriptor = $descriptors[0]; AppliesTo = 'ThisFolderOnly' })
[pscustomobject] ($entry + @{ SecurityDescriptor = $descriptors[1] })
) | Remove-NTFSAudit -ErrorAction Stop
$remaining = $descriptors | ForEach-Object -Process { Get-TestAuditScope -Acl $_.SecurityDescriptor }
$remaining -join '|' | Should -BeExactly 'ContainerInherit, ObjectInherit/InheritOnly|'
}
}
Context 'Without -RemoveSpecific' {
# Judged-audit-notes.md: "the Modify entry keeps the other rights (probe first, then pin)".
It 'Should narrow an entry that grants more rights than it removes, instead of deleting it' -Skip:(-not $canReadAudit) {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'RemoveNarrow'
Add-NTFSAudit -Path $file -Account $probe -AccessRights Modify -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
Add-NTFSAudit -Path $file -Account $keeper -AccessRights Delete -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
Remove-NTFSAudit -Path $file @entry -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$probeRule = Get-TestAccountAuditRule -Acl (Get-Acl -LiteralPath $file -Audit) -Account $probe
$probeRule | Should -HaveCount 1
$probeRule[0].FileSystemRights.HasFlag([System.Security.AccessControl.FileSystemRights]::ReadData) | Should -BeFalse
$probeRule[0].FileSystemRights.HasFlag([System.Security.AccessControl.FileSystemRights]::Delete) | Should -BeTrue
(Get-TestAccountAuditRule -Acl (Get-Acl -LiteralPath $file -Audit) -Account $keeper) | Should -HaveCount 1
}
}
Context 'Direct call of -Path with -AppliesTo' {
# Remove-NTFSAudit PathSimple (judged-audit.csv): every existing call binds it only through a splat
# (PermissionScopes.Tests.ps1); this one names the set's parameters directly.
It 'Should remove the entry from the path when -Path, -Account, -AccessRights, and -AppliesTo are all named directly' -Skip:(-not $canReadAudit) {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'RemoveDirectPathSimple'
Add-NTFSAudit -Path $file -Account $probe -AccessRights ReadData -AppliesTo ThisFolderOnly -ErrorAction Stop
Add-NTFSAudit -Path $file -Account $keeper -AccessRights Delete -AppliesTo ThisFolderOnly -ErrorAction Stop
$result = @(Remove-NTFSAudit -Path $file -Account $probe -AccessRights ReadData -AppliesTo ThisFolderOnly -PassThru -ErrorAction Stop)
$result | Should -Not -BeNullOrEmpty
$result | ForEach-Object -Process { $_ | Should -BeOfType [Security2.FileSystemAuditRule2] }
(Get-TestAccountAuditRule -Acl (Get-Acl -LiteralPath $file -Audit) -Account $probe) | Should -BeNullOrEmpty
(Get-TestAccountAuditRule -Acl (Get-Acl -LiteralPath $file -Audit) -Account $keeper) | Should -HaveCount 1
}
}
Context 'Direct call of -SecurityDescriptor with -AppliesTo' {
# Remove-NTFSAudit SDSimple (judged-audit.csv): every existing call binds it only through a splat
# (PermissionScopes.Tests.ps1); this one names the set's parameters directly.
It 'Should remove the entry from the descriptor when -SecurityDescriptor, -Account, -AccessRights, and -AppliesTo are all named directly' -Skip:(-not $canReadAudit) {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'RemoveDirectSDSimple'
$sd = Get-NTFSSecurityDescriptor -Path $file -ErrorAction Stop
Add-NTFSAudit -SecurityDescriptor $sd -Account $probe -AccessRights ReadData -AppliesTo ThisFolderOnly -ErrorAction Stop
Add-NTFSAudit -SecurityDescriptor $sd -Account $keeper -AccessRights Delete -AppliesTo ThisFolderOnly -ErrorAction Stop
$result = @(Remove-NTFSAudit -SecurityDescriptor $sd -Account $probe -AccessRights ReadData -AppliesTo ThisFolderOnly -PassThru -ErrorAction Stop)
$result | Should -Not -BeNullOrEmpty
$result | ForEach-Object -Process { $_ | Should -BeOfType [Security2.FileSystemAuditRule2] }
(Get-TestAccountAuditRule -Acl $sd.SecurityDescriptor -Account $probe) | Should -BeNullOrEmpty
(Get-TestAccountAuditRule -Acl $sd.SecurityDescriptor -Account $keeper) | Should -HaveCount 1
}
}
}
Describe 'Clear-NTFSAudit' {
Context 'Taking paths from the pipeline' {
It 'Should clear the audit entries of each path taken from the pipeline and leave the DACL of each unchanged' -Skip:(-not $canReadAudit) {
$first = New-TestSandboxItem -Sandbox $sandbox -Name 'ClearPipeFirst'
$second = New-TestSandboxItem -Sandbox $sandbox -Name 'ClearPipeSecond'
foreach ($path in $first, $second) {
Add-NTFSAudit -Path $path @entry -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
}
$daclBefore = @((Get-TestDaclSddl -Path $first), (Get-TestDaclSddl -Path $second))
$first, $second | Clear-NTFSAudit -ErrorVariable clearErrors -ErrorAction SilentlyContinue
$clearErrors | Should -BeNullOrEmpty
@(Get-NTFSAudit -Path $first -ExcludeInherited) | Should -BeNullOrEmpty
@(Get-NTFSAudit -Path $second -ExcludeInherited) | Should -BeNullOrEmpty
Get-TestDaclSddl -Path $first | Should -BeExactly $daclBefore[0]
Get-TestDaclSddl -Path $second | Should -BeExactly $daclBefore[1]
}
}
Context 'With -DisableInheritance' {
# judged-audit.csv: "-DisableInheritance on a path is passed (Audit.Tests.ps1:629) but its end state
# (protected SACL, no copied inherited entries) is never asserted."
It "Should protect the SACL and not copy the parent's inherited entry when clearing a child path" -Skip:(-not $canReadAudit) {
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'ClearDisableParent' -Directory
Add-NTFSAudit -Path $parent -Account $keeper -AccessRights Delete -AppliesTo ThisFolderAndFiles -AuditFlags Success -ErrorAction Stop
$child = Join-Path -Path $parent -ChildPath 'Child.txt'
Assert-TestSandboxPath -Sandbox $sandbox -Path $child
Set-Content -LiteralPath $child -Value 'Child'
Add-NTFSAudit -Path $child @entry -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
# Precondition: the parent's rule really is inherited onto the child before the test clears it.
@(Get-NTFSAudit -Path $child -ExcludeExplicit) | Should -HaveCount 1
$daclBefore = Get-TestDaclSddl -Path $child
Clear-NTFSAudit -Path $child -DisableInheritance -ErrorVariable clearErrors -ErrorAction SilentlyContinue
$clearErrors | Should -BeNullOrEmpty
(Get-TestAuditAcl -Path $child).AreAuditRulesProtected | Should -BeTrue
@((Get-Acl -LiteralPath $child -Audit).GetAuditRules($true, $true, $sidType)) | Should -BeNullOrEmpty
Get-TestDaclSddl -Path $child | Should -BeExactly $daclBefore
}
}
Context 'Binding -SecurityDescriptor from the pipeline' {
It 'Should clear each piped descriptor that has an audit section and continue past one that does not' -Skip:(-not $canReadAudit) {
$badFile = New-TestSandboxItem -Sandbox $sandbox -Name 'ClearPipeSDBad'
$sdBad = Get-TestAccessOnlyDescriptor -Path $badFile
$goodFile = New-TestSandboxItem -Sandbox $sandbox -Name 'ClearPipeSDGood'
Add-NTFSAudit -Path $goodFile @entry -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$sdGood = Get-NTFSSecurityDescriptor -Path $goodFile -ErrorAction Stop
$auditBefore = Get-TestAuditSddl -Path $goodFile
$daclBefore = Get-TestDaclSddl -Path $goodFile
$sdBad, $sdGood | Clear-NTFSAudit -ErrorVariable clearErrors -ErrorAction SilentlyContinue
$clearErrors | Should -HaveCount 1
$clearErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadSecurityError,*'
$clearErrors[0].TargetObject | Should -Be $sdBad
@($sdGood.SecurityDescriptor.GetAuditRules($true, $false, $sidType)) | Should -BeNullOrEmpty
Get-TestAuditSddl -Path $goodFile | Should -BeExactly $auditBefore
Set-NTFSSecurityDescriptor -SecurityDescriptor $sdGood -ErrorAction Stop
@(Get-NTFSAudit -Path $goodFile -ExcludeInherited) | Should -BeNullOrEmpty
Get-TestDaclSddl -Path $goodFile | Should -BeExactly $daclBefore
}
}
}
Describe 'Get-NTFSAudit' {
Context 'With several paths' {
# judged-audit.csv observation: Audit.Tests.ps1:70-73 no longer reproduces a failing path followed by one
# that succeeds (the deny entry blocks the DACL, not the SACL that the cmdlet reads). A missing path does.
It 'Should return the entries of the existing path in either position and a ReadFileError, category OpenError, for the missing one' -Skip:(-not $canReadAudit) {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'GetAuditFolder' -Directory
Add-NTFSAudit -Path $folder -Account $probe -AccessRights ReadData -AuditFlags Success -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$missing = Join-Path -Path $sandbox -ChildPath ('GetAuditMissing-{0}' -f [guid]::NewGuid().ToString('N'))
Assert-TestSandboxPath -Sandbox $sandbox -Path $missing
$forward = @(Get-NTFSAudit -Path $missing, $folder -ErrorVariable forwardErrors -ErrorAction SilentlyContinue)
$backward = @(Get-NTFSAudit -Path $folder, $missing -ErrorVariable backwardErrors -ErrorAction SilentlyContinue)
foreach ($errors in $forwardErrors, $backwardErrors) {
$errors | Should -HaveCount 1
$errors[0].FullyQualifiedErrorId | Should -BeLike 'ReadFileError,*'
$errors[0].CategoryInfo.Category | Should -Be 'OpenError'
$errors[0].TargetObject | Should -Be $missing
}
foreach ($result in $forward, $backward) {
$result | Should -HaveCount 1
$result[0] | Should -BeOfType [Security2.FileSystemAuditRule2]
$result[0].FullName | Should -Be $folder
$result[0].Account.Sid | Should -Be $probe
$result[0].AccessRights.HasFlag([Security2.FileSystemRights2]::ReadData) | Should -BeTrue
$result[0].AuditFlags | Should -Be ([System.Security.AccessControl.AuditFlags]::Success)
$result[0].IsInherited | Should -BeFalse
$result[0].InheritanceEnabled | Should -Be (-not (Get-Acl -LiteralPath $folder -Audit).AreAuditRulesProtected)
}
}
}
Context 'Taking paths from the pipeline' {
It 'Should return the entries of each path object taken from the pipeline by value' -Skip:(-not $canReadAudit) {
$first = New-TestSandboxItem -Sandbox $sandbox -Name 'GetAuditPipeFirst'
$second = New-TestSandboxItem -Sandbox $sandbox -Name 'GetAuditPipeSecond'
foreach ($path in $first, $second) {
Add-NTFSAudit -Path $path @entry -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
}
$result = @(Get-Item2 -Path $first, $second | Get-NTFSAudit -ErrorAction Stop)
($result.FullName | Sort-Object) -join '|' | Should -Be (($first, $second | Sort-Object) -join '|')
}
}
Context 'When the audit entries cannot be read' {
# judged-audit.csv: Audit.Tests.ps1:48 asserts the ErrorId only; this adds the category and the target.
It 'Should write a ReadSecurityError with category OpenError and the path as target without the Security privilege' -Skip:$canReadAudit {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'GetAuditNoPrivilege'
$entries = @(Get-NTFSAudit -Path $file -ErrorVariable auditErrors -ErrorAction SilentlyContinue)
$entries | Should -BeNullOrEmpty
$auditErrors | Should -HaveCount 1
$auditErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadSecurityError,*'
$auditErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$auditErrors[0].TargetObject | Should -Be $file
}
}
Context 'Binding -SecurityDescriptor from the pipeline' {
It 'Should return the entries of the piped descriptor that has an audit section and continue past one that does not' -Skip:(-not $canReadAudit) {
$badFile = New-TestSandboxItem -Sandbox $sandbox -Name 'GetAuditSDBad'
$sdBad = Get-TestAccessOnlyDescriptor -Path $badFile
$goodFile = New-TestSandboxItem -Sandbox $sandbox -Name 'GetAuditSDGood'
Add-NTFSAudit -Path $goodFile @entry -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$expected = @(Get-NTFSAudit -Path $goodFile -ErrorAction Stop | ForEach-Object -Process { '{0}|{1}|{2}' -f $_.Account.Sid, $_.AccessRights, $_.AuditFlags })
$sdGood = Get-NTFSSecurityDescriptor -Path $goodFile -ErrorAction Stop
$result = @($sdBad, $sdGood | Get-NTFSAudit -ErrorVariable auditErrors -ErrorAction SilentlyContinue)
$auditErrors | Should -HaveCount 1
$auditErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadSecurityError,*'
$auditErrors[0].CategoryInfo.Category | Should -Be 'InvalidData'
$auditErrors[0].TargetObject | Should -Be $sdBad
$result | Should -Not -BeNullOrEmpty
($result | ForEach-Object -Process { '{0}|{1}|{2}' -f $_.Account.Sid, $_.AccessRights, $_.AuditFlags }) -join ';' | Should -Be ($expected -join ';')
}
}
}
Describe 'Get-NTFSOrphanedAudit' {
Context 'Taking paths from the pipeline' {
It 'Should return the orphaned entries of each path taken from the pipeline and write a ReadError, category OpenError, for one that does not exist' -Skip:(-not $canReadAudit) {
$orphaned = New-TestSandboxItem -Sandbox $sandbox -Name 'OrphanedPipe'
Add-NTFSAudit -Path $orphaned -Account 'S-1-5-21-1-2-3-9001' -AccessRights ReadData -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$normal = New-TestSandboxItem -Sandbox $sandbox -Name 'NormalPipe'
Add-NTFSAudit -Path $normal @entry -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$missing = Join-Path -Path $sandbox -ChildPath ('OrphanedMissing-{0}' -f [guid]::NewGuid().ToString('N'))
Assert-TestSandboxPath -Sandbox $sandbox -Path $missing
$result = @($missing, $orphaned, $normal | Get-NTFSOrphanedAudit -ErrorVariable orphanedErrors -ErrorAction SilentlyContinue)
$orphanedErrors | Should -HaveCount 1
$orphanedErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadError,*'
$orphanedErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$orphanedErrors[0].TargetObject | Should -Be $missing
$result | Should -HaveCount 1
$result[0].FullName | Should -Be $orphaned
$result[0].Account.Sid | Should -Be 'S-1-5-21-1-2-3-9001'
}
}
Context 'Binding -SecurityDescriptor from the pipeline' {
It 'Should return the orphaned entries of the piped descriptor that has an audit section and continue past one that does not' -Skip:(-not $canReadAudit) {
$badFile = New-TestSandboxItem -Sandbox $sandbox -Name 'OrphanedSDBad'
$sdBad = Get-TestAccessOnlyDescriptor -Path $badFile
$orphanedFile = New-TestSandboxItem -Sandbox $sandbox -Name 'OrphanedSDGood'
Add-NTFSAudit -Path $orphanedFile -Account 'S-1-5-21-1-2-3-9002' -AccessRights ReadData -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$sdOrphaned = Get-NTFSSecurityDescriptor -Path $orphanedFile -ErrorAction Stop
$result = @($sdBad, $sdOrphaned | Get-NTFSOrphanedAudit -ErrorVariable orphanedErrors -ErrorAction SilentlyContinue)
$orphanedErrors | Should -HaveCount 1
$orphanedErrors[0].TargetObject | Should -Be $sdBad
$result | Should -HaveCount 1
$result[0] | Should -BeOfType [Security2.FileSystemAuditRule2]
$result[0].Account.Sid | Should -Be 'S-1-5-21-1-2-3-9002'
$result[0].FullName | Should -Be $orphanedFile
}
}
Context 'Direct call of -SecurityDescriptor' {
# Get-NTFSOrphanedAudit SD (judged-audit.csv): both existing calls bind it only because PowerShell resolves
# a piped object with a SecurityDescriptor property to this parameter (Audit.Tests.ps1:243, :294); this one
# names it directly.
It 'Should return the orphaned entries when -SecurityDescriptor is named directly' -Skip:(-not $canReadAudit) {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'OrphanedDirectSD'
Add-NTFSAudit -Path $file -Account 'S-1-5-21-1-2-3-9003' -AccessRights ReadData -InheritanceFlags None -PropagationFlags None -ErrorAction Stop
$sd = Get-NTFSSecurityDescriptor -Path $file -ErrorAction Stop
$result = @(Get-NTFSOrphanedAudit -SecurityDescriptor $sd -ErrorAction Stop)
$result | Should -HaveCount 1
$result[0] | Should -BeOfType [Security2.FileSystemAuditRule2]
$result[0].Account.Sid | Should -Be 'S-1-5-21-1-2-3-9003'
$result[0].FullName | Should -Be $file
}
}
}

751
Tests/ParameterSets.Inheritance.Tests.ps1

@ -0,0 +1,751 @@
<#
Closes TestNeeded gaps of the judged parameter-set matrix (judged-inheritance.csv / judged-inheritance-notes.md,
scanned at HEAD 6696f68) for the inheritance, owner, and security-descriptor cmdlets: Disable/Enable-NTFSAccessInheritance,
Disable/Enable-NTFSAuditInheritance, Get/Set-NTFSInheritance, Get/Set-NTFSOwner, Get-NTFSSecurityDescriptor. The module
built in NTFSSecurity\bin\Release runs on files and folders in a sandbox folder. Every assertion reads state with .NET
(Get-Acl, Get-Acl -Audit) or compares an independent oracle, asserts an ErrorId/category/target triple, exercises a
pipeline that no existing test used, or checks continuation to the next item/descriptor; none of it repeats what
Inheritance.Tests.ps1, Owner.Tests.ps1, SecurityDescriptor.Tests.ps1, SecurityDescriptorSets.Tests.ps1, or
PathErrors.Tests.ps1 already assert. Tests that change or read the audit section need the Security privilege and skip
without it; CI runs them elevated too. This file does not test the 17 shared owner-restore handlers against what a
later command raises there (an open maintainer decision, see systemPatterns.md), the abandoned PrivilegeEnabler, or
any Decision 22 behavior, and it does not add a new gap test for Set-NTFSSecurityDescriptor, whose own row is judged
GapKind None.
#>
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
'PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'Pester shares variables between blocks.'
)]
param ()
BeforeDiscovery {
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers.psm1') -Force
$canChangeAudit = Test-PrivilegeHeld -Name 'SeSecurityPrivilege'
$holdsRestorePrivilege = Test-PrivilegeHeld -Name 'SeRestorePrivilege'
$canBypassDeny = Test-PrivilegeHeld -Name 'SeBackupPrivilege'
# State: file/folder x Enable(Disable=false/Enable=true) x Remove, read back with Get-Acl, not with Get-NTFSAccess.
$accessOracleCases = @(foreach ($type in 'file', 'folder') {
foreach ($enable in $false, $true) {
foreach ($remove in $false, $true) {
@{ Type = $type; Enable = $enable; Remove = $remove }
}
}
})
# State: the same transitions for the SACL, read back with Get-Acl -Audit, not with Get-NTFSAudit/Get-NTFSInheritance.
$auditOracleCases = @(foreach ($type in 'file', 'folder') {
foreach ($enable in $false, $true) {
foreach ($remove in $false, $true) {
@{ Type = $type; Enable = $enable; Remove = $remove }
}
}
})
# State: the -RemoveInheritedAccessRules/-RemoveExplicitAccessRules switches with a -SecurityDescriptor, which
# SecurityDescriptorSets.Tests.ps1 covers only without the switch (Disable) or without any explicit entry (Enable).
$sdAccessSwitchCases = @(
@{ Command = 'Disable-NTFSAccessInheritance'; SwitchName = 'RemoveInheritedAccessRules'; Remove = $true }
@{ Command = 'Enable-NTFSAccessInheritance'; SwitchName = 'RemoveExplicitAccessRules'; Remove = $false }
@{ Command = 'Enable-NTFSAccessInheritance'; SwitchName = 'RemoveExplicitAccessRules'; Remove = $true }
)
# Error: a fully denied write with -PassThru, asserting the category and the next item's new state together (S1).
$deniedWriteCases = @(
@{ Command = 'Disable-NTFSAccessInheritance'; Parameters = @{}; ErrorId = 'ModifySdError'; PreDisable = $false; ExpectedFlag = $false }
@{ Command = 'Enable-NTFSAccessInheritance'; Parameters = @{}; ErrorId = 'ModifySdError'; PreDisable = $true; ExpectedFlag = $true }
@{ Command = 'Set-NTFSInheritance'; Parameters = @{ AccessInheritanceEnabled = $false }; ErrorId = 'ModifySdError'; PreDisable = $false; ExpectedFlag = $false }
)
# Error: RestoreOwnerError of these three Path cmdlets, none of which has a test for it today (S3).
$restoreOwnerCases = @(
@{ Command = 'Disable-NTFSAccessInheritance'; Parameters = @{}; PreDisable = $false; ExpectedProtected = $true }
@{ Command = 'Enable-NTFSAccessInheritance'; Parameters = @{}; PreDisable = $true; ExpectedProtected = $false }
@{ Command = 'Set-NTFSInheritance'; Parameters = @{ AccessInheritanceEnabled = $false }; PreDisable = $false; ExpectedProtected = $true }
)
# Error: a missing path, asserting the OpenError category and exactly one object for the next path (S1 + S6).
$missingPathOpenErrorCases = @(
@{ Command = 'Get-NTFSInheritance'; ErrorId = 'ReadFileError' }
@{ Command = 'Get-NTFSSecurityDescriptor'; ErrorId = 'ReadFileError' }
)
# Error: Set-NTFSOwner id/category/target together, for a missing path and for a refused owner (S1 + S6).
$setOwnerErrorCases = @(
@{ Scenario = 'Missing'; ErrorId = 'ReadFileError'; Category = 'OpenError' }
@{ Scenario = 'Refused'; ErrorId = 'SetOwnerError'; Category = 'WriteError' }
)
# Pipeline: Get-ChildItem2 piped into the four Path-set inheritance cmdlets with -PassThru, access and audit.
$pipedInheritanceCases = @(
@{ Command = 'Disable-NTFSAccessInheritance'; Scope = 'access'; PreDisable = $false; Expected = $false }
@{ Command = 'Enable-NTFSAccessInheritance'; Scope = 'access'; PreDisable = $true; Expected = $true }
@{ Command = 'Disable-NTFSAuditInheritance'; Scope = 'audit'; PreDisable = $false; Expected = $false }
@{ Command = 'Enable-NTFSAuditInheritance'; Scope = 'audit'; PreDisable = $true; Expected = $true }
)
# Pipeline: two security descriptors piped into the four SecurityDescriptor-set inheritance cmdlets.
$pipedInheritanceSdCases = @(
@{ Command = 'Disable-NTFSAccessInheritance'; Scope = 'access'; PreDisable = $false; Expected = $false }
@{ Command = 'Enable-NTFSAccessInheritance'; Scope = 'access'; PreDisable = $true; Expected = $true }
@{ Command = 'Disable-NTFSAuditInheritance'; Scope = 'audit'; PreDisable = $false; Expected = $false }
@{ Command = 'Enable-NTFSAuditInheritance'; Scope = 'audit'; PreDisable = $true; Expected = $true }
)
}
BeforeAll {
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers.psm1') -Force
$modulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\NTFSSecurity\bin\Release\NTFSSecurity.psd1'
Import-Module -Name $modulePath -Force -ErrorAction Stop
$sandbox = New-TestSandbox -Name 'ParameterSetsInheritance'
Push-Location -LiteralPath $sandbox
$sidType = [System.Security.Principal.SecurityIdentifier]
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value
# An owner that the user can assign only with the Restore privilege
$trustedInstaller = 'S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464'
$privateData = (Get-Module -Name NTFSSecurity).PrivateData
$enablePrivileges = $privateData['EnablePrivileges']
# Recomputed here (not only in BeforeDiscovery): an It body runs in the Run phase, which does not see
# BeforeDiscovery variables, and the two piped-inheritance tests need this flag inside the body, not only in -Skip.
$canChangeAudit = Test-PrivilegeHeld -Name 'SeSecurityPrivilege'
$holdsRestorePrivilege = Test-PrivilegeHeld -Name 'SeRestorePrivilege'
function Get-TestAcl {
# .NET, because Get-Acl of an elevated Windows PowerShell reads also items that deny reading their permissions.
# .NET Core has the method as an extension method. Matches the helper of PathErrors.Tests.ps1.
param ([string] $Path)
$info = New-Object -TypeName 'System.IO.FileInfo' -ArgumentList $Path
if ($PSVersionTable.PSEdition -eq 'Desktop') {
$info.GetAccessControl()
}
else {
[System.IO.FileSystemAclExtensions]::GetAccessControl($info)
}
}
function Get-TestAuditAcl {
# The SACL read alone, through .NET. Get-Acl -Audit reads it together with the other sections, and on a domain
# member that reports the SACL of an item without audit entries as protected from inheritance, which is not its
# state (see Security2\FileSystem\FileSystemSecurity2.cs). Matches the helper of ParameterSets.Audit.Tests.ps1.
param ([string] $Path)
$sections = [System.Security.AccessControl.AccessControlSections]::Audit
$info = if (Test-Path -LiteralPath $Path -PathType Container) {
New-Object -TypeName 'System.IO.DirectoryInfo' -ArgumentList $Path
}
else {
New-Object -TypeName 'System.IO.FileInfo' -ArgumentList $Path
}
if ($PSVersionTable.PSEdition -eq 'Desktop') {
$info.GetAccessControl($sections)
}
else {
[System.IO.FileSystemAclExtensions]::GetAccessControl($info, $sections)
}
}
}
AfterAll {
$privateData['EnablePrivileges'] = $enablePrivileges
Pop-Location
Remove-TestSandbox -Sandbox $sandbox
Remove-Module -Name NTFSSecurity -Force -ErrorAction SilentlyContinue
}
Describe 'State: independent .NET oracles for inheritance transitions and descriptor-only changes' {
It 'Should set the DACL protected flag to <Enable> and the explicit/inherited rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl' -ForEach $accessOracleCases {
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'AccessOracleParent' -Directory
$path = Join-Path -Path $parent -ChildPath 'Child'
Assert-TestSandboxPath -Sandbox $sandbox -Path $path
$parentAccount = 'S-1-5-21-1-2-3-4921'
$childAccount = 'S-1-5-21-1-2-3-4922'
Add-NTFSAccess -Path $parent -Account $parentAccount -AccessRights ReadData -ErrorAction Stop
if ($Type -eq 'folder') { New-Item -ItemType Directory -Path $path | Out-Null } else { Set-Content -LiteralPath $path -Value 'Child' }
Add-NTFSAccess -Path $path -Account $childAccount -AccessRights Delete -AppliesTo ThisFolderOnly -ErrorAction Stop
$inheritedBefore = @((Get-Acl -LiteralPath $path).GetAccessRules($false, $true, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq $parentAccount })
$inheritedBefore | Should -HaveCount 1
if ($Enable) {
Disable-NTFSAccessInheritance -Path $path -RemoveInheritedAccessRules -ErrorAction Stop
$parameters = @{ RemoveExplicitAccessRules = $Remove }
$command = 'Enable-NTFSAccessInheritance'
}
else {
$parameters = @{ RemoveInheritedAccessRules = $Remove }
$command = 'Disable-NTFSAccessInheritance'
}
& $command -Path $path @parameters -ErrorAction Stop
$acl = Get-Acl -LiteralPath $path
$acl.AreAccessRulesProtected | Should -Be (-not $Enable)
$parentRules = @($acl.GetAccessRules($true, $true, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq $parentAccount })
if ($Enable) {
$parentRules | Should -HaveCount 1
$parentRules[0].IsInherited | Should -BeTrue
}
elseif ($Remove) {
$parentRules | Should -BeNullOrEmpty
}
else {
$parentRules | Should -HaveCount 1
$parentRules[0].IsInherited | Should -BeFalse
}
$childRules = @($acl.GetAccessRules($true, $true, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq $childAccount })
if ($Enable -and $Remove) { $childRules | Should -BeNullOrEmpty } else { $childRules | Should -HaveCount 1 }
}
It 'Should set the SACL protected flag to <Enable> and the explicit/inherited audit-rule counts for -Remove=<Remove> on a <Type>, read with Get-Acl -Audit' -Skip:(-not $canChangeAudit) -ForEach $auditOracleCases {
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'AuditOracleParent' -Directory
$path = Join-Path -Path $parent -ChildPath 'Child'
Assert-TestSandboxPath -Sandbox $sandbox -Path $path
$parentAccount = 'S-1-5-21-1-2-3-4931'
$childAccount = 'S-1-5-21-1-2-3-4932'
Add-NTFSAudit -Path $parent -Account $parentAccount -AccessRights ReadData -AuditFlags Success -ErrorAction Stop
if ($Type -eq 'folder') { New-Item -ItemType Directory -Path $path | Out-Null } else { Set-Content -LiteralPath $path -Value 'Child' }
Add-NTFSAudit -Path $path -Account $childAccount -AccessRights Delete -AuditFlags Failure -AppliesTo ThisFolderOnly -ErrorAction Stop
$inheritedBefore = @((Get-Acl -LiteralPath $path -Audit).GetAuditRules($false, $true, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq $parentAccount })
$inheritedBefore | Should -HaveCount 1
$daclBefore = (Get-Acl -LiteralPath $path).GetSecurityDescriptorSddlForm('Access')
if ($Enable) {
Disable-NTFSAuditInheritance -Path $path -RemoveInheritedAuditRules -ErrorAction Stop
$parameters = @{ RemoveExplicitAuditRules = $Remove }
$command = 'Enable-NTFSAuditInheritance'
}
else {
$parameters = @{ RemoveInheritedAuditRules = $Remove }
$command = 'Disable-NTFSAuditInheritance'
}
& $command -Path $path @parameters -ErrorAction Stop
$acl = Get-Acl -LiteralPath $path -Audit
$acl.AreAuditRulesProtected | Should -Be (-not $Enable)
$parentRules = @($acl.GetAuditRules($true, $true, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq $parentAccount })
if ($Enable) {
$parentRules | Should -HaveCount 1
$parentRules[0].IsInherited | Should -BeTrue
}
elseif ($Remove) {
$parentRules | Should -BeNullOrEmpty
}
else {
$parentRules | Should -HaveCount 1
$parentRules[0].IsInherited | Should -BeFalse
}
$childRules = @($acl.GetAuditRules($true, $true, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq $childAccount })
if ($Enable -and $Remove) { $childRules | Should -BeNullOrEmpty } else { $childRules | Should -HaveCount 1 }
(Get-Acl -LiteralPath $path).GetSecurityDescriptorSddlForm('Access') | Should -BeExactly $daclBefore
}
It '<Command> -SecurityDescriptor should change the in-memory access entries per -<SwitchName>:<Remove>, applied to the item only after Set-NTFSSecurityDescriptor writes it' -ForEach $sdAccessSwitchCases {
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'SdSwitchParent' -Directory
$file = Join-Path -Path $parent -ChildPath 'Child'
Assert-TestSandboxPath -Sandbox $sandbox -Path $file
Add-NTFSAccess -Path $parent -Account 'S-1-5-21-1-2-3-4941' -AccessRights ReadData -ErrorAction Stop
Set-Content -LiteralPath $file -Value 'Child'
if ($Command -eq 'Enable-NTFSAccessInheritance') {
Add-NTFSAccess -Path $file -Account 'S-1-5-21-1-2-3-4942' -AccessRights Delete -AppliesTo ThisFolderOnly -ErrorAction Stop
Disable-NTFSAccessInheritance -Path $file -RemoveInheritedAccessRules -ErrorAction Stop
}
$before = (Get-Acl -LiteralPath $file).Sddl
$sd = Get-NTFSSecurityDescriptor -Path $file
$switchParameters = @{ $SwitchName = $Remove }
& $Command -SecurityDescriptor $sd @switchParameters -ErrorAction Stop
$sd.SecurityDescriptor.AreAccessRulesProtected | Should -Be ($Command -eq 'Disable-NTFSAccessInheritance')
(Get-Acl -LiteralPath $file).Sddl | Should -BeExactly $before
Set-NTFSSecurityDescriptor -SecurityDescriptor $sd -ErrorAction Stop
$acl = Get-Acl -LiteralPath $file
if ($Command -eq 'Disable-NTFSAccessInheritance') {
$acl.AreAccessRulesProtected | Should -BeTrue
$inherited = @($acl.GetAccessRules($false, $true, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq 'S-1-5-21-1-2-3-4941' })
$explicitCopy = @($acl.GetAccessRules($true, $false, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq 'S-1-5-21-1-2-3-4941' })
if ($Remove) {
$inherited | Should -BeNullOrEmpty
$explicitCopy | Should -BeNullOrEmpty
}
else {
$explicitCopy | Should -HaveCount 1
}
}
else {
$acl.AreAccessRulesProtected | Should -BeFalse
$explicitChild = @($acl.GetAccessRules($true, $false, $sidType) | Where-Object -FilterScript { $_.IdentityReference.Value -eq 'S-1-5-21-1-2-3-4942' })
if ($Remove) { $explicitChild | Should -BeNullOrEmpty } else { $explicitChild | Should -HaveCount 1 }
}
}
It 'Set-NTFSInheritance -SecurityDescriptor should set both inheritance flags in one call, changing only the in-memory descriptor until it is written' -Skip:(-not $canChangeAudit) {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'DescriptorBothFlags'
Assert-TestSandboxPath -Sandbox $sandbox -Path $file
$daclBefore = (Get-Acl -LiteralPath $file).Sddl
$sd = Get-NTFSSecurityDescriptor -Path $file
$result = @(Set-NTFSInheritance -SecurityDescriptor $sd -AccessInheritanceEnabled $false -AuditInheritanceEnabled $false -PassThru -ErrorAction Stop)
$result | Should -HaveCount 1
$result[0].AccessInheritanceEnabled | Should -BeFalse
$result[0].AuditInheritanceEnabled | Should -BeFalse
$sd.SecurityDescriptor.AreAccessRulesProtected | Should -BeTrue
$sd.SecurityDescriptor.AreAuditRulesProtected | Should -BeTrue
(Get-Acl -LiteralPath $file).Sddl | Should -BeExactly $daclBefore
Set-NTFSSecurityDescriptor -SecurityDescriptor $sd -ErrorAction Stop
(Get-Acl -LiteralPath $file).AreAccessRulesProtected | Should -BeTrue
(Get-TestAuditAcl -Path $file).AreAuditRulesProtected | Should -BeTrue
}
It 'Set-NTFSOwner should change only the owner and leave the Access entries and the group unchanged' {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'OwnerOnlyChange'
Add-NTFSAccess -Path $file -Account 'S-1-1-0' -AccessRights ReadData -ErrorAction Stop
$before = Get-Acl -LiteralPath $file
if ($before.GetOwner($sidType).Value -eq $currentUser) {
Set-ItResult -Skipped -Because 'the user already owns new items, so Set-NTFSOwner would not change the owner'
return
}
$accessBefore = $before.GetSecurityDescriptorSddlForm('Access')
$groupBefore = $before.GetGroup($sidType).Value
$result = @(Set-NTFSOwner -Path $file -Account $currentUser -PassThru -ErrorAction Stop)
$result | Should -HaveCount 1
$result[0] | Should -BeOfType ([Security2.FileSystemOwner])
$result[0].Owner.Sid | Should -Be $currentUser
$after = Get-Acl -LiteralPath $file
$after.GetOwner($sidType).Value | Should -Be $currentUser
$after.GetSecurityDescriptorSddlForm('Access') | Should -BeExactly $accessBefore
$after.GetGroup($sidType).Value | Should -Be $groupBefore
}
}
Describe 'Errors: categories, targets, and continuation of the inheritance and owner cmdlets' {
Context 'A denied write, with and without a restorable owner' {
BeforeAll {
$privateData['EnablePrivileges'] = $false
}
AfterAll {
$privateData['EnablePrivileges'] = $enablePrivileges
}
It '<Command> should report <ErrorId> with category WriteError and target for the denied item, and still return the next item''s new state with -PassThru' -ForEach $deniedWriteCases {
$blocked = New-TestSandboxItem -Sandbox $sandbox -Name 'DeniedWriteBlocked'
$next = New-TestSandboxItem -Sandbox $sandbox -Name 'DeniedWriteNext'
if ($PreDisable) {
Disable-NTFSAccessInheritance -Path $blocked, $next -ErrorAction Stop
}
Block-TestWritePermission -Sandbox $sandbox -Path $blocked
$before = (Get-Acl -LiteralPath $blocked).Sddl
$result = @(& $Command -Path $blocked, $next @Parameters -PassThru -ErrorVariable changeErrors -ErrorAction SilentlyContinue)
$changeErrors | Should -HaveCount 1
$changeErrors[0].FullyQualifiedErrorId | Should -BeLike "$ErrorId,*"
$changeErrors[0].CategoryInfo.Category | Should -Be 'WriteError'
$changeErrors[0].TargetObject | Should -Be $blocked
(Get-Acl -LiteralPath $blocked).Sddl | Should -BeExactly $before
$result | Should -HaveCount 1
$result[0].FullName | Should -Be $next
$result[0].AccessInheritanceEnabled | Should -Be $ExpectedFlag
}
It '<Command> should report RestoreOwnerError after a successful ownership retry and continue with the next path' -Skip:(-not $holdsRestorePrivilege) -ForEach $restoreOwnerCases {
$blocked = New-TestSandboxItem -Sandbox $sandbox -Name 'RestoreOwnerBlocked'
$next = New-TestSandboxItem -Sandbox $sandbox -Name 'RestoreOwnerNext'
if ($PreDisable) {
Disable-NTFSAccessInheritance -Path $blocked, $next -ErrorAction Stop
}
$user = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
Add-TestDenyRule -Sandbox $sandbox -Path $blocked -Rights @{ $user = 'ChangePermissions' }
Set-TestOwner -Sandbox $sandbox -Path $blocked -Sid $trustedInstaller
(Get-Privileges | Where-Object -Property Privilege -EQ -Value 'Restore').PrivilegeState | Should -Be 'Disabled'
& $Command -Path $blocked, $next @Parameters -ErrorVariable changeErrors -ErrorAction SilentlyContinue
$changeErrors | Should -HaveCount 1
$changeErrors[0].FullyQualifiedErrorId | Should -BeLike 'RestoreOwnerError,*'
$changeErrors[0].CategoryInfo.Category | Should -Be 'WriteError'
$changeErrors[0].TargetObject | Should -Be $blocked
(Get-TestAcl -Path $blocked).GetOwner($sidType).Value | Should -Be $user
(Get-TestAcl -Path $blocked).AreAccessRulesProtected | Should -Be $ExpectedProtected
(Get-TestAcl -Path $next).AreAccessRulesProtected | Should -Be $ExpectedProtected
}
}
It '<Command> should write <ErrorId> with category OpenError for a path that does not exist, and return exactly one object for the next path' -ForEach $missingPathOpenErrorCases {
$missing = Join-Path -Path $sandbox -ChildPath ('Missing-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
Assert-TestSandboxPath -Sandbox $sandbox -Path $missing
$next = New-TestSandboxItem -Sandbox $sandbox -Name 'NextAfterMissing'
$output = @(& $Command -Path $missing, $next -ErrorVariable pathErrors -ErrorAction SilentlyContinue)
$pathErrors | Should -HaveCount 1
$pathErrors[0].FullyQualifiedErrorId | Should -BeLike "$ErrorId,*"
$pathErrors[0].CategoryInfo.Category | Should -Be 'OpenError'
$pathErrors[0].TargetObject | Should -Be $missing
$output | Should -HaveCount 1
$output[0].FullName | Should -Be $next
}
It 'Get-NTFSOwner should write a ReadSecurityError with its id, category, and target together for a denied item, and return exactly one object for the next path' -Skip:$canBypassDeny {
$blocked = New-TestSandboxItem -Sandbox $sandbox -Name 'OwnerDenied'
Block-TestReadPermission -Sandbox $sandbox -Path $blocked
$next = New-TestSandboxItem -Sandbox $sandbox -Name 'OwnerDeniedNext'
$output = @(Get-NTFSOwner -Path $blocked, $next -ErrorVariable ownerErrors -ErrorAction SilentlyContinue)
$ownerErrors | Should -HaveCount 1
$ownerErrors[0].FullyQualifiedErrorId | Should -BeLike 'ReadSecurityError,*'
$ownerErrors[0].CategoryInfo.Category | Should -Be 'PermissionDenied'
$ownerErrors[0].TargetObject | Should -Be $blocked
$output | Should -HaveCount 1
$output[0].FullName | Should -Be $next
}
Context 'Set-NTFSOwner when Windows refuses the new owner' {
BeforeAll {
$privateData['EnablePrivileges'] = $false
}
AfterAll {
$privateData['EnablePrivileges'] = $enablePrivileges
}
It 'Should write <ErrorId> with its category and target for <Scenario>, and keep processing the remaining path' -ForEach $setOwnerErrorCases {
if ($Scenario -eq 'Missing') {
# -Account is one shared value for every -Path of the call, so only a missing path can fail while a
# second, existing path still succeeds with the very same account.
$target = Join-Path -Path $sandbox -ChildPath ('Missing-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
Assert-TestSandboxPath -Sandbox $sandbox -Path $target
$next = New-TestSandboxItem -Sandbox $sandbox -Name 'SetOwnerNext'
$result = @(Set-NTFSOwner -Path $target, $next -Account $currentUser -PassThru -ErrorVariable ownerErrors -ErrorAction SilentlyContinue)
$ownerErrors | Should -HaveCount 1
$ownerErrors[0].FullyQualifiedErrorId | Should -BeLike "$ErrorId,*"
$ownerErrors[0].CategoryInfo.Category | Should -Be $Category
$ownerErrors[0].TargetObject | Should -Be $target
$result | Should -HaveCount 1
$result[0].FullName | Should -Be $next
$result[0].Owner.Sid | Should -Be $currentUser
}
else {
# Windows refuses the same account for every path of the call, so both paths fail; each must still be
# reported on its own, which proves the loop did not stop after the first one.
$target = New-TestSandboxItem -Sandbox $sandbox -Name 'SetOwnerRefused'
$next = New-TestSandboxItem -Sandbox $sandbox -Name 'SetOwnerRefusedNext'
(Get-Privileges | Where-Object -Property Privilege -EQ -Value 'Restore').PrivilegeState | Should -Not -Be 'Enabled'
$result = @(Set-NTFSOwner -Path $target, $next -Account $trustedInstaller -PassThru -ErrorVariable ownerErrors -ErrorAction SilentlyContinue)
$ownerErrors | Should -HaveCount 2
$ownerErrors[0].FullyQualifiedErrorId | Should -BeLike "$ErrorId,*"
$ownerErrors[0].CategoryInfo.Category | Should -Be $Category
$ownerErrors[0].TargetObject | Should -Be $target
$ownerErrors[1].FullyQualifiedErrorId | Should -BeLike "$ErrorId,*"
$ownerErrors[1].CategoryInfo.Category | Should -Be $Category
$ownerErrors[1].TargetObject | Should -Be $next
$result | Should -BeNullOrEmpty
}
}
}
}
Describe 'Pipeline: binding into the -Path and -SecurityDescriptor sets that no existing test piped' {
It '<Command> should take piped folders from Get-ChildItem2 and report the <Scope> inheritance state of each with -PassThru' -ForEach $pipedInheritanceCases {
if ($Scope -eq 'audit' -and -not $canChangeAudit) {
Set-ItResult -Skipped -Because 'changing audit inheritance needs the Security privilege'
return
}
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'PipedInheritanceParent' -Directory
$children = foreach ($i in 1, 2) {
$child = Join-Path -Path $parent -ChildPath "Child$i"
Assert-TestSandboxPath -Sandbox $sandbox -Path $child
New-Item -ItemType Directory -Path $child | Out-Null
$child
}
if ($PreDisable) {
foreach ($child in $children) {
if ($Scope -eq 'access') { Disable-NTFSAccessInheritance -Path $child -ErrorAction Stop }
else { Disable-NTFSAuditInheritance -Path $child -ErrorAction Stop }
}
}
$result = @(Get-ChildItem2 -Path $parent -Directory | & $Command -PassThru -ErrorAction Stop)
$result | Should -HaveCount 2
$result | ForEach-Object -Process { $_ | Should -BeOfType ([Security2.FileSystemInheritanceInfo]) }
(@($result.FullName) | Sort-Object) | Should -Be (@($children) | Sort-Object)
foreach ($child in $children) {
$item = $result | Where-Object -FilterScript { $_.FullName -eq $child }
$item | Should -HaveCount 1
if ($Scope -eq 'access') {
$item.AccessInheritanceEnabled | Should -Be $Expected
(Get-Acl -LiteralPath $child).AreAccessRulesProtected | Should -Be (-not $Expected)
}
else {
$item.AuditInheritanceEnabled | Should -Be $Expected
(Get-TestAuditAcl -Path $child).AreAuditRulesProtected | Should -Be (-not $Expected)
}
}
}
It '<Command> -SecurityDescriptor should take two piped descriptors and report both in order, written only by Set-NTFSSecurityDescriptor' -ForEach $pipedInheritanceSdCases {
if ($Scope -eq 'audit' -and -not $canChangeAudit) {
Set-ItResult -Skipped -Because 'changing audit inheritance needs the Security privilege'
return
}
$files = 1, 2 | ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name "PipedSdInheritance$_" }
if ($PreDisable) {
foreach ($file in $files) {
if ($Scope -eq 'access') { Disable-NTFSAccessInheritance -Path $file -ErrorAction Stop }
else { Disable-NTFSAuditInheritance -Path $file -ErrorAction Stop }
}
}
$descriptors = @(Get-NTFSSecurityDescriptor -Path $files)
$descriptors | Should -HaveCount 2
$result = @($descriptors | & $Command -PassThru -ErrorAction Stop)
$result | Should -HaveCount 2
($result.FullName -join '|') | Should -Be ($files -join '|')
for ($i = 0; $i -lt 2; $i++) {
if ($Scope -eq 'access') {
$descriptors[$i].SecurityDescriptor.AreAccessRulesProtected | Should -Be (-not $Expected)
(Get-Acl -LiteralPath $files[$i]).AreAccessRulesProtected | Should -Be $PreDisable
}
else {
$descriptors[$i].SecurityDescriptor.AreAuditRulesProtected | Should -Be (-not $Expected)
(Get-TestAuditAcl -Path $files[$i]).AreAuditRulesProtected | Should -Be $PreDisable
}
}
Set-NTFSSecurityDescriptor -SecurityDescriptor $descriptors -ErrorAction Stop
foreach ($file in $files) {
if ($Scope -eq 'access') { (Get-Acl -LiteralPath $file).AreAccessRulesProtected | Should -Be (-not $Expected) }
else { (Get-TestAuditAcl -Path $file).AreAuditRulesProtected | Should -Be (-not $Expected) }
}
# A direct array binds both descriptors within one ProcessRecord call, unlike the pipeline above, which
# rebinds the parameter once per item; only this direct form can catch a handler that always changes the
# first descriptor of the set.
$directFiles = 1, 2 | ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name "DirectSdInheritance$_" }
if ($PreDisable) {
foreach ($file in $directFiles) {
if ($Scope -eq 'access') { Disable-NTFSAccessInheritance -Path $file -ErrorAction Stop }
else { Disable-NTFSAuditInheritance -Path $file -ErrorAction Stop }
}
}
$directDescriptors = @(Get-NTFSSecurityDescriptor -Path $directFiles)
& $Command -SecurityDescriptor $directDescriptors -ErrorAction Stop
for ($i = 0; $i -lt 2; $i++) {
if ($Scope -eq 'access') { $directDescriptors[$i].SecurityDescriptor.AreAccessRulesProtected | Should -Be (-not $Expected) }
else { $directDescriptors[$i].SecurityDescriptor.AreAuditRulesProtected | Should -Be (-not $Expected) }
}
}
It 'Get-NTFSInheritance should take piped folder objects from Get-ChildItem2 and a piped custom object by its FullName property' {
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'InheritancePipeParent' -Directory
$children = foreach ($i in 1, 2) {
$child = Join-Path -Path $parent -ChildPath "Child$i"
Assert-TestSandboxPath -Sandbox $sandbox -Path $child
New-Item -ItemType Directory -Path $child | Out-Null
$child
}
$result = @(Get-ChildItem2 -Path $parent -Directory | Get-NTFSInheritance -ErrorAction Stop)
$result | Should -HaveCount 2
(@($result.FullName) | Sort-Object) | Should -Be (@($children) | Sort-Object)
$result | ForEach-Object -Process { $_ | Should -BeOfType ([Security2.FileSystemInheritanceInfo]) }
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'InheritancePipeByProperty'
$expectedFlag = -not (Get-Acl -LiteralPath $file).AreAccessRulesProtected
$byProperty = @([pscustomobject]@{ FullName = $file } | Get-NTFSInheritance -ErrorAction Stop)
$byProperty | Should -HaveCount 1
$byProperty[0].FullName | Should -Be $file
$byProperty[0].AccessInheritanceEnabled | Should -Be $expectedFlag
}
It 'Get-NTFSInheritance -SecurityDescriptor should take two piped descriptors, one protected, and report both in order' {
$protectedItem = New-TestSandboxItem -Sandbox $sandbox -Name 'SdInheritanceProtected'
Disable-NTFSAccessInheritance -Path $protectedItem -ErrorAction Stop
$plainItem = New-TestSandboxItem -Sandbox $sandbox -Name 'SdInheritancePlain'
$descriptors = @(Get-NTFSSecurityDescriptor -Path $protectedItem, $plainItem)
$result = @($descriptors | Get-NTFSInheritance -ErrorAction Stop)
$result | Should -HaveCount 2
$result[0].FullName | Should -Be $protectedItem
$result[0].Name | Should -Be ([IO.Path]::GetFileName($protectedItem))
$result[0].AccessInheritanceEnabled | Should -BeFalse
$result[1].FullName | Should -Be $plainItem
$result[1].AccessInheritanceEnabled | Should -BeTrue
# The same array passed directly to the parameter, not only through the pipeline.
$byParameter = @(Get-NTFSInheritance -SecurityDescriptor $descriptors -ErrorAction Stop)
$byParameter | Should -HaveCount 2
$byParameter[0].AccessInheritanceEnabled | Should -BeFalse
$byParameter[1].AccessInheritanceEnabled | Should -BeTrue
}
It 'Set-NTFSInheritance should restore a saved inheritance state through the pipeline by property name' {
$path = New-TestSandboxItem -Sandbox $sandbox -Name 'RoundTripState' -Directory
$state = Get-NTFSInheritance -Path $path -ErrorAction Stop
Disable-NTFSAccessInheritance -Path $path -ErrorAction Stop
(Get-Acl -LiteralPath $path).AreAccessRulesProtected | Should -BeTrue
$result = @($state | Set-NTFSInheritance -PassThru -ErrorAction Stop)
$result | Should -HaveCount 1
$result[0] | Should -BeOfType ([Security2.FileSystemInheritanceInfo])
$result[0].FullName | Should -Be $path
(Get-Acl -LiteralPath $path).AreAccessRulesProtected | Should -BeFalse
}
It 'Set-NTFSInheritance -SecurityDescriptor should protect both descriptors in memory, written only by Set-NTFSSecurityDescriptor, piped and passed directly to the parameter' {
$files = 1, 2 | ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name "SdInheritanceSet$_" }
$descriptors = @(Get-NTFSSecurityDescriptor -Path $files)
$result = @($descriptors | Set-NTFSInheritance -AccessInheritanceEnabled $false -PassThru -ErrorAction Stop)
$result | Should -HaveCount 2
($result.FullName -join '|') | Should -Be ($files -join '|')
$descriptors | ForEach-Object -Process { $_.SecurityDescriptor.AreAccessRulesProtected | Should -BeTrue }
foreach ($file in $files) { (Get-Acl -LiteralPath $file).AreAccessRulesProtected | Should -BeFalse }
Set-NTFSSecurityDescriptor -SecurityDescriptor $descriptors -ErrorAction Stop
foreach ($file in $files) { (Get-Acl -LiteralPath $file).AreAccessRulesProtected | Should -BeTrue }
# A direct array binds both descriptors within one ProcessRecord call, unlike the pipeline above, which
# rebinds the parameter once per item; only this direct form can catch a handler that always changes the
# first descriptor of the set.
$directFiles = 1, 2 | ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name "DirectSdInheritanceSet$_" }
$directDescriptors = @(Get-NTFSSecurityDescriptor -Path $directFiles)
Set-NTFSInheritance -SecurityDescriptor $directDescriptors -AccessInheritanceEnabled $false -ErrorAction Stop
$directDescriptors | ForEach-Object -Process { $_.SecurityDescriptor.AreAccessRulesProtected | Should -BeTrue }
}
It 'Get-NTFSOwner should take two piped folders from Get-ChildItem2 and return the owner of each, verified with Get-Acl' {
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'OwnerPipeParent' -Directory
$children = foreach ($i in 1, 2) {
$child = Join-Path -Path $parent -ChildPath "Child$i"
Assert-TestSandboxPath -Sandbox $sandbox -Path $child
New-Item -ItemType Directory -Path $child | Out-Null
$child
}
$result = @(Get-ChildItem2 -Path $parent -Directory | Get-NTFSOwner -ErrorAction Stop)
$result | Should -HaveCount 2
$result | ForEach-Object -Process { $_ | Should -BeOfType ([Security2.FileSystemOwner]) }
foreach ($child in $children) {
$owner = $result | Where-Object -FilterScript { $_.FullName -eq $child }
$owner | Should -HaveCount 1
$owner.Owner.Sid | Should -Be (Get-Acl -LiteralPath $child).GetOwner($sidType).Value
}
}
It 'Get-NTFSOwner -SecurityDescriptor should return the owner of each descriptor, piped and passed directly to the parameter, verified with Get-Acl' {
$first = New-TestSandboxItem -Sandbox $sandbox -Name 'SdOwnerFirst'
$second = New-TestSandboxItem -Sandbox $sandbox -Name 'SdOwnerSecond'
if ($holdsRestorePrivilege) {
Set-TestOwner -Sandbox $sandbox -Path $second -Sid $trustedInstaller
}
$expectedFirst = (Get-Acl -LiteralPath $first).GetOwner($sidType).Value
$expectedSecond = (Get-Acl -LiteralPath $second).GetOwner($sidType).Value
if ($holdsRestorePrivilege) {
$expectedFirst | Should -Not -Be $expectedSecond
}
$descriptors = @(Get-NTFSSecurityDescriptor -Path $first, $second)
$piped = @($descriptors | Get-NTFSOwner -ErrorAction Stop)
$piped | Should -HaveCount 2
$piped | ForEach-Object -Process { $_ | Should -BeOfType ([Security2.FileSystemOwner]) }
$piped[0].FullName | Should -Be $first
$piped[0].Owner.Sid | Should -Be $expectedFirst
$piped[1].FullName | Should -Be $second
$piped[1].Owner.Sid | Should -Be $expectedSecond
# Row 14 of the matrix was bound only by a call the scan could not classify; call it directly and by name too.
$direct = @(Get-NTFSOwner -SecurityDescriptor $descriptors -ErrorAction Stop)
$direct | Should -HaveCount 2
$direct[0].Owner.Sid | Should -Be $expectedFirst
$direct[1].Owner.Sid | Should -Be $expectedSecond
}
It 'Set-NTFSOwner -SecurityDescriptor should change both owners in memory without touching the items, piped and passed directly to the parameter' {
$files = 1, 2 | ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name "SdOwnerSet$_" }
$before = $files | ForEach-Object -Process { (Get-Acl -LiteralPath $_).GetOwner($sidType).Value }
$descriptors = @(Get-NTFSSecurityDescriptor -Path $files)
$result = @($descriptors | Set-NTFSOwner -Account 'S-1-1-0' -PassThru -ErrorAction Stop)
$result | Should -HaveCount 2
($result.FullName -join '|') | Should -Be ($files -join '|')
$result | ForEach-Object -Process { $_.Owner.Sid | Should -Be 'S-1-1-0' }
for ($i = 0; $i -lt 2; $i++) {
(Get-Acl -LiteralPath $files[$i]).GetOwner($sidType).Value | Should -Be $before[$i]
}
# A direct array binds both descriptors within one ProcessRecord call; the pipeline above rebinds the
# parameter once per item instead, so only this direct form can catch a handler that always changes the
# first descriptor of the set.
$directFiles = 1, 2 | ForEach-Object -Process { New-TestSandboxItem -Sandbox $sandbox -Name "SdOwnerSetDirect$_" }
$directDescriptors = @(Get-NTFSSecurityDescriptor -Path $directFiles)
Set-NTFSOwner -SecurityDescriptor $directDescriptors -Account 'S-1-1-0' -ErrorAction Stop
$directDescriptors | ForEach-Object -Process { $_.SecurityDescriptor.GetOwner($sidType).Value | Should -Be 'S-1-1-0' }
}
It 'Get-NTFSSecurityDescriptor should take piped folder objects, a standard Get-Item object, and a piped custom object by its Path property' {
$parent = New-TestSandboxItem -Sandbox $sandbox -Name 'SdPipeParent' -Directory
$children = foreach ($i in 1, 2) {
$child = Join-Path -Path $parent -ChildPath "Child$i"
Assert-TestSandboxPath -Sandbox $sandbox -Path $child
New-Item -ItemType Directory -Path $child | Out-Null
$child
}
$result = @(Get-ChildItem2 -Path $parent -Directory | Get-NTFSSecurityDescriptor -ErrorAction Stop)
$result | Should -HaveCount 2
$result | ForEach-Object -Process { $_ | Should -BeOfType ([Security2.FileSystemSecurity2]) }
(@($result.FullName) | Sort-Object) | Should -Be (@($children) | Sort-Object)
foreach ($child in $children) {
$sd = $result | Where-Object -FilterScript { $_.FullName -eq $child }
$sd.SecurityDescriptor.GetSecurityDescriptorSddlForm('Access') | Should -Be (Get-Acl -LiteralPath $child).GetSecurityDescriptorSddlForm('Access')
}
$standardItem = Get-Item -LiteralPath $children[0]
$byStandardItem = @(Get-NTFSSecurityDescriptor -Path $standardItem -ErrorAction Stop)
$byStandardItem | Should -HaveCount 1
$byStandardItem[0].FullName | Should -Be $children[0]
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'SdPipeByProperty'
$expectedSddl = (Get-Acl -LiteralPath $file).GetSecurityDescriptorSddlForm('Access')
$byProperty = @([pscustomobject]@{ Path = $file } | Get-NTFSSecurityDescriptor -ErrorAction Stop)
$byProperty | Should -HaveCount 1
$byProperty[0].FullName | Should -Be $file
$byProperty[0].SecurityDescriptor.GetSecurityDescriptorSddlForm('Access') | Should -Be $expectedSddl
}
}

595
Tests/ParameterSets.Items.Tests.ps1

@ -0,0 +1,595 @@
<#
Closes TestNeeded gaps that the judged parameter-set matrix found in the item, link, hash, privilege, and
disk-space cmdlets of the module built in NTFSSecurity\bin\Release: no test piped into Copy-Item2, Get-ChildItem2,
Get-Item2, Move-Item2, or Remove-Item2; an empty or null -Path/-Target never falls back to the current location;
missing error categories and output types; and continuation after an earlier item in the same pipeline. It does not
pin the -Filter dot rules, the Decision 22 behaviors, the PrivilegeEnabler class, or the owner-restore handlers,
which are covered and decided elsewhere.
#>
[Diagnostics.CodeAnalysis.SuppressMessageAttribute(
'PSUseDeclaredVarsMoreThanAssignments', '', Justification = 'Pester shares variables between blocks.'
)]
param ()
BeforeDiscovery {
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers.psm1') -Force
$canCreateSymbolicLinks = Test-PrivilegeHeld -Name 'SeCreateSymbolicLinkPrivilege'
}
BeforeAll {
Import-Module -Name (Join-Path -Path $PSScriptRoot -ChildPath 'TestHelpers.psm1') -Force
$modulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\NTFSSecurity\bin\Release\NTFSSecurity.psd1'
Import-Module -Name $modulePath -Force -ErrorAction Stop
$sandbox = New-TestSandbox -Name 'ParameterSetsItems'
Push-Location -LiteralPath $sandbox
}
AfterAll {
Pop-Location
Remove-TestSandbox -Sandbox $sandbox
Remove-Module -Name NTFSSecurity -Force -ErrorAction SilentlyContinue
}
Describe 'Copy-Item2 and Move-Item2 accept pipeline input' {
# The cmdlet pages document piping Get-ChildItem2 output into Copy-Item2/Move-Item2, but no existing test pipes
# anything into either cmdlet. A missing item in the middle of the pipeline must not stop the surrounding items.
It '<Command> should accept <InputKind> piped by value and still process the surrounding items' -ForEach @(
@{ Command = 'Copy-Item2'; InputKind = 'plain path strings with a missing item in the middle' }
@{ Command = 'Copy-Item2'; InputKind = 'Get-ChildItem2 file objects' }
@{ Command = 'Move-Item2'; InputKind = 'plain path strings with a missing item in the middle' }
@{ Command = 'Move-Item2'; InputKind = 'Get-ChildItem2 file objects' }
) {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'PipelineItems' -Directory
$destination = Join-Path -Path $folder -ChildPath 'Destination'
$first = Join-Path -Path $folder -ChildPath 'First.txt'
$second = Join-Path -Path $folder -ChildPath 'Second.txt'
$missing = Join-Path -Path $folder -ChildPath 'Missing.txt'
Assert-TestSandboxPath -Sandbox $sandbox -Path $destination, $first, $second, $missing
New-Item -ItemType Directory -Path $destination | Out-Null
Set-Content -LiteralPath $first -Value 'First'
Set-Content -LiteralPath $second -Value 'Second'
$usesMissingItem = $InputKind -like '*missing item*'
$items = if ($usesMissingItem) {
@($first, $missing, $second)
}
else {
@(Get-ChildItem2 -Path $folder -File -ErrorAction Stop)
}
$result = @($items | & $Command -Destination $destination -PassThru $true -ErrorVariable itemErrors -ErrorAction SilentlyContinue)
if ($usesMissingItem) {
$itemErrors | Should -HaveCount 1
$itemErrors[0].FullyQualifiedErrorId | Should -BeLike 'FileNotFound,*'
$itemErrors[0].CategoryInfo.Category | Should -Be 'ObjectNotFound'
$itemErrors[0].TargetObject | Should -Be $missing
$itemErrors[0].Exception | Should -BeOfType [System.IO.FileNotFoundException]
}
else {
$itemErrors | Should -BeNullOrEmpty
}
$result | Should -HaveCount 2
$destinationFirst = Join-Path -Path $destination -ChildPath 'First.txt'
$destinationSecond = Join-Path -Path $destination -ChildPath 'Second.txt'
@($result.FullName | Sort-Object) | Should -Be (@($destinationFirst, $destinationSecond) | Sort-Object)
Get-Content -LiteralPath $destinationFirst | Should -Be 'First'
Get-Content -LiteralPath $destinationSecond | Should -Be 'Second'
if ($Command -eq 'Copy-Item2') {
$first | Should -Exist
$second | Should -Exist
}
else {
$first | Should -Not -Exist
$second | Should -Not -Exist
}
}
}
Describe 'Get-ChildItem2 accepts pipeline input' {
# No existing test pipes a path into Get-ChildItem2, although -Path documents taking it by value and by FullName.
It 'Should accept piped folders by value, write one error for a path that does not exist, and list the items of the other folders' {
$folderA = New-TestSandboxItem -Sandbox $sandbox -Name 'PipelineFolderA' -Directory
$folderB = New-TestSandboxItem -Sandbox $sandbox -Name 'PipelineFolderB' -Directory
$missing = Join-Path -Path $sandbox -ChildPath ('PipelineChildMissing-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
$fileA = Join-Path -Path $folderA -ChildPath 'A.txt'
$fileB = Join-Path -Path $folderB -ChildPath 'B.txt'
Assert-TestSandboxPath -Sandbox $sandbox -Path $fileA, $fileB
Set-Content -LiteralPath $fileA -Value 'A'
Set-Content -LiteralPath $fileB -Value 'B'
$result = @(@($folderA, $missing, $folderB) | Get-ChildItem2 -ErrorVariable childErrors -ErrorAction SilentlyContinue)
$childErrors | Should -HaveCount 1
$childErrors[0].FullyQualifiedErrorId | Should -BeLike 'FileNotFound,*'
$childErrors[0].CategoryInfo.Category | Should -Be 'ObjectNotFound'
$childErrors[0].TargetObject | Should -Be $missing
@($result.FullName | Sort-Object) | Should -Be (@($fileA, $fileB) | Sort-Object)
}
# Chains a folder object from one call into -Path of a second call, by value (AlphaFS objects, not strings).
It 'Should accept folder objects piped from Get-ChildItem2 -Directory and list only the files directly below them' {
$tree = New-TestSandboxItem -Sandbox $sandbox -Name 'ChainedTree' -Directory
$childFolder = Join-Path -Path $tree -ChildPath 'Child'
$childFile = Join-Path -Path $childFolder -ChildPath 'Child.log'
$grandchildFile = Join-Path -Path $childFolder -ChildPath 'Grandchild\Deep.log'
$rootFile = Join-Path -Path $tree -ChildPath 'Root.txt'
Assert-TestSandboxPath -Sandbox $sandbox -Path $childFile, $grandchildFile, $rootFile
New-Item -ItemType Directory -Path (Split-Path -Path $grandchildFile -Parent) -Force | Out-Null
Set-Content -LiteralPath $childFile -Value 'Child'
Set-Content -LiteralPath $grandchildFile -Value 'Grandchild'
Set-Content -LiteralPath $rootFile -Value 'Root'
$result = @(Get-ChildItem2 -Path $tree -Directory -ErrorAction Stop | Get-ChildItem2 -File -ErrorAction Stop)
$result | Should -HaveCount 1
$result[0] | Should -BeOfType [Alphaleonis.Win32.Filesystem.FileInfo]
$result[0].FullName | Should -Be $childFile
}
}
Describe 'Get-Item2 accepts pipeline input' {
# No existing test pipes a path into Get-Item2; the output type and Mode were asserted only for non-piped calls.
It 'Should accept piped items by value, return each in order with its output type, and write one error for a path that does not exist' {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'GetItemPipelineFile'
[IO.File]::SetAttributes($file, [IO.FileAttributes]::Archive)
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'GetItemPipelineFolder' -Directory
$missing = Join-Path -Path $sandbox -ChildPath ('GetItemPipelineMissing-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
$result = @(@($file, $missing, $folder) | Get-Item2 -ErrorVariable itemErrors -ErrorAction SilentlyContinue)
$itemErrors | Should -HaveCount 1
$itemErrors[0].FullyQualifiedErrorId | Should -BeLike 'FileNotFound,*'
$itemErrors[0].CategoryInfo.Category | Should -Be 'ObjectNotFound'
$itemErrors[0].TargetObject | Should -Be $missing
$result | Should -HaveCount 2
$result[0] | Should -BeOfType [Alphaleonis.Win32.Filesystem.FileInfo]
$result[0].FullName | Should -Be $file
$result[0].Mode | Should -BeExactly '-a---'
$result[1] | Should -BeOfType [Alphaleonis.Win32.Filesystem.DirectoryInfo]
$result[1].FullName | Should -Be $folder
$result[1].Mode | Should -BeExactly 'd----'
}
}
Describe 'Remove-Item2 accepts pipeline input' {
# No existing test pipes a path into Remove-Item2, although its page documents Get-ChildItem2 | Remove-Item2.
It 'Should accept piped items by value, write one error for a non-empty folder, remove the files, and keep the folder' {
$fileA = New-TestSandboxItem -Sandbox $sandbox -Name 'RemovePipelineA'
$fileB = New-TestSandboxItem -Sandbox $sandbox -Name 'RemovePipelineB'
$nonEmptyFolder = New-TestSandboxItem -Sandbox $sandbox -Name 'RemovePipelineFolder' -Directory
$kept = Join-Path -Path $nonEmptyFolder -ChildPath 'Keep.txt'
Assert-TestSandboxPath -Sandbox $sandbox -Path $kept
Set-Content -LiteralPath $kept -Value 'Keep'
$result = @(@($fileA, $nonEmptyFolder, $fileB) | Remove-Item2 -PassThru -ErrorVariable removeErrors -ErrorAction SilentlyContinue)
$removeErrors | Should -HaveCount 1
$removeErrors[0].FullyQualifiedErrorId | Should -BeLike 'DeleteError,*'
$removeErrors[0].CategoryInfo.Category | Should -Be 'InvalidData'
$removeErrors[0].TargetObject | Should -Be $nonEmptyFolder
$fileA | Should -Not -Exist
$fileB | Should -Not -Exist
$nonEmptyFolder | Should -Exist
Get-Content -LiteralPath $kept | Should -Be 'Keep'
$result | Should -HaveCount 2
@($result.FullName | Sort-Object) | Should -Be (@($fileA, $fileB) | Sort-Object)
}
}
Describe 'Empty or null -Path or -Target is rejected instead of falling back to the current location' {
# GetRelativePath('') returns the current location, so ValidateNotNullOrEmpty is the only guard between an empty
# value and a recursive delete of the current folder. A probe against the built module confirmed in both editions
# that the attribute does reject an empty string, $null, a piped empty string, and an empty array element, so this
# pins verified-safe behavior rather than an assumption.
It 'Remove-Item2 should reject -Path <CaseName> instead of removing the current location' -ForEach @(
@{ CaseName = 'as an empty string' }
@{ CaseName = 'as $null' }
@{ CaseName = 'as an array with an empty element' }
@{ CaseName = 'piped as an empty string' }
) {
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'EmptyPathGuard' -Directory
$keep = Join-Path -Path $folder -ChildPath 'Keep.txt'
$innerFolder = Join-Path -Path $folder -ChildPath 'Sub'
$inner = Join-Path -Path $innerFolder -ChildPath 'Inner.txt'
Assert-TestSandboxPath -Sandbox $sandbox -Path $keep, $innerFolder, $inner
New-Item -ItemType Directory -Path $innerFolder | Out-Null
Set-Content -LiteralPath $keep -Value 'Keep'
Set-Content -LiteralPath $inner -Value 'Inner'
Push-Location -LiteralPath $folder
try {
switch ($CaseName) {
'as an empty string' {
{ Remove-Item2 -Path '' -Recurse -Force -ErrorAction Stop } |
Should -Throw -ErrorId 'ParameterArgumentValidationError,NTFSSecurity.RemoveItem2'
}
'as $null' {
{ Remove-Item2 -Path $null -Recurse -Force -ErrorAction Stop } |
Should -Throw -ErrorId 'ParameterArgumentValidationError,NTFSSecurity.RemoveItem2'
}
'as an array with an empty element' {
{ Remove-Item2 -Path @('') -Recurse -Force -ErrorAction Stop } |
Should -Throw -ErrorId 'ParameterArgumentValidationError,NTFSSecurity.RemoveItem2'
}
'piped as an empty string' {
{ '' | Remove-Item2 -Recurse -Force -ErrorAction Stop } |
Should -Throw -ErrorId 'ParameterArgumentValidationError,NTFSSecurity.RemoveItem2'
}
}
}
finally {
Pop-Location
}
$keep | Should -Exist
$inner | Should -Exist
}
It '<Command> should reject -Path <CaseName> instead of silently using the current location' -ForEach @(
@{ Command = 'Copy-Item2'; TypeName = 'NTFSSecurity.CopyItem2'; CaseName = 'as an empty string' }
@{ Command = 'Copy-Item2'; TypeName = 'NTFSSecurity.CopyItem2'; CaseName = 'as $null' }
@{ Command = 'Copy-Item2'; TypeName = 'NTFSSecurity.CopyItem2'; CaseName = 'as an array with an empty element' }
@{ Command = 'Move-Item2'; TypeName = 'NTFSSecurity.MoveItem2'; CaseName = 'as an empty string' }
@{ Command = 'Move-Item2'; TypeName = 'NTFSSecurity.MoveItem2'; CaseName = 'as $null' }
@{ Command = 'Move-Item2'; TypeName = 'NTFSSecurity.MoveItem2'; CaseName = 'as an array with an empty element' }
) {
$destination = New-TestSandboxItem -Sandbox $sandbox -Name 'EmptyPathDestination' -Directory
$source = New-TestSandboxItem -Sandbox $sandbox -Name 'EmptyPathSource'
# An empty path resolves to the current location, so the rows run in a folder of their own: a guard that regressed
# would copy or move this empty folder and not the whole sandbox into itself.
$workFolder = New-TestSandboxItem -Sandbox $sandbox -Name 'EmptyPathWork' -Directory
# The comma keeps the array: a switch writes to the pipeline, which unrolls @('') into a plain empty string.
$badPath = switch ($CaseName) {
'as an empty string' { '' }
'as $null' { $null }
'as an array with an empty element' { , @('') }
}
Push-Location -LiteralPath $workFolder
try {
{ & $Command -Path $badPath -Destination $destination -ErrorAction Stop } |
Should -Throw -ErrorId "ParameterArgumentValidationError,$TypeName"
}
finally {
Pop-Location
}
$source | Should -Exist
$workFolder | Should -Exist
@(Get-ChildItem -LiteralPath $destination -Force) | Should -BeNullOrEmpty
}
# "Both link creators" per the proposal; a probe confirmed the same safe, verified behavior for New-NTFSHardLink.
It '<Command> should reject <CaseName> instead of creating a link to the current folder' -ForEach @(
@{ Command = 'New-NTFSHardLink'; TypeName = 'NTFSSecurity.NewHardLink'; CaseName = 'an empty -Target' }
@{ Command = 'New-NTFSHardLink'; TypeName = 'NTFSSecurity.NewHardLink'; CaseName = 'a $null -Target' }
@{ Command = 'New-NTFSHardLink'; TypeName = 'NTFSSecurity.NewHardLink'; CaseName = 'an empty -Path' }
@{ Command = 'New-NTFSSymbolicLink'; TypeName = 'NTFSSecurity.NewSymbolicLink'; CaseName = 'an empty -Target' }
@{ Command = 'New-NTFSSymbolicLink'; TypeName = 'NTFSSecurity.NewSymbolicLink'; CaseName = 'a $null -Target' }
@{ Command = 'New-NTFSSymbolicLink'; TypeName = 'NTFSSecurity.NewSymbolicLink'; CaseName = 'an empty -Path' }
) {
$target = New-TestSandboxItem -Sandbox $sandbox -Name 'EmptyGuardTarget'
$link = Join-Path -Path $sandbox -ChildPath ('EmptyGuardLink-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
Assert-TestSandboxPath -Sandbox $sandbox -Path $link
switch ($CaseName) {
'an empty -Target' {
{ & $Command -Path $link -Target '' -ErrorAction Stop } |
Should -Throw -ErrorId "ParameterArgumentValidationError,$TypeName"
$link | Should -Not -Exist
}
'a $null -Target' {
{ & $Command -Path $link -Target $null -ErrorAction Stop } |
Should -Throw -ErrorId "ParameterArgumentValidationError,$TypeName"
$link | Should -Not -Exist
}
'an empty -Path' {
{ & $Command -Path '' -Target $target -ErrorAction Stop } |
Should -Throw -ErrorId "ParameterArgumentValidationError,$TypeName"
Get-Content -LiteralPath $target | Should -Be 'EmptyGuardTarget'
}
}
}
}
Describe 'Get-NTFSHardLink errors, categories, output type, and positional binding' {
It 'Should accept piped strings by value, write errors with their categories for a folder and a missing path, and return the files in order' {
$file = New-TestSandboxItem -Sandbox $sandbox -Name 'HardLinkPipelineFile'
$folder = New-TestSandboxItem -Sandbox $sandbox -Name 'HardLinkPipelineFolder' -Directory
$missing = Join-Path -Path $sandbox -ChildPath ('HardLinkPipelineMissing-{0}' -f [guid]::NewGuid().ToString('N').Substring(0, 8))
$other = New-TestSandboxItem -Sandbox $sandbox -Name 'HardLinkPipelineOther'
$result = @(@($file, $folder, $missing, $other) | Get-NTFSHardLink -ErrorVariable linkErrors -ErrorAction SilentlyContinue)
$linkErrors | Should -HaveCount 2
$linkErrors[0].FullyQualifiedErrorId | Should -BeLike 'GetHardLinkError,*'
$linkErrors[0].CategoryInfo.Category | Should -Be 'InvalidArgument'
$linkErrors[0].TargetObject | Should -Be $folder
$linkErrors[1].FullyQualifiedErrorId | Should -BeLike 'FileNotFound,*'
$linkErrors[1].CategoryInfo.Category | Should -Be 'ObjectNotFound'
$linkErrors[1].TargetObject | Should -Be $missing
$result | Should -HaveCount 2
$result[0] | Should -BeOfType [Alphaleonis.Win32.Filesystem.FileInfo]
$result[0].FullName | Should -Be $file
$result[1] | Should -BeOfType [Alphaleonis.Win32.Filesystem.FileInfo]
$result[1].FullName | Should -Be $other
(Get-NTFSHardLink $file -ErrorAction Stop).FullName | Should -Be $file
}
}
Describe 'Pipeline continuation for the link-creating cmdlets' {
# Mirrors the PipelineControl.Tests.ps1 Untouched convention locally: a later command that ends the pipeline after
# the first pass-through object must leave the second link request completely untouched.
It 'New-NTFSHardLink should stop after the first pass-through object for Select-Object -First 1 and leave the second request untouched' {
$firstTarget = New-TestSandboxItem -Sandbox $sandbox -Name 'ContinuationHardFirstTarget'
$secondTarget = New-TestSandboxItem -Sandbox $sandbox -Name 'ContinuationHardSecondTarget'
$firstLink = Join-Path -Path $sandbox -ChildPath 'ContinuationHardFirstLink.txt'
$secondLink = Join-Path -Path $sandbox -ChildPath 'ContinuationHardSecondLink.txt'
Assert-TestSandboxPath -Sandbox $sandbox -Path $firstLink, $secondLink
$requests = @(
[pscustomobject]@{ Path = $firstLink; Target = $firstTarget }
[pscustomobject]@{ Path = $secondLink; Target = $secondTarget }
)
$result = @($requests | New-NTFSHardLink -PassThru -ErrorVariable linkErrors -ErrorAction SilentlyContinue | Select-Object -First 1)
$linkErrors | Should -BeNullOrEmpty
$result | Should -HaveCount 1
$firstLink | Should -Exist
$secondLink | Should -Not -Exist
}
It 'New-NTFSSymbolicLink should stop after the first pass-through object for Select-Object -First 1 and leave the second request untouched' -Skip:(-not $canCreateSymbolicLinks) {
$firstTarget = New-TestSandboxItem -Sandbox $sandbox -Name 'ContinuationSymbolicFirstTarget'
$secondTarget = New-TestSandboxItem -Sandbox $sandbox -Name 'ContinuationSymbolicSecondTarget'
$firstLink = Join-Path -Path $sandbox -ChildPath 'ContinuationSymbolicFirstLink.txt'
$secondLink = Join-Path -Path $sandbox -ChildPath 'ContinuationSymbolicSecondLink.txt'
Assert-TestSandboxPath -Sandbox $sandbox -Path $firstLink, $secondLink
$requests = @(
[pscustomobject]@{ Path = $firstLink; Target = $firstTarget }
[pscustomobject]@{ Path = $secondLink; Target = $secondTarget }
)
$result = @($requests | New-NTFSSymbolicLink -PassThru -ErrorVariable linkErrors -ErrorAction SilentlyContinue | Select-Object -First 1)
$linkErrors | Should -BeNullOrEmpty
$result | Should -HaveCount 1
(Test-Path2 -Path $firstLink) | Should -BeTrue
(Test-Path2 -Path $secondLink) | Should -BeFalse
}
}
Describe 'New-NTFSSymbolicLink creates a link after an earlier failure in the same pipeline' {
# Every existing piped request fails (the suite runs without the privilege on most hosts), so a successful
# creation that follows a failed one in the same call was unverified; this is the weakest dimension the matrix
# found for this cmdlet (Continuation: Partly).
It 'Should write one ResourceExists error for an existing -Path and still create the links for the requests that follow it' -Skip:(-not $canCreateSymbolicLinks) {
$existingTarget = New-TestSandboxItem -Sandbox $sandbox -Name 'SuccessAfterFailureExistingTarget'
$existingPath = New-TestSandboxItem -Sandbox $sandbox -Name 'SuccessAfterFailureExistingPath'
Set-Content -LiteralPath $existingPath -Value 'ExistingPath'
$fileTarget = New-TestSandboxItem -Sandbox $sandbox -Name 'SuccessAfterFailureFileTarget'
Set-Content -LiteralPath $fileTarget -Value 'FileTargetData'
$fileLink = Join-Path -Path $sandbox -ChildPath 'SuccessAfterFailureFileLink.txt'
$folderTarget = New-TestSandboxItem -Sandbox $sandbox -Name 'SuccessAfterFailureFolderTarget' -Directory
$folderLink = Join-Path -Path $sandbox -ChildPath 'SuccessAfterFailureFolderLink'
Assert-TestSandboxPath -Sandbox $sandbox -Path $fileLink, $folderLink
$requests = @(
[pscustomobject]@{ Path = $existingPath; Target = $existingTarget }
[pscustomobject]@{ Path = $fileLink; Target = $fileTarget }
[pscustomobject]@{ Path = $folderLink; Target = $folderTarget }
)
$result = @($requests | New-NTFSSymbolicLink -PassThru -ErrorVariable linkErrors -ErrorAction SilentlyContinue)
$linkErrors | Should -HaveCount 1
$linkErrors[0].FullyQualifiedErrorId | Should -BeLike 'CreateSymbolicLinkError,*'
$linkErrors[0].CategoryInfo.Category | Should -Be 'ResourceExists'
$linkErrors[0].TargetObject | Should -Be $existingPath
Get-Content -LiteralPath $existingPath | Should -Be 'ExistingPath'
$result | Should -HaveCount 2
$result[0] | Should -BeOfType [Alphaleonis.Win32.Filesystem.FileInfo]
$result[0].FullName | Should -Be $fileLink
$result[1] | Should -BeOfType [Alphaleonis.Win32.Filesystem.DirectoryInfo]
$result[1].FullName | Should -Be $folderLink
(Get-Item -LiteralPath $fileLink -Force).LinkType | Should -Be 'SymbolicLink'
Get-Content -LiteralPath $fileLink | Should -Be 'FileTargetData'
}
}
Describe 'Enable-Privileges and Disable-Privileges error paths' {
# 'Enable Privilege Error' and 'Disable Privilege Error' run silently in many existing cleanups but are never
# asserted; both IDs contain spaces by design (BaseCmdlets.cs, OtherCmdlets.cs), which this pins as given.
BeforeAll {
$privateData = (Get-Module -Name NTFSSecurity).PrivateData
$savedEnablePrivileges = $privateData['EnablePrivileges']
# Runs in a child process: removing a privilege from a token is permanent for that process, so a token that
# holds all four (elevated) ends up holding at most three, and a token that holds none (basic user) stays at
# none either way. Either way, Enable-Privileges cannot enable all four and must report the error.
$enablePrivilegesErrorScript = Join-Path -Path $sandbox -ChildPath 'Invoke-EnablePrivilegesWithoutSecurity.ps1'
Assert-TestSandboxPath -Sandbox $sandbox -Path $enablePrivilegesErrorScript
Set-Content -LiteralPath $enablePrivilegesErrorScript -Value @'
param ($ModulePath)
Import-Module -Name $ModulePath -ErrorAction Stop
$process = [System.Diagnostics.Process]::GetCurrentProcess()
try {
[ProcessPrivileges.ProcessExtensions]::RemovePrivilege($process, [ProcessPrivileges.Privilege]::Security) | Out-Null
}
catch {
}
Enable-Privileges -ErrorVariable enableErrors -ErrorAction SilentlyContinue
'COUNT:{0}' -f @($enableErrors).Count
if ($enableErrors) {
'ID:{0}' -f $enableErrors[0].FullyQualifiedErrorId
'CATEGORY:{0}' -f $enableErrors[0].CategoryInfo.Category
'EXCEPTIONTYPE:{0}' -f $enableErrors[0].Exception.GetType().FullName
'MESSAGE:{0}' -f $enableErrors[0].Exception.Message
}
'@
}
AfterAll {
$privateData['EnablePrivileges'] = $savedEnablePrivileges
}
AfterEach {
# A failing test here must not leave a privilege enabled for the tests that follow.
Disable-Privileges -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
}
It 'Enable-Privileges should write Enable Privilege Error with SecurityError and AdjustPriviledgeException when it cannot enable all four privileges' {
$output = & (Get-Process -Id $PID).Path -NoProfile -NonInteractive -ExecutionPolicy Bypass -File $enablePrivilegesErrorScript -ModulePath ([IO.Path]::GetFullPath($modulePath))
($output | Where-Object -FilterScript { $_ -like 'COUNT:*' }) | Should -Be 'COUNT:1'
($output | Where-Object -FilterScript { $_ -like 'ID:*' }) | Should -Be 'ID:Enable Privilege Error,NTFSSecurity.EnablePrivileges'
($output | Where-Object -FilterScript { $_ -like 'CATEGORY:*' }) | Should -Be 'CATEGORY:SecurityError'
($output | Where-Object -FilterScript { $_ -like 'EXCEPTIONTYPE:*' }) | Should -Be 'EXCEPTIONTYPE:Security2.AdjustPriviledgeException'
($output | Where-Object -FilterScript { $_ -like 'MESSAGE:*' }) | Should -BeLike 'MESSAGE:*Could not enable requested privileges*'
}
It 'Disable-Privileges should write Disable Privilege Error with SecurityError and AdjustPriviledgeException and no output when nothing is enabled' {
# EnablePrivileges=$false stops BeginProcessing from auto-enabling the privileges first, which would otherwise
# always satisfy the "something is enabled" check and hide this error path.
$privateData['EnablePrivileges'] = $false
Disable-Privileges -ErrorAction SilentlyContinue -WarningAction SilentlyContinue | Out-Null
$result = @(Disable-Privileges -PassThru -ErrorVariable disableErrors -ErrorAction SilentlyContinue)
$disableErrors | Should -HaveCount 1
$disableErrors[0].FullyQualifiedErrorId | Should -Be 'Disable Privilege Error,NTFSSecurity.DisablePrivileges'
$disableErrors[0].CategoryInfo.Category | Should -Be 'SecurityError'
$disableErrors[0].Exception | Should -BeOfType [Security2.AdjustPriviledgeException]
$disableErrors[0].Exception.Message | Should -Be 'Privileges are not enabled'
$result | Should -BeNullOrEmpty
}
}
Describe 'Get-DiskSpace with several drive letters' {
# Reuses the free-letter lookup of the existing tests at ItemCmdlets.Tests.ps1:802 and :1063.
It 'Should return only the system drive and warn for a drive letter without a volume, regardless of order (<Order>)' -ForEach @(
@{ Order = 'valid letter first' }
@{ Order = 'invalid letter first' }
) {
$used = @((Get-PSDrive -PSProvider FileSystem).Name) + @([System.IO.DriveInfo]::GetDrives() | ForEach-Object -Process { $_.Name.Substring(0, 1) })
$letter = [char[]](68..90) | Where-Object -FilterScript { [string] $_ -notin $used } | Select-Object -First 1
if (-not $letter) {
Set-ItResult -Skipped -Because 'every drive letter is in use'
return
}
$missingLetter = "${letter}:"
$driveLetters = if ($Order -eq 'valid letter first') { @($env:SystemDrive, $missingLetter) } else { @($missingLetter, $env:SystemDrive) }
$result = @(Get-DiskSpace -DriveLetter $driveLetters -WarningVariable spaceWarnings -WarningAction SilentlyContinue -ErrorVariable spaceErrors -ErrorAction SilentlyContinue)
$spaceErrors | Should -BeNullOrEmpty
$spaceWarnings.Message | Should -Be "Could not get drive details for '$missingLetter'"
$result | Should -HaveCount 1
$result[0].DriveName | Should -Be ('{0}\' -f $env:SystemDrive)
}
It 'Should accept a lower-case drive letter positionally and report the same total size as .NET' {
$systemDrive = New-Object -TypeName 'System.IO.DriveInfo' -ArgumentList $env:SystemDrive
$result = @(Get-DiskSpace $env:SystemDrive.ToLowerInvariant() -ErrorAction Stop)
$result | Should -HaveCount 1
$result[0].TotalNumberOfBytes | Should -Be $systemDrive.TotalSize
}
}
Describe 'Get-Privileges compared with an independent source' {
# whoami and the library name some privileges differently; these five are named consistently via 'Se<Name>Privilege'.
It 'Should match whoami /priv for the privileges that whoami and the library name the same way' {
$whoamiPrivileges = & whoami.exe /priv /fo csv | Select-Object -Skip 1 | ConvertFrom-Csv -Header 'Name', 'Description', 'State'
$libraryPrivileges = @(Get-Privileges -ErrorAction Stop)
foreach ($name in 'ChangeNotify', 'TakeOwnership', 'Restore', 'Backup', 'Security') {
$whoamiName = 'Se{0}Privilege' -f $name
$whoamiEntry = @($whoamiPrivileges | Where-Object -Property Name -EQ -Value $whoamiName)
$libraryEntry = @($libraryPrivileges | Where-Object -Property Privilege -EQ -Value $name)
if ($whoamiEntry.Count -gt 0) {
$libraryEntry | Should -HaveCount 1 -Because "Get-Privileges should list $name when whoami lists $whoamiName"
$libraryEntry[0] | Should -BeOfType [ProcessPrivileges.PrivilegeAndAttributes]
# The State column is localized (a German Windows prints Aktiviert), so the states are compared only where
# whoami prints the English words; the privilege names above are not localized.
if ($whoamiEntry[0].State -in 'Enabled', 'Disabled') {
$libraryEntry[0].PrivilegeState.ToString() | Should -Be $whoamiEntry[0].State
$isEnabledByAttributes = ($libraryEntry[0].PrivilegeAttributes -band [ProcessPrivileges.PrivilegeAttributes]::Enabled) -eq [ProcessPrivileges.PrivilegeAttributes]::Enabled
$isEnabledByAttributes | Should -Be ($whoamiEntry[0].State -eq 'Enabled')
}
}
else {
$libraryEntry | Should -BeNullOrEmpty -Because "Get-Privileges should not list $name when whoami does not list $whoamiName"
}
}
}
}
Describe 'Get-FileHash2 with pipeline input and ordered failures' {
It 'Should accept Get-ChildItem2 objects piped by value, skip a folder, and match Get-FileHash for each file' {
$dir = New-TestSandboxItem -Sandbox $sandbox -Name 'HashPipelineDir' -Directory
$fileA = Join-Path -Path $dir -ChildPath 'A.txt'
$fileB = Join-Path -Path $dir -ChildPath 'B.txt'
$subFolder = Join-Path -Path $dir -ChildPath 'Sub'
Assert-TestSandboxPath -Sandbox $sandbox -Path $fileA, $fileB, $subFolder
Set-Content -LiteralPath $fileA -Value 'HashA'
Set-Content -LiteralPath $fileB -Value 'HashB'
New-Item -ItemType Directory -Path $subFolder | Out-Null
$result = @(Get-ChildItem2 -Path $dir -ErrorVariable childErrors -ErrorAction SilentlyContinue | Get-FileHash2 -ErrorVariable hashErrors -ErrorAction SilentlyContinue)
$childErrors | Should -BeNullOrEmpty
$hashErrors | Should -BeNullOrEmpty
$result | Should -HaveCount 2
@($result.Name | Sort-Object) | Should -Be @('A.txt', 'B.txt')
foreach ($item in $result) {
$sourcePath = Join-Path -Path $dir -ChildPath $item.Name
$item.Hash | Should -BeExactly (Get-FileHash -LiteralPath $sourcePath -Algorithm SHA256).Hash
$item.Algorithm | Should -Be 'SHA256'
$item.PSObject.TypeNames[0] | Should -Be 'Alphaleonis.Win32.Filesystem.FileInfo+Hash'
}
# The algorithm comes from a variable, like the data of FileHash.Tests.ps1: the test compares with Get-FileHash and uses no hash for security.
$legacyAlgorithm = 'MD5'
$md5Result = @(Get-ChildItem -LiteralPath $dir -File | Get-FileHash2 -Algorithm $legacyAlgorithm -ErrorAction Stop)
$md5Result | Should -HaveCount 2
foreach ($item in $md5Result) {
$sourcePath = Join-Path -Path $dir -ChildPath $item.Name
$item.Hash | Should -BeExactly (Get-FileHash -LiteralPath $sourcePath -Algorithm $legacyAlgorithm).Hash
}
}
It 'Should write GetHashError with its category for a locked file first, hash the file that follows it, and resolve a relative path' {
$locked = New-TestSandboxItem -Sandbox $sandbox -Name 'HashLocked'
$first = New-TestSandboxItem -Sandbox $sandbox -Name 'HashFirstFollowing'
Set-Content -LiteralPath $first -Value 'FollowingContent'
$stream = [IO.File]::Open($locked, [IO.FileMode]::Open, [IO.FileAccess]::Read, [IO.FileShare]::None)
try {
$result = @(Get-FileHash2 -Path $locked, $first -ErrorVariable hashErrors -ErrorAction SilentlyContinue)
}
finally {
$stream.Dispose()
}
$hashErrors | Should -HaveCount 1
$hashErrors[0].FullyQualifiedErrorId | Should -BeLike 'GetHashError,*'
$hashErrors[0].CategoryInfo.Category | Should -Be 'WriteError'
$hashErrors[0].TargetObject | Should -Be $locked
$result | Should -HaveCount 1
$result[0].Name | Should -BeExactly (Split-Path -Path $first -Leaf)
$result[0].Hash | Should -BeExactly (Get-FileHash -LiteralPath $first -Algorithm SHA256).Hash
Push-Location -LiteralPath (Split-Path -Path $first -Parent)
try {
$relativeResult = Get-FileHash2 -Path (Split-Path -Path $first -Leaf) -ErrorAction Stop
}
finally {
Pop-Location
}
$relativeResult.Hash | Should -BeExactly $result[0].Hash
}
}
Loading…
Cancel
Save