手头的任务是将源文件夹中的权限与目标文件夹进行比较,并将其与所有子文件夹进行比较。我已经创建了对一个文件夹执行此检查的函数,该文件夹返回$True
或$False
。
我想知道是否可以创建一个函数来调用自己在它发现调用Test-ACLequalHC
的每个子文件夹上执行。因此,当它在其中一个子文件夹中阻塞或出错时,由于权限问题或其他原因,它仍然可以继续使用其他子文件夹。
像爬虫这样的东西,如果这是有道理的。理想情况下,如果它可以并行运行会很棒。我读到Workflow
最适合这个,但我以前从未使用它。
不幸的是,$AllSubFolders = Get-ChildItem -Recurse
后跟foreach
是不可能的,因为根文件夹下有数千个文件和文件夹。所以它需要是动态的,以便我们可以在它找到的每个文件夹上做额外的事情,比如如果Test-ACLequalHC
在一个文件夹上导致$False
,我们仍然可以调用其他函数来设置权限正确或将结果添加到CSV。
权限测试:
Function Test-ACLequalHC {
[CmdletBinding(SupportsShouldProcess=$True)]
Param(
[parameter(Mandatory=$true,Position=0)]
[ValidateScript({Test-Path $_})]
[String]$Source,
[parameter(Mandatory=$true,Position=1)]
[ValidateScript({Test-Path $_})]
[String]$Target,
[parameter(Mandatory=$true,Position=2)]
[ValidateSet('Access','Owner','All')]
[String]$Type
)
Begin {
$Props = Switch ($Type) {
'Access' {'Access', 'AreAccessRulesProtected'}
'Owner' {'Owner'}
'All' {'sddl'}
}
}
Process {
$CompParams = @{
Property = $Props
ReferenceObject = Get-Acl $Source #| Sort-Object
DifferenceObject = Get-Acl $Target #| Sort-Object
PassThru = $True
}
$Result = Compare-Object @CompParams
if ($Result -ne $null) {
Write-Output $false
}
else {
Write-Output $True
}
}
}
如果它可以检查文件,继承并且没有添加额外的权限,那将是很棒的。但是如果我发现如何制作这样一个可以通过文件夹结构挖掘的crawler
东西,我会在以后添加这些内容。
感谢您的帮助。
答案 0 :(得分:0)
好吧,我认为你厌恶做Get-ChildItem -Recurse是你需要克服的。如果您只查看目录,请使用-directory开关来获取Get-ChildItem。它是一个提供商级别的交换机,因此它可以大大加快速度。
接下来,我认为您需要考虑的是Ad-Member cmdlet。像这样:
$Source = C:\GoodFolder
$AllFolders = GCI C:\ -Directory -Recurse
$AllFolders | ForEach{Add-Member -InputObject $_ -NotePropertyName "ACLGood" -NotePropertyValue (Test-ACLequalHC $source $_.fullname all)}
然后,您可以对有问题的文件夹进行过滤,并根据需要解决这些问题。
$AllFolders | Where{!$_.ACLGood} | ForEach{ Do stuff to fix it }