【问题标题】:Looking to compare group memberships against a network share希望将组成员身份与网络共享进行比较
【发布时间】:2017-04-20 15:03:12
【问题描述】:

我是这个网站的新手,对 PowerShell 也很陌生。到目前为止,我都喜欢!

我目前正在尝试编写一个 PowerShell 脚本,该脚本将查看某个共享或文件夹的所有子文件夹中的所有 ACL,然后将这些 ACL 与用户组成员身份进行比较。因此,假设 Tom 说“我希望 Jerry 拥有与我相同的访问权限,但仅适用于 CONSTRUCTION 共享及其所有子文件夹,不包括 CONSTRUCTION 文件夹之外的其他区域。然后我想查看所有组Tom 是 CONSTRUCTION 文件夹的 subs 中的成员,因此我可以将 Jerry 添加到这些组中。

到目前为止,我有一些我认为我需要的部分,但不太确定如何将它们拼凑在一起以提供我需要的东西:

Get-Acl -Path "\\\share\construction" | Format-List 会给我一个 ACL 列表,但仅限于此文件夹

get-childitem -Path \\\share\construction -dir -Recurse | format-list -Property name 会给我一份 CONSTRUCTION 中所有子文件夹的列表

Get-ADPrincipalGroupMembership Tom 会给我一份 Tom 所属的所有组的列表

现在最难的部分是将它们串在一起,这样我就可以说“好的,这些是我需要将 Jerry 添加到的组,以便让他的访问权限与汤姆在 CONSTRUCTION 文件夹中的访问权限相同,并且仅它的子文件夹(因为某些子文件夹的 acl 可能与父文件夹不同,我希望他也添加到这些文件夹中)。

正如我所说,我是 PowerShell 的新手,所以如果我对这些 cmdlet 不太了解,请告诉我。任何可以提供的帮助将不胜感激。提前致谢!

【问题讨论】:

  • 将 Jerry 与 Tom 放在同一个组中可能会给他比您想要的更多的访问权限(如果一个组允许 Tom 访问另一个共享中的另一个文件夹),并且不一定会给他相同的权限Tom 拥有的访问权限(如果 Jerry 在另一个组中拒绝覆盖某些内容,那么将他添加到 Tom 的允许组不会有任何影响)。您的组和文件夹共享 ACL 设计是否涵盖了这两种可能性?
  • 感谢您的评论。在大多数情况下,“con”或“construction”这个词会出现在 ACL 名称本身中,但并非总是如此,但我仍然希望看到组名。在我的公司中,我们不会拒绝访问,您要么被授予访问权限,要么没有。不使用否认。我一直在追求这样的剧本。

标签: powershell permissions active-directory directory


【解决方案1】:

欢迎来到社区!开始使用 PowerShell 非常有趣!

从这三行开始,您肯定有正确的想法。我不想只为您提供一个完整的脚本来运行您想要的。而是继续鼓励你走正确的路线。

要在这里实现您想要的,您将需要:
Tom 的组成员身份
位置组
将 Toms Groups 与该位置进行比较
将 Jerry 添加到此缺失的组中

幸运的是,PowerShell 可以做到这一切。

第 1 步:检索组成员身份

$TomsMembership = Get-ADPrincipalGroupMembership Tom | Select-Object -ExpandProperty Name

第 2 步:检索文件夹的访问组

$LocationACL = (Get-Acl -Path \\share\construction).Access | Select-Object -ExpandProperty IdentityReference

第 3 步:将用户组与位置组进行比较

$AccessGroups = Compare-Object -ReferenceObject $LocationACL -DifferenceObject $TomsMembership -IncludeEqual -ExcludeDifference

第 4 步:输出组用户获得对文件夹的访问权限

Write-Host $AccessGroups.InputObject

现在您已经有了上述主要组件,应该很容易组合一个脚本来完成您需要的工作!

如果您对上述内容有任何问题,请告诉我。

有用的提示
Get-Help 是您最好的朋友,将Get-Help 与 cmdlet 一起使用将使您深入了解 cmdlet 的实际作用。

【讨论】:

  • 非常感谢拉奇。只有一个问题。 NAME 属性看起来像“ACL-TEST (CHANGE)”,而 IdentityReference 属性看起来像“Contoso\ACL-TEST (CHANGE)”,带有域前缀,因此比较将它们视为 2 个不同的 InputObject。有没有办法让它们成为相同的格式?我一直在寻求帮助,但看不到答案。有什么想法吗?
  • 我将尝试添加这个:function append-text { process{ foreach-object {"Contoso\" + $_ } } }
  • 我想我在这里发布了我的代码错误,这些帖子的格式很奇怪。对于那个很抱歉。 ://
  • 嗨,Kenny,是的,您可以使用类似于您在此处编写的方式,也可以使用正则表达式删除 `e.g: $LocationACL = $LocationACL -creplace '^[^\]*\ 之前的任何内容\', '' ` 这将使身份引用与您之前提到的 NAME 属性匹配,而无需函数。归功于:
猜你喜欢
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2019-03-03
  • 2012-08-14
  • 2013-01-05
相关资源
最近更新 更多