包含Get-ADUser和过滤器的ForEach-Object循环

时间:2016-11-28 18:03:12

标签: powershell active-directory windows-server-2012-r2

我的公司有一个脚本来处理O365的许可证,目前它将所有用户分配到同一个国家/地区,例如

$Location = "US"
$E2Users = Get-ADGroupMember lg.o365.Office | Select SamAccountName
$E2Users | ForEach-Object{
$UPN = $E2Users[$Counter].SamAccountName + "@company.com"
Set-MsolUser -UserPrincipalName $UPN -UsageLocation $Location
##lots of other code

我需要检索每个用户的国家/地区而不是字符串。我已经设置了一个小测试,以确保我有一个正确的国家,通过使用输出来查看结果,但我似乎无法绕过它以使其工作。我在另一个论坛中看到了$ username = $ _并尝试使用它。

$E2Users = Get-ADGroupMember lg.o365.Office | Select SamAccountName
$E2Users | ForEach-Object{
$username = $_
$Location = Get-ADUSer -filter {samaccountname -like "*$username*"} -properties * | Select country
write-output $Location
}

或者我甚至需要过滤器?使用以下内容为我提供了国家/地区的输出,但如何确保它们与每个用户正确匹配。某些结果行使用country或c有空格,并且在检查用户帐户时,这些属性具有值。

$E2Users = Get-ADGroupMember lg.o365.Office.PlanK1 | Select SamAccountName
$E2Users | ForEach-Object{
$Location = Get-ADUSer -filter * -properties * | Select country
write-output $Location
}

最终结果将类似于以下内容

$E2Users = Get-ADGroupMember lg.o365.Office | Select SamAccountName
$E2Users | ForEach-Object{
$UPN = $E2Users[$Counter].SamAccountName + "@company.com"
$Location = Get-ADUSer -filter {not sure what to use} -properties * | Select country    
Set-MsolUser -UserPrincipalName $UPN -UsageLocation $Location
##lots of other code

我缺少什么而不理解。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

$E2Users = Get-ADGroupMember lg.o365.Office | Select -ExpandProperty SamAccountName
$E2Users | ForEach-Object {
    $username = $_ + '@company.com'
    $Location = Get-ADUSer -filter 'samaccountname -eq "$_"' -properties country | Select country
    Set-MsolUser -UserPrincipalName $username -UsageLocation $Location
}

如果我理解了您的要求,请随时询问是否有不明确的事情。

答案 1 :(得分:0)

这里的问题是$E2Users数组的每个成员都是一个对象,它有一个名为samaccountname的属性,然后你将该对象分配给循环中的$ username变量,这个变量无法使用作为过滤器。有几种方法可以修复它,但最简单的方法可能就是扩展属性,所以将第一行更改为

$E2Users = Get-ADGroupMember lg.o365.Office | Select -expandproperty SamAccountName

我也有机会将你的过滤器从-like转换为-eq并在它周围放下“**”,因为它们不是必需的。