【问题标题】:New-Aduser : The object name has bad syntaxNew-Aduser :对象名称的语法错误
【发布时间】:2014-08-12 19:42:21
【问题描述】:

我有一个脚本,用于从 csv 文件创建批量用户,该脚本运行良好。

Import-Csv e:\temp\newemps.csv | %{
    $ou = $_.ou
    $firstname = $_.first
    $lastName = $_.last
    $accountName = $("{0}{1}" -f $firstname.Substring(0,1),$lastName).ToLower()
    $description = $_.desc
    $password = "Welcome1"
    $name = "$firstName $lastName"
    New-AdUser -SamAccountName $accountName -GivenName $firstName -UserPrincipalName "$accountName@ba.net" -Surname $lastName -DisplayName $name  -Name $name -AccountPassword (ConvertTo-SecureString -AsPlainText $password -Force) -Enabled $true -Path $ou -Description $description -ChangePasswordAtLogon:$False

    If ($_.Group -ne ""){
        Add-adgroupmember -identity $_.group  -members $accountName
    }

    If ($_.email -eq "y"){
        Enable-Mailbox -Identity $accountName -Alias $accountName
        Set-Mailbox $accountName -MaxSendSize 10mb -MaxReceiveSize 10mb
        Get-CasMailbox $accountName -OwaEnabled:$false -ActiveSyncEnabled:$false
    }
}

我正在尝试修改此脚本,以便创建一些不符合我们典型约定的通用帐户。输入是一个这里字符串,因为唯一的唯一项目是机场代码。为简洁起见,我缩短了此处的字符串。

$bases = @"
YAB
YEK
YYH
YHI
"@

$bases.Split("`n") | %{    
    $ou = "CN=Users,DC=BA,DC=NET"
    $firstname = "$_".ToString()
    $lastName = "Counter"
    $accountName =  "$_" + "Counter"
    $description = "Base Front Counter"
    $password = "Welcome1"
    $name = "$firstName $lastName"
    New-AdUser -SamAccountName $accountName -GivenName $firstName -UserPrincipalName "$accountName@ba.net" -Surname $lastName -DisplayName $name  -Name $name -AccountPassword (ConvertTo-SecureString -AsPlainText $password -Force) -Enabled $true -Path $ou -Description $description -ChangePasswordAtLogon:$False
}

关于使用这里字符串的一些事情我没有考虑到。它成功创建的唯一帐户是YHI 的帐户(此处字符串的最后一个)。对于所有其他人,它提供New-AdUser : The object name has bad syntax。互联网研究显示 csv-imports 存在许多错误,其中数据有空格和其他问题,但我不确定这里的问题是什么。

最后我只是制作了一个 csv 文件而不是使用这里的字符串,但我想知道我做错了什么。

【问题讨论】:

  • 为什么要使用here字符串?只需创建一个字符串数组...$bases=("YAB","YEK","YYH","YHI") 然后$bases | ForEach{...
  • 这是一次性的。我从已经有换行符的列表中复制了数据。 Here-string 不需要我格式化列表。我只需要粘贴到位。不,没有任何空格
  • 我知道你说没有空格,但我有点想知道是否有隐藏字符或某些可能是从其他文件复制的。 Unicode 什么的。如果是我,我会使用您的 $Bases=Here-String 并执行 $bases.split("n")[0].length and see if it comes back longer than 3 characters. Perhaps there is a CR along with the LF being copied? There's a lot unknown. Maybe do a Write-Host ">$($bases.split("n")[0])YAB
  • 我检查了空格,所以现在假设没有空格还为时过早。长度最终为 4。额外的字符是回车符。 $bases.Split("`n")[0].ToCharArray() | %{ [int][char]$_}

标签: powershell csv for-loop active-directory


【解决方案1】:

这对我有用。摆脱了空值和新行值,只给了我每行的每个字符串值。如果您只是拆分“`n”,则接缝可能会有一些空白或其他一些干扰字符

$test = @"
user1
user2
user3
"@
$test.split(“`r`n”) | ForEach-Object {if($_){get-aduser $_}}

【讨论】:

  • 我应该在rn 上分手。 @TheMadTechnician 也将我引向了这个方向。我看到你正在做一个if($_)。您必须这样做,因为拆分返回一个空条目。为什么会这样?如果我测量拆分它应该返回 3 时返回 5?
  • 我更喜欢在 ForEach 之前过滤空白:$test.split("``r``n") | Where{![string]::IsNullOrEmpty($_)} | ForEach{...rn 应该有单个反引号,我讨厌在 cmets 中格式化代码)至于为什么必须这样做,它可能会导致返回更多隐藏字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多