I';我在制作Powershell Linq时遇到问题”;加入;工作[显式参数键入?]

I';我在制作Powershell Linq时遇到问题”;加入;工作[显式参数键入?],linq,powershell,active-directory,Linq,Powershell,Active Directory,我一直在研究Oracle和Active Directory之间的配置脚本,更具体地说,是使用Powershell脚本。我在Powershell中找到了一个很好的使用Linq的资源(由Michael Sorens提供),但我在JOIN方法方面遇到了问题,我认为这可能与我如何尝试键入参数有关。我必须承认我还没有完全掌握页面()上的示例。我将设置问题,然后展示我正在尝试的内容(到目前为止已经失败) 我有一个数据库查询,返回应该在Active Directory中的用户,我有一个“Get ADUser”

我一直在研究Oracle和Active Directory之间的配置脚本,更具体地说,是使用Powershell脚本。我在Powershell中找到了一个很好的使用Linq的资源(由Michael Sorens提供),但我在JOIN方法方面遇到了问题,我认为这可能与我如何尝试键入参数有关。我必须承认我还没有完全掌握页面()上的示例。我将设置问题,然后展示我正在尝试的内容(到目前为止已经失败)

我有一个数据库查询,返回应该在Active Directory中的用户,我有一个“Get ADUser”命令,可以获取Active Directory中的每个人。我之前通过将两者中的属性数减少到ID(samaccountname)来使用“Except”操作符。因此,在这一点上,我可以推导出需要添加的每个人,以及需要删除的每个人。但我现在只剩下一个ID列表(即不再有我需要的全部字段的补充信息…要么添加广告记录,要么发送一封“你将被删除”的电子邮件)

因此,看到Join操作符,我想我应该将删除列表重新加入到“get all users”广告结果集中。但是我一直在犯错误

Cannot find an overload for "Join" and the argument count: "5"
以下是简化运动部件的尝试,因此这是两个AD查询结果,而不是原始问题(尽管显示了相同的错误)

因此,在本例中,我尝试显式地将我的联接属性键入为Microsoft.ActiveDirectory.Management.AdaAccount对象。。。实际上,我最初使用的是“string”,因为实际的连接属性是samaccountname,当我对其运行“getType()”时,它返回“string”。。。实际上是“Name:String,BaseType:System.Object”


在这一点上,我所知道的比我所不知道的更重要:)我可以通过将其全部移动到数据库中来创建“列表”来轻松做到这一点,但如果我能够掌握Powershell Linq,这看起来会更加优雅

我相信你的问题在于类型。考虑这个命令:

$left=Get ADUser-Server$ad_host-Identity'knowuser'-Properties sAMAccountName |选择sAMAccountName

此对象的类型将为
ADUser

对于此命令:

$right=Get ADUser-Server$ad_host-Filter*-SearchBase“OU=KnownUsersOU,OU=Students,OU=Users-Students,DC=my,DC=domain,DC=edu”-属性sAMAccountName,givenName,sn |选择sAMAccountName,givenName,sn

对象的类型将是
object[]
。它必须是
ADUser[]

你应该可以这样施展:

$right=[Microsoft.ActiveDirectory.Management.ADUser[](获取ADUser-Server$ad_host-Filter*-SearchBase“OU=KnownUsersOU,OU=Students,OU=Users-Students,DC=my,DC=domain,DC=edu”-属性sAMAccountName,givenName,sn)

然后,由于您处理的是
ADUser
对象,因此您的关键代理还必须匹配:

$outerKeyDelegate=[Func[Microsoft.ActiveDirectory.Management.ADUser,string]{$args[0].sAMAccountName}
$innerKeyDelegate=[Func[Microsoft.ActiveDirectory.Management.ADUser,string]{$args[0].sAMAccountName}

您的结果委托还必须与您正在处理的对象类型相匹配(您在注释掉的代码中更接近):


$resultDelegate=[Func[Microsoft.ActiveDirectory.Management.ADUser,Microsoft.ActiveDirectory.Management.ADUser,string]{{{0},{1}'-f$args[0].sAMAccountName,$args[1].sAMAccountName}

也许这有帮助:在PowerShell gallery和使用
Linq
的his上放置一个标签。(我也在PowerShell gallery上放置了一个版本,但没有使用
Linq
,因此速度较慢,但更向前,更易于使用,例如交叉连接)这是一个非常好的资源,我肯定会使用它。。。但我实际上得到了同样的错误,但现在它来自于那个模块!好吧,至少这使我误解的地方化了。谢谢你的链接!编辑:进一步阅读他的网站,他使用了一些非常接近我的用例。。。但这也表明这是可行的。至少可以这么说,这很有趣。好吧,我怀疑这个错误只是意味着“出了问题”。这实际上是我的“左”对象定义上的一个输入错误。我传递的是“object.property”,而不仅仅是“object”。当我修复它时,它立即起作用了!我永远也做不到这一点,尽管我同意这是发生破损的地方。我最终使用了上面评论中提到的Join-Object cmdlet,但我希望(最终)在较低级别上解决这个问题。
$ad_host="my.adserver.edu"

$left = Get-ADUser -Server $ad_host -Identity 'knownuser' -Properties sAMAccountName | select sAMAccountName
$right = Get-ADUser -Server $ad_host -Filter * -SearchBase "OU=KnownUsersOU,OU=Students,OU=Users-Students,DC=my,DC=domain,DC=edu" -Properties sAMAccountName, givenName, sn | select sAMAccountName, givenName, sn

$outerKeyDelegate = [Func[Microsoft.ActiveDirectory.Management.ADAccount,string]] { $args[0].sAMAccountName }
$innerKeyDelegate = [Func[Microsoft.ActiveDirectory.Management.ADAccount,string]] { $args[0].sAMAccountName }
#$resultDelegate = [Func[Microsoft.ActiveDirectory.Management.ADAccount,Microsoft.ActiveDirectory.Management.ADAccount,string,string]] {'{0}, {1}, {2}, {3}, {4}' -f $args[0].sAMAccountName, $args[1].givenName, $args[1].sn, $args[1].mail, $args[1].employeeID }
$resultDelegate = [Func[Microsoft.ActiveDirectory.Management.ADAccount,string,string]] {'{0}, {1}' -f $args[0].sAMAccountName, $args[1].sAMAccountName }

[Linq.Enumerable]::Join($toRemove, $allUsers, $outerKeyDelegate, $innerKeyDelegate, $resultDelegate) | foreach { Add-Content -Path to_delete.csv -Value $_ }