【问题标题】:Creation AD bulks script issues创建 AD 批量脚本问题
【发布时间】:2020-06-18 05:22:09
【问题描述】:

我编写了一个广告批量脚本,但由于某种原因似乎无法正常工作。有人能帮我吗 ?

$ADUsers = Import-csv C:\Users\Deng\Desktop\newusers.csv

foreach ($User in $ADUsers)
{
$Username  = $Users.username
   $Firstname = $Users.firstname
   $Password  = $Users.password
   $Lastname  = $Users.lastname
   $OU        = $Users.ou

         New-ADUser `
        -SamAccountName $Username `
        -UserPrincipalName $Username@aptushealth.com `
        -Name $Firstname $Lastname `
        -GivenName $Firstname `
        -Surname $Lastname `
        -Enabled $True `
        -ChangePasswordAtLogon $false `
        -DisplayName $Lastname, $Firstname `
        -Path $OU `
        -AccountPassword (convertto-securestring $Password -AsPlainText -Force)
}

我在下面收到此错误:

ConvertTo-SecureString:无法将参数绑定到参数“字符串” 因为它是空的。在行:24 字符:54 + ... -AccountPassword(转换为安全字符串 $Password -AsPlai ... +~~~~~~~~~ + CategoryInfo : InvalidData: (:) [ConvertTo-SecureString], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ConvertToSecureStringCommand

还可以查看 CSV 的内容

usersname firstname password lastname ou
efranklin Edward P@s$word Franklin "OU=PII Users,DC=PII,DC=net"
bjackson Bill P@s$word Jackson "OU=PII Users,DC=PII,DC=net"

我已经做出了改变,这就是我得到的——DavidNG

ConvertTo-SecureString:无法将参数绑定到参数“String”,因为它为空。在 line:24 char:54 + ... -AccountPassword (convertto-securestring $Password -AsPlai ... –

还是出现同样的错误

【问题讨论】:

  • 什么是$Users
  • @Caramiriel $users 是在 csv 中定义用户的变量
  • 我认为@Caramiriel 的意思是它应该是 $User,因为这是您在 ForEach 中指定的
  • 我开始认为您的输入 CSV 文件根本不是 CSV 文件,而是您在此处向我们展示的确切(列表)格式的文本文件。请编辑您的问题并添加输入文件的前三或四行以显示它的真实外观。
  • 我已经编辑了您的问题,以将其放入可读的格式化文本中。我认为 CSV 使用空格字符作为字段分隔符是否正确?在这种情况下,只需将其添加到 Import-Csv cmdlet 作为参数 -Delimiter ' ' 并接受 @Steven 的建议,使用 Splatting 来摆脱那些可怕的反引号。

标签: powershell


【解决方案1】:

你的错误是在foreach循环中你通过对象$user操作不是$users,所以你必须写:

   $Username  = $User.username
   $Firstname = $User.firstname
   $Password  = $User.password
   $Lastname  = $User.lastname
   $OU        = $User.ou

Import-Csv 逐行读取文件,因此第一行必须包含如下列的名称:

username;firstname;password;lastname;ou

那么可能是你的数据:

efranklin;Edward;P@s$word;Franklin;"OU=PII Users,DC=PII,DC=net"

附加 你必须有类似的东西(不要忘记在csv文件中必须是';'分隔符!!!!!分隔参数):

$ADUsers = Import-csv C:\Users\Deng\Desktop\newusers.csv -Delimiter ";"

foreach ($User in $ADUsers){
   $Username  = $User.username
   $Firstname = $User.firstname
   $Password  = $User.password
   $Lastname  = $User.lastname
   $OU        = $User.ou
New-ADUser -SamAccountName $Username -UserPrincipalName ($Username+'@aptushealth.com') -Name ($Firstname+' '+$Lastname) -GivenName $Firstname -Surname $Lastname -Enabled $True -ChangePasswordAtLogon $false -DisplayName ($Lastname+' '+$Firstname) -Path $OU -AccountPassword (ConvertTo-SecureString $password -AsPlainText -Force)            
}

【讨论】:

  • 我已经做出了改变,这就是我得到的
  • ConvertTo-SecureString :无法将参数绑定到参数“字符串”,因为它为空。在 line:24 char:54 + ... -AccountPassword (convertto-securestring $Password -AsPlai ...
  • 您必须编辑您发布的问题并在您的 csv 文件中显示您的实际代码和前 3 行
  • Vad。 --- 默认分隔符是 csv 的逗号,而不是带引号的字符串的分号。因此“逗号分隔值”文件类型。您可以使用分号等,但是您需要专门传递 -Delimiter 开关才能使用它。
【解决方案2】:

添加一些额外的建议。

在您的原始代码中,您分配了错误的值。正如几位参与者所提到的(请参阅@Vad Answer),您提交的代码中的 $Users 将是空的。这会导致专门引用空值的错误是有道理的。错误是非常字面的 ConvertTo-SecureString 将不接受 -String 参数的空值。

您使用了迭代变量 $User 但进行了如下变量赋值:

$Password = $Users.password

$Users(注意“s”)在您的示例中将为空,您应该改用 $User.password

现在,如果你做了所有这些,你仍然得到错误。我的建议是在执行 New-ADUser 之前退一步检查数据。我会先评论 New-ADUser 。然后您可以执行以下检查:

$ADUsers = Import-Csv C:\Users\Deng\Desktop\newusers.csv
$ADUsers | Where-Object($_.Password -eq $null) | Format-Table

这将为您提供所有具有空密码属性的对象。在您尝试将内容用作New-ADUser 的输入之前,需要先修复这些问题。

注意:您也可以使用 Excel 进行此类检查。

密码只是属性之一。我会在Where{} 子句中引用其他属性重复测试。您必须确保数据完全干净!


原始 cmets 对其他答案的补充:

我认为这已经得到了回答,但为了便于阅读,我认为这是一个很好的使用参数的用例。

未经测试的示例:

$ADUsers = Import-Csv C:\Users\Deng\Desktop\newusers.csv

foreach ($User in $ADUsers)
{
    $Params =
    @{
        samAccountName        = $User.username
        UserPrincipalName     = ($User.username + '@aptushealth.com')
        GivenName             = $User.FirstName
        SurName               = $User.LastName
        Name                  = ($User.FirstName + ' ' + $User.lastname)
        DisplayName           = ($User.lastname + ' ' + $User.FirstName)
        Enabled               = $true
        Path                  = $User.ou
        AccountPassword       = (ConvertTo-SecureString $User.password -AsPlainText -Force)
        ChangePasswordAtLogon = $false

    }

    New-ADUser @Params
}

这可以让您避免所有通常被认为是危险的反勾号逃逸。

【讨论】:

  • @DavidNG 如果您想对答案发表评论,请以 comment 的形式进行。不要试图用备注来编辑答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多