2015-10-27 2 views
0

Я хочу экспортировать разрешения NTFS для папок и подпапок на сервере в CSV. Он должен показывать пользователям и группам разрешения и последнюю дату изменения папок.Разрешение NTFS с датой изменения

Вот что я получил до сих пор, но он не показывает дату изменения, и он экспортирует дезорганизован.

Get-ChildItem C:\FILES\ -Recurse | where {$_.PSIsContainer} | 
    Get-Acl | % { 
    $path = $_.Path 
    $_.Access | % { 
     New-Object PSObject -Property @{ 
     Folder  = $path.Replace("Microsoft.PowerShell.Core\FileSystem::", "") 
     Access  = $_.FileSystemRights 
     Control  = $_.AccessControlType 
     User  = $_.IdentityReference 
     Inheritance = $_.IsInherited 
     } 
    } 
    } | ? {$_.Inheritance} | Export-Csv C:\Users\test_dump.csv -Force 

ответ

0

Это случай, когда использование свернутого oneliner причиняет вам вред. Фактический скрипт гораздо читабельнее.

# set path to search 
$SearchPath = 'C:\FILES' 

# file for results 
$ExportFile = 'C:\temp\testdump.csv' 

# get list of folders 
# if you're using PS v2 use | where{$_.psIsContainer} instead of -Directory to filter for directories 
$FolderList = Get-ChildItem $SearchPath -Directory -Recurse 

# get list of subfolders 
foreach ($Folder in $FolderList) { 
    $FolderACL = Get-Acl $Folder.FullName 

    # get list of access objects for each folder 
    foreach ($Access in $FolderACL.Access) { 

     # Filter to only show explicit permissions 
     # if ($Access.IsInherited) { Return } 

     # custom object to hold the access object + path + lastwrite 
     $export = New-Object -TypeName PSObject -Property @{ 
      Folder = $FolderACL.Path.Replace("Microsoft.PowerShell.Core\FileSystem::","") 
      Access = $Access.FileSystemRights 
      Control = $Access.AccessControlType 
      User = $Access.IdentityReference 
      Inheritance = $Access.IsInherited 
      LastModified = $Folder.LastWriteTime 
     } 
     $export | Export-CSV -Path $ExportFile -NoTypeInformation -Append 

    } 

} 

В вашем трубопроводе у вас было | ? {$_.Inheritance}. Это только покажет вам унаследованные разрешения. Я подозреваю, что ты хочешь наоборот. ЕСЛИ это так, раскомментируйте фильтр явных разрешений.

0

Переместите один ForEach-Object до Get-Acl и используйте объекты DirectoryInfo для изменения пути и времени модификации. Я также фильтрую для унаследованных разрешений перед созданием объектов (сначала создавая объекты и отбрасывая их, это пустая трата ресурсов).

$root = 'C:\files' 
$csv = 'C:\path\to\test_dump.csv' 

Get-ChildItem $root -Recurse | 
    Where-Object { $_.PSIsContainer } | 
    ForEach-Object { 
    $dir = $_ 
    Get-Acl $dir | Select-Object -Expand Access | 
     Where-Object { $_.IsInherited } | 
     ForEach-Object { 
     New-Object PSObject -Property @{ 
      Folder  = $dir.FullName 
      Access  = $_.FileSystemRights 
      Control  = $_.AccessControlType 
      User   = $_.IdentityReference 
      Inheritance = $_.IsInherited 
      LastModified = $dir.LastWriteTime 
     } 
     } 
    } | Export-Csv $csv -Force 

Если у вас есть по крайней мере PowerShell v3 вы можете использовать Get-ChildItem -Directory вместо того, чтобы фильтровать $_.PSIsContainer.

Смежные вопросы