如何在Powershell Active Directory cmdlet中引用对象的属性?

时间:2018-01-17 22:48:00

标签: powershell object variables properties

this fantastic answer相关,关于如何正确构建-Filter参数参数,我正在处理在PowerShell中大量使用Active Directory cmdlet的脚本,并且构建起来很困难过滤包含对象变量属性的参数。

该脚本基本上通过读取电子表格并根据需要处理每一行来管理通讯组 - 创建Active Directory联系人(如果它们不存在),将它们添加或删除到适当的组等等。

电子表格存储在一个对象数组中,每一行都被视为一个对象,其中的列定义了对象属性。

例如,以下代码获取导入的电子表格的每一行,并尝试在Active Directory中查找匹配的联系人对象。

Foreach ($contact in $NOClist)
{
     $contactobject = Get-ADObject -filter ("name -eq `"$contact.name`" -and Objectclass -eq `"contact`"") -SearchBase "$NOCContactPath" -Server $ADServer;
     #... do some more stuff.
}

问题在于$contact.name正在按字面意思进行评估,因此它最终会在Active Directory中搜索具有名称属性$contact.name的联系人。我已尝试过之前引用的答案中的其他变体,(""$contact.name""'$contact.name'"' + $contact.name + '"),但它们都评估为文字$contact.name或投掷.字符的语法错误。

我提出的hacky解决方法是将对象属性分配给变量并使用它,例如下面的,但这只是感觉很糟糕。

Foreach ($contact in $NOClist)
{
    $contactname = $contact.name; 
    $contactobject = Get-ADObject -filter ("name -eq `"$contactname`" -and Objectclass -eq `"contact`"") -SearchBase "$NOCContactPath" -Server $ADServer;
     #... do some more stuff.
}

有没有办法在filter参数中引用一个对象属性,或者这种方法是将它分配给一个变量然后使用变量真的是最好的方法吗?

2 个答案:

答案 0 :(得分:5)

PowerShell只对字符串进行简单的变量扩展,没有索引或点属性访问等复杂的东西。有几种方法可以解决这个限制,例如

  • 级联:

    -Filter ("name -eq '" + $contact.name + "' -and Objectclass -eq 'contact'")
    
  • 子表达式:

    -Filter "name -eq '$($contact.name)' -and Objectclass -eq 'contact'"
    
  • 格式运算符:

    -Filter ("name -eq '{0}' -and Objectclass -eq 'contact'" -f $contact.name)
    

请注意,对于第一种和第三种方法,您需要将操作放在分组表达式中(即括号中),以便将该操作的结果传递给参数。

答案 1 :(得分:1)

首先,你确定$ contact.name在那个循环中有效吗?出于调试目的,在那里抛出一个写主机,以确保它符合你的想法。

但主要的是你在变量周围使用单引号,这会阻止变量扩展。看起来你正试图逃避双引号,不确定是否可能,但如果可能的话,这不是正确的做法。你应该通过以下链接拍摄:

  

Get-ADUser -Filter(' sAMAccountName -eq"' + $ SamAc +'"')

我的例子:

  

PS V:> $ contactname =" finn2617"

     

PS V:> Get-ADuser -filter(' samaccountname -eq"' + $ contactname +'"')|选择名称,samaccountname

     

命名samaccountname

     

---- --------------

     

Finnigan,Matthew FINN2617

所以,对你来说:

$contactobject = Get-ADObject -filter ('name -eq `"' + $contact.name + " -and Objectclass -eq "contact" ' ) -SearchBase "$NOCContactPath" -Server $ADServer;