所以我有一个非常困难的问题,我无法解决。我有一个计算机名列表,我将从SQL拉到txt。不用担心,然后我将它导入变量(我假设的字符串数组?)然后对于每个计算机名称,我得到相应计算机的专有名称(DN)。原因是当我尝试使用常规主机名将计算机添加到此组时,常规名称在AD中无法正确匹配。
以下是代码示例:
$ComputerNames = get-content .\ComputerNames.txt
ForEach ($ComputerName in $Computernames)
{
get-adcomputer -LDAPfilter "(CN=$Computername)" -searchscope subtree | Select-Object -Property DistinguishedName | export-csv -NoTypeInformation -Append dnnames.csv
}
$dnnames = get-content .\dnnames.csv
foreach ($dnname in $dnnames)
{
Add-ADGroupMember -Identity <SAM_GroupName> -Members $dnname -PassThru
}
现在我无法从$ dnnames变量中获得任何结果,因为它确实正确地解析了值,但最终结果如下:
Add-ADGroupMember : Cannot find an object with identity: '"CN=<Computername>,OU=Workstations,DC=<DC>,DC=com"' under:
'DC=<DC>,DC=com'.
At line:3 char:5
+ Add-ADGroupMember -Identity <SAM_Groupname> -Members $dnname -PassT ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: ("CN=<Computername>-...C=<DC>,DC=com":ADPrincipal) [Add-ADGroupMember], ADIdentityNotFoundException
+ FullyQualifiedErrorId : SetADGroupMember.ValidateMembersParameter,Microsoft.ActiveDirectory.Management.Commands.AddADGroupMember
所以我不确定我做错了什么。我已经尝试使用字符串值手动设置变量$ dnname,它就像一个魅力。那么为什么在CSV(基本上是逗号分隔的文本字符串)上获取内容会成为问题呢?
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:1)
我认为您的问题来自于使用out-csv
,然后是get-content
而不是import-csv
。 CSV内容在尊贵名称周围有引号,我认为这是最直接导致错误的原因。
最简单的改变,我建议使用-ExpandProperty然后使用Out-File(并将其命名为dnnames.txt)。
$ComputerNames = Get-Content .\ComputerNames.txt
ForEach ($ComputerName in $Computernames)
{
get-adcomputer -LDAPfilter "(CN=$Computername)" -searchscope subtree | Select-Object -ExpandProperty DistinguishedName | Out-File -Append dnnames.txt
}
$dnnames = get-content .\dnnames.txt
foreach ($dnname in $dnnames)
{
Add-ADGroupMember -Identity <SAM_GroupName> -Members $dnname -PassThru
}
这是一个很好的工作机会,但我没有尝试过。不过,它看起来确实有很多代码。如何避免LDAPFilter,而不是写入文件然后从中读取,并切换到使用Add-ADPrincipalGroupMembership,它可以从管道中获取多个输入?
这就是:
$computers = Get-Content .\ComputerNames.txt | foreach { Get-ADComputer $_ }
$dnnames = $computers | Select-Object -ExpandProperty distinguishedName
$dnnames | Add-ADPrincipalGroupMembership -MemberOf "YourGroup"
你可以把中间人剪掉,然后压到:
gc ComputerNames.txt | %{ Get-ADComputer $_ } | select -Expand distinguishedName | Add-ADPrincipalGroupMembership -MemberOf "YourGroup"
编辑:缩短版本:
gc ComputerNames.txt | %{ (Get-ADComputer $_).sid.Value } | Add-ADPrincipalGroupMembership -MemberOf "YourGroup"
NB。如果你说“常规名称在AD中没有正确匹配,当我尝试将计算机添加到只有常规主机名的组”时 - 计算机的SAMAccountName默认为主机名后面带有$,例如: Win005 $和Add-ADGroupMember可以使用该版本。不知何故Get-ADComputer通过主机名找到我,即使帮助说它需要一个SAMAccountName。
答案 1 :(得分:1)
这将有效,消除了将计算机名称导出/导入中间文件:
$ComputerNames = Get-Content .\ComputerNames.txt
ForEach ($ComputerName in $Computernames)
{
get-adcomputer -LDAPfilter "(CN=$Computername)" -searchscope subtree | % {
Add-ADGroupMember -Identity <SAM_GroupName> -Members $_
}
}