这是我在Stackoverflow中的第一篇文章,我多年来一直在阅读许多精彩的问题,答案和其他各种帖子。我从这个梦幻般的社区中学到了很多东西。我希望现在我已经迈出了勇敢的一步,让我真正陷入了蠢蠢欲动的境地,并加入了这个社区,我可能会为此做出贡献!
所以我已经开始研究一个基本核心级别的项目 - 列出所有超过7年的文件,以便他们可以在可能的情况下进行审核和删除。
然而,我把整个剧本分成了几个阶段。我目前陷入第二阶段的一步。我已经被困了大约两天,对你们很多人来说,这可能只需要花费10分钟才能搞清楚!
我必须为我的愚蠢和缺乏知识而道歉,我对powershell脚本编写的经验仅限于5个工作日,我目前正在潜水并学习书籍,但我也有工作要做。学习简单的方法!
我的脚本基本上有3个步骤;
运行顶级DATA文件夹的Get-ACL,以创建对特定文件夹具有权限的所有组的列表。我想要导出这些数据,或者只是将其保留用于下一步。
根据CSV收集此收集的信息,该CSV包含标记为Role的列(Role将包含文件夹管理器专用的组),并检查此exlcusive组的固有成员(可能最后一点需要是另一个步骤?)
将此独占成员列表及其相关文件夹存储或导出,然后将其用作变量,以发送包含需要删除的文件列表的电子邮件。
使用下面的脚本我基本上停留在第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
}
谢谢, 丹尼尔。
答案 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帮助链接来自我的代码块(如果有):
Import-Csv
(在模块Microsoft.PowerShell.Utility
中)ForEach-Object
Get-Acl
(在模块Microsoft.PowerShell.Security
中)Where-Object
Write-Error
(在模块Microsoft.PowerShell.Utility
中)