我们先研究你给的csv文件格式:

Name,DN
EmailGroup1,"CN=EmailGroup,OU=Groups,DC=Test,DC=COM","CN=CompanyGroup,OU=Groups,DC=Test,DC=COM"
EmailGroup2,"CN=EmailGroup,OU=Groups,DC=Test,DC=COM","CN=CompanyGroup,OU=Groups,DC=Test,DC=COM"
EmailGroup3,"CN=EmailGroup,OU=Groups,DC=Test,DC=COM","CN=CompanyGroup,OU=Groups,DC=Test,DC=COM"

第一行是两列,Name,DN

第二行其实是3列,

  1. EmailGroup1
  2. “CN=EmailGroup,OU=Groups,DC=Test,DC=COM”
  3. “CN=CompanyGroup,OU=Groups,DC=Test,DC=COM”

可能还会有更多。

这样通过Import-Csv导入以后,我们先看看输出:

PS D:\> Import-Csv .\MailGroup.csv

Name        DN                                    
----        --                                    
EmailGroup1 CN=EmailGroup,OU=Groups,DC=Test,DC=COM
EmailGroup2 CN=EmailGroup,OU=Groups,DC=Test,DC=COM
EmailGroup3 CN=EmailGroup,OU=Groups,DC=Test,DC=COM

很明显,只读到了2列,因为第一行的头只有Name,和DN两个。

最终导致你自己脚本循环中的$Group.DN其实是一个string。

PS D:\> (Import-Csv .\MailGroup.csv)[0].DN.GetType().FullName
System.String

然后研究你的Set-ADGroup EmailGroup -Add 后面的参数可知authOrig的值是一个字符串数组

这样肯定就会导致参数不匹配。

=============================================

从这里分隔,看解决方案

综上所述,因为该csv文件的特殊格式,坑在于csv的头个数和csv的数据行个数不匹配。既然头多了可以,但是不能少,那我们就不要用csv文件中的头,自己给他加头,加多少呢?5个,还是10个,反正多多益善。

下面就不废话了,直接上脚本了:

#自定义csv文件头
$customHeader = @("Group")
#假设DN后面最多有5个
$maxDNColumns = 5
1..$maxDNColumns | foreach {
$customHeader+="CN$_"
}

Get-Content .\MailGroup.csv | 
 select -Skip 1 | #忽略源文件中的头
  ConvertFrom-Csv -Header $customHeader | #加入我们自己定义的头
  foreach {
    $group = $_.Group
    $dnPara = @()
    
    #循环获取CN1到CN...N的值,拼接成字符串数组
    for($dnIndex=1;$dnIndex -le $maxDNColumns;$dnIndex++ ){
        $value = $_."CN$dnIndex"
        if( -not [string]::IsNullOrWhiteSpace($value)){
        $dnPara+=$value
        }
        else{
            break;
        }
    }
    ##这里再执行你那关键的业务命令
    Set-ADGroup $group -Add @{authOrig = $dnPara}
  }

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。