【问题标题】:Formatting Get-ACL output格式化 Get-ACL 输出
【发布时间】:2014-03-06 18:44:48
【问题描述】:

我正在尝试使用Get-ACL 函数扫描目录中的子文件夹。我正在修改在这里找到的工作脚本,它将输出转换为.csv 文件。如果我能获得输出,这样每一行都包含 all 每个文件夹的 IdentityReference 值,那就太好了。然而,我的最佳尝试导致了这个错误:

方法调用失败,因为 [System.Security.Principal.NTAccount] 不包含名为“op_Addition”的方法。

代码如下:

$OutFile = "C:\Admin\Permissions.csv"
$Header = "FolderPath,IdentityReference,AccessControlType,IsInherited,InheritanceFlags,PropagationFlags"
Del $OutFile
Add-Content -Value $Header -Path $OutFile 

$RootPath = "I:\Users\ES"

$Folders = GCI $RootPath\* | where {$_.psiscontainer -eq $true}

foreach ($Folder in $Folders){
    $ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access  }
    Foreach ($ACL in $ACLs){
        $OutIR = $ACL.IdentityReference
        $OutIR +=  ","
    }
    $OutInfo = $Folder.Fullname + "," + $OutIR + "," + $ACL.AccessControlType + "," + $ACL.IsInherited + "," + $ACL.InheritanceFlags + "," + $ACL.PropagationFlags
    Add-Content -Value $OutInfo -Path $OutFile
}

我尝试使用变量$OutIR 捕获所有IdentityReferences,然后将$OutIR 添加到最后的结果中。将列出每个文件夹并在同一行上显示所有IdentityReference


已更新> 非常感谢您迄今为止的所有帮助!两种代码都有效(太棒了!),但我真的很想调整输出。顺便说一句,这是我第一次在这里寻求帮助,让真正的脚本编写者真正看到这个真是太棒了!

我在 Windows 2012 R2 机器上使用 Powershell 4.0。

我得到的输出示例是:

"I:\Users\ES\aalvarez","NT AUTHORITY\SYSTEM","Allow","False","ContainerInherit, ObjectInherit","None"
"I:\Users\ES\aalvarez","BUILTIN\Administrators","Allow","False","ContainerInherit, ObjectInherit","None"
"I:\Users\ES\aalvarez","XXX\aralvare","Allow","False","ContainerInherit, ObjectInherit","None"

我想要的输出是:

"I:\Users\ES\aalvarez","NT AUTHORITY\SYSTEM","BUILTIN\Administrators","XXX\aralvare","Allow","False","ContainerInherit, ObjectInherit","None"

我的想法是我可以将我的 1000 多个用户放在一个电子表格中,然后快速比较他们的文件夹 ACL。再次感谢!

【问题讨论】:

  • 尝试将所有输出变量转换为字符串,即$Folder.Fullname.ToString()
  • 你使用的是什么版本的 Powershell?
  • 您能否提供一个示例,说明您希望输出的样子?
  • 我包含了我的 Powershell 版本和所需输出的示例 - 谢谢!
  • 类型、继承和标志在同一 ACL 的 ACE 中可能不同。

标签: powershell format acl export-to-csv


【解决方案1】:

你没有得到你期望的结果,因为你使用的是你的内循环的循环变量在该循环的外部

改变这个:

foreach ($Folder in $Folders){
  $ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access  }
  Foreach ($ACL in $ACLs){
    $OutIR = $ACL.IdentityReference
    $OutIR +=  ","
  }
  $OutInfo = $Folder.Fullname + "," + $OutIR + "," + $ACL.AccessControlType +
             "," + $ACL.IsInherited + "," + $ACL.InheritanceFlags +
             "," + $ACL.PropagationFlags
  Add-Content -Value $OutInfo -Path $OutFile
}

进入这个:

$Folders | % {
  $fpath = $_.FullName
  Get-Acl $fpath | select -Expand Access | % {
    $fpath + "," + $_.IdentityReference + "," + $_.AccessControlType + "," +
      $_.IsInherited + "," + $_.InheritanceFlags + "," + $_.PropagationFlags
  }
} | Add-Content -Path $OutFile

由于您要创建逗号分隔的输出,您可以完全避免手动连接字符串,方法是使用 ConvertTo-Csv cmdlet 和文件夹名称的计算属性:

$Folders | % {
  $fpath = $_.FullName
  Get-Acl $fpath | select -Expand Access |
    select @{n='FolderName';e={$fpath}}, IdentityReference, AccessControlType,
      IsInherited, InheritanceFlags, PropagationFlags
} | ConvertTo-Csv -NoType | select -Skip 1 | Add-Content -Path $OutFile

如果您不介意标题行,您也可以直接将数据导出到 CSV:

$Folders | % {
  ...
} | Export-Csv $OutFile -NoType

【讨论】:

    【解决方案2】:

    我看到 mjolinor 已经发表了评论,他可能有更好的东西,因为他很棒,但如果是我,这就是我会去的。我喜欢在说完所有事情后有一个对象可以使用,以防我以后想查询它,我可以依靠它。然后我们可以将其导出为 CSV,而不是像您之前那样艰难地构建一个。

    • 创建一个空数组。
    • 获取您的 ACL,并像现在一样循环访问它们。
    • 为每个 ACL 创建一个 PSCustomObject,并在输出文件中使用所需的属性。
    • 将该对象添加到您之前创建的数组中。
    • 完成后,将数组导出-csv 到文件中。

    下面是执行此操作的代码:

    $OutFile = "C:\Admin\Permissions.csv"
    $ACLList =@()
    Del $OutFile
    $RootPath = "I:\Users\ES"
    
    $Folders = GCI $RootPath\* | where {$_.psiscontainer -eq $true}
    
    foreach ($Folder in $Folders){
        $ACLs = get-acl $Folder.fullname | ForEach-Object { $_.Access  }
        Foreach ($ACL in $ACLs){
        $OutInfo = New-Object -TypeName psobject -Property @{
          FolderPath = $Folder.Fullname
          IdentityReference = $ACL.IdentityReference.ToString()
          AccessControlType = $ACL.AccessControlType.ToString()
          IsInherited = $ACL.IsInherited
          InheritanceFlags = $ACL.InheritanceFlags
          PropagationFlags = $ACL.PropagationFlags}
        $ACLList+=$OutInfo
        }
    }
    $ACLList|select FolderPath,IdentityReference,AccessControlType,IsInherited,InheritanceFlags,PropagationFlags|export-csv C:\temp\Permissions.csv -NoTypeInformation
    

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2021-04-11
      相关资源
      最近更新 更多