Ai/docs alignment (#91)
* chore: initialize the memory bank
Add the canonical .memory-bank base with evidence-based project context:
purpose and scope, workflows, stack and validation commands, architecture
map, decisions, and the open work found while documenting the cmdlets.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* docs: align documentation with the cmdlet source
- Fill all 36 platyPS cmdlet pages from the C# source: synopsis,
description, parameters, defaults, examples, inputs, outputs, and
notes, including documented limitations of the current code
- Check every example against live parameter metadata and run them in a
sandbox; fix examples that did not work (CSV restore, account filter,
recursive inheritance, -AccessRights typos)
- Rewrite the home, concepts, examples, README, and contributor pages;
add a grouped cmdlet overview, module settings, privileges, long paths,
and the platyPS workflow
- Document Remove-Item2 -PassThru as renamed after 4.2.6 (#64)
- Fix mkdocs.yml navigation, edit_uri, and copyright markup; add
build.os and a pinned MkDocs version for Read the Docs
- Point online help links to the pages on GitHub; add CHANGELOG.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* ci: build the module and check the docs against the build
The documentation check ran Update-MarkdownHelp against the NTFSSecurity
release from the PowerShell Gallery (4.2.6), so it failed for every
unreleased parameter change. PR #91 failed because 4.2.6 still has
Remove-Item2 -PassThur while the source and the docs have -PassThru.
- Build NTFSSecurity.csproj in Release on the Visual Studio 2022 image,
using the .NET Framework 4.5.2 reference assemblies package instead of
an installed targeting pack
- Check Docs/Cmdlets against the module built from source
- Pin platyPS 0.14.2 and MarkdownLinkCheck 0.2.0, and enable TLS 1.2 so
the NuGet provider bootstrap works
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* chore: record the green PR 91 build in the memory bank
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
# Changelog
|
|
|
|
|
|
|
|
|
|
All notable changes to this project are documented in this file.
|
|
|
|
|
|
|
|
|
|
The format is based on
|
|
|
|
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Releases up to
|
|
|
|
|
4.2.6 are described in the [version history](Docs/Version-History.md).
|
Ai/docs alignment (#91)
* chore: initialize the memory bank
Add the canonical .memory-bank base with evidence-based project context:
purpose and scope, workflows, stack and validation commands, architecture
map, decisions, and the open work found while documenting the cmdlets.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* docs: align documentation with the cmdlet source
- Fill all 36 platyPS cmdlet pages from the C# source: synopsis,
description, parameters, defaults, examples, inputs, outputs, and
notes, including documented limitations of the current code
- Check every example against live parameter metadata and run them in a
sandbox; fix examples that did not work (CSV restore, account filter,
recursive inheritance, -AccessRights typos)
- Rewrite the home, concepts, examples, README, and contributor pages;
add a grouped cmdlet overview, module settings, privileges, long paths,
and the platyPS workflow
- Document Remove-Item2 -PassThru as renamed after 4.2.6 (#64)
- Fix mkdocs.yml navigation, edit_uri, and copyright markup; add
build.os and a pinned MkDocs version for Read the Docs
- Point online help links to the pages on GitHub; add CHANGELOG.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* ci: build the module and check the docs against the build
The documentation check ran Update-MarkdownHelp against the NTFSSecurity
release from the PowerShell Gallery (4.2.6), so it failed for every
unreleased parameter change. PR #91 failed because 4.2.6 still has
Remove-Item2 -PassThur while the source and the docs have -PassThru.
- Build NTFSSecurity.csproj in Release on the Visual Studio 2022 image,
using the .NET Framework 4.5.2 reference assemblies package instead of
an installed targeting pack
- Check Docs/Cmdlets against the module built from source
- Pin platyPS 0.14.2 and MarkdownLinkCheck 0.2.0, and enable TLS 1.2 so
the NuGet provider bootstrap works
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* chore: record the green PR 91 build in the memory bank
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
|
|
|
|
|
## [Unreleased]
|
|
|
|
|
|
docs: generate the wiki pages from Docs
- .github/scripts/Export-WikiContent.ps1 converts Docs, except the
contributor guide, into flat wiki pages: Docs/README.md becomes Home,
cmdlet pages lose their platyPS metadata, links point to wiki pages or
to the files on GitHub, and links in code stay unchanged. It writes a
sidebar from the cmdlet groups of Docs/README.md, a footer, and the
former page How-to-install, and keeps the page name Version-History
that the release notes link to.
- Tests/Wiki.Tests.ps1 checks the conversion rules with a sample of Docs
and every link and anchor of the wiki generated from the real Docs.
- README, CHANGELOG, and the version history mention the wiki again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
- Publish the documentation in the
|
|
|
|
|
[wiki](https://github.com/raandree/NTFSSecurity/wiki), generated from the
|
|
|
|
|
`Docs` folder after every change, with a sidebar that lists all cmdlets
|
ci: publish releases from CI on a version tag, starting with 5.0.0-rc1
Pushing a tag such as 5.0.0 or 5.0.0-rc1 on master now publishes the
package that the build job built and tested to the PowerShell Gallery
and creates the GitHub release with NTFSSecurity.zip.
- New-ModulePackage.ps1 copies only the FileList files of the Release
build, so no debug symbols, XML documentation, or copy of
System.Management.Automation.dll ship. It builds the nupkg with
Compress-PSResource and adds the command tags (PSIncludes_Cmdlet,
PSCmdlet_*, PSCommand_*) that PSResourceGet leaves out and that the
Gallery uses to list cmdlets and that Find-Command searches. Every CI
run builds and uploads the packages.
- Get-ReleaseInfo.ps1 returns the version and release notes: a dated
CHANGELOG section for a release, the [Unreleased] section for a
prerelease.
- The release job checks that the tag matches the manifest version and
points to a commit on master, reads the API key from the environment
powershell-gallery, and skips steps already done, so a rerun is safe.
- The manifest gets the prerelease label rc1 and a release notes link;
the 5.0.0 changelog entries move back to [Unreleased] until the final
release.
- Tests/Release.Tests.ps1 covers both scripts and the packages; the
changelog check moves there from Manifest.Tests.ps1.
- Docs/Contributing/05-Releasing.md describes the one-time setup and the
release steps; Docs/README.md explains -AllowPrerelease.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Link the release notes in the PowerShell Gallery to this changelog
|
feat!: prepare version 5.0.0 with a valid module manifest
- Require Windows PowerShell 5.1 or PowerShell 7 (PowerShellVersion
5.1, which CompatiblePSEditions needs) and .NET Framework 4.5.2, and
use RootModule instead of the deprecated ModuleToProcess. Before,
Test-ModuleManifest, and with it Publish-Module, failed.
- Export exactly the 36 cmdlets: remove Show-NTFSSimpleAccess, which no
longer exists, and the duplicate inheritance cmdlets.
- Keep -PassThur, the name in 4.2.6 and earlier, as an alias of
Remove-Item2 -PassThru, deprecated in the changelog.
- Set version 5.0.0 in the manifest, in NTFSSecurity, Security2, and
PrivilegeControl, and in a new 5.0.0 section of CHANGELOG.md.
- Tests/Manifest.Tests.ps1 and Tests/Remove-Item2.Tests.ps1 guard the
manifest, the versions, and the alias.
BREAKING CHANGE: the module requires Windows PowerShell 5.1 or
PowerShell 7; the manifest no longer claims PowerShell 2.0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
|
Ai/docs alignment (#91)
* chore: initialize the memory bank
Add the canonical .memory-bank base with evidence-based project context:
purpose and scope, workflows, stack and validation commands, architecture
map, decisions, and the open work found while documenting the cmdlets.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* docs: align documentation with the cmdlet source
- Fill all 36 platyPS cmdlet pages from the C# source: synopsis,
description, parameters, defaults, examples, inputs, outputs, and
notes, including documented limitations of the current code
- Check every example against live parameter metadata and run them in a
sandbox; fix examples that did not work (CSV restore, account filter,
recursive inheritance, -AccessRights typos)
- Rewrite the home, concepts, examples, README, and contributor pages;
add a grouped cmdlet overview, module settings, privileges, long paths,
and the platyPS workflow
- Document Remove-Item2 -PassThru as renamed after 4.2.6 (#64)
- Fix mkdocs.yml navigation, edit_uri, and copyright markup; add
build.os and a pinned MkDocs version for Read the Docs
- Point online help links to the pages on GitHub; add CHANGELOG.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* ci: build the module and check the docs against the build
The documentation check ran Update-MarkdownHelp against the NTFSSecurity
release from the PowerShell Gallery (4.2.6), so it failed for every
unreleased parameter change. PR #91 failed because 4.2.6 still has
Remove-Item2 -PassThur while the source and the docs have -PassThru.
- Build NTFSSecurity.csproj in Release on the Visual Studio 2022 image,
using the .NET Framework 4.5.2 reference assemblies package instead of
an installed targeting pack
- Check Docs/Cmdlets against the module built from source
- Pin platyPS 0.14.2 and MarkdownLinkCheck 0.2.0, and enable TLS 1.2 so
the NuGet provider bootstrap works
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* chore: record the green PR 91 build in the memory bank
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
### Changed
|
|
|
|
|
|
feat!: prepare version 5.0.0 with a valid module manifest
- Require Windows PowerShell 5.1 or PowerShell 7 (PowerShellVersion
5.1, which CompatiblePSEditions needs) and .NET Framework 4.5.2, and
use RootModule instead of the deprecated ModuleToProcess. Before,
Test-ModuleManifest, and with it Publish-Module, failed.
- Export exactly the 36 cmdlets: remove Show-NTFSSimpleAccess, which no
longer exists, and the duplicate inheritance cmdlets.
- Keep -PassThur, the name in 4.2.6 and earlier, as an alias of
Remove-Item2 -PassThru, deprecated in the changelog.
- Set version 5.0.0 in the manifest, in NTFSSecurity, Security2, and
PrivilegeControl, and in a new 5.0.0 section of CHANGELOG.md.
- Tests/Manifest.Tests.ps1 and Tests/Remove-Item2.Tests.ps1 guard the
manifest, the versions, and the alias.
BREAKING CHANGE: the module requires Windows PowerShell 5.1 or
PowerShell 7; the manifest no longer claims PowerShell 2.0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- **Breaking:** require Windows PowerShell 5.1 or PowerShell 7, and declare
|
|
|
|
|
support for both editions in the module manifest
|
|
|
|
|
([#61](https://github.com/raandree/NTFSSecurity/issues/61)); the manifest
|
|
|
|
|
declared PowerShell 2.0 and .NET Framework 3.5, although the module needs
|
|
|
|
|
.NET Framework 4.5.2
|
|
|
|
|
- Rename the `-PassThur` parameter of `Remove-Item2` to `-PassThru`;
|
|
|
|
|
`-PassThur` still works as an alias
|
|
|
|
|
([#64](https://github.com/raandree/NTFSSecurity/pull/64))
|
ci: publish releases from CI on a version tag, starting with 5.0.0-rc1
Pushing a tag such as 5.0.0 or 5.0.0-rc1 on master now publishes the
package that the build job built and tested to the PowerShell Gallery
and creates the GitHub release with NTFSSecurity.zip.
- New-ModulePackage.ps1 copies only the FileList files of the Release
build, so no debug symbols, XML documentation, or copy of
System.Management.Automation.dll ship. It builds the nupkg with
Compress-PSResource and adds the command tags (PSIncludes_Cmdlet,
PSCmdlet_*, PSCommand_*) that PSResourceGet leaves out and that the
Gallery uses to list cmdlets and that Find-Command searches. Every CI
run builds and uploads the packages.
- Get-ReleaseInfo.ps1 returns the version and release notes: a dated
CHANGELOG section for a release, the [Unreleased] section for a
prerelease.
- The release job checks that the tag matches the manifest version and
points to a commit on master, reads the API key from the environment
powershell-gallery, and skips steps already done, so a rerun is safe.
- The manifest gets the prerelease label rc1 and a release notes link;
the 5.0.0 changelog entries move back to [Unreleased] until the final
release.
- Tests/Release.Tests.ps1 covers both scripts and the packages; the
changelog check moves there from Manifest.Tests.ps1.
- Docs/Contributing/05-Releasing.md describes the one-time setup and the
release steps; Docs/README.md explains -AllowPrerelease.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Publish the module as a Release build that contains only the module
|
|
|
|
|
files; 4.2.6 was a Debug build with debug symbols and a copy of
|
|
|
|
|
`System.Management.Automation.dll`
|
Ai/docs alignment (#91)
* chore: initialize the memory bank
Add the canonical .memory-bank base with evidence-based project context:
purpose and scope, workflows, stack and validation commands, architecture
map, decisions, and the open work found while documenting the cmdlets.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* docs: align documentation with the cmdlet source
- Fill all 36 platyPS cmdlet pages from the C# source: synopsis,
description, parameters, defaults, examples, inputs, outputs, and
notes, including documented limitations of the current code
- Check every example against live parameter metadata and run them in a
sandbox; fix examples that did not work (CSV restore, account filter,
recursive inheritance, -AccessRights typos)
- Rewrite the home, concepts, examples, README, and contributor pages;
add a grouped cmdlet overview, module settings, privileges, long paths,
and the platyPS workflow
- Document Remove-Item2 -PassThru as renamed after 4.2.6 (#64)
- Fix mkdocs.yml navigation, edit_uri, and copyright markup; add
build.os and a pinned MkDocs version for Read the Docs
- Point online help links to the pages on GitHub; add CHANGELOG.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* ci: build the module and check the docs against the build
The documentation check ran Update-MarkdownHelp against the NTFSSecurity
release from the PowerShell Gallery (4.2.6), so it failed for every
unreleased parameter change. PR #91 failed because 4.2.6 still has
Remove-Item2 -PassThur while the source and the docs have -PassThru.
- Build NTFSSecurity.csproj in Release on the Visual Studio 2022 image,
using the .NET Framework 4.5.2 reference assemblies package instead of
an installed targeting pack
- Check Docs/Cmdlets against the module built from source
- Pin platyPS 0.14.2 and MarkdownLinkCheck 0.2.0, and enable TLS 1.2 so
the NuGet provider bootstrap works
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* chore: record the green PR 91 build in the memory bank
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Document every cmdlet with synopsis, description, parameters, examples,
|
|
|
|
|
inputs, outputs, and notes, checked against the source code
|
|
|
|
|
- Rewrite the home, concepts, examples, and contributor pages to match the
|
|
|
|
|
current cmdlets, including module settings, privileges, and long paths
|
|
|
|
|
- Move the version history and the installation instructions from the wiki
|
ci: publish releases from CI on a version tag, starting with 5.0.0-rc1
Pushing a tag such as 5.0.0 or 5.0.0-rc1 on master now publishes the
package that the build job built and tested to the PowerShell Gallery
and creates the GitHub release with NTFSSecurity.zip.
- New-ModulePackage.ps1 copies only the FileList files of the Release
build, so no debug symbols, XML documentation, or copy of
System.Management.Automation.dll ship. It builds the nupkg with
Compress-PSResource and adds the command tags (PSIncludes_Cmdlet,
PSCmdlet_*, PSCommand_*) that PSResourceGet leaves out and that the
Gallery uses to list cmdlets and that Find-Command searches. Every CI
run builds and uploads the packages.
- Get-ReleaseInfo.ps1 returns the version and release notes: a dated
CHANGELOG section for a release, the [Unreleased] section for a
prerelease.
- The release job checks that the tag matches the manifest version and
points to a commit on master, reads the API key from the environment
powershell-gallery, and skips steps already done, so a rerun is safe.
- The manifest gets the prerelease label rc1 and a release notes link;
the 5.0.0 changelog entries move back to [Unreleased] until the final
release.
- Tests/Release.Tests.ps1 covers both scripts and the packages; the
changelog check moves there from Manifest.Tests.ps1.
- Docs/Contributing/05-Releasing.md describes the one-time setup and the
release steps; Docs/README.md explains -AllowPrerelease.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
into the documentation, and complete the version history with the release
|
|
|
|
|
dates from the PowerShell Gallery, the missing notes for 4.2.2, 4.2.5, and
|
|
|
|
|
4.2.6, and detailed notes for 4.2.4
|
|
|
|
|
- Describe the module as a PowerShell module in the manifest, which the
|
|
|
|
|
PowerShell Gallery shows; it said Windows PowerShell, although the module
|
|
|
|
|
supports PowerShell 7 as well
|
|
|
|
|
- Rename `-RemoveInheritedAccessRules` of `Disable-NTFSAuditInheritance` to
|
|
|
|
|
`-RemoveInheritedAuditRules` and `-RemoveExplicitAccessRules` of
|
|
|
|
|
`Enable-NTFSAuditInheritance` to `-RemoveExplicitAuditRules`, because they
|
|
|
|
|
act on audit entries; the old names still work as aliases
|
|
|
|
|
- **Breaking:** `Set-NTFSInheritance` keeps entries like the dedicated
|
|
|
|
|
cmdlets: `-AccessInheritanceEnabled $false` now copies the inherited access
|
|
|
|
|
entries into the DACL instead of removing them, and
|
|
|
|
|
`-AuditInheritanceEnabled $true` now keeps the explicit audit entries. A
|
|
|
|
|
script that used `-AccessInheritanceEnabled $false` to drop the inherited
|
|
|
|
|
access entries now leaves them in place, which grants broader access than
|
|
|
|
|
before. To remove the entries, use
|
|
|
|
|
`Disable-NTFSAccessInheritance -RemoveInheritedAccessRules` or
|
|
|
|
|
`Enable-NTFSAuditInheritance -RemoveExplicitAuditRules`
|
|
|
|
|
- **Breaking:** `Get-ChildItem2 -Attributes` returns the items that have any
|
|
|
|
|
of the listed attributes, like `Get-ChildItem`; it returned only the items
|
|
|
|
|
that had all of them. A call that lists several attributes now returns
|
|
|
|
|
more items, including hidden and system items when those are in the
|
|
|
|
|
list, so review calls whose result is deleted or whose permissions are
|
|
|
|
|
changed. To get the old result, filter with `Where-Object`, as the cmdlet
|
|
|
|
|
page shows. An empty value, such as `0`, is now an error; it returned
|
|
|
|
|
every item, also the hidden ones
|
|
|
|
|
([#5](https://github.com/raandree/NTFSSecurity/issues/5))
|
|
|
|
|
- **Breaking:** remove the alias `Size` of `LengthOnDisk` from the files of
|
|
|
|
|
`Get-ChildItem`, which made the import fail in Windows PowerShell when
|
|
|
|
|
another module had added a `Size` member; use `LengthOnDisk`
|
|
|
|
|
([#82](https://github.com/raandree/NTFSSecurity/issues/82))
|
fix: write only the sections of the security descriptor that a cmdlet changes
The access and audit cmdlets wrote the owner of an item back with the
entries they changed. For a DACL without the auto-inherit flag, Windows
returns the owner and the group even when only the DACL is read, and the
cmdlets wrote every section that the descriptor held. Without the Restore
privilege, or on a file server that refuses the owner, the write failed
with error 1307 (#34).
- Add-NTFSAccess, Clear-NTFSAccess, Add-NTFSAudit, and Clear-NTFSAudit
read only the DACL or the SACL. FileSystemSecurity2.Write(),
Remove-NTFSAccess, and Remove-NTFSAudit write only the sections they
read, which also fixes the access inheritance cmdlets.
- Read together with the SACL, the inherited entries of such a DACL lose
their inherited flag when the parent folder has no SACL, and the
cmdlets stored them as explicit copies. Get-NTFSSecurityDescriptor now
reads the DACL in a separate call.
- Set-NTFSSecurityDescriptor writes only the sections that changed since
they were read; an unchanged descriptor writes nothing (maintainer
decision of 2026-10-06).
- Clear-NTFSAudit writes nothing for an item without a SACL, and reports
an error without the Security privilege (maintainer decision).
The regression tests failed before and pass after the fix in Windows
PowerShell 5.1 and PowerShell 7, elevated and as a basic user.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Write only the sections of a security descriptor that changed since it
|
|
|
|
|
was read in `Set-NTFSSecurityDescriptor`, such as the DACL after
|
|
|
|
|
`Add-NTFSAccess -SecurityDescriptor`; a descriptor without changes writes
|
|
|
|
|
nothing, and `-Verbose` names the sections that the cmdlet writes. The
|
|
|
|
|
cmdlet wrote every section that `Get-NTFSSecurityDescriptor` had read,
|
|
|
|
|
also an unchanged owner, which failed with error 1307 where the account
|
|
|
|
|
may not assign that owner
|
fix: write only the sections of the security descriptor that a cmdlet changes
The access and audit cmdlets wrote the owner of an item back with the
entries they changed. For a DACL without the auto-inherit flag, Windows
returns the owner and the group even when only the DACL is read, and the
cmdlets wrote every section that the descriptor held. Without the Restore
privilege, or on a file server that refuses the owner, the write failed
with error 1307 (#34).
- Add-NTFSAccess, Clear-NTFSAccess, Add-NTFSAudit, and Clear-NTFSAudit
read only the DACL or the SACL. FileSystemSecurity2.Write(),
Remove-NTFSAccess, and Remove-NTFSAudit write only the sections they
read, which also fixes the access inheritance cmdlets.
- Read together with the SACL, the inherited entries of such a DACL lose
their inherited flag when the parent folder has no SACL, and the
cmdlets stored them as explicit copies. Get-NTFSSecurityDescriptor now
reads the DACL in a separate call.
- Set-NTFSSecurityDescriptor writes only the sections that changed since
they were read; an unchanged descriptor writes nothing (maintainer
decision of 2026-10-06).
- Clear-NTFSAudit writes nothing for an item without a SACL, and reports
an error without the Security privilege (maintainer decision).
The regression tests failed before and pass after the fix in Windows
PowerShell 5.1 and PowerShell 7, elevated and as a basic user.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
([#34](https://github.com/raandree/NTFSSecurity/issues/34))
|
|
|
|
|
- Document that `Get-NTFSEffectiveAccess -ServerName` works only for the
|
|
|
|
|
administrators of the named computer and the members of its group Access
|
|
|
|
|
Control Assistance Operators; any other account gets the error "Access is
|
|
|
|
|
denied" and no result
|
feat(links)!: require -Path and -Target and continue after errors in the link cmdlets
New-NTFSHardLink and New-NTFSSymbolicLink now require -Path and -Target.
Without -Path, they failed with an index error; without -Target, they
used the current location, so New-NTFSSymbolicLink -Path Link created a
link to the current folder.
For a link that they can't create, they write a non-terminating
CreateHardLinkError or CreateSymbolicLinkError with the category
ResourceExists, ObjectNotFound, InvalidArgument, PermissionDenied, or
WriteError, and continue with the next object from the pipeline; they
stopped with a terminating error.
Fixed on the way: every object piped to the cmdlets failed with
GetDefaultValueFailed, because PowerShell reads a parameter that takes
pipeline input before it binds the input, and the getter of -Path threw
on the empty list. The pages show piping rows of a CSV file.
BREAKING CHANGE: a script that omits -Path or -Target gets a prompt, or
an error in a non-interactive session, and a script that relies on a
terminating error of the link cmdlets needs -ErrorAction Stop.
Decision 22, items 7 and 8: assumptions in autopilot, flagged for the
maintainer's review.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- **Breaking:** require `-Path` and `-Target` in `New-NTFSHardLink` and
|
|
|
|
|
`New-NTFSSymbolicLink`. Without `-Path`, they failed with an index error;
|
|
|
|
|
without `-Target`, they used the current location, so
|
|
|
|
|
`New-NTFSSymbolicLink -Path Link` created a link to the current folder
|
|
|
|
|
- **Breaking:** write a non-terminating error in `New-NTFSHardLink` and
|
|
|
|
|
`New-NTFSSymbolicLink` for a link that they can't create, such as for an
|
fix(links): name the items in the errors and continue after an invalid path
From the security-reviewer pass over be04cb7..4ee01e5 (Minor 1, 2, and
5, Nit 9):
- A path with a character that Windows doesn't allow, such as |, stopped
the pipeline in Windows PowerShell, where resolving the path throws an
ArgumentException; both cmdlets now write a non-terminating error with
the category InvalidArgument, also in PowerShell 7, where AlphaFS
rejects the path when it creates the link.
- The errors of New-NTFSSymbolicLink for an existing -Path and a missing
-Target, and of New-NTFSHardLink for a folder as -Target, named no path.
- New-NTFSSymbolicLink checked -Target before -Path, so that the two
cmdlets reported different errors for an existing -Path with a missing
-Target; both check -Path first now.
- The pages list objects with Path and Target as input of their own.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
existing `-Path`, a missing `-Target`, or a path with a character that
|
|
|
|
|
Windows doesn't allow, and continue with the next link; they stopped
|
|
|
|
|
with a terminating error. A script that relies on the stop needs
|
|
|
|
|
`-ErrorAction Stop`
|
|
|
|
|
- Name the computer in the warning of `Get-NTFSEffectiveAccess` when the
|
|
|
|
|
computer of `-ServerName` can't be reached
|
Ai/docs alignment (#91)
* chore: initialize the memory bank
Add the canonical .memory-bank base with evidence-based project context:
purpose and scope, workflows, stack and validation commands, architecture
map, decisions, and the open work found while documenting the cmdlets.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* docs: align documentation with the cmdlet source
- Fill all 36 platyPS cmdlet pages from the C# source: synopsis,
description, parameters, defaults, examples, inputs, outputs, and
notes, including documented limitations of the current code
- Check every example against live parameter metadata and run them in a
sandbox; fix examples that did not work (CSV restore, account filter,
recursive inheritance, -AccessRights typos)
- Rewrite the home, concepts, examples, README, and contributor pages;
add a grouped cmdlet overview, module settings, privileges, long paths,
and the platyPS workflow
- Document Remove-Item2 -PassThru as renamed after 4.2.6 (#64)
- Fix mkdocs.yml navigation, edit_uri, and copyright markup; add
build.os and a pinned MkDocs version for Read the Docs
- Point online help links to the pages on GitHub; add CHANGELOG.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* ci: build the module and check the docs against the build
The documentation check ran Update-MarkdownHelp against the NTFSSecurity
release from the PowerShell Gallery (4.2.6), so it failed for every
unreleased parameter change. PR #91 failed because 4.2.6 still has
Remove-Item2 -PassThur while the source and the docs have -PassThru.
- Build NTFSSecurity.csproj in Release on the Visual Studio 2022 image,
using the .NET Framework 4.5.2 reference assemblies package instead of
an installed targeting pack
- Check Docs/Cmdlets against the module built from source
- Pin platyPS 0.14.2 and MarkdownLinkCheck 0.2.0, and enable TLS 1.2 so
the NuGet provider bootstrap works
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* chore: record the green PR 91 build in the memory bank
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
|
feat!: prepare version 5.0.0 with a valid module manifest
- Require Windows PowerShell 5.1 or PowerShell 7 (PowerShellVersion
5.1, which CompatiblePSEditions needs) and .NET Framework 4.5.2, and
use RootModule instead of the deprecated ModuleToProcess. Before,
Test-ModuleManifest, and with it Publish-Module, failed.
- Export exactly the 36 cmdlets: remove Show-NTFSSimpleAccess, which no
longer exists, and the duplicate inheritance cmdlets.
- Keep -PassThur, the name in 4.2.6 and earlier, as an alias of
Remove-Item2 -PassThru, deprecated in the changelog.
- Set version 5.0.0 in the manifest, in NTFSSecurity, Security2, and
PrivilegeControl, and in a new 5.0.0 section of CHANGELOG.md.
- Tests/Manifest.Tests.ps1 and Tests/Remove-Item2.Tests.ps1 guard the
manifest, the versions, and the alias.
BREAKING CHANGE: the module requires Windows PowerShell 5.1 or
PowerShell 7; the manifest no longer claims PowerShell 2.0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
### Deprecated
|
|
|
|
|
|
|
|
|
|
- Deprecate NTFSSecurity as a whole: the project will be archived soon.
|
|
|
|
|
Move to
|
|
|
|
|
[WindowsAccessControl](https://github.com/raandree/WindowsAccessControl),
|
fix: write only the sections of the security descriptor that a cmdlet changes
The access and audit cmdlets wrote the owner of an item back with the
entries they changed. For a DACL without the auto-inherit flag, Windows
returns the owner and the group even when only the DACL is read, and the
cmdlets wrote every section that the descriptor held. Without the Restore
privilege, or on a file server that refuses the owner, the write failed
with error 1307 (#34).
- Add-NTFSAccess, Clear-NTFSAccess, Add-NTFSAudit, and Clear-NTFSAudit
read only the DACL or the SACL. FileSystemSecurity2.Write(),
Remove-NTFSAccess, and Remove-NTFSAudit write only the sections they
read, which also fixes the access inheritance cmdlets.
- Read together with the SACL, the inherited entries of such a DACL lose
their inherited flag when the parent folder has no SACL, and the
cmdlets stored them as explicit copies. Get-NTFSSecurityDescriptor now
reads the DACL in a separate call.
- Set-NTFSSecurityDescriptor writes only the sections that changed since
they were read; an unchanged descriptor writes nothing (maintainer
decision of 2026-10-06).
- Clear-NTFSAudit writes nothing for an item without a SACL, and reports
an error without the Security privilege (maintainer decision).
The regression tests failed before and pass after the fix in Windows
PowerShell 5.1 and PowerShell 7, elevated and as a basic user.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
which is also on the PowerShell Gallery. The description of NTFSSecurity
|
|
|
|
|
in the PowerShell Gallery says so as well
|
feat!: prepare version 5.0.0 with a valid module manifest
- Require Windows PowerShell 5.1 or PowerShell 7 (PowerShellVersion
5.1, which CompatiblePSEditions needs) and .NET Framework 4.5.2, and
use RootModule instead of the deprecated ModuleToProcess. Before,
Test-ModuleManifest, and with it Publish-Module, failed.
- Export exactly the 36 cmdlets: remove Show-NTFSSimpleAccess, which no
longer exists, and the duplicate inheritance cmdlets.
- Keep -PassThur, the name in 4.2.6 and earlier, as an alias of
Remove-Item2 -PassThru, deprecated in the changelog.
- Set version 5.0.0 in the manifest, in NTFSSecurity, Security2, and
PrivilegeControl, and in a new 5.0.0 section of CHANGELOG.md.
- Tests/Manifest.Tests.ps1 and Tests/Remove-Item2.Tests.ps1 guard the
manifest, the versions, and the alias.
BREAKING CHANGE: the module requires Windows PowerShell 5.1 or
PowerShell 7; the manifest no longer claims PowerShell 2.0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Deprecate the `-PassThur` alias of `Remove-Item2`; use `-PassThru`
|
|
|
|
|
- Deprecate the `MACTripleDES` value of `Get-FileHash2 -Algorithm`: it uses
|
|
|
|
|
a random key, so its result differs on every call; the cmdlet now warns
|
|
|
|
|
when you use it
|
feat!: prepare version 5.0.0 with a valid module manifest
- Require Windows PowerShell 5.1 or PowerShell 7 (PowerShellVersion
5.1, which CompatiblePSEditions needs) and .NET Framework 4.5.2, and
use RootModule instead of the deprecated ModuleToProcess. Before,
Test-ModuleManifest, and with it Publish-Module, failed.
- Export exactly the 36 cmdlets: remove Show-NTFSSimpleAccess, which no
longer exists, and the duplicate inheritance cmdlets.
- Keep -PassThur, the name in 4.2.6 and earlier, as an alias of
Remove-Item2 -PassThru, deprecated in the changelog.
- Set version 5.0.0 in the manifest, in NTFSSecurity, Security2, and
PrivilegeControl, and in a new 5.0.0 section of CHANGELOG.md.
- Tests/Manifest.Tests.ps1 and Tests/Remove-Item2.Tests.ps1 guard the
manifest, the versions, and the alias.
BREAKING CHANGE: the module requires Windows PowerShell 5.1 or
PowerShell 7; the manifest no longer claims PowerShell 2.0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
|
Ai/docs alignment (#91)
* chore: initialize the memory bank
Add the canonical .memory-bank base with evidence-based project context:
purpose and scope, workflows, stack and validation commands, architecture
map, decisions, and the open work found while documenting the cmdlets.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* docs: align documentation with the cmdlet source
- Fill all 36 platyPS cmdlet pages from the C# source: synopsis,
description, parameters, defaults, examples, inputs, outputs, and
notes, including documented limitations of the current code
- Check every example against live parameter metadata and run them in a
sandbox; fix examples that did not work (CSV restore, account filter,
recursive inheritance, -AccessRights typos)
- Rewrite the home, concepts, examples, README, and contributor pages;
add a grouped cmdlet overview, module settings, privileges, long paths,
and the platyPS workflow
- Document Remove-Item2 -PassThru as renamed after 4.2.6 (#64)
- Fix mkdocs.yml navigation, edit_uri, and copyright markup; add
build.os and a pinned MkDocs version for Read the Docs
- Point online help links to the pages on GitHub; add CHANGELOG.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* ci: build the module and check the docs against the build
The documentation check ran Update-MarkdownHelp against the NTFSSecurity
release from the PowerShell Gallery (4.2.6), so it failed for every
unreleased parameter change. PR #91 failed because 4.2.6 still has
Remove-Item2 -PassThur while the source and the docs have -PassThru.
- Build NTFSSecurity.csproj in Release on the Visual Studio 2022 image,
using the .NET Framework 4.5.2 reference assemblies package instead of
an installed targeting pack
- Check Docs/Cmdlets against the module built from source
- Pin platyPS 0.14.2 and MarkdownLinkCheck 0.2.0, and enable TLS 1.2 so
the NuGet provider bootstrap works
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* chore: record the green PR 91 build in the memory bank
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
- Retain the supplied path in the public access- and audit-rule constructors
|
|
|
|
|
so their `FullName`, `Name`, and simplified audit conversions identify
|
|
|
|
|
the item
|
|
|
|
|
- Reduce `ReadData` to `Read` in simplified audit entries, and compare them
|
|
|
|
|
with audit entries rather than access entries, preserving equality with
|
|
|
|
|
themselves and with equivalent simplified audit objects
|
|
|
|
|
- Compare boxed privilege output values by their privilege and attributes;
|
|
|
|
|
the object overload rejected privilege values and recursively compared
|
|
|
|
|
an attributes enum instead
|
|
|
|
|
- Fix `Clear-NTFSAccess -DisableInheritance` and `Set-NTFSSecurityDescriptor`,
|
|
|
|
|
which reported a `RestoreOwnerError` for an owner that had not changed:
|
|
|
|
|
after they took ownership of an item that the user owned already and left a
|
|
|
|
|
DACL without the right to set an owner, they failed to set the same owner
|
|
|
|
|
back
|
|
|
|
|
- Fix `InheritedFrom` of `Get-NTFSAccess` and `Get-NTFSAudit` for an entry
|
|
|
|
|
whose folder Windows cannot name, such as for an item that was deleted
|
|
|
|
|
after it was read or a folder above it that the user cannot read: the text
|
|
|
|
|
read `unknown paren`, and the explicit entries showed it as well. An
|
|
|
|
|
inherited entry now shows `unknown parent`, and an explicit entry no source
|
fix(help): ship the generated help file so Get-Help works (#93)
* fix(help): ship the generated help file so Get-Help works
Get-Help showed only the syntax of the cmdlets: the module shipped a
pre-4.x MAML file for the old command names under the wrong name
(NTFSSecurity-Help.xml), while PowerShell looks for
en-US\NTFSSecurity.dll-Help.xml.
- Generate en-US\NTFSSecurity.dll-Help.xml from Docs/Cmdlets with
New-ExternalHelp and commit it. The csproj copies it to the output,
so every build ships it, including the local Debug builds that
releases are published from.
- List all runtime files, including the help file, in FileList.
- Remove the stale NTFSSecurity-Help.xml and the unused help editor
project NTFSSecurity\Help\NTFSSecurity.Help.pshproj.
- Add Tests\Help.Tests.ps1 (Pester 5): Get-Help shows the synopsis,
parameters, examples, and online link of every page, and
Get-Help -Online resolves to the GitHub page.
- Reword six sentences in five cmdlet pages so that each link ends its
sentence: platyPS drops the space after a link in the help text.
- CI regenerates the help file and fails when it differs from the
committed file, then runs the Pester tests.
- Document the regeneration step and the link rule in the contributor
guide.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* ci: report each Pester test once on AppVeyor
AppVeyor build 54834154 passed all 218 Pester tests but listed 870 on
its Tests tab: the NUnit import files a Pester 5 test under every block
that contains it (Pester, test file, Describe, and Context).
Report the results through the build worker API instead
(POST api/tests/batch): one entry per test with its outcome, duration,
and error message. Outside AppVeyor, and when no test ran, the step
sends nothing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Fix `Get-Help`, which showed only the syntax: ship the help file
|
|
|
|
|
`en-US\NTFSSecurity.dll-Help.xml` generated from the cmdlet documentation,
|
|
|
|
|
including the links that `Get-Help -Online` opens, instead of the outdated
|
|
|
|
|
`NTFSSecurity-Help.xml`
|
Ai/docs alignment (#91)
* chore: initialize the memory bank
Add the canonical .memory-bank base with evidence-based project context:
purpose and scope, workflows, stack and validation commands, architecture
map, decisions, and the open work found while documenting the cmdlets.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* docs: align documentation with the cmdlet source
- Fill all 36 platyPS cmdlet pages from the C# source: synopsis,
description, parameters, defaults, examples, inputs, outputs, and
notes, including documented limitations of the current code
- Check every example against live parameter metadata and run them in a
sandbox; fix examples that did not work (CSV restore, account filter,
recursive inheritance, -AccessRights typos)
- Rewrite the home, concepts, examples, README, and contributor pages;
add a grouped cmdlet overview, module settings, privileges, long paths,
and the platyPS workflow
- Document Remove-Item2 -PassThru as renamed after 4.2.6 (#64)
- Fix mkdocs.yml navigation, edit_uri, and copyright markup; add
build.os and a pinned MkDocs version for Read the Docs
- Point online help links to the pages on GitHub; add CHANGELOG.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* ci: build the module and check the docs against the build
The documentation check ran Update-MarkdownHelp against the NTFSSecurity
release from the PowerShell Gallery (4.2.6), so it failed for every
unreleased parameter change. PR #91 failed because 4.2.6 still has
Remove-Item2 -PassThur while the source and the docs have -PassThru.
- Build NTFSSecurity.csproj in Release on the Visual Studio 2022 image,
using the .NET Framework 4.5.2 reference assemblies package instead of
an installed targeting pack
- Check Docs/Cmdlets against the module built from source
- Pin platyPS 0.14.2 and MarkdownLinkCheck 0.2.0, and enable TLS 1.2 so
the NuGet provider bootstrap works
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* chore: record the green PR 91 build in the memory bank
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Fix documentation examples that did not work, such as restoring
|
|
|
|
|
permissions from a CSV file and filtering entries by account
|
feat!: prepare version 5.0.0 with a valid module manifest
- Require Windows PowerShell 5.1 or PowerShell 7 (PowerShellVersion
5.1, which CompatiblePSEditions needs) and .NET Framework 4.5.2, and
use RootModule instead of the deprecated ModuleToProcess. Before,
Test-ModuleManifest, and with it Publish-Module, failed.
- Export exactly the 36 cmdlets: remove Show-NTFSSimpleAccess, which no
longer exists, and the duplicate inheritance cmdlets.
- Keep -PassThur, the name in 4.2.6 and earlier, as an alias of
Remove-Item2 -PassThru, deprecated in the changelog.
- Set version 5.0.0 in the manifest, in NTFSSecurity, Security2, and
PrivilegeControl, and in a new 5.0.0 section of CHANGELOG.md.
- Tests/Manifest.Tests.ps1 and Tests/Remove-Item2.Tests.ps1 guard the
manifest, the versions, and the alias.
BREAKING CHANGE: the module requires Windows PowerShell 5.1 or
PowerShell 7; the manifest no longer claims PowerShell 2.0.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Remove `Show-NTFSSimpleAccess`, which no longer exists, and duplicate
|
|
|
|
|
entries from the cmdlets that the module manifest exports and the
|
|
|
|
|
PowerShell Gallery lists
|
|
|
|
|
- Fix `Set-NTFSInheritance`, which failed with "Nullable object must have a
|
|
|
|
|
value" when `-AccessInheritanceEnabled` or `-AuditInheritanceEnabled` was
|
|
|
|
|
omitted; an omitted parameter now leaves its section unchanged
|
|
|
|
|
- Fix `Get-ChildItem2`, which stopped with an `InvalidCastException` when
|
|
|
|
|
`-Path` pointed to a file; it now returns the file, like `Get-ChildItem`
|
|
|
|
|
- Fix `Get-FileHash2`, which stopped at a folder in `-Path` and didn't hash
|
|
|
|
|
the files that followed it; folders are now skipped
|
|
|
|
|
- Fix `Get-NTFSAudit`, which returned nothing without the Security privilege
|
|
|
|
|
instead of an error, and which returned the entries of the previous item
|
|
|
|
|
again after a path whose security descriptor it couldn't read; it also no
|
|
|
|
|
longer takes ownership of an item whose audit entries it can't read, which
|
|
|
|
|
didn't help and could leave the owner changed
|
|
|
|
|
- Fix `Get-NTFSAccess`, which returned the entries of the previous item again
|
|
|
|
|
after a path whose ACL it couldn't read
|
|
|
|
|
- Fix `Add-NTFSAudit`, whose `-Account` and `-AccessRights` parameters were
|
|
|
|
|
both at position 2, so that positional calls failed; `-AccessRights` is
|
|
|
|
|
now at position 3, like in `Remove-NTFSAudit`
|
|
|
|
|
([#4](https://github.com/raandree/NTFSSecurity/issues/4))
|
|
|
|
|
- Fix `-PassThru` of `Add-NTFSAudit` with `-SecurityDescriptor` and of
|
|
|
|
|
`Remove-NTFSAudit` with `-Path`, which returned access entries; both now
|
|
|
|
|
return the audit entries
|
|
|
|
|
- Fix the `InheritanceEnabled` property of audit entries, which reported the
|
|
|
|
|
inheritance of the access entries; it now reports whether the audit
|
|
|
|
|
entries are inherited
|
|
|
|
|
- Fix `Get-NTFSInheritance -SecurityDescriptor`, which reported
|
|
|
|
|
`AuditInheritanceEnabled` as `$true` for a security descriptor that was
|
|
|
|
|
read without its audit section; it now reports `$null`, like `-Path`
|
|
|
|
|
- Fix `Get-NTFSOwner`, which wrote a "The pipeline has been stopped" error
|
|
|
|
|
for every path when a command such as `Select-Object -First 1` stopped the
|
|
|
|
|
pipeline, and which repeated a failed read instead of reporting the
|
|
|
|
|
denied access
|
|
|
|
|
- Fix `Copy-Item2`, which failed with a `DirectoryNotFoundException` when it
|
|
|
|
|
copied a folder that contained files
|
|
|
|
|
- Fix `Disable-Privileges`, which couldn't disable the privileges when the
|
|
|
|
|
module setting `EnablePrivileges` was `$false`
|
|
|
|
|
- Fix the inheritance cmdlets, which enabled the Backup, Restore, Take
|
|
|
|
|
Ownership, and Security privileges even when the module setting
|
|
|
|
|
`EnablePrivileges` was `$false`, and left them enabled
|
|
|
|
|
- Fix the `Inherits` column of the `Get-ChildItem2` output, which showed
|
|
|
|
|
`True` for every item, also for items whose inheritance is disabled
|
fix: resolve the security descriptor sets without -AppliesTo
Defect 14. Add-NTFSAccess, Remove-NTFSAccess, Add-NTFSAudit, and
Remove-NTFSAudit have the sets PathSimple, PathComplex, SDSimple, and
SDComplex; the default PathComplex needs -Path. A command with
-SecurityDescriptor and without -AppliesTo, -InheritanceFlags, or
-PropagationFlags matched both SD sets and failed with "Parameter set
cannot be resolved". -AppliesTo is now mandatory in the Simple sets, so
such a command resolves to the Complex set and its default flags
(ContainerInherit, ObjectInherit / None, which is what AppliesTo
ThisFolderSubfoldersAndFiles means), as a command with -Path already did.
With -AppliesTo nothing changes.
The pages say "Required: True" for -AppliesTo and drop its never
reachable defaults; platyPS takes that metadata from the shipped help
file, so the help file was regenerated before the build.
Tests/Access.Tests.ps1: 6 tests on in-memory security descriptors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Fix `Add-NTFSAccess`, `Remove-NTFSAccess`, `Add-NTFSAudit`, and
|
|
|
|
|
`Remove-NTFSAudit`, which failed with "Parameter set cannot be resolved"
|
|
|
|
|
for `-SecurityDescriptor` without `-AppliesTo`, `-InheritanceFlags`, or
|
|
|
|
|
`-PropagationFlags`; `-AppliesTo` is now mandatory in the `Simple`
|
|
|
|
|
parameter sets, so such a command uses the flag parameters and their
|
|
|
|
|
defaults, as for a path
|
|
|
|
|
- Fix `Get-NTFSEffectiveAccess`: `-ExcludeNoneAccessEntries` now leaves out
|
|
|
|
|
items without access, the cmdlet uses the current location when `-Path`
|
|
|
|
|
is omitted, and `-SecurityDescriptor` returns the effective access of the
|
|
|
|
|
security descriptor; before, all three returned nothing or ignored the
|
|
|
|
|
parameter
|
|
|
|
|
- Fix `Get-NTFSOrphanedAccess`, `Get-NTFSOrphanedAudit`, and
|
|
|
|
|
`Get-NTFSSimpleAccess`, which ignored `-Account` and `-SecurityDescriptor`;
|
|
|
|
|
`Get-NTFSOrphanedAudit` now writes one object per entry instead of one
|
|
|
|
|
collection per item, `Get-NTFSOrphanedAccess` no longer repeats the entries
|
|
|
|
|
of the previous item after a failed read, and the output of
|
|
|
|
|
`Get-NTFSSimpleAccess` has a table view
|
|
|
|
|
- Restore the `-RemoveSpecific` switch of `Remove-NTFSAccess`, which version
|
|
|
|
|
4.1 introduced but later versions lacked, and add it to `Remove-NTFSAudit`:
|
|
|
|
|
with it, the cmdlets remove only an entry that matches exactly
|
|
|
|
|
- Fix `Copy-Item2`, `Move-Item2`, and `Remove-Item2`, which skipped the
|
|
|
|
|
remaining paths of `-Path` after a path that didn't exist or, for copy and
|
|
|
|
|
move, a file that already existed at the destination
|
|
|
|
|
- Fix `Remove-NTFSAccess` and `Remove-NTFSAudit`, which went on with a path
|
|
|
|
|
that didn't exist, wrote a second, misleading `RemoveAceError`, and with
|
|
|
|
|
`-PassThru` stopped with a `NullReferenceException`
|
|
|
|
|
- Fix `-PassThru` of `Enable-NTFSAccessInheritance`,
|
|
|
|
|
`Disable-NTFSAccessInheritance`, `Enable-NTFSAuditInheritance`,
|
|
|
|
|
`Disable-NTFSAuditInheritance`, and `Set-NTFSInheritance`, which returned
|
|
|
|
|
the unchanged state of an item also when the change failed, so that the
|
|
|
|
|
inheritance looked disabled
|
|
|
|
|
([#74](https://github.com/raandree/NTFSSecurity/issues/74))
|
|
|
|
|
- Fix the error of `New-NTFSHardLink` for a missing `-Target`, which said
|
|
|
|
|
that the target path existed
|
|
|
|
|
- Fix `Get-FileHash2`, which wrote a result for a file that it couldn't
|
|
|
|
|
read, with the hash of the previous file
|
|
|
|
|
- Fix `-PassThru` of `Add-NTFSAccess`, `Add-NTFSAudit`, `Remove-NTFSAccess`,
|
|
|
|
|
and `Remove-NTFSAudit`, which returned the unchanged entries of an item
|
|
|
|
|
also when the change failed
|
|
|
|
|
- Fix the cmdlets that take ownership of an item to repeat an operation that
|
|
|
|
|
was denied: when the second attempt failed as well, the account that ran
|
|
|
|
|
the cmdlet stayed the owner of the item; now the previous owner is restored
|
|
|
|
|
- Fix `-PassThru` of `Enable-Privileges` and `Disable-Privileges`, which
|
|
|
|
|
wrote the privileges as one collection instead of one object per
|
|
|
|
|
privilege, and of `New-NTFSSymbolicLink`, which returned a file object for
|
|
|
|
|
a link to a folder
|
|
|
|
|
- Declare the output types of `Test-Path2`, `Get-FileHash2`,
|
|
|
|
|
`Add-NTFSAudit`, `Remove-NTFSAudit`, `Copy-Item2`, `Move-Item2`,
|
|
|
|
|
`Remove-Item2`, and the inheritance cmdlets correctly, so that
|
|
|
|
|
`Get-Command` and tab completion report the objects they write
|
|
|
|
|
- Fix the verbose messages of `Copy-Item2` and `Move-Item2`, which named the
|
|
|
|
|
source path as the destination, and of `Disable-Privileges`, which said
|
|
|
|
|
that the privileges were enabled, and the spelling of the privilege in
|
|
|
|
|
the warning of `Get-NTFSEffectiveAccess`
|
|
|
|
|
- Fix `-PassThru` of `Copy-Item2`, `Move-Item2`, and `Remove-Item2`, which
|
|
|
|
|
wrote the item also when `-WhatIf` or a declined confirmation skipped the
|
|
|
|
|
operation
|
|
|
|
|
- Fix `Get-FileHash2` in PowerShell 7, where it failed for every algorithm;
|
|
|
|
|
`RIPEMD160` and `MACTripleDES`, which .NET lacks there, now stop the
|
|
|
|
|
cmdlet with an error that names the algorithm and points to Windows
|
|
|
|
|
PowerShell 5.1
|
|
|
|
|
- Fix a `FormatException` in the cmdlets for a path with braces, such as
|
|
|
|
|
`C:\Data\{Archive}`: their messages formatted the path a second time
|
|
|
|
|
([#3](https://github.com/raandree/NTFSSecurity/issues/3))
|
|
|
|
|
- Fix a `NullReferenceException` in every cmdlet when a variable named
|
|
|
|
|
`PWD` in the scope of the caller, such as a loop variable, hid the
|
|
|
|
|
automatic variable; the cmdlets now read the current location from the
|
|
|
|
|
session, and only for a relative path
|
|
|
|
|
([#86](https://github.com/raandree/NTFSSecurity/issues/86))
|
|
|
|
|
- Fix file and folder objects passed by position, such as
|
|
|
|
|
`Get-NTFSOwner $folder`, which Windows PowerShell bound as the name of the
|
|
|
|
|
item, so the cmdlets looked for it in the current location
|
|
|
|
|
([#88](https://github.com/raandree/NTFSSecurity/issues/88))
|
|
|
|
|
- Fix `Remove-NTFSAccess` for an entry with a generic right such as
|
|
|
|
|
`GenericAll`, which Windows keeps in the inherit-only entries of folders;
|
|
|
|
|
it failed with "The value '269484032' is not valid"
|
|
|
|
|
([#17](https://github.com/raandree/NTFSSecurity/issues/17))
|
fix: change the audit inheritance of items without audit entries
Enable-NTFSAuditInheritance, Disable-NTFSAuditInheritance, and
Set-NTFSInheritance -AuditInheritanceEnabled failed with "(5) Access is
denied" for a file or folder without a SACL, also elevated with the
Security privilege. The cmdlets read only the audit section and changed
the flag that disables or enables audit inheritance. AlphaFS writes that
flag only together with a SACL, so it wrote no section at all, which
Windows denies; the retry as owner repeated the same write. An empty SACL
is now added first, but only to a descriptor that was read with its SACL.
The elevated CI runs of #100 to #106 showed this through the test of an
omitted -AccessInheritanceEnabled. From #104 on, the test that keeps the
inherited entries of a security descriptor failed as well: elevated,
Get-NTFSSecurityDescriptor reads the SACL, and Windows then returns a DACL
that isn't in the auto-inherit format, such as that of a file in the temp
folder of the user, without its inherited flags. The test now reads the
access section only and checks that the descriptor has inherited entries.
Tests: five cases for items without audit entries, red with "Access is
denied" before the fix; the test that keeps the explicit audit entries now
checks the errors and the inheritance state of both calls; a test checks
that a descriptor read without its audit entries gets no SACL, which would
replace the audit entries of the item when it is written.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Fix `Enable-NTFSAuditInheritance`, `Disable-NTFSAuditInheritance`, and
|
|
|
|
|
`Set-NTFSInheritance -AuditInheritanceEnabled`, which failed with "Access
|
|
|
|
|
is denied" for a file or folder without audit entries, also in an elevated
|
|
|
|
|
session with the Security privilege
|
fix: write only the sections of the security descriptor that a cmdlet changes
The access and audit cmdlets wrote the owner of an item back with the
entries they changed. For a DACL without the auto-inherit flag, Windows
returns the owner and the group even when only the DACL is read, and the
cmdlets wrote every section that the descriptor held. Without the Restore
privilege, or on a file server that refuses the owner, the write failed
with error 1307 (#34).
- Add-NTFSAccess, Clear-NTFSAccess, Add-NTFSAudit, and Clear-NTFSAudit
read only the DACL or the SACL. FileSystemSecurity2.Write(),
Remove-NTFSAccess, and Remove-NTFSAudit write only the sections they
read, which also fixes the access inheritance cmdlets.
- Read together with the SACL, the inherited entries of such a DACL lose
their inherited flag when the parent folder has no SACL, and the
cmdlets stored them as explicit copies. Get-NTFSSecurityDescriptor now
reads the DACL in a separate call.
- Set-NTFSSecurityDescriptor writes only the sections that changed since
they were read; an unchanged descriptor writes nothing (maintainer
decision of 2026-10-06).
- Clear-NTFSAudit writes nothing for an item without a SACL, and reports
an error without the Security privilege (maintainer decision).
The regression tests failed before and pass after the fix in Windows
PowerShell 5.1 and PowerShell 7, elevated and as a basic user.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Fix `Add-NTFSAccess`, `Remove-NTFSAccess`, `Clear-NTFSAccess`,
|
|
|
|
|
`Add-NTFSAudit`, `Clear-NTFSAudit`, `Enable-NTFSAccessInheritance`,
|
|
|
|
|
`Disable-NTFSAccessInheritance`, and `Set-NTFSInheritance`, which wrote the
|
|
|
|
|
owner of an item back with the entries they changed; where the account may
|
|
|
|
|
not assign that owner, such as on some file servers, they failed with
|
|
|
|
|
"(1307) This security ID may not be assigned as the owner of this object".
|
|
|
|
|
They now write only the DACL or the SACL
|
|
|
|
|
([#34](https://github.com/raandree/NTFSSecurity/issues/34))
|
|
|
|
|
- Fix `Add-NTFSAccess`, `Add-NTFSAudit`, and `Clear-NTFSAudit`, which in an
|
|
|
|
|
elevated session could store the inherited access entries of an item as
|
|
|
|
|
explicit entries, and `Get-NTFSSecurityDescriptor`, which could return
|
|
|
|
|
them without their inherited flag, so that `Set-NTFSSecurityDescriptor`
|
|
|
|
|
stored them as explicit entries as well
|
|
|
|
|
- Fix `Clear-NTFSAudit`, which finished without an error but changed nothing
|
|
|
|
|
in a session without the Security privilege; it now writes an error, like
|
|
|
|
|
the other audit cmdlets
|
|
|
|
|
- Fix the cmdlets for the root of a drive, such as `C:\`, or of a volume,
|
|
|
|
|
such as `\\?\Volume{GUID}\`, which read and changed the security
|
|
|
|
|
descriptor of the drive, a device object, instead of that of its root
|
|
|
|
|
folder, so that `Get-NTFSAccess` showed other entries than Explorer
|
|
|
|
|
([#41](https://github.com/raandree/NTFSSecurity/issues/41))
|
fix: drive roots, audit descriptors, -WhatIf conflicts, and small items
- #41: for the root of a drive, the cmdlets read and changed the security
descriptor of the drive, a device object. FileSystemSecurity2 now routes
drive roots through the path-based AlphaFS methods, which keep the
trailing backslash; the removal and inheritance helpers use it too.
- #109: Add-, Remove-, and Clear-NTFSAudit report a security descriptor
without the audit entries like Get-NTFSAudit, through one helper, and
Get-NTFSEffectiveAccess names the cause that Windows reported instead
of a missing Security privilege.
- #108: Copy-Item2 and Move-Item2 check the destination only for an
operation that runs; with -WhatIf, a verbose message names the conflict.
- #111: Disable-Privileges skips the privileges that the token doesn't
hold, the privilege messages are spelled right, and Get-FileHash2
declares the type name of its objects; 05-Releasing.md documents the
release metadata tests.
- rc3 review leftovers: Remove-NTFSAudit writes nothing for an item
without a SACL, the owner retry of Set-NTFSSecurityDescriptor restores
the previous owner in a finally block and keeps an owner that the
descriptor sets, and FileSystemSecurity2.Write with another item writes
only the sections that were read.
Each fix has a test that failed first, in Windows PowerShell 5.1 and
PowerShell 7; writing a drive root was checked once on a temporary VHD.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
- Fix `Add-NTFSAudit`, `Remove-NTFSAudit`, and `Clear-NTFSAudit` with a
|
|
|
|
|
security descriptor that was read without the audit entries; they now
|
|
|
|
|
write an error like `Get-NTFSAudit` instead of changing the missing entries
|
|
|
|
|
without one ([#109](https://github.com/raandree/NTFSSecurity/issues/109))
|
|
|
|
|
- Fix `Get-NTFSEffectiveAccess`, which blamed a missing Security privilege
|
|
|
|
|
for every failure while the privilege wasn't enabled; the error now names
|
|
|
|
|
the cause that Windows reported
|
|
|
|
|
([#109](https://github.com/raandree/NTFSSecurity/issues/109))
|
|
|
|
|
- Fix `Copy-Item2` and `Move-Item2`, which wrote an error with `-WhatIf` when
|
|
|
|
|
the destination file existed, so that `-WhatIf -ErrorAction Stop` stopped
|
|
|
|
|
the preview; they now name the existing file in a verbose message
|
|
|
|
|
([#108](https://github.com/raandree/NTFSSecurity/issues/108))
|
|
|
|
|
- Fix `Remove-NTFSAudit`, which failed with "(5) Access is denied" for a file
|
|
|
|
|
or folder without audit entries
|
|
|
|
|
- Fix `Set-NTFSSecurityDescriptor`, which set the previous owner back after it
|
|
|
|
|
had taken ownership to write a descriptor that sets a new owner, so that
|
|
|
|
|
the new owner was lost or the write failed with error 1307
|
|
|
|
|
- Fix the `Write` method of a `Security2.FileSystemSecurity2` object for
|
|
|
|
|
another item, which wrote every section of the descriptor, also an owner
|
|
|
|
|
that Windows returns with the DACL; it now writes the sections that the
|
|
|
|
|
descriptor was read with
|
|
|
|
|
([#34](https://github.com/raandree/NTFSSecurity/issues/34))
|
|
|
|
|
- Fix `Disable-Privileges`, which warned that it couldn't disable the
|
|
|
|
|
privileges that the access token doesn't hold, and the declared output type
|
|
|
|
|
of `Get-FileHash2`, which named the AlphaFS `FileInfo` instead of the type
|
|
|
|
|
name of its objects
|
|
|
|
|
([#111](https://github.com/raandree/NTFSSecurity/issues/111))
|
|
|
|
|
- Fix `Get-NTFSEffectiveAccess`, which returned no access when the computer
|
|
|
|
|
of `-ServerName` couldn't be reached, although it warned that it had
|
|
|
|
|
calculated the result on this computer; it now returns that result
|
fix: return false from Test-Path2 for a path with invalid characters
In Windows PowerShell, .NET rejects a path with a character that Windows
doesn't allow in names, such as | or <, and Test-Path2 stopped with the
terminating error "Illegal characters in path". Such an item can't
exist, so the cmdlet now writes false, as in PowerShell 7 and like
Test-Path. Add tests for every -PathType, long paths, relative paths,
and the pipeline, and for Get-DiskSpace, which had no tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- Fix `Test-Path2`, which stopped with the terminating error "Illegal
|
|
|
|
|
characters in path" in Windows PowerShell for a path with a character
|
|
|
|
|
that Windows doesn't allow in names, such as `|`; it now returns `$false`
|
|
|
|
|
for such a path, as in PowerShell 7, and writes the reason as a debug
|
|
|
|
|
message
|
|
|
|
|
- Fix the cmdlets that enable the Backup, Restore, Take Ownership, and
|
|
|
|
|
Security privileges, which left them enabled in the session when a later
|
|
|
|
|
command, such as `Select-Object -First`, or a terminating error stopped
|
|
|
|
|
the pipeline early; they now disable them also then
|
fix: disable the privileges by their current state when a cmdlet ends
A cmdlet that enables the Backup, Restore, Take Ownership, and Security
privileges decided which ones to disable on the states that it had read
when it enabled them, and stopped at the first one that failed. When
another command in the pipeline, such as Disable-Privileges, had disabled
one of them, the cmdlet stopped with "Priviledge already disabled" and
left the privileges after that one enabled. After an early stop, which
Dispose handles since this branch, it left them enabled without any
message, because PowerShell ignores exceptions thrown in Dispose; and
Disable-Privileges threw that exception in Dispose on every call while
the privileges were disabled. 4.2.6 already decided on the old states.
DisablePrivilege now reads the current state, and the cleanup tries every
privilege: in EndProcessing, a privilege that it can't disable gives a
warning; in Dispose, it is ignored.
The early-stop tests now pin EnablePrivileges and check that the cmdlet
had enabled the privileges, so that they can't pass without testing
anything.
Found by the security review of fcb370e..00c3646 (findings 1 to 3).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- Fix the cmdlets that enable the privileges, which stopped with the error
|
|
|
|
|
"Priviledge already disabled" and left the other privileges enabled when
|
|
|
|
|
another command in the pipeline, such as `Disable-Privileges`, had
|
|
|
|
|
disabled one of them; a privilege that they can't disable now gives a
|
|
|
|
|
warning, and they still disable the others
|
fix: report ReadData and the parent of a relative path in Get-NTFSSimpleAccess
Two deviations from the cmdlet page, found by new tests from its
contract:
- An entry that grants only ReadData became None: the reduction tested
the combined Read mask, and nothing mapped ReadData alone. .NET adds
Synchronize to every allow entry, which hid it; other tools write such
entries.
- With -IncludeRootFolder, on by default, a relative path with a single
folder name had no parent folder in the result, because the parent was
taken from the path before it was resolved.
The tests also cover the rights reduction, the comparison of folders
with their parent, the pipeline, the current location, -ExcludeExplicit,
files, and missing paths, elevated and as a basic user in both editions.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- Fix `Get-NTFSSimpleAccess`, which showed no rights for an entry that
|
|
|
|
|
grants only `ReadData`, and which left out the parent folder of a
|
|
|
|
|
relative path with a single folder name, although `-IncludeRootFolder` is
|
|
|
|
|
on by default
|
|
|
|
|
- Fix `Copy-Item2` and `Move-Item2`, which didn't detect a folder at the
|
|
|
|
|
destination, so that a copy failed in the middle after it had copied a
|
|
|
|
|
part of the folder, and which reported a missing destination folder with
|
|
|
|
|
an error that named the source item
|
|
|
|
|
([#21](https://github.com/raandree/NTFSSecurity/issues/21)); they now
|
|
|
|
|
write `DestinationFileAlreadyExists` and an error that names the missing
|
|
|
|
|
folder, and with `-WhatIf` a verbose message that names it. `Copy-Item2`
|
|
|
|
|
no longer creates the missing folders of the destination when it copies a
|
|
|
|
|
folder, which the prereleases of 5.0.0 did
|
|
|
|
|
- Fix `Get-NTFSHardLink`, which stopped for all remaining paths at a folder
|
|
|
|
|
and at a file on a network share, where Windows can't list the names of
|
|
|
|
|
a file, and `New-NTFSHardLink -PassThru`, which stopped with a
|
|
|
|
|
terminating error on a share after it had created the link; both now
|
|
|
|
|
write a non-terminating `GetHardLinkError`
|
|
|
|
|
- Fix `-PassThru` of `Set-NTFSSecurityDescriptor`, which returned nothing
|
|
|
|
|
for a descriptor that the cmdlet wrote as the owner, and which turned a
|
|
|
|
|
failed read after a successful write into another attempt of the write
|
|
|
|
|
and a `WriteSdError`; it now writes a `ReadSecurityError` for that read
|
|
|
|
|
- Fix `Get-NTFSOrphanedAccess`, which reported an item that it couldn't
|
|
|
|
|
read as an `AddAceError`; it now writes a `ReadSecurityError`, like
|
|
|
|
|
`Get-NTFSAccess`
|
|
|
|
|
- Fix every cmdlet for a relative path that starts with a dot but not with
|
|
|
|
|
`.\`, such as `.gitignore`: the cmdlets dropped its first two characters
|
|
|
|
|
and read, changed, or removed the item with the shorter name, such as
|
|
|
|
|
`itignore`, when one existed
|
fix: compare output objects and report InheritedFrom correctly
Equals of FileSystemAccessRule2, FileSystemAuditRule2, and
FileSystemSecurity2 cast its argument to the .NET type, which throws for
the wrapper types themselves: -eq and -contains, and in PowerShell 7 also
Select-Object -Unique and Compare-Object, stopped with an
InvalidCastException. GetHashCode of FileSystemSecurity2 read a field
that is never set and threw a NullReferenceException. Two objects are now
equal when they hold the same entry or descriptor, like the .NET types.
InheritedFrom: Win32.GetInheritedFrom returned the sources of the SACL
whenever the descriptor had one, also for the access entries, and the
callers gave the filtered entries of -ExcludeExplicit the sources of the
first entries of the ACL. Get-NTFSAccess -SecurityDescriptor stopped with
an ArgumentOutOfRangeException for a descriptor with audit entries, as
Get-NTFSSecurityDescriptor reads them in an elevated session. The method
now takes the ACL of the entries, and the callers map the sources before
they filter.
The coverage report of rc6 pointed at both; each test fails without its
fix.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- Fix comparing the objects of the access, audit, and security descriptor
|
|
|
|
|
cmdlets: `-eq` and `-contains`, and in PowerShell 7 also
|
|
|
|
|
`Select-Object -Unique` and `Compare-Object`, stopped with an
|
|
|
|
|
`InvalidCastException`, and a security descriptor as the key of a
|
|
|
|
|
hashtable with a `NullReferenceException`. Two objects are now equal when
|
|
|
|
|
they hold the same entry or descriptor, as in .NET. Converting a security
|
|
|
|
|
descriptor to `FileSecurity` or `DirectorySecurity` returned `$null`
|
fix: compare output objects and report InheritedFrom correctly
Equals of FileSystemAccessRule2, FileSystemAuditRule2, and
FileSystemSecurity2 cast its argument to the .NET type, which throws for
the wrapper types themselves: -eq and -contains, and in PowerShell 7 also
Select-Object -Unique and Compare-Object, stopped with an
InvalidCastException. GetHashCode of FileSystemSecurity2 read a field
that is never set and threw a NullReferenceException. Two objects are now
equal when they hold the same entry or descriptor, like the .NET types.
InheritedFrom: Win32.GetInheritedFrom returned the sources of the SACL
whenever the descriptor had one, also for the access entries, and the
callers gave the filtered entries of -ExcludeExplicit the sources of the
first entries of the ACL. Get-NTFSAccess -SecurityDescriptor stopped with
an ArgumentOutOfRangeException for a descriptor with audit entries, as
Get-NTFSSecurityDescriptor reads them in an elevated session. The method
now takes the ACL of the entries, and the callers map the sources before
they filter.
The coverage report of rc6 pointed at both; each test fails without its
fix.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- Fix `InheritedFrom` of `Get-NTFSAccess` and `Get-NTFSAudit`: with
|
|
|
|
|
`-ExcludeExplicit`, each inherited entry showed the source of another
|
|
|
|
|
entry, and `Get-NTFSAccess -SecurityDescriptor` stopped with an
|
|
|
|
|
`ArgumentOutOfRangeException` for a descriptor with audit entries, such
|
|
|
|
|
as one that `Get-NTFSSecurityDescriptor` reads in an elevated session
|
|
|
|
|
- Fix `Get-NTFSOrphanedAudit`, which returned nothing without the Security
|
|
|
|
|
privilege, as for an item without orphaned entries, and wrote a warning
|
|
|
|
|
for an item that it couldn't read; it now writes a `ReadSecurityError`,
|
|
|
|
|
like `Get-NTFSAudit`
|
|
|
|
|
- Fix `Get-NTFSSimpleAccess`, which left out a folder whose parent folder it
|
|
|
|
|
hadn't reported, and with it all of its subfolders, and which compared a
|
|
|
|
|
drive root with the parent folder of the folder before it; such folders
|
|
|
|
|
are now reported with all of their entries, and a parent folder is found
|
|
|
|
|
also when its path differs in case. A folder that came after its parent
|
|
|
|
|
folder a second time failed with a `ReadError`
|
fix(items): refuse to move a folder to another volume in Move-Item2
Windows can't move a folder to another volume. Move-Item2 moved folders
with CopyAllowed, so AlphaFS copied and deleted them instead: an empty
folder was deleted without being created at the destination, and a
folder with files failed with an error that named one of its files.
Folders now move without CopyAllowed, and the cmdlet writes a MoveError
with the category InvalidOperation that names the folder and the
destination, and leaves the folder in place. A file still moves to
another volume; with -Force, it keeps the error of Windows, (17).
The tests move to \\localhost\C$, which Windows treats as another volume,
and run only elevated.
Decision 22, item 6: an assumption in autopilot, flagged for the
maintainer's review.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- Fix `Move-Item2` for a folder on another volume, which Windows can't
|
|
|
|
|
move: the cmdlet copied and deleted it instead, so that an empty folder
|
|
|
|
|
was deleted without being created at the destination, and a folder with
|
|
|
|
|
files failed with an error that named one of its files. It now writes a
|
|
|
|
|
`MoveError` that names the folder and the destination, and leaves the
|
|
|
|
|
folder in place
|
feat(links)!: require -Path and -Target and continue after errors in the link cmdlets
New-NTFSHardLink and New-NTFSSymbolicLink now require -Path and -Target.
Without -Path, they failed with an index error; without -Target, they
used the current location, so New-NTFSSymbolicLink -Path Link created a
link to the current folder.
For a link that they can't create, they write a non-terminating
CreateHardLinkError or CreateSymbolicLinkError with the category
ResourceExists, ObjectNotFound, InvalidArgument, PermissionDenied, or
WriteError, and continue with the next object from the pipeline; they
stopped with a terminating error.
Fixed on the way: every object piped to the cmdlets failed with
GetDefaultValueFailed, because PowerShell reads a parameter that takes
pipeline input before it binds the input, and the getter of -Path threw
on the empty list. The pages show piping rows of a CSV file.
BREAKING CHANGE: a script that omits -Path or -Target gets a prompt, or
an error in a non-interactive session, and a script that relies on a
terminating error of the link cmdlets needs -ErrorAction Stop.
Decision 22, items 7 and 8: assumptions in autopilot, flagged for the
maintainer's review.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- Fix `New-NTFSHardLink` and `New-NTFSSymbolicLink`, which failed with
|
|
|
|
|
`GetDefaultValueFailed` for every object piped to them, such as the rows
|
|
|
|
|
of a CSV file with the columns `Path` and `Target`
|
fix(links): name the items in the errors and continue after an invalid path
From the security-reviewer pass over be04cb7..4ee01e5 (Minor 1, 2, and
5, Nit 9):
- A path with a character that Windows doesn't allow, such as |, stopped
the pipeline in Windows PowerShell, where resolving the path throws an
ArgumentException; both cmdlets now write a non-terminating error with
the category InvalidArgument, also in PowerShell 7, where AlphaFS
rejects the path when it creates the link.
- The errors of New-NTFSSymbolicLink for an existing -Path and a missing
-Target, and of New-NTFSHardLink for a folder as -Target, named no path.
- New-NTFSSymbolicLink checked -Target before -Path, so that the two
cmdlets reported different errors for an existing -Path with a missing
-Target; both check -Path first now.
- The pages list objects with Path and Target as input of their own.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- Fix the errors of `New-NTFSSymbolicLink` for an existing `-Path` and a
|
|
|
|
|
missing `-Target`, and of `New-NTFSHardLink` for a folder as `-Target`,
|
|
|
|
|
which named no path. `New-NTFSSymbolicLink` now checks `-Path` first,
|
|
|
|
|
like `New-NTFSHardLink`
|
fix(access): don't warn for a name of this computer in Get-NTFSEffectiveAccess
Where a computer doesn't offer the remote interface of the authorization
manager, the cmdlet calculates the result with the local one and warns
that the result might be inaccurate. Only localhost in lowercase counted
as this computer, so the cmdlet warned that the computer couldn't be
reached for ., LOCALHOST, or the computer name, although the local result
is the result of that computer. A name of this computer is now localhost
in any case, ., the NetBIOS name, the DNS host name, or the fully
qualified domain name.
From the security-reviewer pass over be04cb7..4ee01e5 (Nit 7),
reproduced in Windows PowerShell 5.1 and PowerShell 7 on a workstation
without the remote interface.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
3 weeks ago
|
|
|
- Fix `Get-NTFSEffectiveAccess`, which warned that the result might be
|
|
|
|
|
inaccurate for every name of this computer in `-ServerName` except
|
|
|
|
|
`localhost` in lowercase, such as `.`, `LOCALHOST`, or the computer name,
|
|
|
|
|
where the computer doesn't offer the remote access check
|
Ai/docs alignment (#91)
* chore: initialize the memory bank
Add the canonical .memory-bank base with evidence-based project context:
purpose and scope, workflows, stack and validation commands, architecture
map, decisions, and the open work found while documenting the cmdlets.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* docs: align documentation with the cmdlet source
- Fill all 36 platyPS cmdlet pages from the C# source: synopsis,
description, parameters, defaults, examples, inputs, outputs, and
notes, including documented limitations of the current code
- Check every example against live parameter metadata and run them in a
sandbox; fix examples that did not work (CSV restore, account filter,
recursive inheritance, -AccessRights typos)
- Rewrite the home, concepts, examples, README, and contributor pages;
add a grouped cmdlet overview, module settings, privileges, long paths,
and the platyPS workflow
- Document Remove-Item2 -PassThru as renamed after 4.2.6 (#64)
- Fix mkdocs.yml navigation, edit_uri, and copyright markup; add
build.os and a pinned MkDocs version for Read the Docs
- Point online help links to the pages on GitHub; add CHANGELOG.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* ci: build the module and check the docs against the build
The documentation check ran Update-MarkdownHelp against the NTFSSecurity
release from the PowerShell Gallery (4.2.6), so it failed for every
unreleased parameter change. PR #91 failed because 4.2.6 still has
Remove-Item2 -PassThur while the source and the docs have -PassThru.
- Build NTFSSecurity.csproj in Release on the Visual Studio 2022 image,
using the .NET Framework 4.5.2 reference assemblies package instead of
an installed targeting pack
- Check Docs/Cmdlets against the module built from source
- Pin platyPS 0.14.2 and MarkdownLinkCheck 0.2.0, and enable TLS 1.2 so
the NuGet provider bootstrap works
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
* chore: record the green PR 91 build in the memory bank
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
|
|
|
|
|
- Fix [Get-ChildItem2](Docs/Cmdlets/Get-ChildItem2.md) with `-Hidden`,
|
|
|
|
|
which omitted the first hidden item unless `-Force` was also supplied
|
|
|
|
|
|
ci: publish releases from CI on a version tag, starting with 5.0.0-rc1
Pushing a tag such as 5.0.0 or 5.0.0-rc1 on master now publishes the
package that the build job built and tested to the PowerShell Gallery
and creates the GitHub release with NTFSSecurity.zip.
- New-ModulePackage.ps1 copies only the FileList files of the Release
build, so no debug symbols, XML documentation, or copy of
System.Management.Automation.dll ship. It builds the nupkg with
Compress-PSResource and adds the command tags (PSIncludes_Cmdlet,
PSCmdlet_*, PSCommand_*) that PSResourceGet leaves out and that the
Gallery uses to list cmdlets and that Find-Command searches. Every CI
run builds and uploads the packages.
- Get-ReleaseInfo.ps1 returns the version and release notes: a dated
CHANGELOG section for a release, the [Unreleased] section for a
prerelease.
- The release job checks that the tag matches the manifest version and
points to a commit on master, reads the API key from the environment
powershell-gallery, and skips steps already done, so a rerun is safe.
- The manifest gets the prerelease label rc1 and a release notes link;
the 5.0.0 changelog entries move back to [Unreleased] until the final
release.
- Tests/Release.Tests.ps1 covers both scripts and the packages; the
changelog check moves there from Manifest.Tests.ps1.
- Docs/Contributing/05-Releasing.md describes the one-time setup and the
release steps; Docs/README.md explains -AllowPrerelease.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: AI Assistant <ai@example.com>
4 weeks ago
|
|
|
[Unreleased]: https://github.com/raandree/NTFSSecurity/compare/4.2.6...HEAD
|