查找排除残疾用户的组成员

时间:2019-07-18 10:55:46

标签: powershell

我有10个安全组,全部称为“'companyname'RDS用户”

我正在尝试创建一个执行以下操作的脚本:列出所有组,然后列出除禁用成员之外的所有成员,然后将其通过电子邮件发送给csv。我已完成以下操作,但无法将已禁用的用户排除在外。

下面的脚本显示了我走了多远,但是残疾用户却在那里看到了,这基本上意味着该脚本毫无意义。

$mailServer = ""
$mailFrom = ""   
$mailTo = ""    
$mailSubject = ""    
$file = "somepath\RDSUsers.csv"      

Import-Module ActiveDirectory   

$US = Get-ADUser -Filter * -Property Enabled |where {$_.Enabled -eq "True"}| FT Name, Enabled -Autosize

$Groups = (Get-AdGroup -filter * | Where {$_.name -like "*RDS Users" -and $_.name -ne "RDS Users"}| select name -expandproperty name)

$Table = @()

$Record = [ordered]@{
    "Group Name" = ""
    "Name" = ""
    "Username" = ""
} 

Foreach ($Group in $Groups)
{
    $Arrayofmembers = Get-ADGroupMember -identity $Group |select name,samaccountname
    foreach ($Member in $Arrayofmembers)
    {
        $Record."Group Name" = $Group
        $Record."Name" = $Member.name
        $Record."UserName" = $Member.samaccountname
        $objRecord = New-Object PSObject -property $Record
        $Table += $objrecord 
    }
}

if ($Table -eq "RDS Users") {}
$Table

这里通常有一行发送带有excel附件的电子邮件

1 个答案:

答案 0 :(得分:1)

以下内容将在$Table变量中产生所需的输出。然后,您可以将$Table用管道传输到format-*命令之一。

Import-Module ActiveDirectory
$US = Get-ADUser -Filter "Enabled -eq '$true'" -Property Enabled
$Groups = Get-ADGroup -Filter "Name -like '*RDS Users' -and Name -ne 'RDS Users'" |
             Select-Object -ExpandProperty Name
$Table = Foreach ($Group in $Groups)
{
    try
    {
        $Arrayofmembers = Get-ADGroupMember -Identity $Group -ErrorAction Stop | Select-Object Name, SamAccountName
        $compare = Compare-Object -ReferenceObject $US -DifferenceObject $Arrayofmembers -ExcludeDifferent -IncludeEqual -PassThru -Property SamAccountName -ErrorAction Stop |
        Select-Object Name, SamAccountName
        $compare | ForEach-Object {
            [pscustomobject]@{
                "Group Name" = $Group
                "Name"       = $_.Name
                "UserName"   = $_.SamAccountName
            }
        }
    }
    catch
    {
        [pscustomobject]@{
            "Group Name" = $Group
            "Name" = $null
            "UserName" = $null
        }
        Continue
    }
}
$Table

说明:

Get-ADGroupMember命令将不提供其返回对象的Enabled属性。您需要将其输出输入到该数据的另一个命令,例如Get-ADUser中。由于您已经将所有启用的用户存储在$US中,因此我们可以将$US集合与每个Get-ADGroupMember输出的结果进行比较。

我删除了大多数Where-Object命令,转而使用AD命令上的-Filter参数。几乎总是-Filter参数会更快,尤其是当您比较AD索引属性,例如NameEnabled时。

除非您要进一步操作它,否则不需要将每个输出对象存储在变量中。这就是删除$Record的原因。相反,所有返回的对象都存储在数组$Table中。之所以删除+=运算符,主要是因为它在重复构建数组时效率低下。同样,您可以简单地将变量设置为foreach循环的输出,这将导致您需要的数组。由于我们在每次循环迭代时都创建了一个自定义对象,并在声明时提供了属性,因此不需要[ordered]。但是,如果先创建哈希表,然后再创建对应的对象,则可能需要使用[ordered]。另外,在创建循环中涉及的自定义对象时,通常最好的做法是每次创建一个新对象。否则,您可能会无意间更新错误对象上的值。仅仅因为您将一个对象添加到数组,事实结束后您仍然可以更新其属性。

Compare-Object命令将所有内容绑定在一起。 -ExcludeDifferent -IncludeEqual参数组合将仅输出具有匹配属性值的对象。由于我们正在比较$Arrayofmembers$US,因此比较理想。 -PassThru开关允许将对象与传递到命令中的所有属性一起返回。然后,您可以使用Select-Object命令来选择对您来说重要的属性。