Browse Source

chore(memory-bank): record the live tests and plan 5.0.0-rc5

Record the results of the live tests against 5.0.0-rc2, 5.0.0-rc4, and
the rc5 build, Decision 20 for the location of the live tests, the third
workstation, the deferred review findings, and the next steps to 5.0.0.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
pull/114/head
Raimund Andree 4 days ago
parent
commit
e2dd2fa925
  1. 81
      .memory-bank/activeContext.md
  2. 27
      .memory-bank/decisions/0020-live-tests-in-tests-lab.md
  3. 32
      .memory-bank/progress.md
  4. 10
      .memory-bank/systemPatterns.md
  5. 27
      .memory-bank/techContext.md

81
.memory-bank/activeContext.md

@ -1,6 +1,6 @@
--- ---
status: current status: current
last-verified: 2026-10-06 last-verified: 2026-10-07
owner: active-agent owner: active-agent
source: current task evidence source: current task evidence
--- ---
@ -9,47 +9,50 @@ source: current task evidence
## Current focus ## Current focus
Live tests of 5.0.0-rc4 in a lab, which the maintainer decided on 5.0.0-rc5, prepared on the branch `ai/release-5.0.0-rc5`: the live tests
2026-10-06 to run before 5.0.0. He continues on another workstation that in `Tests\Lab` (Decision 20) and the fix of
has his lab script. 5.0.0 waits for these results and for the tester `Get-NTFSEffectiveAccess -ServerName` that they found. The maintainer
feedback in #34; then the repository is archived in favor of pushes the branch, opens and merges the pull request, and tags
WindowsAccessControl (Decision 18). `5.0.0-rc5`; CI publishes it (Decision 12). Then, with the tester feedback
in #34, he decides on 5.0.0. After 5.0.0 the repository is archived in
favor of WindowsAccessControl (Decision 18).
## Evidence ## Evidence
- 2026-10-06: 5.0.0-rc4 is published from the tag `5.0.0-rc4` on - 2026-10-07: the live tests ran in the lab of WindowsAccessControl
`01d9264`, the merge commit of #113, and verified from the Gallery (`F1ADC1`, `F1AFile2`, `F1AFile1` in `a.forest1.net`) against the Gallery
package in both editions; its issues are closed (progress). packages of 5.0.0-rc2 and 5.0.0-rc4 and against the branch build, in
- The Pester tests run only on standalone machines against local NTFS Windows PowerShell 5.1 and PowerShell 7, with the same results in both:
folders, with local and well-known accounts. No test uses a UNC path, a - Case 1 (#34 over SMB): rc2 fails `Add-NTFSAccess`, `Clear-NTFSAccess`,
share, a domain account, or `Get-NTFSEffectiveAccess -ServerName`, which and `Set-NTFSSecurityDescriptor` with error 1307, on folders with and
calls `AuthzInitializeRemoteResourceManager` over RPC. 5.0.0 changed no without the auto-inherit flag; the other four cmdlets succeed in rc2
code that is specific to domains or SMB. too. rc4 passes all seven and keeps Administrators as the owner.
- In #34, the tester wrote on 2026-10-06 that the owner problem also exists - Case 2: the administrators of the file server read, add, and remove
on their IBM ESS system, and that he reports rc3 results against both audit entries over SMB; the delegated account gets the errors that the
their file servers on 2026-10-07. No lab reproduces IBM ESS. cmdlet pages describe, and the folders stay unchanged. Same in rc2.
- The second workstation has Hyper-V and AutomatedLab 5.61, but no - Case 3: with `-ServerName` of the file server, the result includes its
LabSources folder, ISO, or lab. local group, without a warning; without it, only the domain groups
- Hand commands to the maintainer as fenced code blocks at the end of the count. With a computer that can't be reached, rc2 and rc4 returned no
reply, and end the turn there; never put them in the question dialog, access, because error 1722 was swallowed; fixed on the branch.
which also covers a reply before it. A pull request names an issue - Case 4, long paths on the share, and #108 pass; #108 fails in rc2.
without a closing keyword unless the merge should close it (techContext). - The branch build passes every live test, and the 499 tests of `Tests`
in both editions.
- One `security-reviewer` pass approved the branch with minor findings;
the assertion of the fallback warning and the path guard of the live
tests were hardened. Deferred: the bare `catch` in
`Win32.GetEffectiveAccess`, which still swallows any other error of the
remote initialization (not reproducible: for a user who isn't an
administrator of the file server, the cmdlet writes "Access is denied");
the unchecked `AUTHZ_ACCESS_REPLY.Error`; a fallback warning that names
the server and the error, which would change behavior (Decision 16).
- #34: no report from the tester by 16:00 UTC on 2026-10-07; he announced
results against two file servers, one of them IBM ESS, for that day.
- The lab keeps the accounts, the share, and the folders of the last run;
`Invoke-NTFSSecurityLabTest.ps1 -RemoveFixture` removes them.
## Next step ## Next step
Build the lab with the maintainer's script: a domain controller, a file The maintainer runs the push and pull request commands of the session of
server with a share, and a client. From the client, run live tests against 2026-10-07, merges, and tags `5.0.0-rc5`. Then check the published package
5.0.0-rc2 as the baseline and 5.0.0-rc4, in Windows PowerShell 5.1 and with `Invoke-NTFSSecurityLabTest.ps1 -Version 5.0.0-rc5`, wait for the #34
PowerShell 7: feedback, and release 5.0.0 as `progress.md` describes.
1. #34 over SMB: a domain user who isn't an admin on the file server, with
Full Control on a share folder owned by Administrators, runs the access
and inheritance cmdlets on its UNC path. rc2 should fail with (1307);
rc4 should succeed and keep the owner.
2. The audit cmdlets over SMB, where the file server, not the client,
checks the Security privilege: as a user with and without it there.
3. `Get-NTFSEffectiveAccess` for domain accounts with nested groups, and
with `-ServerName`.
4. `Get-NTFSOrphanedAccess` with the entry of a deleted domain account.
Then, with the #34 feedback, release 5.0.0 as `progress.md` describes.

27
.memory-bank/decisions/0020-live-tests-in-tests-lab.md

@ -0,0 +1,27 @@
---
status: accepted
date: 2026-10-07
last-verified: 2026-10-07
owner: shared
source: maintainer decision of 2026-10-07
---
# Decision 20: Live tests in a lab live in Tests\Lab
- Choice: The live tests that need a file server and domain accounts live
in `Tests\Lab`: the Pester file `NTFSSecurity.Live.Tests.ps1`, the
controller `Invoke-NTFSSecurityLabTest.ps1`, which prepares an
AutomatedLab lab and runs the tests per module version and PowerShell
edition, and a README with the cases. CI excludes the folder through
`Run.ExcludePath` in `.github/scripts/Invoke-Tests.ps1`, and without a
configuration every live test skips. The default lab is the one of
WindowsAccessControl (`F1ADC1`, `F1AFile2`, `F1AFile1` in
`a.forest1.net`), which the maintainer allowed on 2026-10-07.
- Rationale: The tests in `Tests` run on one computer with local accounts.
#34 over SMB, the Security privilege that the file server checks,
`Get-NTFSEffectiveAccess -ServerName`, and orphaned domain accounts need a
file server and a domain. In the repository, a later release can repeat
the tests and review them in a pull request.
- Rejected: a handoff folder outside the repository, which keeps the tests
on one machine.
- Applied: 5.0.0-rc5.

32
.memory-bank/progress.md

@ -1,6 +1,6 @@
--- ---
status: current status: current
last-verified: 2026-10-06 last-verified: 2026-10-07
owner: active-agent owner: active-agent
source: repository evidence source: repository evidence
--- ---
@ -13,8 +13,11 @@ source: repository evidence
published by CI from the tag `5.0.0-rc4` on `master` (`01d9264`, the merge published by CI from the tag `5.0.0-rc4` on `master` (`01d9264`, the merge
of #113) on 2026-10-06 (Decision 12). It adds to 5.0.0-rc3 the fixes of the of #113) on 2026-10-06 (Decision 12). It adds to 5.0.0-rc3 the fixes of the
issues #41, #108, #109, and #111 and of the leftovers of the rc3 review. issues #41, #108, #109, and #111 and of the leftovers of the rc3 review.
The stable Gallery version is still 4.2.6. NTFSSecurity will be archived 5.0.0-rc5 is prepared on the branch `ai/release-5.0.0-rc5`: the live tests
soon; its users move to WindowsAccessControl (Decision 18). in a lab (Decision 20) and the fix of `Get-NTFSEffectiveAccess -ServerName`
that they found. The stable Gallery version is still 4.2.6. NTFSSecurity
will be archived soon; its users move to WindowsAccessControl
(Decision 18).
## Recent milestones ## Recent milestones
@ -56,6 +59,15 @@ soon; its users move to WindowsAccessControl (Decision 18).
small items (#111). One `security-reviewer` pass approved it; its Minor small items (#111). One `security-reviewer` pass approved it; its Minor
findings R1, R2, R6, and R8 were fixed before the merge. #41, #108, findings R1, R2, R6, and R8 were fixed before the merge. #41, #108,
#109, and #111 closed as completed, #90 and #107 as not planned. #109, and #111 closed as completed, #90 and #107 as not planned.
- 2026-10-07: live tests in the lab of WindowsAccessControl (Decision 20)
against 5.0.0-rc2 and 5.0.0-rc4 in both editions: rc2 fails #34 over SMB
with error 1307 for `Add-NTFSAccess`, `Clear-NTFSAccess`, and
`Set-NTFSSecurityDescriptor`; rc4 passes the four cases, except
`Get-NTFSEffectiveAccess -ServerName` with a computer that can't be
reached, which returned no access since before rc1. The maintainer chose
to fix it test-first in 5.0.0-rc5; the branch build passes all live tests
and the suite. One `security-reviewer` pass approved it with minor
findings (`activeContext.md`).
## Stable capabilities ## Stable capabilities
@ -70,9 +82,10 @@ soon; its users move to WindowsAccessControl (Decision 18).
## Open work ## Open work
1. Release 5.0.0 through CI (Decision 12) after the live tests in a lab 1. Publish 5.0.0-rc5 (merge, then tag), check its package in the lab with
(`activeContext.md`) and the tester feedback in #34: remove the label, `Tests\Lab\Invoke-NTFSSecurityLabTest.ps1 -Version 5.0.0-rc5`, and then
date `[Unreleased]` as `[5.0.0]`, add `5.0.0-rc4` to release 5.0.0 through CI (Decision 12) with the tester feedback in #34:
remove the label, date `[Unreleased]` as `[5.0.0]`, add `5.0.0-rc5` to
`$publishedVersions`, and tag `5.0.0` (steps in `$publishedVersions`, and tag `5.0.0` (steps in
`Docs/Contributing/05-Releasing.md`). #34 stays open with Bug and Help `Docs/Contributing/05-Releasing.md`). #34 stays open with Bug and Help
Wanted until a tester with a file server that refuses the owner Wanted until a tester with a file server that refuses the owner
@ -86,7 +99,12 @@ soon; its users move to WindowsAccessControl (Decision 18).
snapshots on read paths, and a duplicate SACL check; of rc4, R3 to R5, snapshots on read paths, and a duplicate SACL check; of rc4, R3 to R5,
R7, and five older defects, listed in the description of #113, among R7, and five older defects, listed in the description of #113, among
them the accounts filter that `RemoveFileSystemAccessRuleAll` and them the accounts filter that `RemoveFileSystemAccessRuleAll` and
`RemoveFileSystemAuditRuleAll` ignore, which no cmdlet passes. `RemoveFileSystemAuditRuleAll` ignore, which no cmdlet passes; of rc5,
the bare `catch` in `Win32.GetEffectiveAccess`, the unchecked
`AUTHZ_ACCESS_REPLY.Error`, a fallback warning without the server name,
and hardening of the lab controller (guards in the setup blocks,
interpolated `-EncodedCommand` paths, CredSSP by IP address, the
password string in memory, disabling the role accounts after a run).
4. `pwsh` 7.6.1 crashed three times during test runs on the ARM64 4. `pwsh` 7.6.1 crashed three times during test runs on the ARM64
workstation (x64 emulation), without module frames; none of the CI runs workstation (x64 emulation), without module frames; none of the CI runs
on native x64 on 2026-10-05 crashed. on native x64 on 2026-10-05 crashed.

10
.memory-bank/systemPatterns.md

@ -1,6 +1,6 @@
--- ---
status: current status: current
last-verified: 2026-10-06 last-verified: 2026-10-07
owner: active-agent owner: active-agent
source: repository evidence source: repository evidence
--- ---
@ -66,6 +66,7 @@ Each Decision record is a file in `decisions/`; read only the relevant ones.
| 17 | [Issue labels](decisions/0017-issue-labels.md) | | 17 | [Issue labels](decisions/0017-issue-labels.md) |
| 18 | [NTFSSecurity will be archived](decisions/0018-archive-for-windowsaccesscontrol.md) | | 18 | [NTFSSecurity will be archived](decisions/0018-archive-for-windowsaccesscontrol.md) |
| 19 | [Cmdlets write only the sections that they change](decisions/0019-write-only-changed-sections.md) | | 19 | [Cmdlets write only the sections that they change](decisions/0019-write-only-changed-sections.md) |
| 20 | [Live tests in a lab live in Tests\Lab](decisions/0020-live-tests-in-tests-lab.md) |
## Patterns ## Patterns
@ -96,3 +97,10 @@ Each Decision record is a file in `decisions/`; read only the relevant ones.
hook `BypassOnlineHelpRetrieval`. `Manifest.Tests.ps1` and hook `BypassOnlineHelpRetrieval`. `Manifest.Tests.ps1` and
`Release.Tests.ps1` check the manifest, the version (Decision 10), the `Release.Tests.ps1` check the manifest, the version (Decision 10), the
release notes, and the packages. release notes, and the packages.
- The live tests in `Tests\Lab` (Decision 20) run as domain accounts in a
lab: on the client over SMB, then on the file server, which checks what
the client runs left. They read and write descriptors as Windows stores
them with `GetFileSecurity` and `SetFileSecurity`, because
`GetNamedSecurityInfo` converts a DACL without the auto-inherit flag and
returns its owner. The expected effective rights come from the S4U tokens
of the file server and the client, like the Effective Access tab.

27
.memory-bank/techContext.md

@ -1,6 +1,6 @@
--- ---
status: current status: current
last-verified: 2026-10-04 last-verified: 2026-10-07
owner: active-agent owner: active-agent
source: repository evidence source: repository evidence
--- ---
@ -69,10 +69,23 @@ source: repository evidence
same way, its folder first on `$env:PSModulePath` of the test process. same way, its folder first on `$env:PSModulePath` of the test process.
The GitHub CLI is in `C:\Program Files\GitHub CLI`, outside the PATH of The GitHub CLI is in `C:\Program Files\GitHub CLI`, outside the PATH of
sessions started before its installation. sessions started before its installation.
- The third workstation (`ExHost`, a Windows Server 2025 VM, x64, used since
2026-10-07) runs the agent session elevated and hosts the AutomatedLab lab
`WindowsAccessControlLab` (Decision 20) with Hyper-V and AutomatedLab
5.61.704. It has no NuGet cache, platyPS, or GitHub CLI: check each
nuget.org package against the SHA-512 `packageHash` of its catalog entry
(`https://api.nuget.org/v3/registration5-semver1/<id>/<version>.json`,
then `catalogEntry`), and each Gallery package against `PackageHash` of
`api/v2/Packages(Id='<id>',Version='<version>')`. Pester 5.7.1 is in
`V:\Git\WindowsAccessControl\output\RequiredModules`; read issues and pull
requests through the GitHub REST API. The lab domains `a.forest1.net` and
`b.forest1.net` had a maximum password age of 42 days, so the password of
`install` expired on 2026-09-15 and AutomatedLab got access denied; it
never expires since 2026-10-07, as in `forest1.net`.
## Constraints ## Constraints
- `ModuleVersion` on `master` is `5.0.0` with the prerelease label `rc4`. - `ModuleVersion` is `5.0.0` with the prerelease label `rc5`.
The latest stable tag and Gallery release is `4.2.6`. The manifest The latest stable tag and Gallery release is `4.2.6`. The manifest
requires PowerShell 5.1 and .NET Framework 4.5.2, uses `RootModule`, and requires PowerShell 5.1 and .NET Framework 4.5.2, uses `RootModule`, and
lists exactly 36 cmdlets; `Test-ModuleManifest` passes in Windows lists exactly 36 cmdlets; `Test-ModuleManifest` passes in Windows
@ -108,7 +121,9 @@ source: repository evidence
at the end of the reply, which the chat shows with a copy button, and end at the end of the reply, which the chat shows with a copy button, and end
the turn there; the maintainer reports back in the chat. The question the turn there; the maintainer reports back in the chat. The question
dialog joins the lines of its text, has no copy button, and covers the dialog joins the lines of its text, has no copy button, and covers the
reply before it (maintainer, 2026-10-06). A pull request description reply before it (maintainer, 2026-10-06). A long question also hides its
choices, so that it can't be answered: keep it to a few short sentences
(2026-10-07). A pull request description
names an issue without a closing keyword (fixes, closes, resolves) unless names an issue without a closing keyword (fixes, closes, resolves) unless
the merge should close it: "fixes #34" in #112 closed #34. Simulated `gh` the merge should close it: "fixes #34" in #112 closed #34. Simulated `gh`
commands in offline tests must print what the real ones print, such as commands in offline tests must print what the real ones print, such as
@ -160,6 +175,12 @@ source: repository evidence
session. Run them as a basic user with `runas /trustlevel:0x20000`, and session. Run them as a basic user with `runas /trustlevel:0x20000`, and
give Windows PowerShell its own `PSModulePath`; that token holds one give Windows PowerShell its own `PSModulePath`; that token holds one
privilege, so the `Enable-Privileges -PassThru` count test fails there. privilege, so the `Enable-Privileges -PassThru` count test fails there.
- Live tests (Decision 20): in an elevated Windows PowerShell 5.1 session
on the lab host, `Tests\Lab\Invoke-NTFSSecurityLabTest.ps1` with
`-Version` for Gallery packages or `-ModulePath` for a build; it writes
the results to `$env:TEMP\NTFSSecurityLab\Results`. A run of two versions
in both editions takes about 30 minutes; `-RemoveFixture` removes its
accounts, share, and folders from the lab.
- Markdown lint: `npx markdownlint-cli2` with `MD013` limited to prose - Markdown lint: `npx markdownlint-cli2` with `MD013` limited to prose
(tables, code, and headings excluded) on the conceptual pages; for (tables, code, and headings excluded) on the conceptual pages; for
`CHANGELOG.md` also `MD024` with `siblings_only: true`, because every `CHANGELOG.md` also `MD024` with `siblings_only: true`, because every

Loading…
Cancel
Save