I am wanting to add the output of a variable to a Powershell cmdlet output
I have the code
Get-ChildItem D:\Powershell* -Recurse | Get-Acl
which returns three properties:
Path Owner Access
---- ----- ------
MyFile.ps1 MyDomain\MyUser MyDomain\AnotherUser Allow Modify, Synchronize...
I only want to see Path and Access and I want to add the output $env:ComputerName
to each result:
ComputerName Path Access
---- ---- -----
MyServerName MyFile.ps1 MyDomain\AnotherUser Allow Modify, Synchronize...
I have tried
Get-ChildItem D:\Powershell* -Recurse | Get-Acl | Select-Object @{name="Computername"; expression={$env:Computername}}, Path, Access
Which is close, but I am only see the type of the Access Object:
Computername Path Access
------------ ---- ------
MyServerName Microsoft.PowerShell.Core\FileSystem::D:\Powershell Scripts\MyFile.ps1 {System.Security.AccessControl...
I note the path is fully qualified also but that isn't a particular problem
How do I output the access infomation rather than just the object type?
CodePudding user response:
As Santiago commented, the .Access
property is an array of objects, so to get workable output you can for instance save as CSV, you need to loop over these properties.
Perhaps something like this:
$result = Get-ChildItem -Path 'D:\Powershell*' -Recurse -File | ForEach-Object {
$file = $_.Name # or $_.FullName if you rather have that
$comp = $env:COMPUTERNAME
foreach ($access in (Get-Acl -Path $_.FullName).Access) {
# output the combined object
[PsCustomObject]@{
File = $file
ComputerName = $comp
User = $access.IdentityReference
Permissions = $access.FileSystemRights
Type = $access.AccessControlType
Inherited = $access.IsInherited
}
}
}
$result