【问题标题】:Verify Domain Admins against List via AD Module for PowerShell通过 PowerShell 的 AD 模块根据列表验证域管理员
【发布时间】:2013-12-20 14:46:17
【问题描述】:

我遇到了某些管理员临时将用户提升到域管理员以进行故障排除的问题。我被要求创建一个脚本来每晚检查 Domain Admins 组,并删除任何不属于该组的用户,而不是从图片中删除上述管理员。

我需要它来根据 txt 或 csv 中的 givin 列表验证 Domain Admins 组。我可以每晚从组中删除everone,然后重新读取所需的用户,但是如果有人在这种情况下登录或注销,这可能会产生问题。

有人可以帮忙吗?到目前为止,我已经设法通过管道 get-adgroup 和 export-csv 导出组内的用户列表。但我未能尝试获取用户列表并与现有列表进行比较。

【问题讨论】:

  • 请分享您拥有的代码。这将有助于确定您在哪里遇到问题。
  • 您可以在组策略中将域管理员设置为受限组,并让它自动删除它们。
  • mjolinor:听起来很有趣。不熟悉 Restricted Group 的运作方式,我会调查一下。

标签: powershell vbscript active-directory


【解决方案1】:

这是我刚刚为你写的一个小脚本。首先,您需要使用默认成员创建一个默认文本文件。我将文件命名为 PreviousMembers.txt

Import-Module ActiveDirectory

Get-AdGroupMember "Domain Admins" | Select Name | Out-File C:\Scripts\PreviousMembers.txt

现在,将以下行保存在 ADGroupMembersDiff.ps1 中并随时运行以获取当前的成员列表。您需要确保文件位于您在下面指定的相同位置,并且文件名也必须相同。

Import-Module ActiveDirectory

$pattern = ".*"
Get-AdGroupMember "Administrators" | Select Name | Out-File C:\Scripts\CurrentMembers.txt 
(Get-Content C:\Scripts\CurrentMembers.txt) | ? {$_.trim() -ne "Name" -and $_.trim() -ne "----" -and $_.trim() -ne "" } | Set-Content C:\Scripts\CurrentMembers.txt
(Get-Content C:\Scripts\PreviousMembers.txt) | ? {$_.trim() -ne "Name" -and $_.trim() -ne "----" -and $_.trim() -ne "" } | Set-Content C:\Scripts\PreviousMembers.txt
$comparedLines = Compare-Object (Get-Content C:\Scripts\PreviousMembers.txt) (Get-Content C:\Scripts\CurrentMembers.txt) -IncludeEqual | Sort-Object { $_.InputObject.ReadCount } 
$lineNumber = 0

$comparedLines | foreach {
    if($_.SideIndicator -eq "==" -or $_.SideIndicator -eq "=>")
    {
        $lineNumber = $_.InputObject.ReadCount
    }
    if($_.InputObject -match $pattern)
    {
        if($_.SideIndicator -eq "==")
        {
            $lineOperation = "No Change"
        }
        ElseIf($_.SideIndicator -eq "=>")
        {
            $lineOperation = "New User"
        }
        Elseif($_.SideIndicator -eq "<=")
        {
            $lineOperation = "Default User"
        }
        $HashChanges = @{
        Line = $lineNumber
        Operation = $lineOperation
        Users = $_.InputObject
        }
        New-Object psobject -Property $HashChanges | select Users, Operation
    }
}

这是输出的样子。

Users                       Operation
_____                       ______
John Hancock                New User
Thomas Edison               Default User
George Washington           New User
Thomas Jefferson            No Change

祝你好运,

T|CK

【讨论】:

  • 为什么谢谢你,在阅读了其他 cmets 之后,我担心受限制的组是否适用于域组,尽管到目前为止它似乎可以工作,因为我已经使用自己的用户帐户进行了测试,删除了我来自域管理员,几分钟后我被读取了。我会试验你的脚本,再次感谢!
  • T|CK,帮助我了解您的脚本中发生了什么。
  • 所以基本上,第一位是导出域管理员名称的列表。然后,您将此列表与 Get-AdGroupMember 生成的列表进行比较,然后将它们导出到输出结果。你能解释一下“No Change”、“New User”和“Default User”是什么意思吗?
  • 它会生成一个新的组成员列表,并将其与您使用前几行创建的列表进行比较。 “无变化”表示用户在前一个(即默认或基线)列表中并在新列表中,“默认用户”表示用户在前一个列表中,但不在新列表中,“新用户”表示用户不在上一个列表中,而是在新列表中。您可以根据需要将“新用户”更改为“已添加”,将“默认用户”更改为“已删除”。
【解决方案2】:

MJOLINOR 提出了完美的建议。以下是有关受限组的一些详细信息...

通过创建受限组 GPO 并将其链接到域控制器 OU,我能够将所需组添加到新创建的 GPO,告诉 GPO 哪些用户属于所需组,现在每 16 小时我想要的组(域管理员)将根据新的 GPO 进行验证。因此,如果用户是不属于新 GPO 的成员,他们将被删除,如果已删除的用户属于新 GPO 的一部分,他们将被添加。

谢谢!我希望这对其他人有所帮助。

【讨论】:

    【解决方案3】:

    我只使用受限组来修改客户端计算机上本地组的成员资格。我从来没有用它来修改域组的成员资格。事实上,Microsoft 声明 Restricted Group 的意图不是针对域组。

    ...Restricted Groups is a client configuration means and cannot be used with Domain Groups...

    【讨论】:

    • 你是对的。他们的网站明确声明他们不支持域组上的受限组的想法。但是,我正在阅读的关于受限制组的组策略书(由 Jeremy Some 撰写)的状态正好相反。它说他建议使用本地 GPP 来限制客户端计算机上的本地组,因此仅给出使用域组完成此操作的演练,例如他为备份操作员使用受限组策略的示例。我会让你知道我的测试结果如何。
    猜你喜欢
    • 2018-02-15
    • 2017-08-21
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2014-06-10
    • 2014-05-21
    相关资源
    最近更新 更多