Home > Software engineering >  Adding Variables to Powershell Get-Acl output
Adding Variables to Powershell Get-Acl output

Time:03-26

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
  • Related