Powershell过滤内容以查找文件或目录

时间:2014-11-14 14:58:54

标签: powershell

我正在阅读包含我应用审核设置的文件和文件夹的文本文件的内容。文件夹在SACL上有一些不同的设置,所以我想过滤以查找所有文件并执行操作,然后对目录执行不同的操作。我很难找到一种方法来过滤/区分两者。我使用的是PowerShell v2.0,可能无法进行升级。

这里是我的代码,我知道它不起作用,但是让我知道我的想法:

import-module NTFSSecurity
$Targetfiles = Get-Content c:\temp\test.txt


if($Targetfiles -match ".exe or .dll or .msc"){
$files = $Targetfiles -match ".exe or .dll or .msc"
foreach ($File in $files){

    Get-NTFSAudit -Path $files | Remove-NTFSAudit -PassThru 
    Add-NTFSAudit -Path $files -Account 'NT Authority\Everyone' -AccessRights FullControl -Type    Failure -AppliesTo ThisFolderOnly
    Add-NTFSAudit -Path $files -Account 'NT Authority\Everyone' -AccessRights ExecuteFile,       AppendData, Delete, ChangePermissions, TakeOwnership -Type Success -AppliesTo ThisFolderOnly
}
}    
else{

    $directories = $Targetfiles -notmatch ".exe or .dll or .msc"
    foreach ($Directory in $directories){
    Get-NTFSAudit -Path $directories | Remove-NTFSAudit -PassThru 
    Add-NTFSAudit -Path $directories -Account 'NT Authority\Everyone' -AccessRights FullControl -         Type Failure -AppliesTo ThisFolderOnly
    Add-NTFSAudit -Path $directories -Account 'NT Authority\Everyone' -AccessRights ExecuteFile, AppendData, ReadData,  CreateFiles, Delete, ChangePermissions, TakeOwnership -Type Success -AppliesTo ThisFolderOnly
    }
}

显然-match / -notmatch不起作用。我希望脚本检查所有带扩展名的项目,将它们放入$ files然后完成工作以及任何没有扩展名的项目,进入$目录并完成这项工作。我还在学习,所以我的逻辑可能不起作用。我已经尝试了#34;。"与-match,但它似乎没有做任何事情。

可在此处找到该模块:https://gallery.technet.microsoft.com/scriptcenter/1abd77a5-9c0b-4a2b-acef-90dbb2b84e85#content

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我没有使用该特定模块,因此我无法在那里调试任何内容,但对于您的逻辑,这就是我使用的内容:

Import-Module NTFSSecurity;
Get-Content C:\Temp\test.txt | ForEach-Object {
    If (Test-Path $_ -PathType Leaf) {
        If ((Get-Item $_).Extension -in ('.exe','.dll','.msc')) {
            #Apply executable file rule
        }
    } ElseIf (Test-Path $_ -PathType Container) {
        #Apply folder rule
    } Else {
        Write-Output "Path not found: $_";
    }
}
  1. 导入模块。
  2. 获取文件的内容
  3. 对于内容的每一行......
  4. 如果它是叶子对象(也称为文件),请检查它是否具有.exe,.dll或.msc扩展名。如果是,请对文件应用NTFSSecurity命令。
  5. 如果它是一个容器(也就是目录),请对目录应用NTFSSecurity命令。
  6. 如果它不是一片叶子或一个容器,那是因为它根本不是一条有效的路径。
  7. 我的语法有点迂腐,可以改进,但这应该让你开始。我不确定你要完成什么,这是最直接的版本。