Powershell:高级文件年龄搜索

时间:2016-11-02 05:52:48

标签: powershell csv automation

这是我在Stackoverflow中的第一篇文章,我多年来一直在阅读许多精彩的问题,答案和其他各种帖子。我从这个梦幻般的社区中学到了很多东西。我希望现在我已经迈出了勇敢的一步,让我真正陷入了蠢蠢欲动的境地,并加入了这个社区,我可能会为此做出贡献!

所以我已经开始研究一个基本核心级别的项目 - 列出所有超过7年的文件,以便他们可以在可能的情况下进行审核和删除。

然而,我把整个剧本分成了几个阶段。我目前陷入第二阶段的一步。

我已经被困了大约两天,对你们很多人来说,这可能只需要花费10分钟才能搞清楚!

我必须为我的愚蠢和缺乏知识而道歉,我对powershell脚本编写的经验仅限于5个工作日,我目前正在潜水并学习书籍,但我也有工作要做。学习简单的方法!

我的脚本基本上有3个步骤;

  1. 运行顶级DATA文件夹的Get-ACL,以创建对特定文件夹具有权限的所有组的列表。我想要导出这些数据,或者只是将其保留用于下一步。

  2. 根据CSV收集此收集的信息,该CSV包含标记为Role的列(Role将包含文件夹管理器专用的组),并检查此exlcusive组的固有成员(可能最后一点需要是另一个步骤?)

  3. 将此独占成员列表及其相关文件夹存储或导出,然后将其用作变量,以发送包含需要删除的文件列表的电子邮件。

  4. 使用下面的脚本我基本上停留在第2步以及如何从CSV(或存储的变量?)创建过滤器并将其应用于GET-ACL foreach循环。我可能会使用正则表达式完全错误地使用正则表达式,并且说实话,大部分都是复制,粘贴和阅读互联网,人们已经完成了类似的任务。我再次道歉,如果从一开始这只是一个愚蠢的方式来做到这一点!

    我想提前感谢所有人的帮助,意见和建议,我会听取所有意见,我会尽可能多地接受我的大脑处理 - 我保证!

    #$RoleList = import-csv "C:\DATA\scripts\GB_CMS\CSV\datafolders_rolelist.csv"
    #foreach ($Manager in $RoleList) {
    #$FolderManager = $RoleList.Role
    
    $FolderManagers = Import-Csv C:\DATA\scripts\GB_CMS\CSV\datafolders_rolelist.csv | foreach {
      New-Object PSObject -prop @{
        Folder = $_.Folder;
        Manager = $_.'Folder Manager';
        Role = $_.Role
    
    
      }
    }
    
    $Role = $FolderManagers.Role
    $Role
    
    
    gci "c:\DATA" | Where {$_.PSIsContainer} | get-acl |
     ForEach $_.Name {
     [regex]$regex="\w:\\\S+"
     $path=$regex.match($_.Path).Value
     $_ | select -expand access |
    
     $
    
     where {$_.identityreference -like "$Role"} |
     Select @{Name="Path";Expression={$Path}},IdentityReference
     }
    

    谢谢, 丹尼尔。

1 个答案:

答案 0 :(得分:0)

在这里猜你想要什么。例如如果你有文件夹

C:\Data\Accounts
C:\Data\Marketing
C:\Data\Sales

您可能拥有权限

C:\Data\Accounts    {'FolderManagers-Accounts', 'Accounts', 'Directors'}
C:\Data\Marketing   {'FolderManagers-Marketing', 'Marketing', 'Sales'}
C:\Data\Sales       {'FolderManagers-Sales', 'Sales', 'Directors'}

,您的CSV

Name,  Role,                     Email
Alice, FolderManagers-Accounts,  alice@example.com
Bob,   FolderManagers-Marketing, bob@example.com

将CSV中的一(1)行清晰映射到ACL中的一个组。

你想要的,从你的剧本:

Identify who to email about "C:\Data\Accounts"

我有多接近?

# Import the managers. This will turn the CSV into an array of objects
# no need to do that explicitly
$FolderManagers = Import-Csv C:\DATA\scripts\GB_CMS\CSV\datafolders_rolelist.csv

# This will be a hashtable pairing up folder names with people
# e.g. 'C:\DATA\Accounts' -> Alice
$FolderMap = @{}

# Run through all the folders
GetChildItem -Path "C:\Data" -Directory | ForEach-Object {

    # Run through the group/user ACL entries on the folder
    foreach ($group in (Get-Acl $_.FullName).Access.IdentityReference)
    {
        # Look for a matching row in the CSV
        $CsvRow = $FolderManagers | Where-Object {$_.Role -match $group}

        if (-not $CsvRow)
        {
            Write-Error "No manager found for folder $_"
        }
        else
        {
            # Add to the map
            # $_ converts to folder path, C:\DATA\Accounts
            # $CsvRow is the person, @{Name=Alice, Role=..., Email=...}
            $FolderMap[$_.FullName] = $CsvRow
        }

    }
}

然后它(FolderMap)将是

Name                           Value                                                                                                                                    
----                           -----                                                                                                                                    
C:\Data\Accounts               {Name='Alice';Role=...
C:\Data\Marketing              {Name='Bob';Role=...

您可以使用

进行查询
$person = $FolderMap["c:\data\Accounts"]
$person.email

如果你真的想导出它,也许

$FolderMap | ConvertTo-Json | Set-Content foldermanagers.json

的Nb。我写下了大部分内容,它可能不会只是运行。对于StackOverflow上的大问题而非特定问题,这是一个问题。

自我生成的PS帮助链接来自我的代码块(如果有):