我有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附件的电子邮件
答案 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索引属性,例如Name
和Enabled
时。
除非您要进一步操作它,否则不需要将每个输出对象存储在变量中。这就是删除$Record
的原因。相反,所有返回的对象都存储在数组$Table
中。之所以删除+=
运算符,主要是因为它在重复构建数组时效率低下。同样,您可以简单地将变量设置为foreach
循环的输出,这将导致您需要的数组。由于我们在每次循环迭代时都创建了一个自定义对象,并在声明时提供了属性,因此不需要[ordered]
。但是,如果先创建哈希表,然后再创建对应的对象,则可能需要使用[ordered]
。另外,在创建循环中涉及的自定义对象时,通常最好的做法是每次创建一个新对象。否则,您可能会无意间更新错误对象上的值。仅仅因为您将一个对象添加到数组,事实结束后您仍然可以更新其属性。
Compare-Object
命令将所有内容绑定在一起。 -ExcludeDifferent -IncludeEqual
参数组合将仅输出具有匹配属性值的对象。由于我们正在比较$Arrayofmembers
和$US
,因此比较理想。 -PassThru
开关允许将对象与传递到命令中的所有属性一起返回。然后,您可以使用Select-Object
命令来选择对您来说重要的属性。