【问题标题】:Compare Permissions of two folders at different locations比较不同位置的两个文件夹的权限
【发布时间】:2016-03-20 06:00:12
【问题描述】:

我正在尝试编写一个脚本来比较两个不同位置的两个文件夹的权限。两个位置的文件夹名称都是用户的 ADID,一些用户可能有两个或多个 AD 帐户。

$OutPath = ".\out1.csv"

$sourcepath1 = Get-Content ".\mwd_src.txt" 
foreach ($path1  in $sourcepath1) {
    $name1 = (Get-Item $Path1).name
    $FolderAcl1 = (Get-Acl $Path1).Access | Select-Object IdentityReference

    $Source = $FolderAcl1 | Where-Object { $_.IdentityReference -like "*$name1*"} |
        Select-Object @{ Label = "Path"; Expression = { echo $Path1 } }, @{ Label = "Access"; Expression = { $_.IdentityReference } }
}

$sourcepath2 = Get-Content ".\mwd_dest.txt"
foreach ($path2 in $sourcepath2) {
    $name2 = (Get-Item $Path2).Name
    $FolderAcl2 = (Get-Acl $Path2).Access | Select-Object IdentityReference 
    $Dest = $FolderAcl2 | Where-Object { $_.IdentityReference -like "*$name2*" } |
        Select-Object @{ Label = "Path"; Expression = { echo $Path2 } }, @{ Label = "Access"; Expression = { $_.IdentityReference } }
}

$Source1 = $Source | Select-Object -Unique
$Dest1 = $Dest | Select-Object -Unique

$Out = Compare-Object -ReferenceObject $Source1 -DifferenceObject $Dest1
$Out1 = $Out | Where-Object { $_.SideIndicator -match "=>" }

foreach($OutItem in $Out1) {
    $Outitem.InputObject | Add-Content $OutPath
}

但出现以下错误

“Compare-Object:无法将参数绑定到参数'DifferenceObject',因为它为空。 "

请帮忙。

【问题讨论】:

  • 在过滤身份引用后,$Dest 是否真的包含任何内容?
  • 是的,当我单独运行它时。源和目标都包含一组相同的文件夹,并且都需要按顺序进行比较。我的代码正确吗?
  • $_.IdentityReference -like "*$nameX*" 过滤器有什么用?此外,您的循环只留下来自$sourcepathX 的最后一个文件夹的 ACL。这是故意的吗?
  • 在环境中,文件夹名称和ADID相同。将文件夹名称保存到变量 $name 并检查相同的 ADID 是否有权访问该文件夹。第二个不是故意的。我正在编写这个脚本来比较迁移期间源和目标的权限。假设正在迁移文件夹 XX111,我只想比较目标文件夹是否与源文件夹具有相同的访问权限,然后再删除源文件夹。但上面的代码是我能写的最好的。对此有什么帮助吗?。

标签: powershell permissions compare directory acl


【解决方案1】:

由于我缺少您的路径信息,我无法重现您的代码,但我尝试将两个本地文件的 ACL 与 Compare-Object 进行比较。我创建了两个最初具有相同访问权限的文件。如果没有差异,则不返回任何内容。然后我从第二个文件的权限中删除了我的帐户并获得了输出。 (我缩短了输出以避免出现水平条。)SideIndicator 用箭头显示差异所属的对象。

InputObject                                                              SideIndicator
-----------                                                              -------------
{System.Security.AccessControl.FileSystemAccessRule, System.Security...  =>
{System.Security.AccessControl.FileSystemAccessRule, System.Security...  <=

我的测试代码:

$ref = Get-Acl -Path .\Desktop\test1.txt
$diff = Get-Acl - Path .\Desktop\test2.txt

Compare-Object -ReferenceObject $ref.Access -DifferenceObject $diff.Access

我选择了Access 属性进行比较。

关于您的错误,请确保使用您期望的信息填充 DifferenceObject。

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2015-08-12
    • 2022-08-14
    相关资源
    最近更新 更多