在过滤器中使用变量

时间:2017-03-30 14:58:08

标签: powershell

我尝试从其姓氏中查询AD以获取用户列表,这些用户列表中有帮助。

我下午大部分时间都在尝试,但我只得到一张空白的Excel表格。

此外,我想知道在AD中是否有多个人使用该用户名,不知道如何开始使用该用户名。

到目前为止我所拥有的:

Import-module ActiveDirectory 
$names = get-content c:\tempfiles\Final.txt
$names | ForEach-Object {
$ADUserParams=@{ 
'Searchbase' = 'OU=Administrators,OU=Locations,DC=The,DC=group,DC=com' 
'Searchscope'= 'Subtree' 
}
get-aduser @ADUserParams  -filter 'surname -like "$Names*"' | Select-Object Samaccountname, UserPrincipalName | export-csv C:\TempFiles\Usernames.csv
}

如果它是foreach-object,我是否还需要过滤器?如果有多个姓氏相同的话,有没有办法检查该OU中的AD,我将如何计算它们?我可以提取一个用户姓氏列表然后运行以下内容,但它是一个手动任务来找到缺少的名字。 (如果这是有道理的)

到目前为止,我所拥有的是:

get-content C:\TempFiles\Users.txt | sort -u > C:\TempFiles\users_cleaned.txt

1 个答案:

答案 0 :(得分:1)

这应该这样做(但是由于我现在无法访问AD而未经测试):

Import-module ActiveDirectory 
$names = get-content c:\tempfiles\Final.txt

$ADUserParams=@{ 
    'Searchbase' = 'OU=Administrators,OU=Locations,DC=The,DC=group,DC=com' 
    'Searchscope'= 'Subtree' 
}

$names | ForEach-Object {
    $CurrentUser = get-aduser @ADUserParams -filter "surname -like '$_*'" | Select-Object Samaccountname, UserPrincipalName

    If ($CurrentUser) {

        If ($CurrentUser.Count -gt 1){ $DuplicateSurname = $true }Else{ $DuplicateSurname=$false }

        $CurrentUser | ForEach-Object {
            $_ | Add-Member -MemberType NoteProperty -Name DuplicateSurname -Value $DuplicateSurname
            Write-Output $_
        }
    } Else {
        Write-Warning "$_* did not matched any users."
    }

} | export-csv C:\TempFiles\Usernames.csv

<强>解释

ForEach-Object循环中,管道中的当前项由$_表示。您还需要对过滤字符串使用双引号,因为变量(如$_)在双引号字符串中展开,而不是单引号字符串。

你不需要在循环中声明你的$ADUserParams哈希表(这很浪费)所以我把它移到了外面。

Get-ADUser的结果将返回到管道,最后我将| export-csv移到ForEach-Object之外,以便将处理结果传送到它。我想如果没有这个你只能得到最终的结果。

  

“我还想知道AD中是否有多个人使用该用户名

为了解决这个问题,我已经放了第二个ForEach-Object循环回到$CurrentUser的每个用户,并向对象添加了一个“DuplicateSurname”属性(这应该是CSV中的一个附加列) )根据$CurrentUser的计数是否大于1来计算。

最后,我们必须确保将$_的内容放回到我们对Write-Object $_执行的管道中。