【问题标题】:Powershell Script to get all groups containing specific namePowershell脚本获取包含特定名称的所有组
【发布时间】:2019-03-16 19:32:12
【问题描述】:

好的,所以我对 powershell 有点陌生,我正在尽我所能,但似乎无法做到这一点。

我的目录设置方式是每个组织都有自己的“密码重置组”我将根据事件日志条目“目录服务更改”运行计划任务设置。该脚本的工作是在组中查找成员并将他们的密码重置回他们的员工编号,让用户在下次登录时更改密码,然后将用户从组中删除。我似乎无法正确获取语法。

Try {
$GroupDN = (Get-ADGroup -Filter {Name -like '*Password Reset Group*'}).DistinguishedName
}

Catch {
    Write-Host "Unable to locate group: $Group because ""$($Error[0])""" -ForegroundColor Red
    Exit
}
ForEach ($User in (Get-ADUser -Filter * -Properties MemberOf,employeeNumber))
{   If ($User.MemberOf -contains $GroupDN)
    {   $password = "$($_.employeeNumber)new!" | ConvertTo-SecureString -AsPlainText -Force
        Set-ADAccountPassword -Identity $User -NewPassword $password -Reset
        Remove-ADGroupMember -Identity "$GroupDN" -Members $User

        }
        }

【问题讨论】:

  • 您的 try-catch 块有问题,因为它永远不会抛出错误。如果没有找到任何组,它只会返回$null。要访问每个循环上的employeeNumber 属性,您需要使用$User.employeeNumber。此外,$GroupDN 变量可能包含一组 distinctName 属性值,因此您的 if 语句会有问题。
  • 我可能在之前的评论中说错了它“永远不会”引发错误。如果在运行命令时无法联系域控制器或 ldap 服务器,或者 ActiveDirectory 模块加载有问题,则会引发错误。如果这是你的意图,那么你可以忽略我所说的。但是,无法从成功查询到 AD 中找到组不会出错。
  • 好的,那么要解决这个问题,我应该如何修改我的脚本?我对 Powershell 非常陌生,我正在努力掌握它。

标签: powershell active-directory directoryservices


【解决方案1】:

很高兴看到您想出了自己的答案,但您可以通过使用 ... 来简化它

Get-ADPrincipalGroupMembership

# get function / cmdlet details
(Get-Command -Name Get-ADPrincipalGroupMembership ).Parameters
Get-help -Name Get-ADPrincipalGroupMembership  -Full
Get-help -Name Get-ADPrincipalGroupMembership  -Online
Get-help -Name Get-ADPrincipalGroupMembership  -Examples

# Example 2: Get group memberships for the Administrator

Get-ADPrincipalGroupMembership -Identity Administrator

...列出用户所属的所有组。

所以,你的调整可能就是这样……

Get-ADUser -Filter * | 
ForEach{ 
    # "`n--- Processing user $($PSItem.SamAccountName) ---`n"
    If ($TargetGroup = (Get-ADPrincipalGroupMembership -Identity $PSItem.SamAccountName) -match 'Password Reset Group')
    {
        $password = "$($PSItem.employeeNumber)new!" | 
        ConvertTo-SecureString -AsPlainText -Force

        Set-ADAccountPassword -Identity $PSItem.SamAccountName -NewPassword $password -Reset
        Remove-ADGroupMember -Identity $TargetGroup.SamAccountName -Members $PSItem.SameAccountName
    }
}

至于……

好的,所以我对 powershell 有点陌生

...这很好,但谨慎的做法是花时间在 PowerShell 上进行加速,以限制/避免猜测、误解、挫折、坏习惯、错误等,您将继续遇到(即使是我们中最有经验的人也会这样做并从中学习)。我们有大量免费/免费资源供您利用。

YouTubeMVAMSDN Channel9 上直播所有视频培训。 使用将为您编写代码的工具,您可以在以后根据需要进行保存和调整。尤其是在涉及到 ADDS 时。

Active Directory Administrative Center: Getting Started

Active Directory Administrative Center

Step-By-Step: Utilizing PowerShell History Viewer in Windows Server 2012 R2

免费Booksreferences

【讨论】:

    【解决方案2】:

    使用@AdminOfThings 提供给我的信息。我能够编写我想要的代码。玩了很多,但这里是:

    ForEach ($GroupDN in (Get-ADGroup -Filter {Name -like '*Password Reset Group*'}).DistinguishedName)
        { ForEach ($User in (Get-ADUser -Filter * -Properties MemberOf,employeeNumber))
    {   If ($User.MemberOf -contains $GroupDN)
        {   $password = $User.employeeNumber | ConvertTo-SecureString -AsPlainText -Force
            Set-ADAccountPassword -Identity $User -NewPassword $password -Reset
            Set-ADUser -Identity $User -ChangePasswordAtLogon $true -PasswordNeverExpires $false
            Remove-ADGroupMember -Identity "$GroupDN" -Members $User -Confirm:$false
    
            }
            }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      相关资源
      最近更新 更多