Powershell问题 - Add-ADGroupMember变量不起作用

时间:2014-03-25 01:38:25

标签: arrays string powershell

所以我有一个非常困难的问题,我无法解决。我有一个计算机名列表,我将从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(基本上是逗号分隔的文本字符串)上获取内容会成为问题呢?

任何帮助将不胜感激。

谢谢!

2 个答案:

答案 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 $_ 
    }
}